From 1743ac8af8915ca3190cf6baa5f694805de25642 Mon Sep 17 00:00:00 2001 From: gekkedev <17025257+gekkedev@users.noreply.github.com> Date: Tue, 11 Jun 2024 16:36:19 +0200 Subject: [PATCH 01/12] Update index.ts --- src/api/model/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/api/model/index.ts b/src/api/model/index.ts index e952bfe15..fd985c98a 100644 --- a/src/api/model/index.ts +++ b/src/api/model/index.ts @@ -28,6 +28,7 @@ export { LiveLocation } from './live-location'; export { ContactStatus } from './contact-status'; export { GroupCreation } from './group-creation'; export { WhatsappProfile } from './whatsapp-profile'; +export { IncomingCall } from '.incoming-call'; export * from './result'; export * from './get-messages-param'; export * from './initializer'; From d701108c94f50ceb4fcd05148d5bc1cc62b5d858 Mon Sep 17 00:00:00 2001 From: gekkedev <17025257+gekkedev@users.noreply.github.com> Date: Tue, 11 Jun 2024 16:37:22 +0200 Subject: [PATCH 02/12] Update listener.layer.ts --- src/api/layers/listener.layer.ts | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/api/layers/listener.layer.ts b/src/api/layers/listener.layer.ts index bf661851b..51e0898c7 100644 --- a/src/api/layers/listener.layer.ts +++ b/src/api/layers/listener.layer.ts @@ -28,6 +28,7 @@ import { ParticipantEvent, PresenceEvent, Wid, + IncomingCall, } from '../model'; import { MessageType, SocketState, SocketStream } from '../model/enum'; import { InterfaceMode } from '../model/enum/interface-mode'; @@ -501,18 +502,16 @@ export class ListenerLayer extends ProfileLayer { } /** - * @event Escuta por ligações recebidas, seja de áudio ou vídeo. - * - * Para recusar a ligação, basta chamar o `rejectCall` {@link rejectCall} - * - * @returns Objeto descartável para parar de ouvir + * @event Listen for incoming calls, whether audio or video (pending a reaction). + * To reject the call, simply call `rejectCall` {@link rejectCall} + * @returns Disposable object to stop listening */ - public onIncomingCall(callback: (call: any) => any) { + public onIncomingCall(callback: (call: IncomingCall) => any) { return this.registerEvent('onIncomingCall', callback); } /** - * Listens to presence changed, by default, it will triggered for active chats only or contacts subscribed (see {@link subscribePresence}) + * Listens to presence changed, by default, it will be triggered for active chats only or contacts subscribed (see {@link subscribePresence}) * @event Listens to presence changed * @param callback Callback of on presence changed * @returns Disposable object to stop the listening From 815b90afa89001c2e29113459fefd6de8c07a8e2 Mon Sep 17 00:00:00 2001 From: gekkedev <17025257+gekkedev@users.noreply.github.com> Date: Tue, 11 Jun 2024 16:42:39 +0200 Subject: [PATCH 03/12] Create incoming-call.ts --- src/api/model/incoming-call.ts | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 src/api/model/incoming-call.ts diff --git a/src/api/model/incoming-call.ts b/src/api/model/incoming-call.ts new file mode 100644 index 000000000..e24061c2b --- /dev/null +++ b/src/api/model/incoming-call.ts @@ -0,0 +1,34 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export interface IncomingCall { + /** alphanumeric ID of the call, can e.g. usable for hanging up */ + id: string, + /** ID of the caller, can be used to message them directly */ + peerJid: string, + /** Epoch timestamp (seconds) */ + offerTime: number, + isVideo: boolean, + isGroup: boolean, + groupJid: string | null, + canHandleLocally: boolean, + outgoing: boolean, + isSilenced: boolean, + offerReceivedWhileOffline: boolean, + webClientShouldHandle: boolean, + participants: any[] +} From 76baaca6fcb824b26f94a12339c3fda0ef7d5129 Mon Sep 17 00:00:00 2001 From: gekkedev <17025257+gekkedev@users.noreply.github.com> Date: Tue, 11 Jun 2024 17:45:38 +0200 Subject: [PATCH 04/12] fix: typo in an API method name --- src/api/layers/sender.layer.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/api/layers/sender.layer.ts b/src/api/layers/sender.layer.ts index a4c1363ee..8c24365ba 100644 --- a/src/api/layers/sender.layer.ts +++ b/src/api/layers/sender.layer.ts @@ -1082,7 +1082,7 @@ export class SenderLayer extends ListenerLayer { } /** - * Sets a audio or image view once. Marks message as played + * Sets an audio or image view once. Marks message as played * @category Chat * @param msgId Message id: xxxxx@us.c */ @@ -1107,7 +1107,7 @@ export class SenderLayer extends ListenerLayer { * ``` * @category Chat * @param to Chat Id - * @param duration Duration um miliseconds + * @param duration Duration um milliseconds */ public async startTyping(to: string, duration?: number) { return evaluateAndReturn( @@ -1135,7 +1135,7 @@ export class SenderLayer extends ListenerLayer { * Starts recording ('Recording...' state) * @example * ```javascript - * // Keep sending recording state, use stopRecoring to finish + * // Keep sending recording state, use `stopRecording` to finish * await client.startRecording('[number]@c.us'); * * // Keep sending typing state for 5 seconds @@ -1143,7 +1143,7 @@ export class SenderLayer extends ListenerLayer { * ``` * @category Chat * @param to Chat Id - * @param duration Duration um miliseconds + * @param duration Duration um milliseconds */ public async startRecording(to: string, duration?: number) { return evaluateAndReturn( @@ -1161,7 +1161,7 @@ export class SenderLayer extends ListenerLayer { * @category Chat * @param to Chat Id */ - public async stopRecoring(to: string) { + public async stopRecording(to: string) { return evaluateAndReturn(this.page, ({ to }) => WPP.chat.markIsPaused(to), { to, }); @@ -1346,7 +1346,7 @@ export class SenderLayer extends ListenerLayer { * ``` * @category Chat * @param to Chat Id - * @param duration Duration um miliseconds + * @param duration Duration um milliseconds */ public async sendReactionToMessage(msgId: string, reaction: string | false) { return evaluateAndReturn( @@ -1360,12 +1360,12 @@ export class SenderLayer extends ListenerLayer { } /** - * Send a order message + * Send an order message * To send (prices, tax, shipping or discount), for example: USD 12.90, send them without dots or commas, like: 12900 * * @example * ```javascript - * // Send Order with a product + * // Send an order with a product * client.sendOrderMessage('[number]@c.us', [ * { type: 'product', id: '67689897878', qnt: 2 }, * { type: 'product', id: '37878774457', qnt: 1 }, From 26e0726e134a0d02fe5e864cce830660608a2162 Mon Sep 17 00:00:00 2001 From: gekkedev <17025257+gekkedev@users.noreply.github.com> Date: Tue, 11 Jun 2024 20:36:32 +0000 Subject: [PATCH 05/12] typo in path --- src/api/model/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/api/model/index.ts b/src/api/model/index.ts index fd985c98a..4a7cff578 100644 --- a/src/api/model/index.ts +++ b/src/api/model/index.ts @@ -28,7 +28,7 @@ export { LiveLocation } from './live-location'; export { ContactStatus } from './contact-status'; export { GroupCreation } from './group-creation'; export { WhatsappProfile } from './whatsapp-profile'; -export { IncomingCall } from '.incoming-call'; +export { IncomingCall } from './incoming-call'; export * from './result'; export * from './get-messages-param'; export * from './initializer'; From d68afa37eb0d093657a3b718872e4339ce9d0512 Mon Sep 17 00:00:00 2001 From: gekkedev <17025257+gekkedev@users.noreply.github.com> Date: Wed, 12 Jun 2024 13:28:43 +0000 Subject: [PATCH 06/12] Revert "typo in path" This reverts commit 26e0726e134a0d02fe5e864cce830660608a2162. --- .codebeatignore | 3 - .commitlintrc.json | 13 - .eslintrc.js | 100 - .github/FUNDING.yml | 2 - .github/ISSUE_TEMPLATE/bug_report.md | 41 - .github/ISSUE_TEMPLATE/feature_request.md | 17 - .github/ISSUE_TEMPLATE/support_question.md | 20 - .github/PULL_REQUEST_TEMPLATE.md | 8 - .github/renovate.json | 72 - .github/workflows/build.yml | 41 - .github/workflows/codeql-analysis.yml | 71 - .github/workflows/commitlint.yml | 16 - .github/workflows/lint.yml | 41 - .github/workflows/nightly.yml | 84 - .github/workflows/publish.yml | 81 - .github/workflows/release.yml | 48 - .gitignore | 19 - .husky/.gitignore | 1 - .husky/commit-msg | 4 - .husky/pre-commit | 4 - .npmignore | 24 - .npmrc | 1 - .prettierignore | 2 - .prettierrc | 11 - .release-it.yml | 15 - .vscode/extensions.json | 6 - .vscode/settings.json | 9 - CHANGELOG.md | 612 - CONTRIBUTING.md | 3 - LICENSE.md | 157 - README.md | 94 - Update.md | 5 - docs/getting-started/basic-functions.md | 325 - docs/getting-started/configuring-logger.md | 87 - docs/getting-started/creating-client.md | 188 - docs/getting-started/installation.md | 13 - docs/getting-started/receiving-messages.md | 30 - examples/basic/.gitignore | 4 - examples/basic/README.md | 15 - examples/basic/index.js | 37 - examples/basic/package.json | 11 - examples/bot-functions/.gitignore | 4 - examples/bot-functions/README.md | 15 - examples/bot-functions/index.js | 113 - examples/bot-functions/package.json | 13 - examples/newsletter/.gitignore | 4 - examples/newsletter/README.md | 13 - examples/newsletter/index.js | 42 - examples/newsletter/package.json | 11 - examples/orders/.gitignore | 4 - examples/orders/README.md | 13 - examples/orders/index.js | 51 - examples/orders/package.json | 11 - examples/rest/README.md | 49 - examples/rest/index.js | 141 - img/wppconnect-banner.jpeg | Bin 46584 -> 0 bytes package-lock.json | 14819 ---------------- package.json | 135 - src/api/helpers/base64-mimetype.ts | 30 - src/api/helpers/decrypt.ts | 112 - src/api/helpers/download-file.ts | 61 - src/api/helpers/evaluate-and-return.ts | 146 - src/api/helpers/exposed.enum.ts | 30 - src/api/helpers/file-to-base64.ts | 54 - src/api/helpers/filename-from-mimetype.ts | 33 - src/api/helpers/index.ts | 24 - src/api/helpers/scrape-img-qr.ts | 62 - src/api/helpers/scrape-login.ts | 34 - src/api/helpers/select-sticker.ts | 77 - src/api/layers/README.md | 14 - src/api/layers/business.layer.ts | 259 - src/api/layers/catalog.layer.ts | 318 - src/api/layers/community.layer.ts | 154 - src/api/layers/controls.layer.ts | 299 - src/api/layers/group.layer.ts | 452 - src/api/layers/host.layer.ts | 599 - src/api/layers/labels.layer.ts | 146 - src/api/layers/listener.layer.ts | 681 - src/api/layers/newsletter.layer.ts | 112 - src/api/layers/profile.layer.ts | 169 - src/api/layers/retriever.layer.ts | 636 - src/api/layers/sender.layer.ts | 1420 -- src/api/layers/status.layer.ts | 188 - src/api/layers/ui.layer.ts | 62 - src/api/model/ack.ts | 42 - src/api/model/chat.ts | 50 - src/api/model/contact-status.ts | 22 - src/api/model/contact.ts | 64 - src/api/model/enum/ack-type.ts | 31 - src/api/model/enum/chat-state.ts | 22 - src/api/model/enum/definitions.ts | 606 - src/api/model/enum/group-notification-type.ts | 28 - src/api/model/enum/group-property.ts | 47 - src/api/model/enum/index.ts | 26 - src/api/model/enum/interface-mode.ts | 55 - src/api/model/enum/interface-state.ts | 51 - src/api/model/enum/message-type.ts | 65 - src/api/model/enum/socket-state.ts | 92 - src/api/model/enum/status-find.ts | 66 - src/api/model/get-messages-param.ts | 43 - src/api/model/group-creation.ts | 24 - src/api/model/group-metadata.ts | 41 - src/api/model/host-device.ts | 53 - src/api/model/id.ts | 25 - src/api/model/incoming-call.ts | 34 - src/api/model/index.ts | 38 - src/api/model/initializer.ts | 78 - src/api/model/label.ts | 23 - src/api/model/live-location.ts | 70 - src/api/model/message-id.ts | 25 - src/api/model/message.ts | 89 - src/api/model/partial-message.ts | 41 - src/api/model/participant-event.ts | 25 - src/api/model/presence-event.ts | 40 - src/api/model/presence.ts | 23 - src/api/model/profile-pic-thumb.ts | 29 - src/api/model/qrcode.ts | 21 - src/api/model/result.ts | 50 - src/api/model/whatsapp-profile.ts | 26 - src/api/model/wid.ts | 39 - src/api/whatsapp.ts | 249 - src/config/WAuserAgente.ts | 20 - src/config/create-config.ts | 202 - src/config/puppeteer.config.ts | 61 - src/controllers/auth.ts | 89 - src/controllers/browser.ts | 374 - src/controllers/initializer.ts | 275 - src/controllers/websocket.ts | 59 - src/controllers/welcome.ts | 86 - src/index.ts | 27 - src/lib/README.md | 3 - src/lib/wapi/.babelrc | 20 - .../get-business-profiles-products.js | 39 - src/lib/wapi/business/get-order-by-msg.js | 54 - src/lib/wapi/business/index.js | 18 - src/lib/wapi/business/send-payment-request.js | 47 - .../wapi/functions/are-all-messages-loaded.js | 26 - src/lib/wapi/functions/check-send-exist.js | 83 - src/lib/wapi/functions/create-product.js | 55 - .../download-file-with-credentials.js | 41 - .../wapi/functions/encrypt-and-upload-file.js | 39 - src/lib/wapi/functions/fix-chat.js | 48 - src/lib/wapi/functions/forward-messages.js | 64 - src/lib/wapi/functions/get-all-chats-ids.js | 25 - .../functions/get-all-chats-with-messages.js | 30 - src/lib/wapi/functions/get-all-chats.js | 25 - src/lib/wapi/functions/get-all-contacts.js | 25 - .../wapi/functions/get-all-group-metadata.js | 25 - src/lib/wapi/functions/get-all-groups.js | 23 - .../functions/get-all-messages-in-chat.js | 44 - .../wapi/functions/get-all-new-messages.js | 28 - .../wapi/functions/get-all-unread-messages.js | 35 - src/lib/wapi/functions/get-battery-level.js | 20 - src/lib/wapi/functions/get-chat-by-id.js | 28 - src/lib/wapi/functions/get-chat-by-name.js | 22 - src/lib/wapi/functions/get-chat.js | 32 - .../functions/get-chats-with-new-messages.js | 27 - src/lib/wapi/functions/get-common-groups.js | 43 - src/lib/wapi/functions/get-contact.js | 23 - src/lib/wapi/functions/get-group-metadata.js | 22 - .../functions/get-group-participant-ids.js | 27 - .../wapi/functions/get-group-participants.js | 21 - src/lib/wapi/functions/get-host.js | 20 - src/lib/wapi/functions/get-list-mute.js | 52 - src/lib/wapi/functions/get-me.js | 25 - src/lib/wapi/functions/get-message-by-id.js | 50 - src/lib/wapi/functions/get-messages.js | 34 - src/lib/wapi/functions/get-my-contacts.js | 24 - src/lib/wapi/functions/get-new-id.js | 25 - src/lib/wapi/functions/get-number-profile.js | 34 - src/lib/wapi/functions/get-session-token.js | 29 - .../functions/get-unread-messages-in-chat.js | 64 - src/lib/wapi/functions/get-unread-messages.js | 103 - src/lib/wapi/functions/get-wid.js | 20 - src/lib/wapi/functions/has-unread-messages.js | 20 - src/lib/wapi/functions/index.js | 89 - src/lib/wapi/functions/is-connected.js | 27 - src/lib/wapi/functions/is-logged-in.js | 26 - .../load-all-earlier-chat-messages.js | 51 - .../load-and-get-all-messages-in-chat.js | 54 - .../functions/load-earlier-chat-messages.js | 26 - .../load-earlier-messages-til-date.js | 31 - src/lib/wapi/functions/phoneWatchdog.js | 60 - src/lib/wapi/functions/presence.js | 49 - src/lib/wapi/functions/process-files.js | 38 - .../wapi/functions/process-message-object.js | 28 - src/lib/wapi/functions/send-chat-state.js | 46 - src/lib/wapi/functions/send-file.js | 75 - .../wapi/functions/send-image-with-product.js | 75 - src/lib/wapi/functions/send-image.js | 47 - src/lib/wapi/functions/send-link-preview.js | 68 - src/lib/wapi/functions/send-location.js | 70 - .../wapi/functions/send-message-with-tags.js | 52 - .../wapi/functions/send-message-with-thumb.js | 46 - src/lib/wapi/functions/send-message.js | 59 - src/lib/wapi/functions/send-message2.js | 37 - src/lib/wapi/functions/send-mute.js | 97 - src/lib/wapi/functions/send-ptt.js | 79 - src/lib/wapi/functions/send-video-as-gif.js | 61 - src/lib/wapi/functions/sendMessageOptions.js | 145 - src/lib/wapi/functions/set-my-name.js | 20 - src/lib/wapi/functions/set-online-presence.js | 28 - src/lib/wapi/functions/set-profile-pic.js | 29 - .../wapi/functions/set-temporary-messages.js | 43 - src/lib/wapi/functions/star-messages.js | 57 - src/lib/wapi/functions/theme.js | 29 - src/lib/wapi/globals.d.ts | 31 - src/lib/wapi/helper/array-buffer-to-base64.js | 68 - src/lib/wapi/helper/base64-to-file.js | 33 - src/lib/wapi/helper/generate-media-key.js | 26 - src/lib/wapi/helper/get-file-hash.js | 24 - src/lib/wapi/helper/index.js | 21 - src/lib/wapi/helper/is-chat-message.js | 29 - src/lib/wapi/jsconfig.json | 7 - src/lib/wapi/jssha/index.js | 1158 -- .../wapi/listeners/add-all-new-messages.js | 37 - src/lib/wapi/listeners/add-new-messages.js | 34 - .../wapi/listeners/add-on-added-to-group.js | 49 - .../wapi/listeners/add-on-live-location.js | 75 - src/lib/wapi/listeners/add-on-new-ack.js | 23 - .../listeners/add-on-notification-message.js | 30 - .../listeners/add-on-participants-change.js | 98 - .../wapi/listeners/add-on-presence-changed.js | 74 - src/lib/wapi/listeners/add-on-state-change.js | 47 - src/lib/wapi/listeners/index.js | 27 - src/lib/wapi/listeners/init-listeners.js | 102 - src/lib/wapi/serializers/index.js | 24 - src/lib/wapi/serializers/serialize-chat.js | 46 - src/lib/wapi/serializers/serialize-contact.js | 43 - src/lib/wapi/serializers/serialize-message.js | 46 - .../serializers/serialize-number-status.js | 32 - .../serialize-profile-pic-thumb.js | 34 - .../wapi/serializers/serialize-profilePic.js | 31 - src/lib/wapi/serializers/serialize-raw.js | 23 - src/lib/wapi/store/store-objects.js | 99 - src/lib/wapi/wapi.js | 542 - src/lib/wapi/webpack.config.js | 39 - src/tests/01.qrcode.test.ts | 80 - src/tests/02.basic.test.ts | 156 - src/tests/03.group.test.ts | 56 - src/tests/04.chat.test.ts | 187 - src/tests/common.ts | 66 - src/token-store/fileTokenStore.ts | 203 - src/token-store/index.ts | 21 - src/token-store/isValidSessionToken.ts | 38 - src/token-store/isValidTokenStore.ts | 28 - src/token-store/memoryTokenStore.ts | 66 - src/token-store/types.ts | 136 - src/types/Evaluate.d.ts | 28 - src/types/WAPI.d.ts | 207 - src/utils/ffmpeg.ts | 123 - src/utils/logger.ts | 67 - src/utils/semver.ts | 45 - src/utils/sleep.ts | 20 - tsconfig.json | 66 - typedoc.json | 14 - 256 files changed, 35254 deletions(-) delete mode 100644 .codebeatignore delete mode 100644 .commitlintrc.json delete mode 100644 .eslintrc.js delete mode 100644 .github/FUNDING.yml delete mode 100644 .github/ISSUE_TEMPLATE/bug_report.md delete mode 100644 .github/ISSUE_TEMPLATE/feature_request.md delete mode 100644 .github/ISSUE_TEMPLATE/support_question.md delete mode 100644 .github/PULL_REQUEST_TEMPLATE.md delete mode 100644 .github/renovate.json delete mode 100644 .github/workflows/build.yml delete mode 100644 .github/workflows/codeql-analysis.yml delete mode 100644 .github/workflows/commitlint.yml delete mode 100644 .github/workflows/lint.yml delete mode 100644 .github/workflows/nightly.yml delete mode 100644 .github/workflows/publish.yml delete mode 100644 .github/workflows/release.yml delete mode 100644 .gitignore delete mode 100644 .husky/.gitignore delete mode 100755 .husky/commit-msg delete mode 100755 .husky/pre-commit delete mode 100644 .npmignore delete mode 100644 .npmrc delete mode 100644 .prettierignore delete mode 100644 .prettierrc delete mode 100644 .release-it.yml delete mode 100644 .vscode/extensions.json delete mode 100644 .vscode/settings.json delete mode 100644 CHANGELOG.md delete mode 100644 CONTRIBUTING.md delete mode 100644 LICENSE.md delete mode 100644 README.md delete mode 100644 Update.md delete mode 100644 docs/getting-started/basic-functions.md delete mode 100644 docs/getting-started/configuring-logger.md delete mode 100644 docs/getting-started/creating-client.md delete mode 100644 docs/getting-started/installation.md delete mode 100644 docs/getting-started/receiving-messages.md delete mode 100644 examples/basic/.gitignore delete mode 100644 examples/basic/README.md delete mode 100644 examples/basic/index.js delete mode 100644 examples/basic/package.json delete mode 100644 examples/bot-functions/.gitignore delete mode 100644 examples/bot-functions/README.md delete mode 100644 examples/bot-functions/index.js delete mode 100644 examples/bot-functions/package.json delete mode 100644 examples/newsletter/.gitignore delete mode 100644 examples/newsletter/README.md delete mode 100644 examples/newsletter/index.js delete mode 100644 examples/newsletter/package.json delete mode 100644 examples/orders/.gitignore delete mode 100644 examples/orders/README.md delete mode 100644 examples/orders/index.js delete mode 100644 examples/orders/package.json delete mode 100644 examples/rest/README.md delete mode 100644 examples/rest/index.js delete mode 100644 img/wppconnect-banner.jpeg delete mode 100644 package-lock.json delete mode 100644 package.json delete mode 100644 src/api/helpers/base64-mimetype.ts delete mode 100644 src/api/helpers/decrypt.ts delete mode 100644 src/api/helpers/download-file.ts delete mode 100644 src/api/helpers/evaluate-and-return.ts delete mode 100644 src/api/helpers/exposed.enum.ts delete mode 100644 src/api/helpers/file-to-base64.ts delete mode 100644 src/api/helpers/filename-from-mimetype.ts delete mode 100644 src/api/helpers/index.ts delete mode 100644 src/api/helpers/scrape-img-qr.ts delete mode 100644 src/api/helpers/scrape-login.ts delete mode 100644 src/api/helpers/select-sticker.ts delete mode 100644 src/api/layers/README.md delete mode 100644 src/api/layers/business.layer.ts delete mode 100644 src/api/layers/catalog.layer.ts delete mode 100644 src/api/layers/community.layer.ts delete mode 100644 src/api/layers/controls.layer.ts delete mode 100644 src/api/layers/group.layer.ts delete mode 100644 src/api/layers/host.layer.ts delete mode 100644 src/api/layers/labels.layer.ts delete mode 100644 src/api/layers/listener.layer.ts delete mode 100644 src/api/layers/newsletter.layer.ts delete mode 100644 src/api/layers/profile.layer.ts delete mode 100644 src/api/layers/retriever.layer.ts delete mode 100644 src/api/layers/sender.layer.ts delete mode 100644 src/api/layers/status.layer.ts delete mode 100644 src/api/layers/ui.layer.ts delete mode 100644 src/api/model/ack.ts delete mode 100644 src/api/model/chat.ts delete mode 100644 src/api/model/contact-status.ts delete mode 100644 src/api/model/contact.ts delete mode 100644 src/api/model/enum/ack-type.ts delete mode 100644 src/api/model/enum/chat-state.ts delete mode 100644 src/api/model/enum/definitions.ts delete mode 100644 src/api/model/enum/group-notification-type.ts delete mode 100644 src/api/model/enum/group-property.ts delete mode 100644 src/api/model/enum/index.ts delete mode 100644 src/api/model/enum/interface-mode.ts delete mode 100644 src/api/model/enum/interface-state.ts delete mode 100644 src/api/model/enum/message-type.ts delete mode 100644 src/api/model/enum/socket-state.ts delete mode 100644 src/api/model/enum/status-find.ts delete mode 100644 src/api/model/get-messages-param.ts delete mode 100644 src/api/model/group-creation.ts delete mode 100644 src/api/model/group-metadata.ts delete mode 100644 src/api/model/host-device.ts delete mode 100644 src/api/model/id.ts delete mode 100644 src/api/model/incoming-call.ts delete mode 100644 src/api/model/index.ts delete mode 100644 src/api/model/initializer.ts delete mode 100644 src/api/model/label.ts delete mode 100644 src/api/model/live-location.ts delete mode 100644 src/api/model/message-id.ts delete mode 100644 src/api/model/message.ts delete mode 100644 src/api/model/partial-message.ts delete mode 100644 src/api/model/participant-event.ts delete mode 100644 src/api/model/presence-event.ts delete mode 100644 src/api/model/presence.ts delete mode 100644 src/api/model/profile-pic-thumb.ts delete mode 100644 src/api/model/qrcode.ts delete mode 100644 src/api/model/result.ts delete mode 100644 src/api/model/whatsapp-profile.ts delete mode 100644 src/api/model/wid.ts delete mode 100644 src/api/whatsapp.ts delete mode 100644 src/config/WAuserAgente.ts delete mode 100644 src/config/create-config.ts delete mode 100644 src/config/puppeteer.config.ts delete mode 100644 src/controllers/auth.ts delete mode 100644 src/controllers/browser.ts delete mode 100644 src/controllers/initializer.ts delete mode 100644 src/controllers/websocket.ts delete mode 100644 src/controllers/welcome.ts delete mode 100644 src/index.ts delete mode 100644 src/lib/README.md delete mode 100644 src/lib/wapi/.babelrc delete mode 100644 src/lib/wapi/business/get-business-profiles-products.js delete mode 100644 src/lib/wapi/business/get-order-by-msg.js delete mode 100644 src/lib/wapi/business/index.js delete mode 100644 src/lib/wapi/business/send-payment-request.js delete mode 100644 src/lib/wapi/functions/are-all-messages-loaded.js delete mode 100644 src/lib/wapi/functions/check-send-exist.js delete mode 100644 src/lib/wapi/functions/create-product.js delete mode 100644 src/lib/wapi/functions/download-file-with-credentials.js delete mode 100644 src/lib/wapi/functions/encrypt-and-upload-file.js delete mode 100644 src/lib/wapi/functions/fix-chat.js delete mode 100644 src/lib/wapi/functions/forward-messages.js delete mode 100644 src/lib/wapi/functions/get-all-chats-ids.js delete mode 100644 src/lib/wapi/functions/get-all-chats-with-messages.js delete mode 100644 src/lib/wapi/functions/get-all-chats.js delete mode 100644 src/lib/wapi/functions/get-all-contacts.js delete mode 100644 src/lib/wapi/functions/get-all-group-metadata.js delete mode 100644 src/lib/wapi/functions/get-all-groups.js delete mode 100644 src/lib/wapi/functions/get-all-messages-in-chat.js delete mode 100644 src/lib/wapi/functions/get-all-new-messages.js delete mode 100644 src/lib/wapi/functions/get-all-unread-messages.js delete mode 100644 src/lib/wapi/functions/get-battery-level.js delete mode 100644 src/lib/wapi/functions/get-chat-by-id.js delete mode 100644 src/lib/wapi/functions/get-chat-by-name.js delete mode 100644 src/lib/wapi/functions/get-chat.js delete mode 100644 src/lib/wapi/functions/get-chats-with-new-messages.js delete mode 100644 src/lib/wapi/functions/get-common-groups.js delete mode 100644 src/lib/wapi/functions/get-contact.js delete mode 100644 src/lib/wapi/functions/get-group-metadata.js delete mode 100644 src/lib/wapi/functions/get-group-participant-ids.js delete mode 100644 src/lib/wapi/functions/get-group-participants.js delete mode 100644 src/lib/wapi/functions/get-host.js delete mode 100644 src/lib/wapi/functions/get-list-mute.js delete mode 100644 src/lib/wapi/functions/get-me.js delete mode 100644 src/lib/wapi/functions/get-message-by-id.js delete mode 100644 src/lib/wapi/functions/get-messages.js delete mode 100644 src/lib/wapi/functions/get-my-contacts.js delete mode 100644 src/lib/wapi/functions/get-new-id.js delete mode 100644 src/lib/wapi/functions/get-number-profile.js delete mode 100644 src/lib/wapi/functions/get-session-token.js delete mode 100644 src/lib/wapi/functions/get-unread-messages-in-chat.js delete mode 100644 src/lib/wapi/functions/get-unread-messages.js delete mode 100644 src/lib/wapi/functions/get-wid.js delete mode 100644 src/lib/wapi/functions/has-unread-messages.js delete mode 100644 src/lib/wapi/functions/index.js delete mode 100644 src/lib/wapi/functions/is-connected.js delete mode 100644 src/lib/wapi/functions/is-logged-in.js delete mode 100644 src/lib/wapi/functions/load-all-earlier-chat-messages.js delete mode 100644 src/lib/wapi/functions/load-and-get-all-messages-in-chat.js delete mode 100644 src/lib/wapi/functions/load-earlier-chat-messages.js delete mode 100644 src/lib/wapi/functions/load-earlier-messages-til-date.js delete mode 100644 src/lib/wapi/functions/phoneWatchdog.js delete mode 100644 src/lib/wapi/functions/presence.js delete mode 100644 src/lib/wapi/functions/process-files.js delete mode 100644 src/lib/wapi/functions/process-message-object.js delete mode 100644 src/lib/wapi/functions/send-chat-state.js delete mode 100644 src/lib/wapi/functions/send-file.js delete mode 100644 src/lib/wapi/functions/send-image-with-product.js delete mode 100644 src/lib/wapi/functions/send-image.js delete mode 100644 src/lib/wapi/functions/send-link-preview.js delete mode 100644 src/lib/wapi/functions/send-location.js delete mode 100644 src/lib/wapi/functions/send-message-with-tags.js delete mode 100644 src/lib/wapi/functions/send-message-with-thumb.js delete mode 100644 src/lib/wapi/functions/send-message.js delete mode 100644 src/lib/wapi/functions/send-message2.js delete mode 100644 src/lib/wapi/functions/send-mute.js delete mode 100644 src/lib/wapi/functions/send-ptt.js delete mode 100644 src/lib/wapi/functions/send-video-as-gif.js delete mode 100644 src/lib/wapi/functions/sendMessageOptions.js delete mode 100644 src/lib/wapi/functions/set-my-name.js delete mode 100644 src/lib/wapi/functions/set-online-presence.js delete mode 100644 src/lib/wapi/functions/set-profile-pic.js delete mode 100644 src/lib/wapi/functions/set-temporary-messages.js delete mode 100644 src/lib/wapi/functions/star-messages.js delete mode 100644 src/lib/wapi/functions/theme.js delete mode 100644 src/lib/wapi/globals.d.ts delete mode 100644 src/lib/wapi/helper/array-buffer-to-base64.js delete mode 100644 src/lib/wapi/helper/base64-to-file.js delete mode 100644 src/lib/wapi/helper/generate-media-key.js delete mode 100644 src/lib/wapi/helper/get-file-hash.js delete mode 100644 src/lib/wapi/helper/index.js delete mode 100644 src/lib/wapi/helper/is-chat-message.js delete mode 100644 src/lib/wapi/jsconfig.json delete mode 100644 src/lib/wapi/jssha/index.js delete mode 100644 src/lib/wapi/listeners/add-all-new-messages.js delete mode 100644 src/lib/wapi/listeners/add-new-messages.js delete mode 100644 src/lib/wapi/listeners/add-on-added-to-group.js delete mode 100644 src/lib/wapi/listeners/add-on-live-location.js delete mode 100644 src/lib/wapi/listeners/add-on-new-ack.js delete mode 100644 src/lib/wapi/listeners/add-on-notification-message.js delete mode 100644 src/lib/wapi/listeners/add-on-participants-change.js delete mode 100644 src/lib/wapi/listeners/add-on-presence-changed.js delete mode 100644 src/lib/wapi/listeners/add-on-state-change.js delete mode 100644 src/lib/wapi/listeners/index.js delete mode 100644 src/lib/wapi/listeners/init-listeners.js delete mode 100644 src/lib/wapi/serializers/index.js delete mode 100644 src/lib/wapi/serializers/serialize-chat.js delete mode 100644 src/lib/wapi/serializers/serialize-contact.js delete mode 100644 src/lib/wapi/serializers/serialize-message.js delete mode 100644 src/lib/wapi/serializers/serialize-number-status.js delete mode 100644 src/lib/wapi/serializers/serialize-profile-pic-thumb.js delete mode 100644 src/lib/wapi/serializers/serialize-profilePic.js delete mode 100644 src/lib/wapi/serializers/serialize-raw.js delete mode 100644 src/lib/wapi/store/store-objects.js delete mode 100644 src/lib/wapi/wapi.js delete mode 100644 src/lib/wapi/webpack.config.js delete mode 100644 src/tests/01.qrcode.test.ts delete mode 100644 src/tests/02.basic.test.ts delete mode 100644 src/tests/03.group.test.ts delete mode 100644 src/tests/04.chat.test.ts delete mode 100644 src/tests/common.ts delete mode 100644 src/token-store/fileTokenStore.ts delete mode 100644 src/token-store/index.ts delete mode 100644 src/token-store/isValidSessionToken.ts delete mode 100644 src/token-store/isValidTokenStore.ts delete mode 100644 src/token-store/memoryTokenStore.ts delete mode 100644 src/token-store/types.ts delete mode 100644 src/types/Evaluate.d.ts delete mode 100644 src/types/WAPI.d.ts delete mode 100644 src/utils/ffmpeg.ts delete mode 100644 src/utils/logger.ts delete mode 100644 src/utils/semver.ts delete mode 100644 src/utils/sleep.ts delete mode 100644 tsconfig.json delete mode 100644 typedoc.json diff --git a/.codebeatignore b/.codebeatignore deleted file mode 100644 index cb2e1f485..000000000 --- a/.codebeatignore +++ /dev/null @@ -1,3 +0,0 @@ -src/lib/wapi/jssha/index.js -docs/ -docs/assets/ diff --git a/.commitlintrc.json b/.commitlintrc.json deleted file mode 100644 index 2921a4b34..000000000 --- a/.commitlintrc.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "$schema": "https://json.schemastore.org/commitlintrc.json", - "extends": ["@commitlint/config-conventional"], - "rules": { - "body-max-line-length": [0, "always", 100], - "header-max-length": [2, "always", 120], - "subject-case": [ - 1, - "never", - ["sentence-case", "start-case", "pascal-case", "upper-case"] - ] - } -} diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 782870b64..000000000 --- a/.eslintrc.js +++ /dev/null @@ -1,100 +0,0 @@ -// eslint-disable-next-line no-undef, header/header -module.exports = { - root: true, - parser: '@typescript-eslint/parser', - plugins: ['@typescript-eslint', 'header'], - extends: [ - 'eslint:recommended', - 'plugin:@typescript-eslint/eslint-recommended', - 'plugin:@typescript-eslint/recommended', - 'plugin:prettier/recommended', - ], - rules: { - // @todo more restrictive - '@typescript-eslint/ban-ts-comment': 'off', - '@typescript-eslint/ban-types': 'off', - '@typescript-eslint/explicit-module-boundary-types': 'off', - '@typescript-eslint/no-empty-function': 'off', - '@typescript-eslint/no-explicit-any': 'off', - '@typescript-eslint/no-inferrable-types': 'off', - '@typescript-eslint/no-namespace': 'off', - '@typescript-eslint/no-unused-vars': 'off', - '@typescript-eslint/no-var-requires': 'off', - '@typescript-eslint/prefer-namespace-keyword': 'off', - 'no-async-promise-executor': 'off', - 'no-constant-condition': 'off', - 'no-empty': ['error', { allowEmptyCatch: true }], - 'no-useless-catch': 'off', - 'no-useless-escape': 'off', - 'prefer-const': 'off', - 'header/header': [ - 2, - 'block', - [ - '', - ' * This file is part of WPPConnect.', - ' *', - ' * WPPConnect is free software: you can redistribute it and/or modify', - ' * it under the terms of the GNU Lesser General Public License as published by', - ' * the Free Software Foundation, either version 3 of the License, or', - ' * (at your option) any later version.', - ' *', - ' * WPPConnect is distributed in the hope that it will be useful,', - ' * but WITHOUT ANY WARRANTY; without even the implied warranty of', - ' * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the', - ' * GNU Lesser General Public License for more details.', - ' *', - ' * You should have received a copy of the GNU Lesser General Public License', - ' * along with WPPConnect. If not, see .', - ' ', - ], - 1, - ], - 'prettier/prettier': [ - 'error', - { - endOfLine: 'auto', - }, - ], - }, - overrides: [ - { - files: ['src/lib/**/*.js'], - parser: '@babel/eslint-parser', - plugins: ['@babel'], - parserOptions: { - ecmaVersion: 6, - sourceType: 'module', - }, - env: { - amd: true, - commonjs: true, - es6: true, - browser: true, - node: false, - }, - globals: { - axios: true, - Debug: true, - Store: true, - WAPI: true, - WPP: true, - webpackJsonp: true, - WWebJS: true, - }, - rules: { - // @todo more restrictive - '@typescript-eslint/no-array-constructor': 'off', - 'no-prototype-builtins': 'off', - 'no-redeclare': 'off', - }, - }, - { - files: ['src/lib/**/webpack.*.js', 'src/lib/**/gulpfile.js'], - env: { - browser: false, - node: true, - }, - }, - ], -}; diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml deleted file mode 100644 index 8703191ec..000000000 --- a/.github/FUNDING.yml +++ /dev/null @@ -1,2 +0,0 @@ -github: [icleitoncosta, joaosouz4dev] -open_collective: wppconnect diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index 38bd067fd..000000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -name: Bug report -about: Create a report to help us improve -labels: 'bug, needs triage' ---- - -## Description - -[Description of the bug, When Issue Happens] - -## Environment - -- **WPPConnect version(s):** X.Y.Z -- **WA-JS version(s):** X.Y.Z -- **Browser:** Chrome XX / Chromium XX -- **OS:** Windows X / OSX X.Y.Z -- **Node version:** Node XY -- **WhatsApp version:** X.YYYY.ZZ -- **MultiDevice (BETA):** yes/no - -## Steps to Reproduce - -1. [First Step] -2. [Second Step] -3. [and so on...] - -## Log Output - -``` -If relevant, paste all of your Log Output -``` - -## Your Code - -``` -If relevant, paste all of your challenge code in here -``` - -## Additional context / Screenshot - -Add any other context about the problem here. If applicable, add screenshots to help explain. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index 71aa4f4a6..000000000 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -name: Feature request -about: "I have a suggestion (and may want to implement it \U0001F642)!" -labels: 'enhancement, needs triage' ---- - -**Is your feature request related to a problem? Please describe.** -A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] - -**Describe the solution you'd like** -A clear and concise description of what you want to happen. - -**Describe alternatives you've considered** -A clear and concise description of any alternative solutions or features you've considered. - -**Additional context** -Add any other context or screenshots about the feature request here. diff --git a/.github/ISSUE_TEMPLATE/support_question.md b/.github/ISSUE_TEMPLATE/support_question.md deleted file mode 100644 index a2f3fd0d2..000000000 --- a/.github/ISSUE_TEMPLATE/support_question.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -name: Support Question -about: 'If you have a question, please check out our Documentation or Discord!' -labels: 'question, needs triage' ---- - -**Before adding this issue, make sure you do the following to make sure this is not a duplicate:** - -1. Search through the repo's previous issues -2. Read through the readme at least once -3. Search the docs for the feature you're looking for - -We primarily use GitHub as an issue tracker; for usage and support questions, please check out these resources below. Thanks! 😁. - ---- - -- Documentation: https://wppconnect.io/wppconnect/ -- Discord: https://discord.gg/qCJ95FVbzR -- WhatsApp Group: [https://chat.whatsapp.com/EGLVbeFGgt40OkbOCX8Sei] -- Also have a look at the readme for more information on how to get support: diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index 051f7c6dd..000000000 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,8 +0,0 @@ -Fixes # . - -## Changes proposed in this pull request - -- -- - -To test (it takes a while): `npm install github:/wppconnect#` diff --git a/.github/renovate.json b/.github/renovate.json deleted file mode 100644 index 53b22e871..000000000 --- a/.github/renovate.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "extends": [ - "config:base", - ":prHourlyLimitNone", - ":prNotPending", - ":semanticCommits" - ], - "prConcurrentLimit": 3, - "lockFileMaintenance": { - "enabled": true, - "automerge": true - }, - "packageRules": [ - { - "description": "Use bump strategy", - "matchPackagePatterns": ["*"], - "rangeStrategy": "bump", - "semanticCommitType": "build" - }, - { - "matchManagers": ["github-actions"], - "semanticCommitType": "ci", - "addLabels": ["github_actions"] - }, - { - "matchManagers": ["npm"], - "addLabels": ["javascript"] - }, - { - "matchDepTypes": ["devDependencies"], - "semanticCommitScope": "deps-dev" - }, - { - "description": "Show in changelog package updates", - "matchPackagePatterns": ["^@wppconnect/"], - "semanticCommitType": "fix" - }, - { - "description": "Automatically merge minor and patch-level updates", - "matchUpdateTypes": ["minor", "patch", "pin", "digest"], - "automerge": true, - "automergeStrategy": "squash", - "automergeType": "pr" - }, - { - "description": "Ignore major version", - "matchPackageNames": ["boxen"], - "allowedVersions": "<6" - }, - { - "description": "Ignore major version", - "matchPackageNames": ["chalk"], - "allowedVersions": "<5" - }, - { - "description": "Ignore major version", - "matchPackageNames": ["execa"], - "allowedVersions": "<6" - }, - { - "description": "Ignore major version", - "matchPackageNames": ["file-type"], - "allowedVersions": "<17" - }, - { - "description": "Ignore major version", - "matchPackageNames": ["latest-version"], - "allowedVersions": "<6" - } - ] -} diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml deleted file mode 100644 index 14a635d97..000000000 --- a/.github/workflows/build.yml +++ /dev/null @@ -1,41 +0,0 @@ -name: build - -on: - push: - branches: - - '*' - pull_request: - branches: - - '*' - -jobs: - build: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Setup Node - uses: actions/setup-node@v4.0.2 - with: - node-version: 18.x - - - name: Get npm cache directory - id: npm-cache - run: | - echo "::set-output name=dir::$(npm config get cache)" - - name: Setup npm cache - uses: actions/cache@v4 - with: - path: ${{ steps.npm-cache.outputs.dir }} - key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} - restore-keys: | - ${{ runner.os }}-node- - - - name: Install Dependencies - run: npm ci || npm install - env: - PUPPETEER_SKIP_DOWNLOAD: true - - - name: Build source - run: npm run build diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml deleted file mode 100644 index d485d19bc..000000000 --- a/.github/workflows/codeql-analysis.yml +++ /dev/null @@ -1,71 +0,0 @@ -# For most projects, this workflow file will not need changing; you simply need -# to commit it to your repository. -# -# You may wish to alter this file to override the set of languages analyzed, -# or to provide custom queries or build logic. -name: "CodeQL" - -on: - push: - branches: [master] - pull_request: - # The branches below must be a subset of the branches above - branches: [master] - schedule: - - cron: '0 0 * * 5' - -jobs: - analyze: - name: Analyze - runs-on: ubuntu-latest - - strategy: - fail-fast: false - matrix: - # Override automatic language detection by changing the below list - # Supported options are ['csharp', 'cpp', 'go', 'java', 'javascript', 'python'] - language: ['javascript'] - # Learn more... - # https://docs.github.com/en/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#overriding-automatic-language-detection - - steps: - - name: Checkout repository - uses: actions/checkout@v4 - with: - # We must fetch at least the immediate parents so that if this is - # a pull request then we can checkout the head. - fetch-depth: 2 - - # If this run was triggered by a pull request event, then checkout - # the head of the pull request instead of the merge commit. - - run: git checkout HEAD^2 - if: ${{ github.event_name == 'pull_request' }} - - # Initializes the CodeQL tools for scanning. - - name: Initialize CodeQL - uses: github/codeql-action/init@v3 - with: - languages: ${{ matrix.language }} - # If you wish to specify custom queries, you can do so here or in a config file. - # By default, queries listed here will override any specified in a config file. - # Prefix the list here with "+" to use these queries and those in the config file. - # queries: ./path/to/local/query, your-org/your-repo/queries@main - - # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). - # If this step fails, then you should remove it and run the build manually (see below) - - name: Autobuild - uses: github/codeql-action/autobuild@v3 - - # ℹ️ Command-line programs to run using the OS shell. - # 📚 https://git.io/JvXDl - - # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines - # and modify them (or add more) to build your code if your project - # uses a compiled language - - #- run: | - # make bootstrap - # make release - - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v3 diff --git a/.github/workflows/commitlint.yml b/.github/workflows/commitlint.yml deleted file mode 100644 index d71a21cd0..000000000 --- a/.github/workflows/commitlint.yml +++ /dev/null @@ -1,16 +0,0 @@ -name: commit lint -on: [pull_request] - -jobs: - commitlint: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Lint commit - uses: wagoid/commitlint-github-action@v5.5.1 - with: - configFile: './.commitlintrc.js' diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml deleted file mode 100644 index 0c5def7d5..000000000 --- a/.github/workflows/lint.yml +++ /dev/null @@ -1,41 +0,0 @@ -name: lint - -on: - push: - branches: - - '*' - pull_request: - branches: - - '*' - -jobs: - lint: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Setup Node - uses: actions/setup-node@v4.0.2 - with: - node-version: 18.x - - - name: Get npm cache directory - id: npm-cache - run: | - echo "::set-output name=dir::$(npm config get cache)" - - name: Setup npm cache - uses: actions/cache@v4 - with: - path: ${{ steps.npm-cache.outputs.dir }} - key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} - restore-keys: | - ${{ runner.os }}-node- - - - name: Install Dependencies - run: npm ci || npm install - env: - PUPPETEER_SKIP_DOWNLOAD: true - - - name: Lint source - run: npm run lint diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml deleted file mode 100644 index 85521d561..000000000 --- a/.github/workflows/nightly.yml +++ /dev/null @@ -1,84 +0,0 @@ -name: Nightly Release - -on: - push: - branches: - - 'master' - -jobs: - nightly: - runs-on: ubuntu-latest - continue-on-error: true - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Fetching tags - run: git fetch --tags -f || true - - - name: Setup Node - uses: actions/setup-node@v4.0.2 - with: - node-version: 18.x - - - name: Get npm cache directory - id: npm-cache - run: | - echo "::set-output name=dir::$(npm config get cache)" - - name: Setup npm cache - uses: actions/cache@v4 - with: - path: ${{ steps.npm-cache.outputs.dir }} - key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} - restore-keys: | - ${{ runner.os }}-node- - - - name: Install Dependencies - run: npm ci || npm install - env: - PUPPETEER_SKIP_DOWNLOAD: true - - - name: Update version to alpha - run: npm version prerelease --preid=alpha --no-git --no-git-tag-version - - - name: Build NPM package - run: npm pack && mv wppconnect-*.tgz wppconnect-nightly.tgz - - - name: Build API-Docs - run: npm run docs:build - - - name: Generate Changelog - id: generate_changelog - run: | - changelog=$(npm run changelog:preview --silent) - changelog="${changelog//$'\n'/'%0A'}" - changelog="${changelog//$'\r'/'%0D'}" - echo -e "set-output name=changelog::${changelog-}\n" - echo -e "::set-output name=changelog::${changelog}\n" - - - name: Update Nightly TAG - uses: richardsimko/update-tag@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - tag_name: nightly - - - name: Update Nightly Release - uses: meeDamian/github-release@2.0 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - token: ${{ secrets.GITHUB_TOKEN }} - tag: nightly - commitish: ${{ github.sha }} - name: Nightly Release - body: ${{ steps.generate_changelog.outputs.changelog }} - draft: false - prerelease: true - files: > - wppconnect-nightly.tgz - api-docs/ - gzip: folders - allow_override: true diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml deleted file mode 100644 index f18c1b2b8..000000000 --- a/.github/workflows/publish.yml +++ /dev/null @@ -1,81 +0,0 @@ -name: Publish - -on: - push: - tags: - - 'v*' - -jobs: - publish: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Fetching tags - run: git fetch --tags -f || true - - - name: Setup Node - uses: actions/setup-node@v4.0.2 - with: - node-version: 18.x - registry-url: 'https://registry.npmjs.org' - env: - NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} - - - name: Get npm cache directory - id: npm-cache - run: | - echo "::set-output name=dir::$(npm config get cache)" - - name: Setup npm cache - uses: actions/cache@v4 - with: - path: ${{ steps.npm-cache.outputs.dir }} - key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} - restore-keys: | - ${{ runner.os }}-node- - - - name: Install Dependencies - run: npm ci || npm install - env: - PUPPETEER_SKIP_DOWNLOAD: true - NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} - - - name: Publish in NPM - run: npm publish - env: - NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} - - - name: Generate Changelog - id: generate_changelog - run: | - changelog=$(npm run changelog:last --silent) - changelog="${changelog//$'\n'/'%0A'}" - changelog="${changelog//$'\r'/'%0D'}" - echo -e "set-output name=changelog::${changelog-}\n" - echo -e "::set-output name=changelog::${changelog}\n" - - - name: Create Release - id: create_release - uses: actions/create-release@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - tag_name: ${{ github.ref }} - release_name: ${{ github.ref }} - body: ${{ steps.generate_changelog.outputs.changelog }} - draft: false - prerelease: false - - - name: Build API-Docs - run: npm run docs:build - continue-on-error: true - - - name: Deploy API-Docs - uses: peaceiris/actions-gh-pages@v3 - continue-on-error: true - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: ./api-docs diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml deleted file mode 100644 index c7770a490..000000000 --- a/.github/workflows/release.yml +++ /dev/null @@ -1,48 +0,0 @@ -name: release - -on: - workflow_dispatch: - inputs: - increment: - description: 'Tipo de incremento: patch, minor, major ou pre*' - required: true - default: 'patch' - -jobs: - release: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - token: ${{ secrets.PERSONAL_TOKEN }} - - - name: Setup GIT - run: | - git config --global user.name "github-actions[bot]" - git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com" - - - name: Setup Node - uses: actions/setup-node@v4.0.2 - with: - node-version: 18.x - - - name: Get npm cache directory - id: npm-cache - run: | - echo "::set-output name=dir::$(npm config get cache)" - - name: Setup npm cache - uses: actions/cache@v4 - with: - path: ${{ steps.npm-cache.outputs.dir }} - key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} - restore-keys: | - ${{ runner.os }}-node- - - - name: Install Dependencies - run: npm ci || npm install - env: - PUPPETEER_SKIP_DOWNLOAD: true - - - name: Release - run: 'npx release-it --increment ${{ github.event.inputs.increment }}' diff --git a/.gitignore b/.gitignore deleted file mode 100644 index cbe21bfa4..000000000 --- a/.gitignore +++ /dev/null @@ -1,19 +0,0 @@ -.DS_Store -.idea/ -*.tgz -/debug.log -006.png -api-docs -app.js -app.ts -app2.js -assets -dist.zip -dist/ -gohan.jpg -node_modules -session -session-* -src/app.ts -tokens -yarn.lock \ No newline at end of file diff --git a/.husky/.gitignore b/.husky/.gitignore deleted file mode 100644 index 31354ec13..000000000 --- a/.husky/.gitignore +++ /dev/null @@ -1 +0,0 @@ -_ diff --git a/.husky/commit-msg b/.husky/commit-msg deleted file mode 100755 index e8511eaea..000000000 --- a/.husky/commit-msg +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh -. "$(dirname "$0")/_/husky.sh" - -npx --no-install commitlint --edit $1 diff --git a/.husky/pre-commit b/.husky/pre-commit deleted file mode 100755 index f91359dc2..000000000 --- a/.husky/pre-commit +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh -. "$(dirname "$0")/_/husky.sh" - -npx --no-install pretty-quick --staged diff --git a/.npmignore b/.npmignore deleted file mode 100644 index dc1d63782..000000000 --- a/.npmignore +++ /dev/null @@ -1,24 +0,0 @@ -.* -*.map -*.tgz -*.zip -api-docs -app.js -app.ts -app2.js -assets -bot-functions -CONTRIBUTING.md -debug.log -docs -LICENSE -media -session -session-* -src -tokens -tsconfig.json -typedoc.json -Update.md -UPDATES.md -examples \ No newline at end of file diff --git a/.npmrc b/.npmrc deleted file mode 100644 index e9ee3cb4d..000000000 --- a/.npmrc +++ /dev/null @@ -1 +0,0 @@ -legacy-peer-deps=true \ No newline at end of file diff --git a/.prettierignore b/.prettierignore deleted file mode 100644 index 53253fe4c..000000000 --- a/.prettierignore +++ /dev/null @@ -1,2 +0,0 @@ -docs -dist \ No newline at end of file diff --git a/.prettierrc b/.prettierrc deleted file mode 100644 index 7ba6b977a..000000000 --- a/.prettierrc +++ /dev/null @@ -1,11 +0,0 @@ -{ - "singleQuote": true, - "overrides": [ - { - "files": "*.json5", - "options": { - "parser": "json" - } - } - ] -} diff --git a/.release-it.yml b/.release-it.yml deleted file mode 100644 index 6329139e9..000000000 --- a/.release-it.yml +++ /dev/null @@ -1,15 +0,0 @@ -git: - commitMessage: 'chore(release): v${version}' - tagAnnotation: 'chore(release): v${version}' - tagName: 'v${version}' - requireCleanWorkingDir: false - -hooks: - after:bump: - - 'npm run changelog:update' - -# automatic publish from github workflow -npm: - publish: false - private: true - registry: 'OMITTED' diff --git a/.vscode/extensions.json b/.vscode/extensions.json deleted file mode 100644 index 11bdeb77e..000000000 --- a/.vscode/extensions.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - // List of extensions which should be recommended for users of this workspace. - "recommendations": ["dbaeumer.vscode-eslint", "esbenp.prettier-vscode"], - // List of extensions recommended by VS Code that should not be recommended for users of this workspace. - "unwantedRecommendations": [] -} diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index ec4f617a5..000000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "files.eol": "\n", - "[javascript]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" - }, - "[typescript]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" - } -} diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index 9c2e28acd..000000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,612 +0,0 @@ -# 1.31.0 (2024-06-10) - -### Bug Fixes - -- **deps:** update dependency @wppconnect/wa-js to ^3.3.1 ([#2205](https://github.com/wppconnect-team/wppconnect/issues/2205)) ([89c3298](https://github.com/wppconnect-team/wppconnect/commit/89c3298209aed64e68fa28a9bd2102f1ae366d31)) - -## 1.30.3 (2024-05-03) - -### Bug Fixes - -- **deps:** update dependency @wppconnect/wa-js to ^3.2.4 ([#2168](https://github.com/wppconnect-team/wppconnect/issues/2168)) ([df59aec](https://github.com/wppconnect-team/wppconnect/commit/df59aecc61415f6163dcd9e1ab79ebb0c9b8402f)) - -## 1.30.2 (2024-04-25) - -### Bug Fixes - -- Upgrade whatsappVersion ([b8b1ec7](https://github.com/wppconnect-team/wppconnect/commit/b8b1ec75e5b2926e96fe83f21921f49824eea9cc)) - -## 1.30.1 (2024-03-11) - -- fix: Fixed login by qr code ([5ebd5f5](https://github.com/wppconnect-team/wppconnect/commit/5ebd5f5)) - -## 1.30.0 (2024-03-10) - -- fix(deps): update dependency @wppconnect/wa-js to v3 (#2103) ([3f5a658](https://github.com/wppconnect-team/wppconnect/commit/3f5a658)), closes [#2103](https://github.com/wppconnect-team/wppconnect/issues/2103) - -## 1.29.0 (2024-01-25) - -- [FIX] version whatsapp web ([716cd97](https://github.com/wppconnect-team/wppconnect/commit/716cd97)) - -## 1.28.4 (2023-12-25) - -- fix: Remove unnecessary code for close instance (close #1835) ([43f2a9b](https://github.com/wppconnect-team/wppconnect/commit/43f2a9b)), closes [#1835](https://github.com/wppconnect-team/wppconnect/issues/1835) - -## 1.28.3 (2023-11-15) - -- feat: Added client.getCommonGroups function ([194c898](https://github.com/wppconnect-team/wppconnect/commit/194c898)) - -## 1.28.2 (2023-11-04) - -- chore: Update release-it ([4869dc8](https://github.com/wppconnect-team/wppconnect/commit/4869dc8)) - -## 1.28.1 (2023-11-01) - -- fix : update version whatsappVersion 2.2347.x ([6fe090a](https://github.com/wppconnect-team/wppconnect/commit/6fe090a)) - -# 1.28.0 (2023-08-16) - -## 1.27.3 (2023-06-14) - -### Bug Fixes - -- **deps:** update dependency @wppconnect/wa-version to ^1.2.49 ([#1729](https://github.com/wppconnect-team/wppconnect/issues/1729)) ([bcb26ce](https://github.com/wppconnect-team/wppconnect/commit/bcb26cea7f5b02f1ba28b2a8311a586832b5659c)) - -## 1.27.2 (2023-06-05) - -## 1.27.1 (2023-06-04) - -### Bug Fixes - -- Reverting to previous fix as a temporary workaround ([#1718](https://github.com/wppconnect-team/wppconnect/issues/1718)) ([a0375b6](https://github.com/wppconnect-team/wppconnect/commit/a0375b6086507882600b4d24e12be23add1c4e29)) - -# 1.27.0 (2023-06-02) - -### Bug Fixes - -- **deps:** update dependency @wppconnect/wa-version to ^1.2.44 ([#1716](https://github.com/wppconnect-team/wppconnect/issues/1716)) ([a62cb18](https://github.com/wppconnect-team/wppconnect/commit/a62cb188f1ee0f0dba8c49ab9638c943486835e7)) - -# 1.26.0 (2023-06-01) - -# 1.25.0 (2023-05-30) - -### Bug Fixes - -- **deps:** update dependency @wppconnect/wa-version to ^1.2.42 ([#1700](https://github.com/wppconnect-team/wppconnect/issues/1700)) ([1c07a4b](https://github.com/wppconnect-team/wppconnect/commit/1c07a4b410037dbb748749e9faefde0fc4f04903)) - -# 1.24.0 (2023-04-29) - -## 1.23.2 (2023-04-03) - -## 1.23.1 (2023-03-25) - -### Bug Fixes - -- Fixed multiple inChat emit events ([#1598](https://github.com/wppconnect-team/wppconnect/issues/1598)) ([4900765](https://github.com/wppconnect-team/wppconnect/commit/4900765f20a7c879e597ce01ebcce05bf244006b)) - -# 1.23.0 (2023-03-12) - -### Bug Fixes - -- Reduced the number of log for events ([5b39646](https://github.com/wppconnect-team/wppconnect/commit/5b396467c594396741f61495da1c23bac19c8c94)) - -# 1.22.0 (2023-02-19) - -### Features - -- Added deviceSyncTimeout option (close [#1551](https://github.com/wppconnect-team/wppconnect/issues/1551)) ([d4458e5](https://github.com/wppconnect-team/wppconnect/commit/d4458e5c3727b4d96e1595a6f5fa2d798a2bd69a)) - -# 1.21.0 (2023-02-03) - -### Bug Fixes - -- **deps:** update dependency @wppconnect/wa-js to ^2.19.0 ([#1531](https://github.com/wppconnect-team/wppconnect/issues/1531)) ([09626d0](https://github.com/wppconnect-team/wppconnect/commit/09626d0b4921609633b77a1fcc2a67e9882a9dc4)) - -# 1.20.0 (2022-12-15) - -### Features - -- Added getVotes and getReactions functions ([49bb58f](https://github.com/wppconnect-team/wppconnect/commit/49bb58f9c0db9271a36cea4d650857f2ddbde74a)) - -## 1.19.2 (2022-12-11) - -## 1.19.1 (2022-11-18) - -### Bug Fixes - -- Fixed onMessage method (fix [#1351](https://github.com/wppconnect-team/wppconnect/issues/1351)) ([e8549a1](https://github.com/wppconnect-team/wppconnect/commit/e8549a10cf7b3ed5a04209bdd7d58b9a3c073f32)) - -# 1.19.0 (2022-11-02) - -## 1.18.1 (2022-10-20) - -### Bug Fixes - -- Fixed "Checking phone is connected" without autoClose ([ad63fb5](https://github.com/wppconnect-team/wppconnect/commit/ad63fb56a2255a67bcb16227fa6a61210f8633d1)) - -# 1.18.0 (2022-10-18) - -### Features - -- Improved QRCode re-scan (fix [#1189](https://github.com/wppconnect-team/wppconnect/issues/1189)) ([8ec5264](https://github.com/wppconnect-team/wppconnect/commit/8ec5264e55e01c15efd3e3c273c54e34cad166c9)) - -## 1.17.1 (2022-10-10) - -### Bug Fixes - -- **deps:** update dependency @wppconnect/wa-js to ^2.13.1 ([#1364](https://github.com/wppconnect-team/wppconnect/issues/1364)) ([ff92035](https://github.com/wppconnect-team/wppconnect/commit/ff92035cb05abc21a8e241d8c7d3d5be4614edfb)) - -# 1.17.0 (2022-09-17) - -### Bug Fixes - -- **deps:** update dependency @wppconnect/wa-version to ^1.1.154 ([#1334](https://github.com/wppconnect-team/wppconnect/issues/1334)) ([daa94ef](https://github.com/wppconnect-team/wppconnect/commit/daa94ef808660bd5acb143ceb8c9bff9a3a25a18)) - -## 1.16.1 (2022-08-09) - -# 1.16.0 (2022-08-05) - -### Bug Fixes - -- **deps:** update dependency @wppconnect/wa-js to ^2.10.0 ([dc8133a](https://github.com/wppconnect-team/wppconnect/commit/dc8133a2896c011830c874c94c780acd9368a25a)) - -# 1.15.0 (2022-07-20) - -## 1.14.5 (2022-07-11) - -## 1.14.4 (2022-06-20) - -## 1.14.3 (2022-06-17) - -### Bug Fixes - -- **deps:** update dependency @wppconnect/wa-js to ^2.7.2 ([#1181](https://github.com/wppconnect-team/wppconnect/issues/1181)) ([5208e62](https://github.com/wppconnect-team/wppconnect/commit/5208e621cf79ca5d80cca5ecf3c7b9068ca44e91)) - -## 1.14.2 (2022-06-11) - -### Bug Fixes - -- Added filename for sendFile when is using path or URL (fix [#1168](https://github.com/wppconnect-team/wppconnect/issues/1168)) ([5534fad](https://github.com/wppconnect-team/wppconnect/commit/5534fad0e056563cc3ce6b7699ea06f5eaff6da8)) - -## 1.14.1 (2022-06-08) - -# 1.14.0 (2022-06-08) - -### Bug Fixes - -- **deps:** update dependency @wppconnect/wa-js to ^2.6.0 ([27d5a52](https://github.com/wppconnect-team/wppconnect/commit/27d5a523c1dfa1a22c8be08cd7ff6d03af1fc0b1)) - -## 1.13.3 (2022-06-01) - -### Bug Fixes - -- Clear all token data when disconnected (fix [#1147](https://github.com/wppconnect-team/wppconnect/issues/1147)) ([4abcfed](https://github.com/wppconnect-team/wppconnect/commit/4abcfed97778ddb619df65fec0b1c3d0dc4debac)) - -## 1.13.2 (2022-05-28) - -### Bug Fixes - -- Migrate archiveChat and pinChat methods to WA-JS ([cee7e1c](https://github.com/wppconnect-team/wppconnect/commit/cee7e1ced23409d66365e42a35602265e0c09536)) - -## 1.13.1 (2022-05-10) - -# 1.13.0 (2022-04-25) - -### Features - -- Improved chat state to keep alive and online ([ba82005](https://github.com/wppconnect-team/wppconnect/commit/ba82005f11b8ecc8dacee08304b7d3a66bbea6b0)) - -## 1.12.8 (2022-03-13) - -### Bug Fixes - -- Fixed stuck state after logout ([bb9695a](https://github.com/wppconnect-team/wppconnect/commit/bb9695a61404a062daf1d0995ad2bb10af7c5006)) - -## 1.12.7 (2022-03-03) - -### Bug Fixes - -- Fixed onParticipantsChanged and onPresenceChanged function (fix [#864](https://github.com/wppconnect-team/wppconnect/issues/864), fix [#911](https://github.com/wppconnect-team/wppconnect/issues/911)) ([aff7f6c](https://github.com/wppconnect-team/wppconnect/commit/aff7f6cd34c22c086789ca4871c3113d8d8b2bb8)) - -## 1.12.6 (2022-02-22) - -### Bug Fixes - -- Fixed getGroupMembersIds and getGroupMembers for large chats (fix [#892](https://github.com/wppconnect-team/wppconnect/issues/892)) ([9cc34a5](https://github.com/wppconnect-team/wppconnect/commit/9cc34a5fddef52b01feba6194fff31aa19b388f0)) - -## 1.12.5 (2022-02-06) - -## 1.12.4 (2022-01-22) - -### Bug Fixes - -- Fixed getMessageById where the message is from status (fix [#823](https://github.com/wppconnect-team/wppconnect/issues/823)) ([ed57b97](https://github.com/wppconnect-team/wppconnect/commit/ed57b9700efd72f3de7c0c8d658d24b41f4da5d9)) - -## 1.12.3 (2022-01-21) - -### Bug Fixes - -- Updated @wppconnect/wa-js to v1.1.9 ([5074de1](https://github.com/wppconnect-team/wppconnect/commit/5074de182f401b8f8e6b382aa513ca2cc65ef488)) - -## 1.12.2 (2022-01-15) - -## 1.12.1 (2022-01-14) - -# 1.12.0 (2022-01-08) - -### Bug Fixes - -- Fixed downloadMedia (fix [#463](https://github.com/wppconnect-team/wppconnect/issues/463)) ([ea9ba75](https://github.com/wppconnect-team/wppconnect/commit/ea9ba75ec3e24103a7ccf55b0df43ffc8d46271b)) - -## 1.11.1 (2021-12-09) - -### Bug Fixes - -- Fixed getNumberProfile function (fix [#717](https://github.com/wppconnect-team/wppconnect/issues/717)) ([89a0720](https://github.com/wppconnect-team/wppconnect/commit/89a072066991213d301739b0788d19f05a9b0912)) - -# 1.11.0 (2021-12-09) - -### Bug Fixes - -- Fixed initialization of onPresenceChanged (fix [#704](https://github.com/wppconnect-team/wppconnect/issues/704)) ([0470ea8](https://github.com/wppconnect-team/wppconnect/commit/0470ea8a0fd15727f91e18c913b96f3c1e1f79a9)) - -## 1.10.3 (2021-11-18) - -## 1.10.2 (2021-11-15) - -### Bug Fixes - -- Fixed call of createWid function (fix [#647](https://github.com/wppconnect-team/wppconnect/issues/647)) ([c381000](https://github.com/wppconnect-team/wppconnect/commit/c3810003a4f145f9c3ec54f49cde97ddbe01a164)) - -## 1.10.1 (2021-11-11) - -### Features - -- Updated to latest version of WhatsApp ([f6d01a3](https://github.com/wppconnect-team/wppconnect/commit/f6d01a390db9577f46fee0072637ece981e54780)) - -# 1.10.0 (2021-11-06) - -## 1.9.4 (2021-10-21) - -## 1.9.3 (2021-10-21) - -### Bug Fixes - -- Fixed close method ([#579](https://github.com/wppconnect-team/wppconnect/issues/579)) ([ef42485](https://github.com/wppconnect-team/wppconnect/commit/ef42485505e9920b5b7826674949ed9d5e36d4e1)) - -## 1.9.2 (2021-10-12) - -### Features - -- Added onRevokedMessage (close [#434](https://github.com/wppconnect-team/wppconnect/issues/434)) ([b5df5bb](https://github.com/wppconnect-team/wppconnect/commit/b5df5bbcc3418204744057cf45089c3bb2228c57)) - -## 1.9.1 (2021-10-02) - -### Features - -- Added option to use setProfilePic using base64 (close [#505](https://github.com/wppconnect-team/wppconnect/issues/505)) ([87f1841](https://github.com/wppconnect-team/wppconnect/commit/87f184128c2b458f128ff26ac9ea081537b4c2a4)) - -# 1.9.0 (2021-10-02) - -## 1.8.14 (2021-09-19) - -### Bug Fixes - -- Allow to define chat type in sendMessageOptions (close [#504](https://github.com/wppconnect-team/wppconnect/issues/504)) ([bf76179](https://github.com/wppconnect-team/wppconnect/commit/bf761794559c02a5f7a2d842e68fd6562b68b0cb)) - -## 1.8.13 (2021-08-19) - -### Bug Fixes - -- Fixed file mime-type detection (fix [#409](https://github.com/wppconnect-team/wppconnect/issues/409)) ([1609e34](https://github.com/wppconnect-team/wppconnect/commit/1609e34e89b02eaba57cd2c0ef17e94393e89916)) - -## 1.8.12 (2021-08-05) - -## 1.8.11 (2021-08-04) - -### Features - -- Added setOnlinePresence function to define your presence ([627d1a5](https://github.com/wppconnect-team/wppconnect/commit/627d1a5f3a76ea4813420a4fc25784362497da39)) - -## 1.8.10 (2021-07-31) - -### Bug Fixes - -- Corrigido erro "null to object" ao enviar mensagem (fix [#378](https://github.com/wppconnect-team/wppconnect/issues/378)) ([ec103b9](https://github.com/wppconnect-team/wppconnect/commit/ec103b9cae33b993f95cacdb2a1d35fd3e4ecacc)) - -## 1.8.9 (2021-07-27) - -### Bug Fixes - -- Corrigido a função de fixar conversas (pinChat) (fix [#338](https://github.com/wppconnect-team/wppconnect/issues/338)) ([f6bf1f3](https://github.com/wppconnect-team/wppconnect/commit/f6bf1f3f1598719d38eeb9d84bf3a9c0d87de18d)) - -## 1.8.8 (2021-07-27) - -### Bug Fixes - -- Corrigido problema de ES Module (fix [#362](https://github.com/wppconnect-team/wppconnect/issues/362)) ([dcdefc4](https://github.com/wppconnect-team/wppconnect/commit/dcdefc4e7e0dbeb5cd3678ee0b7e7f92e8210dba)) - -## 1.8.7 (2021-07-26) - -## 1.8.6 (2021-07-23) - -## [1.8.5](https://github.com/wppconnect-team/wppconnect/compare/v1.8.4...v1.8.5) (2021-07-20) - -## 1.8.4 (2021-07-20) - -### Bug Fixes - -- Corrigido o envio de arquivos de tipos de áudio via URL (fix [#329](https://github.com/wppconnect-team/wppconnect/issues/329)) ([6e8b836](https://github.com/wppconnect-team/wppconnect/commit/6e8b836f40ecda9df4870b09d6fc11410a15e1f6)) - -## 1.8.3 (2021-07-14) - -### Bug Fixes - -- Corrigido disparos de onNotificationMessage e onParticipantsChanged ao iniciar ([d421f7b](https://github.com/wppconnect-team/wppconnect/commit/d421f7bc860ec4cee503340c14e676692094ac1d)) - -## 1.8.2 (2021-07-14) - -### Features - -- Adicionado recurso de recusar ligação do WhatsApp (close [#299](https://github.com/wppconnect-team/wppconnect/issues/299)) ([e7ef0b6](https://github.com/wppconnect-team/wppconnect/commit/e7ef0b6db0aecf57bd058c681127a0bdd756636b)) - -## [1.8.1](https://github.com/wppconnect-team/wppconnect/compare/v1.8.0...v1.8.1) (2021-07-12) - -### Bug Fixes - -- Atualizado a versão estável do WhatsApp ([08dabb2](https://github.com/wppconnect-team/wppconnect/commit/08dabb21f3b4d00175efc7d260a257a805fe4716)) - -# [1.8.0](https://github.com/wppconnect-team/wppconnect/compare/v1.7.5...v1.8.0) (2021-07-12) - -### Features - -- Estabilidade para evitar problemas na atualização do WhatsApp ([97d26ab](https://github.com/wppconnect-team/wppconnect/commit/97d26ab7b3c18ba699f4888d0b109a5b8bd9d3d7)) - -## [1.7.5](https://github.com/wppconnect-team/wppconnect/compare/v1.7.4...v1.7.5) (2021-07-09) - -### Bug Fixes - -- Corrigido injeção de script para nova versão do WhatsApp Web ([efd6fe7](https://github.com/wppconnect-team/wppconnect/commit/efd6fe76ffdd4b2ae3e287736a4bf3dd8315e23e)) - -## [1.7.4](https://github.com/wppconnect-team/wppconnect/compare/v1.7.3...v1.7.4) (2021-07-08) - -### Bug Fixes - -- Corrigido o disparo do evento onAddedToGroup ([9e0fcbe](https://github.com/wppconnect-team/wppconnect/commit/9e0fcbe6f022e4acbb047cfbd814c9012a293722)) - -## [1.7.3](https://github.com/wppconnect-team/wppconnect/compare/v1.7.2...v1.7.3) (2021-07-02) - -### Bug Fixes - -- Corrigido função onAddedToGroup (fix [#276](https://github.com/wppconnect-team/wppconnect/issues/276)) ([f034d1a](https://github.com/wppconnect-team/wppconnect/commit/f034d1ad69f43634da8d9924f7c968cd5fdcbe18)) -- Envolvido todos erros para separar erro da LIB do puppeteer ([68b933d](https://github.com/wppconnect-team/wppconnect/commit/68b933d8816ba3a2d0a0a34acdbbed2155d7dcf9)) - -### Performance Improvements - -- Removido chat da serialização de mensagem para maior desempenho ([#289](https://github.com/wppconnect-team/wppconnect/issues/289)) ([69df15c](https://github.com/wppconnect-team/wppconnect/commit/69df15cc39406ee4e9e3d5e1e35b8764d4247d73)) -- Removido o quotedMsgObj da serialização de mensagem e adicionado quotedMsgId ([#289](https://github.com/wppconnect-team/wppconnect/issues/289)) ([3f6daaf](https://github.com/wppconnect-team/wppconnect/commit/3f6daaf6235e6f3e4de8d417aafdfc5091fa170c)) - -## [1.7.2](https://github.com/wppconnect-team/wppconnect/compare/v1.7.1...v1.7.2) (2021-07-01) - -### Features - -- Adicionado nova função getMessages (fix [#282](https://github.com/wppconnect-team/wppconnect/issues/282)) ([ee783e4](https://github.com/wppconnect-team/wppconnect/commit/ee783e423292665c355f5232ccec8b363a872dd3)) - -## [1.7.1](https://github.com/wppconnect-team/wppconnect/compare/v1.7.0...v1.7.1) (2021-06-22) - -### Bug Fixes - -- Corrigido a função sendLocation (fix [#273](https://github.com/wppconnect-team/wppconnect/issues/273)) ([e3dd987](https://github.com/wppconnect-team/wppconnect/commit/e3dd987c4a5dd4412d50f7b86d67577384878e06)) - -# [1.7.0](https://github.com/wppconnect-team/wppconnect/compare/v1.6.0...v1.7.0) (2021-06-21) - -### Bug Fixes - -- Corrigido a função getProfilePicFromServer ([#240](https://github.com/wppconnect-team/wppconnect/issues/240)) ([b7061e5](https://github.com/wppconnect-team/wppconnect/commit/b7061e5da570ba146dd18695a9de7e62858d70bc)) -- Corrigido e melhorado a função de onLiveLocation (fix [#258](https://github.com/wppconnect-team/wppconnect/issues/258)) ([6bc6d7e](https://github.com/wppconnect-team/wppconnect/commit/6bc6d7e706eb2a6a30e8f24a81e466f35a2c2c10)) - -### Features - -- new functions catalog business ([#255](https://github.com/wppconnect-team/wppconnect/issues/255)) ([96d391e](https://github.com/wppconnect-team/wppconnect/commit/96d391e90dfea9e5dee8cd72d6d04e6d842c5ea2)) - -# [1.6.0](https://github.com/wppconnect-team/wppconnect/compare/v1.5.2...v1.6.0) (2021-06-02) - -### Bug Fixes - -- Fixed send message to non contact ([c66b597](https://github.com/wppconnect-team/wppconnect/commit/c66b597f80ed8d08c0c07ba0ca9252f6f328372e)) - -## [1.5.2](https://github.com/wppconnect-team/wppconnect/compare/v1.5.1...v1.5.2) (2021-05-24) - -### Bug Fixes - -- Fixed click to reload qr code, Update scrape-img-qr.ts ([a2104e4](https://github.com/wppconnect-team/wppconnect/commit/a2104e4b5bb50a606c90a2d7d42801289f33f2c1)) Thanks to @AlanMartines - -## [1.5.1](https://github.com/wppconnect-team/wppconnect/compare/v1.5.0...v1.5.1) (2021-05-21) - -### Bug Fixes - -- Fixed getGroupInviteLink function (fix [#214](https://github.com/wppconnect-team/wppconnect/issues/214)) ([597715b](https://github.com/wppconnect-team/wppconnect/commit/597715bc2984c2e4e56942830f893e52d61f9091)) - -### Features - -- Added revokeGroupInviteLink function; ([50feb3c](https://github.com/wppconnect-team/wppconnect/commit/50feb3ceeaa1ed5a0648158f85a11853931725cb)) - -# [1.5.0](https://github.com/wppconnect-team/wppconnect/compare/v1.4.1...v1.5.0) (2021-05-18) - -### Bug Fixes - -- Fixed sendFile return type ([#208](https://github.com/wppconnect-team/wppconnect/issues/208)) ([67dfad5](https://github.com/wppconnect-team/wppconnect/commit/67dfad5c54c598791dc0ac3a0947d5c339fffe2c)) -- Fixed sendPtt return type (fix [#208](https://github.com/wppconnect-team/wppconnect/issues/208)) ([5b701f7](https://github.com/wppconnect-team/wppconnect/commit/5b701f7834134e51d92cff9a86665bf1bce3abf6)) -- Fixed setChatState function (fix [#188](https://github.com/wppconnect-team/wppconnect/issues/188)) ([3351bf7](https://github.com/wppconnect-team/wppconnect/commit/3351bf797b49732efccc4306aca04f4899e3a32c)) - -### Features - -- Added onPresenceChanged to listen presence change ([4629699](https://github.com/wppconnect-team/wppconnect/commit/46296992602ea12631821d1345e5c6c32a5efd3d)) -- Added starMessage function to star/unstar messages ([b83fcbb](https://github.com/wppconnect-team/wppconnect/commit/b83fcbb6ec67578dcddb936ecb2bee079f5cdd46)) - -## [1.4.1](https://github.com/wppconnect-team/wppconnect/compare/v1.4.0...v1.4.1) (2021-05-14) - -### Bug Fixes - -- Fixed archiveChat function ([#194](https://github.com/wppconnect-team/wppconnect/issues/194)) ([1ee2bce](https://github.com/wppconnect-team/wppconnect/commit/1ee2bce38841fc4d123c08fc8395639bfada1c41)) -- Fixed clearChat function ([#194](https://github.com/wppconnect-team/wppconnect/issues/194)) ([4ee7a2e](https://github.com/wppconnect-team/wppconnect/commit/4ee7a2ec0c3bb58aab9ae4df4dc0a0c4f682617a)) -- Fixed return of forwardMessages function ([#194](https://github.com/wppconnect-team/wppconnect/issues/194)) ([d81f94b](https://github.com/wppconnect-team/wppconnect/commit/d81f94bc195a559222a07340ab1c1209c6251558)) - -# [1.4.0](https://github.com/wppconnect-team/wppconnect/compare/v1.3.6...v1.4.0) (2021-05-08) - -### Bug Fixes - -- Fixed getAllMessagesInChat function when chat not found ([2760f68](https://github.com/wppconnect-team/wppconnect/commit/2760f68e2347f4ec9b664315c4a1a89371760aab)) -- Fixed onParticipantsChanged function (fix [#171](https://github.com/wppconnect-team/wppconnect/issues/171)) ([08975a0](https://github.com/wppconnect-team/wppconnect/commit/08975a0657eaed1e4dfc1673003ffac9c657c87f)) -- Improved speed of loadAndGetAllMessagesInChat function (fix [#166](https://github.com/wppconnect-team/wppconnect/issues/166)) ([7f1348a](https://github.com/wppconnect-team/wppconnect/commit/7f1348ac75756822c9356ecc2fc8d793a84f0e30)) - -### Features - -- Added getAllBroadcastList function (close [#184](https://github.com/wppconnect-team/wppconnect/issues/184)) ([351be03](https://github.com/wppconnect-team/wppconnect/commit/351be03ba4801566753e8856ee3940fb362e202e)) -- Added onNotificationMessage function for notif. msg. ([#171](https://github.com/wppconnect-team/wppconnect/issues/171)) ([32c395b](https://github.com/wppconnect-team/wppconnect/commit/32c395b2f936b9b9d259ca43acaa44c02d455bb6)) - -## [1.3.6](https://github.com/wppconnect-team/wppconnect/compare/v1.3.5...v1.3.6) (2021-05-04) - -### Bug Fixes - -- Fixed getAllUnreadMessages and getAllNewMessages (fix [#170](https://github.com/wppconnect-team/wppconnect/issues/170)) ([c45314f](https://github.com/wppconnect-team/wppconnect/commit/c45314f25112a93b242ebd5985e5c69aa8008166)) - -## [1.3.5](https://github.com/wppconnect-team/wppconnect/compare/v1.3.3...v1.3.5) (2021-05-03) - -### Bug Fixes - -- Fixed deletion of tmp chrome user data dir on exit ([8586505](https://github.com/wppconnect-team/wppconnect/commit/85865059810ba9388f172c2ff3b681bae6a3b420)) -- Fixed sendVideoAsGif from URL ([0422a5b](https://github.com/wppconnect-team/wppconnect/commit/0422a5bf7ba94c8d5255592fbc6b5a959ca8ba7d)) - -### Features - -- Added sendGif method to send GIF in the chat ([#112](https://github.com/wppconnect-team/wppconnect/issues/112)) ([4ee590c](https://github.com/wppconnect-team/wppconnect/commit/4ee590c1d0c07bec7d5789deb60f693e0a524192)) - -## [1.3.4](https://github.com/wppconnect-team/wppconnect/compare/v1.3.3...v1.3.4) (2021-04-30) - -### Bug Fixes - -- Fixed deletion of tmp chrome user data dir on exit ([8586505](https://github.com/wppconnect-team/wppconnect/commit/85865059810ba9388f172c2ff3b681bae6a3b420)) - -## [1.3.3](https://github.com/wppconnect-team/wppconnect/compare/v1.3.2...v1.3.3) (2021-04-28) - -## [1.3.2](https://github.com/wppconnect-team/wppconnect/compare/v1.3.1...v1.3.2) (2021-04-28) - -### Bug Fixes - -- Fixed message ID generator ([0da9a62](https://github.com/wppconnect-team/wppconnect/commit/0da9a62490073642aa00dc4f7052465de271f7f3)) -- Fixed sendContact with custom name ([#152](https://github.com/wppconnect-team/wppconnect/issues/152)) ([47a51f0](https://github.com/wppconnect-team/wppconnect/commit/47a51f060814ab79704b160227c350092e2abe3f)) - -### Features - -- Allow to define contact name in sendContactVcardList ([#152](https://github.com/wppconnect-team/wppconnect/issues/152)) ([474e5a0](https://github.com/wppconnect-team/wppconnect/commit/474e5a061496cd96ca4864b0d033813bc47c573a)) - -## [1.3.1](https://github.com/wppconnect-team/wppconnect/compare/v1.3.0...v1.3.1) (2021-04-20) - -### Features - -- Added function to enable and disable temporary messages ([5a9a289](https://github.com/wppconnect-team/wppconnect/commit/5a9a2891785e6b34e3bcb6a6cee3502101e36d7f)) -- Added options to edit group description, subject and properties ([07d155f](https://github.com/wppconnect-team/wppconnect/commit/07d155fb5ca891223881100b28931c4fbbf37740)) - -# [1.3.0](https://github.com/wppconnect-team/wppconnect/compare/v1.2.6...v1.3.0) (2021-04-16) - -### Bug Fixes - -- corrects update instructions ([#124](https://github.com/wppconnect-team/wppconnect/issues/124)) ([8cbfb9b](https://github.com/wppconnect-team/wppconnect/commit/8cbfb9b2c48879d5c6709a40eb7e53188a1347f2)) - -### Features - -- Created tokenStore interface for session data management ([a3a76c3](https://github.com/wppconnect-team/wppconnect/commit/a3a76c3e2e01581ff2ae4e40199eab5957bac0a3)) - -## [1.2.6](https://github.com/wppconnect-team/wppconnect/compare/v1.2.5...v1.2.6) (2021-04-12) - -### Bug Fixes - -- Fixed sendFile from URL ([ff63fed](https://github.com/wppconnect-team/wppconnect/commit/ff63fedd51793896169cc09097e13d99290ec031)) - -## [1.2.5](https://github.com/wppconnect-team/wppconnect/compare/v1.2.4...v1.2.5) (2021-04-07) - -### Bug Fixes - -- Fixed event dispose to stop listeners ([#103](https://github.com/wppconnect-team/wppconnect/issues/103)) ([0682c06](https://github.com/wppconnect-team/wppconnect/commit/0682c06122dc534789cea5721a515e4bdd96e4de)) - -### Features - -- Added phoneWatchdog verification ([6616fa2](https://github.com/wppconnect-team/wppconnect/commit/6616fa22567fe0ea1f35fff32ec1f8b070e76695)) - -## [1.2.4](https://github.com/wppconnect-team/wppconnect/compare/v1.2.3...v1.2.4) (2021-03-30) - -### Bug Fixes - -- Fixed inject token for authentication ([c36466f](https://github.com/wppconnect-team/wppconnect/commit/c36466faddda75dcbfcc7f1e18d275917e41e707)) - -## [1.2.3](https://github.com/wppconnect-team/wppconnect/compare/v1.2.2...v1.2.3) (2021-03-29) - -### Bug Fixes - -- Fixed downloadMedia with new WhatsApp version (fix [#76](https://github.com/wppconnect-team/wppconnect/issues/76)) ([f61e118](https://github.com/wppconnect-team/wppconnect/commit/f61e1183937e8dd2989d892b6a8e7b8e117cd22e)) - -## [1.2.2](https://github.com/wppconnect-team/wppconnect/compare/v1.2.1...v1.2.2) (2021-03-29) - -### Bug Fixes - -- Fixed logged token delete on disconnect ([883d0d4](https://github.com/wppconnect-team/wppconnect/commit/883d0d415a6dd7d05625adcefaa0d3d397fc11ed)) -- Fixed statusFind callback (#fix 57) ([cc0d3d6](https://github.com/wppconnect-team/wppconnect/commit/cc0d3d69855ae219699ea65a53e63379f72e3aa6)) - -## [1.2.1](https://github.com/wppconnect-team/wppconnect/compare/v1.2.0...v1.2.1) (2021-03-04) - -### Bug Fixes - -- Fixed send to status@broadcast ([a0c8d20](https://github.com/wppconnect-team/wppconnect/commit/a0c8d2053d15851dbde34b3a4f3ce03481f8ea09)) - -# [1.2.0](https://github.com/wppconnect-team/wppconnect/compare/v1.1.0...v1.2.0) (2021-03-02) - -### Bug Fixes - -- Increased timeout WhatsApp page load ([c1f8f03](https://github.com/wppconnect-team/wppconnect/commit/c1f8f03476038bceb9f62fd6648124b774794551)) - -### Features - -- Improved module loader ([#27](https://github.com/wppconnect-team/wppconnect/issues/27)) ([0f44d20](https://github.com/wppconnect-team/wppconnect/commit/0f44d2030b34c0101b3f34d995d824f240aa5548)) - -# [1.1.0](https://github.com/wppconnect-team/wppconnect/compare/v1.0.3...v1.1.0) (2021-02-27) - -### Bug Fixes - -- Fixed decryptFile function ([c92597b](https://github.com/wppconnect-team/wppconnect/commit/c92597bb7bda03ee5b4905881894e13e0003e24b)) - -### Features - -- Allow pass browser/page in create method ([#19](https://github.com/wppconnect-team/wppconnect/issues/19)) ([a2902e8](https://github.com/wppconnect-team/wppconnect/commit/a2902e8840046407b56da59ba5d2c1e5c16b5c0b)) - -## [1.0.3](https://github.com/wppconnect-team/wppconnect/compare/v1.0.2...v1.0.3) (2021-02-26) - -### Bug Fixes - -- Fixed "sender" field in message return ([ca5f6ef](https://github.com/wppconnect-team/wppconnect/commit/ca5f6efea3bfcb6b58acd949d2d9035d1088de4f)) - -### chore - -- Deprecated create with argument option position based ([020e71c](https://github.com/wppconnect-team/wppconnect/commit/020e71c7e95eb20a0a623b6e7c218f52c32a172b)) - -### BREAKING CHANGES - -- Deprecated create from argument in favor of CreateOptions - -## [1.0.2](https://github.com/wppconnect-team/wppconnect/compare/v1.0.1...v1.0.2) (2021-02-25) - -### Bug Fixes - -- WhatsApp Web v2.2106.5 compatibility ([fa9d575](https://github.com/wppconnect-team/wppconnect/commit/fa9d575bff21d2a97dda59378e49740b15460a63)) - -## [1.0.1](https://github.com/wppconnect-team/wppconnect/compare/v1.0.0...v1.0.1) (2021-02-24) - -### Bug Fixes - -- Fixed sendPtt from audio with codecs ([2a8b476](https://github.com/wppconnect-team/wppconnect/commit/2a8b476de07366267bb1e683ac632f2e6b815a75)) - -### Features - -- Added sendPtt from file ([ae38c8e](https://github.com/wppconnect-team/wppconnect/commit/ae38c8e38c6c8b731b0ceda008c9224b497f42fd)) - -# [1.0.0](https://github.com/wppconnect-team/wppconnect/compare/v0.0.2...v1.0.0) (2021-02-24) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index 3035a2aae..000000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,3 +0,0 @@ -# Contributing - -PRs are welcome. Just please mantain the code as clean as possible and use common JS conventions diff --git a/LICENSE.md b/LICENSE.md deleted file mode 100644 index 0927556b5..000000000 --- a/LICENSE.md +++ /dev/null @@ -1,157 +0,0 @@ -### GNU LESSER GENERAL PUBLIC LICENSE - -Version 3, 29 June 2007 - -Copyright (C) 2007 Free Software Foundation, Inc. - - -Everyone is permitted to copy and distribute verbatim copies of this -license document, but changing it is not allowed. - -This version of the GNU Lesser General Public License incorporates the -terms and conditions of version 3 of the GNU General Public License, -supplemented by the additional permissions listed below. - -#### 0. Additional Definitions. - -As used herein, "this License" refers to version 3 of the GNU Lesser -General Public License, and the "GNU GPL" refers to version 3 of the -GNU General Public License. - -"The Library" refers to a covered work governed by this License, other -than an Application or a Combined Work as defined below. - -An "Application" is any work that makes use of an interface provided -by the Library, but which is not otherwise based on the Library. -Defining a subclass of a class defined by the Library is deemed a mode -of using an interface provided by the Library. - -A "Combined Work" is a work produced by combining or linking an -Application with the Library. The particular version of the Library -with which the Combined Work was made is also called the "Linked -Version". - -The "Minimal Corresponding Source" for a Combined Work means the -Corresponding Source for the Combined Work, excluding any source code -for portions of the Combined Work that, considered in isolation, are -based on the Application, and not on the Linked Version. - -The "Corresponding Application Code" for a Combined Work means the -object code and/or source code for the Application, including any data -and utility programs needed for reproducing the Combined Work from the -Application, but excluding the System Libraries of the Combined Work. - -#### 1. Exception to Section 3 of the GNU GPL. - -You may convey a covered work under sections 3 and 4 of this License -without being bound by section 3 of the GNU GPL. - -#### 2. Conveying Modified Versions. - -If you modify a copy of the Library, and, in your modifications, a -facility refers to a function or data to be supplied by an Application -that uses the facility (other than as an argument passed when the -facility is invoked), then you may convey a copy of the modified -version: - -- a) under this License, provided that you make a good faith effort - to ensure that, in the event an Application does not supply the - function or data, the facility still operates, and performs - whatever part of its purpose remains meaningful, or -- b) under the GNU GPL, with none of the additional permissions of - this License applicable to that copy. - -#### 3. Object Code Incorporating Material from Library Header Files. - -The object code form of an Application may incorporate material from a -header file that is part of the Library. You may convey such object -code under terms of your choice, provided that, if the incorporated -material is not limited to numerical parameters, data structure -layouts and accessors, or small macros, inline functions and templates -(ten or fewer lines in length), you do both of the following: - -- a) Give prominent notice with each copy of the object code that - the Library is used in it and that the Library and its use are - covered by this License. -- b) Accompany the object code with a copy of the GNU GPL and this - license document. - -#### 4. Combined Works. - -You may convey a Combined Work under terms of your choice that, taken -together, effectively do not restrict modification of the portions of -the Library contained in the Combined Work and reverse engineering for -debugging such modifications, if you also do each of the following: - -- a) Give prominent notice with each copy of the Combined Work that - the Library is used in it and that the Library and its use are - covered by this License. -- b) Accompany the Combined Work with a copy of the GNU GPL and this - license document. -- c) For a Combined Work that displays copyright notices during - execution, include the copyright notice for the Library among - these notices, as well as a reference directing the user to the - copies of the GNU GPL and this license document. -- d) Do one of the following: - - 0) Convey the Minimal Corresponding Source under the terms of - this License, and the Corresponding Application Code in a form - suitable for, and under terms that permit, the user to - recombine or relink the Application with a modified version of - the Linked Version to produce a modified Combined Work, in the - manner specified by section 6 of the GNU GPL for conveying - Corresponding Source. - - 1) Use a suitable shared library mechanism for linking with - the Library. A suitable mechanism is one that (a) uses at run - time a copy of the Library already present on the user's - computer system, and (b) will operate properly with a modified - version of the Library that is interface-compatible with the - Linked Version. -- e) Provide Installation Information, but only if you would - otherwise be required to provide such information under section 6 - of the GNU GPL, and only to the extent that such information is - necessary to install and execute a modified version of the - Combined Work produced by recombining or relinking the Application - with a modified version of the Linked Version. (If you use option - 4d0, the Installation Information must accompany the Minimal - Corresponding Source and Corresponding Application Code. If you - use option 4d1, you must provide the Installation Information in - the manner specified by section 6 of the GNU GPL for conveying - Corresponding Source.) - -#### 5. Combined Libraries. - -You may place library facilities that are a work based on the Library -side by side in a single library together with other library -facilities that are not Applications and are not covered by this -License, and convey such a combined library under terms of your -choice, if you do both of the following: - -- a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities, conveyed under the terms of this License. -- b) Give prominent notice with the combined library that part of it - is a work based on the Library, and explaining where to find the - accompanying uncombined form of the same work. - -#### 6. Revised Versions of the GNU Lesser General Public License. - -The Free Software Foundation may publish revised and/or new versions -of the GNU Lesser General Public License from time to time. Such new -versions will be similar in spirit to the present version, but may -differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -as you received it specifies that a certain numbered version of the -GNU Lesser General Public License "or any later version" applies to -it, you have the option of following the terms and conditions either -of that published version or of any later version published by the -Free Software Foundation. If the Library as you received it does not -specify a version number of the GNU Lesser General Public License, you -may choose any version of the GNU Lesser General Public License ever -published by the Free Software Foundation. - -If the Library as you received it specifies that a proxy can decide -whether future versions of the GNU Lesser General Public License shall -apply, that proxy's public statement of acceptance of any version is -permanent authorization for you to choose that version for the -Library. diff --git a/README.md b/README.md deleted file mode 100644 index 864ab074d..000000000 --- a/README.md +++ /dev/null @@ -1,94 +0,0 @@ -# WPPConnect 📞 - -![WPPConnect Banner](./img/wppconnect-banner.jpeg) - -[![npm version](https://img.shields.io/npm/v/@wppconnect-team/wppconnect.svg?color=green)](https://www.npmjs.com/package/@wppconnect-team/wppconnect) -[![Downloads](https://img.shields.io/npm/dm/@wppconnect-team/wppconnect.svg)](https://www.npmjs.com/package/@wppconnect-team/wppconnect) -[![Average time to resolve an issue](https://isitmaintained.com/badge/resolution/wppconnect-team/wppconnect.svg)](https://isitmaintained.com/project/wppconnect-team/wppconnect 'Average time to resolve an issue') -[![Percentage of issues still open](https://isitmaintained.com/badge/open/wppconnect-team/wppconnect.svg)](https://isitmaintained.com/project/wppconnect-team/wppconnect 'Percentage of issues still open') -[![Build Status](https://img.shields.io/github/actions/workflow/status/wppconnect-team/wppconnect/build.yml?branch=master)](https://github.com/wppconnect-team/wppconnect/actions) -[![Lint Status](https://img.shields.io/github/actions/workflow/status/wppconnect-team/wppconnect/lint.yml?branch=master&label=lint)](https://github.com/wppconnect-team/wppconnect/actions) -[![release-it](https://img.shields.io/badge/%F0%9F%93%A6%F0%9F%9A%80-release--it-e10079.svg)](https://github.com/release-it/release-it) - -> WPPConnect is an open source project developed by the JavaScript community with the aim of exporting functions from WhatsApp Web to the node, which can be used to support the creation of any interaction, such as customer service, media sending, intelligence recognition based on phrases artificial and many other things, use your imagination... 😀🤔💭 - -

- Getting Started • - Basic Function • - Documentation -

- -## Our online channels - -[![Discord](https://img.shields.io/discord/844351092758413353?color=blueviolet&label=Discord&logo=discord&style=flat)](https://discord.gg/JU5JGGKGNG) -[![Telegram Group](https://img.shields.io/badge/Telegram-Group-32AFED?logo=telegram)](https://t.me/wppconnect) -[![WhatsApp Group](https://img.shields.io/badge/WhatsApp-Group-25D366?logo=whatsapp)](https://chat.whatsapp.com/LJaQu6ZyNvnBPNAVRbX00K) -[![YouTube](https://img.shields.io/youtube/channel/subscribers/UCD7J9LG08PmGQrF5IS7Yv9A?label=YouTube)](https://www.youtube.com/c/wppconnect) - -## Functions - -| | | -| ---------------------------------------------------------- | --- | -| Automatic QR Refresh | ✔ | -| Send **text, image, video, audio and docs** | ✔ | -| Get **contacts, chats, groups, group members, Block List** | ✔ | -| Send contacts | ✔ | -| Send stickers | ✔ | -| Send stickers GIF | ✔ | -| Multiple Sessions | ✔ | -| Forward Messages | ✔ | -| Receive message | ✔ | -| insert user section | ✔ | -| Send _location_ | ✔ | -| **and much more** | ✔ | - -See more at WhatsApp methods - -## Installation - -The first thing that you had to do is install the `npm package` : - -```bash -npm i --save @wppconnect-team/wppconnect -``` - -See more at Getting Started - -## Development - -Building WPPConnect is really simple, to build the entire project just run - -```bash -> npm run build -``` - -## Maintainers - -Maintainers are needed, I cannot keep with all the updates by myself. If you are -interested please open a Pull Request. - -## Contributing - -Pull requests are welcome. For major changes, please open an issue first to -discuss what you would like to change. - -## Star History - -[![Star History Chart](https://api.star-history.com/svg?repos=wppconnect-team/wppconnect,wppconnect-team/wa-js&type=Date)](https://star-history.com/#wppconnect-team/wppconnect&wppconnect-team/wa-js&Date) - -## License - -This file is part of WPPConnect. - -WPPConnect is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -WPPConnect is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with WPPConnect. If not, see . diff --git a/Update.md b/Update.md deleted file mode 100644 index 620de2e84..000000000 --- a/Update.md +++ /dev/null @@ -1,5 +0,0 @@ -# Update checking - -Whatsapp is in constant change, in order to tackle this issue I suggest keeping your Wppconnect package always up-to-date. - -The method/function names won't change, only their core algorithm. This way you won't have to makes changes in your code at every update. They will remain the same forever. diff --git a/docs/getting-started/basic-functions.md b/docs/getting-started/basic-functions.md deleted file mode 100644 index c3967fa86..000000000 --- a/docs/getting-started/basic-functions.md +++ /dev/null @@ -1,325 +0,0 @@ -# Basic functions (usage) - -Not every available function will be listed, for further look, every function -available can be found in {@link Whatsapp} - -## Summary - -- [Chatting](#chatting) - - [sendContactVcard](#sendcontactvcard) - - [sendContactVcardList](#sendcontactvcardlist) - - [sendText](#sendtext) - - [sendLocation](#sendlocation) - - [sendLinkPreview](#sendlinkpreview) - - [sendImage](#sendimage) - - [sendFile](#sendfile) - - [sendFileFromBase64](#sendfilefrombase64) - - [sendImageAsStickerGif](#sendimageasstickergif) - - [sendImageAsSticker](#sendimageassticker) - - [sendMentioned](#sendmentioned) - - [reply](#reply) - - [reply with mention](#reply-with-mention) - - [sendMessageOptions](#sendmessageoptions) - - [sendVideoAsGif](#sendvideoasgif) - - [forwardMessages](#forwardmessages) - - [sendSeen](#sendseen) - - [startTyping](#starttyping) - - [stopTyping](#stoptyping) - - [setChatState](#setchatstate) - -## Chatting - -> Here, `chatId` could be `@c.us` or `-@g.us` - -### sendContactVcard - -Send contact - -```javascript -await client - .sendContactVcard('000000000000@c.us', '111111111111@c.us', 'Name of contact') - .then((result) => { - console.log('Result: ', result); //return object success - }) - .catch((erro) => { - console.error('Error when sending: ', erro); //return object error - }); -``` - -### sendContactVcardList - -Send a list of contact cards - -```javascript -await client - .sendContactVcardList('000000000000@c.us', [ - '111111111111@c.us', - '222222222222@c.us', - ]) - .then((result) => { - console.log('Result: ', result); //return object success - }) - .catch((erro) => { - console.error('Error when sending: ', erro); //return object error - }); -``` - -### sendText - -Send basic text - -```javascript -await client - .sendText('000000000000@c.us', '👋 Hello from wppconnect!') - .then((result) => { - console.log('Result: ', result); //return object success - }) - .catch((erro) => { - console.error('Error when sending: ', erro); //return object error - }); -``` - -### sendLocation - -Send location - -```javascript -await client - .sendLocation('000000000000@c.us', '-13.6561589', '-69.7309264', 'Brasil') - .then((result) => { - console.log('Result: ', result); //return object success - }) - .catch((erro) => { - console.error('Error when sending: ', erro); //return object error - }); -``` - -### sendLinkPreview - -Automatically sends a link with the auto-generated link preview. You can also add a custom message to be added. - -```javascript -await client - .sendLinkPreview( - '000000000000@c.us', - 'https://www.youtube.com/watch?v=V1bFr2SWP1I', - 'Kamakawiwo ole' - ) - .then((result) => { - console.log('Result: ', result); //return object success - }) - .catch((erro) => { - console.error('Error when sending: ', erro); //return object error - }); -``` - -### sendImage - -Send an image (you can also upload an image using a valid HTTP protocol) - -```javascript -await client - .sendImage( - '000000000000@c.us', - 'path/to/img.jpg', - 'image-name', - 'Caption text' - ) - .then((result) => { - console.log('Result: ', result); //return object success - }) - .catch((erro) => { - console.error('Error when sending: ', erro); //return object error - }); -``` - -### sendFile - -Send a file (wppconnect will take care of mime types, just needs the path).\ -You can also upload an image using a valid HTTP protocol - -```javascript -await client - .sendFile( - '000000000000@c.us', - 'path/to/file.pdf', - 'file_name', - 'See my file in pdf' - ) - .then((result) => { - console.log('Result: ', result); //return object success - }) - .catch((erro) => { - console.error('Error when sending: ', erro); //return object error - }); -``` - -### sendFileFromBase64 - -Sends a file. - -> base64 parameter should have mime type already defined - -```javascript -await client - .sendFileFromBase64( - '000000000000@c.us', - base64PDF, - 'file_name.pdf', - 'See my file in pdf' - ) - .then((result) => { - console.log('Result: ', result); //return object success - }) - .catch((erro) => { - console.error('Error when sending: ', erro); //return object error - }); -``` - -### sendImageAsStickerGif - -Generates a sticker from the provided animated gif image and sends it (Send an image as an animated sticker)\ -Image path imageBase64 A valid gif and webp image will be required. You can also send it via HTTP/HTTPS () - -```javascript -await client - .sendImageAsStickerGif('000000000000@c.us', './image.gif') - .then((result) => { - console.log('Result: ', result); //return object success - }) - .catch((erro) => { - console.error('Error when sending: ', erro); //return object error - }); -``` - -### sendImageAsSticker - -Generates a sticker from a given image and sends it (Send Image As Sticker)\ -image path imageBase64 A valid PNG, JPG, and WebP image will be required. You can also send it via HTTP/HTTPS () - -```javascript -await client - .sendImageAsSticker('000000000000@c.us', './image.jpg') - .then((result) => { - console.log('Result: ', result); //return object success - }) - .catch((erro) => { - console.error('Error when sending: ', erro); //return object error - }); -``` - -### sendMentioned - -Send `@tagged` message - -```javascript -await client.sendMentioned( - '000000000000@c.us', - 'Hello @5218113130740 and @5218243160777!', - ['5218113130740', '5218243160777'] -); -``` - -### reply - -Reply to a message - -```javascript -await client.reply( - '000000000000@c.us', - 'This is a reply!', - message.id.toString() -); -``` - -### reply with mention - -Reply to a message with a mention - -```javascript -await client.reply( - '000000000000@c.us', - 'Hello @5218113130740 and @5218243160777! This is a reply with mention!', - message.id.toString(), - ['5218113130740', '5218243160777'] -); -``` - -### sendMessageOptions - -Send a message with options - -```javascript -await client - .sendMessageOptions( - '000000000000@c.us', - 'This is a reply!', - { - quotedMessageId: reply, - } - ) - .then((result) => { - console.log(result); - }) - .catch((e) => { - console.log(e); - }); - -``` - -### sendVideoAsGif - -Send a gif - -```javascript -await client.sendVideoAsGif( - '000000000000@c.us', - 'path/to/video.mp4', - 'video.gif', - 'Gif image file' -); -``` - -### forwardMessages - -Forwards messages - -```javascript -await client.forwardMessages( - '000000000000@c.us', - [message.id.toString()], - true -); -``` - -### sendSeen - -Send seen ✔️✔️ - -```javascript -await client.sendSeen('000000000000@c.us'); -``` - -### startTyping - -Start typing... - -```javascript -await client.startTyping('000000000000@c.us'); -``` - -### stopTyping - -Stop typing - -```javascript -await client.stopTyping('000000000000@c.us'); -``` - -### setChatState - -Set chat state (0: Typing, 1: Recording, 2: Paused) - -```javascript -await client.setChatState('000000000000@c.us', 0 | 1 | 2); -``` diff --git a/docs/getting-started/configuring-logger.md b/docs/getting-started/configuring-logger.md deleted file mode 100644 index 0c91e9b18..000000000 --- a/docs/getting-started/configuring-logger.md +++ /dev/null @@ -1,87 +0,0 @@ -# Configuring the logger - -`Wppconnect Bot` uses the [winston](https://github.com/winstonjs/winston) package for log management. - -`wppconnect.defaultLogger` is an instance of `winston.createLogger`. - -## Default log level - -The default log level is `info` - -```javascript -// Supports ES6 -// import * as wppconnect from '@wppconnect-team/wppconnect'; -const wppconnect = require('@wppconnect-team/wppconnect'); - -// Levels: 'error', 'warn', 'info', 'http', 'verbose', 'debug', 'silly' -// All logs: 'silly' -wppconnect.defaultLogger.level = 'silly'; - -// If you want to stop console logging -wppconnect.defaultLogger.transports.forEach((t) => (t.silent = true)); -``` - -## Using a custom logger - -```javascript -// Supports ES6 -// import * as wppconnect from '@wppconnect-team/wppconnect'; -// import * as winston from 'winston'; -const wppconnect = require('@wppconnect-team/wppconnect'); -const winston = require('winston'); - -const logger = winston.createLogger({ - level: 'info', - format: winston.format.json(), - defaultMeta: { service: 'user-service' }, - transports: [ - // - // - Write all logs with level `error` and below to `error.log` - // - Write all logs with level `info` and below to `combined.log` - // - new winston.transports.File({ filename: 'error.log', level: 'error' }), - new winston.transports.File({ filename: 'combined.log' }), - ], -}); - -wppconnect - .create({ - session: 'sessionName', - logger: logger, - }) - .then((client) => { - client.start(); - }) - .catch((erro) => { - console.log(erro); - }); -``` - -## Log to file - -By default, wppconnect uses the Console transport for logging. - -If you want to save the log to a file, you can configure -using the [winston transport](https://github.com/winstonjs/winston#transports) - -```javascript -// Supports ES6 -// import * as wppconnect from '@wppconnect-team/wppconnect'; -// import * as winston from 'winston'; -const wppconnect = require('@wppconnect-team/wppconnect'); -const winston = require('winston'); - -// Optional: Remove all default transports -wppconnect.defaultLogger.clear(); // Remove all transports - -// Create a file transport -const files = new winston.transports.File({ filename: 'combined.log' }); -wppconnect.defaultLogger.add(files); // Add file transport - -//Optional: create a custom console with error level -const console = new winston.transports.Console({ level: 'erro' }); -wppconnect.defaultLogger.add(console); // Add console transport - -//Optional: Remove the custom transport -wppconnect.defaultLogger.remove(console); // Remove console transport -``` diff --git a/docs/getting-started/creating-client.md b/docs/getting-started/creating-client.md deleted file mode 100644 index 733af456e..000000000 --- a/docs/getting-started/creating-client.md +++ /dev/null @@ -1,188 +0,0 @@ -# Creating a Client - -To start using `Wppconnect Bot`, create a file and call the {@link create} method.\ -That method returns a `Promise` of {@link Whatsapp}. - -```javascript -// Supports ES6 -// import { create, Whatsapp } from '@wppconnect-team/wppconnect'; -const wppconnect = require('@wppconnect-team/wppconnect'); - -wppconnect - .create() - .then((client) => client.start()) - .catch((error) => console.log(error)); -``` - -## Multi sessions - -If you want to start more than one session, for example, -in case you have different departments in your project, -then you had to specify it in your code like in that example: - -```javascript -// Init sales WhatsApp bot -wppconnect.create({session: 'sales'}).then((client) => client.start()); - -// Init support WhatsApp bot -wppconnect.create({session: 'support'}).then((client) => client.start()); -``` - -## Passing options on create - -The {@link create} method third parameter can have the following optional parameters (see all parameters in {@link CreateOptions}): - -```javascript -wppconnect.create({ - session: 'sessionName', //Pass the name of the client you want to start the bot - catchQR: (base64Qrimg, asciiQR, attempts, urlCode) => { - console.log('Number of attempts to read the qrcode: ', attempts); - console.log('Terminal qrcode: ', asciiQR); - console.log('base64 image string qrcode: ', base64Qrimg); - console.log('urlCode (data-ref): ', urlCode); - }, - statusFind: (statusSession, session) => { - console.log('Status Session: ', statusSession); //return isLogged || notLogged || browserClose || qrReadSuccess || qrReadFail || autocloseCalled || desconnectedMobile || deleteToken - //Create session wss return "serverClose" case server for close - console.log('Session name: ', session); - }, - onLoadingScreen: (percent, message) => { - console.log('LOADING_SCREEN', percent, message); - }, - headless: true, // Headless Chrome - devtools: false, // Open devtools by default - useChrome: true, // If false will use Chromium instance - debug: false, // Opens a debug session - logQR: true, // Logs QR automatically in terminal - browserWS: '', // If you want to use browserWSEndpoint - browserArgs: [''], // Parameters to be added into the Chrome browser instance - puppeteerOptions: {}, // Will be passed to puppeteer.launch - disableWelcome: false, // Option to disable the welcoming message which appears in the beginning - updatesLog: true, // Logs info updates automatically in terminal - autoClose: 60000, // Automatically closes the wppconnect only when scanning the QR code (default 60 seconds, if you want to turn it off, assign 0 or false) - tokenStore: 'file', // Define how to work with tokens, which can be a custom interface - folderNameToken: './tokens', //folder name when saving tokens - // BrowserSessionToken - // To receive the client's token use the function await client.getSessionTokenBrowser() - sessionToken: { - WABrowserId: '"UnXjH....."', - WASecretBundle: '{"key":"+i/nRgWJ....","encKey":"kGdMR5t....","macKey":"+i/nRgW...."}', - WAToken1: '"0i8...."', - WAToken2: '"1@lPpzwC...."', - } - }) - .then((client) => client.start()) - .catch((error) => console.log(error)); -``` - -### Callback Status Session - -More details in {@link StatusFind} - -| Status | Condition | -|----------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `isLogged` | When the user is already logged in to the browser | -| `notLogged` | When the user is not connected to the browser, it is necessary to scan the QR code through the cell phone in the option WhatsApp Web | -| `browserClose` | If the browser is closed this parameter is returned | -| `qrReadSuccess` | If the user is not logged in, the QR code is passed on the terminal a callback is returned. After the correct reading by cell phone this parameter is returned | -| `qrReadFail` | If the browser stops when the QR code scan is in progress, this parameter is returned | -| `autocloseCalled` | The browser was closed using the autoClose command | -| `desconnectedMobile` | Client has disconnected in to mobile | -| `serverClose` | Client has disconnected in to wss | -| `deleteToken` | If you pass true within the function `client.getSessionTokenBrowser(true)` | - -```javascript -const wppconnect = require('@wppconnect-team/wppconnect'); -wppconnect - .create({ - session: 'sessionName', - statusFind: (statusSession, session) => { - // return: isLogged || notLogged || browserClose || qrReadSuccess || qrReadFail || autocloseCalled || desconnectedMobile || deleteToken - console.log('Status Session: ', statusSession); - // create session wss return "serverClose" case server for close - console.log('Session name: ', session); - }, - }) - .then((client) => client.start()) - .catch((error) => console.log(error)); -``` - -### Phone connection verification -To enforce the phone connection verification, you can use the code below or check the documentation {@link Whatsapp.startPhoneWatchdog}.: -```javascript -// To start with default interval. -client.startPhoneWatchdog(); - -// To start with custom interval. -client.startPhoneWatchdog(30000); // 30s - -// To stop. -client.stopPhoneWatchdog(); -``` - -### Exporting QR Code - -By default, a QR code will appear on the terminal. If you need to pass the QR -somewhere else here is how (See {@link CatchQRCallback}): - -```javascript -const fs = require('fs'); -const wppconnect = require('@wppconnect-team/wppconnect'); - -wppconnect - .create({ - session: 'sessionName', - catchQR: (base64Qr, asciiQR) => { - console.log(asciiQR); // Optional to log the QR in the terminal - var matches = base64Qr.match(/^data:([A-Za-z-+\/]+);base64,(.+)$/), - response = {}; - - if (matches.length !== 3) { - return new Error('Invalid input string'); - } - response.type = matches[1]; - response.data = new Buffer.from(matches[2], 'base64'); - - var imageBuffer = response; - require('fs').writeFile( - 'out.png', - imageBuffer['data'], - 'binary', - function (err) { - if (err != null) { - console.log(err); - } - } - ); - }, - logQR: false, - }) - .then((client) => client.start()) - .catch((error) => console.log(error)); -``` - -### Saving Session Token - -Read the {@link TokenStore} - -### Multidevice (BETA) - -To use multidevice account, you have to set a fixed user data dir for the browser to keep it logged, -because WhatsApp changed the way of authentication. - -To setup this, you can use the example below: - -```javascript -wppconnect - .create({ - // ... - session: 'mySessionName', - puppeteerOptions: { - userDataDir: './tokens/mySessionName', // or your custom directory - }, - // ... - }) - .then((client) => client.start()) - .catch((error) => console.log(error)); -``` - diff --git a/docs/getting-started/installation.md b/docs/getting-started/installation.md deleted file mode 100644 index 0dee56f67..000000000 --- a/docs/getting-started/installation.md +++ /dev/null @@ -1,13 +0,0 @@ -# Installation - -The first thing that you had to do is install the `npm package`: - -```bash -npm i --save @wppconnect-team/wppconnect -``` - -or for [Nightly releases](https://github.com/wppconnect-team/wppconnect/releases/tag/nightly): - -```bash -> npm i --save https://github.com/wppconnect-team/wppconnect/releases/download/nightly/wppconnect-nightly.tgz -``` diff --git a/docs/getting-started/receiving-messages.md b/docs/getting-started/receiving-messages.md deleted file mode 100644 index c3ba60e65..000000000 --- a/docs/getting-started/receiving-messages.md +++ /dev/null @@ -1,30 +0,0 @@ -# Receiving Messages - -To receive messages, you can use the code below - -```javascript -// Supports ES6 -// import { create, Whatsapp } from '@wppconnect-team/wppconnect'; -const wppconnect = require('@wppconnect-team/wppconnect'); - -wppconnect - .create() - .then((client) => client.start()) - .catch((error) => console.log(error)); - -function start(client) { - client.onMessage((message) => { - if (message.body === 'Hello') { - client - .sendText(message.from, 'Hello, how I may help you?') - .then((result) => { - console.log('Result: ', result); //return object success - }) - .catch((erro) => { - console.error('Error when sending: ', erro); //return object error - }); - } - }); - client.start() -} -``` diff --git a/examples/basic/.gitignore b/examples/basic/.gitignore deleted file mode 100644 index 27826cf8a..000000000 --- a/examples/basic/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -node_modules -tokens -package-lock.json -debug.log \ No newline at end of file diff --git a/examples/basic/README.md b/examples/basic/README.md deleted file mode 100644 index a642373a7..000000000 --- a/examples/basic/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# Simple example to start the Wppconnect and send a order message - -Is necessary to login with a business account - -> Wppconnect is a high-performance system developed with JavaScript to create a bot for WhatsApp, support for creating any interaction, such as customer service, media sending, sentence recognition based on artificial intelligence and all types of design architecture for WhatsApp. - -## Maintainers - -Maintainers are needed, I cannot keep with all the updates by myself. If you are -interested please open a Pull Request. - -## Contributing - -Pull requests are welcome. For major changes, please open an issue first to -discuss what you would like to change. diff --git a/examples/basic/index.js b/examples/basic/index.js deleted file mode 100644 index b2c1eb0ad..000000000 --- a/examples/basic/index.js +++ /dev/null @@ -1,37 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ -const wppconnect = require('../../dist'); - -wppconnect - .create() - .then((client) => start(client)) - .catch((erro) => { - console.log(erro); - }); - -function start(client) { - client.onMessage((message) => { - if (message.body === 'Hi' && message.isGroupMsg === false) { - client - .sendText(message.from, 'Welcome Wppconnect') - .then((result) => {}) - .catch((erro) => { - console.error('Error when sending: ', erro); //return object error - }); - } - }); -} diff --git a/examples/basic/package.json b/examples/basic/package.json deleted file mode 100644 index ec7411cb3..000000000 --- a/examples/basic/package.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "name": "wppconnect-functions", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "start": "node index.js", - "test": "echo \"Error: no test specified\" && exit 1" - }, - "license": "ISC" -} diff --git a/examples/bot-functions/.gitignore b/examples/bot-functions/.gitignore deleted file mode 100644 index 27826cf8a..000000000 --- a/examples/bot-functions/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -node_modules -tokens -package-lock.json -debug.log \ No newline at end of file diff --git a/examples/bot-functions/README.md b/examples/bot-functions/README.md deleted file mode 100644 index cf0cb71aa..000000000 --- a/examples/bot-functions/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# Bot to test functions - -> Need to do _npm install_ in the main wppconnect folder and _npm start_ here - -| Message | Return | -| ------------------------------------------------------- | ---------------------------- | -| `!ping` | pong | -| `!ping reply` | pong like reply | -| `!chats` | total chats opened | -| `!info` | infos about connection | -| `!location` | send location | -| `!sendto ` | send msg to some number | -| `!pin ` | freeze this chat | -| `!typing ` | change state chat to typing | -| `!ChatState < 0: Typing or 1: Recording or 2: Paused >` | change state chat to options | diff --git a/examples/bot-functions/index.js b/examples/bot-functions/index.js deleted file mode 100644 index e7500d1f0..000000000 --- a/examples/bot-functions/index.js +++ /dev/null @@ -1,113 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ -const wppconnect = require('../../dist'); - -wppconnect - .create({ - session: 'teste', - onLoadingScreen: (percent, message) => { - console.log('LOADING_SCREEN', percent, message); - }, - }) - .then((client) => start(client)) - .catch((erro) => { - console.log(erro); - }); - -function start(client) { - console.log('Starting bot...'); - client.onMessage(async (msg) => { - try { - if (msg.body == '!ping') { - // Send a new message to the same chat - client.sendText(msg.from, 'pong'); - } else if (msg.body == '!ping reply') { - // Send a new message as a reply to the current one - client.reply(msg.from, 'pong', msg.id.toString()); - } else if (msg.body == '!chats') { - const chats = await client.getAllChats(); - client.sendText(msg.from, `The bot has ${chats.length} chats open.`); - } else if (msg.body == '!info') { - let info = await client.getHostDevice(); - let message = `_*Connection info*_\n\n`; - message += `*User name:* ${info.pushname}\n`; - message += `*Number:* ${info.wid.user}\n`; - message += `*Battery:* ${info.battery}\n`; - message += `*Plugged:* ${info.plugged}\n`; - message += `*Device Manufacturer:* ${info.phone.device_manufacturer}\n`; - message += `*WhatsApp version:* ${info.phone.wa_version}\n`; - client.sendText(msg.from, message); - } else if (msg.body.startsWith('!sendto ')) { - // Direct send a new message to specific id - let number = msg.body.split(' ')[1]; - let messageIndex = msg.body.indexOf(number) + number.length; - let message = msg.body.slice(messageIndex, msg.body.length); - number = number.includes('@c.us') ? number : `${number}@c.us`; - client.sendText(number, message); - } else if (msg.body.startsWith('!pin ')) { - let option = msg.body.split(' ')[1]; - if (option == 'true') { - await client.pinChat(msg.from, true); - } else { - await client.pinChat(msg.from, false); - } - } else if (msg.body.startsWith('!typing ')) { - const option = msg.body.split(' ')[1]; - if (option == 'true') { - // Start typing... - await client.startTyping(msg.from); - } else { - // Stop typing - await client.stopTyping(msg.from); - } - } else if (msg.body.startsWith('!ChatState ')) { - const option = msg.body.split(' ')[1]; - if (option == '1') { - await client.setChatState(msg.from, '0'); - } else if (option == '2') { - await client.setChatState(msg.from, '1'); - } else { - await client.setChatState(msg.from, '2'); - } - } else if (msg.body.startsWith('!btn')) { - await client.sendMessageOptions(msg.from, 'teste', { - title: 'CALÇA JEN FEMININA', - footer: 'Escolha uma opção abaixo', - isDynamicReplyButtonsMsg: true, - dynamicReplyButtons: [ - { - buttonId: 'idSim', - buttonText: { - displayText: 'SIM', - }, - type: 1, - }, - { - buttonId: 'idNao', - buttonText: { - displayText: 'NÃO', - }, - type: 1, - }, - ], - }); - } - } catch (e) { - console.log(e); - } - }); -} diff --git a/examples/bot-functions/package.json b/examples/bot-functions/package.json deleted file mode 100644 index 7c499e261..000000000 --- a/examples/bot-functions/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "wppconnect-functions", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "start": "node index.js", - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "", - "license": "ISC" -} diff --git a/examples/newsletter/.gitignore b/examples/newsletter/.gitignore deleted file mode 100644 index 27826cf8a..000000000 --- a/examples/newsletter/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -node_modules -tokens -package-lock.json -debug.log \ No newline at end of file diff --git a/examples/newsletter/README.md b/examples/newsletter/README.md deleted file mode 100644 index 1238961d9..000000000 --- a/examples/newsletter/README.md +++ /dev/null @@ -1,13 +0,0 @@ -# Simple example to use functions of newsletter - -> Wppconnect is a high-performance system developed with JavaScript to create a bot for WhatsApp, support for creating any interaction, such as customer service, media sending, sentence recognition based on artificial intelligence and all types of design architecture for WhatsApp. - -## Maintainers - -Maintainers are needed, I cannot keep with all the updates by myself. If you are -interested please open a Pull Request. - -## Contributing - -Pull requests are welcome. For major changes, please open an issue first to -discuss what you would like to change. diff --git a/examples/newsletter/index.js b/examples/newsletter/index.js deleted file mode 100644 index 988a88dbc..000000000 --- a/examples/newsletter/index.js +++ /dev/null @@ -1,42 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ -const wppconnect = require('../../dist'); - -wppconnect - .create({ - session: 'teste', - }) - .then((client) => start(client)) - .catch((erro) => { - console.log(erro); - }); - -function start(client) { - client.onMessage(async (message) => { - if (message.body === 'create newsletter' && message.isGroupMsg === false) { - const t = await client.createNewsletter('WPP Test Newsletter2', { - description: 'test', - }); - console.log(t); - await client.sendText(message.from, '```' + JSON.stringify(t) + '```'); - await client.sendText( - message.from, - 'Check the channels of connected device' - ); - } - }); -} diff --git a/examples/newsletter/package.json b/examples/newsletter/package.json deleted file mode 100644 index ec7411cb3..000000000 --- a/examples/newsletter/package.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "name": "wppconnect-functions", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "start": "node index.js", - "test": "echo \"Error: no test specified\" && exit 1" - }, - "license": "ISC" -} diff --git a/examples/orders/.gitignore b/examples/orders/.gitignore deleted file mode 100644 index 27826cf8a..000000000 --- a/examples/orders/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -node_modules -tokens -package-lock.json -debug.log \ No newline at end of file diff --git a/examples/orders/README.md b/examples/orders/README.md deleted file mode 100644 index 1db83d7a5..000000000 --- a/examples/orders/README.md +++ /dev/null @@ -1,13 +0,0 @@ -# Simple example to start the Wppconnect - -> Wppconnect is a high-performance system developed with JavaScript to create a bot for WhatsApp, support for creating any interaction, such as customer service, media sending, sentence recognition based on artificial intelligence and all types of design architecture for WhatsApp. - -## Maintainers - -Maintainers are needed, I cannot keep with all the updates by myself. If you are -interested please open a Pull Request. - -## Contributing - -Pull requests are welcome. For major changes, please open an issue first to -discuss what you would like to change. diff --git a/examples/orders/index.js b/examples/orders/index.js deleted file mode 100644 index c5b551930..000000000 --- a/examples/orders/index.js +++ /dev/null @@ -1,51 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ -const wppconnect = require('../../dist'); - -const froms = []; -wppconnect - .create() - .then((client) => start(client)) - .catch((erro) => { - console.log(erro); - }); - -function start(client) { - client.onMessage(async (message) => { - if (message.body === 'new order' && message.isGroupMsg === false) { - const order = await client.sendOrderMessage(message.from, [ - { type: 'custom', name: 'Item with cost test', price: 120000, qnt: 2 }, - ]); - froms.push(message.from); - client.sendText( - message.from, - `Please, save your order id, and get order for test porpouse` - ); - client.sendText(message.from, `${order.id}`); - } - if (message?.body?.includes('order id=') && message?.isGroupMsg === false) { - const id = message?.body.split('=')[1]; - const order = await client.getOrder(id); - client.sendText(message.from, '```' + JSON.stringify(order) + '```'); - } - }); - client.onOrderStatusUpdate((data) => { - froms.forEach((from) => { - client.sendText(from, '```' + JSON.stringify(data) + '```'); - }); - }); -} diff --git a/examples/orders/package.json b/examples/orders/package.json deleted file mode 100644 index ec7411cb3..000000000 --- a/examples/orders/package.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "name": "wppconnect-functions", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "start": "node index.js", - "test": "echo \"Error: no test specified\" && exit 1" - }, - "license": "ISC" -} diff --git a/examples/rest/README.md b/examples/rest/README.md deleted file mode 100644 index 5c0af9a8b..000000000 --- a/examples/rest/README.md +++ /dev/null @@ -1,49 +0,0 @@ -# Exemplo para consumir a Lib via REST - -2 formas foram criadas neste exemplo - Requisição via GET para saber o status de conexão com o WhatsApp - http://127.0.0.1:3000/getconnectionstatus - - Requisição via POST para envio de mensagem - http://127.0.0.1:3000/sendmessage - os parâmetros que devem ser passados são: - - { - "telnumber": "554190000000", - "message": "Envio de mensagem WPPCONNECT!!!!" - } - - - curl --location --request POST 'http://127.0.0.1:3000/sendmessage' \ - --header 'Content-Type: application/json' \ - --data-raw '{ - "telnumber": "554190000000", - "message": "Envio de mensagem WPPCONNECT!!!!" - }' - - -# Example to consume Lib via REST - -2 shapes were created in this example - GET request to know the connection status with WhatsApp - http://127.0.0.1:3000/getconnectionstatus - - - Request via POST to send a message - http://127.0.0.1:3000/sendmessage - - the parameters that must be passed are: - - { - "telnumber": "554190000000", - "message": "Envio de mensagem WPPCONNECT!!!!" - } - - - curl --location --request POST 'http://127.0.0.1:3000/sendmessage' \ - --header 'Content-Type: application/json' \ - --data-raw '{ - "telnumber": "554190000000", - "message": "Envio de mensagem WPPCONNECT!!!!" - }' - diff --git a/examples/rest/index.js b/examples/rest/index.js deleted file mode 100644 index fdef4bbba..000000000 --- a/examples/rest/index.js +++ /dev/null @@ -1,141 +0,0 @@ -const express = require('express'); -const app = express(); -const wppconnect = require('@wppconnect-team/wppconnect'); -var Instancia; //variável que receberá o cliente para ser chamada em outras funções da lib - //variable that the client will receive to be called in other lib functions - - -app.use(express.json());//parser utizado para requisições via post,....parser used for requests via post, -app.use(express.urlencoded({ extended : true })); - - -app.get('/getconnectionstatus', async function (req, res) { - - console.log("Solicitou status de conexao"); - console.log("Requested connection status"); - - var mensagemretorno =''; //mensagem de retorno da requisição ... request return message - var sucesso = false; //Se houve sucesso na requisição ... If the request was successful - var return_object; - - const executa = async()=>{ - - if (typeof(Instancia) === "object"){ // Validando se a lib está iniciada .... Validating if lib is started - mensagemretorno = await Instancia.getConnectionState(); // validadado o estado da conexão com o whats - //whats connection status validated - sucesso = true; - }else{ - mensagemretorno = 'A instancia não foi inicializada - The instance was not initialized'; - } - return_object = { - status : sucesso, - message :mensagemretorno, - }; - res.send(return_object); - }; - executa(); - - }); - -app.post('/sendmessage', async function (req, res) { - - console.log("Solicitou envio de mensagem VIA POST"); - console.log("Requested sending VIA POST message"); - - //parametros vindos na requisição ... parameters coming in the request - var telnumber = req.body.telnumber; - var mensagemparaenvio = req.body.message; - //***********/ - - var mensagemretorno =''; //mensagem de retorno da requisição ... request return message - var sucesso = false; //Se houve sucesso na requisição ... If the request was successful - var return_object; - - const executa = async()=>{ - - if (typeof(Instancia) === "object"){ // Validando se a lib está iniciada .... Validating if lib is started - status = await Instancia.getConnectionState(); // validadado o estado da conexão com o whats - //whats connection status validated - if(status === 'CONNECTED'){ - let numeroexiste = await Instancia.checkNumberStatus(telnumber+'@c.us'); //Validando se o número existe ... Validating if the number exists - if(numeroexiste.canReceiveMessage===true){ - await Instancia - .sendText(numeroexiste.id._serialized, mensagemparaenvio) - .then((result) => { - console.log('Result: ', result); //return object success - sucesso=true; - mensagemretorno=result.id; - }) - .catch((erro) => { - console.error('Error when sending: ', erro); //return object error - }); - }else{ - mensagemretorno='O numero não está disponível ou está bloqueado - The number is not available or is blocked.'; - } - }else{ - mensagemretorno = 'Valide sua conexao com a internet ou QRCODE - Validate your internet connection or QRCODE'; - } - }else{ - mensagemretorno = 'A instancia não foi inicializada - The instance was not initialized'; - } - return_object = { - status : sucesso, - message :mensagemretorno, - }; - res.send(return_object); - }; - executa(); - - }); - - -startWPP(); //chama a função para inicializar a lib...... call function to initialize the lib - -async function startWPP (){ - await wppconnect.create({session: 'teste', - catchQR: (base64Qr, asciiQR, attempts, urlCode) => { - }, - statusFind: (statusSession, session) => { - console.log('Status Session: ', statusSession); //return isLogged || notLogged || browserClose || qrReadSuccess || qrReadFail || autocloseCalled || desconnectedMobile || deleteToken - //Create session wss return "serverClose" case server for close - console.log('Session name: ', session); - }, - headless: true, // Headless chrome - devtools: false, // Open devtools by default - useChrome: true, // If false will use Chromium instance - debug: false, // Opens a debug session - logQR: true, // Logs QR automatically in terminal - browserWS: '', // If u want to use browserWSEndpoint - browserArgs: [''], // Parameters to be added into the chrome browser instance - puppeteerOptions: {}, // Will be passed to puppeteer.launch - disableWelcome: false, // Option to disable the welcoming message which appears in the beginning - updatesLog: true, // Logs info updates automatically in terminal - autoClose: 60000, // Automatically closes the wppconnect only when scanning the QR code (default 60 seconds, if you want to turn it off, assign 0 or false) - tokenStore: 'file', // Define how work with tokens, that can be a custom interface - folderNameToken: './tokens', //folder name when saving tokens - }).then((client) => { - start(client); - }).catch((erro) => console.log(erro)); - -} - -async function start(client) { - Instancia = client; //Será utilizado nas requisições REST ..... It will be used in REST requests - - client.onMessage( async (message) => { - - }); - client.onAck(ack => { - - }); - client.onStateChange( async (state) => { - - }); - -} - - - -const porta = '3000'; -var server = app.listen(porta); -console.log('Servidor iniciado na porta %s', server.address().port); \ No newline at end of file diff --git a/img/wppconnect-banner.jpeg b/img/wppconnect-banner.jpeg deleted file mode 100644 index 86f03f0bccaac944c54229fb4ef3706fb3dfdf12..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46584 zcmeFY2Ut^Ew>BD3L_{p~&Q_#LPh3Xq4(Z?@>pCf=LfD4qr%CF-Ea=Ccv;;(Y~(j}@(G?%Yjp}9;$bLHywt5;~R(bCY+ z-K4vA{l<-(H?CZzXQ02qKt8|m>md}sT3)z#ncVOOEe$RC?*C%>`4w>UG6kLraDn1B zfbu5Ag_{&V8v$Iu#JqTcEa^WACB+5m%NH-vP?4)&-T+WiP?ANaxJrBF>V?Y`RDfTX zRF`g2)8DeV%y9p)j!O>>BNOXwu-+e$QPJrvyy7y-5KC8&m?CBgT?6;m#U>DGN63;M?{e?+DiePdu`z8%#wMJ*0?-DKjGkWwzbBPnh9 zdW%K3_sjIpVZc?gj+8eq+yp!X>^}MjoBulb{|13eRR9XDDZ&rR&*6FYU+-LAZqB28 z6rP8;M?;xB`YxOD^Ph^Pt4Hx%%^RM5G1&e?*z=3!pT>Wesia$f#4ye=`T^m}G5Sh? z@B`s`>(>F0dO-et_v=9EJNoY6HV66e8_fop>OYJ0{{MTd{!Q1K=AFN(y2H`_H%;5g zSpHSf`!!$x3dw(m?C&7`uqOk5EH&QvN;06ssJgJU8`3K^+E6b;<1&!ecx2u0pR@Kp0 zw})@Df2JYZ@<(`XWA;V7X?s4->l4i)g`0N{Ebbr}lYQ}<*1C#r-#;;Cbln8xV;K=& z!_l0tgmv(v&jAKLF$3VRMVVK^mn#`3012YMAbBN_vqeQ%m^ASHMD^8pd{(9sU_wP$ zfAXi7+K_1}Gd_Y3-TW_Hex1(CBv5r2d?0zp9VCpuV39K8g-jcdTlu^)A$f-xd_?%f zj?Yp!Gavl&OqMJ5HBZUf{Nl_0<*zQd{4V>iZi!6K`J1a||APKci9|PkG1rq)`77(^ zB<8;|e)3Oz!~RsnCwhMqkWL5T^NZ|1KFo}lOk?f!S2!L&rJTG)XwTogc#uH4sU`lI zUdxL~yRkgCFK+YVo*Ca$``|2!-x&Vc2>)c0e}73Cwn(ABdwU$s!@V7L2!If-$SF++ z0m!DYQ}d>DjBypMRP-(mf5hM>M8Hx5tz}*T?N3z?#QS$RM!Tsx)~$RK;bs<^2~=zA zRz7j%319$$@FOQ)yfZr|{vPdcF*eI+{P&nwz}HuP$3LPUpM^ZU^gF;ryAg|kjH@dG z?p&&R^*3>-IJ#vfRqAeBaNK8fkePfAxMKfd!wnFPyyp6c5*Ow#i($ zmXZ(hJmL^kR|^hn=GB2OkQ(%A-R_NBFA0>Hbk4C4HP6?_;7#>8W2?+NBdU&n*dITJ zY3jK}PwffECn17Hl(hJlm1qs%Z56u`jNk8t(!b9yO40AEkJyZd%xFBko1~`RB(LmX zd)YOtzq>FeD#D|5%-;_s*|Wg3cXlq|CQ_rZKfPXa*os3&rOYkx@7eNHgkUpCJey1C z-kl?+)}H`71Ny*k@0Y z#}uRec-YR2kQ%=3Wm=mKwtLn~lJ5so47MNx-EG~9ADaT1O#QDCs256EY80-gIc|mZ z90p`<{2Mj*m}s;g$FE0d-P#vmI)!-bitk>xbTMx-Fn=QUX#e%W`xpBYtYbXymz@sE zHD69#Y7W#li(Km+lKEDYMvBku<@q<_f3&v~^Y*;{U(Egung4?EFW&Tjwu5;6!}SCI z;`%55bFTjv;$NEmrM;b4#s8G+{};1=>OuYs#{Wk;;{O~NsekqQQMLaVZ?t~<%V6wV*GW(gy#74}kMMNqn>0;89^=DfC+4ajE>+6?xLJ7YMS zx^ER|a9aNirr&1>+`1n}utwSOjSxVZC$yqU-y5_U*5%c_cnFNgY2?8#b=oWMGy_H7gcp3#Jp4<0qM9@(X=qSy`^{`{Ia|< z2@-=u*sLnnhdZ~$dE=zMk;TCEJ&)i@Qup2TR@J%d=)q zf=2_fE_Xhjw*8@a8A}g{3b-2O-&Cx=OmR;~{PVvL?*8=ra{1^h;RzS!Ub@A{TgYV! z{XIa)Cn~Q<>f2$TTmjLMEVmWfLq1(B|4?~j{PtWs<@}b`HZhUAgdFD0>vS-is!Z$j z%~J&WCTgu)hZhAszwjvw@@&TAZOq9YU>30>oU~;fr1Uc85MU186sa)+&#OPBJdWf8 zS_j>>f5eh;TYdSj_m=d22w;Ds5twY@PjpnI0X|}&V(7~zi!C^asCe^&$sxSzHR=`9 z?OC0+#ud2*J2_ojL&>f7k&xb!&lS3FkbO8Y-^)Ppz!LnTU#AO(Md(4)gJn_>t9&fG zj4;aM*?s+7lrNL{9{a?F?L7Rpiahq9Y`dyC~b~vK92O$}f$oap)|~-DD_0Rd0R6`5OTQ`r|~U!U^d_( z&%iDToi;Y;@iyK0DRv!f-W3<39ooUBn=b9#$S5*@+GX)p*Uyy0P9bSrd;LW%e@8PK z6o!}WDa*K`H*;|REm(6}#pEbD?pV%I+f;w{gvG19!pM%B=dpmBfX+U!si3A__WF~t zPm^1rMS_+IO^^|hWZaLHR>{5q0_feF;D9VzB@kn&XB*bcda_DFCa}#%-?samax^hQhD}-d>7z)Fi^{} zGQkNVSIe&lKBxW<1jkL&@{KOP>Q>Ss`Y75~ZmisFTtUz5U8^#CNT$zwlBdRyA0N>t zzvO-Ph_klnS`jCx@-V#e@RjRvqs+j^{{>$ELt*|EL4SbGe}_e$8SgLo{tCd~rT@F~ z$Bn;K8@Iv*{Ps7&@rU8~zX<-Tf~?S!Uz+{B+5bT4UwHfi20+&PUo}tru#)!SUjXJ^ z)Gx;HaX|C?GM9Tzz~^h`hBb!2FgE`{{*vicjB@%2kg>rE+w z)l(sY;GAMC<1yGqsQFmf!I*8_eUl?pI%5)J?IGxNq_V=3-87W@dCeQ!-y%26q_|cl z@WkUxRO$LWuYHCtSi^1#_jYLDq_208H2K8Tu9?Z3a4e*_bztskx`0Zo%Qz=(Ls2FM z!lMS|?^#@49v>rpz6T%nM3`8!$%265A+W4cSOzIk2+F1A|RI7^B#YY!OPBonxlEPgaj!&ROZ^m`iO-THRVJhjGZHFq^bP z2ykY6N#%*-r5YJ?+op6phuBg`bcqJ~ooz_q=>DDE2-92?+Mw0kgSr)3&}zd!Ebzo{ z;*~1yT&*r#5q@!Q#RmhUQoEQ3f#`;2{szQSEY*%m%??OQ}`x{(;o&+ zrdfZll;{%ef-VQ%ri{B4wun~&<@lj`2Uxn#wKMlTdzZ(z$5CS_q{kv8I7V1ED#j)a z34bGo^|MXp5FM%Y8&a9|f8WUG6V#GlO;;5iOC!d5P;WA`mF3jgB7G25hDWfoI@T98 z-=bTtaBS?wesgg?*fJBDQAurJP4|!CsTS>O**Q$&ra|j_*Xm7F>TcEsyziQ}zPKlB z44&6gRJZI@*KCYJ-Vjcp`l_Nx^QXhx-z&(;4S>TNYjcYm6k1@qMP+a|W$|CeI0wMo zq)M$d=Ld~POs>Dpf6%b5ga9gqQ+~*QC=$jpqsOR+o0WS-DN z%lt*26(opN^foN8)*dIR_`l$kG4hV|sMtp(jo2LGO!+)~5h~s)a`+RLet&jjNxbIT zA=;>}B`f2^7_c~Iza^Zrqi{S_MmOQ*yOaJCkeRvf_!hQbJ<@no@$l%8{B@I$sySN< zVUCGUw72}AnlVf8y)3^rTFY6Ehbm(Da@FX9v>9MMNeAy4Z zm6xNDW~gS1>~bfdepFDX`EJg`YwH7(Zeyn4lB{Ktj~K)In~jc}RoAAcjrfMgXUkD( zPKvi($6FlDSZtOoeZotn(AG3?cA9f8o7y>VHT;o_q=AC%D6#Z`QO>dS~7FsiHyr zCxC{C&RX*&jb;>#K4~^BsBQx1j+t6P2uxDBUgFd3!3Xq>rBzGD-P(~IOhuyG0sil# zhMHR?Qu~Um-&^~MgEKA>Tzm}-jYqyWyKQX-_iI;rCdU`2hE_7z-cSE%$#^Sl#(g(F zKmP?vUUv&a{S7ucUht!p^^)1w?R+LRsI&2yW%4EXH9725EXR9A6@#fX|KE;9%PgPnD`LL0NXK63? zbHuAWfH}aig=(Hi9^}Z?qGIE+GItnkg7wbV`%<+uVPlJn7GC1oMSG57v71UkcOw#) zw>)*S>VSEHMI}OZCo}*nzLL@UlePGtfavq4fbW&>C!lA%yKMIWRu7BTEe`tYo}OJ; z^-b{KE9iarI2v$C;)Hvi#~;2M(XI4f#Q%RmgJSjI-otwQvD%{e3qZ5ERn4~zTy5+z z_29-m-xUNp;0^z)tJeDp?cB#BOXi>b!*{4_%Z?2e#qIu&A|4YlM+dwfd-gsNwmgH- zz|4~(_7|;hP<(*TMJsR zQ9(^&7qhAjW(hjO76wi68P5-~Af_)ubu3 zZg%D}-W$7u2zb2?Ngq3EgUk(D`f{v{if@PWzBkn`t13&%RmBTcfKrGgb*Ux^l3X(i z>6!seu?4}Jb)rb>N`1t2sSGC+!|GPTK!@@DbkOimfB|@hcEB?>V1LO=)jWFeq|_h( zK#d~y?((q1SQqKIy?tx#3aZx2(8f{JFV*A7{GsYtN9>@CriLuu*de|2cq`pUQE0@n z>nSl8xJWv{oveSKNG~m2U_;BQt7`_smXjW&))mz>IIUP52H}k1N%YRS8kr{6G{8Qh zG)G3c`bs-We}dokq%~faaTo*ldFY|QKS3ohA{+=^pY*pdoC(nbPCPj}J<-dGO|k}wqDh1?f=IQ-CQiAONdqF(q9G9i%}Sai$_Yc`NCie&n4}JR z?Fw?Fa3}Ti8UGc5X}!OP1poS1CY{d1+PE*|1ta34+E*-%(&oiXV^_LQ(SVFdnx`5n zm0byxU}6nkZiiQH@kEm$=aqnb6|(^3Fm42;E~pIDBG7A^f+pg(nT&&I^I%oZeh|hp zqIv8jMZbgd>Jz5izCmM99)7xaibrPDb5+FlUXNZ=ezHHo6xbDpYVB?AZw_@_6I70s z-B%T?iF?HA#; z`U01P$V)L@pzAYAEozMyI4vtL+$dCU{ z7`N?g7C&bT(;ch%T;AI&#aj=b0W@yrPImq-?CBzxu&>*APkKegW4~$>%hdcZr8*)K zgt2b6zm&Ss*a$3*Pz#&Q2dCMSe z{Sp6yk0ocU^78dt#*PAtMzy&R1KOhO(g|WQUS(=berml`;}_zlu~) z+II8#yX+mH-FM%a={**C`CaoBt}>rt)7PU1QhE2Pa@XThg!Q$n>mO7ca=eJKV7jcL z!uLhpE^78ol%|%ZMAEd$Y97{*xa&TkxnNWBc1rqCkxF^Yz1H*av@*C8$t*e&)qk5V zOWOlsc*6(B|-1m1^Tsxj80m-2-}RIqP#v^+&CSvfGN`{E=7p6fB(H^d?p#)0T!$uvH9l=Y-vEJMc!sMq%#q zp%Wimzkhj{j7Ww)P~t7IrwKFIQMi~`K4jo7ZImL$ksX(yLQ?ndHDA0l5l9GR`J?Hz zWj-C$!2f#Ntcu;cD2X?53AHz2j3Kd!8|^i*0=U1qckFZuaT=&)ox4l9HGFEg-2H;omiW5Ykr~% zEst^7gxV9loAD!S$tJw5O3{Ujl4ex@B$=-AXG#Y2l}P6ly$rq#?V^kfo0Q1Px(_d6 z4uMjFz=xdv)P6!=0QHjd12oQXyhJo8eY7N8$3WOSpG8xn1+E`sFjm0SzW6EGgq6DI zZAedKJw|!}_T%lzSGoJvKYkQ3n?9pl-w!gLgpMBvW9_>y4p3Gt{vLi#s9L7jmdJ9f z7gvJTb+FC_CjkkEr{k!W}u3W)w6!%7+R#bH+3imo(yPr-S$oB&VyR z%tc5CiP7lu0sHxsHm=mk0mNVmz3+f;)PW2O6!yL8v9rl&C99jw5G~WNzH?ElH>fDK zeGg}>1-YUbnspj)8`8s=V!!W&C*inY530<&f4G-3V?)OCuv|+a9bE7dn})Ff53P>L7LCcwUn80u|=< zaE_+Qc%|aTY~_bexNaC20~0QpHp);XtTl={eqI3Qm0QO9-l6H83qy?ydC@A!J9+S* zC`4@qTyClK5{15yWKh?uB%5Bp7Cjj}mskCSqC}@hWBv;$kGwwZs?3{9hD-mjhRk!lY4dH=KNKHSNu9O6)(CVKigD1)G@FDPQ8k<^6{xmvb zYBX)jJzl$O-i96iN*J+^Dn4C8%*UHQ)Rp$l2p_UrGv=>n4Kw`CQy-Q7L3bm&?oz42 z+jzv===JWl9>1>pWlu_z&*BzBIJ@i@6ujH8gfD3ueRs}!iA~P%BsH|Rs)$9{R9r!tlL{avXIIO770|K+?;6x(~=T?q}zxo?FvKlG>bSIN0KH-S`vT>B_XO2=!eW z;2jo5h$7AFev@Zd#@&FIum03%883~y^FI8bd}}Ox$UJ-UiRw<9>&whG@Qa(#cl)CH zQid!uUy16aU9)A|fFxl+KyY*q-*5{l{zBR8-I^7x83X738@{Cs8~)q70RL5V+|+BM z9DHx=m^Dt_m$acX$nrw-_kTorLNzrSh~H=^6?(K)o440r&{N4oKL49&mlQjXtf3t< z(u}=mnf*n+1F;F{-R}h$8U_WZm4UcGpO=P1(L=i6h$>ukxnh#lboP0GhiqBFlWp@Qw zJ{Uyc?j0k_AoEG!ZE`|k$9+TLe7{CE={}L#PFrG)%34#nRbS5YT1<>Njfpy3cNVHP z{nAO)XW6sU<)jO|WF4qpq&+0-x7>8HePGplbR1W5!NdUPVTL9(sq5jOu2{L2j968aV0Jx?s*vZM>dT^B#d9rVS`OspjYv@UGlAYt!&pd( z9@1wb-dITPj!VwdYOpDWIqyW%Cp#`j+aUeZwyKGte{tjb5;-?N5MHQVb|Y}O6CbrH zW^-T6#2~zEe^>*$uVLDD@+^%B1Gw_#^Pl?5|J@2D8^zb%-|q^*pz>O9Vcm_lHQHG^ zuPih}ko_zWQQ)m=a7@a}kkZWXg|tE@v)9dz>1e2l2;brJ^#J%j7kf-MwG#cn$4%+5 z$jz~gm#b<*(=Oq2V~Q|6c$jc*D1S{F3A?}4RyeD&GU(TN6U##5V2iSUUI5a|xjWsj zb>5`?P)_li(g?B4c*s-Z)?U2tC z)vvds2adj*E@4UxjmHhwWUiL$7-&cv#x1X9#}6+*lq@%o(efYacWadPMLDO8y>Ho= zI=G2?3O`vBShs(??c&HNEB9jXowjYL`3jzuz^2#p01+)#k*Xca)7HeDsj{*aEz7DZ zU>*AFW#@rF%4#yM?AlaM@#O^G>Rc1UW|gQ8unFDmuZI^#t^StgBAA9*`t485pmdp1 z^x%`9x>EgbjFFDDcViNro>9^xi~AB?irW*Ys-k4^*6jpHiagQJ9Z(lE2x;14muB?n z&#b8PWg0$zat~?@E-eqjU0x@mnOO6mE_2A&$I3Hp*@uil{2?+&LR&{>X}8AcyD2~a zl7NCu5kMb@`u?@k=O;kG;ea|-0VP3|%3#d}Mm1@1sf&Gk8?fv;$2j!9O5GjTcEVa7 zXZH0t)IeJQT@fDKk4iCrxgs?&b!}jH7YbkSL=H2%4SOo;@^s3QIt6_7wRA&AMl+MA zt~jrT`iS8^d524ZI;z|Ug#Ftvv${oVV(CHZ-JdHxeB-sbY4IEprP_K57mKm_Z8nt} z`MiQFtmBpv?%0)S?DsLL`JPuhYR|?$`6RjNbcS3`7u#jEM#~HNXkm2EGNOyk-i<(q z{n-uibLa>7H+sD~RgKXQ`=$fp7Xoo7ZrQ&hStf>{y%uG01M{FI*ot+`BO?xPrJPDQ zpBFKGFvP$*eHc7vGsE%|z=JgkQWX3ipE)P{cxx8ev>`PNqv{+kYw&^eR}H5+U}Yxm zTF#JX`xoMa++U4&Ue}j$kj_nuJP7HH6*iJK^xP&QJJ&Oz3+pKnm_H_P_FuZtrxE4pgQNb3qj!G-Bx_YM zv$d%wu&=_(Z0Qz>aYGM121ZneOH458f~SQxoel+A{Vkq<~ zd^S-nRVIee7_WP_3ZQ(NN_JbdCMEz6wajE{+m!C|7gW>rGVsE5t)%5LcsepU%_3OB zlVw$3MmIM+Cikq2o7Rl9{mMn?DS?esUKh$T!}po`wiwuVv`q)egm^{W*i~6Pap&cz zmDDI&aH^~Xce%EuOY0U-xRzMx4#&;9nkK}$%LC;aa>5&eBF}D{Ix~}FGEYZrW_SBK ziW|g1EU}Ku>wV2Y6cnq-fmXLa7hU?j?`rvLllcb?@2pQ`O0CqSZQM!tHQFHP3s#jlS}Q7AU-ld2S#|s(+N*Nl_>T^y<@%+(>TY5u8RrbLy)>>iUC32K83-R905$5=I!>KuyN4tt8qY<)u8$zc>x?_k>>bQ zHT7|?(dr=GZ=0>sk-@sefQ+r=wO#V`RxmE;(XT$^KdaDs*b#9WdO1xR3?NaZ-S)>} zQ?d6P^a(NeQEg-jVb|R1{QQ!o|9j9dKWna$PU94h2ST(3zhQnx-rq^Bfd)3jg4DV) zcoRX7co^)48l&jg8HVJ<}WVtVVxXOsx`qc zZbaYhh_`8D@c+y#T=G${6Q=@7F+odziP}IE)){TCDZSG!-CMUR14ElbR?>ESl?VWF z8z!r(GS}0ssdF-@m`}}pk3beo!%zRhn3uno#43i?erjwQJa^s50%BnxIddcSfl^%6 z-i_5*p8~3}88Lw@yYKhmoENAG-|uT|rQ5#m#(KEuYrhq$Cx@Zi>ZvMg5isx6{<8PM z3(r(D4}dupP;k68hc`j!8&ET3euy^A@>**If7*ClCoL*g6!@K+!5-TaSd)tW=2pkI zt3-8$EndmSy9dpYXU@^=5@$TTeDv=6C1!GLI^1 z#Sqt`KVh3h>AQ1+RST@lvM;q1)_CSKS--WC4MVesC)cL43cL0!5m;N62b@w(I)Yn| z;%PcrFL5Pq(l&X#w{*YdhJZMazm3a%@3s!F{NfrkMw=+x8|CN-l=jAXhL^TeeLdMi1{UIB?gRcNj|L3s^XpqS!aVX0Uxshl|pX7Rw(;g4ny6C2H+c z?2*n%9TFYf(FDdV$M7*ohYv)*Q9KM8GFIoIU$3v@RmW&*+96(sRC4vU%XbV2(Aq?^F= z{RdWuq?s6;UV(GiL6a_Gtu+45aFofcQ;ZqmlvXip6k(@Y>a)L_1ib#Sfw?58Ps$eW zwZeaTHfl*8-qU`+TEOWBztJp0oXGeC3aNtP42=0m4aZ>k&NGWr z6MLf&rFl-5HgmIS1176hAVOtJlrCjatL{HD&7kzC+v6STo;>V&bj^426vM1m(=d1#yn7E5GC3}%TnpRO6 zOhA_Lokda@(gjNwW@9Mo1RH-&UWux{le7ZZ*}>$KidM!lb%$!%LI%nk?rB1$oa}mX zrgKb4;pZj9@~5(PX(19Uk8odXQszG059JV_hHPD)G;l`4%xXrLg>~N%jH9P};qM3^ z7uCQ`Fj9>t%wb`=?33rQrt$()91Ckrf53qR+`g@S_y&cr5#YhWh`AO4r>10i$ltjI zH@SYfzQBH1C&j^T0Ovw#Y3g(;wTW_+j?#RWgrXkF=ruoVA#bp=ATQuuW=~Rqft=XX z=PJb#H7kfU;^TQ(SKGU(Mw!LSo$3eN85i2poFdc%X9UhV-v0!2i*u{(DSLi=KYj0= zf7_wH*!xz^0DX59!5es{NDQq>GP7M%yj_yqGGArTQuGA0nM0gyi{%!*Tb-~U|)`YV7 zZx8BfmWp~c=9h6zoF}TiD0Mm2AkNz@^+}r{C?QR4Ihpp7wVoxh)0aO1m4)P#^2O_= zWohqBL*{jPhA*+EngpXFe*zZwSh+2y{AG?+rw)LGahHd7N(*MJw2L5U9*VJ)h6uc>pEz}2V?bIXe{?fRh?+3)Pj-_lg6qqU1IZ~&vDiky086sdfa;yEl}qRJCeU$9=B z)f|hrkKx4XH?KU_dmV*T`f`1=Z3msRsa@LlpbJm;WkEAIUJj#RB^#5Yx55b@*Qytv zIk-3ADP+H^ey92a2jRE!^5`I`R(MG%+7jtvWu?=b!2;HF(&if}P(nwpzIfo)dh&c2 zs96!#59u82WRvX*^bDHqyYmwu%)Z`MtrCpbTYBT zlnJVVZ@vlkKLJ;S)S{G$Pes@7r0cjEudY3GCdd}mWoP$?U<68JlGaG^(6*12FEXv! znn3j6P;xh(18>AWFa=O4$QE9C^ZZ!ZeY(8WFsNU9NL0b($<4B8v|Dh0gb_j&jt7TV z>A{;$P<~pn9n}`YaY!7r4Bl1I|66Y9f~prdh$(~Q)EoXOm?ZEe82ZT|;fzq4@>`{r z)6lT4i>Y)`!?L_&G?uSiR5RmYlx^XQt%xffMeMtSRr+s2hp(f z1RQuXZC{NT4;zwRpSadFASO9E(kg*+k6jb=gtO;rk*A7Yxd8%Uba&FhCP_suGk71) zIB1})nLUf-*n^{;IUpgTV%ME3@V0GxQE6xiEZH@jkG5TDT|SGvuv|SQyWgxykSJtk zZP5}^nNLJwz*3eN>Leub5x}441-HF>{fIuIqZ-__9dy-ZeSqRC9N8O&V$Z*Um0g?z z!ybBwu6Ov-PhlAD?y@XVg-joKl&PRxf(J_U#+qqe++^fGs;#e$rZGny=nRwuul5Mq z8*Al*y3j0@oi^a<|*J=+}G=p$d`_qGBYFgP0mzd zrXv=KPNkxGj@hJ`TQu1i;VOYdIh$eM3 zAV+PwDFh9_N>yi_54iDncm`U$wN_XzV;KsrSz9*k^~J-UhkC@##*+i4xb5k-nB$w-am@&a}9-Icx|oPD@6+C@XrGDYenZaOO!RfY4t$!5%iQQejfgZsdz z_nF#ochcd(4YV<4u5D)X`*$n5lmQphUjmL2k#raT7Ga2Ev zbi=#z)9?$wG^3762OV{SsVFb;hL78S(;Z&;Z-`vwLP!;d*^6! z;*Qk(31EA;?(p#Z4?KZR{>cJYv9XomC10%S2K~2mjT$lR^Dq`@$_Ny6PeY+4f4189 zTJkfe;q9D^i$vevZHG?{lJyNtm0>u+7WLJRyLkA#!_X&+d(c;x%H1QD-n@1QpDuge z%G~D?+Qph*9RM8}k{MH!ZS_CNov{sS>JZTgh{|o@^g0ZxyXq6zaY_6VjZbvHu`Pn_EmBq{ZXlAd9^ofJmY_g|iB+k9K-Z#?!~cu?ts zcWW86_c0nOSc$=81ZK0ns)<$y}K4@bA@XVzMa zuYjCKpuJyaq^Gw#_~P;t1xAsf*Ma_3ihSg3a@v73&riT3-+yn!g*8#kRJ`R;D$f!1 z)t`U?-QtI5{~-*JL41iDDe^C$rA;vqe_sAhEXcH46FWk5#uyl4l{MrE+!5sbJ(s6p z2VqZJMN9H(T7Ca$K6L&B)3F)uyP!mQIj7F)4=lA6NP>Kd$6 zZ&<>ruIg^z8vC@Om97ahIsj|U>NIo0>-z-H3&GfN5cAIIa{`Epnc{nUVg^;qAXC3( zJ4;bnQOUbA^)~$Bo$3)k`VC1Dgo0y1*#p-gds#(=s}gh*K~eEl1+pz?By}JSL2Ar| zC1g#U`dLT%KwW#kuR?J}jN`qk=T(H)fgUb8@QX*P$sy-~yvFes8sA-nAlYlMGg5iT zF&lRxjLJA^yCJ&<`(3Ys+@Jc$GvylV2Q`t$=NzJMcgmd^!8*nP#+QC!y}b67*Vbb- zIXhee;WVNr3P)9aS=9qP?lr_`&7c23L(w#@*cQxJ^oZ#|X%dR2qV_s(FD`5?7w8y5 z>HUt42WlzZA~LGv21cDkk` zx(duKJUp3%=rb$r{#9aug3U9E7ubEdtu$m+_(bC=WnXoh>l#qA1`ph%b@kI^;-TEF zZeubBT;sFx#3dVJ%}mFn@@IK3o=%*FV~kK6HhnS9Cpp9ZV-TLmz|jj8bN?O=!wf3pkA>@g1#J%&zcL|ftjoMqx@sas$b37_m!`X z1)7>|PU4nCk1z{gB6dn8403qGJ2&ix0s#;n1B;-leD=+8tj^Za?Z^WH=mA!vmM_H( z4RvuVLp#1RZX+Nn^>XJ97;C}F?&L*(y|ghSU}i~xjn0RL{r(u$VdM;Ryq%rLOJrjCNf%BZe_kNP~{tuu|_Ceig#MkZ; z*E8+2$a%q;0R^*07^$>A7O%-c1-!QHiUg^9)yu;Q{Hhh$o`0PK%M|VU`(H9m-zm5X zP5W%LkQ6_+(3PRP^kck`;&bu`06-^!Crhb)$&uR1FlKG;X#V;iGqV_^UU>{%$(DoJE3qwvCX!F>zlwmPXM7 z*?VHnlc4YJl$jwP!$+KLKX?Qb0O5Rvc6`U+y4&JU0cGrDkG`T*k7m8Z`F-sS9&XmH zslr|iZ`qRFO}ntNkYlRV<2Bz`?O-`8eQ8oW z?&p~{49v6a{x((^(TBbmu(^KPu=Q``cgzBmP-#7H`iBi`eKhKs6u9xXc*O8L{y15} zXsaadg0|$`U0YES^gCl=0c>`Gn(PVVQCiu}?-tHRw;pX))?Dz430s(NKs1jyY-pp{w-31tYRBpFEVjRNh*)N&nw54YmBh1%^ zELD2)h6!9#o1Jkca-v_m&7#ixz?iLo-B+k-|FO-Cuir#y190w{6*pFt zna9d(!OZy$d`0CwMLyf5t!r)~rd0)rnQO(PPWBpS4;j>#QV4U8>l=96`hV98N`Sq2~~zM(NXVnX_E+$D5*;!(Npv&C1Bz)-txk)$bmlMVM&j}gEcTI8%iTNBajP35 zkPvEGK5(p1sD*x?Bg$T979Ve9)k|P+z}-7CHGUE)I9EjQsVVM1M8W&chNaeNOW|uN zqb4%%<~fW;docXFL1Rq$yM8iQEM}&f=R)_JHl_E$h)h+z(E+pK+FH}!_Y|MWmwIMm zY-1{uH7k#zpfqM4h2?B@)%@|Q>W5`?Zc8f%uW`p_UFU9A|L(%|2|anG)nL2W?dii< zlK^#ZZm+qk%;8oY75ruuIC;IIXR5=k=%+Bk<-S~2Y5Y_USSI?Eb42m{o&-zJ^PhlT zm|0uEQKj1M-uu(vuUigS7=OKsTc47F%FXtqErM=Zf9%1DRM~4u#f^2jNvgpDFwMMw zOd5Fice%aYg6_M|8TYf4G79SlL-8~X@Af|~rnvjbW@y{%qJ+q?mMn;lyuG<6t6EpF z5NWr!y79nkxFC{ek@sB7SrM={c1)UE zX?fo0#v}*YN6W#4J^jPw4-f={C>v5L*gd-wB2haoVS0=c8W}Xxyi%rJe6Re(m>8X6 zE4ILCxJE3)&o-^Z<>$K!JlhhoIE07E#N;Sx>ko|O<}J!e2wGJhNK6f>i5j&okpE04 zEcv3E#WyC+9jsM88m&k(RQDM5Y0ghLs#6~#AuS|}F+(FuFpo7s!Z+S%0Tpq}yQ)%q z^4oOetyu2K>NVxM6&OJaeQ->mZ-|BmG(c=r?Bii_smlv*Qvnqd{cy+CuEd-2Tp4kl zJ?5s5HFO7)I`~R#+Q-L3!yJcgABRQTq;S`*bGI5qoYFPf2ALg&G>IeM`ODCqRkCzqJvsDcdu_sgiE8%2!&NNu zo9#aosXa?PN);3I+q^s4aKYB{F>B;}sWrIY#VIsRs#-SizIQUG{q;v&@wS{9wu$6$ zsy_c-o1dBVewjNE){26nj8o7$%~0}K6*Yignfi|S=pYOcu%$L|GT$3DDz!%=Dl^>6SxEz{zGp}0<=xzlS~J>T7a$2h7!M{0zXf>&|`M$h^z>*NkOZuq1T zCPPF>NNU znI3up$_61l^omrR&#Jbqx>0urS6KmK<-i5(ILEk`7q4V;e0r533CZkm{oWL@q+vU6 zQ)6Asb-sBzYu7wP*H!yR_Zh)KK-@t<`Yr=gcEP=oA60`+w=OTS?-F~OH8*X!4|mA> zV)B}=Ek%5CbSrDvN-lT8_{UEdDHtuSe@Q=?-gb5!__5LCoWx|O;r=Bis!KobkU?HO zL)uH)4TsQD&SZv16?chZ(YYBPvr)ABL~~mX^|DrP{Ax!0j-uf(Bs8ru!vn}@@7fQ2 zTt{Pna$WN}qv#3=UxEIW`4H@sx^-vQUVS-nRlmcHv&6Hjc-;oeCrsWbh%n30Hno{7 zuN&^0@2SRuQnEFVJ@VflZ}9G3xQVi7x|_8#3pc%PzZ@W74Pdr<@*rY~_F%m;5S<%n z(I;N^vdJ~TvY|wk+IexpBK}5Yy41#(6CQrNcC;3HK+FMEf(VzTRfxRUS8jbXSkTbSAkYS7kdaCHY+}f1o zTnWw2%k3Fo8VOUSf{KeqaA0>Qq4b4=(taX(L_OJq>FQX~qh{ImoBX&LIVJ+w#^(Cg zv~l7hhahnSqR}2O)L-;ZhGUSU(g-C$Hn29*nQg>!qtVx3OR{>F(#V2UNPWK~64ruX z*{i|zm+WQ)#Ltwpi`#pjK?MdY_GznXxy$@B2&rQ&Tb2XJ1X zU9yRe^H%3uN-=C$<}Nv(Egkv>xJ#-q#URge3P_=6>Ne5~Ym`y9sRG6G$Md{{#Kr9y3D(=J- z6?>-pi+UC@{GFid{j2V2%B=!+e?s}0fG~fjnA(+F-|)+XW#R77Mg_nX7|v9V}gS>45$Xw@CP zgcRp~2sd`{IA1U3O(hCd569m-bSue8%!6 z%w^(A=vYj1lHJY%=Cs||8X^ESrn&%i+S_>r!gxG>T1BjWKEr=p=HR4KI4>*S2yzdYcy+Rc?K%j@IeK+33&nz%QI^B6w)wzX+NYcK= z&vj|68Z5GHq-7jCtQjxDgB2|(p}pok$^q!wvKWinVr_!xfc4lQIFoTh9-r&{!}nC7 z%_F@;t@@q)OV4W{d@*Ey%r9_Jc)k6OF*s<8+$mGdC0Z3AbV*wSjOuqo@ji&WAvk+s zP}HbA+HYNe*+>uo4JcG zky{0{zVwMD=qyCu%^qOAah4zf7FSPcP79-cMRQTVm^O+6_gB zK8?jAeCxI z@h?V65hhLdZRCxW{7cglXD}ok8$*@-yJg_suO3V{n^`#2=q4jziD*smr}1Xps?}Ku zMT_kE4vgtw+{Y+gSd+jP?M9GmC&=HnBf$oQ-VcTwGp|~A2A6gMm0fb8fI8(L+4mD9 z1moxj`Twn5lq~$V+Owg?5zZM5BmeNbvP(X>8MMe z?`w+(RDj?^6QOa@v5XDe*TzM~nsbxBo~f)I^N=>780R|A#XD7r!SyfB+T=Ivd43c< zIYj!3?)jx#7f(L6V0BUCbv08LIz);ko-Y#i-8a-NE9%P|E8kAW_Hw1OIM!cJDiCQ0 zx5+ns#E%ByJ_Mk%0^sl355yehzYh5t&(E_=!9iKuLL%d@;u3Dofup&7PoP09SC}`_gKoxie_=SJrLE$7YfgNA6VWIfr58MafG+fcQ(-6qA7iV7(!{kmpge z!`<7dzZyIOGC(uW%mu9u)ziJHu(QGcT?F4WBnWbz`9 z(0}0!X0^8LbXl@Q!j9wClaGh{U6b~Zt`;U1HEMnXU6kXoad8^w`uHC`AEUy7qVf#j zMM~j|Lz9ey;=fOFyh~H7DtPT9&Dx3)!ULtbdS(R{Nn{Il0eoU8CmTa>jpDQ2Bux6| zvOM^P0htlKOj}4_q}EtS_fTid)Xnqb7I;k+&bwXNq`#LY6VFX^O>me-qoL|z=0lS4 z47%9QFGN*8iXy3-l}rnzX5G8O6&oi?9+#?nRG@g5PA=JuMQ1`6Qtf9SGZCvYu-8`C z`q4ohPI;CdXBMDXvo1sN?80N&F{gxtHRPpHP~o%zop(=(apq-}H?DKV^kS17l9wI4lVxmsBTs)@iG`i^uz?)CUGyDIPThs=VLveL|G z{p6bbdaT}Hf^|wP&zId7O$E=PS36VW9rNZRv}WwiK?@DI2RZ))ACR0YUYv}{)H8%; zuvg)^)4&a2K4AdEKLzyBj21Oox)4+Go?CjU5v6r|)x{PwiaN^$2TOUb7SY%xfg>T; z)pPD#5#(HoK@Hyg4LIZKp_6-a4dpM`;n#wnEq12f};wB^s^X7vWZZ2~5S? zNlT<;y%QJpPg;3i6&oB-JIeu6Doy}39)G4d*#|>feDD1=>|F>HwN_FdNQ_1v>50u~ zq-v>uHtDKXbPG6;cf4wUXxt9l02@e!Pb;2TJuP$VX3ga34=!_)u@(eh8$_043M5l0 zsUm@Vmv;Z@<*nr|bDjv5XI>s@Eild-BGdfN$t>I2T(hO>iDGe)Bb19oW#pptFE%#A zAlF&QvK~PQz2;5D?iebUuCoMYmW6V^(eAQf@4IjC240CI{GD+;uAb1cwrs!8I>P){ zuHIOTaI;tmNLp9&BTv;ONh>_0?r1My)y4cRv`}kdWxL>HtU+*mQzwo?mb1DmsQ+@u zGIS!<8;GmKxeG2l^H0(@gVb(5?55?#3$evc^9DQSF)U-B-nGis7h?o>ACG1QJ0Q zZ4S-%3g>(jJvrR?;M?m`&#-j(Bx+4pf>Ety$toqqe)+;bBUy?nmfE6+;ZWrzFm-$FH=wj_ALX&Mwlbk!nqp&Qr|=z6ntovx==U2S?maaaXgBhM z;u)VMBU9AA@8tB++d3y|hK-fDE~ZD94|=~b6IJF<%C3`_$Et*-C~YjO7O%btd>TDa z>=CTjUG8hE*BSa_+JY%dC6MRGm=QIJe^#K@xbQ_e?0}=508dwBOfK+*?2GR?KUeY? zxer6Bd~%0o6ARP`R;#4M=|W16Bk5lEN>^C*S;h=g?a+i+cNHkRZbIG}?P1}TR_xAE z(csyeDwT|UZ<4E(FqljfpcpW;)K|7uP(BFniY<$nmx~y>d_Z$_Y7b{iJIww$HK{(< zyHxv9@JLqF{a|>r=YXz;+)qp2JW*BZRJNM-Np>SKqT+mF9B&380uH!Ij!`pKCOEcK zmQLHhdwbOdJGOIe8Rr)Jd9;>;FgZax^@jCnQ!|v6-vHP_K%bK56@+o$NM7poRDWaR z$G10*2CIxDesU8}ny4JtZazUH+m>^X?JGxe!4PRE z!Hiea;LD}46+!ic4a8pRGx>gOG4*=oar?+zTdCGq*;SP=NaOLn+jLU`Q5trr#AEoWVD+u@OC& z#__gzk1mW}0;z$br+?<&U&Z?Q2h?)(eVeCnmW;2V;d8pvdt!JrS=(Dvm`Pui6 z!tl}>XI864O>xv@b%=oo*FAXPLwJ|}J|n?lD7iwyFRxCq5~A>TW{YO$V7CvDQ$2MJ zAJTYn6Tr;{uXXIqVD2{RIqD;JV<4rK6&2KUunt6viAE()X3fhR%uw|e*@WATqm6Z! zg*&lm8yx1tC6x~Z78QhC+x6WdT*2@Q3|q6Zc+fXlS$1u4x+Q9aY;t9YdHTbcM^9d$uxL z*g%=kdd8=pj7gFy?&Gui^#0bx zC(83-+dCS4DMjOMqv{2*De3}`?@Ue)8=!45e{egAc*?ZjocAsIz{BXI*rGG1N+4*dL0*+1@}#=1?3@y$PT5om z(?jgM>TAryoH2V!;`R<=>VE?)JsWYKVPrj9)v!K7s7&gvQB?z$OqDq}v#&YN|7Y)Q zm^_`FlVsWe{RRw^YTUxS%l^7J2fzFYiJm&NeR^)>Pd{y-KR>;1g5b8E!EijUe4k$> zPmmQm{*U+g&x%v)nz;x~519=A({**}O_0&MF#PmU?%CH>Zt(z3lNTALwHPP&>DP|6 zqY+#hqj^)~B0FUAn-+tsBlDMb#^)_uWok=+@^bwacMB| zh3S5MY3-WI$mii_Me5zHXU1;X=&oVtT(+?pMtMd$0B7n z-agT2uTwR#SuPK;X|`1O3;%ds9c8^bKm2mW5Bufioaa*Uq@k@fFE!qrG>l;TZ^)cX z;8O{-J=A>Epl_#vsg`|e%4~HBi_f(&rkjN4CHzpUI#frVH&croujmLzBOPG)3S8v; zRIl8&kP-RuB+Be9N+j1jqfcTGwi(2e`HBHo#4Y9#hE$t6=2<xcdVIN+F0|=4p$n^(zb<8~8fUs(#|tLfo>l~K-UlO~2(&Sa zJ#lSj{+ft@xaSPmY$kITp7;x?IS}Y-l?bclXxag}f5kiaWWn9Y*V7}5RH~~AV)+w1 zU`5gTCTnXdu^O+{d2z$BIuVYtld$z}#+3NP=}{N)k`$?XX|E{rF=Y{h-&({)_5${I zQ>$N-EqW`)JsKn`IzxnR*OnK|+XfX@I8#f9&`LZaZzuFHH0zlWE1wKtQ+B4(+z>8g=l4)eO_NR9~6|GLt9uGQt;N7H?Qy0V_Nz*}LXL#jgaDjI(3VSO5 z$FpNS)VXZsvRh6GSI~+-YT5Vpahu6G=RbPQjp^O_AZ@hW3M5Nj&5HPnUOYboE(}+E zNG)OA_zhTR+qL>B+;Amy?C*qTk6G&K>Up=yCFTp(;Hxd(6AH6e+r@DU^3CLyD|9_CKO#sxvLBPz;Cj zW^gF4$^&WlTm2lbV|)Awv2O6a>TH#IJmw9 zkjiX&l^qTt-TM-RV{)&5dZ@nK1aar*R9^H)n{YFAuF9CQqzq^j=_cS?_>q~Y9ykC) z542iZ;S!^O%qa@CmOR#Ik>Rhy>l>m=D-)($h-%45alvbNrhp9BV2L6l%$};K6h7dP|1S_EFBwAvU`?#WP?a6)#W)r03r*J8`T58%9Hc@h4!N%ZbYZ} z)ky1>>T1DdO?e~jAZ7NL^$gZ;#qT{_L?Pn{#EF-G8Z(Q?B?=~rQpIOAW!N)4GP_Sur zKCEN+(Z^T+c0pe4^;b8a?LG1lc#3eYa(-FkVueWkN_V z<#u5Qa%r>e9^GW+$8s~(&I^SucGv50aM2HIiQ(x~Th9HY(|}9@a60H#7|RaGDqmrz zMOwuY!xPdVd`eDRqlt(#8AzHQ=4aP@aTZ!C$&wa7`4&TncVrPVKb8}J`jw>FpIoqK{I(OJ9A6&|T;`(8m(Kdd-JHg3tzT7-Dcc6C!V@cAS;MQZQUYp$6hT zE|16N3xNxb<_aEz&Xtn6GA}PoR=V#P#u=_S9Y(yJVU_V|neUD!Rf;%OuNm%r9hkgj zdmH|aIhHw=8I9%khd*|hdU&()m}X=Vg!+llfs#wtwk9XZ zs|rHsjmK*BrPdA+KE3Rj(i2S{c;Y0s76BJ5pNa}`(vSq5sHW5zsJe5m6SXa2s57#M%!_U)2}Vo|cfeiF_cCxTG!lhQLrG@55fhw0g% z2Pu8+(yM!3xG4uyfe4C@&AkFM1Bqhc4b6Am$#eh^%M)X#BMR(I(Btt|kRK!Lf{&g?Ztc>h`c6Hg@qR(9l; zK_+g}`knQRHfwuA45gL<9Pr5EbI!LanhGLe_6tS*Uf4L7p89al4bTR21y=s(R$gFE zCvLgif~Rkg4Rn8fI7e$sRMRD?^lh6(-%PD6qK$PW;2x}qm!k_$^w}kQstiH7;j(NTm(J8Yz7-n$(%AxZSOazfjC8`BQ+Ps zk=_PHysjlG9tZx6Wo+?Dfl*1J4p(k8};;OlWD`A1)N&XL_{>^G~0>wXwcODczfr`_un6VKbT zLxJ=12aLU+vc;0WJ;nIV(4;uY{vLib+bX|_p~L0XVhzyt@fQxz%ea228+0>j*GmO{ z8lHG42X7%B8Dz5U^lNsF$m;*B|C-VXr;%r34#2K`-K+%m6_d_gY~uO+gr^IxJ7pHi z)>~bg$F)~~omGyS$&}#}W@=QoQ0;fKtL%FK8x6I+n=LAPeNRH73@)4_ZEm-5+zJmYB@Infd7z~{ZD!` z-^l-4Z^rxoz%5~Gl^YpJVTP7rtq=Dl0(ex`=$cf+uDemBy5QToVdt&49a8NX(7Y|U z!Kir3)TY>O@nus0cAY+i}^vvS>4b4o;#ttAM!U%v4`8m|-RHq7c1S8gs>%a9@z zscUT2cRQ(So){4LNoRO(%p-y+ZWb!t2DI0+Y^UvW(a$o3t3>1Uby5=uyu*+9XQuw` zxzIlje%|*~7V2ZqVx5eWAwFI>P@di895)!+ONO_A@4cnHX<^0N1bXEJi2}Eq%V8>G zk~K;E<%S(PSpL6%jkbw0qim<=Q`*gTP4ox^3A5y#x$V%^PGZVLw)N_F>YKjMY^YvE z?}a} zz|-m$M3+dV!fSA+5oMp1yZh$b1}97jL$R%c(3(S#sPtiVn&~(DfNf&=TV>kf>WHnJ zPy0(x4m~QC3RY~YpxRi?-Bwizn?oMn8gbuwE6QkYmC$^1czv&p*IQ}(fZJpdug)ZG zrz;U>JZ|0#ETz@KI#|on>zh})BWN%4E1~N#UncBYPvSEn15`-Y-7#WOQqZyjhq%S9 zEY2`g@W8V5BwWt5^0CKPiaQy;zq^(3b$t5e8CwJyub2nx(^oM@R3qpcJ!H^$8;|%b zyM{<=3AB)jvy|Wz=4fu}DQp%Uv)m^MN_XyZcfo?ZDd#smQe^X)PB1NnpK(xY|M676 zWdh@yM3TNhlVV4P*r{MhA-bLsBd zSXQ${XFM?V`jy~%}n zy!wyiL3OF}S*qk%^M0a1(OaIrUc<;^-_B7DQ3HD z^c44MpzFx-T6e%U75kQAR31~mKgaBUxH~);`a1Z}`ucVpEl1X}D=Rr6Q_9jTA`4}n z>0~1`&YnLQdbCn|lcw&6>@yXv8G_80p;!Et1X)y7t!zkEDrrtf7Mf608sLJ1q|1N6 zK8j_ZbB^k#8}krh1UbVz$*Ef9^Ay5a#J(RBUCUdixEs5%hf%zA?qqUqE8HaqK6~sv zpt%8pj)nGr^Y}Vv4dt8tZ~_u|)Xc(oU@As;@akl~NL-{)gE-Q*7i1HB<($BE3+U=yyGiXsjhmX6<6Um@FQ1jXZyWPSy-@DSGt| z#T92qzhBb)Par3#3n{;XLd{Bsjc^sOxZXL|6cSsbPNbRs4C>04?#}3~>el#IW3@zy z{ZEaRw8cY2<3yMiHFV6`>_4OVfAPN>G&%KeTN?q$sj0AZ3$_nMp(qsB#OCQ;{qvqAud=*YZD)~h_o&0i;OX~L|C<@3HYVRUS3@-9=il`K z3or&!#;`|A)b$!SRO99cXUUl|I%?mu5;i2@I-4SeWv^b<_0|07L>#)olYCXn%ofIf zM)3u{K{kEKnf|NCuFaX74#*7u2IM=h$4-iFp4B<9QIH3~LN4~w+*OPo%kh{$3?W>} zI*81lExxr=5FzQ}Yh;2|N4(*8FGn*p77~_B`wSgAi#aTWsWeOKyI?xH>FRFi1IVyH7b$`edT)Q=yxcgOa}s zs9t0r2i!dwq8ZjR*EuAuAshoQ;mVIkNFy)OE#T10ZPQUkwrlAj%3wE?SX*{qyHS!U zntuqApL01XJCI%~4LpCaa~E0kRVl6~Glg;UC;dy&za@I^pP1e4hbd*tn znbcU)wsXJeU_&P4t+n2~UY6o)?Jb#YQc$Ab*0_kte3z9vMXmcS-K;KZWaeU$a5OX2 zk2dbiaUoqD^S_}fY7Z4}DN3ws1M-Ev14+hs;8v?SLj6IQ-+fB!p`00KVJ0> z6&jUeZD-2j9bV@TkrO@m7#D9$e=1vWsPDDHGvZM1?S}nDNjZPk@v%_YF--zZd?7Uq zYYH2DP8nGkXDDo-&6k^fs4Ul5MUUF6PJ@J)7O3-NbxCi%V7b=M+DbC5CnYX{7rJb+ z+-eN-q-$Qg-GS|bR8_{e6g~rNVnYA`wbW&igTuZlOhIU?$0Ck&fa%d(WidQ-yPW%9 zu%L^{bc{FkX-qVzahRy$_Oc8PxHL?Dq|?MAd;(B07+gi=x4%Y}CQbc_OV;L2bWP>< zlm<-(7=3A|@E;Re>d&_Yoj~lSVVx|uRa+tNFC>^?W*pp_$k$Gz8MpWh1wd$UuQ$CAJi#QOLyF< z)dBZzxcu2%c8kmIa{J~nTZM(R7XegG9}!*-3et_}B`TJv!LOkDriH6KU^_?`9zAgm z?HAg+JWgZ#e1Z?OxJ$`@j@F8y9+Vu$?I-;P$P|!>zw)Yr7vLb|kHho6GJ$r}o^p}F zhKd*=V3C_wk`wn*IoWOCd@#~K(%Nbj&ka3_fiiyI_?8v;tV?-5eI&=O--_IeTM8kw9YxLk|G@|Qkhadm@x~|LFUcSoOhLG_f!Uk%%k5Iq*bWb zUE>v#a1di|q7_*avlr%m1C+g7NdNv7%pm{`TUa~IX9U_N%d)569U{|5oVR)j%Dk5| z9M9$LPQS3#vGNn4*&kS!?rr1bs;Aq~L_9l!FdYWlS$Y0RtIZL} z6l$615S=gEkIfDeE}Xg|G?#*MDLi5C+&|Hz*jjcm+q2hc-p(&rYFH^ho3sk?rJK$I z^(~_0ZYv|dC=VVP4BdYbBYPQ>zXqQoB~RL@rpE-{XY0iAU3b<kMx zO4$_|(}xa4&$IKtzc#y{vSqp~#833JnVZ*FXfA}c$Cf4y8-oQBI^7mK4|vKpB$?$6 z>vj%apfqJ|ZQiQ!xxLg`kLVHsDZMSCiFJhny+db;PbAyQT(%>@>fz4EepwYSE58+M z?y`pqAmmQf$+wFiH;l8E*VwLY2WRK&+aK#k(61F^VRov44c9owbB>W~krKu@u*g6|&q0YkNbdgd zGxBypFC4qj4$7nj=d}+9bQ)ud)T6XIuKA3x+r0K$5-7g8Kc1{JGq<}5{uWi+A>ono zEClCulw4@?)NA!BQO`CZ7+pqKTkB2Bz#za&3tbk$3Kajj*>K$&r8u!G=vv4YR`2Ul2c4cX0eX=JXB*+C@{!K2(n(3uH1XxS|!kQC#52l zofKwSMY=tLS?G%3j;i4e z<3h6{3gakR+4?K%Sr%qA_q!4Mt3&_dyKWBwp*ar$01Z$3hB)5Wlam{+)B0b}eSbAn zpx8$JV$m}YqsnGngKR2PzSGNY?7{$!V2c&Z^ph}&_&V3-N(5w@zZ;~cTSX|v4MY2z!K zlXWUQ8YLg}3^?b#boF^blrRt}*H77rl$%9^?3*N6_F3TmMMW6l)kQ4RUGuo~ZB=TY zHw&b_f?GMbHfWLj7(r&S18Hjq!kZ@S~3rC&;jZ!1c#^@@;{ zcShSU!D8E`tNWGKU~`9rcoXUN?*WhDCF&WJxgXXh)ph-)CTk~4CQ9iIax#hi(+ZAYgo4)ySPCCMl~QyWbbCv2}~dE!^q!E)>Fr+XGv zHua}ymFk5`&xs!~P#yP@f)99~Z10KfUe6E}nGnO+M4t-o1eyH1Nm8GPE^jD9r7*pe@(f3taax=Ls3IC2bot#?xB~2onl}s{CN3tdE(89k%b-JO@d^i}H{vAK^-JV$t+qNXc>VkV^NGVm_YhtyJIgqyQeBz`e zn4Y+i6e`#Iya)9s^5Ju0pjV;T)s9~aGZ@GBCfN1hJW_`RHX_P3>`$EEP99TRcCJLBuhKDb#+Po`8?97Z&?DpsYpqrP2X zJ)iJWk=qVQQy70f$+)f1wldUFSfbo1B|kC;T?9>LvLjFJCT6r%EnBbICV(0iKTz00E5l^qzG8o z6tW%HaC!1gd&D0uTGoY`IlP0);^mUpOVhv3ERbh{4){~u#K#~I`~7lvcMlwN9NH|0 zGs0ZDYVsN)+%EQ7*Gre}l_1!`ie61Ge5vPC;iM_b(m*E)YwKP8j4j^BEA_6!wOFkH ze@;D5HxI<)2)u95)|x_@eXtDlJ|*JjM>iX-g@rCAoIiwfy{}%kx|a}~m=c|!6ME%R z1Gm;#Ii7y*KOTN;`Agv?Y7#sqvb|Voi^=GnA3T1vy`y2>>>FxF4^dWyb4B0K3#Y9P zrG~sHKeBKO6&k+cs|OYYcZtHcjuBHaa2RLVlCClP;8_!PX0AH zxvgGwXX0(E6Ssh2aH-^LSObqlKo&!8Kj_ACX=d1+{@TAQDoa|$th$=}nzLHP3^JXR zy8MMiJz6ZP5_B7Gu6TS<5{i75)m00p+GO#|TVL+0xPQ+;_gK5bd~Tas^ANBhsIRqb z_VeIg|IzEB0Rs;D(Ppdhui-86svv$Jwc|B(6iUtuzRw9%L?Jh<(3Y6 zzX3kV{SxFBClS5qR#EF`bdY*C`WePZot18bKI99#&=wT=v!Q!PA{-?455-YbgLrQu zKyDk^ulgI%G+EJj?%JtYG)d1mYdPf}r{8105R-UJqr0jKk$>H~?NV5&F~~LQ&bQe; zqedsOuLRJ!-y<~td2Qftz$(Y;mk#Y4cJ`x_=bpV)``lsCHjr9Txo_vCrZ8h4<@-mI^lWHNVJ-FHB;_~+JOpQWJ>6|){( zndX__CVavbg&k4`Y@9dz+;mF4cV=qSQZLLyVpTT%R>X&t*9orFK|jw27`C2%WnaWY z?($#BVy4{|mVyqI@tj6z|5djgYbB)-qt~d$2=eWBhwPe<)<1qqp80oTE9ol`_u3XD zJVfE~&PguDVQU9GnXfq^s?PK2y}gRYN4zI2QOnmsRJfWM00lyPJv$>aVH^u3Qx zEt}oez|=3qNP)nHRN|`(KLcL@F30(0E(Mjx43$Su?37t+jI$Cu=t+dVWwjVB0?}qt zK(eAsI*I4~rpLJM}_{fa0_DW~g8l-0pp;w~~I2&qmYND*E=^-wc zg*;Zx%knGc)0h7Sei#iMY$^B|bx_*tM}SwlSS{{%?w~2>KR4AViUL}L3!=*cZR7ox z!_!miFUA%=F8hg^6zj2k?KQ}Hf@{}Z$xA26^@})NGsy^_8UC^hD-uD69ZR|_EuvDb z#wN_Ejod{CN){J9Kd7rQ$4;i& zCl~xZV;)hHc|$-=>3jymwt4JFZPvHHuXrYadZG~QF`w<@BT&UHiY z7&AXe70hk73tQt9R=^l2K#0btdUOQoLvdsA9D;!4aVv2G^d0wn0Bj1 zto>rdfC_-ddjW60c;6uQC$dv7u^w)Lb>^jH~TVk4q-P@EHVH|Vpu{CINR1kXlY?cPDQ0IpBu zYnN_N>YCT-W9FLJd@d*NKyS@zj8491 zU{;?@$g`I4ST>4ARt>$5Ld+<$#;EO)){j4aJW&lgA#*kg(etC{4GfoxD`Vz`Rn@a+ zl>Dy|_fL&^%3j;5m=5X(X=lin_M6NCr;}YBYE3(wqKDs@y!1#+7QJ~w>0h5~R1EBy z;HJ74{CdyjetG20ysl3UcUI26p{1)imy3YP`(gN&`st$4*FCvWMDmW&_&Tec1`;chC5vrC@NPwl;5zq24^6fL||% zw@XjN?>zmOAN>xa#|&#uRuXQ%29mbv1YS-0=$ET&gyr-eO#xNH5DY4JDkFa6)!ub6 zP`Tqhn;WbJRA0pX^jc}FH?XyAJ$u)_WUU7=PFz_DrLTbvF=giJ*jt5uGZ!)(<$+>R zFXCzwN-$B=-e_~XS=JgY*nVdq_(W}B^ws}X@&12&a9yM2GmVYKOzc@R%p~NQqfpygIMb}!!yV|W6jCBL=3f4a4|8HM=9o!n8YVZBQ^`b!arc<+w%`YCL zUmm6A2bX?r&9~g@x3lBq{Z5@H%|2ls*e$RHHauZneAj6VP8k_+HEO`;GsOuw2H~gm zEB9*}dsD9*$)xgm*66qsXqql$g;D=fe5`%?jnIsAbtqC#q-`agBu}-( zG2QWdK1P!GGWYIzRdQd|!iB5Ps$z0#2s))%X0w#MI!;^Rp2RrJ2(=Cf0~IRBLci5x z-a)k%q7Pn_9Tj1}9_>9x#pJ}FFoX?T#2E1r29W+%p!x<{L?CK(lZKI za+seiQTXJPLF@u&7Ijt6GIQJx2wBR^9XxLLEEeIvyc{f|+9!t>M{7dE1vR5}u9PH) zoGliJ1&2u#ez$sauhmyU5%ozLdFH=<-!_nCabjMm`1YT*jO)5wsGp6_{a3nEYqeSl z2c9LVt8j_=cGePP7kFoW@6pS2Vww2+cQhfD>1y!J@W%EPthW)6*;OZ2w^3lbA{D7F z`F)cf0DrZtNs3ND5MtS(gHh`-=Fzia>FTbl=7DC)6@HE6pvON$WGn)WTj6jcN{(7K zc{nGiXL9J|YA0Lz+I=kJoZCEMlJ)I9KL{J-_+6*lg*F_|P_#KWR>OOEcKFqw-|pGw zUwYrX&RK()AjQYn!BS}Wp&B$pl&lHXSkx$C<7xAr{STTluZ*fnNmH>KOfRotNbr2Y zu(tF3=Z$w)+g6_Zw<+@f_4x&zQPWlB4w*t8(io&4TC=K+{iS`*mh5sc%PmRyPPld6yx=&(e2OVq@7|qDUEVWxuYblWrG9xOz-%4G$87!N zqLDQ?+~Iw|D>LA>_k$`g!IW43^*gT;TR)&)vCh?YF}l9HRIR<@iUp%S)TL&y`Zp1* zy+V+M7z_X4bT&lHms94d&M+nF0#V~~K<6O{+07nd+Cf(srtW4bYc^wnqkS6xS9{+X z&{Wo~9V}x(P!NJrl_E`g3n+-vga}9=fT1Z2y_XQ_Sg0XXDN2(j1_-FMKnNfN5DBSje)s;of3nU#d++r;Ywcv8lie1T_?uOZ6@GfZyPeaBUd^tT z9T!-yv?OMHvNbee145p9L`asH6)|gDJgRAyc!Fusikqxsd8(IwID3&iKjkSKTPR7D zw0aP3QSFf73tga@0oE8b8btJUr#Nzul^)aXgKH*>)fOcFOAz^B$O)?!6OUz zS8XReGdSIB249s}h96EBQjw}$pC)x+Z*1tsnw*9Uc>*D-y?yG;fCCN#^c+oe4CXD6 z>3u^Vpjdrln-?Cyrto(Lx7hAzOXWL3Hm-k}XwSX3IFj5_tPjsZoOheOhp5-G)#+S% z5cUm=LbN=ym2(^CA({@@hT7tncA$`Z8wwXlvkpVRN!c0Rd@kOtF|c@!2nd9z_Y(mm z=AKK!My$4a#8Ne1uu%VOm1bgum=t0YtL(t36+^nSV8CJZAAuMt{y@l7?9ph>@6AP_ zF3&iFC@{tlrF#ls!Y{#}UZsR^M1-35K-39k#QZcCh~UnhQ(^WAuCi0Idb#06_NE6d zoO>RPTmB|3kMiG1X!ZB2*0f%1?3&tfk)!9kmn<>nV%-VKyJqsd6U}?pJIG{!+NXI> zvYFvgs<0ssEWId0^$yAze$WCD+#LN0RB)R7z^MU9*)^m*F@k5;v&!Lm#uef#-Q%9?-(b83Hg)Y^?Hce`mBg)G0hC0&q zx0$x16bS`-jD&~Tg{CvpcJ(5+1~CGpaphqz0(+^T#~oIZrA7$hTAWhTo$?`@-rRcU zUFSDpy@WLT!LzF_d)X^CmMz1O=rG+7uJlfPF7!kBz+g?!D{BQ)iFuitI3{~a#4UD$ z$*sAcPlluKVQGiEW^O^f3hq%cWTIWhFg*q>6cY|3t}68EoB ze~)qf*IJ=>2j8|FXOT!X;F1~K^PsD#s!gl~B3 z&5KgjY%Id(Y)ZV`?O0#et1Q9&3W8y>-iWSTAq*<*br<_`tr-q(ItWiIJ487*i=`FL zZ+N|xJD*qQhkVQ+*cvshXm#-obyhg=l7C3!XL6xVfNx-U zP`wjavu|j5jypqLuJ-Y+oLh2PAg4c5DuH<;`!oO=$+F-KALkz1NmpDX~K4I z;_{7gA&X9PGY*8E=heKgb$R;jmTPt(i)$ zD}KuNYPKV8-4a}^E-|3?up7L-)`L+J@3GqH%-oAwcQR}U8Po0vP?4dU;}i2NK!1+2 z)T}6!L2R8|Z+t4~P~+?~;Ny~Jv^<+5%j8|5Nx;4|SIuud(^o6zD;2<{t~d8xs5-YH zDAnpGy))Xi?m;hyxF~nw0+yo!Qr|Y5cf)IKL!WGY94V^Efcrk^1Wi7diPd~~-XGXb z?kO5>!~aM;UXp?xlUZ!pTKV;jmW|xGJq%b%fer=<9KH>X3UhOO6vp1qxHH7)V*mMAS4QkLPZ8&T8nu2+3v5-LYC! zkizw~E7!b$9Zv76R9?2=%w1GtCCOu_#OK4ffzek-8iH$S%|dZNK-}iXtc%`zNdpUh z3{C@w{cD1~&ILwfm^LqoAy0!p_eeyANid+vZrB=pNZ~()ieHfYO@Ql1SYV46N*_t zNpya;yDlRMUVxK?qE6TEK8Z=S@)JqCW{2r3M~g|n%`GBj=z4189B zb05irc00Gk`zww61NGD5J{_FC(x5t|XFEIu?+lxqSyZuyl0H7s|JjarTENxIB+9!T z#};@_AyyV?zLl~_8F(HU{Lz(I+j zyKkv)XOIec+?SC17NAtwHO)4QiYi&R<6)j)pD&yt)=>~fE11@<9;XfK19%% zKPocMnd!FLO9#8$dYrUVw_L;6{)JmIi1?c#l>2;DCT7ljE=%pp-fxybUw2pe+$xx? zbc<0|<8 zjhVe-U;dWdlV7^NFCiYMEc%2Kj3<2^BVM;p06S)4ZPsE{TjqFGX9q83x?IvOIm5Dji?kTlx^r=ZNUPwuAyF4|-wr z6^&qE>_W@a2sH73!1n|&Y8Hc@P*ttF)JS5@Z=+7m=7~w1^$H!Z)>!2A-O~QNtx2fT zv5I@roX`WWTNJ)o8>IV*SQ59O1~W@!{Ga>QuM~V z>&m>k>7%ZG0T-`SvdpQF{Og?bho=$Y*sVKQ)ed#q?2u_!>&5PA!;T%f+xvShe0>e~ zA9MmUOZwfTb;9SP_mCLXmFxmLtm;AYWZz-oQ&Dh-Xn4nm1aiL~eYP`QOzu77DI9n& zo4R|tujTYWe%;!;MiDL`wjmPlV+|QJrPD3qTkTyo-w~RVDM7SceZfuc5*aE+8$RhR zS<>&$knP?1WE8DgDImUo7J3slej)yCeq!j9m)>2i8n@^@l^oCH34`ZTUS@4uPW=Rq zt`PZBKC2#LoLgg!h=j_y0sHjYeB&s6Oa)UK_c%mQcxk@dgNY-M3~?7TQ=zL7dT-o6 zq~aUvNl*6;vW*qIfJcn9RYdTG6@L4r&qm)}z%sORa-cg<5@bzp+^aRJ@bie0o*6b{1UeTG`?%ZOyJTMK8n=a(*QYD<~9-L!5t&Phrswv`w@ zD}>~p>>o|TCO!f}9f>LOk0sv8)&s_GxX+D95>c?*nN?nfoxN`$LL&TL^m`3Sr2*0-if@ucS#YrOGe#m;T&bv}xXjymkUTmYyj$o%s zVQZV1Zu`fagiRY#wyUvvj@uruRs``SvV(uGa7+ga%bV2Ao0M)T{qghiS$I8XDoZa0 z_SvX3ZGDJ)F?PAb>4iZlgVz45L$c7Q+-)RO{i;?05{1!Ock975TS6^NJVH!84V-W@ z4Z~BRefY-x-KaK6=*PV7;vw@#kGqU2+0>xD2^f7TwU=J|Qd!wQBX<}sw+STK_1?5= z5P~)LJ9N5;sP^LDXy8ceH<)p?cPW@$5uCWu4{Mci^Z7!3Y6oDGb$LF-BfCPu*{ zxXRACtTfA7ryO^hNmnk*{zH3bNYw6G6aXsZWK$?X6Fht#j{plBnH`E1Q)9@Y_2c9 zCG_G`oA5p=Pl^Vp&p1UF^cpm7X)qSVUfI;ayMu>W<*&K~KK`6v9SMp=smKv!y19H{^=R%|zeeTUH+o+$P)p($M~-tFTYhJA*ZSrb4{7wKKV0aq z2>hWH`9oQF<OpCcRp-5dZXRW^2R@ff`KhmF}rsC`+Jl!jwbEoQvR^ra>l zIl8>z>&0>`KrO#f|II`HLj5-n{i`egUpD^jg2#MJjzqPX#ScC{KF55H#UCwJ+r2Z7 z-17S&PD(mnuL$Gr1!f;F>P;WDM8WSZA$ROq7N5}?KJU$cYBKHVPsD$=@jSBkNZD`V zq{I@SleZUGOMRsCSbn(BTcOn|f@rc90sFb}R z(|ss~CS!ItS2Ka$__Qp?s^ID1_6c>EJeUJ`C52WH7(G!8X4LZF4CuY}YpM!$40IkK zEyXt>a9Y);{5`gHh8ORS-z_|W7_ zLrs-QwTy53{Swnd_JgWX&XC17w!v{hxWx0@QJ3jLp*NWKu1SV_RK6%7*j(2I#EfAUIWxIrn*^%Y;`nqm;?&$a& zgVIcMzo0$5M^lVfqpz*6a<#dA*3Zmy$`Y&fwzUPNafGN`0^Fkpp(>}&>O7T)PFz** zENqc>-=j*&7eQhr&fRH@H`~#~+#?fl`n@FuFwA|Quisnh3T^~k@SW{n<Y99M_s?kS<)|b->cDiJe8eT*f65 z5UB_INY!?wSrKVyk_~=Xiq>aUtt;RjTIBC6Mf-vGb|bEmdvrFtj1c?Oh;r!5_Py@$ z?t)sepSx%f(b>w>S&wRHA{cmOX}4QAzb1>9B!)V|s)Z{!PGxQkzp_>%e>!v}YE)LGxT=(1(D|DD5d?N`u){XvW}E?lLC_py6N4Up`uwY^3_bll-}78b-ApnBIjV(HZ#B&Z+*%vj^_62*5}1}-{1AVzg5&eTWliueX`be;g%B-nA4BO z1vf{hih4Az6Vb#3?VpY4MBU|MFPMmyKYDRBFb0MN&cb+E#eT6=WmG8Y>WDD(Il@X+ zF$V!Ac-iQFn9vHp-!bpBXD1n-R{T74<-3=OKJ?z(9F?*@TF$sM0af>-9_Tdij{*_H z)AJTQ&_-(u!&p(A0bV%N#3`PT&>TES~z=Cd+(6OjCxTmH-_&8Rcb zs3vEQ?o|-EoJ%Gn79U6keJg)})ZEL6?+(v98Pa`cF$g}sM{PVUQug&^@Ju*xkcyj2 zc@;Ym0U{%f**+W>-JxoI%nZMeRN;3`7@DG}n+?)+DV4?mH;r?v`4F2)xK=aQgfmPz z5u)J{&zgp&WU8)FbL%t!XO)&q`yg0;DAU|a1JJ@v^u9Q_{*gQeMt4)cpLB3#N~(tB zM`;{!*g8^wbS+cB*5`7ZHpcq7$z&b0H_f(d6nr^}>9(P#`;Cc1&g}*`t0nglLy{YQ znMM0>W)kVEPnoZqO$nhIyuEf#JRs-Y35%Vm1LG#i+`hYe6$Rr*aaXIG+Oxi1{ zep;AXNC)s)+1DR@HxzQD4UTT|r)y(Z{!yT+oCOBJ9CIfEmq_T|KkD3tt^8I=3eIYl z6CoCJq--3iH6`_KI?odgt&R@i`f*`+{$(+U7J9c&Rp`t?T#}r^VeW{!mouEqx88kU^{Iq_ zwlZ6*EUo+9H#uE|Pc^n+M%e$V0dg_DQ z_mC3ril-mj%y=LsbT_ZXp0}&%bxHjyGm3XaJN9Z-xJ(A)IPr@6;4^8pM|{N_Jf)fQ zd^MGoTAE(7vR9nC!l&79SZ2pJM@T6Og>#RH<#TMq|iO`deT8CrqCTU(BP6U z6y&hEyI7ACkaN>}AtzP0!CDMqrmP_NkIpWAFrW+)94Q&N+&igqVcl$5XTb!C7drLCQz|aC&}n$+Vi^&izugE zsHTvM$DRmqz>MkqZVKD>YKdQi3FS`8qngWDuCsTWV4hs`xpwn?lFgej3F1#B6&mu# zwl^X_aJO1k`gBqgb#bxM&8%g*jW20K5JCaPlkUg)e@VhaTYDg5uxh88g@Iic7M$x{$ zFYLM{M$?R1IRltaw8oVrm76rPJM`XjO7w9>CjuwptUkIj$m!3mRNTr12&oE$y&Xkoz$q0rv;Jai~d zQAaIPhqHgi%Rer&ND0<;;*E7*DDY?$_~YvabXge)_vnkkr%Ni%Gf3SpE_izCJS5us zEro*?2Z3B9_-c5H!n~p4-FJ`LD%h=xY5~Y9FX2o1c!9He8>PX=WnMgbFz?-T&9=G(Ttow|?VQ_T@y+QsnTe;38Eur9q_v5*7c0;y*xo$o%E##6Qq(`~MjnP^FyE zOsG^qeL1E^n2_>5DjiHHn*eA!9PxGq0Le_jgyUR?9V!ywu}XRHmKK~CE(&?5 z(wMk0h^9RjN{S21UkW}2Ys*1It6rl}@6!1V4TA7Wntc58Zgh-cd??nWk zQnRW!=YVND>#)X@7Z*_tQb0uxPdoq_46iX&npaaeqP{xp#Dh)~+X+*KAn=xV{nBfv z|C~E2@_Y98AGr#suXv#OcQB)(W1v#Pl$3X~|A~>MgyA(o5T#e8+26`e`(5QRq5_fu zpz#OLf5GGLW%J`7fE1j7hpzmI#P?RAGyCTkKb${7c%Pr-&ym5E&Y!W&7cEZ*tW(f0CVltl)2#{}Xlm z>C2$N{}1>-QTHe0LuV>L*8yuhg-*Ny%!`7R3!QjN)4omBb04IQdTn&+U%d5yiU0G! Lf5QV5zxMwJ?GN}n diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index bfccac4ff..000000000 --- a/package-lock.json +++ /dev/null @@ -1,14819 +0,0 @@ -{ - "name": "@wppconnect-team/wppconnect", - "version": "1.31.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "@wppconnect-team/wppconnect", - "version": "1.31.0", - "license": "LGPL-3.0-or-later", - "dependencies": { - "@wppconnect/wa-js": "^3.3.1", - "@wppconnect/wa-version": "^1.4.213", - "atob": "^2.1.2", - "axios": "^1.7.2", - "boxen": "^5.1.2", - "catch-exit": "^1.2.2", - "chalk": "~4.1.2", - "chrome-launcher": "^0.15.2", - "execa": "^5.1.1", - "file-type": "~16.5.4", - "futoin-hkdf": "^1.5.3", - "latest-version": "^5.1.0", - "logform": "^2.6.0", - "lookpath": "^1.2.2", - "mime-types": "^2.1.35", - "puppeteer": "^22.10.0", - "puppeteer-extra": "^3.3.6", - "puppeteer-extra-plugin-stealth": "^2.11.2", - "puppeteer-extra-plugin-user-data-dir": "^2.4.1", - "puppeteer-extra-plugin-user-preferences": "^2.4.1", - "qrcode-terminal": "^0.12.0", - "reflect-metadata": "^0.2.1", - "rimraf": "^3.0.2", - "sanitize-filename": "^1.6.3", - "sharp": "0.33.4", - "tmp": "^0.2.3", - "tree-kill": "^1.2.2", - "winston": "^3.13.0", - "ws": "^8.17.0" - }, - "devDependencies": { - "@babel/core": "^7.24.7", - "@babel/eslint-parser": "^7.24.7", - "@babel/eslint-plugin": "^7.24.7", - "@babel/preset-env": "^7.24.7", - "@commitlint/cli": "^19.3.0", - "@commitlint/config-conventional": "^19.2.2", - "@commitlint/cz-commitlint": "^19.2.0", - "@types/atob": "^2.1.4", - "@types/mime-types": "^2.1.4", - "@types/mocha": "^10.0.6", - "@types/node": "^18.19.34", - "@types/rimraf": "^4.0.5", - "@types/sharp": "^0.32.0", - "@types/shelljs": "^0.8.15", - "@types/tmp": "^0.2.6", - "@types/ws": "^8.5.10", - "@typescript-eslint/eslint-plugin": "^5.62.0", - "@typescript-eslint/parser": "^5.62.0", - "babel-loader": "^9.1.3", - "commitizen": "^4.3.0", - "concurrently": "^8.2.2", - "conventional-changelog-cli": "^4.1.0", - "eslint": "^8.57.0", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-header": "^3.1.1", - "eslint-plugin-prettier": "^4.2.1", - "husky": "^9.0.11", - "mocha": "^10.4.0", - "prettier": "^2.8.8", - "pretty-quick": "^4.0.0", - "regenerator-runtime": "^0.14.1", - "release-it": "^17.3.0", - "shx": "^0.3.4", - "ts-node": "^10.9.2", - "typedoc": "^0.25.13", - "typescript": "^5.4.5", - "webpack": "^5.91.0", - "webpack-cli": "^5.1.4" - }, - "optionalDependencies": { - "@img/sharp-win32-x64": "^0.33.4", - "fsevents": "^2.3.3" - } - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", - "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.24.7", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.7.tgz", - "integrity": "sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.7.tgz", - "integrity": "sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.7", - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helpers": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/template": "^7.24.7", - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/eslint-parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.24.7.tgz", - "integrity": "sha512-SO5E3bVxDuxyNxM5agFv480YA2HO6ohZbGxbazZdIk3KQOPOGVNw6q78I9/lbviIf95eq6tPozeYnJLbjnC8IA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", - "eslint-visitor-keys": "^2.1.0", - "semver": "^6.3.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || >=14.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.11.0", - "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0" - } - }, - "node_modules/@babel/eslint-plugin": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/eslint-plugin/-/eslint-plugin-7.24.7.tgz", - "integrity": "sha512-lODNPJnM+OfcxxBvdmI2YmUeC0fBK3k9yET5O+1Eukr8d5VpO19c6ARtNheE2t2i/8XNYTzp3HeGEAAGZH3nnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-rule-composer": "^0.3.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || >=14.0.0" - }, - "peerDependencies": { - "@babel/eslint-parser": "^7.11.0", - "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0" - } - }, - "node_modules/@babel/generator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", - "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.24.7", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", - "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz", - "integrity": "sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz", - "integrity": "sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.24.7", - "@babel/helper-validator-option": "^7.24.7", - "browserslist": "^4.22.2", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.7.tgz", - "integrity": "sha512-kTkaDl7c9vO80zeX1rJxnuRpEsD5tA81yh11X1gQo+PhSti3JS+7qeZo9U4RHobKRiFPKaGK3svUAeb8D0Q7eg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-member-expression-to-functions": "^7.24.7", - "@babel/helper-optimise-call-expression": "^7.24.7", - "@babel/helper-replace-supers": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.7.tgz", - "integrity": "sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "regexpu-core": "^5.3.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.1.tgz", - "integrity": "sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", - "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", - "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", - "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.7.tgz", - "integrity": "sha512-LGeMaf5JN4hAT471eJdBs/GK1DoYIJ5GCtZN/EsL6KUiiDZOvO/eKE11AMZJa2zP4zk4qe9V2O/hxAmkRc8p6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", - "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz", - "integrity": "sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-simple-access": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz", - "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz", - "integrity": "sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.7.tgz", - "integrity": "sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-wrap-function": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.7.tgz", - "integrity": "sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-member-expression-to-functions": "^7.24.7", - "@babel/helper-optimise-call-expression": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", - "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz", - "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", - "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz", - "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz", - "integrity": "sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.7.tgz", - "integrity": "sha512-N9JIYk3TD+1vq/wn77YnJOqMtfWhNewNE+DJV4puD2X7Ew9J4JvrzrFDfTfyv5EgEXVy9/Wt8QiOErzEmv5Ifw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-function-name": "^7.24.7", - "@babel/template": "^7.24.7", - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.7.tgz", - "integrity": "sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.24.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "license": "MIT" - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", - "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", - "dev": true, - "license": "MIT", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.7.tgz", - "integrity": "sha512-TiT1ss81W80eQsN+722OaeQMY/G4yTb4G9JrqeiDADs3N8lbPMGldWi9x8tyqCW5NLx1Jh2AvkE6r6QvEltMMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.7.tgz", - "integrity": "sha512-unaQgZ/iRu/By6tsjMZzpeBZjChYfLYry6HrEXPoz3KmfF0sVBQ1l8zKMQ4xRGLWVsjuvB8nQfjNP/DcfEOCsg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz", - "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/plugin-transform-optional-chaining": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.7.tgz", - "integrity": "sha512-utA4HuR6F4Vvcr+o4DnjL8fCOlgRFGbeeBEGNg3ZTrLFw6VWG5XmUrvcQ0FjIYMU2ST4XcR2Wsp7t9qOAPnxMg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "dev": true, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz", - "integrity": "sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz", - "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz", - "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.7.tgz", - "integrity": "sha512-o+iF77e3u7ZS4AoAuJvapz9Fm001PuD2V3Lp6OSE4FYQke+cSewYtnek+THqGRWyQloRCyvWL1OkyfNEl9vr/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-remap-async-to-generator": "^7.24.7", - "@babel/plugin-syntax-async-generators": "^7.8.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz", - "integrity": "sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-remap-async-to-generator": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz", - "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.7.tgz", - "integrity": "sha512-Nd5CvgMbWc+oWzBsuaMcbwjJWAcp5qzrbg69SZdHSP7AMY0AbWFqFO0WTFCA1jxhMCwodRwvRec8k0QUbZk7RQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz", - "integrity": "sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz", - "integrity": "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.7.tgz", - "integrity": "sha512-CFbbBigp8ln4FU6Bpy6g7sE8B/WmCmzvivzUC6xDAdWVsjYTXijpuuGJmYkAaoWAzcItGKT3IOAbxRItZ5HTjw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-replace-supers": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz", - "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/template": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.7.tgz", - "integrity": "sha512-19eJO/8kdCQ9zISOf+SEUJM/bAUIsvY3YDnXZTupUCQ8LgrWnsG/gFB9dvXqdXnRXMAM8fvt7b0CBKQHNGy1mw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz", - "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz", - "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz", - "integrity": "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz", - "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz", - "integrity": "sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz", - "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.7.tgz", - "integrity": "sha512-U9FcnA821YoILngSmYkW6FjyQe2TyZD5pHt4EVIhmcTkrJw/3KqcrRSxuOo5tFZJi7TE19iDyI1u+weTI7bn2w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz", - "integrity": "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.7.tgz", - "integrity": "sha512-vcwCbb4HDH+hWi8Pqenwnjy+UiklO4Kt1vfspcQYFhJdpthSnW8XvWGyDZWKNVrVbVViI/S7K9PDJZiUmP2fYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz", - "integrity": "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz", - "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz", - "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.7.tgz", - "integrity": "sha512-iFI8GDxtevHJ/Z22J5xQpVqFLlMNstcLXh994xifFwxxGslr2ZXXLWgtBeLctOD63UFDArdvN6Tg8RFw+aEmjQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-simple-access": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.7.tgz", - "integrity": "sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-hoist-variables": "^7.24.7", - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz", - "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz", - "integrity": "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz", - "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz", - "integrity": "sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz", - "integrity": "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz", - "integrity": "sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz", - "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-replace-supers": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz", - "integrity": "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.7.tgz", - "integrity": "sha512-tK+0N9yd4j+x/4hxF3F0e0fu/VdcxU18y5SevtyM/PCFlQvXbR0Zmlo2eBrKtVipGNFzpq56o8WsIIKcJFUCRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz", - "integrity": "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz", - "integrity": "sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz", - "integrity": "sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz", - "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz", - "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "regenerator-transform": "^0.15.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz", - "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz", - "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz", - "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz", - "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz", - "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.7.tgz", - "integrity": "sha512-VtR8hDy7YLB7+Pet9IarXjg/zgCMSF+1mNS/EQEiEaUPoFXCVsHG64SIxcaaI2zJgRiv+YmgaQESUfWAdbjzgg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz", - "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz", - "integrity": "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz", - "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz", - "integrity": "sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.7.tgz", - "integrity": "sha512-1YZNsc+y6cTvWlDHidMBsQZrZfEFjRIo/BZCT906PMdzOyXtSLTgqGdrpcuTDCXyd11Am5uQULtDIcCfnTc8fQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.24.7", - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-validator-option": "^7.24.7", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.7", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.7", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.7", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.24.7", - "@babel/plugin-syntax-import-attributes": "^7.24.7", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.24.7", - "@babel/plugin-transform-async-generator-functions": "^7.24.7", - "@babel/plugin-transform-async-to-generator": "^7.24.7", - "@babel/plugin-transform-block-scoped-functions": "^7.24.7", - "@babel/plugin-transform-block-scoping": "^7.24.7", - "@babel/plugin-transform-class-properties": "^7.24.7", - "@babel/plugin-transform-class-static-block": "^7.24.7", - "@babel/plugin-transform-classes": "^7.24.7", - "@babel/plugin-transform-computed-properties": "^7.24.7", - "@babel/plugin-transform-destructuring": "^7.24.7", - "@babel/plugin-transform-dotall-regex": "^7.24.7", - "@babel/plugin-transform-duplicate-keys": "^7.24.7", - "@babel/plugin-transform-dynamic-import": "^7.24.7", - "@babel/plugin-transform-exponentiation-operator": "^7.24.7", - "@babel/plugin-transform-export-namespace-from": "^7.24.7", - "@babel/plugin-transform-for-of": "^7.24.7", - "@babel/plugin-transform-function-name": "^7.24.7", - "@babel/plugin-transform-json-strings": "^7.24.7", - "@babel/plugin-transform-literals": "^7.24.7", - "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", - "@babel/plugin-transform-member-expression-literals": "^7.24.7", - "@babel/plugin-transform-modules-amd": "^7.24.7", - "@babel/plugin-transform-modules-commonjs": "^7.24.7", - "@babel/plugin-transform-modules-systemjs": "^7.24.7", - "@babel/plugin-transform-modules-umd": "^7.24.7", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", - "@babel/plugin-transform-new-target": "^7.24.7", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", - "@babel/plugin-transform-numeric-separator": "^7.24.7", - "@babel/plugin-transform-object-rest-spread": "^7.24.7", - "@babel/plugin-transform-object-super": "^7.24.7", - "@babel/plugin-transform-optional-catch-binding": "^7.24.7", - "@babel/plugin-transform-optional-chaining": "^7.24.7", - "@babel/plugin-transform-parameters": "^7.24.7", - "@babel/plugin-transform-private-methods": "^7.24.7", - "@babel/plugin-transform-private-property-in-object": "^7.24.7", - "@babel/plugin-transform-property-literals": "^7.24.7", - "@babel/plugin-transform-regenerator": "^7.24.7", - "@babel/plugin-transform-reserved-words": "^7.24.7", - "@babel/plugin-transform-shorthand-properties": "^7.24.7", - "@babel/plugin-transform-spread": "^7.24.7", - "@babel/plugin-transform-sticky-regex": "^7.24.7", - "@babel/plugin-transform-template-literals": "^7.24.7", - "@babel/plugin-transform-typeof-symbol": "^7.24.7", - "@babel/plugin-transform-unicode-escapes": "^7.24.7", - "@babel/plugin-transform-unicode-property-regex": "^7.24.7", - "@babel/plugin-transform-unicode-regex": "^7.24.7", - "@babel/plugin-transform-unicode-sets-regex": "^7.24.7", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.4", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.31.0", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", - "dev": true - }, - "node_modules/@babel/runtime": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz", - "integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==", - "dev": true, - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", - "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz", - "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-hoist-variables": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", - "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@colors/colors": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", - "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@commitlint/cli": { - "version": "19.3.0", - "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-19.3.0.tgz", - "integrity": "sha512-LgYWOwuDR7BSTQ9OLZ12m7F/qhNY+NpAyPBgo4YNMkACE7lGuUnuQq1yi9hz1KA4+3VqpOYl8H1rY/LYK43v7g==", - "dev": true, - "dependencies": { - "@commitlint/format": "^19.3.0", - "@commitlint/lint": "^19.2.2", - "@commitlint/load": "^19.2.0", - "@commitlint/read": "^19.2.1", - "@commitlint/types": "^19.0.3", - "execa": "^8.0.1", - "yargs": "^17.0.0" - }, - "bin": { - "commitlint": "cli.js" - }, - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/cli/node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/@commitlint/cli/node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", - "dev": true, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@commitlint/cli/node_modules/human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", - "dev": true, - "engines": { - "node": ">=16.17.0" - } - }, - "node_modules/@commitlint/cli/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@commitlint/cli/node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@commitlint/cli/node_modules/npm-run-path": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", - "dev": true, - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@commitlint/cli/node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@commitlint/cli/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@commitlint/cli/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@commitlint/cli/node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@commitlint/config-conventional": { - "version": "19.2.2", - "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-19.2.2.tgz", - "integrity": "sha512-mLXjsxUVLYEGgzbxbxicGPggDuyWNkf25Ht23owXIH+zV2pv1eJuzLK3t1gDY5Gp6pxdE60jZnWUY5cvgL3ufw==", - "dev": true, - "dependencies": { - "@commitlint/types": "^19.0.3", - "conventional-changelog-conventionalcommits": "^7.0.2" - }, - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/config-validator": { - "version": "19.0.3", - "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-19.0.3.tgz", - "integrity": "sha512-2D3r4PKjoo59zBc2auodrSCaUnCSALCx54yveOFwwP/i2kfEAQrygwOleFWswLqK0UL/F9r07MFi5ev2ohyM4Q==", - "dev": true, - "dependencies": { - "@commitlint/types": "^19.0.3", - "ajv": "^8.11.0" - }, - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/cz-commitlint": { - "version": "19.2.0", - "resolved": "https://registry.npmjs.org/@commitlint/cz-commitlint/-/cz-commitlint-19.2.0.tgz", - "integrity": "sha512-kudzHMY9/GxflGyAWMiisiBq2UkyQL1D1eWjGKoC66qQ+5jxRYeDaiVwTdPxYMnmehftNcpksZATDYKqdPP0Wg==", - "dev": true, - "dependencies": { - "@commitlint/ensure": "^19.0.3", - "@commitlint/load": "^19.2.0", - "@commitlint/types": "^19.0.3", - "chalk": "^5.3.0", - "lodash.isplainobject": "^4.0.6", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">=v18" - }, - "peerDependencies": { - "commitizen": "^4.0.3", - "inquirer": "^9.0.0" - } - }, - "node_modules/@commitlint/cz-commitlint/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@commitlint/ensure": { - "version": "19.0.3", - "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-19.0.3.tgz", - "integrity": "sha512-SZEpa/VvBLoT+EFZVb91YWbmaZ/9rPH3ESrINOl0HD2kMYsjvl0tF7nMHh0EpTcv4+gTtZBAe1y/SS6/OhfZzQ==", - "dev": true, - "dependencies": { - "@commitlint/types": "^19.0.3", - "lodash.camelcase": "^4.3.0", - "lodash.kebabcase": "^4.1.1", - "lodash.snakecase": "^4.1.1", - "lodash.startcase": "^4.4.0", - "lodash.upperfirst": "^4.3.1" - }, - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/execute-rule": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-19.0.0.tgz", - "integrity": "sha512-mtsdpY1qyWgAO/iOK0L6gSGeR7GFcdW7tIjcNFxcWkfLDF5qVbPHKuGATFqRMsxcO8OUKNj0+3WOHB7EHm4Jdw==", - "dev": true, - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/format": { - "version": "19.3.0", - "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-19.3.0.tgz", - "integrity": "sha512-luguk5/aF68HiF4H23ACAfk8qS8AHxl4LLN5oxPc24H+2+JRPsNr1OS3Gaea0CrH7PKhArBMKBz5RX9sA5NtTg==", - "dev": true, - "dependencies": { - "@commitlint/types": "^19.0.3", - "chalk": "^5.3.0" - }, - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/format/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@commitlint/is-ignored": { - "version": "19.2.2", - "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-19.2.2.tgz", - "integrity": "sha512-eNX54oXMVxncORywF4ZPFtJoBm3Tvp111tg1xf4zWXGfhBPKpfKG6R+G3G4v5CPlRROXpAOpQ3HMhA9n1Tck1g==", - "dev": true, - "dependencies": { - "@commitlint/types": "^19.0.3", - "semver": "^7.6.0" - }, - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/is-ignored/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@commitlint/is-ignored/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@commitlint/is-ignored/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/@commitlint/lint": { - "version": "19.2.2", - "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-19.2.2.tgz", - "integrity": "sha512-xrzMmz4JqwGyKQKTpFzlN0dx0TAiT7Ran1fqEBgEmEj+PU98crOFtysJgY+QdeSagx6EDRigQIXJVnfrI0ratA==", - "dev": true, - "dependencies": { - "@commitlint/is-ignored": "^19.2.2", - "@commitlint/parse": "^19.0.3", - "@commitlint/rules": "^19.0.3", - "@commitlint/types": "^19.0.3" - }, - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/load": { - "version": "19.2.0", - "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-19.2.0.tgz", - "integrity": "sha512-XvxxLJTKqZojCxaBQ7u92qQLFMMZc4+p9qrIq/9kJDy8DOrEa7P1yx7Tjdc2u2JxIalqT4KOGraVgCE7eCYJyQ==", - "dev": true, - "dependencies": { - "@commitlint/config-validator": "^19.0.3", - "@commitlint/execute-rule": "^19.0.0", - "@commitlint/resolve-extends": "^19.1.0", - "@commitlint/types": "^19.0.3", - "chalk": "^5.3.0", - "cosmiconfig": "^9.0.0", - "cosmiconfig-typescript-loader": "^5.0.0", - "lodash.isplainobject": "^4.0.6", - "lodash.merge": "^4.6.2", - "lodash.uniq": "^4.5.0" - }, - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/load/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@commitlint/message": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-19.0.0.tgz", - "integrity": "sha512-c9czf6lU+9oF9gVVa2lmKaOARJvt4soRsVmbR7Njwp9FpbBgste5i7l/2l5o8MmbwGh4yE1snfnsy2qyA2r/Fw==", - "dev": true, - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/parse": { - "version": "19.0.3", - "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-19.0.3.tgz", - "integrity": "sha512-Il+tNyOb8VDxN3P6XoBBwWJtKKGzHlitEuXA5BP6ir/3loWlsSqDr5aecl6hZcC/spjq4pHqNh0qPlfeWu38QA==", - "dev": true, - "dependencies": { - "@commitlint/types": "^19.0.3", - "conventional-changelog-angular": "^7.0.0", - "conventional-commits-parser": "^5.0.0" - }, - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/read": { - "version": "19.2.1", - "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-19.2.1.tgz", - "integrity": "sha512-qETc4+PL0EUv7Q36lJbPG+NJiBOGg7SSC7B5BsPWOmei+Dyif80ErfWQ0qXoW9oCh7GTpTNRoaVhiI8RbhuaNw==", - "dev": true, - "dependencies": { - "@commitlint/top-level": "^19.0.0", - "@commitlint/types": "^19.0.3", - "execa": "^8.0.1", - "git-raw-commits": "^4.0.0", - "minimist": "^1.2.8" - }, - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/read/node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/@commitlint/read/node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", - "dev": true, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@commitlint/read/node_modules/human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", - "dev": true, - "engines": { - "node": ">=16.17.0" - } - }, - "node_modules/@commitlint/read/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@commitlint/read/node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@commitlint/read/node_modules/npm-run-path": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", - "dev": true, - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@commitlint/read/node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@commitlint/read/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@commitlint/read/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@commitlint/read/node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@commitlint/resolve-extends": { - "version": "19.1.0", - "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-19.1.0.tgz", - "integrity": "sha512-z2riI+8G3CET5CPgXJPlzftH+RiWYLMYv4C9tSLdLXdr6pBNimSKukYP9MS27ejmscqCTVA4almdLh0ODD2KYg==", - "dev": true, - "dependencies": { - "@commitlint/config-validator": "^19.0.3", - "@commitlint/types": "^19.0.3", - "global-directory": "^4.0.1", - "import-meta-resolve": "^4.0.0", - "lodash.mergewith": "^4.6.2", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/rules": { - "version": "19.0.3", - "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-19.0.3.tgz", - "integrity": "sha512-TspKb9VB6svklxNCKKwxhELn7qhtY1rFF8ls58DcFd0F97XoG07xugPjjbVnLqmMkRjZDbDIwBKt9bddOfLaPw==", - "dev": true, - "dependencies": { - "@commitlint/ensure": "^19.0.3", - "@commitlint/message": "^19.0.0", - "@commitlint/to-lines": "^19.0.0", - "@commitlint/types": "^19.0.3", - "execa": "^8.0.1" - }, - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/rules/node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/@commitlint/rules/node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", - "dev": true, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@commitlint/rules/node_modules/human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", - "dev": true, - "engines": { - "node": ">=16.17.0" - } - }, - "node_modules/@commitlint/rules/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@commitlint/rules/node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@commitlint/rules/node_modules/npm-run-path": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", - "dev": true, - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@commitlint/rules/node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@commitlint/rules/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@commitlint/rules/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@commitlint/rules/node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@commitlint/to-lines": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-19.0.0.tgz", - "integrity": "sha512-vkxWo+VQU5wFhiP9Ub9Sre0FYe019JxFikrALVoD5UGa8/t3yOJEpEhxC5xKiENKKhUkTpEItMTRAjHw2SCpZw==", - "dev": true, - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/top-level": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-19.0.0.tgz", - "integrity": "sha512-KKjShd6u1aMGNkCkaX4aG1jOGdn7f8ZI8TR1VEuNqUOjWTOdcDSsmglinglJ18JTjuBX5I1PtjrhQCRcixRVFQ==", - "dev": true, - "dependencies": { - "find-up": "^7.0.0" - }, - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/top-level/node_modules/find-up": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-7.0.0.tgz", - "integrity": "sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==", - "dev": true, - "dependencies": { - "locate-path": "^7.2.0", - "path-exists": "^5.0.0", - "unicorn-magic": "^0.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@commitlint/top-level/node_modules/locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", - "dev": true, - "dependencies": { - "p-locate": "^6.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@commitlint/top-level/node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@commitlint/top-level/node_modules/p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "dev": true, - "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@commitlint/top-level/node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/@commitlint/top-level/node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@commitlint/types": { - "version": "19.0.3", - "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-19.0.3.tgz", - "integrity": "sha512-tpyc+7i6bPG9mvaBbtKUeghfyZSDgWquIDfMgqYtTbmZ9Y9VzEm2je9EYcQ0aoz5o7NvGS+rcDec93yO08MHYA==", - "dev": true, - "dependencies": { - "@types/conventional-commits-parser": "^5.0.0", - "chalk": "^5.3.0" - }, - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/types/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@dabh/diagnostics": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", - "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", - "dependencies": { - "colorspace": "1.1.x", - "enabled": "2.0.x", - "kuler": "^2.0.0" - } - }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "dev": true, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.2.0.tgz", - "integrity": "sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", - "dev": true - }, - "node_modules/@hutson/parse-repository-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-5.0.0.tgz", - "integrity": "sha512-e5+YUKENATs1JgYHMzTr2MW/NDcXGfYFAuOQU8gJgF/kEh4EqKgfGrfLI67bMD4tbhZVlkigz/9YYwWcbOFthg==", - "dev": true, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/@iarna/toml": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", - "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==", - "dev": true - }, - "node_modules/@img/sharp-darwin-arm64": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.4.tgz", - "integrity": "sha512-p0suNqXufJs9t3RqLBO6vvrgr5OhgbWp76s5gTRvdmxmuv9E1rcaqGUsl3l4mKVmXPkTkTErXediAui4x+8PSA==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "glibc": ">=2.26", - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.0.2" - } - }, - "node_modules/@img/sharp-darwin-x64": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.4.tgz", - "integrity": "sha512-0l7yRObwtTi82Z6ebVI2PnHT8EB2NxBgpK2MiKJZJ7cz32R4lxd001ecMhzzsZig3Yv9oclvqqdV93jo9hy+Dw==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "glibc": ">=2.26", - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.0.2" - } - }, - "node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.2.tgz", - "integrity": "sha512-tcK/41Rq8IKlSaKRCCAuuY3lDJjQnYIW1UXU1kxcEKrfL8WR7N6+rzNoOxoQRJWTAECuKwgAHnPvqXGN8XfkHA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "macos": ">=11", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.2.tgz", - "integrity": "sha512-Ofw+7oaWa0HiiMiKWqqaZbaYV3/UGL2wAPeLuJTx+9cXpCRdvQhCLG0IH8YGwM0yGWGLpsF4Su9vM1o6aer+Fw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "macos": ">=10.13", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.2.tgz", - "integrity": "sha512-iLWCvrKgeFoglQxdEwzu1eQV04o8YeYGFXtfWU26Zr2wWT3q3MTzC+QTCO3ZQfWd3doKHT4Pm2kRmLbupT+sZw==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "glibc": ">=2.28", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.2.tgz", - "integrity": "sha512-x7kCt3N00ofFmmkkdshwj3vGPCnmiDh7Gwnd4nUwZln2YjqPxV1NlTyZOvoDWdKQVDL911487HOueBvrpflagw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "glibc": ">=2.26", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.2.tgz", - "integrity": "sha512-cmhQ1J4qVhfmS6szYW7RT+gLJq9dH2i4maq+qyXayUSn9/3iY2ZeWpbAgSpSVbV2E1JUL2Gg7pwnYQ1h8rQIog==", - "cpu": [ - "s390x" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "glibc": ">=2.28", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.2.tgz", - "integrity": "sha512-E441q4Qdb+7yuyiADVi5J+44x8ctlrqn8XgkDTwr4qPJzWkaHwD489iZ4nGDgcuya4iMN3ULV6NwbhRZJ9Z7SQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "glibc": ">=2.26", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.2.tgz", - "integrity": "sha512-3CAkndNpYUrlDqkCM5qhksfE+qSIREVpyoeHIU6jd48SJZViAmznoQQLAv4hVXF7xyUB9zf+G++e2v1ABjCbEQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "musl": ">=1.2.2", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.2.tgz", - "integrity": "sha512-VI94Q6khIHqHWNOh6LLdm9s2Ry4zdjWJwH56WoiJU7NTeDwyApdZZ8c+SADC8OH98KWNQXnE01UdJ9CSfZvwZw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "musl": ">=1.2.2", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-linux-arm": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.4.tgz", - "integrity": "sha512-RUgBD1c0+gCYZGCCe6mMdTiOFS0Zc/XrN0fYd6hISIKcDUbAW5NtSQW9g/powkrXYm6Vzwd6y+fqmExDuCdHNQ==", - "cpu": [ - "arm" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "glibc": ">=2.28", - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.0.2" - } - }, - "node_modules/@img/sharp-linux-arm64": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.4.tgz", - "integrity": "sha512-2800clwVg1ZQtxwSoTlHvtm9ObgAax7V6MTAB/hDT945Tfyy3hVkmiHpeLPCKYqYR1Gcmv1uDZ3a4OFwkdBL7Q==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "glibc": ">=2.26", - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.0.2" - } - }, - "node_modules/@img/sharp-linux-s390x": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.4.tgz", - "integrity": "sha512-h3RAL3siQoyzSoH36tUeS0PDmb5wINKGYzcLB5C6DIiAn2F3udeFAum+gj8IbA/82+8RGCTn7XW8WTFnqag4tQ==", - "cpu": [ - "s390x" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "glibc": ">=2.31", - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.0.2" - } - }, - "node_modules/@img/sharp-linux-x64": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.4.tgz", - "integrity": "sha512-GoR++s0XW9DGVi8SUGQ/U4AeIzLdNjHka6jidVwapQ/JebGVQIpi52OdyxCNVRE++n1FCLzjDovJNozif7w/Aw==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "glibc": ">=2.26", - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.0.2" - } - }, - "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.4.tgz", - "integrity": "sha512-nhr1yC3BlVrKDTl6cO12gTpXMl4ITBUZieehFvMntlCXFzH2bvKG76tBL2Y/OqhupZt81pR7R+Q5YhJxW0rGgQ==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "musl": ">=1.2.2", - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.0.2" - } - }, - "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.4.tgz", - "integrity": "sha512-uCPTku0zwqDmZEOi4ILyGdmW76tH7dm8kKlOIV1XC5cLyJ71ENAAqarOHQh0RLfpIpbV5KOpXzdU6XkJtS0daw==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "musl": ">=1.2.2", - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.0.2" - } - }, - "node_modules/@img/sharp-wasm32": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.4.tgz", - "integrity": "sha512-Bmmauh4sXUsUqkleQahpdNXKvo+wa1V9KhT2pDA4VJGKwnKMJXiSTGphn0gnJrlooda0QxCtXc6RX1XAU6hMnQ==", - "cpu": [ - "wasm32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", - "optional": true, - "dependencies": { - "@emnapi/runtime": "^1.1.1" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-ia32": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.4.tgz", - "integrity": "sha512-99SJ91XzUhYHbx7uhK3+9Lf7+LjwMGQZMDlO/E/YVJ7Nc3lyDFZPGhjwiYdctoH2BOzW9+TnfqcaMKt0jHLdqw==", - "cpu": [ - "ia32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-x64": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.4.tgz", - "integrity": "sha512-3QLocdTRVIrFNye5YocZl+KKpYKP+fksi1QhmOArgx7GyhIbQp/WrJRu176jm8IxromS7RIkzMiMINVdBtC8Aw==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@inquirer/figures": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.3.tgz", - "integrity": "sha512-ErXXzENMH5pJt5/ssXV0DfWUZqly8nGzf0UcBV9xTnP+KyffE2mqyxIMBrZ8ijQck2nU0TQm40EQB53YreyWHw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@ljharb/through": { - "version": "2.3.13", - "resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.13.tgz", - "integrity": "sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { - "version": "5.1.1-v1", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", - "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", - "dev": true, - "dependencies": { - "eslint-scope": "5.1.1" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@octokit/auth-token": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz", - "integrity": "sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==", - "dev": true, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/core": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.1.0.tgz", - "integrity": "sha512-BDa2VAMLSh3otEiaMJ/3Y36GU4qf6GI+VivQ/P41NC6GHcdxpKlqV0ikSZ5gdQsmS3ojXeRx5vasgNTinF0Q4g==", - "dev": true, - "dependencies": { - "@octokit/auth-token": "^4.0.0", - "@octokit/graphql": "^7.0.0", - "@octokit/request": "^8.0.2", - "@octokit/request-error": "^5.0.0", - "@octokit/types": "^12.0.0", - "before-after-hook": "^2.2.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/endpoint": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.4.tgz", - "integrity": "sha512-DWPLtr1Kz3tv8L0UvXTDP1fNwM0S+z6EJpRcvH66orY6Eld4XBMCSYsaWp4xIm61jTWxK68BrR7ibO+vSDnZqw==", - "dev": true, - "dependencies": { - "@octokit/types": "^12.0.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/graphql": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.0.2.tgz", - "integrity": "sha512-OJ2iGMtj5Tg3s6RaXH22cJcxXRi7Y3EBqbHTBRq+PQAqfaS8f/236fUrWhfSn8P4jovyzqucxme7/vWSSZBX2Q==", - "dev": true, - "dependencies": { - "@octokit/request": "^8.0.1", - "@octokit/types": "^12.0.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/openapi-types": { - "version": "20.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-20.0.0.tgz", - "integrity": "sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==", - "dev": true - }, - "node_modules/@octokit/plugin-paginate-rest": { - "version": "11.3.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.3.1.tgz", - "integrity": "sha512-ryqobs26cLtM1kQxqeZui4v8FeznirUsksiA+RYemMPJ7Micju0WSkv50dBksTuZks9O5cg4wp+t8fZ/cLY56g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@octokit/types": "^13.5.0" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "@octokit/core": "5" - } - }, - "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/openapi-types": { - "version": "22.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-22.2.0.tgz", - "integrity": "sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/types": { - "version": "13.5.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.5.0.tgz", - "integrity": "sha512-HdqWTf5Z3qwDVlzCrP8UJquMwunpDiMPt5er+QjGzL4hqr/vBVY/MauQgS1xWxCDT1oMx1EULyqxncdCY/NVSQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^22.2.0" - } - }, - "node_modules/@octokit/plugin-request-log": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-4.0.0.tgz", - "integrity": "sha512-2uJI1COtYCq8Z4yNSnM231TgH50bRkheQ9+aH8TnZanB6QilOnx8RMD2qsnamSOXtDj0ilxvevf5fGsBhBBzKA==", - "dev": true, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "@octokit/core": ">=5" - } - }, - "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.2.2.tgz", - "integrity": "sha512-EI7kXWidkt3Xlok5uN43suK99VWqc8OaIMktY9d9+RNKl69juoTyxmLoWPIZgJYzi41qj/9zU7G/ljnNOJ5AFA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@octokit/types": "^13.5.0" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "@octokit/core": "^5" - } - }, - "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/openapi-types": { - "version": "22.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-22.2.0.tgz", - "integrity": "sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/types": { - "version": "13.5.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.5.0.tgz", - "integrity": "sha512-HdqWTf5Z3qwDVlzCrP8UJquMwunpDiMPt5er+QjGzL4hqr/vBVY/MauQgS1xWxCDT1oMx1EULyqxncdCY/NVSQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^22.2.0" - } - }, - "node_modules/@octokit/request": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.2.0.tgz", - "integrity": "sha512-exPif6x5uwLqv1N1irkLG1zZNJkOtj8bZxuVHd71U5Ftuxf2wGNvAJyNBcPbPC+EBzwYEbBDdSFb8EPcjpYxPQ==", - "dev": true, - "dependencies": { - "@octokit/endpoint": "^9.0.0", - "@octokit/request-error": "^5.0.0", - "@octokit/types": "^12.0.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/request-error": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.0.1.tgz", - "integrity": "sha512-X7pnyTMV7MgtGmiXBwmO6M5kIPrntOXdyKZLigNfQWSEQzVxR4a4vo49vJjTWX70mPndj8KhfT4Dx+2Ng3vnBQ==", - "dev": true, - "dependencies": { - "@octokit/types": "^12.0.0", - "deprecation": "^2.0.0", - "once": "^1.4.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/rest": { - "version": "20.1.1", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-20.1.1.tgz", - "integrity": "sha512-MB4AYDsM5jhIHro/dq4ix1iWTLGToIGk6cWF5L6vanFaMble5jTX/UBQyiv05HsWnwUtY8JrfHy2LWfKwihqMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@octokit/core": "^5.0.2", - "@octokit/plugin-paginate-rest": "11.3.1", - "@octokit/plugin-request-log": "^4.0.0", - "@octokit/plugin-rest-endpoint-methods": "13.2.2" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/types": { - "version": "12.6.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.6.0.tgz", - "integrity": "sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==", - "dev": true, - "dependencies": { - "@octokit/openapi-types": "^20.0.0" - } - }, - "node_modules/@pnpm/config.env-replace": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", - "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", - "dev": true, - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/network.ca-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", - "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", - "dev": true, - "dependencies": { - "graceful-fs": "4.2.10" - }, - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "node_modules/@pnpm/npm-conf": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz", - "integrity": "sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==", - "dev": true, - "dependencies": { - "@pnpm/config.env-replace": "^1.1.0", - "@pnpm/network.ca-file": "^1.0.1", - "config-chain": "^1.1.11" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@puppeteer/browsers": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.2.3.tgz", - "integrity": "sha512-bJ0UBsk0ESOs6RFcLXOt99a3yTDcOKlzfjad+rhFwdaG1Lu/Wzq58GHYCDTlZ9z6mldf4g+NTb+TXEfe0PpnsQ==", - "dependencies": { - "debug": "4.3.4", - "extract-zip": "2.0.1", - "progress": "2.0.3", - "proxy-agent": "6.4.0", - "semver": "7.6.0", - "tar-fs": "3.0.5", - "unbzip2-stream": "1.4.3", - "yargs": "17.7.2" - }, - "bin": { - "browsers": "lib/cjs/main-cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@puppeteer/browsers/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@puppeteer/browsers/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@puppeteer/browsers/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/@sindresorhus/merge-streams": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", - "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "dependencies": { - "defer-to-connect": "^1.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@tokenizer/token": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", - "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==" - }, - "node_modules/@tootallnate/quickjs-emscripten": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", - "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==" - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true - }, - "node_modules/@types/atob": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@types/atob/-/atob-2.1.4.tgz", - "integrity": "sha512-FisOhG87cCFqzCgq6FUtSYsTMOHCB/p28zJbSN1QBo4ZGJfg9PEhMjdIV++NDeOnloUUe0Gz6jwBV+L1Ac00Mw==", - "dev": true - }, - "node_modules/@types/conventional-commits-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@types/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz", - "integrity": "sha512-loB369iXNmAZglwWATL+WRe+CRMmmBPtpolYzIebFaX4YA3x+BEfLqhUAV9WanycKI3TG1IMr5bMJDajDKLlUQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/debug": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", - "dependencies": { - "@types/ms": "*" - } - }, - "node_modules/@types/eslint": { - "version": "8.56.3", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.3.tgz", - "integrity": "sha512-PvSf1wfv2wJpVIFUMSb+i4PvqNYkB9Rkp9ZDO3oaWzq4SKhsQk4mrMBr3ZH06I0hKrVGLBacmgl8JM4WVjb9dg==", - "dev": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "dev": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true - }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", - "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", - "dev": true - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true - }, - "node_modules/@types/mime-types": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@types/mime-types/-/mime-types-2.1.4.tgz", - "integrity": "sha512-lfU4b34HOri+kAY5UheuFMWPDOI+OPceBSHZKp69gEyTL/mmJ4cnU6Y/rlme3UL3GyOn6Y42hyIEw0/q8sWx5w==", - "dev": true - }, - "node_modules/@types/minimatch": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", - "dev": true - }, - "node_modules/@types/mocha": { - "version": "10.0.6", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.6.tgz", - "integrity": "sha512-dJvrYWxP/UcXm36Qn36fxhUKu8A/xMRXVT2cliFF1Z7UA9liG5Psj3ezNSZw+5puH2czDXRLcXQxf8JbJt0ejg==", - "dev": true - }, - "node_modules/@types/ms": { - "version": "0.7.34", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", - "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" - }, - "node_modules/@types/node": { - "version": "18.19.34", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.34.tgz", - "integrity": "sha512-eXF4pfBNV5DAMKGbI02NnDtWrQ40hAN558/2vvS4gMpMIxaf6JmD7YjnZbq0Q9TDSSkKBamime8ewRoomHdt4g==", - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "dev": true - }, - "node_modules/@types/rimraf": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/rimraf/-/rimraf-4.0.5.tgz", - "integrity": "sha512-DTCZoIQotB2SUJnYgrEx43cQIUYOlNZz0AZPbKU4PSLYTUdML5Gox0++z4F9kQocxStrCmRNhi4x5x/UlwtKUA==", - "deprecated": "This is a stub types definition. rimraf provides its own type definitions, so you do not need this installed.", - "dev": true, - "dependencies": { - "rimraf": "*" - } - }, - "node_modules/@types/semver": { - "version": "7.5.8", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", - "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", - "dev": true - }, - "node_modules/@types/sharp": { - "version": "0.32.0", - "resolved": "https://registry.npmjs.org/@types/sharp/-/sharp-0.32.0.tgz", - "integrity": "sha512-OOi3kL+FZDnPhVzsfD37J88FNeZh6gQsGcLc95NbeURRGvmSjeXiDcyWzF2o3yh/gQAUn2uhh/e+CPCa5nwAxw==", - "deprecated": "This is a stub types definition. sharp provides its own type definitions, so you do not need this installed.", - "dev": true, - "dependencies": { - "sharp": "*" - } - }, - "node_modules/@types/shelljs": { - "version": "0.8.15", - "resolved": "https://registry.npmjs.org/@types/shelljs/-/shelljs-0.8.15.tgz", - "integrity": "sha512-vzmnCHl6hViPu9GNLQJ+DZFd6BQI2DBTUeOvYHqkWQLMfKAAQYMb/xAmZkTogZI/vqXHCWkqDRymDI5p0QTi5Q==", - "dev": true, - "dependencies": { - "@types/glob": "~7.2.0", - "@types/node": "*" - } - }, - "node_modules/@types/shelljs/node_modules/@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", - "dev": true, - "dependencies": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "node_modules/@types/tmp": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/@types/tmp/-/tmp-0.2.6.tgz", - "integrity": "sha512-chhaNf2oKHlRkDGt+tiKE2Z5aJ6qalm7Z9rlLdBwmOiAAf09YQvvoLXjWK4HWPF1xU/fqvMgfNfpVoBscA/tKA==", - "dev": true - }, - "node_modules/@types/triple-beam": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", - "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==" - }, - "node_modules/@types/ws": { - "version": "8.5.10", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", - "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/yauzl": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", - "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", - "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", - "dev": true, - "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/type-utils": "5.62.0", - "@typescript-eslint/utils": "5.62.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", - "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "5.62.0", - "@typescript-eslint/utils": "5.62.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/@typescript-eslint/utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", - "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", - "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", - "dev": true, - "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", - "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", - "dev": true, - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", - "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.12.1" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", - "dev": true, - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", - "dev": true, - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", - "dev": true - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", - "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-opt": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1", - "@webassemblyjs/wast-printer": "1.12.1" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", - "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", - "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", - "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", - "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webpack-cli/configtest": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", - "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", - "dev": true, - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - } - }, - "node_modules/@webpack-cli/info": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", - "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", - "dev": true, - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - } - }, - "node_modules/@webpack-cli/serve": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", - "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", - "dev": true, - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - }, - "peerDependenciesMeta": { - "webpack-dev-server": { - "optional": true - } - } - }, - "node_modules/@wppconnect/wa-js": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@wppconnect/wa-js/-/wa-js-3.3.1.tgz", - "integrity": "sha512-mwMdb7WRdiPWTQLWIo0XruPYbknBRXkN661uUzaIe4c+mEr02J/3nIchgAl0OfYdP+cZwGl3gmBlGLgqsePdwA==", - "license": "Apache-2.0", - "engines": { - "whatsapp-web": ">=2.2326.10-beta" - } - }, - "node_modules/@wppconnect/wa-version": { - "version": "1.4.213", - "resolved": "https://registry.npmjs.org/@wppconnect/wa-version/-/wa-version-1.4.213.tgz", - "integrity": "sha512-ph1z68Ijk0bCE920JZ7jf5+ICwHBJl/D+RFjvSnCMCb3WgsCUwIxuNBo8Dnjkx2hw+jAlBfd585yqQIjpT5/RQ==", - "license": "Apache-2.0", - "dependencies": { - "node-fetch": "^2.7.0", - "semver": "^7.5.4" - } - }, - "node_modules/@wppconnect/wa-version/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "dev": true, - "peerDependencies": { - "acorn": "^8" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", - "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/add-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", - "integrity": "sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==", - "dev": true - }, - "node_modules/agent-base": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", - "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "dependencies": { - "string-width": "^4.1.0" - } - }, - "node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-sequence-parser": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz", - "integrity": "sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==", - "dev": true - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-ify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", - "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", - "dev": true - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/array.prototype.map": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/array.prototype.map/-/array.prototype.map-1.0.6.tgz", - "integrity": "sha512-nK1psgF2cXqP3wSyCSq0Hc7zwNq3sfljQqaG27r/7a7ooNUnn5nGq6yYWyks9jMO5EoFQ0ax80hSg6oXSRNXaw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-array-method-boxes-properly": "^1.0.0", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", - "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.2.1", - "get-intrinsic": "^1.2.3", - "is-array-buffer": "^3.0.4", - "is-shared-array-buffer": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ast-types": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", - "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", - "dependencies": { - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/async": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" - }, - "node_modules/async-retry": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", - "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", - "dev": true, - "dependencies": { - "retry": "0.13.1" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "bin": { - "atob": "bin/atob.js" - }, - "engines": { - "node": ">= 4.5.0" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axios": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", - "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/b4a": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.6.tgz", - "integrity": "sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==" - }, - "node_modules/babel-loader": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", - "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", - "dev": true, - "dependencies": { - "find-cache-dir": "^4.0.0", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0", - "webpack": ">=5" - } - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.10", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.10.tgz", - "integrity": "sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.1", - "semver": "^6.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz", - "integrity": "sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.1", - "core-js-compat": "^3.36.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.1.tgz", - "integrity": "sha512-JfTApdE++cgcTWjsiCQlLyFBMbTUft9ja17saCc93lgV33h4tuCVj7tlvu//qpLwaG+3yEz7/KhahGrUMkVq9g==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/bare-events": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.2.0.tgz", - "integrity": "sha512-Yyyqff4PIFfSuthCZqLlPISTWHmnQxoPuAvkmgzsJEmG3CesdIv6Xweayl0JkCZJSB2yYIdJyEz97tpxNhgjbg==", - "optional": true - }, - "node_modules/bare-fs": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.2.0.tgz", - "integrity": "sha512-+VhW202E9eTVGkX7p+TNXtZC4RTzj9JfJW7PtfIbZ7mIQ/QT9uOafQTx7lx2n9ERmWsXvLHF4hStAFn4gl2mQw==", - "optional": true, - "dependencies": { - "bare-events": "^2.0.0", - "bare-os": "^2.0.0", - "bare-path": "^2.0.0", - "streamx": "^2.13.0" - } - }, - "node_modules/bare-os": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.2.0.tgz", - "integrity": "sha512-hD0rOPfYWOMpVirTACt4/nK8mC55La12K5fY1ij8HAdfQakD62M+H4o4tpfKzVGLgRDTuk3vjA4GqGXXCeFbag==", - "optional": true - }, - "node_modules/bare-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.0.tgz", - "integrity": "sha512-DIIg7ts8bdRKwJRJrUMy/PICEaQZaPGZ26lsSx9MJSwIhSrcdHn7/C8W+XmnG/rKi6BaRcz+JO00CjZteybDtw==", - "optional": true, - "dependencies": { - "bare-os": "^2.1.0" - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/basic-ftp": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.4.tgz", - "integrity": "sha512-8PzkB0arJFV4jJWSGOYR+OEic6aeKMu/osRhBULN6RY0ykby6LKhbmuQ5ublvaas5BOwboah5D87nrHyuh8PPA==", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/before-after-hook": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", - "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", - "dev": true - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/boxen": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", - "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", - "dependencies": { - "ansi-align": "^3.0.0", - "camelcase": "^6.2.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.1", - "string-width": "^4.2.2", - "type-fest": "^0.20.2", - "widest-line": "^3.1.0", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "node_modules/browserslist": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "engines": { - "node": "*" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/bundle-name": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", - "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", - "dev": true, - "dependencies": { - "run-applescript": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cacheable-lookup": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", - "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", - "dev": true, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cacheable-request/node_modules/json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==" - }, - "node_modules/cacheable-request/node_modules/keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dependencies": { - "json-buffer": "3.0.0" - } - }, - "node_modules/cacheable-request/node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/cachedir": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz", - "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dev": true, - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001589", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001589.tgz", - "integrity": "sha512-vNQWS6kI+q6sBlHbh71IIeC+sRwK2N3EDySc/updIGhIee2x5z00J4c1242/5/d6EpEMdOnk/m+6tuk4/tcsqg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/catch-exit": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/catch-exit/-/catch-exit-1.2.2.tgz", - "integrity": "sha512-7rZ3CgzR3L3fDcEjtxj0bV6/zEhf9P7jkjm7ucMSTqBVhvCrwp+/Dbq26AqC+O0HxpIqY+pz9O+xKlvGqUBDmg==", - "dependencies": { - "human-signals": "2.1.0" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/chrome-launcher": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.2.tgz", - "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==", - "dependencies": { - "@types/node": "*", - "escape-string-regexp": "^4.0.0", - "is-wsl": "^2.2.0", - "lighthouse-logger": "^1.0.0" - }, - "bin": { - "print-chrome-path": "bin/print-chrome-path.js" - }, - "engines": { - "node": ">=12.13.0" - } - }, - "node_modules/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/chromium-bidi": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.5.19.tgz", - "integrity": "sha512-UA6zL77b7RYCjJkZBsZ0wlvCTD+jTjllZ8f6wdO4buevXgTZYjV+XLB9CiEa2OuuTGGTLnI7eN9I60YxuALGQg==", - "dependencies": { - "mitt": "3.0.1", - "urlpattern-polyfill": "10.0.0", - "zod": "3.22.4" - }, - "peerDependencies": { - "devtools-protocol": "*" - } - }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/clone-deep": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz", - "integrity": "sha512-we+NuQo2DHhSl+DP6jlUiAhyAjBQrYnpOk15rN6c6JSPScjiCLh8IbSU+VTcph6YS3o7mASE8a0+gbZ7ChLpgg==", - "dependencies": { - "for-own": "^0.1.3", - "is-plain-object": "^2.0.1", - "kind-of": "^3.0.2", - "lazy-cache": "^1.0.3", - "shallow-clone": "^0.1.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", - "dependencies": { - "mimic-response": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/color": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", - "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", - "dependencies": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" - }, - "engines": { - "node": ">=12.5.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true - }, - "node_modules/colorspace": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", - "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", - "dependencies": { - "color": "^3.1.3", - "text-hex": "1.0.x" - } - }, - "node_modules/colorspace/node_modules/color": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", - "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", - "dependencies": { - "color-convert": "^1.9.3", - "color-string": "^1.6.0" - } - }, - "node_modules/colorspace/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/colorspace/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/commitizen": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/commitizen/-/commitizen-4.3.0.tgz", - "integrity": "sha512-H0iNtClNEhT0fotHvGV3E9tDejDeS04sN1veIebsKYGMuGscFaswRoYJKmT3eW85eIJAs0F28bG2+a/9wCOfPw==", - "dev": true, - "dependencies": { - "cachedir": "2.3.0", - "cz-conventional-changelog": "3.3.0", - "dedent": "0.7.0", - "detect-indent": "6.1.0", - "find-node-modules": "^2.1.2", - "find-root": "1.1.0", - "fs-extra": "9.1.0", - "glob": "7.2.3", - "inquirer": "8.2.5", - "is-utf8": "^0.2.1", - "lodash": "4.17.21", - "minimist": "1.2.7", - "strip-bom": "4.0.0", - "strip-json-comments": "3.1.1" - }, - "bin": { - "commitizen": "bin/commitizen", - "cz": "bin/git-cz", - "git-cz": "bin/git-cz" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/commitizen/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/commitizen/node_modules/minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/common-path-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", - "dev": true - }, - "node_modules/compare-func": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", - "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", - "dev": true, - "dependencies": { - "array-ify": "^1.0.0", - "dot-prop": "^5.1.0" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "node_modules/concurrently": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz", - "integrity": "sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.2", - "date-fns": "^2.30.0", - "lodash": "^4.17.21", - "rxjs": "^7.8.1", - "shell-quote": "^1.8.1", - "spawn-command": "0.0.2", - "supports-color": "^8.1.1", - "tree-kill": "^1.2.2", - "yargs": "^17.7.2" - }, - "bin": { - "conc": "dist/bin/concurrently.js", - "concurrently": "dist/bin/concurrently.js" - }, - "engines": { - "node": "^14.13.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" - } - }, - "node_modules/concurrently/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", - "dev": true, - "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "node_modules/configstore": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", - "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", - "dev": true, - "dependencies": { - "dot-prop": "^6.0.1", - "graceful-fs": "^4.2.6", - "unique-string": "^3.0.0", - "write-file-atomic": "^3.0.3", - "xdg-basedir": "^5.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/yeoman/configstore?sponsor=1" - } - }, - "node_modules/configstore/node_modules/dot-prop": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", - "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", - "dev": true, - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/conventional-changelog": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-5.1.0.tgz", - "integrity": "sha512-aWyE/P39wGYRPllcCEZDxTVEmhyLzTc9XA6z6rVfkuCD2UBnhV/sgSOKbQrEG5z9mEZJjnopjgQooTKxEg8mAg==", - "dev": true, - "dependencies": { - "conventional-changelog-angular": "^7.0.0", - "conventional-changelog-atom": "^4.0.0", - "conventional-changelog-codemirror": "^4.0.0", - "conventional-changelog-conventionalcommits": "^7.0.2", - "conventional-changelog-core": "^7.0.0", - "conventional-changelog-ember": "^4.0.0", - "conventional-changelog-eslint": "^5.0.0", - "conventional-changelog-express": "^4.0.0", - "conventional-changelog-jquery": "^5.0.0", - "conventional-changelog-jshint": "^4.0.0", - "conventional-changelog-preset-loader": "^4.1.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/conventional-changelog-angular": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz", - "integrity": "sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==", - "dev": true, - "dependencies": { - "compare-func": "^2.0.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/conventional-changelog-atom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-4.0.0.tgz", - "integrity": "sha512-q2YtiN7rnT1TGwPTwjjBSIPIzDJCRE+XAUahWxnh+buKK99Kks4WLMHoexw38GXx9OUxAsrp44f9qXe5VEMYhw==", - "dev": true, - "engines": { - "node": ">=16" - } - }, - "node_modules/conventional-changelog-cli": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-cli/-/conventional-changelog-cli-4.1.0.tgz", - "integrity": "sha512-MscvILWZ6nWOoC+p/3Nn3D2cVLkjeQjyZPUr0bQ+vUORE/SPrkClJh8BOoMNpS4yk+zFJ5LlgXACxH6XGQoRXA==", - "dev": true, - "dependencies": { - "add-stream": "^1.0.0", - "conventional-changelog": "^5.1.0", - "meow": "^12.0.1", - "tempfile": "^5.0.0" - }, - "bin": { - "conventional-changelog": "cli.mjs" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/conventional-changelog-codemirror": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-4.0.0.tgz", - "integrity": "sha512-hQSojc/5imn1GJK3A75m9hEZZhc3urojA5gMpnar4JHmgLnuM3CUIARPpEk86glEKr3c54Po3WV/vCaO/U8g3Q==", - "dev": true, - "engines": { - "node": ">=16" - } - }, - "node_modules/conventional-changelog-conventionalcommits": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-7.0.2.tgz", - "integrity": "sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==", - "dev": true, - "dependencies": { - "compare-func": "^2.0.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/conventional-changelog-core": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-7.0.0.tgz", - "integrity": "sha512-UYgaB1F/COt7VFjlYKVE/9tTzfU3VUq47r6iWf6lM5T7TlOxr0thI63ojQueRLIpVbrtHK4Ffw+yQGduw2Bhdg==", - "dev": true, - "dependencies": { - "@hutson/parse-repository-url": "^5.0.0", - "add-stream": "^1.0.0", - "conventional-changelog-writer": "^7.0.0", - "conventional-commits-parser": "^5.0.0", - "git-raw-commits": "^4.0.0", - "git-semver-tags": "^7.0.0", - "hosted-git-info": "^7.0.0", - "normalize-package-data": "^6.0.0", - "read-pkg": "^8.0.0", - "read-pkg-up": "^10.0.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/conventional-changelog-ember": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-4.0.0.tgz", - "integrity": "sha512-D0IMhwcJUg1Y8FSry6XAplEJcljkHVlvAZddhhsdbL1rbsqRsMfGx/PIkPYq0ru5aDgn+OxhQ5N5yR7P9mfsvA==", - "dev": true, - "engines": { - "node": ">=16" - } - }, - "node_modules/conventional-changelog-eslint": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-5.0.0.tgz", - "integrity": "sha512-6JtLWqAQIeJLn/OzUlYmzd9fKeNSWmQVim9kql+v4GrZwLx807kAJl3IJVc3jTYfVKWLxhC3BGUxYiuVEcVjgA==", - "dev": true, - "engines": { - "node": ">=16" - } - }, - "node_modules/conventional-changelog-express": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-4.0.0.tgz", - "integrity": "sha512-yWyy5c7raP9v7aTvPAWzqrztACNO9+FEI1FSYh7UP7YT1AkWgv5UspUeB5v3Ibv4/o60zj2o9GF2tqKQ99lIsw==", - "dev": true, - "engines": { - "node": ">=16" - } - }, - "node_modules/conventional-changelog-jquery": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-5.0.0.tgz", - "integrity": "sha512-slLjlXLRNa/icMI3+uGLQbtrgEny3RgITeCxevJB+p05ExiTgHACP5p3XiMKzjBn80n+Rzr83XMYfRInEtCPPw==", - "dev": true, - "engines": { - "node": ">=16" - } - }, - "node_modules/conventional-changelog-jshint": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-4.0.0.tgz", - "integrity": "sha512-LyXq1bbl0yG0Ai1SbLxIk8ZxUOe3AjnlwE6sVRQmMgetBk+4gY9EO3d00zlEt8Y8gwsITytDnPORl8al7InTjg==", - "dev": true, - "dependencies": { - "compare-func": "^2.0.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/conventional-changelog-preset-loader": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-4.1.0.tgz", - "integrity": "sha512-HozQjJicZTuRhCRTq4rZbefaiCzRM2pr6u2NL3XhrmQm4RMnDXfESU6JKu/pnKwx5xtdkYfNCsbhN5exhiKGJA==", - "dev": true, - "engines": { - "node": ">=16" - } - }, - "node_modules/conventional-changelog-writer": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-7.0.1.tgz", - "integrity": "sha512-Uo+R9neH3r/foIvQ0MKcsXkX642hdm9odUp7TqgFS7BsalTcjzRlIfWZrZR1gbxOozKucaKt5KAbjW8J8xRSmA==", - "dev": true, - "dependencies": { - "conventional-commits-filter": "^4.0.0", - "handlebars": "^4.7.7", - "json-stringify-safe": "^5.0.1", - "meow": "^12.0.1", - "semver": "^7.5.2", - "split2": "^4.0.0" - }, - "bin": { - "conventional-changelog-writer": "cli.mjs" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/conventional-changelog-writer/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-writer/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-writer/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/conventional-commit-types": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/conventional-commit-types/-/conventional-commit-types-3.0.0.tgz", - "integrity": "sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==", - "dev": true - }, - "node_modules/conventional-commits-filter": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-4.0.0.tgz", - "integrity": "sha512-rnpnibcSOdFcdclpFwWa+pPlZJhXE7l+XK04zxhbWrhgpR96h33QLz8hITTXbcYICxVr3HZFtbtUAQ+4LdBo9A==", - "dev": true, - "engines": { - "node": ">=16" - } - }, - "node_modules/conventional-commits-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz", - "integrity": "sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==", - "dev": true, - "dependencies": { - "is-text-path": "^2.0.0", - "JSONStream": "^1.3.5", - "meow": "^12.0.1", - "split2": "^4.0.0" - }, - "bin": { - "conventional-commits-parser": "cli.mjs" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/core-js-compat": { - "version": "3.36.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.1.tgz", - "integrity": "sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==", - "dev": true, - "dependencies": { - "browserslist": "^4.23.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/cosmiconfig": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", - "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", - "dependencies": { - "env-paths": "^2.2.1", - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/cosmiconfig-typescript-loader": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-5.0.0.tgz", - "integrity": "sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==", - "dev": true, - "dependencies": { - "jiti": "^1.19.1" - }, - "engines": { - "node": ">=v16" - }, - "peerDependencies": { - "@types/node": "*", - "cosmiconfig": ">=8.2", - "typescript": ">=4" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-random-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", - "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", - "dev": true, - "dependencies": { - "type-fest": "^1.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/crypto-random-string/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cz-conventional-changelog": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/cz-conventional-changelog/-/cz-conventional-changelog-3.3.0.tgz", - "integrity": "sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==", - "dev": true, - "dependencies": { - "chalk": "^2.4.1", - "commitizen": "^4.0.3", - "conventional-commit-types": "^3.0.0", - "lodash.map": "^4.5.1", - "longest": "^2.0.1", - "word-wrap": "^1.0.3" - }, - "engines": { - "node": ">= 10" - }, - "optionalDependencies": { - "@commitlint/load": ">6.1.1" - } - }, - "node_modules/cz-conventional-changelog/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cz-conventional-changelog/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cz-conventional-changelog/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/cz-conventional-changelog/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/cz-conventional-changelog/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/cz-conventional-changelog/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/cz-conventional-changelog/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/dargs": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-8.1.0.tgz", - "integrity": "sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/data-uri-to-buffer": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", - "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", - "engines": { - "node": ">= 14" - } - }, - "node_modules/date-fns": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", - "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.21.0" - }, - "engines": { - "node": ">=0.11" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/date-fns" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", - "dependencies": { - "mimic-response": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", - "dev": true - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-browser": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", - "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", - "dev": true, - "dependencies": { - "bundle-name": "^4.1.0", - "default-browser-id": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser-id": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", - "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "dev": true, - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-lazy-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/degenerator": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", - "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", - "dependencies": { - "ast-types": "^0.13.4", - "escodegen": "^2.1.0", - "esprima": "^4.0.1" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/deprecation": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", - "dev": true - }, - "node_modules/detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/detect-indent": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", - "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/devtools-protocol": { - "version": "0.0.1286932", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1286932.tgz", - "integrity": "sha512-wu58HMQll9voDjR4NlPyoDEw1syfzaBNHymMMZ/QOXiHRNluOnDgu9hp1yHOKYoMlxCh4lSSiugLITe6Fvu1eA==", - "license": "BSD-3-Clause" - }, - "node_modules/diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/duplexer3": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", - "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==" - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, - "node_modules/electron-to-chromium": { - "version": "1.4.681", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.681.tgz", - "integrity": "sha512-1PpuqJUFWoXZ1E54m8bsLPVYwIVCRzvaL+n5cjigGga4z854abDnFRc+cTa2th4S79kyGqya/1xoR7h+Y5G5lg==", - "dev": true - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/enabled": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", - "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz", - "integrity": "sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/envinfo": { - "version": "7.11.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.1.tgz", - "integrity": "sha512-8PiZgZNIB4q/Lw4AhOvAfB/ityHAd2bli3lESSWmWSzSsl5dKpy5N1d1Rfkd2teq/g9xN90lc6o98DOjMeYHpg==", - "dev": true, - "bin": { - "envinfo": "dist/cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-abstract": { - "version": "1.22.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.4.tgz", - "integrity": "sha512-vZYJlk2u6qHYxBOTjAeg7qUxHdNfih64Uu2J8QqWgXZ2cri0ZpJAkzDUK/q593+mvKwlxyaxr6F1Q+3LKoQRgg==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", - "available-typed-arrays": "^1.0.6", - "call-bind": "^1.0.7", - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.2", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", - "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.1", - "internal-slot": "^1.0.7", - "is-array-buffer": "^3.0.4", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.13", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.0", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", - "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.1", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-array-method-boxes-properly": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", - "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", - "dev": true - }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", - "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", - "dev": true - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.4", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-goat": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", - "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/escodegen/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-prettier": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", - "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", - "dev": true, - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-plugin-header": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-header/-/eslint-plugin-header-3.1.1.tgz", - "integrity": "sha512-9vlKxuJ4qf793CmeeSrZUvVClw6amtpghq3CuWcB5cUNnWHQhgcqy5eF8oVKFk1G3Y/CbchGfEaw3wiIJaNmVg==", - "dev": true, - "peerDependencies": { - "eslint": ">=7.7.0" - } - }, - "node_modules/eslint-plugin-prettier": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", - "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", - "dev": true, - "dependencies": { - "prettier-linter-helpers": "^1.0.0" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "eslint": ">=7.28.0", - "prettier": ">=2.0.0" - }, - "peerDependenciesMeta": { - "eslint-config-prettier": { - "optional": true - } - } - }, - "node_modules/eslint-rule-composer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz", - "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/eslint/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", - "dev": true, - "dependencies": { - "homedir-polyfill": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/external-editor/node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - }, - "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" - } - }, - "node_modules/extract-zip/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-diff": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "dev": true - }, - "node_modules/fast-fifo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "dev": true, - "engines": { - "node": ">= 4.9.1" - } - }, - "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "dependencies": { - "pend": "~1.2.0" - } - }, - "node_modules/fecha": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", - "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" - }, - "node_modules/fetch-blob": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", - "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "paypal", - "url": "https://paypal.me/jimmywarting" - } - ], - "dependencies": { - "node-domexception": "^1.0.0", - "web-streams-polyfill": "^3.0.3" - }, - "engines": { - "node": "^12.20 || >= 14.13" - } - }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/figures/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/file-type": { - "version": "16.5.4", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.5.4.tgz", - "integrity": "sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==", - "dependencies": { - "readable-web-to-node-stream": "^3.0.0", - "strtok3": "^6.2.4", - "token-types": "^4.1.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/file-type?sponsor=1" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-cache-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", - "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", - "dev": true, - "dependencies": { - "common-path-prefix": "^3.0.0", - "pkg-dir": "^7.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-node-modules": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/find-node-modules/-/find-node-modules-2.1.3.tgz", - "integrity": "sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg==", - "dev": true, - "dependencies": { - "findup-sync": "^4.0.0", - "merge": "^2.1.1" - } - }, - "node_modules/find-root": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", - "dev": true - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/findup-sync": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz", - "integrity": "sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==", - "dev": true, - "dependencies": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^4.0.2", - "resolve-dir": "^1.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true, - "bin": { - "flat": "cli.js" - } - }, - "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "dev": true, - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true - }, - "node_modules/fn.name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", - "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" - }, - "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha512-SKmowqGTJoPzLO1T0BBJpkfp3EMacCMOuH40hOUbrbzElVktk4DioXVM99QkLCyKoiuOmyjgcWMpVz2xjE7LZw==", - "dependencies": { - "for-in": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/form-data-encoder": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", - "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", - "dev": true, - "engines": { - "node": ">= 14.17" - } - }, - "node_modules/formdata-polyfill": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", - "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", - "dev": true, - "dependencies": { - "fetch-blob": "^3.1.2" - }, - "engines": { - "node": ">=12.20.0" - } - }, - "node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/futoin-hkdf": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/futoin-hkdf/-/futoin-hkdf-1.5.3.tgz", - "integrity": "sha512-SewY5KdMpaoCeh7jachEWFsh1nNlaDjNHZXWqL5IGwtpEYHTgkr2+AMCgNwKWkcc0wpSYrZfR7he4WdmHFtDxQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-east-asian-width": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", - "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-uri": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.3.tgz", - "integrity": "sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==", - "dependencies": { - "basic-ftp": "^5.0.2", - "data-uri-to-buffer": "^6.0.2", - "debug": "^4.3.4", - "fs-extra": "^11.2.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/git-raw-commits": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-4.0.0.tgz", - "integrity": "sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==", - "dev": true, - "dependencies": { - "dargs": "^8.0.0", - "meow": "^12.0.1", - "split2": "^4.0.0" - }, - "bin": { - "git-raw-commits": "cli.mjs" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/git-semver-tags": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-7.0.1.tgz", - "integrity": "sha512-NY0ZHjJzyyNXHTDZmj+GG7PyuAKtMsyWSwh07CR2hOZFa+/yoTsXci/nF2obzL8UDhakFNkD9gNdt/Ed+cxh2Q==", - "dev": true, - "dependencies": { - "meow": "^12.0.1", - "semver": "^7.5.2" - }, - "bin": { - "git-semver-tags": "cli.mjs" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/git-semver-tags/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/git-semver-tags/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/git-semver-tags/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/git-up": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz", - "integrity": "sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==", - "dev": true, - "dependencies": { - "is-ssh": "^1.4.0", - "parse-url": "^8.1.0" - } - }, - "node_modules/git-url-parse": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-14.0.0.tgz", - "integrity": "sha512-NnLweV+2A4nCvn4U/m2AoYu0pPKlsmhK9cknG7IMwsjFY1S2jxM+mAhsDxyxfCIGfGaD+dozsyX4b6vkYc83yQ==", - "dev": true, - "dependencies": { - "git-up": "^7.0.0" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true - }, - "node_modules/global-directory": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz", - "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==", - "dev": true, - "dependencies": { - "ini": "4.1.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/global-directory/node_modules/ini": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", - "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "dependencies": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", - "dev": true, - "dependencies": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/global-prefix/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dependencies": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/got/node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "node_modules/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", - "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "bin": { - "he": "bin/he" - } - }, - "node_modules/homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dev": true, - "dependencies": { - "parse-passwd": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/hosted-git-info": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.1.tgz", - "integrity": "sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==", - "dev": true, - "dependencies": { - "lru-cache": "^10.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", - "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" - }, - "node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/http2-wrapper": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", - "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", - "dev": true, - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/http2-wrapper/node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/https-proxy-agent": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", - "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/husky": { - "version": "9.0.11", - "resolved": "https://registry.npmjs.org/husky/-/husky-9.0.11.tgz", - "integrity": "sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw==", - "dev": true, - "bin": { - "husky": "bin.mjs" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/typicode" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "engines": { - "node": ">=4" - } - }, - "node_modules/import-lazy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-local/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/import-local/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/import-local/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-local/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/import-local/node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/import-meta-resolve": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.0.0.tgz", - "integrity": "sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "node_modules/inquirer": { - "version": "8.2.5", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.5.tgz", - "integrity": "sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==", - "dev": true, - "dependencies": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.1", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.21", - "mute-stream": "0.0.8", - "ora": "^5.4.1", - "run-async": "^2.4.0", - "rxjs": "^7.5.5", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/internal-slot": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/ip-address": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", - "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", - "dependencies": { - "jsbn": "1.1.0", - "sprintf-js": "^1.1.3" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-ci": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", - "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", - "dev": true, - "dependencies": { - "ci-info": "^3.2.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-in-ci": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-in-ci/-/is-in-ci-0.1.0.tgz", - "integrity": "sha512-d9PXLEY0v1iJ64xLiQMJ51J128EYHAaOR4yZqQi8aHGfw6KgifM3/Viw1oZZ1GCVmb3gBuyhLyHj0HgR2DhSXQ==", - "dev": true, - "bin": { - "is-in-ci": "cli.js" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-inside-container": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", - "dev": true, - "dependencies": { - "is-docker": "^3.0.0" - }, - "bin": { - "is-inside-container": "cli.js" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-inside-container/node_modules/is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "dev": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "dev": true, - "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-installed-globally/node_modules/global-dirs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", - "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", - "dev": true, - "dependencies": { - "ini": "2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-installed-globally/node_modules/ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-npm": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.0.0.tgz", - "integrity": "sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-ssh": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.0.tgz", - "integrity": "sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==", - "dev": true, - "dependencies": { - "protocols": "^2.0.1" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-text-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-2.0.0.tgz", - "integrity": "sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==", - "dev": true, - "dependencies": { - "text-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", - "dev": true, - "dependencies": { - "which-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", - "dev": true - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/issue-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-7.0.0.tgz", - "integrity": "sha512-jgAw78HO3gs9UrKqJNQvfDj9Ouy8Mhu40fbEJ8yXff4MW8+/Fcn9iFjyWUQ6SKbX8ipPk3X5A3AyfYHRu6uVLw==", - "dev": true, - "dependencies": { - "lodash.capitalize": "^4.2.1", - "lodash.escaperegexp": "^4.1.2", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.uniqby": "^4.7.0" - }, - "engines": { - "node": "^18.17 || >=20.6.1" - } - }, - "node_modules/iterate-iterator": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/iterate-iterator/-/iterate-iterator-1.0.2.tgz", - "integrity": "sha512-t91HubM4ZDQ70M9wqp+pcNpu8OyJ9UAtXntT/Bcsvp5tZMnz9vRa+IunKXeI8AnfZMTv0jNuVEmGeLSMjVvfPw==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/iterate-value": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/iterate-value/-/iterate-value-1.0.2.tgz", - "integrity": "sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==", - "dev": true, - "dependencies": { - "es-get-iterator": "^1.0.2", - "iterate-iterator": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/jiti": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", - "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", - "dev": true, - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsbn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", - "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==" - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonc-parser": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", - "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", - "dev": true - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", - "dev": true, - "engines": [ - "node >= 0.2.0" - ] - }, - "node_modules/JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "dev": true, - "dependencies": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - }, - "bin": { - "JSONStream": "bin.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/kuler": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", - "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" - }, - "node_modules/latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", - "dependencies": { - "package-json": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lighthouse-logger": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz", - "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", - "dependencies": { - "debug": "^2.6.9", - "marky": "^1.2.2" - } - }, - "node_modules/lighthouse-logger/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/lighthouse-logger/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" - }, - "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true, - "engines": { - "node": ">=6.11.5" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "dev": true - }, - "node_modules/lodash.capitalize": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", - "integrity": "sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==", - "dev": true - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true - }, - "node_modules/lodash.escaperegexp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", - "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==", - "dev": true - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "dev": true - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", - "dev": true - }, - "node_modules/lodash.kebabcase": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", - "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==", - "dev": true - }, - "node_modules/lodash.map": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", - "integrity": "sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==", - "dev": true - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/lodash.mergewith": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", - "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", - "dev": true - }, - "node_modules/lodash.snakecase": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", - "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==", - "dev": true - }, - "node_modules/lodash.startcase": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", - "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", - "dev": true - }, - "node_modules/lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", - "dev": true - }, - "node_modules/lodash.uniqby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", - "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==", - "dev": true - }, - "node_modules/lodash.upperfirst": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz", - "integrity": "sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==", - "dev": true - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/logform": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.6.0.tgz", - "integrity": "sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ==", - "dependencies": { - "@colors/colors": "1.6.0", - "@types/triple-beam": "^1.3.2", - "fecha": "^4.2.0", - "ms": "^2.1.1", - "safe-stable-stringify": "^2.3.1", - "triple-beam": "^1.3.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/longest": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-2.0.1.tgz", - "integrity": "sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/lookpath": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/lookpath/-/lookpath-1.2.2.tgz", - "integrity": "sha512-k2Gmn8iV6qdME3ztZC2spubmQISimFOPLuQKiPaLcVdRz0IpdxrNClVepMlyTJlhodm/zG/VfbkWERm3kUIh+Q==", - "bin": { - "lookpath": "bin/lookpath.js" - }, - "engines": { - "npm": ">=6.13.4" - } - }, - "node_modules/lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/lunr": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", - "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", - "dev": true - }, - "node_modules/macos-release": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-3.2.0.tgz", - "integrity": "sha512-fSErXALFNsnowREYZ49XCdOHF8wOPWuFOGQrAhP7x5J/BqQv+B02cNsTykGpDgRVx43EKg++6ANmTaGTtW+hUA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "node_modules/marked": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", - "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", - "dev": true, - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/marky": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/marky/-/marky-1.2.5.tgz", - "integrity": "sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==" - }, - "node_modules/meow": { - "version": "12.1.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz", - "integrity": "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==", - "dev": true, - "engines": { - "node": ">=16.10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/merge": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/merge/-/merge-2.1.1.tgz", - "integrity": "sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==", - "dev": true - }, - "node_modules/merge-deep": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/merge-deep/-/merge-deep-3.0.3.tgz", - "integrity": "sha512-qtmzAS6t6grwEkNrunqTBdn0qKwFgNWvlxUbAV8es9M7Ot1EbyApytCnvE0jALPa46ZpKDUo527kKiaWplmlFA==", - "dependencies": { - "arr-union": "^3.1.0", - "clone-deep": "^0.2.4", - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/mitt": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", - "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==" - }, - "node_modules/mixin-object": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", - "integrity": "sha512-ALGF1Jt9ouehcaXaHhn6t1yGWRqGaHkPFndtFVHfZXOvkIZ/yoGaSi0AHVTafb3ZBGg4dr/bDwnaEKqCXzchMA==", - "dependencies": { - "for-in": "^0.1.3", - "is-extendable": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mixin-object/node_modules/for-in": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", - "integrity": "sha512-F0to7vbBSHP8E3l6dCjxNOLuSFAACIxFy3UehTUlG7svlXi37HHsDkyVcHo0Pq8QwrE+pXvWSVX3ZT1T9wAZ9g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mocha": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.4.0.tgz", - "integrity": "sha512-eqhGB8JKapEYcC4ytX/xrzKforgEc3j1pGlAXVy3eRwrtAy5/nIfT1SvgGzfN0XZZxeLq0aQWkOUAmqIJiv+bA==", - "dev": true, - "dependencies": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "8.1.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha.js" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/mocha/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/mocha/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/mocha/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/mocha/node_modules/minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mocha/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/mocha/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/mocha/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "node_modules/netmask": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", - "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/new-github-release-url": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/new-github-release-url/-/new-github-release-url-2.0.0.tgz", - "integrity": "sha512-NHDDGYudnvRutt/VhKFlX26IotXe1w0cmkDm6JGquh5bz/bDTw0LufSmH/GxTjEdpHEO+bVKFTwdrcGa/9XlKQ==", - "dev": true, - "dependencies": { - "type-fest": "^2.5.1" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/new-github-release-url/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/node-domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "github", - "url": "https://paypal.me/jimmywarting" - } - ], - "engines": { - "node": ">=10.5.0" - } - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", - "dev": true - }, - "node_modules/normalize-package-data": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.0.tgz", - "integrity": "sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==", - "dev": true, - "dependencies": { - "hosted-git-info": "^7.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/normalize-package-data/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/normalize-package-data/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/one-time": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", - "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", - "dependencies": { - "fn.name": "1.x.x" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz", - "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==", - "dev": true, - "dependencies": { - "default-browser": "^5.2.1", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "is-wsl": "^3.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open/node_modules/is-wsl": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", - "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", - "dev": true, - "dependencies": { - "is-inside-container": "^1.0.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, - "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dev": true, - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/os-name": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/os-name/-/os-name-5.1.0.tgz", - "integrity": "sha512-YEIoAnM6zFmzw3PQ201gCVCIWbXNyKObGlVvpAVvraAeOHnlYVKFssbA/riRX5R40WA6kKrZ7Dr7dWzO3nKSeQ==", - "dev": true, - "dependencies": { - "macos-release": "^3.1.0", - "windows-release": "^5.0.1" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/pac-proxy-agent": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.1.tgz", - "integrity": "sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==", - "dependencies": { - "@tootallnate/quickjs-emscripten": "^0.23.0", - "agent-base": "^7.0.2", - "debug": "^4.3.4", - "get-uri": "^6.0.1", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.2", - "pac-resolver": "^7.0.0", - "socks-proxy-agent": "^8.0.2" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/pac-resolver": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", - "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", - "dependencies": { - "degenerator": "^5.0.0", - "netmask": "^2.0.2" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "dependencies": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/parse-path": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.0.0.tgz", - "integrity": "sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==", - "dev": true, - "dependencies": { - "protocols": "^2.0.0" - } - }, - "node_modules/parse-url": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-8.1.0.tgz", - "integrity": "sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==", - "dev": true, - "dependencies": { - "parse-path": "^7.0.0" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/peek-readable": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-4.1.0.tgz", - "integrity": "sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==", - "engines": { - "node": ">=8" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pkg-dir": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", - "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", - "dev": true, - "dependencies": { - "find-up": "^6.3.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", - "dev": true, - "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", - "dev": true, - "dependencies": { - "p-locate": "^6.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "dev": true, - "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/pkg-dir/node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "dev": true, - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "dependencies": { - "fast-diff": "^1.1.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/pretty-quick": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pretty-quick/-/pretty-quick-4.0.0.tgz", - "integrity": "sha512-M+2MmeufXb/M7Xw3Afh1gxcYpj+sK0AxEfnfF958ktFeAyi5MsKY5brymVURQLgPLV1QaF5P4pb2oFJ54H3yzQ==", - "dev": true, - "dependencies": { - "execa": "^5.1.1", - "find-up": "^5.0.0", - "ignore": "^5.3.0", - "mri": "^1.2.0", - "picocolors": "^1.0.0", - "picomatch": "^3.0.1", - "tslib": "^2.6.2" - }, - "bin": { - "pretty-quick": "lib/cli.mjs" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "prettier": "^3.0.0" - } - }, - "node_modules/pretty-quick/node_modules/picomatch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-3.0.1.tgz", - "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/promise.allsettled": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/promise.allsettled/-/promise.allsettled-1.0.7.tgz", - "integrity": "sha512-hezvKvQQmsFkOdrZfYxUxkyxl8mgFQeT259Ajj9PXdbg9VzBCWrItOev72JyWxkCD5VSSqAeHmlN3tWx4DlmsA==", - "dev": true, - "dependencies": { - "array.prototype.map": "^1.0.5", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "iterate-value": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", - "dev": true - }, - "node_modules/protocols": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.1.tgz", - "integrity": "sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==", - "dev": true - }, - "node_modules/proxy-agent": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.4.0.tgz", - "integrity": "sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==", - "dependencies": { - "agent-base": "^7.0.2", - "debug": "^4.3.4", - "http-proxy-agent": "^7.0.1", - "https-proxy-agent": "^7.0.3", - "lru-cache": "^7.14.1", - "pac-proxy-agent": "^7.0.1", - "proxy-from-env": "^1.1.0", - "socks-proxy-agent": "^8.0.2" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/proxy-agent/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/pupa": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.1.0.tgz", - "integrity": "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==", - "dev": true, - "dependencies": { - "escape-goat": "^4.0.0" - }, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/puppeteer": { - "version": "22.10.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-22.10.0.tgz", - "integrity": "sha512-ZOkZd6a6t0BdKcWb0wAYHWQqCfdlN1PPnXOmg/XNrbo6gJhYWFX4qCNb6ahSn8TpAqBqLCoD4Q010F7GwOM7mA==", - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "@puppeteer/browsers": "2.2.3", - "cosmiconfig": "9.0.0", - "devtools-protocol": "0.0.1286932", - "puppeteer-core": "22.10.0" - }, - "bin": { - "puppeteer": "lib/esm/puppeteer/node/cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/puppeteer-core": { - "version": "22.10.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-22.10.0.tgz", - "integrity": "sha512-I54J4Vy4I07UHsgB1QSmuFoF7KNQjJWcvFBPhtY+ezMdBfwgGDr8dzYrJa11aPgP9kxIUHjhktcMmmfJkOAtTw==", - "license": "Apache-2.0", - "dependencies": { - "@puppeteer/browsers": "2.2.3", - "chromium-bidi": "0.5.19", - "debug": "4.3.4", - "devtools-protocol": "0.0.1286932", - "ws": "8.17.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/puppeteer-extra": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/puppeteer-extra/-/puppeteer-extra-3.3.6.tgz", - "integrity": "sha512-rsLBE/6mMxAjlLd06LuGacrukP2bqbzKCLzV1vrhHFavqQE/taQ2UXv3H5P0Ls7nsrASa+6x3bDbXHpqMwq+7A==", - "dependencies": { - "@types/debug": "^4.1.0", - "debug": "^4.1.1", - "deepmerge": "^4.2.2" - }, - "engines": { - "node": ">=8" - }, - "peerDependencies": { - "@types/puppeteer": "*", - "puppeteer": "*", - "puppeteer-core": "*" - }, - "peerDependenciesMeta": { - "@types/puppeteer": { - "optional": true - }, - "puppeteer": { - "optional": true - }, - "puppeteer-core": { - "optional": true - } - } - }, - "node_modules/puppeteer-extra-plugin": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/puppeteer-extra-plugin/-/puppeteer-extra-plugin-3.2.3.tgz", - "integrity": "sha512-6RNy0e6pH8vaS3akPIKGg28xcryKscczt4wIl0ePciZENGE2yoaQJNd17UiEbdmh5/6WW6dPcfRWT9lxBwCi2Q==", - "dependencies": { - "@types/debug": "^4.1.0", - "debug": "^4.1.1", - "merge-deep": "^3.0.1" - }, - "engines": { - "node": ">=9.11.2" - }, - "peerDependencies": { - "playwright-extra": "*", - "puppeteer-extra": "*" - }, - "peerDependenciesMeta": { - "playwright-extra": { - "optional": true - }, - "puppeteer-extra": { - "optional": true - } - } - }, - "node_modules/puppeteer-extra-plugin-stealth": { - "version": "2.11.2", - "resolved": "https://registry.npmjs.org/puppeteer-extra-plugin-stealth/-/puppeteer-extra-plugin-stealth-2.11.2.tgz", - "integrity": "sha512-bUemM5XmTj9i2ZerBzsk2AN5is0wHMNE6K0hXBzBXOzP5m5G3Wl0RHhiqKeHToe/uIH8AoZiGhc1tCkLZQPKTQ==", - "dependencies": { - "debug": "^4.1.1", - "puppeteer-extra-plugin": "^3.2.3", - "puppeteer-extra-plugin-user-preferences": "^2.4.1" - }, - "engines": { - "node": ">=8" - }, - "peerDependencies": { - "playwright-extra": "*", - "puppeteer-extra": "*" - }, - "peerDependenciesMeta": { - "playwright-extra": { - "optional": true - }, - "puppeteer-extra": { - "optional": true - } - } - }, - "node_modules/puppeteer-extra-plugin-user-data-dir": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/puppeteer-extra-plugin-user-data-dir/-/puppeteer-extra-plugin-user-data-dir-2.4.1.tgz", - "integrity": "sha512-kH1GnCcqEDoBXO7epAse4TBPJh9tEpVEK/vkedKfjOVOhZAvLkHGc9swMs5ChrJbRnf8Hdpug6TJlEuimXNQ+g==", - "dependencies": { - "debug": "^4.1.1", - "fs-extra": "^10.0.0", - "puppeteer-extra-plugin": "^3.2.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": ">=8" - }, - "peerDependencies": { - "playwright-extra": "*", - "puppeteer-extra": "*" - }, - "peerDependenciesMeta": { - "playwright-extra": { - "optional": true - }, - "puppeteer-extra": { - "optional": true - } - } - }, - "node_modules/puppeteer-extra-plugin-user-data-dir/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/puppeteer-extra-plugin-user-preferences": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/puppeteer-extra-plugin-user-preferences/-/puppeteer-extra-plugin-user-preferences-2.4.1.tgz", - "integrity": "sha512-i1oAZxRbc1bk8MZufKCruCEC3CCafO9RKMkkodZltI4OqibLFXF3tj6HZ4LZ9C5vCXZjYcDWazgtY69mnmrQ9A==", - "dependencies": { - "debug": "^4.1.1", - "deepmerge": "^4.2.2", - "puppeteer-extra-plugin": "^3.2.3", - "puppeteer-extra-plugin-user-data-dir": "^2.4.1" - }, - "engines": { - "node": ">=8" - }, - "peerDependencies": { - "playwright-extra": "*", - "puppeteer-extra": "*" - }, - "peerDependenciesMeta": { - "playwright-extra": { - "optional": true - }, - "puppeteer-extra": { - "optional": true - } - } - }, - "node_modules/qrcode-terminal": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz", - "integrity": "sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ==", - "bin": { - "qrcode-terminal": "bin/qrcode-terminal.js" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/queue-tick": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", - "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==" - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read-pkg": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-8.1.0.tgz", - "integrity": "sha512-PORM8AgzXeskHO/WEv312k9U03B8K9JSiWF/8N9sUuFjBa+9SF2u6K7VClzXwDXab51jCd8Nd36CNM+zR97ScQ==", - "dev": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.1", - "normalize-package-data": "^6.0.0", - "parse-json": "^7.0.0", - "type-fest": "^4.2.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-10.1.0.tgz", - "integrity": "sha512-aNtBq4jR8NawpKJQldrQcSW9y/d+KWH4v24HWkHljOZ7H0av+YTGANBzRh9A5pw7v/bLVsLVPpOhJ7gHNVy8lA==", - "dev": true, - "dependencies": { - "find-up": "^6.3.0", - "read-pkg": "^8.1.0", - "type-fest": "^4.2.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", - "dev": true, - "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", - "dev": true, - "dependencies": { - "p-locate": "^6.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "dev": true, - "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/read-pkg-up/node_modules/type-fest": { - "version": "4.10.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.10.3.tgz", - "integrity": "sha512-JLXyjizi072smKGGcZiAJDCNweT8J+AuRxmPZ1aG7TERg4ijx9REl8CNhbr36RV4qXqL1gO1FF9HL8OkVmmrsA==", - "dev": true, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg/node_modules/json-parse-even-better-errors": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.1.tgz", - "integrity": "sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/read-pkg/node_modules/lines-and-columns": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.4.tgz", - "integrity": "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/read-pkg/node_modules/parse-json": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-7.1.1.tgz", - "integrity": "sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.21.4", - "error-ex": "^1.3.2", - "json-parse-even-better-errors": "^3.0.0", - "lines-and-columns": "^2.0.3", - "type-fest": "^3.8.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg/node_modules/parse-json/node_modules/type-fest": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", - "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg/node_modules/type-fest": { - "version": "4.10.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.10.3.tgz", - "integrity": "sha512-JLXyjizi072smKGGcZiAJDCNweT8J+AuRxmPZ1aG7TERg4ijx9REl8CNhbr36RV4qXqL1gO1FF9HL8OkVmmrsA==", - "dev": true, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readable-web-to-node-stream": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", - "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", - "dependencies": { - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", - "dev": true, - "dependencies": { - "resolve": "^1.1.6" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/reflect-metadata": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.1.tgz", - "integrity": "sha512-i5lLI6iw9AU3Uu4szRNPPEkomnkjRTaVt9hy/bn5g/oSzekBSMeLZblcjP74AW0vBabqERLLIrz+gR8QYR54Tw==" - }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", - "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", - "dev": true, - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "dev": true - }, - "node_modules/regenerator-transform": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", - "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", - "dev": true, - "dependencies": { - "@babel/regjsgen": "^0.8.0", - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/registry-auth-token": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz", - "integrity": "sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==", - "dependencies": { - "rc": "1.2.8" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", - "dependencies": { - "rc": "^1.2.8" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "dev": true, - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/release-it": { - "version": "17.3.0", - "resolved": "https://registry.npmjs.org/release-it/-/release-it-17.3.0.tgz", - "integrity": "sha512-7t9a2WEwqQKCdteshZUrO/3RX60plS5CzYAFr5+4Zj8qvRx1pFOFVglJSz4BeFAEd2yejpPxfI60+qRUzLEDZw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/webpro" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/webpro" - } - ], - "license": "MIT", - "dependencies": { - "@iarna/toml": "2.2.5", - "@octokit/rest": "20.1.1", - "async-retry": "1.3.3", - "chalk": "5.3.0", - "cosmiconfig": "9.0.0", - "execa": "8.0.1", - "git-url-parse": "14.0.0", - "globby": "14.0.1", - "got": "13.0.0", - "inquirer": "9.2.22", - "is-ci": "3.0.1", - "issue-parser": "7.0.0", - "lodash": "4.17.21", - "mime-types": "2.1.35", - "new-github-release-url": "2.0.0", - "node-fetch": "3.3.2", - "open": "10.1.0", - "ora": "8.0.1", - "os-name": "5.1.0", - "promise.allsettled": "1.0.7", - "proxy-agent": "6.4.0", - "semver": "7.6.2", - "shelljs": "0.8.5", - "update-notifier": "7.0.0", - "url-join": "5.0.0", - "wildcard-match": "5.1.3", - "yargs-parser": "21.1.1" - }, - "bin": { - "release-it": "bin/release-it.js" - }, - "engines": { - "node": "^18.18.0 || ^20.8.0 || ^22.0.0" - } - }, - "node_modules/release-it/node_modules/@sindresorhus/is": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", - "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/release-it/node_modules/@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", - "dev": true, - "license": "MIT", - "dependencies": { - "defer-to-connect": "^2.0.1" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/release-it/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/release-it/node_modules/cacheable-request": { - "version": "10.2.14", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", - "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-cache-semantics": "^4.0.2", - "get-stream": "^6.0.1", - "http-cache-semantics": "^4.1.1", - "keyv": "^4.5.3", - "mimic-response": "^4.0.0", - "normalize-url": "^8.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/release-it/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/release-it/node_modules/cli-width": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", - "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 12" - } - }, - "node_modules/release-it/node_modules/data-uri-to-buffer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", - "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, - "node_modules/release-it/node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/release-it/node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/release-it/node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/release-it/node_modules/emoji-regex": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", - "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", - "dev": true, - "license": "MIT" - }, - "node_modules/release-it/node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/release-it/node_modules/execa/node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/release-it/node_modules/globby": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.1.tgz", - "integrity": "sha512-jOMLD2Z7MAhyG8aJpNOpmziMOP4rPLcc95oQPKXBazW82z+CEgPFBQvEpRUa1KeIMUJo4Wsm+q6uzO/Q/4BksQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sindresorhus/merge-streams": "^2.1.0", - "fast-glob": "^3.3.2", - "ignore": "^5.2.4", - "path-type": "^5.0.0", - "slash": "^5.1.0", - "unicorn-magic": "^0.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/release-it/node_modules/got": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/got/-/got-13.0.0.tgz", - "integrity": "sha512-XfBk1CxOOScDcMr9O1yKkNaQyy865NbYs+F7dr4H0LZMVgCj2Le59k6PqbNHoL5ToeaEQUYh6c6yMfVcc6SJxA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sindresorhus/is": "^5.2.0", - "@szmarczak/http-timer": "^5.0.1", - "cacheable-lookup": "^7.0.0", - "cacheable-request": "^10.2.8", - "decompress-response": "^6.0.0", - "form-data-encoder": "^2.1.2", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/release-it/node_modules/human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=16.17.0" - } - }, - "node_modules/release-it/node_modules/inquirer": { - "version": "9.2.22", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.22.tgz", - "integrity": "sha512-SqLLa/Oe5rZUagTR9z+Zd6izyatHglbmbvVofo1KzuVB54YHleWzeHNLoR7FOICGOeQSqeLh1cordb3MzhGcEw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/figures": "^1.0.2", - "@ljharb/through": "^2.3.13", - "ansi-escapes": "^4.3.2", - "chalk": "^5.3.0", - "cli-cursor": "^3.1.0", - "cli-width": "^4.1.0", - "external-editor": "^3.1.0", - "lodash": "^4.17.21", - "mute-stream": "1.0.0", - "ora": "^5.4.1", - "run-async": "^3.0.0", - "rxjs": "^7.8.1", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^6.2.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/release-it/node_modules/inquirer/node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/release-it/node_modules/inquirer/node_modules/ora/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/release-it/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/release-it/node_modules/lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/release-it/node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/release-it/node_modules/mimic-response": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", - "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/release-it/node_modules/mute-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", - "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/release-it/node_modules/node-fetch": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", - "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", - "dev": true, - "license": "MIT", - "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" - } - }, - "node_modules/release-it/node_modules/normalize-url": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz", - "integrity": "sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/release-it/node_modules/npm-run-path": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/release-it/node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/release-it/node_modules/ora": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-8.0.1.tgz", - "integrity": "sha512-ANIvzobt1rls2BDny5fWZ3ZVKyD6nscLvfFRpQgfWsythlcsVUC9kL0zq6j2Z5z9wwp1kd7wpsD/T9qNPVLCaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^5.3.0", - "cli-cursor": "^4.0.0", - "cli-spinners": "^2.9.2", - "is-interactive": "^2.0.0", - "is-unicode-supported": "^2.0.0", - "log-symbols": "^6.0.0", - "stdin-discarder": "^0.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/release-it/node_modules/ora/node_modules/cli-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", - "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", - "dev": true, - "license": "MIT", - "dependencies": { - "restore-cursor": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/release-it/node_modules/ora/node_modules/is-interactive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", - "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/release-it/node_modules/ora/node_modules/is-unicode-supported": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.0.0.tgz", - "integrity": "sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/release-it/node_modules/ora/node_modules/log-symbols": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", - "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^5.3.0", - "is-unicode-supported": "^1.3.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/release-it/node_modules/ora/node_modules/log-symbols/node_modules/is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/release-it/node_modules/ora/node_modules/string-width": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz", - "integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/release-it/node_modules/ora/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/release-it/node_modules/p-cancelable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.20" - } - }, - "node_modules/release-it/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/release-it/node_modules/path-type": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", - "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/release-it/node_modules/responselike": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", - "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", - "dev": true, - "license": "MIT", - "dependencies": { - "lowercase-keys": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/release-it/node_modules/restore-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", - "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", - "dev": true, - "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/release-it/node_modules/restore-cursor/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/release-it/node_modules/restore-cursor/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/release-it/node_modules/restore-cursor/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/release-it/node_modules/run-async": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", - "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/release-it/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/release-it/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/release-it/node_modules/slash": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/release-it/node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/release-it/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/release-it/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "dev": true - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", - "dev": true, - "dependencies": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", - "dependencies": { - "lowercase-keys": "^1.0.0" - } - }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/run-applescript": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", - "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dev": true, - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/safe-array-concat": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", - "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "get-intrinsic": "^1.2.2", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-regex": "^1.1.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-stable-stringify": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", - "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", - "engines": { - "node": ">=10" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "node_modules/sanitize-filename": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", - "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", - "dependencies": { - "truncate-utf8-bytes": "^1.0.0" - } - }, - "node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/semver-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", - "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", - "dev": true, - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semver-diff/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver-diff/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver-diff/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/set-function-length": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", - "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", - "dev": true, - "dependencies": { - "define-data-property": "^1.1.2", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "dev": true, - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/shallow-clone": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz", - "integrity": "sha512-J1zdXCky5GmNnuauESROVu31MQSnLoYvlyEn6j2Ztk6Q5EHFIhxkMhYcv6vuDzl2XEzoRr856QwzMgWM/TmZgw==", - "dependencies": { - "is-extendable": "^0.1.1", - "kind-of": "^2.0.1", - "lazy-cache": "^0.2.3", - "mixin-object": "^2.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/shallow-clone/node_modules/kind-of": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz", - "integrity": "sha512-0u8i1NZ/mg0b+W3MGGw5I7+6Eib2nx72S/QvXa0hYjEkjTknYmEYQJwGu3mLC0BrhtJjtQafTkyRUQ75Kx0LVg==", - "dependencies": { - "is-buffer": "^1.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/shallow-clone/node_modules/lazy-cache": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", - "integrity": "sha512-gkX52wvU/R8DVMMt78ATVPFMJqfW8FPz1GZ1sVHBVQHmu/WvhIWE4cE1GBzhJNFicDeYhnwp6Rl35BcAIM3YOQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sharp": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.4.tgz", - "integrity": "sha512-7i/dt5kGl7qR4gwPRD2biwD2/SvBn3O04J77XKFgL2OnZtQw+AG9wnuS/csmu80nPRHLYE9E41fyEiG8nhH6/Q==", - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "color": "^4.2.3", - "detect-libc": "^2.0.3", - "semver": "^7.6.0" - }, - "engines": { - "libvips": ">=8.15.2", - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.33.4", - "@img/sharp-darwin-x64": "0.33.4", - "@img/sharp-libvips-darwin-arm64": "1.0.2", - "@img/sharp-libvips-darwin-x64": "1.0.2", - "@img/sharp-libvips-linux-arm": "1.0.2", - "@img/sharp-libvips-linux-arm64": "1.0.2", - "@img/sharp-libvips-linux-s390x": "1.0.2", - "@img/sharp-libvips-linux-x64": "1.0.2", - "@img/sharp-libvips-linuxmusl-arm64": "1.0.2", - "@img/sharp-libvips-linuxmusl-x64": "1.0.2", - "@img/sharp-linux-arm": "0.33.4", - "@img/sharp-linux-arm64": "0.33.4", - "@img/sharp-linux-s390x": "0.33.4", - "@img/sharp-linux-x64": "0.33.4", - "@img/sharp-linuxmusl-arm64": "0.33.4", - "@img/sharp-linuxmusl-x64": "0.33.4", - "@img/sharp-wasm32": "0.33.4", - "@img/sharp-win32-ia32": "0.33.4", - "@img/sharp-win32-x64": "0.33.4" - } - }, - "node_modules/sharp/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "engines": { - "node": ">=8" - } - }, - "node_modules/shell-quote": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/shelljs": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", - "dev": true, - "dependencies": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "bin": { - "shjs": "bin/shjs" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/shiki": { - "version": "0.14.7", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.7.tgz", - "integrity": "sha512-dNPAPrxSc87ua2sKJ3H5dQ/6ZaY8RNnaAqK+t0eG7p0Soi2ydiqbGOTaZCqaYvA/uZYfS1LJnemt3Q+mSfcPCg==", - "dev": true, - "dependencies": { - "ansi-sequence-parser": "^1.1.0", - "jsonc-parser": "^3.2.0", - "vscode-oniguruma": "^1.7.0", - "vscode-textmate": "^8.0.0" - } - }, - "node_modules/shx": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/shx/-/shx-0.3.4.tgz", - "integrity": "sha512-N6A9MLVqjxZYcVn8hLmtneQWIJtp8IKzMP4eMnx+nqkvXoqinUPCbUFLp2UcWTEIUONhlk0ewxr/jaVGlc+J+g==", - "dev": true, - "dependencies": { - "minimist": "^1.2.3", - "shelljs": "^0.8.5" - }, - "bin": { - "shx": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/side-channel": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.5.tgz", - "integrity": "sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "node_modules/simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, - "node_modules/simple-swizzle/node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.1.tgz", - "integrity": "sha512-B6w7tkwNid7ToxjZ08rQMT8M9BJAf8DKx8Ft4NivzH0zBUfd6jldGcisJn/RLgxcX3FPNDdNQCUEMMT79b+oCQ==", - "dependencies": { - "ip-address": "^9.0.5", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz", - "integrity": "sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==", - "dependencies": { - "agent-base": "^7.0.2", - "debug": "^4.3.4", - "socks": "^2.7.1" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "devOptional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/spawn-command": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz", - "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==", - "dev": true - }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz", - "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==", - "dev": true - }, - "node_modules/split2": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", - "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", - "dev": true, - "engines": { - "node": ">= 10.x" - } - }, - "node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==" - }, - "node_modules/stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", - "engines": { - "node": "*" - } - }, - "node_modules/stdin-discarder": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", - "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/stop-iteration-iterator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", - "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", - "dev": true, - "dependencies": { - "internal-slot": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/streamx": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.16.1.tgz", - "integrity": "sha512-m9QYj6WygWyWa3H1YY69amr4nVgy61xfjys7xO7kviL5rfIEc2naf+ewFiOA+aEJD7y0JO3h2GoiUv4TDwEGzQ==", - "dependencies": { - "fast-fifo": "^1.1.0", - "queue-tick": "^1.0.1" - }, - "optionalDependencies": { - "bare-events": "^2.2.0" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", - "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strtok3": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-6.3.0.tgz", - "integrity": "sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==", - "dependencies": { - "@tokenizer/token": "^0.3.0", - "peek-readable": "^4.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/tar-fs": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.5.tgz", - "integrity": "sha512-JOgGAmZyMgbqpLwct7ZV8VzkEB6pxXFBVErLtb+XCOqzc6w1xiWKI9GVd6bwk68EX7eJ4DWmfXVmq8K2ziZTGg==", - "dependencies": { - "pump": "^3.0.0", - "tar-stream": "^3.1.5" - }, - "optionalDependencies": { - "bare-fs": "^2.1.1", - "bare-path": "^2.1.0" - } - }, - "node_modules/tar-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", - "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", - "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } - }, - "node_modules/temp-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-3.0.0.tgz", - "integrity": "sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==", - "dev": true, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/tempfile": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-5.0.0.tgz", - "integrity": "sha512-bX655WZI/F7EoTDw9JvQURqAXiPHi8o8+yFxPF2lWYyz1aHnmMRuXWqL6YB6GmeO0o4DIYWHLgGNi/X64T+X4Q==", - "dev": true, - "dependencies": { - "temp-dir": "^3.0.0" - }, - "engines": { - "node": ">=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/terser": { - "version": "5.28.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.28.1.tgz", - "integrity": "sha512-wM+bZp54v/E9eRRGXb5ZFDvinrJIOaTapx3WUokyVGZu5ucVCK55zEgGd5Dl2fSr3jUo5sDiERErUWLY6QPFyA==", - "dev": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.10", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", - "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.20", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.26.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/terser-webpack-plugin/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/terser-webpack-plugin/node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/text-extensions": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-2.4.0.tgz", - "integrity": "sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/text-hex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", - "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" - }, - "node_modules/tmp": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", - "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", - "engines": { - "node": ">=14.14" - } - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", - "engines": { - "node": ">=6" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/token-types": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/token-types/-/token-types-4.2.1.tgz", - "integrity": "sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==", - "dependencies": { - "@tokenizer/token": "^0.3.0", - "ieee754": "^1.2.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "bin": { - "tree-kill": "cli.js" - } - }, - "node_modules/triple-beam": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", - "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/truncate-utf8-bytes": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", - "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", - "dependencies": { - "utf8-byte-length": "^1.0.1" - } - }, - "node_modules/ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "dev": true, - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/ts-node/node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", - "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", - "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", - "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz", - "integrity": "sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/typedoc": { - "version": "0.25.13", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.25.13.tgz", - "integrity": "sha512-pQqiwiJ+Z4pigfOnnysObszLiU3mVLWAExSPf+Mu06G/qsc3wzbuM56SZQvONhHLncLUhYzOVkjFFpFfL5AzhQ==", - "dev": true, - "dependencies": { - "lunr": "^2.3.9", - "marked": "^4.3.0", - "minimatch": "^9.0.3", - "shiki": "^0.14.7" - }, - "bin": { - "typedoc": "bin/typedoc" - }, - "engines": { - "node": ">= 16" - }, - "peerDependencies": { - "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x" - } - }, - "node_modules/typedoc/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/typedoc/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/typescript": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", - "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/uglify-js": { - "version": "3.17.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", - "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", - "dev": true, - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/unbzip2-stream": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", - "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", - "dependencies": { - "buffer": "^5.2.1", - "through": "^2.3.8" - } - }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicorn-magic": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", - "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/unique-string": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", - "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", - "dev": true, - "dependencies": { - "crypto-random-string": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/universal-user-agent": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", - "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", - "dev": true - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/update-notifier": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-7.0.0.tgz", - "integrity": "sha512-Hv25Bh+eAbOLlsjJreVPOs4vd51rrtCrmhyOJtbpAojro34jS4KQaEp4/EvlHJX7jSO42VvEFpkastVyXyIsdQ==", - "dev": true, - "dependencies": { - "boxen": "^7.1.1", - "chalk": "^5.3.0", - "configstore": "^6.0.0", - "import-lazy": "^4.0.0", - "is-in-ci": "^0.1.0", - "is-installed-globally": "^0.4.0", - "is-npm": "^6.0.0", - "latest-version": "^7.0.0", - "pupa": "^3.1.0", - "semver": "^7.5.4", - "semver-diff": "^4.0.0", - "xdg-basedir": "^5.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/yeoman/update-notifier?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/@sindresorhus/is": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", - "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", - "dev": true, - "dependencies": { - "defer-to-connect": "^2.0.1" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/update-notifier/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/boxen": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz", - "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==", - "dev": true, - "dependencies": { - "ansi-align": "^3.0.1", - "camelcase": "^7.0.1", - "chalk": "^5.2.0", - "cli-boxes": "^3.0.0", - "string-width": "^5.1.2", - "type-fest": "^2.13.0", - "widest-line": "^4.0.1", - "wrap-ansi": "^8.1.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/update-notifier/node_modules/cacheable-request": { - "version": "10.2.14", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", - "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", - "dev": true, - "dependencies": { - "@types/http-cache-semantics": "^4.0.2", - "get-stream": "^6.0.1", - "http-cache-semantics": "^4.1.1", - "keyv": "^4.5.3", - "mimic-response": "^4.0.0", - "normalize-url": "^8.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/update-notifier/node_modules/camelcase": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", - "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/update-notifier/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/cli-boxes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", - "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/update-notifier/node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/update-notifier/node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/update-notifier/node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/update-notifier/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/update-notifier/node_modules/got": { - "version": "12.6.1", - "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", - "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", - "dev": true, - "dependencies": { - "@sindresorhus/is": "^5.2.0", - "@szmarczak/http-timer": "^5.0.1", - "cacheable-lookup": "^7.0.0", - "cacheable-request": "^10.2.8", - "decompress-response": "^6.0.0", - "form-data-encoder": "^2.1.2", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/latest-version": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", - "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", - "dev": true, - "dependencies": { - "package-json": "^8.1.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/update-notifier/node_modules/lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/update-notifier/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/update-notifier/node_modules/mimic-response": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", - "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/update-notifier/node_modules/normalize-url": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", - "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/update-notifier/node_modules/p-cancelable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", - "dev": true, - "engines": { - "node": ">=12.20" - } - }, - "node_modules/update-notifier/node_modules/package-json": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.1.tgz", - "integrity": "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==", - "dev": true, - "dependencies": { - "got": "^12.1.0", - "registry-auth-token": "^5.0.1", - "registry-url": "^6.0.0", - "semver": "^7.3.7" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/update-notifier/node_modules/registry-auth-token": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", - "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==", - "dev": true, - "dependencies": { - "@pnpm/npm-conf": "^2.1.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/update-notifier/node_modules/registry-url": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", - "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", - "dev": true, - "dependencies": { - "rc": "1.2.8" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/update-notifier/node_modules/responselike": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", - "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", - "dev": true, - "dependencies": { - "lowercase-keys": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/update-notifier/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/update-notifier/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/update-notifier/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/update-notifier/node_modules/widest-line": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", - "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", - "dev": true, - "dependencies": { - "string-width": "^5.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/update-notifier/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/url-join": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-5.0.0.tgz", - "integrity": "sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", - "dependencies": { - "prepend-http": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/urlpattern-polyfill": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", - "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==" - }, - "node_modules/utf8-byte-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", - "integrity": "sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==" - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/vscode-oniguruma": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", - "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==", - "dev": true - }, - "node_modules/vscode-textmate": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz", - "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==", - "dev": true - }, - "node_modules/watchpack": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", - "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", - "dev": true, - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dev": true, - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/web-streams-polyfill": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", - "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/webpack": { - "version": "5.91.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.91.0.tgz", - "integrity": "sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==", - "dev": true, - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.5", - "@webassemblyjs/ast": "^1.12.1", - "@webassemblyjs/wasm-edit": "^1.12.1", - "@webassemblyjs/wasm-parser": "^1.12.1", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.21.10", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.16.0", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.11", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.10", - "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-cli": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", - "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", - "dev": true, - "dependencies": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^2.1.1", - "@webpack-cli/info": "^2.0.2", - "@webpack-cli/serve": "^2.0.5", - "colorette": "^2.0.14", - "commander": "^10.0.1", - "cross-spawn": "^7.0.3", - "envinfo": "^7.7.3", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^3.1.1", - "rechoir": "^0.8.0", - "webpack-merge": "^5.7.3" - }, - "bin": { - "webpack-cli": "bin/cli.js" - }, - "engines": { - "node": ">=14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "5.x.x" - }, - "peerDependenciesMeta": { - "@webpack-cli/generators": { - "optional": true - }, - "webpack-bundle-analyzer": { - "optional": true - }, - "webpack-dev-server": { - "optional": true - } - } - }, - "node_modules/webpack-cli/node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "dev": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/webpack-cli/node_modules/interpret": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", - "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", - "dev": true, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack-cli/node_modules/rechoir": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", - "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", - "dev": true, - "dependencies": { - "resolve": "^1.20.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/webpack-merge": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", - "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", - "dev": true, - "dependencies": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/webpack-merge/node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-merge/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-merge/node_modules/shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/webpack/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/webpack/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz", - "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.6", - "call-bind": "^1.0.5", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "dependencies": { - "string-width": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wildcard": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", - "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", - "dev": true - }, - "node_modules/wildcard-match": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/wildcard-match/-/wildcard-match-5.1.3.tgz", - "integrity": "sha512-a95hPUk+BNzSGLntNXYxsjz2Hooi5oL7xOfJR6CKwSsSALh7vUNuTlzsrZowtYy38JNduYFRVhFv19ocqNOZlg==", - "dev": true - }, - "node_modules/windows-release": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-5.1.1.tgz", - "integrity": "sha512-NMD00arvqcq2nwqc5Q6KtrSRHK+fVD31erE5FEMahAw5PmVCgD7MUXodq3pdZSUkqA9Cda2iWx6s1XYwiJWRmw==", - "dev": true, - "dependencies": { - "execa": "^5.1.1" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/winston": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.13.0.tgz", - "integrity": "sha512-rwidmA1w3SE4j0E5MuIufFhyJPBDG7Nu71RkZor1p2+qHvJSZ9GYDA81AyleQcZbh/+V6HjeBdfnTZJm9rSeQQ==", - "dependencies": { - "@colors/colors": "^1.6.0", - "@dabh/diagnostics": "^2.0.2", - "async": "^3.2.3", - "is-stream": "^2.0.0", - "logform": "^2.4.0", - "one-time": "^1.0.0", - "readable-stream": "^3.4.0", - "safe-stable-stringify": "^2.3.1", - "stack-trace": "0.0.x", - "triple-beam": "^1.3.0", - "winston-transport": "^4.7.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/winston-transport": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.7.0.tgz", - "integrity": "sha512-ajBj65K5I7denzer2IYW6+2bNIVqLGDHqDw3Ow8Ohh+vdW+rv4MZ6eiDvHoKhfJFZ2auyN8byXieDDJ96ViONg==", - "dependencies": { - "logform": "^2.3.2", - "readable-stream": "^3.6.0", - "triple-beam": "^1.3.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true - }, - "node_modules/workerpool": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", - "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", - "dev": true - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/ws": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.0.tgz", - "integrity": "sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xdg-basedir": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", - "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dev": true, - "dependencies": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "engines": { - "node": ">=12" - } - }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zod": { - "version": "3.22.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", - "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - } - } -} diff --git a/package.json b/package.json deleted file mode 100644 index 8af82d079..000000000 --- a/package.json +++ /dev/null @@ -1,135 +0,0 @@ -{ - "name": "@wppconnect-team/wppconnect", - "version": "1.31.0", - "description": "WPPConnect is an open source project developed by the JavaScript community with the aim of exporting functions from WhatsApp Web to the node, which can be used to support the creation of any interaction, such as customer service, media sending, intelligence recognition based on phrases artificial and many other things, use your imagination... 😀🤔💭", - "main": "dist/index.js", - "types": "dist/index.d.ts", - "scripts": { - "build:client": "tsc", - "build:wapi": "cd src/lib/wapi/ && webpack", - "build": "npm run build:wapi && npm run build:client", - "changelog:last": "conventional-changelog -p angular -r 2", - "changelog:preview": "conventional-changelog -p angular -u", - "changelog:update": "conventional-changelog -p angular -i CHANGELOG.md -s", - "clean": "shx rm -rf session dist", - "commit": "cz", - "docs:build": "npm run docs:clean && typedoc && npm run docs:copy-images", - "docs:clean": "shx rm -rf api-docs", - "docs:copy-images": "shx cp -R ./img ./api-docs", - "lint:js": "npx eslint -c .eslintrc.js --ext .js src", - "lint:ts": "npx eslint -c .eslintrc.js --ext .ts src", - "lint": "npm run lint:ts && npm run lint:js", - "prepare": "husky install && npm run clean && npm run build", - "release": "release-it", - "start": "npm run build:client && tsc app.ts && node app.js", - "test": "mocha -r ts-node/register src/tests/**/*.test.ts", - "watch": "concurrently \"npm run build:wapi -- --mode=development -w -d eval-source-map\" \"npm run build:client -- -w --sourceMap\"" - }, - "config": { - "commitizen": { - "path": "@commitlint/cz-commitlint" - } - }, - "repository": { - "type": "git", - "url": "git+https://github.com/wppconnect-team/wppconnect.git" - }, - "keywords": [ - "whatsapp", - "javascript", - "bot", - "chat bot", - "bot", - "typescript", - "automatization", - "puppeteer" - ], - "author": "wppconnect-team", - "license": "LGPL-3.0-or-later", - "bugs": { - "url": "https://github.com/wppconnect-team/wppconnect/issues" - }, - "publishConfig": { - "access": "public" - }, - "homepage": "https://github.com/wppconnect-team/wppconnect#readme", - "devDependencies": { - "@babel/core": "^7.24.7", - "@babel/eslint-parser": "^7.24.7", - "@babel/eslint-plugin": "^7.24.7", - "@babel/preset-env": "^7.24.7", - "@commitlint/cli": "^19.3.0", - "@commitlint/config-conventional": "^19.2.2", - "@commitlint/cz-commitlint": "^19.2.0", - "@types/atob": "^2.1.4", - "@types/mime-types": "^2.1.4", - "@types/mocha": "^10.0.6", - "@types/node": "^18.19.34", - "@types/rimraf": "^4.0.5", - "@types/sharp": "^0.32.0", - "@types/shelljs": "^0.8.15", - "@types/tmp": "^0.2.6", - "@types/ws": "^8.5.10", - "@typescript-eslint/eslint-plugin": "^5.62.0", - "@typescript-eslint/parser": "^5.62.0", - "babel-loader": "^9.1.3", - "commitizen": "^4.3.0", - "concurrently": "^8.2.2", - "conventional-changelog-cli": "^4.1.0", - "eslint": "^8.57.0", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-header": "^3.1.1", - "eslint-plugin-prettier": "^4.2.1", - "husky": "^9.0.11", - "mocha": "^10.4.0", - "prettier": "^2.8.8", - "pretty-quick": "^4.0.0", - "regenerator-runtime": "^0.14.1", - "release-it": "^17.3.0", - "shx": "^0.3.4", - "ts-node": "^10.9.2", - "typedoc": "^0.25.13", - "typescript": "^5.4.5", - "webpack": "^5.91.0", - "webpack-cli": "^5.1.4" - }, - "dependencies": { - "@wppconnect/wa-js": "^3.3.1", - "@wppconnect/wa-version": "^1.4.213", - "atob": "^2.1.2", - "axios": "^1.7.2", - "boxen": "^5.1.2", - "catch-exit": "^1.2.2", - "chalk": "~4.1.2", - "chrome-launcher": "^0.15.2", - "execa": "^5.1.1", - "file-type": "~16.5.4", - "futoin-hkdf": "^1.5.3", - "latest-version": "^5.1.0", - "logform": "^2.6.0", - "lookpath": "^1.2.2", - "mime-types": "^2.1.35", - "puppeteer": "^22.10.0", - "puppeteer-extra": "^3.3.6", - "puppeteer-extra-plugin-stealth": "^2.11.2", - "puppeteer-extra-plugin-user-data-dir": "^2.4.1", - "puppeteer-extra-plugin-user-preferences": "^2.4.1", - "qrcode-terminal": "^0.12.0", - "reflect-metadata": "^0.2.1", - "rimraf": "^3.0.2", - "sanitize-filename": "^1.6.3", - "sharp": "0.33.4", - "tmp": "^0.2.3", - "tree-kill": "^1.2.2", - "winston": "^3.13.0", - "ws": "^8.17.0" - }, - "optionalDependencies": { - "@img/sharp-win32-x64": "^0.33.4", - "fsevents": "^2.3.3" - }, - "directories": { - "doc": "docs", - "example": "examples" - } -} diff --git a/src/api/helpers/base64-mimetype.ts b/src/api/helpers/base64-mimetype.ts deleted file mode 100644 index ce746dd97..000000000 --- a/src/api/helpers/base64-mimetype.ts +++ /dev/null @@ -1,30 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export function base64MimeType(encoded: string) { - let result = null; - if (typeof encoded !== 'string') { - return result; - } - - const mime = encoded.match(/data:([a-zA-Z0-9]+\/[a-zA-Z0-9-.+]+).*,.*/); - if (mime && mime.length) { - result = mime[1]; - } - - return result; -} diff --git a/src/api/helpers/decrypt.ts b/src/api/helpers/decrypt.ts deleted file mode 100644 index e80f210cd..000000000 --- a/src/api/helpers/decrypt.ts +++ /dev/null @@ -1,112 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -import * as crypto from 'crypto'; -import hkdf from 'futoin-hkdf'; -import atob = require('atob'); -import { ResponseType } from 'axios'; - -export const makeOptions = (useragentOverride: string) => ({ - responseType: 'arraybuffer' as ResponseType, - headers: { - 'User-Agent': processUA(useragentOverride), - DNT: '1', - 'Upgrade-Insecure-Requests': '1', - origin: 'https://web.whatsapp.com/', - referer: 'https://web.whatsapp.com/', - }, -}); - -export const timeout = (ms: number) => - new Promise((res) => setTimeout(res, ms)); -export const mediaTypes = { - IMAGE: 'Image', - VIDEO: 'Video', - AUDIO: 'Audio', - PTT: 'Audio', - DOCUMENT: 'Document', - STICKER: 'Image', -}; - -const processUA = (userAgent: string) => { - let ua = - userAgent || - 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.63 Safari/537.36'; - if (!ua.includes('WhatsApp')) ua = 'WhatsApp/2.16.352 ' + ua; - return ua; -}; - -export const magix = ( - fileData: any, - mediaKeyBase64: any, - mediaType: any, - expectedSize?: number -) => { - const encodedHex = fileData.toString('hex'); - const encodedBytes = hexToBytes(encodedHex); - const mediaKeyBytes: any = base64ToBytes(mediaKeyBase64); - const info = `WhatsApp ${mediaTypes[mediaType.toUpperCase()]} Keys`; - const hash: string = 'sha256'; - const salt: any = new Uint8Array(32); - const expandedSize = 112; - const mediaKeyExpanded = hkdf(mediaKeyBytes, expandedSize, { - salt, - info, - hash, - }); - const iv = mediaKeyExpanded.slice(0, 16); - const cipherKey = mediaKeyExpanded.slice(16, 48); - const decipher = crypto.createDecipheriv('aes-256-cbc', cipherKey, iv); - const decoded: Buffer = decipher.update(encodedBytes); - const mediaDataBuffer = expectedSize - ? fixPadding(decoded, expectedSize) - : decoded; - return mediaDataBuffer; -}; - -const fixPadding = (data: Buffer, expectedSize: number) => { - let padding = (16 - (expectedSize % 16)) & 0xf; - if (padding > 0) { - if (expectedSize + padding == data.length) { - // console.log(`trimmed: ${padding} bytes`); - data = data.slice(0, data.length - padding); - } else if (data.length + padding == expectedSize) { - // console.log(`adding: ${padding} bytes`); - let arr = new Uint16Array(padding).map((b) => padding); - data = Buffer.concat([data, Buffer.from(arr)]); - } - } - //@ts-ignore - return Buffer.from(data, 'utf-8'); -}; - -const hexToBytes = (hexStr: any) => { - const intArray = []; - for (let i = 0; i < hexStr.length; i += 2) { - intArray.push(parseInt(hexStr.substr(i, 2), 16)); - } - return new Uint8Array(intArray); -}; - -const base64ToBytes = (base64Str: any) => { - const binaryStr = atob(base64Str); - const byteArray = new Uint8Array(binaryStr.length); - for (let i = 0; i < binaryStr.length; i++) { - byteArray[i] = binaryStr.charCodeAt(i); - } - return byteArray; -}; diff --git a/src/api/helpers/download-file.ts b/src/api/helpers/download-file.ts deleted file mode 100644 index b0c86eb98..000000000 --- a/src/api/helpers/download-file.ts +++ /dev/null @@ -1,61 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -import axios from 'axios'; - -export async function downloadFileToBase64( - _path: string, - _mines: (string | RegExp)[] = [] -): Promise { - if (!Array.isArray(_mines)) { - console.error(`set mines string array, not "${typeof _mines}" `); - return false; - } - - const reHttp = /^https?:/; - - if (!reHttp.test(_path)) { - return false; - } - - try { - const response = await axios.get(_path, { - responseType: 'arraybuffer', - }); - - const mimeType = response.headers['content-type']; - - if (_mines.length) { - const isValidMime = _mines.some((m) => { - if (typeof m === 'string') { - return m === mimeType; - } - return m.exec(mimeType); - }); - if (!isValidMime) { - console.error(`Content-Type "${mimeType}" of ${_path} is not allowed`); - return false; - } - } - - const content = Buffer.from(response.data, 'binary').toString('base64'); - - return `data:${mimeType};base64,${content}`; - } catch (error) {} - - return false; -} diff --git a/src/api/helpers/evaluate-and-return.ts b/src/api/helpers/evaluate-and-return.ts deleted file mode 100644 index 2cf9e8024..000000000 --- a/src/api/helpers/evaluate-and-return.ts +++ /dev/null @@ -1,146 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -import { Page } from 'puppeteer'; - -import { - EvaluateFn, - EvaluateFnReturnType, - SerializableOrJSHandle, -} from '../../types/Evaluate'; - -//EvaluateFn, EvaluateFnReturnType, SerializableOrJSHandle // - -export async function evaluateAndReturn( - page: Page, - pageFunction: T, - ...args: SerializableOrJSHandle[] -): Promise< - EvaluateFnReturnType extends PromiseLike - ? U - : EvaluateFnReturnType -> { - // See https://github.com/puppeteer/puppeteer/blob/41f23beb0da2433cf9103e5d8fc22a03b1820336/src/common/ExecutionContext.ts#L196 - - let functionText = pageFunction.toString(); - try { - new Function('(' + functionText + ')'); - } catch (error) { - // This means we might have a function shorthand. Try another - // time prefixing 'function '. - if (functionText.startsWith('async ')) { - functionText = - 'async function ' + functionText.substring('async '.length); - } else { - functionText = 'function ' + functionText; - } - try { - new Function('(' + functionText + ')'); - } catch (error) { - // We tried hard to serialize, but there's a weird beast here. - throw new Error('Passed function is not well-serializable!'); - } - } - - /** - * Polyfill async/await and promise converter - * See https://github.com/basarat/typescript-book/blob/master/docs/async-await.md - */ - const func = new Function(` - var __assign = (this && this.__assign) || function () { - __assign = Object.assign || function(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) - t[p] = s[p]; - } - return t; - }; - return __assign.apply(this, arguments); - }; - - var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - var __generator = (this && this.__generator) || function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } - }; - var _this; // for arrow function - - return new Promise(async (resolve) => { - try { - return resolve(await (${functionText}).apply(this, arguments)); - } catch (error) { - return resolve({ - __error: JSON.parse(JSON.stringify(error, Object.getOwnPropertyNames(error))), - }); - } - });`); - - const result = (await page.evaluate(func as any, ...args)) as any; - - if (result !== null && typeof result === 'object' && '__error' in result) { - const errorMessage = - result.__error.message || JSON.stringify(result.__error); - - const error = new Error(errorMessage); - - Object.assign(error, result.__error); - - let jsStack = error.stack; - Error.captureStackTrace(error); - if (jsStack) { - error.stack = `${ - error.stack || '' - }\nJS Stack: ${jsStack}\nFunction: ${functionText}`; - } - - throw error; - } - - return result; -} diff --git a/src/api/helpers/exposed.enum.ts b/src/api/helpers/exposed.enum.ts deleted file mode 100644 index 581a0914e..000000000 --- a/src/api/helpers/exposed.enum.ts +++ /dev/null @@ -1,30 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export enum ExposedFn { - OnMessage = 'onMessage', - OnAnyMessage = 'onAnyMessage', - onAck = 'onAck', - onNotificationMessage = 'onNotificationMessage', - onParticipantsChanged = 'onParticipantsChanged', - onStateChange = 'onStateChange', - onStreamChange = 'onStreamChange', - onIncomingCall = 'onIncomingCall', - onInterfaceChange = 'onInterfaceChange', - onPresenceChanged = 'onPresenceChanged', - onLiveLocation = 'onLiveLocation', -} diff --git a/src/api/helpers/file-to-base64.ts b/src/api/helpers/file-to-base64.ts deleted file mode 100644 index 0e7eea459..000000000 --- a/src/api/helpers/file-to-base64.ts +++ /dev/null @@ -1,54 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -import * as mimeTypes from 'mime-types'; -import * as fileType from 'file-type'; -import * as fs from 'fs'; - -/** - * Converts given file into base64 string - * @param path file path - * @param mime Optional, will retrieve file mime automatically if not defined (Example: 'image/png') - */ -export async function fileToBase64(path: string, mime?: string | false) { - if (fs.existsSync(path)) { - const base64 = fs.readFileSync(path, { encoding: 'base64' }); - if (mime === undefined) { - mime = mimeTypes.lookup(path); - } - if (!mime) { - const result = await fileType.fromFile(path); - mime = result?.mime; - } - if (!mime) { - mime = 'application/octet-stream'; - } - const data = `data:${mime};base64,${base64}`; - return data; - } else { - return false; - } -} - -export async function Mine(path: string) { - if (fs.existsSync(path)) { - const mime = await mimeTypes.lookup(path); - return mime; - } else { - return false; - } -} diff --git a/src/api/helpers/filename-from-mimetype.ts b/src/api/helpers/filename-from-mimetype.ts deleted file mode 100644 index cb8ab8474..000000000 --- a/src/api/helpers/filename-from-mimetype.ts +++ /dev/null @@ -1,33 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -import * as path from 'path'; -import * as mime from 'mime-types'; - -export function filenameFromMimeType( - filename: string, - mimeType: string -): string { - const filenameExtension = path.extname(filename); - const mimeExtension = mime.extension(mimeType); - - if (!mimeExtension || filenameExtension === mimeExtension) { - return filename; - } - - return path.basename(filename, filenameExtension) + '.' + mimeExtension; -} diff --git a/src/api/helpers/index.ts b/src/api/helpers/index.ts deleted file mode 100644 index 5c777e35f..000000000 --- a/src/api/helpers/index.ts +++ /dev/null @@ -1,24 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export { fileToBase64 } from './file-to-base64'; -export { base64MimeType } from './base64-mimetype'; -export { downloadFileToBase64 } from './download-file'; -export { stickerSelect, resizeImg } from './select-sticker'; -export { scrapeImg } from './scrape-img-qr'; -export { scrapeLogin } from './scrape-login'; -export { evaluateAndReturn } from './evaluate-and-return'; diff --git a/src/api/helpers/scrape-img-qr.ts b/src/api/helpers/scrape-img-qr.ts deleted file mode 100644 index a5d93ace7..000000000 --- a/src/api/helpers/scrape-img-qr.ts +++ /dev/null @@ -1,62 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -import { Page } from 'puppeteer'; -import { ScrapQrcode } from '../model/qrcode'; - -export async function scrapeImg(page: Page): Promise { - let click = await page - .evaluate(() => { - const selectorImg = document.querySelector('canvas'); - const selectorUrl = selectorImg.closest('[data-ref]'); - //const buttonReload = selectorUrl.querySelector('[role="button"]') as HTMLButtonElement; - const buttonReload = selectorUrl.querySelector('button'); - if (buttonReload != null) { - buttonReload.click(); - return true; - } - return false; - }) - .catch(() => false); - - if (click) { - await page.waitForFunction(() => { - const selectorImg = document.querySelector('canvas'); - const selectorUrl = selectorImg.closest('[data-ref]'); - return selectorUrl.getAttribute('data-ref'); - }); - } - - const result = await page - .evaluate(() => { - const selectorImg = document.querySelector('canvas'); - const selectorUrl = selectorImg.closest('[data-ref]'); - - if (selectorImg != null && selectorUrl != null) { - let data = { - base64Image: selectorImg.toDataURL(), - urlCode: selectorUrl.getAttribute('data-ref'), - }; - return data; - } else { - return undefined; - } - }) - .catch(() => undefined); - - return result; -} diff --git a/src/api/helpers/scrape-login.ts b/src/api/helpers/scrape-login.ts deleted file mode 100644 index e20a8297d..000000000 --- a/src/api/helpers/scrape-login.ts +++ /dev/null @@ -1,34 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -import { Page } from 'puppeteer'; -export async function scrapeLogin(page: Page): Promise { - const result = await page.evaluate(() => { - const count = document.querySelector('._9a59P'); - let data: boolean; - data = false; - if (count != null) { - const text = count.textContent, - timeNumber = text.match('Invalid'); - if (timeNumber) { - data = true; - } - return data; - } - }); - return result; -} diff --git a/src/api/helpers/select-sticker.ts b/src/api/helpers/select-sticker.ts deleted file mode 100644 index 2dae6e10d..000000000 --- a/src/api/helpers/select-sticker.ts +++ /dev/null @@ -1,77 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -import sharp from 'sharp'; - -interface selectOutput { - webpBase64: string; - metadata: { - width?: number; - height?: number; - }; -} - -export async function stickerSelect(_B: Buffer, _t: number) { - let _w: sharp.Sharp, _ins: Buffer; - switch (_t) { - case 0: - _ins = await sharp(_B, { failOnError: false }) - .resize({ width: 512, height: 512 }) - .toBuffer(); - _w = sharp(_ins, { failOnError: false }).webp(); - break; - case 1: - _w = sharp(_B, { animated: true }).webp(); - break; - default: - console.error('Enter a valid number 0 or 1'); - return false; - } - - const metadata = await _w.metadata(); - - if (metadata.width > 512 || metadata.pageHeight > 512) { - console.error( - `Invalid image size (max 512x512):${metadata.width}x${metadata.pageHeight}` - ); - return false; - } - - const obj: selectOutput = { - webpBase64: (await _w.toBuffer()).toString('base64'), - metadata: { - width: metadata.width, - height: metadata.pageHeight, - }, - }; - - return obj; -} - -interface CreateSize { - width?: number; - height?: number; -} -export async function resizeImg(buff: Buffer, size: CreateSize) { - const _ins = await sharp(buff, { failOnError: false }) - .resize({ width: size.width, height: size.height }) - .toBuffer(), - _w = sharp(_ins, { failOnError: false }).jpeg(), - _webb64 = (await _w.toBuffer()).toString('base64'); - - return _webb64; -} diff --git a/src/api/layers/README.md b/src/api/layers/README.md deleted file mode 100644 index 90434ccbc..000000000 --- a/src/api/layers/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# Layers - -## Each layer should extends the previous one in the next order - -1. Host layer -2. Profile layer -3. Listener layer -4. Sender layer -5. Retriever layer -6. Group layer -7. Controls layer -8. Business layer (Optional) - -**Controls layer** should be enough diff --git a/src/api/layers/business.layer.ts b/src/api/layers/business.layer.ts deleted file mode 100644 index 5a6dcf8f2..000000000 --- a/src/api/layers/business.layer.ts +++ /dev/null @@ -1,259 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -import { Page } from 'puppeteer'; -import { ControlsLayer } from './controls.layer'; -import { CreateConfig } from '../../config/create-config'; -import { evaluateAndReturn } from '../helpers'; -import { BusinessProfileModel } from '@wppconnect/wa-js/dist/whatsapp'; -import { Chat } from '../model'; - -export class BusinessLayer extends ControlsLayer { - constructor(public page: Page, session?: string, options?: CreateConfig) { - super(page, session, options); - } - - /** - * Querys product catalog - * @param id Buisness profile id ('00000@c.us') - */ - public async getBusinessProfilesProducts(id: string) { - return evaluateAndReturn( - this.page, - ({ id }) => WAPI.getBusinessProfilesProducts(id), - { id } - ); - } - /** - * Get Business Profile - * @param id Buisness profile id ('00000@c.us') - */ - public async getBusinessProfile(id: string) { - return evaluateAndReturn( - this.page, - async ({ id }) => { - return JSON.parse( - JSON.stringify(await WPP.contact.getBusinessProfile(id)) - ); - }, - { id } - ); - } - /** - * Querys order catalog - * @param messageId string - * @returns Message object - */ - public async getOrderbyMsg(messageId: string) { - return evaluateAndReturn( - this.page, - ({ messageId }) => WAPI.getOrderbyMsg(messageId), - { messageId } - ); - } - - /** - * Update your business profile - * - * @example - * ```javascript - * await client.editBusinessProfile({description: 'New description for profile'}); - * ``` - * - * ```javascript - * await client.editBusinessProfile({categories: { - id: "133436743388217", - localized_display_name: "Artes e entretenimento", - not_a_biz: false, - }}); - * ``` - * - * ```javascript - * await client.editBusinessProfile({address: 'Street 01, New York'}); - * ``` - * - * ```javascript - * await client.editBusinessProfile({email: 'test@test.com.br'}); - * ``` - * - * Change website of profile (max 2 sites) - * ```javascript - * await client.editBusinessProfile({website: [ - "https://www.wppconnect.io", - "https://www.teste2.com.br", -]}); - * ``` - * - * Change businessHours for Specific Hours - * ```javascript - * await client.editBusinessProfile({ businessHours: { - * { - tue: { - mode: "specific_hours", - hours: [ - [ - 540, - 1080, - ], - ], - }, - wed: { - mode: "specific_hours", - hours: [ - [ - 540, - 1080, - ], - ], - }, - thu: { - mode: "specific_hours", - hours: [ - [ - 540, - 1080, - ], - ], - }, - fri: { - mode: "specific_hours", - hours: [ - [ - 540, - 1080, - ], - ], - }, - sat: { - mode: "specific_hours", - hours: [ - [ - 540, - 1080, - ], - ], - }, - sun: { - mode: "specific_hours", - hours: [ - [ - 540, - 1080, - ], - ], - }, - } - }, - timezone: "America/Sao_Paulo" - }); - * - * Change businessHours for Always Opened - * ```javascript - * await client.editBusinessProfile({ businessHours: { - { - mon: { - mode: "open_24h", - }, - tue: { - mode: "open_24h", - }, - wed: { - mode: "open_24h", - }, - thu: { - mode: "open_24h", - }, - fri: { - mode: "open_24h", - }, - sat: { - mode: "open_24h", - }, - sun: { - mode: "open_24h", - }, - } - timezone: "America/Sao_Paulo" - }); - * - * Change businessHours for Appointment Only - * ```javascript - * await client.editBusinessProfile({ businessHours: { { - mon: { - mode: "appointment_only", - }, - tue: { - mode: "appointment_only", - }, - wed: { - mode: "appointment_only", - }, - thu: { - mode: "appointment_only", - }, - fri: { - mode: "appointment_only", - }, - sat: { - mode: "appointment_only", - }, - sun: { - mode: "appointment_only", - }, - } - timezone: "America/Sao_Paulo" - }); - * - * - * ``` - */ - public async editBusinessProfile(options: any) { - return await evaluateAndReturn( - this.page, - async ({ options }) => { - return JSON.parse( - JSON.stringify(await WPP.profile.editBusinessProfile(options)) - ); - }, - { options } - ); - } - - /** - * Sends product with product image to given chat id - * @param to Chat id - * @param base64 Base64 image data - * @param caption Message body - * @param businessId Business id number that owns the product ('0000@c.us') - * @param productId Product id, see method getBusinessProfilesProducts for more info - */ - public async sendImageWithProduct( - to: string, - base64: string, - caption: string, - businessId: string, - productId: string - ) { - return evaluateAndReturn( - this.page, - ({ to, base64, businessId, caption, productId }) => { - WAPI.sendImageWithProduct(base64, to, caption, businessId, productId); - }, - { to, base64, businessId, caption, productId } - ); - } -} diff --git a/src/api/layers/catalog.layer.ts b/src/api/layers/catalog.layer.ts deleted file mode 100644 index 6a639ca0d..000000000 --- a/src/api/layers/catalog.layer.ts +++ /dev/null @@ -1,318 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -import { Page } from 'puppeteer'; -import { CreateConfig } from '../../config/create-config'; -import { evaluateAndReturn } from '../helpers'; -import { HostLayer } from './host.layer'; -import { CommunityLayer } from './community.layer'; - -export class CatalogLayer extends CommunityLayer { - constructor(public page: Page, session?: string, options?: CreateConfig) { - super(page, session, options); - } - - /** - * Create a product on catalog - * @param name Product name - * @param image Product image - * @param description Product description - * @param price Product price - * @param isHidden Product visibility - * @param url Product url - * @param retailerId Product own ID system - * @param currency Product currency - * @example - * ```javascript - * client.createtProduct( - * 'Product name', - * 'image in base64', - * 'product description', - * '89.90', - * true, - * 'https://wppconnect.io', - * 'AKA001', - * ); - * ``` - */ - public async createProduct( - name: string, - image: string, - description: string, - price: number, - isHidden: boolean, - url: string, - retailerId: string, - currency: string - ) { - return evaluateAndReturn( - this.page, - ({ - name, - image, - description, - price, - isHidden, - url, - retailerId, - currency, - }) => - WPP.catalog.createProduct({ - name, - image, - description, - price, - isHidden, - url, - retailerId, - currency, - }), - { name, image, description, price, isHidden, url, retailerId, currency } - ); - } - /** - * Querys all products - * @param id Buisness profile id ('00000@c.us') - * @param qnt limit to load products - Default: 10 - */ - public async getProducts(id: string, qnt: number) { - return evaluateAndReturn( - this.page, - ({ id, qnt }) => WPP.catalog.getProducts(id, qnt), - { id, qnt } - ); - } - - /** - * Create a new product on catalog - * @param id Buisness profile id ('00000@c.us') - * @param productId ID of Product - */ - public async getProductById(id: string, productId: string) { - return evaluateAndReturn( - this.page, - ({ id, productId }) => WPP.catalog.getProductById(id, productId), - { id, productId } - ); - } - - /** - * Edit product on catalog - * @param productId Product ID - * @param options Object with options - * @example - * ```javascript - * client.editProduct('56989897878' { - * name: 'Product name', - * description: 'product description', - * price: '89.90', - * isHidden: true, - * url: 'https://wppconnect.io', - * retailerId: 'AKA001', - * }); - * ``` - */ - public async editProduct(productId: string, options: string) { - return evaluateAndReturn( - this.page, - ({ productId, options }) => WPP.catalog.editProduct(productId, options), - { productId, options } - ); - } - /** - * Delete product(s) on catalog - * @param productsId Products ID - * @example - * ```javascript - * //Delete one product - * client.delProducts(['56989897878']); - * - * // Delete various products - * client.delProducts(['56989897878','565657878']); - * ``` - */ - public async delProducts(productsId: string[]) { - return evaluateAndReturn( - this.page, - ({ productsId }) => WPP.catalog.delProducts(productsId), - { productsId } - ); - } - - /** - * Add image on product This function change main image of product, for change additional images use client.addImage - * @param productId Product ID - * @param image Image in base64 - * @example - * ```javascript - * client.changeProductImage('56989897878', 'base64/string'); - * ``` - */ - public async changeProductImage(productId: string, image: string) { - return evaluateAndReturn( - this.page, - ({ productId, image }) => - WPP.catalog.changeProductImage(productId, image), - { productId, image } - ); - } - - /** - * Add image on product This function include additional images on product for change main image use client.changeProductImage - * @param productId Product ID - * @param image Image in base64 - * @example - * ```javascript - * client.addProductImage('56989897878', 'base64/string'); - * ``` - */ - public async addProductImage(productId: string, image: string) { - return evaluateAndReturn( - this.page, - ({ productId, image }) => WPP.catalog.addProductImage(productId, image), - { productId, image } - ); - } - - /** - * Remove image on product This function remove additional images of product for change main image use client.changeProductImage - * @param productId Product ID - * @param index Index array of additional imagens - * @example - * ```javascript - * client.removeProductImage('56989897878', '1'); - * ``` - */ - public async removeProductImage(productId: string, index: string) { - return evaluateAndReturn( - this.page, - ({ productId, index }) => - WPP.catalog.removeProductImage(productId, index), - { productId, index } - ); - } - - /** - * Query all collections - * @param id Product ID - * @param qnt Max qnt collections - Default 10 - * @param maxProducts Max products in array products of collection - Default 10 - * @example - * ```javascript - * client.getCollections('5521988556558@c.us', '10','20'); - * ``` - */ - public async getCollections(id: string, qnt: string, maxProducts: string) { - return evaluateAndReturn( - this.page, - ({ id, qnt, maxProducts }) => - WPP.catalog.getCollections(id, qnt, maxProducts), - { id, qnt, maxProducts } - ); - } - - /** - * Create new collection - * @param collectionName Product ID - * @param productsId Index array of additional imagens - * @example - * ```javascript - * client.createCollection('Name of collection', ['655632565','5689859898']); - * ``` - */ - public async createCollection(collectionName: string, productsId: string) { - return evaluateAndReturn( - this.page, - ({ collectionName, productsId }) => - WPP.catalog.createCollection(collectionName, productsId), - { collectionName, productsId } - ); - } - - /** - * Edit a collection - * @param collectionId Collection id - * @param options Options arguments - * @example - * ```javascript - * client.editCollection('656565898', { - * collectionName: 'New Name for collection', - * productsToAdd: ['5656523223'], - * productsToRemove: ['5656523232'] - * }); - * ``` - */ - public async editCollection(collectionId: string, options: string) { - return evaluateAndReturn( - this.page, - ({ collectionId, options }) => - WPP.catalog.editCollection(collectionId, options), - { collectionId, options } - ); - } - - /** - * Delete a collection - * @param collectionId Collection id - * @param options Options arguments - * @example - * ```javascript - * client.deleteCollection('65666565898'); - * ``` - */ - public async deleteCollection(collectionId: string) { - return evaluateAndReturn( - this.page, - ({ collectionId }) => WPP.catalog.deleteCollection(collectionId), - { collectionId } - ); - } - - /** - * Set product visibility - * @param productId Product id - * @param value True for visibility, false for non visible - * @example - * ```javascript - * client.setProductVisibility('65666565898', false); - * ``` - */ - public async setProductVisibility(productId: string, value: boolean) { - return evaluateAndReturn( - this.page, - ({ productId, value }) => - WPP.catalog.setProductVisibility(productId, value), - { productId, value } - ); - } - - /** - * Update options to customer cart your products - * @param value True for enabled, false for non enabled - * @example - * ```javascript - * client.updateCartEnabled(false); - * ``` - */ - public async updateCartEnabled(value: boolean) { - return evaluateAndReturn( - this.page, - ({ value }) => WPP.catalog.updateCartEnabled(value), - { value } - ); - } -} diff --git a/src/api/layers/community.layer.ts b/src/api/layers/community.layer.ts deleted file mode 100644 index 101f5cace..000000000 --- a/src/api/layers/community.layer.ts +++ /dev/null @@ -1,154 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -import { Page } from 'puppeteer'; -import { CreateConfig } from '../../config/create-config'; -import { evaluateAndReturn } from '../helpers'; -import { Wid } from '../model'; -import { NewsletterLayer } from './newsletter.layer'; - -export class CommunityLayer extends NewsletterLayer { - constructor(public page: Page, session?: string, options?: CreateConfig) { - super(page, session, options); - } - - /** - * Create a community - * - * @category Community - * @param groupIds Array with groups id - */ - public async createCommunity( - name: string, - description: string, - groupIds: string[] | Wid[] - ): Promise { - return evaluateAndReturn( - this.page, - (name, description, groupIds) => - WPP.community.create(name, description, groupIds), - name, - description, - groupIds - ); - } - - /** - * Deactivate a community - * @category Community - * @param communityId id - */ - public async deactivateCommunity(communityId: string | Wid): Promise { - return evaluateAndReturn( - this.page, - (communityId) => WPP.community.deactivate(communityId), - communityId - ); - } - - /** - * Add groups to community - * - * @category Community - * @param communityId id - */ - public async addSubgroupsCommunity( - communityId: string | Wid, - groupsIds: string[] - ): Promise { - return evaluateAndReturn( - this.page, - (communityId, groupsIds) => - WPP.community.addSubgroups(communityId, groupsIds), - communityId, - groupsIds - ); - } - - /** - * Remove groups of community - * - * @category Community - * @param communityId id - */ - public async removeSubgroupsCommunity( - communityId: string | Wid, - groupsIds: string[] - ): Promise { - return evaluateAndReturn( - this.page, - (communityId, groupsIds) => - WPP.community.removeSubgroups(communityId, groupsIds), - communityId, - groupsIds - ); - } - - /** - * Remove admin of community participant - * - * @category Community - * @param communityId id - */ - public async demoteCommunityParticipant( - communityId: string | Wid, - participantId: string[] | string - ): Promise { - return evaluateAndReturn( - this.page, - (communityId, participantId) => - WPP.community.demoteParticipants(communityId, participantId), - communityId, - participantId - ); - } - - /** - * Promote participant of community to admin - * - * @category Community - * @param communityId id - */ - public async promoteCommunityParticipant( - communityId: string | Wid, - participantId: string[] | string - ): Promise { - return evaluateAndReturn( - this.page, - (communityId, participantId) => - WPP.community.promoteParticipants(communityId, participantId), - communityId, - participantId - ); - } - - /** - * Get all participants of a community - * - * @category Community - * @param communityId id - */ - public async getCommunityParticipants( - communityId: string | Wid - ): Promise { - return evaluateAndReturn( - this.page, - (communityId) => WPP.community.getParticipants(communityId), - communityId - ); - } -} diff --git a/src/api/layers/controls.layer.ts b/src/api/layers/controls.layer.ts deleted file mode 100644 index df1db56f6..000000000 --- a/src/api/layers/controls.layer.ts +++ /dev/null @@ -1,299 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -import { EditMessageOptions } from '@wppconnect/wa-js/dist/chat/functions/editMessage'; -import { MsgKey } from '@wppconnect/wa-js/dist/whatsapp'; -import { Page } from 'puppeteer'; -import { CreateConfig } from '../../config/create-config'; -import { evaluateAndReturn } from '../helpers'; -import { UILayer } from './ui.layer'; -import { Message } from '../model'; - -export class ControlsLayer extends UILayer { - constructor(public page: Page, session?: string, options?: CreateConfig) { - super(page, session, options); - } - - /** - * Unblock contact - * @category Blocklist - * @param contactId {string} id '000000000000@c.us' - * @returns boolean - */ - public async unblockContact(contactId: string) { - await evaluateAndReturn( - this.page, - (contactId) => WPP.blocklist.unblockContact(contactId), - contactId - ); - - return true; - } - - /** - * Block contact - * @category Blocklist - * @param contactId {string} id '000000000000@c.us' - * @returns boolean - */ - public async blockContact(contactId: string) { - await evaluateAndReturn( - this.page, - (contactId) => WPP.blocklist.blockContact(contactId), - contactId - ); - - return true; - } - - /** - * puts the chat as unread - * @category Chat - * @param contactId {string} id '000000000000@c.us' - * @returns boolean - */ - public async markUnseenMessage(contactId: string) { - await evaluateAndReturn( - this.page, - (contactId) => WPP.chat.markIsUnread(contactId), - contactId - ); - return true; - } - - /** - * Deletes the given chat - * @category Chat - * @param chatId {string} id '000000000000@c.us' - * @returns boolean - */ - public async deleteChat(chatId: string) { - const result = await evaluateAndReturn( - this.page, - (chatId) => WPP.chat.delete(chatId), - chatId - ); - return result.status === 200; - } - - /** - * Archive and unarchive chat messages with true or false - * @category Chat - * @param chatId {string} id '000000000000@c.us' - * @param option {boolean} true or false - * @returns boolean - */ - public async archiveChat(chatId: string, option: boolean = true) { - return evaluateAndReturn( - this.page, - ({ chatId, option }) => WPP.chat.archive(chatId, option), - { chatId, option } - ); - } - - /** - * Pin and Unpin chat messages with true or false - * @category Chat - * @param chatId {string} id '000000000000@c.us' - * @param option {boolean} true or false - * @param nonExistent {boolean} Pin chat, non-existent (optional) - * @returns object - */ - public async pinChat(chatId: string, option: boolean, nonExistent?: boolean) { - if (nonExistent) { - await evaluateAndReturn( - this.page, - ({ chatId }) => WPP.chat.find(chatId), - { chatId } - ); - } - - return await evaluateAndReturn( - this.page, - ({ chatId, option }) => WPP.chat.pin(chatId, option), - { chatId, option } - ); - } - - /** - * Deletes all messages of given chat - * @category Chat - * @param chatId - * @param keepStarred Keep starred messages - * @returns boolean - */ - public async clearChat(chatId: string, keepStarred = true) { - const result = await evaluateAndReturn( - this.page, - ({ chatId, keepStarred }) => WPP.chat.clear(chatId, keepStarred), - { chatId, keepStarred } - ); - - return result.status === 200; - } - - /** - * Deletes message of given message id - * @category Chat - * @param chatId The chat id from which to delete the message. - * @param messageId The specific message id of the message to be deleted - * @param onlyLocal If it should only delete locally (message remains on the other recipienct's phone). Defaults to false. - */ - public async deleteMessage( - chatId: string, - messageId: string[] | string, - onlyLocal = false, - deleteMediaInDevice = true - ) { - await evaluateAndReturn( - this.page, - ({ chatId, messageId, onlyLocal, deleteMediaInDevice }) => - WPP.chat.deleteMessage( - chatId, - messageId, - deleteMediaInDevice, - !onlyLocal - ), - { chatId, messageId, onlyLocal, deleteMediaInDevice } - ); - - return true; - } - - /** - * Edits message of given message id - * @category Chat - * @param msgId The specific message id of the message to be edited - * @param newText New content of specified message - * @param options Common message options - * - * @example - * ```javascript - * // Simple message - * client.editMessage('true_@c.us_messageId', 'new Text For Simple Message'); - * ``` - */ - public async editMessage( - msgId: string | MsgKey, - newText: string, - options: EditMessageOptions = {} - ) { - const editResult = await evaluateAndReturn( - this.page, - ({ msgId, newText, options }) => - WPP.chat.editMessage(msgId, newText, options), - { msgId, newText, options } - ); - - const result = (await evaluateAndReturn( - this.page, - async ({ messageId }) => { - return JSON.parse(JSON.stringify(await WAPI.getMessageById(messageId))); - }, - { messageId: editResult.id } - )) as Message; - - if (result.body !== newText) throw editResult; - - return result; - } - - /** - * Stars message of given message id - * @category Chat - * @param messagesId The specific message id of the message to be starred - * @param star Add or remove star of the message. Defaults to true. - */ - public async starMessage( - messagesId: string[] | string, - star = true - ): Promise { - return await evaluateAndReturn( - this.page, - ({ messagesId, star }) => WAPI.starMessages(messagesId, star), - { messagesId, star } - ); - } - - /** - * Allow only admin to send messages with true or false - * @category Group - * @param chatId {string} id '000000000000@c.us' - * @param option {boolean} true or false - * @returns boolean - */ - public async setMessagesAdminsOnly(chatId: string, option: boolean) { - return evaluateAndReturn( - this.page, - ({ chatId, option }) => WAPI.setMessagesAdminsOnly(chatId, option), - { chatId, option } - ); - } - - /** - * Enable or disable temporary messages with true or false - * @category Chat - * @param chatOrGroupId id '000000000000@c.us' or '000000-000000@g.us' - * @param value true or false - * @returns boolean - */ - public async setTemporaryMessages(chatOrGroupId: string, value: boolean) { - return await evaluateAndReturn( - this.page, - ({ chatOrGroupId, value }) => - WAPI.setTemporaryMessages(chatOrGroupId, value), - { chatOrGroupId, value } - ); - } - - /** - * Change limits of whatsapp web - * * @example - * ```javascript - * //Change the maximum size (bytes) for uploading media (max 70MB) - * WPP.conn.setLimit('maxMediaSize',16777216); - * - * //Change the maximum size (bytes) for uploading files (max 1GB) - * WPP.conn.setLimit('maxFileSize',104857600); - * - * //Change the maximum number of contacts that can be selected when sharing (Default 5) - * WPP.conn.setLimit('maxShare',100); - * - * //Change the maximum time (seconds) of a video status - * WPP.conn.setLimit('statusVideoMaxDuration',120); - * - * //Remove pinned conversation limit (only whatsapp web) (Default 3) - * WPP.conn.setLimit('unlimitedPin',true); - * ``` - * @category Chat - */ - public async setLimit( - key: - | 'maxMediaSize' - | 'maxFileSize' - | 'maxShare' - | 'statusVideoMaxDuration' - | 'unlimitedPin', - value: boolean | number - ) { - return await evaluateAndReturn( - this.page, - ({ key, value }) => WPP.conn.setLimit(key as any, value), - { key, value } - ); - } -} diff --git a/src/api/layers/group.layer.ts b/src/api/layers/group.layer.ts deleted file mode 100644 index 9c8196667..000000000 --- a/src/api/layers/group.layer.ts +++ /dev/null @@ -1,452 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -import { Page } from 'puppeteer'; -import { CreateConfig } from '../../config/create-config'; -import { - evaluateAndReturn, - base64MimeType, - fileToBase64, - downloadFileToBase64, -} from '../helpers'; -import { Id, Wid } from '../model'; -import { GroupProperty } from '../model/enum'; -import { RetrieverLayer } from './retriever.layer'; - -export class GroupLayer extends RetrieverLayer { - constructor(public page: Page, session?: string, options?: CreateConfig) { - super(page, session, options); - } - - /** - * Removes the host device from the group - * @category Group - * @param groupId group id - */ - public async leaveGroup(groupId: string) { - return evaluateAndReturn( - this.page, - (groupId) => WPP.group.leave(groupId), - groupId - ); - } - - /** - * Retrieves group members as [Id] objects - * @category Group - * @param groupId group id - */ - public async getGroupMembersIds(groupId: string): Promise { - return evaluateAndReturn( - this.page, - (groupId: string) => - Promise.resolve(WPP.group.getParticipants(groupId)).then( - (participants) => participants.map((p) => p.id as any) - ), - groupId - ); - } - - /** - * Returns group members [Contact] objects - * @category Group - * @param groupId - */ - public async getGroupMembers(groupId: string) { - const membersIds = await this.getGroupMembersIds(groupId); - const actions = membersIds.map((memberId) => { - return this.getContact(memberId._serialized); - }); - return Promise.all(actions); - } - - /** - * Generates group-invite link - * @category Group - * @param chatId - * @returns Invitation link - */ - public async getGroupInviteLink(chatId: string) { - const code = await evaluateAndReturn( - this.page, - (chatId) => WPP.group.getInviteCode(chatId), - chatId - ); - - return `https://chat.whatsapp.com/${code}`; - } - - /** - * Revokes group-invite link and generate new one. - * @category Group - * @param chatId - * @returns Invitation link - */ - public async revokeGroupInviteLink(chatId: string) { - const code = await evaluateAndReturn( - this.page, - (chatId) => WPP.group.revokeInviteCode(chatId), - chatId - ); - - return `https://chat.whatsapp.com/${code}`; - } - - /** - * Generates group-invite link - * @category Group - * @param inviteCode - * @returns Invite code from group link. Example: CMJYfPFqRyE2GxrnkldYED - */ - public async getGroupInfoFromInviteLink(inviteCode: string) { - inviteCode = inviteCode.replace('chat.whatsapp.com/', ''); - inviteCode = inviteCode.replace('invite/', ''); - inviteCode = inviteCode.replace('https://', ''); - inviteCode = inviteCode.replace('http://', ''); - return await evaluateAndReturn( - this.page, - (inviteCode) => WPP.group.getGroupInfoFromInviteCode(inviteCode), - inviteCode - ); - } - - /** - * Creates a new chat group - * @category Group - * @param groupName Group name - * @param contacts Contacts that should be added. - */ - public async createGroup(groupName: string, contacts: string | string[]) { - return await evaluateAndReturn( - this.page, - ({ groupName, contacts }) => WPP.group.create(groupName, contacts, null), - { groupName, contacts } - ); - } - - /** - * Removes participant from group - * @category Group - * @param groupId Chat id ('0000000000-00000000@g.us') - * @param participantId Participant id'000000000000@c.us' - */ - public async removeParticipant( - groupId: string, - participantId: string | string[] - ) { - return await evaluateAndReturn( - this.page, - ({ groupId, participantId }) => - WPP.group.removeParticipants(groupId, participantId), - { groupId, participantId } - ); - } - - /** - * Adds participant to Group - * @category Group - * @param groupId Chat id ('0000000000-00000000@g.us') - * @param participantId Participant id'000000000000@c.us' - */ - public async addParticipant( - groupId: string, - participantId: string | string[] - ) { - return await evaluateAndReturn( - this.page, - ({ groupId, participantId }) => - WPP.group.addParticipants(groupId, participantId), - { groupId, participantId } - ); - } - - /** - * Promotes participant as Admin in given group - * @category Group - * @param groupId Chat id ('0000000000-00000000@g.us') - * @param participantId Participant id'000000000000@c.us' - */ - public async promoteParticipant( - groupId: string, - participantId: string | string[] - ) { - await evaluateAndReturn( - this.page, - ({ groupId, participantId }) => - WPP.group.promoteParticipants(groupId, participantId), - { groupId, participantId } - ); - - return true; - } - - /** - * Demotes admin privileges of participant - * @category Group - * @param groupId Chat id ('0000000000-00000000@g.us') - * @param participantId Participant id'000000000000@c.us' - */ - public async demoteParticipant( - groupId: string, - participantId: string | string[] - ) { - return await evaluateAndReturn( - this.page, - ({ groupId, participantId }) => - WPP.group.demoteParticipants(groupId, participantId), - { groupId, participantId } - ); - - return true; - } - - /** - * Retrieves group admins - * @category Group - * @param chatId Group/Chat id ('0000000000-00000000@g.us') - */ - public async getGroupAdmins(chatId: string) { - const participants = await evaluateAndReturn( - this.page, - (chatId) => - Promise.resolve(WPP.group.getParticipants(chatId)).then( - (participants) => participants.map((p) => p.toJSON()) - ), - chatId - ); - - return participants.filter((p) => p.isAdmin).map((p) => p.id); - } - /** - * Join a group with invite code - * @category Group - * @param inviteCode - */ - public async joinGroup(inviteCode: string) { - inviteCode = inviteCode.replace('chat.whatsapp.com/', ''); - inviteCode = inviteCode.replace('invite/', ''); - inviteCode = inviteCode.replace('https://', ''); - inviteCode = inviteCode.replace('http://', ''); - return await evaluateAndReturn( - this.page, - (inviteCode) => WPP.group.join(inviteCode), - inviteCode - ); - } - - /** - * Set group description (if allowed) - * @category Group - * @param groupId Group ID ('000000-000000@g.us') - * @param description New group description - * @returns empty object - */ - public async setGroupDescription(groupId: string, description: string) { - return await evaluateAndReturn( - this.page, - ({ groupId, description }) => - WPP.group.setDescription(groupId, description), - { groupId, description } - ); - } - - /** - * Set group subject (if allowed) - * @category Group - * @param groupId Group ID ('000000-000000@g.us') - * @param title New group subject - * @returns empty object - */ - public async setGroupSubject(groupId: string, title: string) { - return await evaluateAndReturn( - this.page, - ({ groupId, title }) => WPP.group.setSubject(groupId, title), - { groupId, title } - ); - } - - /** - * Enable or disable group properties, see {@link GroupProperty for details} - * @category Group - * @param groupId Group ID ('000000-000000@g.us') - * @param property - * @param value true or false - * @returns empty object - */ - public async setGroupProperty( - groupId: string, - property: GroupProperty, - value: boolean - ) { - return await evaluateAndReturn( - this.page, - ({ groupId, property, value }) => - WPP.group.setProperty(groupId, property, value), - { groupId, property, value } - ); - } - - /** - * Set group icon - * @category Group - * @param groupId Group ID ('000000-000000@g.us') - * @param base64 Image in base64 ( data:image/jpeg;base64,..... ) - * @returns empty object - */ - public async setGroupIcon(groupId: string, pathOrBase64: string) { - let base64: string = ''; - if (pathOrBase64.startsWith('data:')) { - base64 = pathOrBase64; - } else { - let fileContent = await downloadFileToBase64(pathOrBase64, [ - 'image/gif', - 'image/png', - 'image/jpg', - 'image/jpeg', - 'image/webp', - ]); - if (!fileContent) { - fileContent = await fileToBase64(pathOrBase64); - } - if (fileContent) { - base64 = fileContent; - } - } - - if (!base64) { - const error = new Error('Empty or invalid file or base64'); - Object.assign(error, { - code: 'empty_file', - }); - throw error; - } - - const mimeInfo = base64MimeType(base64); - - if (!mimeInfo || !mimeInfo.includes('image')) { - const error = new Error( - 'Not an image, allowed formats png, jpeg and webp' - ); - Object.assign(error, { - code: 'invalid_image', - }); - throw error; - } - - return await evaluateAndReturn( - this.page, - ({ groupId, base64 }) => WPP.group.setIcon(groupId, base64), - { groupId, base64 } - ); - } - /** - * Set group subject (if allowed) - * @category Group - * @param groupId Group ID ('0000000000@g.us') - * @returns empty object - */ - public async removeGroupIcon(groupId: string) { - if (!groupId) { - throw new Error('Empty or invalid group id'); - } - - return await evaluateAndReturn( - this.page, - ({ groupId }) => WPP.group.removeIcon(groupId), - { groupId } - ); - } - - /** - * Get the max number of participants for a group - * @category Group - * @returns number - */ - public async getGroupSizeLimit() { - return await evaluateAndReturn(this.page, () => - WPP.group.getGroupSizeLimit() - ); - } - - /** - * Approve a membership request to group - * @category Group - * @param groupId Group ID ('000000-000000@g.us') - * @param wid @c.us - * @returns Promise - */ - public async approveGroupMembershipRequest( - groupId: string, - membershipIds: string | string[] - ): Promise< - { - error: any; - wid: Wid; - }[] - > { - return await evaluateAndReturn( - this.page, - ({ groupId, membershipIds }) => WPP.group.approve(groupId, membershipIds), - { groupId, membershipIds } - ); - } - - /** - * Reject a membership request to group - * @category Group - * @param groupId Group ID ('000000-000000@g.us') - * @param wid @c.us - * @returns Promise - */ - public async rejectGroupMembershipRequest( - groupId: string, - membershipIds: string | string[] - ): Promise< - { - error: any; - wid: Wid; - }[] - > { - return await evaluateAndReturn( - this.page, - ({ groupId, membershipIds }) => WPP.group.reject(groupId, membershipIds), - { groupId, membershipIds } - ); - } - - /** - * Retrieve a list of a membership approval requests - * @category Group - * @param groupId Group ID ('000000-000000@g.us') - * @returns Promise - */ - public async getGroupMembershipRequests(groupId: string): Promise< - { - addedBy: Wid; - id: Wid; - parentGroupId?: Wid; - requestMethod: 'InviteLink' | 'LinkedGroupJoin' | 'NonAdminAdd'; - t: number; - }[] - > { - return await evaluateAndReturn( - this.page, - ({ groupId }) => WPP.group.getMembershipRequests(groupId), - { groupId } - ); - } -} diff --git a/src/api/layers/host.layer.ts b/src/api/layers/host.layer.ts deleted file mode 100644 index 01c048f0d..000000000 --- a/src/api/layers/host.layer.ts +++ /dev/null @@ -1,599 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -import { Page } from 'puppeteer'; -import { Logger } from 'winston'; -import { CreateConfig, defaultOptions } from '../../config/create-config'; -import { - asciiQr, - isAuthenticated, - isInsideChat, - needsToScan, -} from '../../controllers/auth'; -import { initWhatsapp, injectApi } from '../../controllers/browser'; -import { defaultLogger, LogLevel } from '../../utils/logger'; -import { sleep } from '../../utils/sleep'; -import { evaluateAndReturn, scrapeImg } from '../helpers'; -import { - CatchQRCallback, - HostDevice, - LinkByCodeCallback, - LoadingScreenCallback, - StatusFindCallback, -} from '../model'; -import { SocketState } from '../model/enum'; -import { ScrapQrcode } from '../model/qrcode'; - -export class HostLayer { - readonly session: string; - readonly options: CreateConfig; - readonly logger: Logger; - - protected autoCloseInterval = null; - protected autoCloseCalled = false; - - protected isInitialized = false; - protected isInjected = false; - protected isStarted = false; - protected isLogged = false; - protected isInChat = false; - protected checkStartInterval?: NodeJS.Timer = null; - protected urlCode = ''; - protected attempt = 0; - - public catchQR?: CatchQRCallback = null; - public statusFind?: StatusFindCallback = null; - public onLoadingScreen?: LoadingScreenCallback = null; - public catchLinkCode?: LinkByCodeCallback = null; - - constructor(public page: Page, session?: string, options?: CreateConfig) { - this.session = session; - this.options = { ...defaultOptions, ...options }; - - this.logger = this.options.logger || defaultLogger; - - this.log('info', 'Initializing...'); - this.initialize(); - } - - protected log(level: LogLevel, message: string, meta: object = {}) { - this.logger.log({ - level, - message, - session: this.session, - type: 'client', - ...meta, - }); - } - - protected async initialize() { - this.page.on('close', () => { - this.cancelAutoClose(); - this.log('verbose', 'Page Closed', { type: 'page' }); - }); - - this.page.on('load', () => { - this.log('verbose', 'Page loaded', { type: 'page' }); - this.afterPageLoad(); - }); - - this.isInitialized = true; - } - - protected async afterPageLoad() { - this.log('verbose', 'Injecting wapi.js'); - - const options = { - deviceName: this.options.deviceName, - disableGoogleAnalytics: this.options.disableGoogleAnalytics, - googleAnalyticsId: this.options.googleAnalyticsId, - linkPreviewApiServers: this.options.linkPreviewApiServers, - poweredBy: this.options.poweredBy, - }; - - await evaluateAndReturn( - this.page, - (options) => { - (window as any).WPPConfig = options; - }, - options - ); - - this.isInjected = false; - - await injectApi(this.page, this.onLoadingScreen) - .then(() => { - this.isInjected = true; - this.log('verbose', 'wapi.js injected'); - this.afterPageScriptInjected(); - }) - .catch((e) => { - console.log(e); - this.log('verbose', 'wapi.js failed'); - }); - } - - protected async afterPageScriptInjected() { - this.getWAVersion() - .then((version) => { - this.log('info', `WhatsApp WEB version: ${version}`); - }) - .catch(() => null); - this.getWAJSVersion() - .then((version) => { - this.log('info', `WA-JS version: ${version}`); - }) - .catch(() => null); - - evaluateAndReturn(this.page, () => { - WPP.on('conn.auth_code_change', (window as any).checkQrCode); - }).catch(() => null); - evaluateAndReturn(this.page, () => { - WPP.on('conn.main_ready', (window as any).checkInChat); - }).catch(() => null); - this.checkInChat(); - this.checkQrCode(); - } - - public async start() { - if (this.isStarted) { - return; - } - - this.isStarted = true; - - await initWhatsapp( - this.page, - null, - false, - this.options.whatsappVersion, - this.log.bind(this) - ); - - await this.page.exposeFunction('checkQrCode', () => this.checkQrCode()); - /*await this.page.exposeFunction('loginByCode', (phone: string) => - this.loginByCode(phone) - );*/ - await this.page.exposeFunction('checkInChat', () => this.checkInChat()); - - this.checkStartInterval = setInterval(() => this.checkStart(), 5000); - - this.page.on('close', () => { - clearInterval(this.checkStartInterval as NodeJS.Timeout); - }); - } - - protected async checkStart() { - needsToScan(this.page) - .then((need) => {}) - .catch(() => null); - } - - protected async checkQrCode() { - const needScan = await needsToScan(this.page).catch(() => null); - - this.isLogged = !needScan; - if (!needScan) { - this.attempt = 0; - return; - } - - const result = await this.getQrCode(); - - if (!result?.urlCode || this.urlCode === result.urlCode) { - return; - } - if (typeof this.options.phoneNumber === 'string') { - return this.loginByCode(this.options.phoneNumber); - } - this.urlCode = result.urlCode; - this.attempt++; - - let qr = ''; - - if (this.options.logQR || this.catchQR) { - qr = await asciiQr(this.urlCode); - } - - if (this.options.logQR) { - this.log( - 'info', - `Waiting for QRCode Scan (Attempt ${this.attempt})...:\n${qr}`, - { code: this.urlCode } - ); - } else { - this.log('verbose', `Waiting for QRCode Scan: Attempt ${this.attempt}`); - } - - this.catchQR?.(result.base64Image, qr, this.attempt, result.urlCode); - } - - protected async loginByCode(phone: string) { - const code = await evaluateAndReturn( - this.page, - async ({ phone }) => { - return JSON.parse( - JSON.stringify(await WPP.conn.genLinkDeviceCodeForPhoneNumber(phone)) - ); - }, - { phone } - ); - if (this.options.logQR) { - this.log('info', `Waiting for Login By Code (Code: ${code})\n`); - } else { - this.log('verbose', `Waiting for Login By Code`); - } - this.catchLinkCode?.(code); - } - - protected async checkInChat() { - const inChat = await isInsideChat(this.page).catch(() => null); - - this.isInChat = !!inChat; - - if (!inChat) { - return; - } - this.log('http', 'Connected'); - this.statusFind?.('inChat', this.session); - } - - protected tryAutoClose() { - if (this.autoCloseInterval) { - this.cancelAutoClose(); - } - - if ( - (this.options.autoClose > 0 || this.options.deviceSyncTimeout > 0) && - !this.autoCloseInterval && - !this.page.isClosed() - ) { - this.log('info', 'Closing the page'); - this.autoCloseCalled = true; - this.statusFind && this.statusFind('autocloseCalled', this.session); - try { - this.page.close(); - } catch (error) {} - } - } - - protected startAutoClose(time: number | null = null) { - if (time === null || time === undefined) { - time = this.options.autoClose; - } - - if (time > 0 && !this.autoCloseInterval) { - const seconds = Math.round(time / 1000); - this.log('info', `Auto close configured to ${seconds}s`); - - let remain = seconds; - this.autoCloseInterval = setInterval(() => { - if (this.page.isClosed()) { - this.cancelAutoClose(); - return; - } - remain -= 1; - if (remain % 10 === 0 || remain <= 5) { - this.log('http', `Auto close remain: ${remain}s`); - } - if (remain <= 0) { - this.tryAutoClose(); - } - }, 1000); - } - } - - protected cancelAutoClose() { - clearInterval(this.autoCloseInterval); - this.autoCloseInterval = null; - } - - public async getQrCode() { - let qrResult: ScrapQrcode | undefined; - - qrResult = await scrapeImg(this.page).catch(() => undefined); - - return qrResult; - } - - public async waitForQrCodeScan() { - if (!this.isStarted) { - throw new Error('waitForQrCodeScan error: Session not started'); - } - while (!this.page.isClosed() && !this.isLogged) { - await sleep(200); - const needScan = await needsToScan(this.page).catch(() => null); - this.isLogged = !needScan; - } - } - - public async waitForInChat() { - if (!this.isStarted) { - throw new Error('waitForInChat error: Session not started'); - } - - if (!this.isLogged) { - return false; - } - - const start = Date.now(); - - while (!this.page.isClosed() && this.isLogged && !this.isInChat) { - if ( - this.options.deviceSyncTimeout > 0 && - Date.now() - start >= this.options.deviceSyncTimeout - ) { - return false; - } - - await sleep(1000); - const inChat = isInsideChat(this.page).catch(() => null); - this.isInChat = !!inChat; - } - return this.isInChat; - } - - public async waitForPageLoad() { - while (!this.isInjected) { - await sleep(200); - } - - await this.page.waitForFunction(() => WPP.isReady).catch(() => {}); - } - - public async waitForLogin() { - this.log('http', 'Waiting page load'); - - await this.waitForPageLoad(); - - this.log('http', 'Checking is logged...'); - let authenticated = await isAuthenticated(this.page).catch(() => null); - - this.startAutoClose(); - - if (authenticated === false) { - this.log( - 'http', - typeof this.options.phoneNumber === 'string' - ? 'Waiting for Login by Code...' - : 'Waiting for QRCode Scan...' - ); - this.statusFind?.('notLogged', this.session); - await this.waitForQrCodeScan(); - - this.log( - 'http', - typeof this.options.phoneNumber === 'string' - ? 'Checking Login by Code status...' - : 'Checking QRCode status...' - ); - // Wait for interface update - await sleep(200); - authenticated = await isAuthenticated(this.page).catch(() => null); - - if (authenticated === null) { - this.log('warn', 'Failed to authenticate'); - this.statusFind?.('qrReadError', this.session); - } else if (authenticated) { - this.log('http', 'Login with success'); - this.statusFind?.('qrReadSuccess', this.session); - } else { - this.log('warn', 'Login Fail'); - this.statusFind?.('qrReadFail', this.session); - this.tryAutoClose(); - throw 'Failed to read the QRCode'; - } - } else if (authenticated === true) { - this.log('http', 'Authenticated'); - this.statusFind?.('isLogged', this.session); - } - - if (authenticated === true) { - // Reinicia o contador do autoclose - this.cancelAutoClose(); - // Wait for interface update - await sleep(200); - this.startAutoClose(this.options.deviceSyncTimeout); - this.log('http', 'Checking phone is connected...'); - const inChat = await this.waitForInChat(); - - if (!inChat) { - this.log('warn', 'Phone not connected'); - this.statusFind?.('phoneNotConnected', this.session); - this.tryAutoClose(); - throw 'Phone not connected'; - } - this.cancelAutoClose(); - return true; - } - - if (authenticated === false) { - this.tryAutoClose(); - this.log('warn', 'Not logged'); - throw 'Not logged'; - } - - this.tryAutoClose(); - - if (this.autoCloseCalled) { - this.log('error', 'Auto Close Called'); - throw 'Auto Close Called'; - } - - if (this.page.isClosed()) { - this.log('error', 'Page Closed'); - throw 'Page Closed'; - } - - this.log('error', 'Unknow error'); - throw 'Unknow error'; - } - - /** - * @category Host - * @returns Current host device details - */ - public async getHostDevice(): Promise { - return await evaluateAndReturn(this.page, () => WAPI.getHost()); - } - - /** - * @category Host - * @returns Current wid connected - */ - public async getWid(): Promise { - return await evaluateAndReturn(this.page, () => WAPI.getWid()); - } - - /** - * Retrieves WA version - * @category Host - */ - public async getWAVersion() { - await this.page - .waitForFunction(() => WAPI.getWAVersion()) - .catch(() => null); - - return await evaluateAndReturn(this.page, () => WAPI.getWAVersion()); - } - - /** - * Retrieves WA-JS version - * @category Host - */ - public async getWAJSVersion() { - await this.page.waitForFunction(() => WPP.version).catch(() => null); - - return await evaluateAndReturn(this.page, () => WPP.version); - } - - /** - * Retrieves the connecction state - * @category Host - */ - public async getConnectionState(): Promise { - return await evaluateAndReturn(this.page, () => { - return WPP.whatsapp.Socket.state as SocketState; - }); - } - - /** - * Retrieves if the phone is online. Please note that this may not be real time. - * @category Host - */ - public async isConnected() { - return await evaluateAndReturn(this.page, () => WAPI.isConnected()); - } - - /** - * Check is online - * @category Host - */ - public async isOnline(): Promise { - return await evaluateAndReturn(this.page, () => WPP.conn.isOnline()); - } - - /** - * Retrieves if the phone is online. Please note that this may not be real time. - * @category Host - */ - public async isLoggedIn() { - return await evaluateAndReturn(this.page, () => WAPI.isLoggedIn()); - } - - /** - * Retrieves Battery Level - * @category Host - */ - public async getBatteryLevel() { - return await evaluateAndReturn(this.page, () => WAPI.getBatteryLevel()); - } - - /** - * Start phone Watchdog, forcing the phone connection verification. - * - * @category Host - * @param interval interval number in miliseconds - */ - public async startPhoneWatchdog(interval: number = 15000) { - return await evaluateAndReturn( - this.page, - (interval) => WAPI.startPhoneWatchdog(interval), - interval - ); - } - - /** - * Stop phone Watchdog, more details in {@link startPhoneWatchdog} - * @category Host - */ - public async stopPhoneWatchdog(interval: number) { - return await evaluateAndReturn(this.page, () => WAPI.stopPhoneWatchdog()); - } - - /** - * Check the current session is an MultiDevice session - * @category Host - */ - public async isMultiDevice() { - return await evaluateAndReturn(this.page, () => WPP.conn.isMultiDevice()); - } - /** - * Retrieve main interface is authenticated, loaded and synced - * @category Host - */ - public async isMainReady() { - return await evaluateAndReturn(this.page, () => WPP.conn.isMainReady()); - } - - /** - * Retrieve if is authenticated - * @category Host - */ - public async isAuthenticated() { - return await evaluateAndReturn(this.page, () => WPP.conn.isAuthenticated()); - } - - /** - * Retrieve if main interface is authenticated and loaded, bot not synced - * @category Host - */ - public async isMainLoaded() { - return await evaluateAndReturn(this.page, () => WPP.conn.isMainLoaded()); - } - - /** - * Retrieve if main interface is initializing - * @category Host - */ - public async isMainInit() { - return await evaluateAndReturn(this.page, () => WPP.conn.isMainInit()); - } - - /** - * Join or leave of WhatsApp Web beta program. - * Will return the value seted - * @category Host - */ - public async joinWebBeta(value: boolean): Promise { - return await evaluateAndReturn( - this.page, - (value) => WPP.conn.joinWebBeta(value), - value - ); - } -} diff --git a/src/api/layers/labels.layer.ts b/src/api/layers/labels.layer.ts deleted file mode 100644 index 1bcf0a665..000000000 --- a/src/api/layers/labels.layer.ts +++ /dev/null @@ -1,146 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -import { Page } from 'puppeteer'; -import { CreateConfig } from '../../config/create-config'; -import { evaluateAndReturn } from '../helpers'; -import { CatalogLayer } from './catalog.layer'; - -export class LabelsLayer extends CatalogLayer { - constructor(public page: Page, session?: string, options?: CreateConfig) { - super(page, session, options); - } - /** - * Create New Label - * @category Labels - * - * @example - * ```javascript - * client.addNewLabel(`Name of label`); - * //or - * client.addNewLabel(`Name of label`, { labelColor: '#dfaef0' }); - * //or - * client.addNewLabel(`Name of label`, { labelColor: 4292849392 }); - * ``` - * @param name Name of label - * @param options options of label - */ - public async addNewLabel(name: string, options?: string) { - return await evaluateAndReturn( - this.page, - ({ name, options }) => { - WPP.labels.addNewLabel(name, options); - }, - { name, options } - ); - } - /** - * Add or delete label of chatId - * @category Labels - * - * @example - * ```javascript - * client.addOrRemoveLabels(['[number]@c.us','[number]@c.us'], - * [ - * { labelId:'76', type:'add' }, - * { labelId:'75', type:'remove' } - * ]); - * //or - * ``` - * @param chatIds ChatIds - * @param options options to remove or add - */ - public async addOrRemoveLabels( - chatIds: string, - options: { - labelId: string; - type: 'add' | 'remove'; - }[] - ) { - return await evaluateAndReturn( - this.page, - ({ chatIds, options }) => { - WPP.labels.addOrRemoveLabels(chatIds, options); - }, - { chatIds, options } - ); - } - /** - * Get all Labels - * - * @example - * ```javascript - * client.getAllLabels(); - * ``` - */ - public async getAllLabels() { - return evaluateAndReturn(this.page, () => WPP.labels.getAllLabels()); - } - - /** - * Get Label by id - * @category Labels - * @param id - Id of label - * - * @example - * ```javascript - * client.getLabelById('1'); - * ``` - */ - public async getLabelById(id: string) { - return await evaluateAndReturn( - this.page, - ({ id }) => { - WPP.labels.getLabelById(id); - }, - { id } - ); - } - /** - * Delete all Labels - * @category Labels - * - * @example - * ```javascript - * client.deleteAllLabels(); - * ``` - */ - public async deleteAllLabels() { - return await evaluateAndReturn(this.page, () => { - WPP.labels.deleteAllLabels(); - }); - } - /** - * Add or delete label of chatId - * @category Labels - * - * @example - * ```javascript - * client.deleteLabel(); - * ``` - * @param id Id or string to labels to delete - */ - public async deleteLabel(id: string | string[]) { - return await evaluateAndReturn( - this.page, - ({ id }) => { - WPP.labels.deleteLabel(id); - }, - { id } - ); - } -} diff --git a/src/api/layers/listener.layer.ts b/src/api/layers/listener.layer.ts deleted file mode 100644 index 51e0898c7..000000000 --- a/src/api/layers/listener.layer.ts +++ /dev/null @@ -1,681 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -import { EventEmitter, captureRejectionSymbol } from 'events'; -import { Page } from 'puppeteer'; -import { CreateConfig } from '../../config/create-config'; -import { evaluateAndReturn } from '../helpers'; -import { ExposedFn } from '../helpers/exposed.enum'; -import { - Ack, - Chat, - LiveLocation, - Message, - ParticipantEvent, - PresenceEvent, - Wid, - IncomingCall, -} from '../model'; -import { MessageType, SocketState, SocketStream } from '../model/enum'; -import { InterfaceMode } from '../model/enum/interface-mode'; -import { InterfaceState } from '../model/enum/interface-state'; -import { ProfileLayer } from './profile.layer'; -import { Label } from '../model/label'; -import { MsgKey } from '@wppconnect/wa-js/dist/whatsapp'; - -declare global { - interface Window { - onMessage: any; - onAnyMessage: any; - onStateChange: any; - onStreamChange: any; - onIncomingCall: any; - onAck: any; - } -} - -export class ListenerLayer extends ProfileLayer { - private listenerEmitter = new EventEmitter({ - captureRejections: true, - }); - - constructor(public page: Page, session?: string, options?: CreateConfig) { - super(page, session, options); - - this.listenerEmitter.setMaxListeners(0); - - this.listenerEmitter.on(ExposedFn.onInterfaceChange, (state) => { - this.log('http', `Current state: ${state.mode} (${state.displayInfo})`); - }); - this.listenerEmitter[captureRejectionSymbol] = ( - reason: any, - event: string - ) => { - let message = `Unhandled Rejection in a ${event} event: `; - if (reason instanceof Error) { - if (reason.stack) { - message += reason.stack; - } else { - message += reason.toString(); - } - } else { - message += JSON.stringify(reason); - } - this.log('error', reason); - }; - } - - protected async afterPageScriptInjected() { - await super.afterPageScriptInjected(); - - const functions = [ - ...Object.values(ExposedFn), - 'onAddedToGroup', - 'onIncomingCall', - 'onRevokedMessage', - 'onReactionMessage', - 'onPollResponse', - 'onUpdateLabel', - 'onOrderStatusUpdate', - ]; - - for (const func of functions) { - const has = await this.page - .evaluate((func) => typeof window[func] === 'function', func) - .catch(() => false); - - if (!has) { - this.log('debug', `Exposing ${func} function`); - await this.page - .exposeFunction(func, (...args) => { - Promise.resolve().then(() => { - const count = this.listenerEmitter.listenerCount(func); - if (count > 0) { - this.log( - 'debug', - `Emitting ${func} event (${count} registered)` - ); - } - this.listenerEmitter.emit(func, ...args); - }); - }) - .catch(() => {}); - } - } - - await this.page - .evaluate(() => { - try { - if (!window['onMessage'].exposed) { - WPP.on('chat.new_message', (msg) => { - if (msg.isSentByMe || msg.isStatusV3) { - return; - } - const serialized = WAPI.processMessageObj(msg, false, false); - if (serialized) { - window['onMessage'](serialized); - } - }); - - window['onMessage'].exposed = true; - } - } catch (error) { - console.error(error); - } - try { - if (!window['onAck'].exposed) { - window.WAPI.waitNewAcknowledgements(window['onAck']); - window['onAck'].exposed = true; - } - } catch (error) { - console.error(error); - } - try { - if (!window['onAnyMessage'].exposed) { - WPP.on('chat.new_message', (msg) => { - const serialized = WAPI.processMessageObj(msg, true, false); - if (serialized) { - window['onAnyMessage'](serialized); - } - }); - window['onAnyMessage'].exposed = true; - } - } catch (error) { - console.error(error); - } - try { - if (!window['onStateChange'].exposed) { - window.WAPI.onStateChange(window['onStateChange']); - window['onStateChange'].exposed = true; - } - } catch (error) { - console.error(error); - } - try { - if (!window['onStreamChange'].exposed) { - window.WAPI.onStreamChange(window['onStreamChange']); - window['onStreamChange'].exposed = true; - } - } catch (error) { - console.error(error); - } - try { - if (!window['onAddedToGroup'].exposed) { - window.WAPI.onAddedToGroup(window['onAddedToGroup']); - window['onAddedToGroup'].exposed = true; - } - } catch (error) { - console.error(error); - } - try { - if (!window['onIncomingCall'].exposed) { - window.WAPI.onIncomingCall(window['onIncomingCall']); - window['onIncomingCall'].exposed = true; - } - } catch (error) { - console.error(error); - } - try { - if (!window['onInterfaceChange'].exposed) { - window.WAPI.onInterfaceChange(window['onInterfaceChange']); - window['onInterfaceChange'].exposed = true; - } - } catch (error) { - console.error(error); - } - try { - if (!window['onNotificationMessage'].exposed) { - window.WAPI.onNotificationMessage(window['onNotificationMessage']); - window['onNotificationMessage'].exposed = true; - } - } catch (error) { - console.error(error); - } - try { - if (!window['onPresenceChanged'].exposed) { - WPP.on('chat.presence_change', window['onPresenceChanged']); - window['onPresenceChanged'].exposed = true; - } - } catch (error) { - console.error(error); - } - try { - if (!window['onLiveLocation'].exposed) { - window.WAPI.onLiveLocation(window['onLiveLocation']); - window['onLiveLocation'].exposed = true; - } - } catch (error) { - console.error(error); - } - try { - if (!window['onRevokedMessage'].exposed) { - WPP.on('chat.msg_revoke', (data) => { - const eventData = { - author: data.author, - from: data.from, - to: data.to, - id: data.id._serialized, - refId: data.refId._serialized, - }; - window['onRevokedMessage'](eventData); - }); - window['onRevokedMessage'].exposed = true; - } - } catch (error) { - console.error(error); - } - try { - if (!window['onReactionMessage'].exposed) { - WPP.on('chat.new_reaction', (data) => { - const eventData = { - id: data.id, - msgId: data.msgId, - reactionText: data.reactionText, - read: data.read, - orphan: data.orphan, - orphanReason: data.orphanReason, - timestamp: data.timestamp, - }; - window['onReactionMessage'](eventData); - }); - window['onReactionMessage'].exposed = true; - } - } catch (error) { - console.error(error); - } - try { - if (!window['onPollResponse'].exposed) { - WPP.on('chat.poll_response', (data) => { - const eventData = { - msgId: data.msgId, - chatId: data.chatId, - selectedOptions: data.selectedOptions, - timestamp: data.timestamp, - sender: data.sender, - }; - window['onPollResponse'](eventData); - }); - window['onPollResponse'].exposed = true; - } - } catch (error) { - console.error(error); - } - try { - if (!window['onUpdateLabel'].exposed) { - WPP.on('chat.update_label', (data) => { - const eventData = { - chat: data.chat, - ids: data.ids, - labels: data.labels, - type: data.type, - }; - window['onUpdateLabel'](eventData); - }); - window['onUpdateLabel'].exposed = true; - } - } catch (error) { - console.error(error); - } - try { - if (!window['onOrderStatusUpdate'].exposed) { - WPP.on('order.payment_status', (data) => { - const eventData = { - method: data.method, - timestamp: data.timestamp, - reference_id: data.reference_id, - msgId: data.msgId, - }; - window['onOrderStatusUpdate'](eventData); - }); - window['onOrderStatusUpdate'].exposed = true; - } - } catch (error) { - console.error(error); - } - try { - if (!window['onParticipantsChanged'].exposed) { - WPP.on('group.participant_changed', (participantChangedEvent) => { - window['onParticipantsChanged'](participantChangedEvent); - }); - window['onParticipantsChanged'].exposed = true; - } - } catch (error) { - console.error(error); - } - }) - .catch(() => {}); - } - - /** - * Register the event and create a disposable object to stop the listening - * @param event Name of event - * @param listener The function to execute - * @returns Disposable object to stop the listening - */ - protected registerEvent( - event: string | symbol, - listener: (...args: any[]) => void - ) { - this.log('debug', `Registering ${event.toString()} event`); - this.listenerEmitter.on(event, listener); - return { - dispose: () => { - this.listenerEmitter.off(event, listener); - }, - }; - } - - /** - * @event Listens to all new messages received only. - * @returns Disposable object to stop the listening - */ - public onMessage(callback: (message: Message) => void) { - return this.registerEvent(ExposedFn.OnMessage, callback); - } - - /** - * @event Listens to all new messages, sent and received. - * @param to callback - * @fires Message - * @returns Disposable object to stop the listening - */ - public onAnyMessage(callback: (message: Message) => void) { - return this.registerEvent(ExposedFn.OnAnyMessage, callback); - } - - /** - * @event Listens to all notification messages, like group changes, join, leave - * @param to callback - * @fires Message - * @returns Disposable object to stop the listening - */ - public onNotificationMessage(callback: (message: Message) => void) { - return this.registerEvent(ExposedFn.onNotificationMessage, callback); - } - - /** - * @event Listens List of mobile states - * @returns Disposable object to stop the listening - */ - public onStateChange(callback: (state: SocketState) => void) { - return this.registerEvent(ExposedFn.onStateChange, callback); - } - - /** - * @event Returns the current state of the connection - * @returns Disposable object to stop the listening - */ - public onStreamChange(callback: (state: SocketStream) => void) { - return this.registerEvent(ExposedFn.onStreamChange, callback); - } - - /** - * @event Listens to interface mode change See {@link InterfaceState} and {@link InterfaceMode} for details - * @returns Disposable object to stop the listening - */ - public onInterfaceChange( - callback: (state: { - displayInfo: InterfaceState; - mode: InterfaceMode; - }) => void - ) { - return this.registerEvent(ExposedFn.onInterfaceChange, callback); - } - - /** - * @event Listens to messages acknowledgement Changes - * @returns Disposable object to stop the listening - */ - public onAck(callback: (ack: Ack) => void) { - return this.registerEvent(ExposedFn.onAck, callback); - } - - /** - * Escuta os eventos de Localização em tempo real de todos os chats - * @event Eventos de Localização em tempo real - * @param callback Função para ser executada quando houver alterações - * @returns Objeto descartável para parar de ouvir - */ - public onLiveLocation(callback: (liveLocationEvent: LiveLocation) => void): { - dispose: () => void; - }; - /** - * Escuta os eventos de Localização em tempo real - * @event Eventos de Localização em tempo real - * @param id Único ID ou lista de IDs de contatos para acompanhar a localização - * @param callback Função para ser executada quando houver alterações - * @returns Objeto descartável para parar de ouvir - */ - public onLiveLocation( - id: string | string[], - callback: (liveLocationEvent: LiveLocation) => void - ): { dispose: () => void }; - public onLiveLocation( - id: any, - callback?: (liveLocationEvent: LiveLocation) => void - ) { - const ids: string[] = []; - - if (typeof id === 'function') { - callback = id; - } else if (Array.isArray(id)) { - ids.push(...id); - } else { - ids.push(id); - } - - return this.registerEvent( - ExposedFn.onLiveLocation, - (event: LiveLocation) => { - // Only group events - if (ids.length && !ids.includes(event.id)) { - return; - } - callback(event); - } - ); - } - - /** - * @event Listens to participants changed - * @param to callback - * @returns Stream of ParticipantEvent - */ - public onParticipantsChanged(callback: (evData: ParticipantEvent) => void): { - dispose: () => void; - }; - /** - * @event Listens to participants changed - * @param to group id: xxxxx-yyyy@us.c - * @param to callback - * @returns Stream of ParticipantEvent - */ - public onParticipantsChanged( - groupId: string, - callback: (evData: ParticipantEvent) => void - ): { dispose: () => void }; - public onParticipantsChanged( - groupId: any, - callback?: (evData: ParticipantEvent) => void - ): { dispose: () => void } { - if (typeof groupId === 'function') { - callback = groupId; - groupId = null; - } - - return this.registerEvent(ExposedFn.onParticipantsChanged, (evData) => { - if (groupId && groupId !== evData.groupId) { - return; - } - callback({ - by: evData.author, - byPushName: evData.authorPushName, - groupId: evData.groupId, - action: evData.action, - operation: evData.operation, - who: evData.participants, - }); - }); - } - - /** - * @event Fires callback with Chat object every time the host phone is added to a group. - * @param to callback - * @returns Disposable object to stop the listening - */ - public onAddedToGroup(callback: (chat: Chat) => any) { - return this.registerEvent('onAddedToGroup', callback); - } - - /** - * @event Listen for incoming calls, whether audio or video (pending a reaction). - * To reject the call, simply call `rejectCall` {@link rejectCall} - * @returns Disposable object to stop listening - */ - public onIncomingCall(callback: (call: IncomingCall) => any) { - return this.registerEvent('onIncomingCall', callback); - } - - /** - * Listens to presence changed, by default, it will be triggered for active chats only or contacts subscribed (see {@link subscribePresence}) - * @event Listens to presence changed - * @param callback Callback of on presence changed - * @returns Disposable object to stop the listening - */ - public onPresenceChanged( - callback: (presenceChangedEvent: PresenceEvent) => void - ): { dispose: () => void }; - /** - * Listens to presence changed, the callback will triggered only for passed IDs - * @event Listens to presence changed - * @param id contact id (xxxxx@c.us) or group id: xxxxx-yyyy@g.us - * @param callback Callback of on presence changed - * @returns Disposable object to stop the listening - */ - public onPresenceChanged( - id: string | string[], - callback: (presenceChangedEvent: PresenceEvent) => void - ): { dispose: () => void }; - public onPresenceChanged( - id: any, - callback?: (presenceChangedEvent: PresenceEvent) => void - ): { dispose: () => void } { - const ids = []; - - if (typeof id === 'function') { - callback = id; - } else if (Array.isArray(id)) { - ids.push(...id); - } else { - ids.push(id); - } - - if (ids.length) { - this.subscribePresence(ids); - } - - return this.registerEvent( - ExposedFn.onPresenceChanged, - (presence: PresenceEvent) => { - // Only group events - if (ids.length && !ids.includes(presence.id)) { - return; - } - callback(presence); - } - ); - } - - /** - * Subscribe presence of a contact or group to use in onPresenceChanged (see {@link onPresenceChanged}) - * - * ```typescript - * // subcribe all contacts - * const contacts = await client.getAllContacts(); - * await client.subscribePresence(contacts.map((c) => c.id._serialized)); - * - * // subcribe all groups participants - * const chats = await client.getAllGroups(false); - * for (const c of chats) { - * const ids = c.groupMetadata.participants.map((p) => p.id._serialized); - * await client.subscribePresence(ids); - * } - * ``` - * - * @param id contact id (xxxxx@c.us) or group id: xxxxx-yyyy@g.us - * @returns number of subscribed - */ - public async subscribePresence(id: string | string[]): Promise { - return await evaluateAndReturn( - this.page, - (id) => WAPI.subscribePresence(id), - id - ); - } - /** - * Unsubscribe presence of a contact or group to use in onPresenceChanged (see {@link onPresenceChanged}) - * @param id contact id (xxxxx@c.us) or group id: xxxxx-yyyy@g.us - * @returns number of unsubscribed - */ - public async unsubscribePresence(id: string | string[]): Promise { - return await evaluateAndReturn( - this.page, - (id) => WAPI.unsubscribePresence(id), - id - ); - } - - /** - * @event Listens to revoked messages - * @returns Disposable object to stop the listening - */ - public onRevokedMessage( - callback: (data: { - author?: string; - from: string; - to: string; - id: string; - refId: String; - }) => any - ) { - return this.registerEvent('onRevokedMessage', callback); - } - - /** - * @event Listens to reaction messages - * @returns Disposable object to stop the listening - */ - public onReactionMessage( - callback: (data: { - id: string; - msgId: string; - reactionText: string; - read: boolean; - orphan: number; - orphanReason: any; - timestamp: number; - }) => any - ) { - return this.registerEvent('onReactionMessage', callback); - } - - /** - * @event Listens to poll response messages - * @returns Disposable object to stop the listening - */ - public onPollResponse( - callback: (data: { - msgId: string; - chatId: Wid; - selectedOptions: any; - timestamp: number; - sender: Wid; - }) => any - ) { - return this.registerEvent('onPollResponse', callback); - } - - /** - * @event Listens to update label - * @returns Disposable object to stop the listening - */ - public onUpdateLabel( - callback: (data: { - chat: Chat; - ids: string[]; - labels: Label[]; - type: 'add' | 'remove'; - }) => any - ) { - return this.registerEvent('onUpdateLabel', callback); - } - - /** - * @event Listens to update order status - * @returns Disposable object to stop the listening - */ - public onOrderStatusUpdate( - callback: (data: { - method: string; - timestamp: number; - reference_id: string; - msgId: MsgKey; - }) => any - ) { - return this.registerEvent('onOrderStatusUpdate', callback); - } -} diff --git a/src/api/layers/newsletter.layer.ts b/src/api/layers/newsletter.layer.ts deleted file mode 100644 index 6f6133694..000000000 --- a/src/api/layers/newsletter.layer.ts +++ /dev/null @@ -1,112 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -import { Page } from 'puppeteer'; -import { CreateConfig } from '../../config/create-config'; -import { evaluateAndReturn } from '../helpers'; -import { HostLayer } from './host.layer'; - -export class NewsletterLayer extends HostLayer { - constructor(public page: Page, session?: string, options?: CreateConfig) { - super(page, session, options); - } - - /** - * Create Newsletter - * @category Newsletter - * - * @example - * ```javascript - * client.createNewsletter('Name for your newsletter', {description: 'Description for that', picture: ' WPP.newsletter.create(name, options), - name, - options - ); - } - - /** - * Destroy a Newsletter - * @category Newsletter - * - * @example - * ```javascript - * client.destroyNewsletter('[newsletter-id]@newsletter'); - * ``` - * @param name id of Newsletter - */ - public async destroyNewsletter(id: string) { - return evaluateAndReturn(this.page, (id) => WPP.newsletter.destroy(id), id); - } - - /** - * Edit a Newsletter - * @category Newsletter - * - * @example - * ```javascript - * client.editNewsletter('[newsletter-id]@newsletter', { - description: 'new description'; - name: 'new name'; - picture: ''; - }); - * ``` - * @param name id of Newsletter - */ - public async editNewsletter( - id: string, - opts?: { - description?: string; - name?: string; - picture?: string | null; - } - ) { - return evaluateAndReturn( - this.page, - (id, opts) => WPP.newsletter.edit(id, opts), - id, - opts - ); - } - - /** - * Mute a Newsletter - * @category Newsletter - * - * @example - * ```javascript - * client.muteNewsletter('[newsletter-id]@newsletter'); - * ``` - * @param name id of Newsletter - */ - public async muteNesletter(id: string) { - return evaluateAndReturn(this.page, (id) => WPP.newsletter.mute(id), id); - } -} diff --git a/src/api/layers/profile.layer.ts b/src/api/layers/profile.layer.ts deleted file mode 100644 index 30bfe5446..000000000 --- a/src/api/layers/profile.layer.ts +++ /dev/null @@ -1,169 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -import { Page } from 'puppeteer'; -import { HostLayer } from './host.layer'; -import { - base64MimeType, - fileToBase64, - downloadFileToBase64, - resizeImg, - evaluateAndReturn, -} from '../helpers'; -import { CreateConfig } from '../../config/create-config'; -import { StatusLayer } from './status.layer'; - -export class ProfileLayer extends StatusLayer { - constructor(public page: Page, session?: string, options?: CreateConfig) { - super(page, session, options); - } - - /** - * @category Chat - * @param contactsId Example: 0000@c.us | [000@c.us, 1111@c.us] - * @param time duration of silence - * @param type kind of silence "hours" "minutes" "year" - * To remove the silence, just enter the contact parameter - */ - public async sendMute( - id: string, - time: number, - type: string - ): Promise { - const result = await evaluateAndReturn( - this.page, - (id, time, type) => WAPI.sendMute(id, time, type), - id, - time, - type - ); - if (result['erro'] == true) { - throw result; - } - return result; - } - - /** - * Change the theme - * @category Host - * @param string types "dark" or "light" - */ - public setTheme(type: string) { - return evaluateAndReturn(this.page, (type) => WAPI.setTheme(type), type); - } - - /** - * Sets current user profile status - * @category Profile - * @param status - */ - public async setProfileStatus(status: string) { - return await evaluateAndReturn( - this.page, - ({ status }) => { - WPP.profile.setMyStatus(status); - }, - { status } - ); - } - - /** - * Sets the user's current profile photo - * @category Profile - * @param name - */ - public async setProfilePic(pathOrBase64: string, to?: string) { - let base64: string = ''; - - if (pathOrBase64.startsWith('data:')) { - base64 = pathOrBase64; - } else { - let fileContent = await downloadFileToBase64(pathOrBase64, [ - 'image/gif', - 'image/png', - 'image/jpg', - 'image/jpeg', - 'image/webp', - ]); - if (!fileContent) { - fileContent = await fileToBase64(pathOrBase64); - } - if (fileContent) { - base64 = fileContent; - } - } - - if (!base64) { - const error = new Error('Empty or invalid file or base64'); - Object.assign(error, { - code: 'empty_file', - }); - throw error; - } - - const mimeInfo = base64MimeType(base64); - - if (!mimeInfo || !mimeInfo.includes('image')) { - const error = new Error( - 'Not an image, allowed formats png, jpeg and webp' - ); - Object.assign(error, { - code: 'invalid_image', - }); - throw error; - } - - const buff = Buffer.from( - base64.replace(/^data:image\/(png|jpe?g|webp);base64,/, ''), - 'base64' - ); - let _webb64_96 = await resizeImg(buff, { width: 96, height: 96 }), - _webb64_640 = await resizeImg(buff, { width: 640, height: 640 }); - let obj = { a: _webb64_640, b: _webb64_96 }; - - return await evaluateAndReturn( - this.page, - ({ obj, to }) => WAPI.setProfilePic(obj, to), - { - obj, - to, - } - ); - } - - /** - * Sets current user profile name - * @category Profile - * @param name - */ - public async setProfileName(name: string) { - return await evaluateAndReturn( - this.page, - ({ name }) => WPP.profile.setMyProfileName(name), - { name } - ); - } - /** - * Remove your profile picture - * @category Profile - */ - public async removeMyProfilePicture() { - return await evaluateAndReturn(this.page, () => - WPP.profile.removeMyProfilePicture() - ); - } -} diff --git a/src/api/layers/retriever.layer.ts b/src/api/layers/retriever.layer.ts deleted file mode 100644 index d952b1119..000000000 --- a/src/api/layers/retriever.layer.ts +++ /dev/null @@ -1,636 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -import { Page } from 'puppeteer'; -import { CreateConfig } from '../../config/create-config'; -import { SessionToken } from '../../token-store'; -import { evaluateAndReturn } from '../helpers'; -import { - Chat, - Contact, - ContactStatus, - ProfilePicThumbObj, - WhatsappProfile, - Wid, -} from '../model'; -import { SenderLayer } from './sender.layer'; -import { ChatListOptions } from '@wppconnect/wa-js/dist/chat'; - -export class RetrieverLayer extends SenderLayer { - constructor(public page: Page, session?: string, options?: CreateConfig) { - super(page, session, options); - } - - /** - * Returns a list of mute and non-mute users - * @category Chat - * @param type return type: all, toMute and noMute. - * @returns obj - */ - public async getListMutes(type?: string): Promise { - return await evaluateAndReturn( - this.page, - (type: string) => WAPI.getListMute(type), - type - ); - } - - /** - * Returns browser session token - * @category Host - * @returns obj [token] - */ - public async getSessionTokenBrowser( - removePath?: boolean - ): Promise { - if (removePath === true) { - await evaluateAndReturn(this.page, () => { - window['pathSession'] = true; - }); - } - if (await this.isMultiDevice()) { - return await this.page - .evaluate(() => { - if (window.localStorage) { - return { - WABrowserId: - window.localStorage.getItem('WABrowserId') || 'MultiDevice', - WASecretBundle: 'MultiDevice', - WAToken1: 'MultiDevice', - WAToken2: 'MultiDevice', - }; - } - return null; - }) - .catch(() => null); - } - return await this.page - .evaluate(() => { - if (window.localStorage) { - return { - WABrowserId: window.localStorage.getItem('WABrowserId'), - WASecretBundle: window.localStorage.getItem('WASecretBundle'), - WAToken1: window.localStorage.getItem('WAToken1'), - WAToken2: window.localStorage.getItem('WAToken2'), - }; - } - return null; - }) - .catch(() => null); - } - - /** - * Receive the current theme - * @category Host - * @returns string light or dark - */ - public async getTheme() { - return await evaluateAndReturn(this.page, () => WAPI.getTheme()); - } - - /** - * Receive all blocked contacts - * @category Blocklist - * @returns array of [0,1,2,3....] - */ - public async getBlockList() { - return await evaluateAndReturn(this.page, () => - WPP.blocklist.all().map((b) => b.toString()) - ); - } - - /** - * Retrieves all chats - * Deprecated in favor of {@link listChats} - * - * @category Chat - * @returns array of [Chat] - * @deprecated Deprecated in favor of listChats. - */ - public async getAllChats(withNewMessageOnly = false) { - this.logger.warn( - 'Deprecated: This function [getAllChats] is deprecated in favor of the listChats function. Please update your code accordingly.' - ); - if (withNewMessageOnly) { - return evaluateAndReturn(this.page, () => WAPI.getAllChatsWithNewMsg()); - } else { - return evaluateAndReturn(this.page, () => WAPI.getAllChats()); - } - } - - /** - * Return list of chats - * * @example - * ```javascript - * // All chats - * const chats = await client.listChats(); - * - * // Some chats - * const chats = client.listChats({count: 20}); - * - * // 20 chats before specific chat - * const chats = client.listChats({count: 20, direction: 'before', id: '[number]@c.us'}); - * - * // Only users chats - * const chats = await client.listChats({onlyUsers: true}); - * - * // Only groups chats - * const chats = await client.listChats({onlyGroups: true}); - * - * // Only with label Text - * const chats = await client.listChats({withLabels: ['Test']}); - * - * // Only with label id - * const chats = await client.listChats({withLabels: ['1']}); - * - * // Only with label with one of text or id - * const chats = await client.listChats({withLabels: ['Alfa','5']}); - * ``` - * @category Chat - * @returns array of [Chat] - */ - public async listChats(options?: ChatListOptions): Promise { - return await evaluateAndReturn( - this.page, - async ({ options }) => { - const chats = await WPP.chat.list(options); - - const serialized = chats.map((c) => WAPI._serializeChatObj(c)); - return serialized; - }, - { options } - ); - } - - /** - * Checks if a number is a valid WA number - * @category Contact - * @param contactId, you need to include the @c.us at the end. - * @returns contact detial as promise - */ - public async checkNumberStatus(contactId: string): Promise { - const result = await evaluateAndReturn( - this.page, - (contactId) => WPP.contact.queryExists(contactId), - contactId - ); - - if (!result) { - return { - id: contactId as any, - isBusiness: false, - canReceiveMessage: false, - numberExists: false, - status: 404, - }; - } - - return { - id: result.wid as any, - isBusiness: result.biz, - canReceiveMessage: true, - numberExists: true, - status: 200, - }; - } - - /** - * Retrieves all chats with messages - * Deprecated in favor of {@link listChats} - * - * @category Chat - * @returns array of [Chat] - * @deprecated Deprecated in favor of listChats. - */ - public async getAllChatsWithMessages(withNewMessageOnly = false) { - this.logger.warn( - 'Deprecated: This function [getAllChatsWithMessages] is deprecated in favor of the listChats function. Please update your code accordingly.' - ); - return evaluateAndReturn( - this.page, - (withNewMessageOnly: boolean) => - WAPI.getAllChatsWithMessages(withNewMessageOnly), - withNewMessageOnly - ); - } - - /** - * Retrieve all groups - * Deprecated in favor of {@link listChats} - * - * @category Group - * @returns array of groups - * @deprecated Deprecated in favor of listChats. - */ - public async getAllGroups(withNewMessagesOnly = false): Promise { - this.logger.warn( - 'Deprecated: This function [getAllGroups] is deprecated in favor of the listChats function. Please update your code accordingly.' - ); - return await evaluateAndReturn( - this.page, - async ({ withNewMessagesOnly }) => { - const chats = await WPP.chat.list({ - onlyGroups: true, - onlyWithUnreadMessage: withNewMessagesOnly, - }); - - const groups = await Promise.all( - chats.map((c) => WPP.group.ensureGroup(c.id)) - ); - - return groups.map((g) => WAPI._serializeChatObj(g)); - }, - { withNewMessagesOnly } - ); - } - - /** - * Retrieve all broadcast list - * @category Group - * @returns array of broadcast list - */ - public async getAllBroadcastList() { - const chats = await evaluateAndReturn(this.page, () => WAPI.getAllChats()); - return chats.filter( - (chat) => chat.isBroadcast && chat.id._serialized !== 'status@broadcast' - ); - } - - /** - * Retrieves contact detail object of given contact id - * @category Contact - * @param contactId - * @returns contact detial as promise - */ - public async getContact(contactId: string) { - return evaluateAndReturn( - this.page, - (contactId) => WAPI.getContact(contactId), - contactId - ); - } - - /** - * Retrieves all contacts - * @category Contact - * @returns array of [Contact] - */ - public async getAllContacts() { - return await evaluateAndReturn(this.page, () => WAPI.getAllContacts()); - } - - /** - * Retrieves chat object of given contact id - * @category Chat - * @param contactId - * @returns contact detial as promise - */ - public async getChatById(contactId: string): Promise { - return evaluateAndReturn( - this.page, - (contactId) => WAPI.getChatById(contactId), - contactId - ); - } - - /** - * Retrieves chat object of given contact id - * @category Chat - * @param contactId - * @returns contact detial as promise - * @deprecated - */ - public async getChat(contactId: string) { - return this.getChatById(contactId); - } - - /** - * Retorna dados da imagem do contato - * @category Contact - * @param chatId Chat id - * @returns url of the chat picture or undefined if there is no picture for the chat. - */ - public async getProfilePicFromServer( - chatId: string - ): Promise { - return evaluateAndReturn( - this.page, - (chatId) => WAPI._profilePicfunc(chatId), - chatId - ); - } - - /** - * Load more messages in chat object from server. Use this in a while loop - * Depreciado em favor de {@link getMessages} - * - * @deprecated Depreciado em favor de getMessages - * @category Chat - * @param contactId - * @returns contact detial as promise - */ - public async loadEarlierMessages(contactId: string) { - return evaluateAndReturn( - this.page, - (contactId) => WAPI.loadEarlierMessages(contactId), - contactId - ); - } - - /** - * Retrieves status of given contact - * @category Contact - * @param contactId - */ - public async getStatus(contactId: string): Promise { - return await evaluateAndReturn( - this.page, - async (contactId) => { - const status = await WPP.contact.getStatus(contactId); - - return { - id: contactId, - status: (status as any)?.status || status, - }; - }, - contactId - ); - } - - /** - * Checks if a number is a valid whatsapp number - * - * Deprecated in favor of checkNumberStatus - * @deprecated Deprecated in favor of checkNumberStatus - * @category Contact - * @param contactId, you need to include the @c.us at the end. - * @returns contact detial as promise - */ - public async getNumberProfile(contactId: string) { - this.log( - 'warn', - 'The getNumberProfile function is deprecated, please use checkNumberStatus' - ); - return evaluateAndReturn( - this.page, - (contactId) => WAPI.getNumberProfile(contactId), - contactId - ); - } - - /** - * Retrieves all undread Messages - * @category Chat - * @param includeMe - * @param includeNotifications - * @param useUnreadCount - * @returns any - * @deprecated - */ - public async getUnreadMessages( - includeMe: boolean, - includeNotifications: boolean, - useUnreadCount: boolean - ) { - return await evaluateAndReturn( - this.page, - ({ includeMe, includeNotifications, useUnreadCount }) => - WAPI.getUnreadMessages(includeMe, includeNotifications, useUnreadCount), - { includeMe, includeNotifications, useUnreadCount } - ); - } - - /** - * Retrieves all unread messages (where ack is -1) - * @category Chat - * @returns list of messages - */ - public async getAllUnreadMessages() { - return evaluateAndReturn(this.page, () => WAPI.getAllUnreadMessages()); - } - - /** - * Retrieves all new messages (where isNewMsg is true) - * @category Chat - * @returns List of messages - * @deprecated Use getAllUnreadMessages - */ - public async getAllNewMessages() { - return await evaluateAndReturn(this.page, () => WAPI.getAllNewMessages()); - } - - /** - * Retrieves all messages already loaded in a chat - * For loading every message use loadAndGetAllMessagesInChat - * Depreciado em favor de {@link getMessages} - * - * @deprecated Depreciado em favor de getMessages - * - * @category Chat - * @param chatId, the chat to get the messages from - * @param includeMe, include my own messages? boolean - * @param includeNotifications - * @returns any - */ - public async getAllMessagesInChat( - chatId: string, - includeMe: boolean, - includeNotifications: boolean - ) { - return await evaluateAndReturn( - this.page, - ({ chatId, includeMe, includeNotifications }) => - WAPI.getAllMessagesInChat(chatId, includeMe, includeNotifications), - { chatId, includeMe, includeNotifications } - ); - } - - /** - * Loads and Retrieves all Messages in a chat - * Depreciado em favor de {@link getMessages} - * - * @deprecated Depreciado em favor de getMessages - * @category Chat - * @param chatId, the chat to get the messages from - * @param includeMe, include my own messages? boolean - * @param includeNotifications - * @returns any - */ - public async loadAndGetAllMessagesInChat( - chatId: string, - includeMe = false, - includeNotifications = false - ) { - return await evaluateAndReturn( - this.page, - ({ chatId, includeMe, includeNotifications }) => - WAPI.loadAndGetAllMessagesInChat( - chatId, - includeMe, - includeNotifications - ), - { chatId, includeMe, includeNotifications } - ); - } - - /** - * Checks if a CHAT contact is online. - * @category Chat - * @param chatId chat id: xxxxx@c.us - */ - public async getChatIsOnline(chatId: string): Promise { - return await evaluateAndReturn( - this.page, - (chatId: string) => WAPI.getChatIsOnline(chatId), - chatId - ); - } - - /** - * Retrieves the last seen of a CHAT. - * @category Chat - * @param chatId chat id: xxxxx@c.us - */ - public async getLastSeen(chatId: string): Promise { - return await evaluateAndReturn( - this.page, - (chatId: string) => WAPI.getLastSeen(chatId), - chatId - ); - } - - /** - * Get the platform message from message ID - * - * The platform can be: - * android - * iphone - * web - * unknown - * @category Chat - * @param chatId chat id: xxxxx@c.us - */ - public async getPlatformFromMessage(msgId: string): Promise { - return await evaluateAndReturn( - this.page, - (msgId: string) => WPP.chat.getPlatformFromMessage(msgId), - msgId - ); - } - - /** - * Get the reactions of a message - * - * @category Chat - */ - public async getReactions(msgId: string): Promise<{ - reactionByMe: { - id: any; - orphan: number; - msgId: any; - reactionText: string; - read: boolean; - senderUserJid: string; - timestamp: number; - }; - reactions: { - aggregateEmoji: string; - hasReactionByMe: boolean; - senders: { - id: any; - orphan: number; - msgId: any; - reactionText: string; - read: boolean; - senderUserJid: string; - timestamp: number; - }[]; - }[]; - }> { - return await evaluateAndReturn( - this.page, - (msgId: string) => WPP.chat.getReactions(msgId), - msgId - ); - } - - /** - * Get the votes of a poll message - * - * @category Chat - */ - public async getVotes(msgId: string): Promise<{ - msgId: any; - chatId: Wid; - votes: { - selectedOptions: number[]; - timestamp: number; - sender: Wid; - }[]; - }> { - return await evaluateAndReturn( - this.page, - (msgId: string) => WPP.chat.getVotes(msgId), - msgId - ); - } - - /** - * Get the max number of participants for a group - * - * @category Group - */ - public async getGroupSizeLimit(): Promise { - return await evaluateAndReturn(this.page, () => - WPP.group.getGroupSizeLimit() - ); - } - - /** - * Get info of your sended order - * - * @example - * ```javascript - * const orderInfo = await client.getOrder(''); - * ``` - * @category Order - * @return Your order - */ - public async getOrder(msgId: string) { - return evaluateAndReturn(this.page, (msgId) => WPP.order.get(msgId), msgId); - } - - /** - * Get all commons groups for the contact - * - * @example - * ```javascript - * const groups_ids = await client.getCommonGroups('[number]@c.us'); - * ``` - * - * @category Group - * @param groupId Group ID ('000000-000000@g.us') - * @returns Promise - */ - public async getCommonGroups(wid: string) { - return await evaluateAndReturn( - this.page, - ({ wid }) => WPP.contact.getCommonGroups(wid), - { wid } - ); - } -} diff --git a/src/api/layers/sender.layer.ts b/src/api/layers/sender.layer.ts deleted file mode 100644 index 8c24365ba..000000000 --- a/src/api/layers/sender.layer.ts +++ /dev/null @@ -1,1420 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -import type { - FileMessageOptions, - ListMessageOptions, - LocationMessageOptions, - SendMessageReturn, - TextMessageOptions, - PoolMessageOptions, - ForwardMessagesOptions, -} from '@wppconnect/wa-js/dist/chat'; -import * as path from 'path'; -import { Page } from 'puppeteer'; -import { CreateConfig } from '../../config/create-config'; -import { convertToMP4GIF } from '../../utils/ffmpeg'; -import { sleep } from '../../utils/sleep'; -import { - base64MimeType, - downloadFileToBase64, - evaluateAndReturn, - fileToBase64, - stickerSelect, -} from '../helpers'; -import { filenameFromMimeType } from '../helpers/filename-from-mimetype'; -import { Message, SendFileResult, SendStickerResult } from '../model'; -import { ChatState } from '../model/enum'; -import { ListenerLayer } from './listener.layer'; -import { - OrderItems, - OrderMessageOptions, -} from '@wppconnect/wa-js/dist/chat/functions/sendOrderMessage'; - -export class SenderLayer extends ListenerLayer { - constructor(public page: Page, session?: string, options?: CreateConfig) { - super(page, session, options); - } - - /** - * Automatically sends a link with the auto generated link preview. You can also add a custom message to be added. - * - * Deprecated: please use {@link sendText} - * - * @category Chat - * @deprecated - * @param chatId - * @param url string A link, for example for youtube. e.g https://www.youtube.com/watch?v=Zi_XLOBDo_Y&list=RDEMe12_MlgO8mGFdeeftZ2nOQ&start_radio=1 - * @param text custom text as the message body, this includes the link or will be attached after the link - */ - public async sendLinkPreview(chatId: string, url: string, text: string = '') { - const message = text.includes(url) ? text : `${url}\n${text}`; - - const result = await evaluateAndReturn( - this.page, - ({ chatId, message }) => { - return WPP.chat.sendTextMessage(chatId, message, { linkPreview: true }); - }, - { chatId, message } - ); - - return result; - } - - /** - * Sends a text message to given chat - * @category Chat - * @param to chat id: xxxxx@us.c - * @param content text message - * - * @example - * ```javascript - * // Simple message - * client.sendText('@c.us', 'A simple message'); - * - * // A message with reply - * client.sendText('@c.us', 'A simple message', { - * quotedMsg: 'true_...@c.us_3EB01DE65ACC6_out' - * }); - * - * // With buttons - * client.sendText('@c.us', 'WPPConnect message with buttons', { - * useTemplateButtons: true, // False for legacy - * buttons: [ - * { - * url: 'https://wppconnect.io/', - * text: 'WPPConnect Site' - * }, - * { - * phoneNumber: '+55 11 22334455', - * text: 'Call me' - * }, - * { - * id: 'your custom id 1', - * text: 'Some text' - * }, - * { - * id: 'another id 2', - * text: 'Another text' - * } - * ], - * title: 'Title text' // Optional - * footer: 'Footer text' // Optional - * }); - * ``` - */ - public async sendText( - to: string, - content: string, - options?: TextMessageOptions - ): Promise { - const sendResult = await evaluateAndReturn( - this.page, - ({ to, content, options }) => - WPP.chat.sendTextMessage(to, content, { - ...options, - waitForAck: true, - }), - { to, content, options: options as any } - ); - - // I don't know why the evaluate is returning undefined for direct call - // To solve that, I added `JSON.parse(JSON.stringify())` to solve that - const result = (await evaluateAndReturn( - this.page, - async ({ messageId }) => { - return JSON.parse(JSON.stringify(await WAPI.getMessageById(messageId))); - }, - { messageId: sendResult.id } - )) as Message; - - if (result['erro'] == true) { - throw result; - } - - return result; - } - - /** - * - * @category Chat - * @param chat - * @param content - * @param options - * @returns - */ - public async sendMessageOptions( - chat: any, - content: any, - options?: any - ): Promise { - const messageId = await evaluateAndReturn( - this.page, - ({ chat, content, options }) => { - return WAPI.sendMessageOptions(chat, content, options); - }, - { chat, content, options } - ); - const result = (await evaluateAndReturn( - this.page, - (messageId: any) => WAPI.getMessageById(messageId), - messageId - )) as Message; - return result; - } - - /** - * Sends image message - * @category Chat - * @param to Chat id - * @param filePath File path or http link - * @param filename - * @param caption - * @param quotedMessageId Quoted message id - * @param isViewOnce Enable single view - */ - public async sendImage( - to: string, - filePath: string, - filename?: string, - caption?: string, - quotedMessageId?: string, - isViewOnce?: boolean - ) { - let base64 = await downloadFileToBase64(filePath, [ - 'image/gif', - 'image/png', - 'image/jpg', - 'image/jpeg', - 'image/webp', - ]); - - if (!base64) { - base64 = await fileToBase64(filePath); - } - - if (!base64) { - const obj = { - erro: true, - to: to, - text: 'No such file or directory, open "' + filePath + '"', - }; - throw obj; - } - - if (!filename) { - filename = path.basename(filePath); - } - - return await this.sendImageFromBase64( - to, - base64, - filename, - caption, - quotedMessageId, - isViewOnce - ); - } - - /** - * Sends image message - * @category Chat - * @param to Chat id - * @param base64 File path, http link or base64Encoded - * @param filename - * @param caption - * @param quotedMessageId Quoted message id - * @param isViewOnce Enable single view - * @param mentionedList - */ - public async sendImageFromBase64( - to: string, - base64: string, - filename: string, - caption?: string, - quotedMessageId?: string, - isViewOnce?: boolean, - mentionedList?: any - ) { - let mimeType = base64MimeType(base64); - - if (!mimeType) { - const obj = { - erro: true, - to: to, - text: 'Invalid base64!', - }; - throw obj; - } - - if (!mimeType.includes('image')) { - const obj = { - erro: true, - to: to, - text: 'Not an image, allowed formats png, jpeg and webp', - }; - throw obj; - } - - filename = filenameFromMimeType(filename, mimeType); - - const result = await evaluateAndReturn( - this.page, - async ({ - to, - base64, - filename, - caption, - quotedMessageId, - isViewOnce, - mentionedList, - }) => { - const result = await WPP.chat.sendFileMessage(to, base64, { - type: 'image', - isViewOnce, - filename, - caption, - quotedMsg: quotedMessageId, - waitForAck: true, - detectMentioned: true, - mentionedList: mentionedList, - }); - - return { - ack: result.ack, - id: result.id, - sendMsgResult: await result.sendMsgResult, - }; - }, - { - to, - base64, - filename, - caption, - quotedMessageId, - isViewOnce, - mentionedList, - } - ); - - return result; - } - - /** - * Sends message with thumbnail - * - * @deprecated: please use {@link sendText} with options - * - * @deprecated - * @category Chat - * @param pathOrBase64 - * @param url - * @param title - * @param description - * @param chatId - */ - public async sendMessageWithThumb( - pathOrBase64: string, - url: string, - title: string, - description: string, - chatId: string - ) { - let base64: string = ''; - - if (pathOrBase64.startsWith('data:')) { - base64 = pathOrBase64; - } else { - let fileContent = await downloadFileToBase64(pathOrBase64, [ - 'image/gif', - 'image/png', - 'image/jpg', - 'image/jpeg', - 'image/webp', - ]); - if (!fileContent) { - fileContent = await fileToBase64(pathOrBase64); - } - if (fileContent) { - base64 = fileContent; - } - } - - if (!base64) { - const error = new Error('Empty or invalid file or base64'); - Object.assign(error, { - code: 'empty_file', - }); - throw error; - } - - const mimeInfo = base64MimeType(base64); - - if (!mimeInfo || !mimeInfo.includes('image')) { - const error = new Error( - 'Not an image, allowed formats png, jpeg, webp and gif' - ); - Object.assign(error, { - code: 'invalid_image', - }); - throw error; - } - - const thumbnail = base64.replace( - /^data:image\/(png|jpe?g|webp|gif);base64,/, - '' - ); - - return evaluateAndReturn( - this.page, - ({ thumbnail, url, title, description, chatId }) => - WPP.chat.sendTextMessage(chatId, url, { - linkPreview: { - thumbnail: thumbnail, - canonicalUrl: url, - description: description, - matchedText: url, - title: title, - richPreviewType: 0, - doNotPlayInline: true, - }, - }), - { - thumbnail, - url, - title, - description, - chatId, - } - ); - } - - /** - * Replies to given mesage id of given chat id - * - * Deprecated: Please, use sendText with quotedMsg option - * - * @deprecated - * - * @category Chat - * @param to Chat id - * @param content Message body - * @param quotedMsg Message id to reply to. - */ - public async reply( - to: string, - content: string, - quotedMsg: string - ): Promise { - const result = await evaluateAndReturn( - this.page, - ({ to, content, quotedMsg }) => { - return WPP.chat.sendTextMessage(to, content, { quotedMsg }); - }, - { to, content, quotedMsg } - ); - - const message = (await evaluateAndReturn( - this.page, - (messageId: any) => WAPI.getMessageById(messageId), - result.id - )) as Message; - if (message['erro'] == true) { - throw message; - } - return message; - } - - /** - * Sends ptt audio - * base64 parameter should have mime type already defined - * @category Chat - * @param to Chat id - * @param base64 base64 data - * @param filename - * @param caption - * @param quotedMessageId Quoted message id - * @param messageId Set the id for this message - */ - public async sendPttFromBase64( - to: string, - base64: string, - filename: string, - caption?: string, - quotedMessageId?: string, - messageId?: string - ) { - const result = await evaluateAndReturn( - this.page, - async ({ to, base64, filename, caption, quotedMessageId, messageId }) => { - const result = await WPP.chat.sendFileMessage(to, base64, { - type: 'audio', - isPtt: true, - filename, - caption, - quotedMsg: quotedMessageId, - waitForAck: true, - messageId: messageId, - }); - - return { - ack: result.ack, - id: result.id, - sendMsgResult: await result.sendMsgResult, - }; - }, - { to, base64, filename, caption, quotedMessageId, messageId } - ); - - return result; - } - - /** - * Sends ptt audio from path - * @category Chat - * @param to Chat id - * @param filePath File path - * @param filename - * @param caption - * @param quotedMessageId Quoted message id - * @param messageId Set the id for this message - */ - public async sendPtt( - to: string, - filePath: string, - filename?: string, - caption?: string, - quotedMessageId?: string, - messageId?: string - ) { - return new Promise(async (resolve, reject) => { - let base64 = await downloadFileToBase64(filePath, [/^audio/]), - obj: { erro: boolean; to: string; text: string }; - - if (!base64) { - base64 = await fileToBase64(filePath); - } - - if (!base64) { - obj = { - erro: true, - to: to, - text: 'No such file or directory, open "' + filePath + '"', - }; - return reject(obj); - } - - if (!filename) { - filename = path.basename(filePath); - } - - return this.sendPttFromBase64( - to, - base64, - filename, - caption, - quotedMessageId, - messageId - ) - .then(resolve) - .catch(reject); - }); - } - - /** - * Sends file - * base64 parameter should have mime type already defined - * - * Deprecated: please use sendFile with options: sendFile(to, content, options) - * - * @deprecated - * - * @category Chat - * @param chatId Chat id - * @param base64 base64 data - * @param filename - * @param caption - */ - public async sendFileFromBase64( - chatId: string, - base64: string, - filename: string, - caption?: string - ) { - return this.sendFile(chatId, base64, filename, caption); - } - - /** - * Sends file from path or base64 - * - * @example - * ```javascript - * // Simple message - * client.sendFile('@c.us', 'data:text/plain;base64,V1BQQ29ubmVjdA=='); - * - * // With buttons - * client.sendFile('@c.us', 'data:text/plain;base64,V1BQQ29ubmVjdA==', { - * useTemplateButtons: true, // False for legacy - * buttons: [ - * { - * url: 'https://wppconnect.io/', - * text: 'WPPConnect Site' - * }, - * { - * phoneNumber: '+55 11 22334455', - * text: 'Call me' - * }, - * { - * id: 'your custom id 1', - * text: 'Some text' - * }, - * { - * id: 'another id 2', - * text: 'Another text' - * } - * ], - * title: 'Title text' // Optional - * footer: 'Footer text' // Optional - * }); - * ``` - * - * @category Chat - * @param to Chat id - * @param pathOrBase64 File path - * @param options - */ - public async sendFile( - to: string, - pathOrBase64: string, - options?: FileMessageOptions - ); - /** - * Sends file from path or base64 - * - * Deprecated: please use sendFile with options: sendFile(to, content, options) - * - * @deprecated - * - * @category Chat - * @param to Chat id - * @param pathOrBase64 File path or base64 - * @param filename The file name - * @param caption Caption for the filename - */ - public async sendFile( - to: string, - pathOrBase64: string, - filename?: string, - caption?: string - ); - public async sendFile( - to: string, - pathOrBase64: string, - nameOrOptions?: string | FileMessageOptions, - caption?: string - ) { - let options: FileMessageOptions = { type: 'auto-detect' }; - - if (typeof nameOrOptions === 'string') { - options.filename = nameOrOptions; - options.caption = caption; - } else if (typeof nameOrOptions === 'object') { - options = nameOrOptions; - } - - let base64 = ''; - - if (pathOrBase64.startsWith('data:')) { - base64 = pathOrBase64; - } else { - let fileContent = await downloadFileToBase64(pathOrBase64); - if (!fileContent) { - fileContent = await fileToBase64(pathOrBase64); - } - if (fileContent) { - base64 = fileContent; - } - - if (!options.filename) { - options.filename = path.basename(pathOrBase64); - } - } - - if (!base64) { - const error = new Error('Empty or invalid file or base64'); - Object.assign(error, { - code: 'empty_file', - }); - throw error; - } - - return evaluateAndReturn( - this.page, - async ({ to, base64, options }) => { - const result = await WPP.chat.sendFileMessage(to, base64, options); - return { - ack: result.ack, - id: result.id, - sendMsgResult: await result.sendMsgResult, - }; - }, - { to, base64, options: options as any } - ); - } - - /** - * Sends a video to given chat as a gif, with caption or not - * @category Chat - * @param to Chat id - * @param filePath File path - * @param filename - * @param caption - */ - public async sendVideoAsGif( - to: string, - filePath: string, - filename?: string, - caption?: string - ) { - let base64 = await downloadFileToBase64(filePath), - obj: { erro: boolean; to: string; text: string }; - - if (!base64) { - base64 = await fileToBase64(filePath); - } - - if (!base64) { - obj = { - erro: true, - to: to, - text: 'No such file or directory, open "' + filePath + '"', - }; - throw obj; - } - - if (!filename) { - filename = path.basename(filePath); - } - - return this.sendVideoAsGifFromBase64(to, base64, filename, caption); - } - - /** - * Sends a video to given chat as a gif, with caption or not, using base64 - * @category Chat - * @param to chat id xxxxx@us.c - * @param base64 base64 data:video/xxx;base64,xxx - * @param filename string xxxxx - * @param caption string xxxxx - */ - public async sendVideoAsGifFromBase64( - to: string, - base64: string, - filename: string, - caption?: string, - quotedMessageId?: string - ) { - const result = await evaluateAndReturn( - this.page, - async ({ to, base64, filename, caption, quotedMessageId }) => { - const result = await WPP.chat.sendFileMessage(to, base64, { - type: 'video', - isGif: true, - filename, - caption, - quotedMsg: quotedMessageId, - waitForAck: true, - }); - - return { - ack: result.ack, - id: result.id, - sendMsgResult: await result.sendMsgResult, - }; - }, - { to, base64, filename, caption, quotedMessageId } - ); - - return result; - } - - /** - * Sends a video to given chat as a gif, with caption or not, using base64 - * @category Chat - * @param to Chat id - * @param filePath File path - * @param filename - * @param caption - */ - public async sendGif( - to: string, - filePath: string, - filename?: string, - caption?: string - ) { - let base64 = await downloadFileToBase64(filePath), - obj: { erro: boolean; to: string; text: string }; - - if (!base64) { - base64 = await fileToBase64(filePath); - } - - if (!base64) { - obj = { - erro: true, - to: to, - text: 'No such file or directory, open "' + filePath + '"', - }; - throw obj; - } - - if (!filename) { - filename = path.basename(filePath); - } - - return this.sendGifFromBase64(to, base64, filename, caption); - } - - /** - * Sends a video to given chat as a gif, with caption or not, using base64 - * @category Chat - * @param to chat id xxxxx@us.c - * @param base64 base64 data:video/xxx;base64,xxx - * @param filename string xxxxx - * @param caption string xxxxx - */ - public async sendGifFromBase64( - to: string, - base64: string, - filename: string, - caption?: string - ) { - base64 = await convertToMP4GIF(base64); - - return await this.sendVideoAsGifFromBase64(to, base64, filename, caption); - } - /** - * Sends contact card to iven chat id - * @category Chat - * @param to Chat id - * @param contactsId Example: 0000@c.us | [000@c.us, 1111@c.us] - */ - public async sendContactVcard(to: string, contactsId: string, name?: string) { - const result = await evaluateAndReturn( - this.page, - ({ to, contactsId, name }) => { - return WPP.chat.sendVCardContactMessage(to, { - id: contactsId, - name: name, - }); - }, - { to, contactsId, name } - ); - return result; - } - - /** - * Send a list of contact cards - * @category Chat - * @param to Chat id - * @param contacts Example: | ['000@c.us', '1111@c.us', {id: '2222@c.us', name: 'Test'}] - */ - public async sendContactVcardList( - to: string, - contacts: (string | { id: string; name: string })[] - ) { - const result = await evaluateAndReturn( - this.page, - ({ to, contacts }) => { - return WPP.chat.sendVCardContactMessage(to, contacts); - }, - { to, contacts } - ); - return result; - } - - /** - * Forwards array of messages (could be ids or message objects) - * @category Chat - * @param to Chat id - * @param messages Array of messages ids to be forwarded - * @param skipMyMessages - * @returns array of messages ID - */ - public async forwardMessage( - toChatId: string, - msgId: string | string[], - options?: ForwardMessagesOptions - ): Promise { - return evaluateAndReturn( - this.page, - ({ toChatId, msgId, options }) => - WPP.chat.forwardMessage(toChatId, msgId, options), - { toChatId, msgId, options } - ); - } - - /** - * Generates sticker from the provided animated gif image and sends it (Send image as animated sticker) - * @category Chat - * @param pathOrBase64 image path imageBase64 A valid gif image is required. You can also send via http/https (http://www.website.com/img.gif) - * @param to chatId '000000000000@c.us' - */ - public async sendImageAsStickerGif(to: string, pathOrBase64: string) { - let base64: string = ''; - - if (pathOrBase64.startsWith('data:')) { - base64 = pathOrBase64; - } else { - let fileContent = await downloadFileToBase64(pathOrBase64, [ - 'image/gif', - 'image/webp', - ]); - if (!fileContent) { - fileContent = await fileToBase64(pathOrBase64); - } - if (fileContent) { - base64 = fileContent; - } - } - - if (!base64) { - const error = new Error('Empty or invalid file or base64'); - Object.assign(error, { - code: 'empty_file', - }); - throw error; - } - - const mimeInfo = base64MimeType(base64); - - if (!mimeInfo || !mimeInfo.includes('image')) { - const error = new Error('Not an image, allowed formats gig and webp'); - Object.assign(error, { - code: 'invalid_image', - }); - throw error; - } - - const buff = Buffer.from( - base64.replace(/^data:image\/(gif|webp);base64,/, ''), - 'base64' - ); - - let obj = await stickerSelect(buff, 1); - - if (!obj) { - const error = new Error( - 'Error with sharp library, check the console log' - ); - Object.assign(error, { - code: 'sharp_error', - }); - throw error; - } - - const { webpBase64 } = obj; - - return await evaluateAndReturn( - this.page, - ({ to, webpBase64 }) => { - return WPP.chat.sendFileMessage(to, webpBase64, { - type: 'sticker', - }); - }, - { to, webpBase64 } - ); - } - - /** - * Generates sticker from given image and sends it (Send Image As Sticker) - * @category Chat - * @param pathOrBase64 image path imageBase64 A valid png, jpg and webp image is required. You can also send via http/https (http://www.website.com/img.gif) - * @param to chatId '000000000000@c.us' - */ - public async sendImageAsSticker(to: string, pathOrBase64: string) { - let base64: string = ''; - - if (pathOrBase64.startsWith('data:')) { - base64 = pathOrBase64; - } else { - let fileContent = await downloadFileToBase64(pathOrBase64, [ - 'image/gif', - 'image/png', - 'image/jpg', - 'image/jpeg', - 'image/webp', - ]); - if (!fileContent) { - fileContent = await fileToBase64(pathOrBase64); - } - if (fileContent) { - base64 = fileContent; - } - } - - if (!base64) { - const error = new Error('Empty or invalid file or base64'); - Object.assign(error, { - code: 'empty_file', - }); - throw error; - } - - const mimeInfo = base64MimeType(base64); - - if (!mimeInfo || !mimeInfo.includes('image')) { - const error = new Error( - 'Not an image, allowed formats png, jpeg, webp and gif' - ); - Object.assign(error, { - code: 'invalid_image', - }); - throw error; - } - - const buff = Buffer.from( - base64.replace(/^data:image\/(png|jpe?g|webp|gif);base64,/, ''), - 'base64' - ); - - let obj = await stickerSelect(buff, 0); - - if (!obj) { - const error = new Error( - 'Error with sharp library, check the console log' - ); - Object.assign(error, { - code: 'sharp_error', - }); - throw error; - } - - const { webpBase64 } = obj; - - return await evaluateAndReturn( - this.page, - ({ to, webpBase64 }) => { - return WPP.chat.sendFileMessage(to, webpBase64, { - type: 'sticker', - }); - }, - { to, webpBase64 } - ); - } - - /** - * Sends location to given chat id - * @category Chat - * @param to Chat id - * @param options location options - */ - public async sendLocation(to: string, options: LocationMessageOptions); - /** - * Sends location to given chat id - * @category Chat - * @param to Chat id - * @param latitude Latitude - * @param longitude Longitude - * @param title Text caption - */ - public async sendLocation( - to: string, - latitude: string, - longitude: string, - title: string - ); - public async sendLocation( - to: string, - latitudeOrOptions: string | LocationMessageOptions, - longitude?: string, - title?: string - ) { - const options: LocationMessageOptions = - typeof latitudeOrOptions === 'string' - ? { - lat: latitudeOrOptions, - lng: longitude, - title: title, - } - : latitudeOrOptions; - - return await evaluateAndReturn( - this.page, - async ({ to, options }) => { - const result = await WPP.chat.sendLocationMessage(to, options); - - return { - ack: result.ack, - id: result.id, - sendMsgResult: await result.sendMsgResult, - }; - }, - { to, options: options as any } - ); - } - - /** - * Sets a chat status to seen. Marks all messages as ack: 3 - * @category Chat - * @param chatId chat id: xxxxx@us.c - */ - public async sendSeen(chatId: string) { - return evaluateAndReturn( - this.page, - (chatId) => WPP.chat.markIsRead(chatId), - chatId - ); - } - - /** - * Sets an audio or image view once. Marks message as played - * @category Chat - * @param msgId Message id: xxxxx@us.c - */ - public async markPlayed(msgId: string) { - return evaluateAndReturn( - this.page, - (msgId) => WPP.chat.markPlayed(msgId), - msgId - ); - } - - /** - * Starts typing ('Typing...' state) - * - * @example - * ```javascript - * // Keep sending typing state, use stopTyping to finish - * await client.startTyping('[number]@c.us'); - * - * // Keep sending typing state for 5 seconds - * await client.startTyping('[number]@c.us', 5000); - * ``` - * @category Chat - * @param to Chat Id - * @param duration Duration um milliseconds - */ - public async startTyping(to: string, duration?: number) { - return evaluateAndReturn( - this.page, - ({ to, duration }) => WPP.chat.markIsComposing(to, duration), - { - to, - duration, - } - ); - } - - /** - * Stops typing ('Typing...' state) - * @category Chat - * @param to Chat Id - */ - public async stopTyping(to: string) { - return evaluateAndReturn(this.page, ({ to }) => WPP.chat.markIsPaused(to), { - to, - }); - } - - /** - * Starts recording ('Recording...' state) - * @example - * ```javascript - * // Keep sending recording state, use `stopRecording` to finish - * await client.startRecording('[number]@c.us'); - * - * // Keep sending typing state for 5 seconds - * await client.startRecording('[number]@c.us', 5000); - * ``` - * @category Chat - * @param to Chat Id - * @param duration Duration um milliseconds - */ - public async startRecording(to: string, duration?: number) { - return evaluateAndReturn( - this.page, - ({ to, duration }) => WPP.chat.markIsRecording(to, duration), - { - to, - duration, - } - ); - } - - /** - * Stops recording ('Recording...' state) - * @category Chat - * @param to Chat Id - */ - public async stopRecording(to: string) { - return evaluateAndReturn(this.page, ({ to }) => WPP.chat.markIsPaused(to), { - to, - }); - } - - /** - * Update your online presence - * @category Chat - * @param online true for available presence and false for unavailable - */ - public async setOnlinePresence(online: boolean = true) { - return evaluateAndReturn( - this.page, - ({ online }) => WPP.conn.markAvailable(online), - { - online, - } - ); - } - - /** - * Sends text with tags - * @category Chat - */ - public async sendMentioned(to: string, message: string, mentioned: string[]) { - return await evaluateAndReturn( - this.page, - ({ to, message, mentioned }) => - WPP.chat.sendTextMessage(to, message, { - detectMentioned: true, - mentionedList: mentioned, - }), - { to, message, mentioned } - ); - } - - /** - * Sends a list message - * - * ```typescript - * // Example - * client.sendListMessage('@c.us', { - * buttonText: 'Click here', - * description: 'Choose one option', - * sections: [ - * { - * title: 'Section 1', - * rows: [ - * { - * rowId: 'my_custom_id', - * title: 'Test 1', - * description: 'Description 1', - * }, - * { - * rowId: '2', - * title: 'Test 2', - * description: 'Description 2', - * }, - * ], - * }, - * ], - * }); - * ``` - * - * @category Chat - */ - public async sendListMessage(to: string, options: ListMessageOptions) { - const sendResult = await evaluateAndReturn( - this.page, - ({ to, options }) => WPP.chat.sendListMessage(to, options), - { - to, - options: options, - } - ); - - // I don't know why the evaluate is returning undefined for direct call - // To solve that, I added `JSON.parse(JSON.stringify())` to solve that - const result = (await evaluateAndReturn( - this.page, - async ({ messageId }) => { - return JSON.parse(JSON.stringify(await WAPI.getMessageById(messageId))); - }, - { messageId: sendResult.id } - )) as Message; - - if (result['erro'] == true) { - throw result; - } - - return result; - } - - /** - * Send a create poll message - * - * @example - * ```javascript - * // Single pool - * client.sendPollMessage( - * '[number]@g.us', - * 'A poll name', - * ['Option 1', 'Option 2', 'Option 3'] - * ); - * ``` - * // Selectable Count - * ```javascript - * // Single pool - * client.sendPollMessage( - * '[number]@g.us', - * 'A poll name', - * ['Option 1', 'Option 2', 'Option 3'], - * { - * selectableCount: 1, - * } - * ); - * ``` - * - * @category Chat - */ - public async sendPollMessage( - chatId: string, - name: string, - choices: string[], - options?: PoolMessageOptions - ) { - const sendResult = await evaluateAndReturn( - this.page, - ({ chatId, name, choices, options }) => - WPP.chat.sendCreatePollMessage(chatId, name, choices, options), - { - chatId, - name, - choices, - options: options, - } - ); - - // I don't know why the evaluate is returning undefined for direct call - // To solve that, I added `JSON.parse(JSON.stringify())` to solve that - const result = (await evaluateAndReturn( - this.page, - async ({ messageId }) => { - return JSON.parse(JSON.stringify(await WAPI.getMessageById(messageId))); - }, - { messageId: sendResult.id } - )) as Message; - - if (result['erro'] == true) { - throw result; - } - - return result; - } - /** - * Sets the chat state - * Deprecated in favor of Use startTyping or startRecording functions - * @category Chat - * @param chatState - * @param chatId - * @deprecated Deprecated in favor of Use startTyping or startRecording functions - */ - public async setChatState(chatId: string, chatState: ChatState) { - return await evaluateAndReturn( - this.page, - ({ chatState, chatId }) => { - WAPI.sendChatstate(chatState, chatId); - }, - { chatState, chatId } - ); - } - - /** - * Send reaction to message - * @example - * ```javascript - * // For send Reaction, just to send emoji - * await client.sendReactionToMessage('[number]@c.us', '🤯'); - * - * // to remove reacition - * await client.startRecording('[number]@c.us', false); - * ``` - * @category Chat - * @param to Chat Id - * @param duration Duration um milliseconds - */ - public async sendReactionToMessage(msgId: string, reaction: string | false) { - return evaluateAndReturn( - this.page, - ({ msgId, reaction }) => WPP.chat.sendReactionToMessage(msgId, reaction), - { - msgId, - reaction, - } - ); - } - - /** - * Send an order message - * To send (prices, tax, shipping or discount), for example: USD 12.90, send them without dots or commas, like: 12900 - * - * @example - * ```javascript - * // Send an order with a product - * client.sendOrderMessage('[number]@c.us', [ - * { type: 'product', id: '67689897878', qnt: 2 }, - * { type: 'product', id: '37878774457', qnt: 1 }, - * ] - * - * // Send Order with a custom item - * client.sendOrderMessage('[number]@c.us', [ - * { type: 'custom', name: 'Item de cost test', price: 120000, qnt: 2 }, - * ] - * - * // Send Order with custom options - * client.sendOrderMessage('[number]@c.us', [ - * { type: 'product', id: '37878774457', qnt: 1 }, - * { type: 'custom', name: 'Item de cost test', price: 120000, qnt: 2 }, - * ], - * { tax: 10000, shipping: 4000, discount: 10000 } - * ``` - * - * @category Chat - */ - public async sendOrderMessage( - to: string, - items: OrderItems[], - options?: OrderMessageOptions - ) { - const sendResult = await evaluateAndReturn( - this.page, - ({ to, items, options }) => WPP.chat.sendOrderMessage(to, items, options), - { - to, - items, - options, - } - ); - - // I don't know why the evaluate is returning undefined for direct call - // To solve that, I added `JSON.parse(JSON.stringify())` to solve that - const result = (await evaluateAndReturn( - this.page, - async ({ messageId }) => { - return JSON.parse(JSON.stringify(await WAPI.getMessageById(messageId))); - }, - { messageId: sendResult.id } - )) as Message; - - if (result['erro'] == true) { - throw result; - } - - return result; - } -} diff --git a/src/api/layers/status.layer.ts b/src/api/layers/status.layer.ts deleted file mode 100644 index 626062bc0..000000000 --- a/src/api/layers/status.layer.ts +++ /dev/null @@ -1,188 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -import { Page } from 'puppeteer'; -import { CreateConfig } from '../../config/create-config'; -import { LabelsLayer } from './labels.layer'; -import { - evaluateAndReturn, - base64MimeType, - fileToBase64, - downloadFileToBase64, -} from '../helpers'; -import { SendStatusOptions } from '@wppconnect/wa-js/dist/status'; - -export class StatusLayer extends LabelsLayer { - constructor(public page: Page, session?: string, options?: CreateConfig) { - super(page, session, options); - } - /** - * Send a image message to status stories - * @category Status - * - * @example - * ```javascript - * client.sendImageStatus('data:image/jpeg;base64,'); - * ``` - * - * @example - * ```javascript - * // Send with caption - * client.sendImageStatus('data:image/jpeg;base64,', { caption: 'example test' } ); - * ``` - * @param pathOrBase64 Path or base 64 image - */ - public async sendImageStatus( - pathOrBase64: string, - options?: SendStatusOptions & { caption?: string } - ) { - let base64: string = ''; - if (pathOrBase64.startsWith('data:')) { - base64 = pathOrBase64; - } else { - let fileContent = await downloadFileToBase64(pathOrBase64, [ - 'image/gif', - 'image/png', - 'image/jpg', - 'image/jpeg', - 'image/webp', - ]); - if (!fileContent) { - fileContent = await fileToBase64(pathOrBase64); - } - if (fileContent) { - base64 = fileContent; - } - } - - if (!base64) { - const error = new Error('Empty or invalid file or base64'); - Object.assign(error, { - code: 'empty_file', - }); - throw error; - } - - const mimeInfo = base64MimeType(base64); - - if (!mimeInfo || !mimeInfo.includes('image')) { - const error = new Error( - 'Not an image, allowed formats png, jpeg and webp' - ); - Object.assign(error, { - code: 'invalid_image', - }); - throw error; - } - return await evaluateAndReturn( - this.page, - ({ base64, options }) => { - WPP.status.sendImageStatus(base64, options); - }, - { base64, options } - ); - } - /** - * Send a video message to status stories - * @category Status - * - * @example - * ```javascript - * client.sendVideoStatus('data:video/mp4;base64,'); - * ``` - * @example - * ```javascript - * // Send with caption - * client.sendVideoStatus('data:video/mp4;base64,', { caption: 'example test' } ); - * ``` - * @param pathOrBase64 Path or base 64 image - */ - public async sendVideoStatus( - pathOrBase64: string, - options?: SendStatusOptions & { caption?: string } - ) { - let base64: string = ''; - if (pathOrBase64.startsWith('data:')) { - base64 = pathOrBase64; - } else { - let fileContent = await downloadFileToBase64(pathOrBase64); - if (!fileContent) { - fileContent = await fileToBase64(pathOrBase64); - } - if (fileContent) { - base64 = fileContent; - } - } - - if (!base64) { - const error = new Error('Empty or invalid file or base64'); - Object.assign(error, { - code: 'empty_file', - }); - throw error; - } - - return await evaluateAndReturn( - this.page, - ({ base64, options }) => { - WPP.status.sendVideoStatus(base64, options); - }, - { base64, options } - ); - } - - /** - * Send a text to status stories - * @category Status - * - * @example - * ```javascript - * client.sendTextStatus(`Bootstrap primary color: #0275d8`, { backgroundColor: '#0275d8', font: 2}); - * ``` - * @param pathOrBase64 Path or base 64 image - */ - public async sendTextStatus(text: string, options: string) { - return await evaluateAndReturn( - this.page, - ({ text, options }) => { - WPP.status.sendTextStatus(text, options); - }, - { text, options } - ); - } - - /** - * Mark status as read/seen - * @category Status - * - * @example - * ```javascript - * client.sendReadStatus('[phone_number]@c.us', 'false_status@broadcast_3A169E0FD4BC6E92212F_[]@c.us'); - * ``` - * @param chatId Chat ID of contact - * @param statusId ID of status msg - */ - public async sendReadStatus(chatId: string, statusId: string) { - return await evaluateAndReturn( - this.page, - ({ chatId, statusId }) => { - WPP.status.sendReadStatus(chatId, statusId); - }, - { chatId, statusId } - ); - } -} diff --git a/src/api/layers/ui.layer.ts b/src/api/layers/ui.layer.ts deleted file mode 100644 index 601d0cee9..000000000 --- a/src/api/layers/ui.layer.ts +++ /dev/null @@ -1,62 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -import { Page } from 'puppeteer'; -import { CreateConfig } from '../../config/create-config'; -import { evaluateAndReturn } from '../helpers'; -import { GroupLayer } from './group.layer'; - -export class UILayer extends GroupLayer { - constructor(public page: Page, session?: string, options?: CreateConfig) { - super(page, session, options); - } - - /** - * Opens given chat at last message (bottom) - * Will fire natural workflow events of whatsapp web - * @category UI - * @param chatId - */ - public async openChat(chatId: string) { - return evaluateAndReturn( - this.page, - (chatId: string) => WPP.chat.openChatBottom(chatId), - chatId - ); - } - - /** - * Opens chat at given message position - * @category UI - * @param chatId Chat id - * @param messageId Message id (For example: '06D3AB3D0EEB9D077A3F9A3EFF4DD030') - */ - public async openChatAt(chatId: string, messageId: string) { - return evaluateAndReturn( - this.page, - (chatId: string) => WPP.chat.openChatAt(chatId, messageId), - chatId - ); - } - /** - * Return the current active chat - * @category UI - */ - public async getActiveChat() { - return evaluateAndReturn(this.page, () => WPP.chat.getActiveChat()); - } -} diff --git a/src/api/model/ack.ts b/src/api/model/ack.ts deleted file mode 100644 index a9a67f8bb..000000000 --- a/src/api/model/ack.ts +++ /dev/null @@ -1,42 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -import { Id } from './id'; -import { AckType } from './enum'; - -export interface Ack { - id: Id; - body: string; - type: string; - t: number; - subtype: any; - notifyName: string; - from: string; - to: string; - self: string; - ack: AckType; - invis: boolean; - isNewMsg: boolean; - star: boolean; - loc: string; - lat: number; - lng: number; - mentionedJidList: any[]; - isForwarded: boolean; - labels: any[]; - ephemeralStartTimestamp: number; -} diff --git a/src/api/model/chat.ts b/src/api/model/chat.ts deleted file mode 100644 index d2645b65f..000000000 --- a/src/api/model/chat.ts +++ /dev/null @@ -1,50 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -import { Contact } from './contact'; -import { GroupMetadata } from './group-metadata'; -import { MessageId } from './message-id'; -import { Presence } from './presence'; -import { Wid } from './wid'; - -export interface Chat { - id: Wid; - pendingMsgs: boolean; - lastReceivedKey: MessageId; - t: number; - unreadCount: number; - archive: boolean; - muteExpiration: number; - name: string; - notSpam: boolean; - pin: number; - msgs: null; - kind: string; - isAnnounceGrpRestrict: boolean; - ephemeralDuration: number; - hasChatBeenOpened: boolean; - unreadMentionCount: number; - hasUnreadMention: boolean; - archiveAtMentionViewedInDrawer: boolean; - isBroadcast: boolean; - isGroup: boolean; - isReadOnly: boolean; - isUser: boolean; - contact: Contact; - groupMetadata: GroupMetadata; - presence: Presence; -} diff --git a/src/api/model/contact-status.ts b/src/api/model/contact-status.ts deleted file mode 100644 index d469a186e..000000000 --- a/src/api/model/contact-status.ts +++ /dev/null @@ -1,22 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export interface ContactStatus { - id: string; - status: string; - stale?: boolean; -} diff --git a/src/api/model/contact.ts b/src/api/model/contact.ts deleted file mode 100644 index 0d98d9e9e..000000000 --- a/src/api/model/contact.ts +++ /dev/null @@ -1,64 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -import { Wid } from './wid'; -import { ProfilePicThumbObj } from './profile-pic-thumb'; - -/** - * Data info of contact - */ -export interface Contact { - formattedName: string; - id: Wid; - isBusiness: boolean; - isEnterprise: boolean; - isHighLevelVerified: any; - isMe: boolean; - isMyContact: boolean; - isPSA: boolean; - isUser: boolean; - isVerified: any; - isWAContact: boolean; - labels: any[]; - msgs: any; - - /** - * Name of concat in your agenda - */ - name?: string; - plaintextDisabled: boolean; - - /** - * @deprecated Depreciado em favor da função {@link getProfilePicFromServer} - */ - profilePicThumbObj: ProfilePicThumbObj; - - /** - * Name defined by common contact - */ - pushname?: string; - sectionHeader: any; - shortName: string; - statusMute: boolean; - type: string; - verifiedLevel: any; - - /** - * Name defined by business contact - */ - verifiedName?: any; -} diff --git a/src/api/model/enum/ack-type.ts b/src/api/model/enum/ack-type.ts deleted file mode 100644 index d4785f7a1..000000000 --- a/src/api/model/enum/ack-type.ts +++ /dev/null @@ -1,31 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export enum AckType { - MD_DOWNGRADE = -7, - INACTIVE = -6, - CONTENT_UNUPLOADABLE = -5, - CONTENT_TOO_BIG = -4, - CONTENT_GONE = -3, - EXPIRED = -2, - FAILED = -1, - CLOCK = 0, - SENT = 1, - RECEIVED = 2, - READ = 3, - PLAYED = 4, -} diff --git a/src/api/model/enum/chat-state.ts b/src/api/model/enum/chat-state.ts deleted file mode 100644 index 910b34001..000000000 --- a/src/api/model/enum/chat-state.ts +++ /dev/null @@ -1,22 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export enum ChatState { - Typing = 0, - Recording = 1, - Paused = 2, -} diff --git a/src/api/model/enum/definitions.ts b/src/api/model/enum/definitions.ts deleted file mode 100644 index 6d42e10b1..000000000 --- a/src/api/model/enum/definitions.ts +++ /dev/null @@ -1,606 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -const defs = { - MAX_GROUP_SIZE: 101, - MAX_SUBJECT_LENGTH: 25, - IMG_MAX_EDGE: 1600, - IMG_MAX_BYTES: 1048576, - IMG_THUMB_MAX_EDGE: 100, - DOC_THUMB_MAX_EDGE: 480, - MAX_MEDIA_UPLOAD_SIZE: 16777216, - MAX_FILE_SIZE: 104857600, - MAX_FILES: 30, - SHOW_GIF_SEARCH: !1, - USE_NOTIFICATION_QUERY: !1, - FWD_UI_START_TS: 0, - GOOGLE_MAPS_DO_NOT_AUTH: !0, - GOOGLE_MAPS_KEYLESS: !1, - SUSPICIOUS_LINKS: !1, - FINAL_LIVE_LOCATION: !1, - STATUS_RANKING: !1, - FREQUENTLY_FORWARDED_MESSAGES: !1, - FREQUENTLY_FORWARDED_THRESHOLD: 5, - FREQUENTLY_FORWARDED_MAX: 1, - FREQUENTLY_FORWARDED_GROUP_SETTING: !1, - QUICK_MESSAGE_SEARCH: !1, - EPHEMERAL_MESSAGES: !1, - PRELOAD_STICKERS: !1, - PRODUCT_CATALOG_DEEPLINK: !1, - PRODUCT_CATALOG_OPEN_DEEPLINK: !1, - PRODUCT_MEDIA_ATTACHMENTS: !1, - WEB_CLEAN_INCOMING_FILENAME: !1, - WEB_VOIP_INTERNAL_TESTER: !1, - WEB_ENABLE_MODEL_STORAGE: !1, - WS_CAN_CACHE_REQUESTS: !1, - MAX_FORWARD_COUNT_GLOBAL: 5, - FREQUENTLY_FORWARDED_SENTINEL: 127, - MAX_SMB_LABEL_COUNT: 20, - DEFAULT_SMB__NEW_LABEL_COLOR: '#d6d7d7', - FB_CLB_TOKEN: '1063127757113399|745146ffa34413f9dbb5469f5370b7af', - FB_CLB_CHECK_URL: 'https://crashlogs.whatsapp.net/wa_fls_upload_check', - FB_CLB_URL: 'https://crashlogs.whatsapp.net/wa_clb_data', - G_MAPS_DIR_URL: 'https://maps.google.com/maps/dir', - G_MAPS_IMG_URL: 'https://maps.googleapis.com/maps/api/staticmap', - G_MAPS_SEARCH_URL: 'https://maps.google.com/maps/search', - G_MAPS_URL: 'https://maps.google.com/maps', - NOTIFICATION_PROMPT_DELAY: 1e4, - PTT_PLAYBACK_DELAY: 400, - NOTIFICATION_TIMEOUT: 5e3, - CALL_NOTIFICATION_TIMEOUT: 45e3, - IDLE_TIMEOUT: 6e4, - IDLE_TIMEOUT_WAIT: 78e4, - SEARCH_ZOOM: 17, - SEND_UNAVAILABLE_WAIT: 15e3, - SEND_PAUSED_WAIT: 2500, - CLEAR_CHAT_DIRTY_WAIT: 2500, - LOG_UPLOAD_INTERVAL: 36e5, - REVOKE_WINDOW: 4096, - WAM_ROTATE_INTERVAL: 300, - ALBUM_DIFF_INTERVAL: 600, - MAX_TXT_MSG_SIZE: 65536, - INITIAL_PAGE_SIZE: 768, - FREQUENTLY_FORWARDED_INITIAL_PAGE_SIZE: 308, - SUBSEQUENT_PAGE_SIZE: 3072, - OVERFLOWING_PAGE_THRESHOLD: 0.1, - GROUP_DESCRIPTION_INFO_PANEL_TRUNC_LENGTH: 100, - GROUP_DESCRIPTION_LENGTH: 0, - GROUPS_V3_RESTRICT_GROUPS: !1, - GROUPS_V3_ANNOUNCE_GROUPS: !1, - GROUPS_V3: !1, - INFO_DRAWER_MAX_ROWS: 10, - NUM_COLORS: 20, - FTS_MIN_CHARS: 2, - FTS_TTL: 6e4, - FTS_TYPING_DELAY: 300, - FTS_NUM_RESULTS: 30, - STICKERS: !1, - HSM_ASPECT_RATIO: 1.91, - TEMPLATE_DOC_MIME_TYPES: 1, - TEMPLATE_URL_START: 64, - TEMPLATE_URL_END: 32, - MMS_MEDIA_KEY_TTL: 1 / 0, - KEY_STORAGE_TEST: 'storage_test', - KEY_CLIENT_TOKEN: 'WAToken1', - KEY_SERVER_TOKEN: 'WAToken2', - KEY_SECRET: 'WASecretKey', - KEY_SECRET_BUNDLE: 'WASecretBundle', - KEY_SECURITY_NOTIFICATIONS: 'WASecurityNotifications', - KEY_BROWSER_ID: 'WABrowserId', - KEY_GEOCODER_LOCATION: 'WAGeocoderLocation', - KEY_GROUP_ASSIGNED_COLOR: 'WAGroupAssignedColor', - KEY_GMAPS_OVER_LIMIT: 'WAGmapsOverLimit', - KEY_GLOBAL_MUTE_SOUNDS: 'WAGlobalSounds', - KEY_GLOBAL_MUTE_NOTIFICATIONS: 'WAGlobalNotifications', - KEY_GLOBAL_MUTE_IN_APP_NOTIFICATIONS: 'WAGlobalInAppNotifications', - KEY_GLOBAL_MUTE_PREVIEWS: 'WAGlobalPreviews', - KEY_GLOBAL_COLLAPSE_MUTED: 'WAGlobalCollapseMuted', - KEY_NOTIFICATION_SOUND: 'WANotificationSound', - KEY_LANG: 'WALangPref', - KEY_LAST_ACTIVE_EMOJI_TAB: 'WALastActiveEmojiTab', - KEY_LAST_SELECTED_COMPOSE_BOX_PANEL: 'WALastActiveComposeBoxPanel', - KEY_LAST_CHAT_MUTE_DURATION: 'WALastChatMuteDuration', - KEY_UNKNOWN_ID: 'WAUnknownID', - KEY_VERSION: 'WAVersion', - KEY_LOAD_RETRY_GENERATION: 'WALoadRetryGeneration', - KEY_WHATSAPP_MUTEX: 'whatsapp-mutex', - KEY_LAST_WID: 'last-wid', - KEY_LAST_WID_MD: 'last-wid-md', - KEY_SAVE_TO_CAMERA_ROLL: 'save_to_camera_roll', - KEY_SMB_LABEL_COLOR_PALETTE: 'smb_label_color_palette', - KEY_LAST_PUSHNAME: 'last-pushname', - KEY_PROTO_VERSION: 'WAProtoVersion', - KEY_MOBILE_PLATFORM: 'mobile-platform', - KEY_REMEMBER_ME: 'remember-me', - KEY_LOGOUT_TOKEN: 'logout-token', - KEY_OLD_LOGOUT_CREDS: 'old-logout-cred', - KEY_NO_TAKEOVER: 'no-takeover', - KEY_WHATSAPP_LS_VERSION: 'ver', - KEY_WAM_BUFFER: 'wam-buffer', - KEY_WAM_INFO: 'wam-info', - KEY_TIME_SPENT_EVENT: 'WaTimeSpentEvent', - KEY_VIDEO_VOLUME: 'video-volume', - KEY_VIDEO_MUTE: 'video-mute', - KEY_CONTACT_CHECKSUM: 'contact-checksum', - KEY_COMPOSE_CONTENTS_PREFIX: 'compose-contents_', - COOKIE_REF: 'ref', - COOKIE_TOK: 'tok', - PAGE_SIZE: 50, - MSG_PRELOAD_THRESHOLD: 20, - MEDIA_QUERY_LIMIT: 50, - MIN_PIC_SIDE: 192, - MAX_PIC_SIDE: 640, - PROF_PIC_THUMB_SIDE: 96, - MAX_CAPTION_LENGTH: 1024, - MAX_PRODUCT_SUBTITLE_LENGTH: 70, - MAX_REPLY_PRODUCT_TITLE_LENGTH: 40, - MAX_REPLY_PRODUCT_DESC_LENGTH: 95, - ALBUM_MIN_SIZE: 4, - ALBUM_MAX_SIZE: 102, - ALBUM_MAX_HEIGHT: 168, - ALBUM_PADDING: 3, - PRESENCE_COMPOSING_TIMEOUT: 25e3, - PRESENCE_RESEND_WAIT: 1e4, - MIMETYPE_OGG: 'audio/ogg', - IMAGE_MIMES: 'image/*', - WEBP_MIMES: 'image/webp', - VIDEO_MIMES: 'video/mp4,video/3gpp,video/quicktime', - KEY_LOG_CURSOR: 'debugCursor', - MAX_STATUS_LENGTH: 139, - MAX_PUSHNAME_LENGTH: 25, - DISP_TYPE: { - CONVERSATION: 'CONVERSATION', - MSG_INFO: 'MSG_INFO', - STARRED_MSGS: 'STARRED_MSGS', - GALLERY: 'GALLERY', - REPLY_STAGE: 'REPLY_STAGE', - QUOTED_MSG: 'QUOTED_MSG', - CONTACT_CARD: 'CONTACT_CARD', - }, - SEND_LOGS_MAX_EMAIL_LENGTH: 320, - SEND_LOGS_MAX_SUBJECT_LENGTH: 50, - SEND_LOGS_MIN_DESC_LENGTH: 10, - SEND_LOGS_MAX_DESC_LENGTH: 500, - SEND_LOGS_MAX_SCREENSHOTS: 3, - SEND_LOGS_MAX_SCREENSHOT_SIZE: 10485760, - ACK: { - MD_DOWNGRADE: -7, - INACTIVE: -6, - CONTENT_UNUPLOADABLE: -5, - CONTENT_TOO_BIG: -4, - CONTENT_GONE: -3, - EXPIRED: -2, - FAILED: -1, - CLOCK: 0, - SENT: 1, - RECEIVED: 2, - READ: 3, - PLAYED: 4, - }, - ACK_STRING: { - SENDER: 'sender', - DELIVERY: 'delivery', - READ: 'read', - PLAYED: 'played', - INACTIVE: 'inactive', - }, - RETRY: { - VALIDATE_OLD_SESSION: 2, - MAX_RETRY: 5, - }, - KEY_BUNDLE_TYPE: '', - EDIT_ATTR: { - REVOKE: 7, - }, - DEVICE: { - PRIMARY_DEVICE: 0, - PRIMARY_VERSION: -1, - }, - BATTERY_LOW_THRESHOLD_1: 15, - BATTERY_LOW_THRESHOLD_2: 5, - BATTERY_DELAY: 1e4, - WAM_MAX_BUFFER_SIZE: 5e4, - SOCKET_STATE: { - OPENING: 'OPENING', - PAIRING: 'PAIRING', - UNPAIRED: 'UNPAIRED', - UNPAIRED_IDLE: 'UNPAIRED_IDLE', - CONNECTED: 'CONNECTED', - TIMEOUT: 'TIMEOUT', - CONFLICT: 'CONFLICT', - UNLAUNCHED: 'UNLAUNCHED', - PROXYBLOCK: 'PROXYBLOCK', - TOS_BLOCK: 'TOS_BLOCK', - SMB_TOS_BLOCK: 'SMB_TOS_BLOCK', - DEPRECATED_VERSION: 'DEPRECATED_VERSION', - }, - SOCKET_STREAM: { - DISCONNECTED: 'DISCONNECTED', - SYNCING: 'SYNCING', - RESUMING: 'RESUMING', - CONNECTED: 'CONNECTED', - }, - COLLECTION_HAS_SYNCED: 'collection_has_synced', - NEW_MSG_SENT: 'new_msg_sent', - DIAGNOSTIC_DELAY: 18e3, - ONE_BY_ONE_TRANS_GIF: - 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7', - WALLPAPER_COLOR: [ - '#ede9e4', - '#ccebdc', - '#aed8c7', - '#7acba5', - '#c7e9eb', - '#a9dbd8', - '#68d5d9', - '#6ec3d4', - '#f2dad5', - '#f2d5e1', - '#fbcad2', - '#ffa7a8', - '#cbdaec', - '#d7d3eb', - '#e5c0eb', - '#d0deb1', - '#dee0b4', - '#e6dfa8', - '#f7e9a8', - '#ffd1a4', - '#ff8a8c', - '#ff5978', - '#f56056', - '#dc6e4f', - '#e6e365', - '#73c780', - '#2293a4', - '#219ed9', - '#2b5aa6', - '#74676a', - '#48324d', - '#dee3e9', - '#d9dade', - '#c0c1c4', - '#7e90a3', - '#55626f', - '#243640', - '#162127', - ], - DEFAULT_CHAT_WALLPAPER: 'default_chat_wallpaper', - INVERT_TRANSPARENT: { - '#ede9e4': !1, - '#ccebdc': !1, - '#aed8c7': !1, - '#7acba5': !1, - '#c7e9eb': !1, - '#a9dbd8': !1, - '#68d5d9': !1, - '#6ec3d4': !1, - '#f2dad5': !1, - '#f2d5e1': !1, - '#fbcad2': !1, - '#ffa7a8': !1, - '#cbdaec': !1, - '#d7d3eb': !1, - '#e5c0eb': !1, - '#d0deb1': !1, - '#dee0b4': !1, - '#e6dfa8': !1, - '#f7e9a8': !1, - '#ffd1a4': !1, - '#ff8a8c': !0, - '#ff5978': !0, - '#f56056': !0, - '#dc6e4f': !0, - '#e6e365': !1, - '#73c780': !0, - '#2293a4': !0, - '#219ed9': !0, - '#2b5aa6': !0, - '#74676a': !0, - '#48324d': !0, - '#dee3e9': !1, - '#d9dade': !1, - '#c0c1c4': !1, - '#7e90a3': !0, - '#55626f': !0, - '#243640': !0, - '#162127': !0, - }, - L10N_PRIORITY: { - SAVED: 6, - PHONE: 5, - PREVIOUS: 4, - URL: 3, - BROWSER: 2, - DEFAULT: 1, - }, - RENDER_CURSOR: { - RECENT_AT_TOP: 'recent_at_top', - RECENT_AT_BOTTOM: 'recent_at_bottom', - CONVERSATION: 'conversation', - GROUP_CONVERSATION: 'group_conversation', - STARRED_DRAWER: 'starred_drawer', - }, - SECURITY_LINK: 'https://www.whatsapp.com/security/', - SMB_TOS_LEARN_MORE_LINK: - 'https://www.whatsapp.com/legal/small-business-terms/', - SERVER_WID: 'server@c.us', - PSA_WID: '0@c.us', - STATUS_WID: 'status@broadcast', - OFFICIAL_BIZ_WID: '16505361212@c.us', - VISIBILITY: { - ABOVE: 'above', - VISIBLE: 'visible', - BELOW: 'below', - }, - VIDEO_STREAM_URL: '/stream/video', - SPELL_CHECK_SKIP_WORDS: { - en_us: new Set([ - 'ain', - 'couldn', - 'didn', - 'doesn', - 'hadn', - 'hasn', - 'mightn', - 'mustn', - 'needn', - 'oughtn', - 'shan', - 'shouldn', - 'wasn', - 'weren', - 'wouldn', - 'Ain', - 'Couldn', - 'Didn', - 'Doesn', - 'Hadn', - 'Hasn', - 'Mightn', - 'Mustn', - 'Needn', - 'Oughtn', - 'Shan', - 'Shouldn', - 'Wasn', - 'Weren', - 'Wouldn', - ]), - en_gb: new Set([ - 'ain', - 'couldn', - 'didn', - 'doesn', - 'hadn', - 'hasn', - 'mightn', - 'mustn', - 'needn', - 'oughtn', - 'shan', - 'shouldn', - 'wasn', - 'weren', - 'wouldn', - 'Ain', - 'Couldn', - 'Didn', - 'Doesn', - 'Hadn', - 'Hasn', - 'Mightn', - 'Mustn', - 'Needn', - 'Oughtn', - 'Shan', - 'Shouldn', - 'Wasn', - 'Weren', - 'Wouldn', - ]), - en: new Set([ - 'ain', - 'couldn', - 'didn', - 'doesn', - 'hadn', - 'hasn', - 'mightn', - 'mustn', - 'needn', - 'oughtn', - 'shan', - 'shouldn', - 'wasn', - 'weren', - 'wouldn', - 'Ain', - 'Couldn', - 'Didn', - 'Doesn', - 'Hadn', - 'Hasn', - 'Mightn', - 'Mustn', - 'Needn', - 'Oughtn', - 'Shan', - 'Shouldn', - 'Wasn', - 'Weren', - 'Wouldn', - ]), - }, - GROUP_INVITE_LINK_URL: 'https://chat.whatsapp.com/', - GROUP_SETTING_TYPE: { - ANNOUNCEMENT: 'announcement', - RESTRICT: 'restrict', - NO_FREQUENTLY_FORWARDED: 'no_frequently_forwarded', - EPHEMERAL: 'ephemeral', - }, - GROUP_SETTING_TO_METADATA: { - announcement: 'announce', - restrict: 'restrict', - no_frequently_forwarded: 'noFrequentlyForwarded', - ephemeral: 'ephemeralDuration', - }, - L10N: { - DEFAULT: 'en', - }, - EMOJI: { - BUCKET_SIZE: 25, - CATEGORIES: { - SMILEYS_PEOPLE: 'SMILEYS_PEOPLE', - ANIMALS_NATURE: 'ANIMALS_NATURE', - FOOD_DRINK: 'FOOD_DRINK', - ACTIVITY: 'ACTIVITY', - TRAVEL_PLACES: 'TRAVEL_PLACES', - OBJECTS: 'OBJECTS', - SYMBOLS: 'SYMBOLS', - FLAGS: 'FLAGS', - }, - CATEGORY_MAPPING: { - 'Smileys & People': 'SMILEYS_PEOPLE', - 'Animals & Nature': 'ANIMALS_NATURE', - 'Food & Drink': 'FOOD_DRINK', - Activity: 'ACTIVITY', - 'Travel & Places': 'TRAVEL_PLACES', - Objects: 'OBJECTS', - Symbols: 'SYMBOLS', - Flags: 'FLAGS', - }, - ORDERED_CATEGORY_IDS: [ - 'SMILEYS_PEOPLE', - 'ANIMALS_NATURE', - 'FOOD_DRINK', - 'ACTIVITY', - 'TRAVEL_PLACES', - 'OBJECTS', - 'SYMBOLS', - 'FLAGS', - ], - EMOJI_TYPE: { - APPLE: 'APPLE', - WHATSAPP: 'WHATSAPP', - }, - LARGE_EMOJI_BASE_PATH: '/img', - LARGE_EMOJI_ELECTRON_BASE_PATH: 'img', - EMOJI_SPRITES_BASE_PATH: '/img', - EMOJI_SPRITES_ELECTRON_BASE_PATH: 'img', - }, - MSG_TYPE: { - NOTIFICATION: 'notification', - NOTIFICATION_TEMPLATE: 'notification_template', - GROUP_NOTIFICATION: 'group_notification', - GP2: 'gp2', - BROADCAST_NOTIFICATION: 'broadcast_notification', - E2E_NOTIFICATION: 'e2e_notification', - CALL_LOG: 'call_log', - PROTOCOL: 'protocol', - CHAT: 'chat', - LOCATION: 'location', - PAYMENT: 'payment', - VCARD: 'vcard', - CIPHERTEXT: 'ciphertext', - MULTI_VCARD: 'multi_vcard', - REVOKED: 'revoked', - OVERSIZED: 'oversized', - GROUPS_V4_INVITE: 'groups_v4_invite', - TEMPLATE: 'template', - HSM: 'hsm', - TEMPLATE_BUTTON_REPLY: 'template_button_reply', - IMAGE: 'image', - VIDEO: 'video', - AUDIO: 'audio', - PTT: 'ptt', - STICKER: 'sticker', - DOCUMENT: 'document', - PRODUCT: 'product', - UNKNOWN: 'unknown', - }, - TEMPLATE_SUBTYPE: { - IMAGE: 'image', - VIDEO: 'video', - LOCATION: 'location', - DOCUMENT: 'document', - TEXT: 'text', - }, - TEMPLATE_BUTTON_SUBTYPE: { - QUICK_REPLY: 'quick_reply', - CALL: 'call', - URL: 'url', - }, - NATIVE_PREF: { - LAST_SAVED_LOCATION: 'lastSavedLocation', - CONTENT_SETTINGS: 'contentSettings', - }, - TOUCHBAR_MAX_EMOJIS: 8, - VERIFIED_LEVEL: { - UNKNOWN: 0, - LOW: 1, - HIGH: 2, - }, - HOSTNAME: { - YOUTUBE: 'www.youtube.com', - YOUTUBE_SHORTENED: 'youtu.be', - INSTAGRAM: 'www.instagram.com', - STREAMABLE: 'streamable.com', - FACEBOOK: 'www.facebook.com', - FBWATCH: 'fbwat.ch', - LASSOVIDEOS: 'lassovideos.com', - }, - WHATSAPP_ORIGIN: 'https://whatsapp.com', - SMB_SEARCH_FILTERS: { - UNREAD: 'unread', - GROUP: 'group', - BROADCAST: 'broadcast', - }, - SMB_LABELS: { - MAX_LABEL_LENGTH: 100, - }, - PRODUCT_INQUIRY_TYPE: 'product_inquiry', - PRODUCT_LIST_ITEM_HEIGHT: 96, - LOADABLE_DELAY: 200, - MAX_EPHEMERAL_DURATION: 31536e3, - EPHEMERAL_SETTINGS: { - OFF: 0, - ONE_HOUR: 3600, - ONE_DAY: 86400, - ONE_WEEK: 604800, - ONE_MONTH: 2592e3, - ONE_YEAR: 31536e3, - }, - TAB_ORDERS: { - COMPOSE_BOX_INPUT: 1, - MESSAGE_LIST: 2, - CHAT_STARRED_DRAWER: 3, - CHAT_LIST_SEARCH: 3, - CHAT_LIST: 4, - CHAT_CONTACT_LIST: 4, - CHAT_IMAGE_GALLERY: 4, - CHAT_SEARCH_MSG_LIST: 4, - PANEL_SEARCH_INPUT: 5, - COMPOSE_BOX_MENU_BUTTON: 5, - }, - SPEEDY_RESUME_MAX_CHATS: 5e3, - MEDIA_VIEWER: { - ANIMATION_DURATION: 500, - CLOSE_ANIMATION_DURATION: 200, - ZOOM_IN_FACTOR: 2, - }, -}; diff --git a/src/api/model/enum/group-notification-type.ts b/src/api/model/enum/group-notification-type.ts deleted file mode 100644 index 54cd1da0b..000000000 --- a/src/api/model/enum/group-notification-type.ts +++ /dev/null @@ -1,28 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export enum GroupNotificationType { - Add = 'add', - Inivite = 'invite', - Remove = 'remove', - Leave = 'leave', - Subject = 'subject', - Description = 'description', - Picture = 'picture', - Announce = 'announce', - Restrict = 'restrict', -} diff --git a/src/api/model/enum/group-property.ts b/src/api/model/enum/group-property.ts deleted file mode 100644 index 48c765dfa..000000000 --- a/src/api/model/enum/group-property.ts +++ /dev/null @@ -1,47 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -/** - * Group properties - */ -export enum GroupProperty { - /** - * Define how can send message in the group - * `true` only admins - * `false` everyone - */ - ANNOUNCEMENT = 'announcement', - - /** - * Define how can edit the group data - * `true` only admins - * `false` everyone - */ - RESTRICT = 'restrict', - - /** - * Non-Documented - */ - NO_FREQUENTLY_FORWARDED = 'no_frequently_forwarded', - - /** - * Enable or disable temporary messages - * `true` to enable - * `false` to disable - */ - EPHEMERAL = 'ephemeral', -} diff --git a/src/api/model/enum/index.ts b/src/api/model/enum/index.ts deleted file mode 100644 index 3c668d004..000000000 --- a/src/api/model/enum/index.ts +++ /dev/null @@ -1,26 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export { AckType } from './ack-type'; -export { ChatState } from './chat-state'; -export { GroupNotificationType } from './group-notification-type'; -export { SocketState, SocketStream } from './socket-state'; -export { MessageType, MediaType } from './message-type'; -export * from './group-property'; -export * from './interface-mode'; -export * from './interface-state'; -export * from './status-find'; diff --git a/src/api/model/enum/interface-mode.ts b/src/api/model/enum/interface-mode.ts deleted file mode 100644 index 87b5f2197..000000000 --- a/src/api/model/enum/interface-mode.ts +++ /dev/null @@ -1,55 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export enum InterfaceMode { - /** - * QR code page. - */ - QR = 'QR', - /** - * Chat page. - */ - MAIN = 'MAIN', - /** - * Loading page, waiting data from smartphone. - */ - SYNCING = 'SYNCING', - /** - * Offline page, when there are no internet. - */ - OFFLINE = 'OFFLINE', - /** - * Conflic page, when there are another whatsapp web openned. - */ - CONFLICT = 'CONFLICT', - /** - * Blocked page, by proxy. - */ - PROXYBLOCK = 'PROXYBLOCK', - /** - * Blocked page. - */ - TOS_BLOCK = 'TOS_BLOCK', - /** - * Blocked page. - */ - SMB_TOS_BLOCK = 'SMB_TOS_BLOCK', - /** - * Deprecated page. - */ - DEPRECATED_VERSION = 'DEPRECATED_VERSION', -} diff --git a/src/api/model/enum/interface-state.ts b/src/api/model/enum/interface-state.ts deleted file mode 100644 index e538ebc5e..000000000 --- a/src/api/model/enum/interface-state.ts +++ /dev/null @@ -1,51 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export enum InterfaceState { - /** - * When there are no internet. - */ - OFFLINE = 'OFFLINE', - /** - * When the whatsapp web page is loading. - */ - OPENING = 'OPENING', - /** - * When the whatsapp web is connecting to smartphone after QR code scan. - */ - PAIRING = 'PAIRING', - /** - * When the whatsapp web is syncing messages with smartphone. - */ - SYNCING = 'SYNCING', - /** - * When the whatsapp web is syncing messages with smartphone after a disconnection. - */ - RESUMING = 'RESUMING', - /** - * When the whatsapp web is connecting to whatsapp server. - */ - CONNECTING = 'CONNECTING', - /** - * When the whatsapp web is ready. - */ - NORMAL = 'NORMAL', - /** - * When the whatsapp web couldn't connect to smartphone. - */ - TIMEOUT = 'TIMEOUT', -} diff --git a/src/api/model/enum/message-type.ts b/src/api/model/enum/message-type.ts deleted file mode 100644 index f943ca677..000000000 --- a/src/api/model/enum/message-type.ts +++ /dev/null @@ -1,65 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export enum MessageType { - NOTIFICATION = 'notification', - NOTIFICATION_TEMPLATE = 'notification_template', - GROUP_NOTIFICATION = 'group_notification', - - /** - * Group data modification, like subtitle or description and group members (join, leave) - * See {@link GroupNotificationType} - */ - GP2 = 'gp2', - BROADCAST_NOTIFICATION = 'broadcast_notification', - E2E_NOTIFICATION = 'e2e_notification', - CALL_LOG = 'call_log', - PROTOCOL = 'protocol', - CHAT = 'chat', - LOCATION = 'location', - PAYMENT = 'payment', - VCARD = 'vcard', - CIPHERTEXT = 'ciphertext', - MULTI_VCARD = 'multi_vcard', - REVOKED = 'revoked', - OVERSIZED = 'oversized', - GROUPS_V4_INVITE = 'groups_v4_invite', - HSM = 'hsm', - TEMPLATE_BUTTON_REPLY = 'template_button_reply', - IMAGE = 'image', - VIDEO = 'video', - AUDIO = 'audio', - PTT = 'ptt', - STICKER = 'sticker', - DOCUMENT = 'document', - PRODUCT = 'product', - ORDER = 'order', - LIST = 'list', - LIST_RESPONSE = 'list_response', - BUTTONS_RESPONSE = 'buttons_response', - POLL_CREATION = 'poll_creation', - UNKNOWN = 'unknown', -} - -export enum MediaType { - IMAGE = 'Image', - VIDEO = 'Video', - AUDIO = 'Audio', - PTT = 'Audio', - DOCUMENT = 'Document', - STICKER = 'Image', -} diff --git a/src/api/model/enum/socket-state.ts b/src/api/model/enum/socket-state.ts deleted file mode 100644 index 907009cd9..000000000 --- a/src/api/model/enum/socket-state.ts +++ /dev/null @@ -1,92 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -/** - * SocketState are the possible states of connection between WhatsApp page and phone. - */ -export enum SocketState { - /** - * Conflic page, when there are another whatsapp web openned. - */ - CONFLICT = 'CONFLICT', - /** - * When the whatsapp web is ready. - */ - CONNECTED = 'CONNECTED', - /** - * Deprecated page. - */ - DEPRECATED_VERSION = 'DEPRECATED_VERSION', - /** - * When the whatsapp web page is loading. - */ - OPENING = 'OPENING', - /** - * When the whatsapp web is connecting to smartphone after QR code scan. - */ - PAIRING = 'PAIRING', - /** - * Blocked page, by proxy. - */ - PROXYBLOCK = 'PROXYBLOCK', - /** - * Blocked page. - */ - SMB_TOS_BLOCK = 'SMB_TOS_BLOCK', - /** - * When the whatsapp web couldn't connect to smartphone. - */ - TIMEOUT = 'TIMEOUT', - /** - * Blocked page. - */ - TOS_BLOCK = 'TOS_BLOCK', - /** - * When the whatsapp web page is initialized yet. - */ - UNLAUNCHED = 'UNLAUNCHED', - /** - * Disconnected page, waiting for QRCode scan - */ - UNPAIRED = 'UNPAIRED', - /** - * Disconnected page with expired QRCode - */ - UNPAIRED_IDLE = 'UNPAIRED_IDLE', -} - -/** - * SocketStream are the possible states of connection between WhatsApp page and WhatsApp servers. - */ -export enum SocketStream { - /** - * Connected with WhatsApp servers - */ - CONNECTED = 'CONNECTED', - /** - * Disconnected from WhatsApp servers - */ - DISCONNECTED = 'DISCONNECTED', - /** - * Reconnecting to WhatsApp servers - */ - RESUMING = 'RESUMING', - /** - * Receiving data from WhatsApp servers - */ - SYNCING = 'SYNCING', -} diff --git a/src/api/model/enum/status-find.ts b/src/api/model/enum/status-find.ts deleted file mode 100644 index 251dab918..000000000 --- a/src/api/model/enum/status-find.ts +++ /dev/null @@ -1,66 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -/** - * SocketState are the possible states of connection between WhatsApp page and phone. - */ -export enum StatusFind { - /** - * The browser was closed using the autoClose. - */ - autocloseCalled = 'autocloseCalled', - /** - * If the browser is closed this parameter is returned. - */ - browserClose = 'browserClose', - /** - * Client has disconnected in to mobile. - */ - desconnectedMobile = 'desconnectedMobile', - /** - * Client is ready to send and receive messages. - */ - inChat = 'inChat', - /** - * When the user is already logged in to the browser. - */ - isLogged = 'isLogged', - /** - * When the user is not connected to the browser, it is necessary to scan the QR code through the cell phone in the option WhatsApp Web. - */ - notLogged = 'notLogged', - /** - * Client couldn't connect to phone. - */ - phoneNotConnected = 'phoneNotConnected', - /** - * Failed to authenticate. - */ - qrReadError = 'qrReadError', - /** - * If the browser stops when the QR code scan is in progress, this parameter is returned. - */ - qrReadFail = 'qrReadFail', - /** - * If the user is not logged in, the QR code is passed on the terminal a callback is returned. After the correct reading by cell phone this parameter is returned. - */ - qrReadSuccess = 'qrReadSuccess', - /** - * Client has disconnected in to wss. - */ - serverClose = 'serverClose', -} diff --git a/src/api/model/get-messages-param.ts b/src/api/model/get-messages-param.ts deleted file mode 100644 index 5ccbaec51..000000000 --- a/src/api/model/get-messages-param.ts +++ /dev/null @@ -1,43 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -/** - * Parâmetros para retorno de mensagens - */ -export interface GetMessagesParam { - /** - * Quantidade de mensagens para retornar - * informar `-1` para trazer tudo (Pode demorar e travar a interface) - * - * @default 20 - */ - count?: number; - /** - * ID da última mensagem para continuar a busca - * Isso funciona como paginação, então ao pegar um ID, - * você pode utilizar para obter as próximas mensagens a partir dele - */ - id?: string; - fromMe?: boolean; - /** - * Se você deseja recuperar as mensagems antes(before) ou depois(after) - * do ID informado. - * - * @default 'before' - */ - direction?: 'before' | 'after'; -} diff --git a/src/api/model/group-creation.ts b/src/api/model/group-creation.ts deleted file mode 100644 index 9a6584961..000000000 --- a/src/api/model/group-creation.ts +++ /dev/null @@ -1,24 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -import { Wid } from './wid'; - -export interface GroupCreation { - status: number; - gid: Wid; - participants: { [key: string]: any[] }[]; -} diff --git a/src/api/model/group-metadata.ts b/src/api/model/group-metadata.ts deleted file mode 100644 index 40f29484a..000000000 --- a/src/api/model/group-metadata.ts +++ /dev/null @@ -1,41 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -import { Wid } from './wid'; - -export interface GroupMetadata { - id: Wid; - creation: number; - owner: Wid; - desc: string; - descId: string; - descTime: number; - descOwner: Wid; - restrict: boolean; - announce: boolean; - noFrequentlyForwarded: boolean; - ephemeralDuration: number; - size: number; - support: boolean; - suspended: boolean; - terminated: boolean; - isParentGroup: boolean; - defaultSubgroup: boolean; - displayCadminPromotion: boolean; - participants: any[]; - pendingParticipants: any[]; -} diff --git a/src/api/model/host-device.ts b/src/api/model/host-device.ts deleted file mode 100644 index f7bb1eae4..000000000 --- a/src/api/model/host-device.ts +++ /dev/null @@ -1,53 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -import { Wid } from './wid'; - -export interface HostDevice { - id: string; - ref: string; - refTTL: number; - wid: Wid; - connected: boolean; - me: Wid; - protoVersion: number[]; - clientToken: string; - serverToken: string; - isResponse: string; - battery: number; - plugged: boolean; - lc: string; - lg: string; - locales: string; - is24h: boolean; - platform: string; - phone: Phone; - tos: number; - smbTos: number; - pushname: string; - blockStoreAdds: boolean; -} - -export interface Phone { - wa_version: string; - mcc: string; - mnc: string; - os_version: string; - device_manufacturer: string; - device_model: string; - os_build_number: string; -} diff --git a/src/api/model/id.ts b/src/api/model/id.ts deleted file mode 100644 index 7c8422e8b..000000000 --- a/src/api/model/id.ts +++ /dev/null @@ -1,25 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export interface Id { - server: string; - user: string; - _serialized: string; - fromMe: boolean; - remote: string; - id: string; -} diff --git a/src/api/model/incoming-call.ts b/src/api/model/incoming-call.ts deleted file mode 100644 index e24061c2b..000000000 --- a/src/api/model/incoming-call.ts +++ /dev/null @@ -1,34 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export interface IncomingCall { - /** alphanumeric ID of the call, can e.g. usable for hanging up */ - id: string, - /** ID of the caller, can be used to message them directly */ - peerJid: string, - /** Epoch timestamp (seconds) */ - offerTime: number, - isVideo: boolean, - isGroup: boolean, - groupJid: string | null, - canHandleLocally: boolean, - outgoing: boolean, - isSilenced: boolean, - offerReceivedWhileOffline: boolean, - webClientShouldHandle: boolean, - participants: any[] -} diff --git a/src/api/model/index.ts b/src/api/model/index.ts deleted file mode 100644 index 4a7cff578..000000000 --- a/src/api/model/index.ts +++ /dev/null @@ -1,38 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export { Chat } from './chat'; -export { Contact } from './contact'; -export { GroupMetadata } from './group-metadata'; -export { Id } from './id'; -export { Message } from './message'; -export { ParticipantEvent } from './participant-event'; -export { PartialMessage } from './partial-message'; -export { Ack } from './ack'; -export { HostDevice } from './host-device'; -export { LiveLocation } from './live-location'; -export { ContactStatus } from './contact-status'; -export { GroupCreation } from './group-creation'; -export { WhatsappProfile } from './whatsapp-profile'; -export { IncomingCall } from './incoming-call'; -export * from './result'; -export * from './get-messages-param'; -export * from './initializer'; -export * from './message-id'; -export * from './presence-event'; -export * from './profile-pic-thumb'; -export * from './wid'; diff --git a/src/api/model/initializer.ts b/src/api/model/initializer.ts deleted file mode 100644 index 2113dae39..000000000 --- a/src/api/model/initializer.ts +++ /dev/null @@ -1,78 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ -import { CreateConfig } from '../../config/create-config'; -import { SessionToken } from '../../token-store'; -import { StatusFind } from './enum'; - -/** - * A callback will be received, informing the status of the qrcode - */ -export type CatchQRCallback = ( - qrCode: string, - asciiQR: string, - attempt: number, - urlCode?: string -) => void; - -/** - * A callback will be received, informing the customer's status - */ -export type StatusFindCallback = ( - status: StatusFind | keyof typeof StatusFind, - session: string -) => void; - -/** - * A callback will be received, informing data as percentage and loading screen message - */ -export type LoadingScreenCallback = (percent: number, message: string) => void; - -/** - * A callback will be received, informing a code to you connect - */ -export type LinkByCodeCallback = (code: string) => void; - -export interface CreateOptions extends CreateConfig { - /** - * You must pass a string type parameter, this parameter will be the name of the client's session. If the parameter is not passed, the section name will be "session". - */ - session: string; - /** - * A callback will be received, informing the status of the qrcode - */ - catchQR?: CatchQRCallback; - - /** - * A callback will be received, informing a code to you connect - */ - catchLinkCode?: LinkByCodeCallback; - - /** - * A callback will be received, informing the customer's status - */ - statusFind?: StatusFindCallback; - - /** - * A callback will be received, informing data as percentage and loading screen message - */ - onLoadingScreen?: LoadingScreenCallback; - /** - * Pass the session token information you can receive this token with the await client.getSessionTokenBrowser () function - * @deprecated in favor of `sessionToken` - */ - browserSessionToken?: SessionToken; -} diff --git a/src/api/model/label.ts b/src/api/model/label.ts deleted file mode 100644 index a53cbc431..000000000 --- a/src/api/model/label.ts +++ /dev/null @@ -1,23 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ -export interface Label { - id: string; - name: string; - color: number | null; - count: number; - hexColor: string; -} diff --git a/src/api/model/live-location.ts b/src/api/model/live-location.ts deleted file mode 100644 index c9de3d766..000000000 --- a/src/api/model/live-location.ts +++ /dev/null @@ -1,70 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -/** - * Interface de dados para os eventos de Localização em tempo real - */ -export interface LiveLocation { - /** - * Tipo de evento de Localização em tempo real - * * enable - Quando inicia o compartilhamento - * * update - Atualzação de localização - * * disable - Fim do compartilhamento - */ - type: 'enable' | 'update' | 'disable'; - - /** - * ID de contato que realizou o compartilhamento - */ - id: string; - - /** - * Latitude em graus - */ - lat: number; - - /** - * Longitude em graus - */ - lng: number; - - /** - * Velocidade atual em milhar por hora (mp/h) - */ - speed: number; - - /** - * Precisão da localização em metros - */ - accuracy?: number; - - /** - * Tempo em segundos após o último compartilhamento - */ - elapsed?: number; - - /** - * Graus de direção - */ - degrees?: number; - - /** - * Tempo em segundos para o compartilhamento - * Somente no type:enable - */ - shareDuration?: number; -} diff --git a/src/api/model/message-id.ts b/src/api/model/message-id.ts deleted file mode 100644 index fe9642935..000000000 --- a/src/api/model/message-id.ts +++ /dev/null @@ -1,25 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -import { Wid } from './wid'; - -export interface MessageId { - fromMe: boolean; - id: string; - remote: Wid; - _serialized: string; -} diff --git a/src/api/model/message.ts b/src/api/model/message.ts deleted file mode 100644 index 0695ac74d..000000000 --- a/src/api/model/message.ts +++ /dev/null @@ -1,89 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -import { Chat } from './chat'; -import { Contact } from './contact'; -import { MessageType } from './enum'; - -/** available during the `onMessage` event */ -export interface Message { - id: string; - /** exists when it is a displayable message (i.e. `MessageType.CHAT` / `"chat"`); the body is not included in notifications like group removal, etc. (`gp2`) */ - body?: string; - type: MessageType; - /** - * When type is GP2: {@link GroupNotificationType} - */ - subtype: string; - t: number; - notifyName: string; - from: string; - to: string; - author: string; - self: string; - ack: number; - invis: boolean; - isNewMsg: boolean; - star: boolean; - recvFresh: boolean; - interactiveAnnotations: any[]; - clientUrl: string; - deprecatedMms3Url: string; - directPath: string; - mimetype: string; - filehash: string; - uploadhash: string; - size: number; - mediaKey: string; - mediaKeyTimestamp: number; - width: number; - height: number; - broadcast: boolean; - mentionedJidList: any[]; - isForwarded: boolean; - labels: any[]; - sender: Contact; - timestamp: number; - content: string; - isGroupMsg: boolean; - isMMS: boolean; - isMedia: boolean; - isNotification: boolean; - isPSA: boolean; - /** - * @deprecated Use `getChat` to get chat details - */ - chat: Chat; - lastSeen: null | number | boolean; - chatId: string; - /** - * @deprecated Use the `quotedMsgId` attribute in `getMessageById` to get the message details - */ - quotedMsgObj: null; - quotedMsgId: null; - mediaData: MediaData; - recipients?: string[]; -} - -export interface MediaData { - type: string; - mediaStage: string; - animationDuration: number; - animatedAsNewMsg: boolean; - _swStreamingSupported: boolean; - _listeningToSwSupport: boolean; -} diff --git a/src/api/model/partial-message.ts b/src/api/model/partial-message.ts deleted file mode 100644 index d82bdd7bd..000000000 --- a/src/api/model/partial-message.ts +++ /dev/null @@ -1,41 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export interface PartialMessage { - id: ID; - body: string; - type: string; - t: number; - notifyName: string; - from: string; - to: string; - self: string; - ack: number; - invis: boolean; - star: boolean; - broadcast: boolean; - mentionedJidList: any[]; - isForwarded: boolean; - labels: any[]; -} - -interface ID { - fromMe: boolean; - remote: string; - id: string; - _serialized: string; -} diff --git a/src/api/model/participant-event.ts b/src/api/model/participant-event.ts deleted file mode 100644 index 5fb3edfc4..000000000 --- a/src/api/model/participant-event.ts +++ /dev/null @@ -1,25 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export interface ParticipantEvent { - by?: string; - byPushName?: string; - groupId: string; - action: 'add' | 'remove' | 'demote' | 'promote' | 'leaver' | 'join'; - operation: 'add' | 'remove' | 'demote' | 'promote'; - who: string[]; -} diff --git a/src/api/model/presence-event.ts b/src/api/model/presence-event.ts deleted file mode 100644 index 22a61bc01..000000000 --- a/src/api/model/presence-event.ts +++ /dev/null @@ -1,40 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export interface PresenceEvent { - /** - * ID of contact or group - */ - id: string; - isOnline: boolean; - isGroup: boolean; - isUser: boolean; - state: 'available' | 'composing' | 'recording' | 'unavailable'; - /** - * Timestramp of event `Date.now()` - */ - t: number; - /** - * If is an user, check is a contact - */ - isContact?: boolean; - participants?: { - id: string; - state: 'available' | 'composing' | 'recording' | 'unavailable'; - shortName: string; - }[]; -} diff --git a/src/api/model/presence.ts b/src/api/model/presence.ts deleted file mode 100644 index a60554c1c..000000000 --- a/src/api/model/presence.ts +++ /dev/null @@ -1,23 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -import { Wid } from './wid'; - -export interface Presence { - id: Wid; - chatstates: any[]; -} diff --git a/src/api/model/profile-pic-thumb.ts b/src/api/model/profile-pic-thumb.ts deleted file mode 100644 index 6372dc38f..000000000 --- a/src/api/model/profile-pic-thumb.ts +++ /dev/null @@ -1,29 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ -import { Wid } from './wid'; - -/** - * Profile picture data - */ -export interface ProfilePicThumbObj { - eurl: string; - id: Wid; - img: string; - imgFull: string; - raw: null; - tag: string; -} diff --git a/src/api/model/qrcode.ts b/src/api/model/qrcode.ts deleted file mode 100644 index 78739d70f..000000000 --- a/src/api/model/qrcode.ts +++ /dev/null @@ -1,21 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export interface ScrapQrcode { - base64Image: string; - urlCode: string; -} diff --git a/src/api/model/result.ts b/src/api/model/result.ts deleted file mode 100644 index 60cd97f4c..000000000 --- a/src/api/model/result.ts +++ /dev/null @@ -1,50 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -import { HostDevice } from './host-device'; -import { MessageId } from './message-id'; - -export interface ScopeResult { - me: HostDevice; - to: MessageId & { - formattedName: string; - isBusiness: boolean; - isMyContact: boolean; - verifiedName: string; - pushname?: string; - }; - erro?: boolean; - text?: string | null; - status?: number | string; -} - -export interface SendFileResult extends ScopeResult { - type: string; - filename: string; - text?: string; - mimeType?: string; -} - -export interface SendStickerResult extends ScopeResult { - type: string; -} - -export interface SendPttResult extends ScopeResult { - type: string; - filename: string; - text?: string; -} diff --git a/src/api/model/whatsapp-profile.ts b/src/api/model/whatsapp-profile.ts deleted file mode 100644 index 3e14be36f..000000000 --- a/src/api/model/whatsapp-profile.ts +++ /dev/null @@ -1,26 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -import { Id } from './id'; - -export interface WhatsappProfile { - id: Id; - status: number; - isBusiness: boolean; - canReceiveMessage: boolean; - numberExists: boolean; -} diff --git a/src/api/model/wid.ts b/src/api/model/wid.ts deleted file mode 100644 index c43633c2e..000000000 --- a/src/api/model/wid.ts +++ /dev/null @@ -1,39 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -/** - * ID of user or group - * "xxxxxxxxxx@c.us" for contacts - * "xxxxxxxxxx@g.us" for groups - */ -export interface Wid { - /** - * "c.us" for contacts - * "g.us" for groups - */ - server: string; - - /** - * number of contact or group - */ - user: string; - - /** - * user@server - */ - _serialized: string; -} diff --git a/src/api/whatsapp.ts b/src/api/whatsapp.ts deleted file mode 100644 index 78428a05d..000000000 --- a/src/api/whatsapp.ts +++ /dev/null @@ -1,249 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -import axios from 'axios'; -import { Page } from 'puppeteer'; -import { CreateConfig } from '../config/create-config'; -import { useragentOverride } from '../config/WAuserAgente'; -import { evaluateAndReturn } from './helpers'; -import { magix, makeOptions, timeout } from './helpers/decrypt'; -import { BusinessLayer } from './layers/business.layer'; -import { GetMessagesParam, Message } from './model'; -import treekill = require('tree-kill'); - -export class Whatsapp extends BusinessLayer { - private connected: boolean | null = null; - - constructor(public page: Page, session?: string, options?: CreateConfig) { - super(page, session, options); - - let interval: any = null; - - if (this.page) { - this.page.on('close', async () => { - clearInterval(interval); - }); - } - - interval = setInterval(async (state) => { - const newConnected = await page - .evaluate(() => WPP.conn.isRegistered()) - .catch(() => null); - - if (newConnected === null || newConnected === this.connected) { - return; - } - - this.connected = newConnected; - if (!newConnected) { - this.log('info', 'Session Unpaired', { type: 'session' }); - setTimeout(async () => { - if (this.statusFind) { - try { - this.statusFind('desconnectedMobile', session); - } catch (error) {} - } - }, 1000); - } - }, 1000); - } - - protected async afterPageScriptInjected() { - await super.afterPageScriptInjected(); - this.page - .evaluate(() => WPP.conn.isRegistered()) - .then((isAuthenticated) => { - this.connected = isAuthenticated; - }) - .catch(() => null); - } - /** - * Decrypts message file - * @param data Message object - * @returns Decrypted file buffer (null otherwise) - */ - public async downloadFile(data: string) { - return await evaluateAndReturn( - this.page, - (data) => WAPI.downloadFile(data), - data - ); - } - - /** - * Download and returns the media content in base64 format - * @param messageId Message ou id - * @returns Base64 of media - */ - public async downloadMedia(messageId: string | Message): Promise { - if (typeof messageId !== 'string') { - messageId = messageId.id; - } - - return await evaluateAndReturn( - this.page, - async (messageId) => - WPP.util.blobToBase64(await WPP.chat.downloadMedia(messageId)), - messageId - ); - } - - /** - * Get the puppeteer page instance - * @returns The Whatsapp page - */ - get waPage(): Page { - return this.page; - } - - /** - * Get the puppeteer page screenshot - * @returns The Whatsapp page screenshot encoded in base64 - */ - public async takeScreenshot() { - if (this.page) { - return await this.page.screenshot({ encoding: 'base64' }); - } - } - - /** - * Clicks on 'use here' button (When it get unlaunched) - * This method tracks the class of the button - * Whatsapp web might change this class name over the time - * Dont rely on this method - */ - public async useHere() { - return await evaluateAndReturn(this.page, () => WAPI.takeOver()); - } - - /** - * Logout whastapp - * @returns boolean - */ - public async logout() { - return await evaluateAndReturn(this.page, () => WPP.conn.logout()); - } - - /** - * Closes page and browser - * @internal - */ - public async close() { - const browser = this.page.browser(); - - if (!this.page.isClosed()) { - await this.page.close().catch(() => null); - - await browser.close().catch(() => null); - /* - Code removed as it is not necessary. - try { - const process = browser.process(); - if (process) { - treekill(process.pid, 'SIGKILL'); - } - } catch (error) {} - */ - } - - return true; - } - - /** - * Return PID process - * @internal - */ - public getPID() { - const browser = this.page.browser(); - const process = browser.process(); - return process.pid; - } - - /** - * Get message by id - * @param messageId string - * @returns Message object - */ - public async getMessageById(messageId: string) { - return (await evaluateAndReturn( - this.page, - (messageId: any) => WAPI.getMessageById(messageId), - messageId - )) as Message; - } - - /** - * Retorna uma lista de mensagens de um chat - * @param chatId string ID da conversa ou do grupo - * @param params GetMessagesParam Opções de filtragem de resultados (count, id, direction) veja {@link GetMessagesParam}. - * @returns Message object - */ - public async getMessages(chatId: string, params: GetMessagesParam = {}) { - return await evaluateAndReturn( - this.page, - ({ chatId, params }) => WAPI.getMessages(chatId, params), - { chatId, params: params as any } - ); - } - - /** - * Decrypts message file - * @param message Message object - * @returns Decrypted file buffer (null otherwise) - */ - public async decryptFile(message: Message) { - const mediaUrl = message.clientUrl || message.deprecatedMms3Url; - - const options = makeOptions(useragentOverride); - - if (!mediaUrl) - throw new Error( - 'message is missing critical data needed to download the file.' - ); - let haventGottenImageYet = true; - let res: any; - try { - while (haventGottenImageYet) { - res = await axios.get(mediaUrl.trim(), options); - if (res.status == 200) { - haventGottenImageYet = false; - } else { - await timeout(2000); - } - } - } catch (error) { - throw 'Error trying to download the file.'; - } - const buff = Buffer.from(res.data, 'binary'); - return magix(buff, message.mediaKey, message.type, message.size); - } - - /** - * Rejeita uma ligação recebida pelo WhatsApp - * @param callId string ID da ligação, caso não passado, todas ligações serão rejeitadas - * @returns Número de ligações rejeitadas - */ - public async rejectCall(callId?: string) { - return await evaluateAndReturn( - this.page, - ({ callId }) => WPP.call.rejectCall(callId), - { - callId, - } - ); - } -} diff --git a/src/config/WAuserAgente.ts b/src/config/WAuserAgente.ts deleted file mode 100644 index be60f3671..000000000 --- a/src/config/WAuserAgente.ts +++ /dev/null @@ -1,20 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -const useragentOverride = - 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.63 Safari/537.36'; -export { useragentOverride }; diff --git a/src/config/create-config.ts b/src/config/create-config.ts deleted file mode 100644 index 77604fd47..000000000 --- a/src/config/create-config.ts +++ /dev/null @@ -1,202 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ -import { Browser, BrowserContext, Page, launch } from 'puppeteer'; -import { Logger } from 'winston'; -import { SessionToken, TokenStore } from '../token-store'; -import { defaultLogger } from '../utils/logger'; - -// Server config -export interface CreateConfig { - /** - * Headless chrome - * @default true - */ - headless?: boolean | 'shell'; - /** - * Open devtools by default - * @default false - */ - devtools?: boolean; - /** - * If false will use Chromium instance - * @default true - */ - useChrome?: boolean; - /** - * Opens a debug session - * @default false - */ - debug?: boolean; - /** - * If you want to use browserWSEndpoint - */ - browserWS?: string; - /** - * Parameters to be added into the chrome browser instance - */ - browserArgs?: string[]; - /** - * Will be passed to puppeteer.launch - */ - puppeteerOptions?: Parameters[0]; - /** - * Pass a external browser instance, can be used with electron - */ - browser?: Browser | BrowserContext; - /** - * Pass a external page instance, can be used with electron - */ - page?: Page; - /** - * Logs QR automatically in terminal - * @default true - */ - logQR?: boolean; - /** - * Will disable the welcoming message which appears in the beginning - * @default false - */ - disableWelcome?: boolean; - /** - * Logs info updates automatically in terminal - * @default true - */ - updatesLog?: boolean; - /** - * Automatically closes the wppconnect only when scanning the QR code (default 60000 miliseconds, if you want to turn it off, assign 0 or false) - * @default 60000 - */ - autoClose?: number; - /** - * Automatically closes the wppconnect only when is syncing the device (default 180000 miliseconds, 3 minutes, if you want to turn it off, assign 0 or false) - * @default 180000 (3 minutes) - */ - deviceSyncTimeout?: number; - /** - * Wait for in chat to return a instance of {@link Whatsapp} - * @default false - */ - waitForLogin?: boolean; - /** - * Wait for in chat to return a instance of {@link Whatsapp} - * @default false - */ - logger?: Logger; - - /** - * Initial token to log in in WhatsApp. - * If not passed, the client will get it from {@link tokenStore}. - * @deprecated - */ - sessionToken?: SessionToken; - - /** - * Token store used to manage token {@link tokenStore} - * @default 'file' - * @deprecated - */ - tokenStore?: TokenStore | string; - - /** Folder name when saving tokens if {@link tokenStore} is 'file'. - * @default 'tokens' - */ - folderNameToken?: string; - - /** - * folder directory tokens, just inside the wppconnect folder, example: { mkdirFolderToken: '/node_modules', } //will save the tokens folder in the node_modules directory - * @deprecated See {@link tokenStore} - */ - mkdirFolderToken?: string; - - /** - * Creates a folder when inserting an object in the client's browser, to work it is necessary to pass the parameters in the function create browserSessionToken - * @deprecated See {@link tokenStore} - * @default true - */ - createPathFileToken?: boolean; - - /** - * Quando definido, essa opção força o carregamento de uma versão específica do WhatsApp WEB - * Normalmente, versões mais antigas continuam funcionando por mais um tempo, - * assim, com essa opção, é possível ter uma janela de tempo maior para se preparar para atualizações. - * Caso seja definido vazio ou null, será usado a versão atual, ou seja, sem forçar versão específica. - * @default 2.2134.x - */ - whatsappVersion?: string; - - /** - * Define the connected device name in WhatsApp app - * @default 'WPPConnect' - */ - deviceName?: string | false; - - /** - * Set custom Link Preview API servers - * @default null - */ - linkPreviewApiServers?: string[] | null; - - /** - * Disable custom Google Analytics - * @default true - */ - disableGoogleAnalytics?: boolean; - - /** - * Custom Google Analytics Tracker Id, like 'G-XXXXXXXXXX' - * collect analytics data to your GA account - * @default null - */ - googleAnalyticsId?: string | null; - - /** - * Custom variable for Google Analytics - * @default 'WPPConnect' - */ - poweredBy?: string; - - /** - * Insert the phone number for connect by link phone, qr code not wil generate - */ - phoneNumber?: string; -} - -export const defaultOptions: CreateConfig = { - folderNameToken: './tokens', - headless: true, - devtools: false, - useChrome: true, - debug: false, - logQR: true, - browserWS: '', - browserArgs: [''], - puppeteerOptions: {}, - disableWelcome: false, - updatesLog: true, - autoClose: 60000, - deviceSyncTimeout: 180000, - createPathFileToken: true, - waitForLogin: true, - logger: defaultLogger, - tokenStore: 'file', - whatsappVersion: '2.3000.1013232587-alpha', - deviceName: false, - linkPreviewApiServers: null, - disableGoogleAnalytics: true, - googleAnalyticsId: null, - poweredBy: 'WPPConnect', -}; diff --git a/src/config/puppeteer.config.ts b/src/config/puppeteer.config.ts deleted file mode 100644 index 0ac774fe0..000000000 --- a/src/config/puppeteer.config.ts +++ /dev/null @@ -1,61 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -const puppeteerConfig = { - whatsappUrl: 'https://web.whatsapp.com', - chromiumArgs: [ - // `--app=${WAUrl}`, - '--log-level=3', // fatal only - //'--start-maximized', - '--no-default-browser-check', - '--disable-site-isolation-trials', - '--no-experiments', - '--ignore-gpu-blacklist', - '--ignore-certificate-errors', - '--ignore-certificate-errors-spki-list', - '--disable-gpu', - '--disable-extensions', - '--disable-default-apps', - '--enable-features=NetworkService', - '--disable-setuid-sandbox', - '--no-sandbox', - // Extras - '--disable-webgl', - '--disable-infobars', - '--window-position=0,0', - '--ignore-certifcate-errors', - '--ignore-certifcate-errors-spki-list', - '--disable-threaded-animation', - '--disable-threaded-scrolling', - '--disable-in-process-stack-traces', - '--disable-histogram-customizer', - '--disable-gl-extensions', - '--disable-composited-antialiasing', - '--disable-canvas-aa', - '--disable-3d-apis', - '--disable-accelerated-2d-canvas', - '--disable-accelerated-jpeg-decoding', - '--disable-accelerated-mjpeg-decode', - '--disable-app-list-dismiss-on-blur', - '--disable-accelerated-video-decode', - '--disable-dev-shm-usage', - '--autoplay-policy=no-user-gesture-required', - '--disable-blink-features=AutomationControlled', - ], -}; - -export { puppeteerConfig }; diff --git a/src/controllers/auth.ts b/src/controllers/auth.ts deleted file mode 100644 index c1941a5ad..000000000 --- a/src/controllers/auth.ts +++ /dev/null @@ -1,89 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -import * as puppeteer from 'puppeteer'; -import * as qrcode from 'qrcode-terminal'; - -export const getInterfaceStatus = async ( - waPage: puppeteer.Page -): Promise>>> => { - return await waPage - .waitForFunction( - () => { - const elLoginWrapper = document.querySelector( - 'body > div > div > .landing-wrapper' - ); - const elQRCodeCanvas = document.querySelector('canvas'); - if (elLoginWrapper && elQRCodeCanvas) { - return 'UNPAIRED'; - } - - const streamStatus = WPP?.whatsapp?.Stream?.displayInfo; - if (['PAIRING', 'RESUMING', 'SYNCING'].includes(streamStatus)) { - return 'PAIRING'; - } - const elChat = document.querySelector('.app,.two') as HTMLDivElement; - if (elChat && elChat.attributes && elChat.tabIndex) { - return 'CONNECTED'; - } - return false; - }, - { - timeout: 0, - polling: 100, - } - ) - .then(async (element: puppeteer.HandleFor>>) => { - return (await element.evaluate((a: any) => a)) as puppeteer.HandleFor< - ReturnType - >; - }) - .catch(() => null); -}; - -/** - * Validates if client is authenticated - * @returns true if is authenticated, false otherwise - * @param waPage - */ -export const isAuthenticated = (waPage: puppeteer.Page) => { - return waPage.evaluate(() => WPP.conn.isRegistered()); -}; - -export const needsToScan = async (waPage: puppeteer.Page) => { - const connected = await isAuthenticated(waPage); - - return !connected; -}; - -export const isInsideChat = async (waPage: puppeteer.Page) => { - return await waPage.evaluate(() => WPP.conn.isMainReady()); -}; - -export const isConnectingToPhone = async (waPage: puppeteer.Page) => { - return await waPage.evaluate( - () => WPP.conn.isMainLoaded() && !WPP.conn.isMainReady() - ); -}; - -export async function asciiQr(code: string): Promise { - return new Promise((resolve) => { - qrcode.generate(code, { small: true }, (qrcode) => { - resolve(qrcode); - }); - }); -} diff --git a/src/controllers/browser.ts b/src/controllers/browser.ts deleted file mode 100644 index 15299ea0d..000000000 --- a/src/controllers/browser.ts +++ /dev/null @@ -1,374 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -import * as ChromeLauncher from 'chrome-launcher'; -import * as os from 'os'; -import * as path from 'path'; -import * as rimraf from 'rimraf'; -import * as waVersion from '@wppconnect/wa-version'; -import axios from 'axios'; -import { Browser, BrowserContext, Page } from 'puppeteer'; -import puppeteer from 'puppeteer-extra'; -import { CreateConfig } from '../config/create-config'; -import { puppeteerConfig } from '../config/puppeteer.config'; -import StealthPlugin from 'puppeteer-extra-plugin-stealth'; -import { useragentOverride } from '../config/WAuserAgente'; -import { WebSocketTransport } from './websocket'; -import { Logger } from 'winston'; -import { SessionToken } from '../token-store'; -import { LoadingScreenCallback } from '../api/model'; -import { LogLevel } from '../utils/logger'; -import { sleep } from '../utils/sleep'; - -export async function unregisterServiceWorker(page: Page) { - await page.evaluateOnNewDocument(() => { - // Remove existent service worker - navigator.serviceWorker - .getRegistrations() - .then((registrations) => { - for (let registration of registrations) { - registration.unregister(); - } - }) - .catch((err) => null); - - // Disable service worker registration - // @ts-ignore - navigator.serviceWorker.register = new Promise(() => {}); - - setInterval(() => { - window.onerror = console.error; - window.onunhandledrejection = console.error; - }, 500); - }); -} - -/** - * Força o carregamento de uma versão específica do WhatsApp WEB - * @param page Página a ser injetada - * @param version Versão ou expressão semver - */ -export async function setWhatsappVersion( - page: Page, - version: string, - log?: (level: LogLevel, message: string, meta?: object) => any -) { - let body: string | null = null; - try { - body = waVersion.getPageContent(version); - } catch (error) {} - - if (!body) { - log?.( - 'error', - `Version not available for ${version}, using latest as fallback` - ); - return; - } - - await page.setRequestInterception(true); - - page.on('request', (req) => { - if (req.url().startsWith('https://web.whatsapp.com/check-update')) { - req.abort(); - return; - } - if (req.url() !== 'https://web.whatsapp.com/') { - req.continue(); - return; - } - - req.respond({ - status: 200, - contentType: 'text/html', - body: body, - }); - }); -} - -export async function initWhatsapp( - page: Page, - token?: SessionToken, - clear = true, - version?: string, - log?: (level: LogLevel, message: string, meta?: object) => any -) { - await page.setUserAgent(useragentOverride); - - await unregisterServiceWorker(page); - - if (version) { - log?.('verbose', `Setting WhatsApp WEB version to ${version}`); - await setWhatsappVersion(page, version, log); - } - - log?.('verbose', `Loading WhatsApp WEB`); - await page.goto(puppeteerConfig.whatsappUrl, { - waitUntil: 'load', - timeout: 0, - referer: 'https://whatsapp.com/', - }); - log?.('verbose', 'WhatsApp WEB loaded'); - /*setTimeout(() => { - log?.('verbose', `Loading WhatsApp WEB`); - - const timeout = 10 * 1000; - page - .goto(puppeteerConfig.whatsappUrl, { - timeout, - waitUntil: 'domcontentloaded', - }) - .catch(() => {}); - - log?.('verbose', `WhatsApp WEB loaded`); - }, 1000); - */ - - return page; -} - -let lastPercent = null; -let lastPercentMessage = null; -export async function onLoadingScreen( - page: Page, - onLoadingScreenCallBack?: LoadingScreenCallback -) { - await page.evaluate(`function getElementByXpath(path) { - return document.evaluate(path, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; - }`); - - await page - .exposeFunction( - 'loadingScreen', - async (percent: number, message: string) => { - if (lastPercent !== percent || lastPercentMessage !== message) { - onLoadingScreenCallBack && onLoadingScreenCallBack(percent, message); - lastPercent = percent; - lastPercentMessage = message; - } - } - ) - .catch(() => null); - - await page.evaluate( - function (selectors) { - let observer = new MutationObserver(function () { - let window2: any = window; - - let progressBar = window2.getElementByXpath(selectors.PROGRESS); - let progressMessage = window2.getElementByXpath( - selectors.PROGRESS_MESSAGE - ); - - if (progressBar) { - if ( - this.lastPercent !== progressBar.value || - this.lastPercentMessage !== progressMessage.innerText - ) { - window2.loadingScreen(progressBar.value, progressMessage.innerText); - this.lastPercent = progressBar.value; - this.lastPercentMessage = progressMessage.innerText; - } - } - }); - - observer.observe(document, { - attributes: true, - childList: true, - characterData: true, - subtree: true, - }); - }, - { - PROGRESS: "//*[@id='app']/div/div/div[2]/progress", - PROGRESS_MESSAGE: "//*[@id='app']/div/div/div[3]", - } - ); -} - -export async function injectApi( - page: Page, - onLoadingScreenCallBack?: LoadingScreenCallback -) { - const injected = await page - .evaluate(() => { - // @ts-ignore - return ( - typeof window.WAPI !== 'undefined' && - typeof window.Store !== 'undefined' - ); - }) - .catch(() => false); - - if (injected) { - return; - } - - // Wait for some loaded modules - await page - .waitForFunction( - () => ((window as any)?.webpackChunkwhatsapp_web_client?.length || 0) > 3 - ) - .catch(() => null); - - await sleep(100); - - await page.addScriptTag({ - path: require.resolve('@wppconnect/wa-js'), - }); - - await page - .evaluate(() => { - WPP.chat.defaultSendMessageOptions.createChat = true; - WPP.conn.setKeepAlive(true); - }) - .catch(() => false); - - await page.addScriptTag({ - path: require.resolve( - path.join(__dirname, '../../dist/lib/wapi', 'wapi.js') - ), - }); - - await onLoadingScreen(page, onLoadingScreenCallBack); - // Make sure WAPI is initialized - await page - .waitForFunction(() => { - return ( - typeof window.WAPI !== 'undefined' && - typeof window.Store !== 'undefined' && - window.WPP.isReady - ); - }) - .catch(() => false); -} - -/** - * Initializes browser, will try to use chrome as default - * @param session - */ -export async function initBrowser( - session: string, - options: CreateConfig, - logger: Logger -): Promise { - if (options.useChrome) { - const chromePath = getChrome(); - if (chromePath) { - if (!options.puppeteerOptions) { - options.puppeteerOptions = {}; - } - options.puppeteerOptions.executablePath = chromePath; - } else { - logger.warn('Chrome not found, using chromium', { - session, - type: 'browser', - }); - } - } - - // Use stealth plugin to avoid being detected as a bot - puppeteer.use(StealthPlugin()); - - let browser = null; - if (options.browserWS && options.browserWS != '') { - const transport = await getTransport(options.browserWS); - browser = await puppeteer.connect({ transport }); - } else { - /** - * Setting the headless mode to the old Puppeteer mode, when using the 'new' mode, results in an error on CentOS7 and Debian11. - * Temporary fix. - */ - browser = await puppeteer.launch({ - headless: options.headless, - devtools: options.devtools, - args: options.browserArgs - ? options.browserArgs - : [...puppeteerConfig.chromiumArgs], - ...options.puppeteerOptions, - }); - - // Register an exit callback to remove user-data-dir - try { - const arg = browser - .process() - .spawnargs.find((s: string) => s.startsWith('--user-data-dir=')); - - if (arg) { - const tmpUserDataDir = arg.split('=')[1]; - - // Only if path is in TMP directory - if ( - path.relative(os.tmpdir(), tmpUserDataDir).startsWith('puppeteer') - ) { - process.on('exit', () => { - // Remove only on exit signal - try { - rimraf.sync(tmpUserDataDir); - } catch (error) {} - }); - } - } - } catch (error) {} - } - - return browser; -} - -export async function getOrCreatePage( - browser: Browser | BrowserContext -): Promise { - const pages = await browser.pages(); - - if (pages.length) { - return pages[0]; - } - - return await browser.newPage(); -} - -/** - * Retrieves chrome instance path - */ -function getChrome() { - try { - return ChromeLauncher.Launcher.getFirstInstallation(); - } catch (error) { - return undefined; - } -} - -async function getTransport(browserWS: string) { - let error = null; - try { - return await WebSocketTransport.create(browserWS, 10000); - } catch (e) { - error = e; - } - - // Automatic get the endpoint - try { - const endpointURL = - browserWS.replace(/ws(s)?:/, 'http$1:') + '/json/version'; - const data = await axios.get(endpointURL).then((r) => r.data); - - return await WebSocketTransport.create(data.webSocketDebuggerUrl, 10000); - } catch (e) {} - - // Throw first error - throw error; -} diff --git a/src/controllers/initializer.ts b/src/controllers/initializer.ts deleted file mode 100644 index cb98e658a..000000000 --- a/src/controllers/initializer.ts +++ /dev/null @@ -1,275 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -import { Whatsapp } from '../api/whatsapp'; -import { CreateConfig, defaultOptions } from '../config/create-config'; -import { initBrowser, getOrCreatePage } from './browser'; -import { checkUpdates, welcomeScreen } from './welcome'; -import { SocketState, StatusFind } from '../api/model/enum'; -import { Browser } from 'puppeteer'; -import { - CatchQRCallback, - CreateOptions, - LinkByCodeCallback, - LoadingScreenCallback, - StatusFindCallback, -} from '../api/model/initializer'; -import { SessionToken } from '../token-store'; -import { defaultLogger } from '../utils/logger'; -import * as path from 'path'; -import * as fs from 'fs'; -import sanitize from 'sanitize-filename'; -import { sleep } from '../utils/sleep'; - -process.on( - 'unhandledRejection', - (reason: Error | any, promise: Promise) => { - let message = 'Unhandled Rejection: '; - if (reason instanceof Error) { - if (reason.stack) { - message += reason.stack; - } else { - message += reason.toString(); - } - } else { - message += JSON.stringify(reason); - } - - defaultLogger.error(message); - } -); - -/** - * Start the bot - * @returns Whatsapp page, with this parameter you will be able to access the bot functions - */ -export async function create(createOption: CreateOptions): Promise; -/** - * Start the bot - * You must pass a string type parameter, this parameter will be the name of the client's session. If the parameter is not passed, the section name will be "session". - * @returns Whatsapp page, with this parameter you will be able to access the bot functions - * @deprecated Deprecated in favor of create with {@link CreateOptions} (e.g., wppconnect.create({session: 'test'})). - */ -export async function create( - sessionName: string, - catchQR?: CatchQRCallback, - statusFind?: StatusFindCallback, - onLoadingScreen?: LoadingScreenCallback, - catchLinkCode?: LinkByCodeCallback, - options?: CreateConfig, - browserSessionToken?: SessionToken -): Promise; - -export async function create( - sessionOrOption: string | CreateOptions, - catchQR?: CatchQRCallback, - statusFind?: StatusFindCallback, - onLoadingScreen?: LoadingScreenCallback, - catchLinkCode?: LinkByCodeCallback, - options?: CreateConfig, - browserSessionToken?: SessionToken -): Promise { - let session = 'session'; - let usingDeprecatedCreate = false; - - if ( - typeof sessionOrOption === 'string' && - sessionOrOption.replace(/\s/g, '').length - ) { - session = sessionOrOption.replace(/\s/g, ''); - - usingDeprecatedCreate = - typeof sessionOrOption === 'string' || - typeof catchQR !== 'undefined' || - typeof statusFind !== 'undefined' || - typeof options !== 'undefined' || - typeof browserSessionToken !== 'undefined'; - } else if (typeof sessionOrOption === 'object') { - options = sessionOrOption; - if (sessionOrOption.session) session = sessionOrOption.session; - catchQR = sessionOrOption.catchQR || catchQR; - statusFind = sessionOrOption.statusFind || statusFind; - onLoadingScreen = sessionOrOption.onLoadingScreen || onLoadingScreen; - catchLinkCode = sessionOrOption.catchLinkCode || catchLinkCode; - - if (!options.sessionToken) { - options.sessionToken = - sessionOrOption.browserSessionToken || browserSessionToken; - } - } - - const mergedOptions = { ...defaultOptions, ...options }; - - const logger = mergedOptions.logger; - - if (usingDeprecatedCreate) { - logger.warn( - 'You are using deprecated create method, please use create({options}) See: https://wppconnect.io/wppconnect/pages/Getting%20Started/creating-client.html#passing-options-on-create' - ); - } - - if (!mergedOptions.disableWelcome) { - welcomeScreen(); - } - - if (mergedOptions.updatesLog) { - await checkUpdates(); - } - - let browser = mergedOptions.browser; - let page = mergedOptions.page; - - if (!browser && page) { - // Get browser from page - browser = page.browser(); - } else if (!browser && !page) { - if ( - !mergedOptions.browserWS && - !mergedOptions.puppeteerOptions?.userDataDir - ) { - mergedOptions.puppeteerOptions.userDataDir = path.resolve( - process.cwd(), - path.join(mergedOptions.folderNameToken, sanitize(session)) - ); - - if (!fs.existsSync(mergedOptions.puppeteerOptions.userDataDir)) { - fs.mkdirSync(mergedOptions.puppeteerOptions.userDataDir, { - recursive: true, - }); - } - } - - if (!mergedOptions.browserWS) { - logger.info( - `Using browser folder '${mergedOptions.puppeteerOptions.userDataDir}'`, - { - session, - type: 'browser', - } - ); - } - - // Initialize new browser - logger.info('Initializing browser...', { session, type: 'browser' }); - browser = await initBrowser(session, mergedOptions, logger).catch((e) => { - if (mergedOptions.browserWS && mergedOptions.browserWS != '') { - logger.error(`Error when try to connect ${mergedOptions.browserWS}`, { - session, - type: 'browser', - }); - } else { - logger.error(`Error no open browser`, { - session, - type: 'browser', - }); - } - logger.error(e.message, { - session, - type: 'browser', - }); - throw e; - }); - - logger.http('checking headless...', { - session, - type: 'browser', - }); - - if (mergedOptions.headless) { - logger.http('headless option is active, browser hidden', { - session, - type: 'browser', - }); - } else { - logger.http('headless option is disabled, browser visible', { - session, - type: 'browser', - }); - } - } - - if (!mergedOptions.browserWS && browser['_process']) { - browser['_process'].once('close', () => { - browser['isClose'] = true; - }); - } - - (browser as Browser).on('targetdestroyed', async (target: any) => { - if ( - typeof (browser as Browser).isConnected === 'function' && - !(browser as Browser).isConnected() - ) { - return; - } - const pages = await browser.pages(); - if (!pages.length) { - browser.close().catch(() => null); - } - }); - - (browser as Browser).on('disconnected', () => { - if (mergedOptions.browserWS) { - statusFind && statusFind('serverClose', session); - } else { - statusFind && statusFind('browserClose', session); - } - }); - - if (!page) { - // Initialize a page - page = await getOrCreatePage(browser); - } - - if (page) { - await page.setBypassCSP(true); - - const client = new Whatsapp(page, session, mergedOptions); - client.catchQR = catchQR; - client.statusFind = statusFind; - client.onLoadingScreen = onLoadingScreen; - client.catchLinkCode = catchLinkCode; - - await client.start(); - - if (mergedOptions.waitForLogin) { - const isLogged = await client.waitForLogin(); - if (!isLogged) { - throw 'Not Logged'; - } - - let waitLoginPromise = null; - client.onStateChange(async (state) => { - const connected = await page.evaluate(() => WPP.conn.isRegistered()); - if (!connected) { - await sleep(2000); - - if (!waitLoginPromise) { - waitLoginPromise = client - .waitForLogin() - .catch(() => {}) - .finally(() => { - waitLoginPromise = null; - }); - } - await waitLoginPromise; - } - }); - } - - return client; - } -} diff --git a/src/controllers/websocket.ts b/src/controllers/websocket.ts deleted file mode 100644 index e47968471..000000000 --- a/src/controllers/websocket.ts +++ /dev/null @@ -1,59 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ -import { ConnectionTransport } from 'puppeteer'; -import WebSocket from 'ws'; - -export class WebSocketTransport implements ConnectionTransport { - static create(url: string, timeout?: number): Promise { - return new Promise((resolve, reject) => { - const ws = new WebSocket(url, [], { - perMessageDeflate: false, - maxPayload: 256 * 1024 * 1024, // 256Mb - handshakeTimeout: timeout, - }); - - ws.addEventListener('open', () => resolve(new WebSocketTransport(ws))); - ws.addEventListener('error', reject); - }); - } - - private _ws: WebSocket; - onmessage?: (message: string) => void; - onclose?: () => void; - - constructor(ws: WebSocket) { - this._ws = ws; - this._ws.addEventListener('message', (event) => { - if (this.onmessage) this.onmessage.call(null, event.data); - }); - this._ws.addEventListener('close', () => { - if (this.onclose) this.onclose.call(null); - }); - // Silently ignore all errors - we don't know what to do with them. - this._ws.addEventListener('error', () => {}); - this.onmessage = null; - this.onclose = null; - } - - send(message: string): void { - this._ws.send(message); - } - - close(): void { - this._ws.close(); - } -} diff --git a/src/controllers/welcome.ts b/src/controllers/welcome.ts deleted file mode 100644 index f737212ec..000000000 --- a/src/controllers/welcome.ts +++ /dev/null @@ -1,86 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ -import boxen from 'boxen'; -import chalk from 'chalk'; -import latestVersion from 'latest-version'; -import { defaultLogger as logger } from '../utils/logger'; -import { upToDate } from '../utils/semver'; -const { version } = require('../../package.json'); - -// Global -let welcomeShown = false; -let updatesChecked = false; - -export function welcomeScreen() { - if (welcomeShown) { - return; - } - welcomeShown = true; - logger.info(` - _ ______ ____ ______ __ - | | / / __ \\/ __ \\/ ____/___ ____ ____ ___ _____/ /_ - | | /| / / /_/ / /_/ / / / __ \\/ __ \\/ __ \\/ _ \\/ ___/ __/ - | |/ |/ / ____/ ____/ /___/ /_/ / / / / / / / __/ /__/ /_ - |__/|__/_/ /_/ \\____/\\____/_/ /_/_/ /_/\\___/\\___/\\__/`); -} - -export async function checkUpdates() { - // Check for updates if needed - if (!updatesChecked) { - updatesChecked = true; - await checkWPPConnectVersion(); - } -} - -/** - * Checs for a new versoin of wppconnect and logs - */ -async function checkWPPConnectVersion() { - logger.info('Checking for updates'); - await latestVersion('@wppconnect-team/wppconnect') - .then((latest) => { - if (upToDate(version, latest)) { - logger.info("You're up to date"); - } else { - logger.info('There is a new version available'); - logUpdateAvailable(version, latest); - } - }) - .catch(() => { - logger.warn('Failed to check updates'); - }); -} - -/** - * Logs a boxen of instructions to update - * @param current - * @param latest - */ -function logUpdateAvailable(current: string, latest: string) { - // prettier-ignore - const newVersionLog = - `There is a new version of ${chalk.bold(`Wppconnect`)} ${chalk.gray(current)} ➜ ${chalk.bold.green(latest)}\n` + - `Update your package by running:\n\n` + - `${chalk.bold('\>')} ${chalk.blueBright('npm update @wppconnect-team/wppconnect')}`; - - logger.info(boxen(newVersionLog, { padding: 1 })); - logger.info( - `For more info visit: ${chalk.underline( - 'https://github.com/wppconnect-team/wppconnect/blob/master/Update.md' - )}\n` - ); -} diff --git a/src/index.ts b/src/index.ts deleted file mode 100644 index 94231a078..000000000 --- a/src/index.ts +++ /dev/null @@ -1,27 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ -import type * as WAJS from '@wppconnect/wa-js'; - -export * from './api/model'; -export * from './api/model/enum'; -export { Whatsapp } from './api/whatsapp'; -export { CreateConfig } from './config/create-config'; -export { create } from './controllers/initializer'; -export { defaultLogger } from './utils/logger'; -export * as tokenStore from './token-store'; - -export type { WAJS }; diff --git a/src/lib/README.md b/src/lib/README.md deleted file mode 100644 index 2cfb5e1de..000000000 --- a/src/lib/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Files here should not be touched - -> Files inside this directory are automatically generated and copied into dist bundle with the build scripts diff --git a/src/lib/wapi/.babelrc b/src/lib/wapi/.babelrc deleted file mode 100644 index b40c5fd0d..000000000 --- a/src/lib/wapi/.babelrc +++ /dev/null @@ -1,20 +0,0 @@ -{ - "plugins": [], - "presets": [ - [ - "@babel/preset-env", - { - "targets": { - "esmodules": true, - "chrome": "50" - } - } - ] - ], - "env": { - "development": { - "sourceMaps": "inline", - "retainLines": true - } - } -} diff --git a/src/lib/wapi/business/get-business-profiles-products.js b/src/lib/wapi/business/get-business-profiles-products.js deleted file mode 100644 index 30e5bb9a1..000000000 --- a/src/lib/wapi/business/get-business-profiles-products.js +++ /dev/null @@ -1,39 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export async function getBusinessProfilesProducts(id) { - let catalog = WPP.whatsapp.CatalogStore.get(id); - if (!catalog) { - catalog = await WPP.whatsapp.CatalogStore.find( - WPP.whatsapp.WidFactory.createWid(id) - ); - } - - if (!catalog) { - throw { - error: true, - code: 'catalog_not_found', - message: 'Catalog not found', - }; - } - - if (catalog.productCollection) { - return catalog.productCollection.serialize(); - } - - return []; -} diff --git a/src/lib/wapi/business/get-order-by-msg.js b/src/lib/wapi/business/get-order-by-msg.js deleted file mode 100644 index 7eed18c63..000000000 --- a/src/lib/wapi/business/get-order-by-msg.js +++ /dev/null @@ -1,54 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -import { getMessageById } from '../functions/get-message-by-id'; - -export async function getOrderbyMsg(msgId) { - let msg = await getMessageById(msgId, null, false); - if (!msg) { - throw { - error: true, - code: 'message_not_found', - message: 'Message not found', - }; - } - if (msg.type !== 'order') { - throw { - error: true, - code: 'message_is_not_an_order', - message: 'Message is not an order', - }; - } - let order = WPP.whatsapp.OrderStore.get(msg.orderId); - if (!order) { - order = await WPP.whatsapp.OrderStore.findOrder( - msg.orderId, - msg.sellerJid, - msg.token - ); - } - - if (!order) { - throw { - error: true, - code: 'order_not_found', - message: 'Order not found', - }; - } - - return order.products; -} diff --git a/src/lib/wapi/business/index.js b/src/lib/wapi/business/index.js deleted file mode 100644 index a547becc9..000000000 --- a/src/lib/wapi/business/index.js +++ /dev/null @@ -1,18 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ -export { getBusinessProfilesProducts } from './get-business-profiles-products'; -export { getOrderbyMsg } from './get-order-by-msg'; diff --git a/src/lib/wapi/business/send-payment-request.js b/src/lib/wapi/business/send-payment-request.js deleted file mode 100644 index dad396526..000000000 --- a/src/lib/wapi/business/send-payment-request.js +++ /dev/null @@ -1,47 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -window.WAPI.sendPaymentRequest = async function ( - chatId, - amount1000, - currency, - noteMessage -) { - var chat = WPP.whatsapp.ChatStore.get(chatId); - var tempMsg = Object.create(chat.msgs.filter((msg) => msg.__x_isSentByMe)[0]); - var newId = WPP.chat.generateMessageID(chatId); - var extend = { - ack: 0, - id: newId, - local: !0, - self: 'out', - t: parseInt(new Date().getTime() / 1000), - to: chatId, - isNewMsg: !0, - type: 'payment', - subtype: 'request', - amount1000, - requestFrom: chatId, - currency, - noteMessage, - expiryTimestamp: parseInt( - new Date(new Date().setDate(new Date().getDate() + 1)).getTime() / 1000 - ), - }; - Object.assign(tempMsg, extend); - await WPP.whatsapp.functions.addAndSendMsgToChat(chat, tempMsg); -}; diff --git a/src/lib/wapi/functions/are-all-messages-loaded.js b/src/lib/wapi/functions/are-all-messages-loaded.js deleted file mode 100644 index 239e225e9..000000000 --- a/src/lib/wapi/functions/are-all-messages-loaded.js +++ /dev/null @@ -1,26 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export function areAllMessagesLoaded(id, done) { - const found = WAPI.getChat(id); - if (!found.msgs.msgLoadState.noEarlierMsgs) { - if (done) done(false); - return false; - } - if (done) done(true); - return true; -} diff --git a/src/lib/wapi/functions/check-send-exist.js b/src/lib/wapi/functions/check-send-exist.js deleted file mode 100644 index aca80a8aa..000000000 --- a/src/lib/wapi/functions/check-send-exist.js +++ /dev/null @@ -1,83 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export function scope(id, erro, status, text = null) { - let e = { - me: WPP.whatsapp.Conn.attributes, - to: id, - erro: erro, - text: text, - status: status, - }; - return e; -} -export async function getchatId(chatId) { - var to = await WAPI.getChatById(chatId), - objTo = to.lastReceivedKey || {}, - extend = { - formattedName: to.contact.formattedName, - isBusiness: to.contact.isBusiness, - isMyContact: to.contact.isMyContact, - verifiedName: to.contact.verifiedName, - pushname: to.contact.pushname, - }; - Object.assign(objTo, extend); - return objTo; -} - -export async function sendExist(chatId, returnChat = true, Send = true) { - if (!chatId) { - return scope(chatId, true, 500, 'Chat ID is empty'); - } - - // Check chat exists (group is always a chat) - let chat = await window.WAPI.getChat(chatId); - - if (!chat && chatId === 'status@broadcast') { - chat = new WPP.whatsapp.ChatStore.modelClass({ - id: WPP.whatsapp.WidFactory.createWid('status@broadcast'), - }); - WPP.whatsapp.ChatStore.add(chat); - chat = await window.WAPI.getChat(chatId); // Fix some methods - } - - // Check if contact number exists - if (!chat && !chatId.includes('@g')) { - let ck = await window.WAPI.checkNumberStatus(chatId); - - if (!ck.numberExists) { - return scope(chatId, true, ck.status, 'The number does not exist'); - } - - // Load chat ID for non contact - await WPP.chat.find(ck.id); - - chatId = ck.id._serialized; - chat = await window.WAPI.getChat(chatId); - } - - if (!chat) { - return scope(chatId, true, 404); - } - if (Send) { - await WPP.chat.markIsRead(chat.id).catch(() => null); - } - if (returnChat) { - return chat; - } - return scope(chatId, false, 200); -} diff --git a/src/lib/wapi/functions/create-product.js b/src/lib/wapi/functions/create-product.js deleted file mode 100644 index 8023c97d8..000000000 --- a/src/lib/wapi/functions/create-product.js +++ /dev/null @@ -1,55 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -/** - * Sends product to catalog - * @param {string} imgBase64 Base64 image data - * @param {string} name Product name - * @param {string} description Product description - * @param {number} price Product price - * @param {boolean} isHidden Boolean that indicates if product is hidden or not. Default is false - * @param {string} url Product url - * @param {string} retailerId Registered product ID on another system - * @param {string} currency Currency of product - * @param {Function} done Optional callback - */ -export function createProduct( - imgBase64, - name, - description = null, - price = null, - isHidden = false, - url = null, - retailerId = null, - currency = 'BRL', - done -) { - WPP.catalog - .createProduct({ - name, - image: imgBase64, - description, - price, - isHidden, - url, - retailerId, - currency, - }) - .then((result) => { - if (done !== undefined) done(result); - }); -} diff --git a/src/lib/wapi/functions/download-file-with-credentials.js b/src/lib/wapi/functions/download-file-with-credentials.js deleted file mode 100644 index 98231e0e8..000000000 --- a/src/lib/wapi/functions/download-file-with-credentials.js +++ /dev/null @@ -1,41 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export async function downloadFile(url) { - return await new Promise((resolve, reject) => { - let xhr = new XMLHttpRequest(); - xhr.onload = function () { - if (xhr.readyState == 4) { - if (xhr.status == 200) { - let reader = new FileReader(); - reader.readAsDataURL(xhr.response); - reader.onload = function (e) { - resolve(reader.result.substr(reader.result.indexOf(',') + 1)); - }; - } else { - console.error(xhr.statusText); - } - } else { - // console.log(err); - resolve(false); - } - }; - xhr.open('GET', url, true); - xhr.responseType = 'blob'; - xhr.send(null); - }); -} diff --git a/src/lib/wapi/functions/encrypt-and-upload-file.js b/src/lib/wapi/functions/encrypt-and-upload-file.js deleted file mode 100644 index 3575403fd..000000000 --- a/src/lib/wapi/functions/encrypt-and-upload-file.js +++ /dev/null @@ -1,39 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -import { generateMediaKey, getFileHash } from '../helper'; - -export async function encryptAndUploadFile(type, blob) { - const filehash = await getFileHash(blob); - const mediaKey = generateMediaKey(32); - const controller = new AbortController(); - const signal = controller.signal; - const encrypted = await window.Store.UploadUtils.encryptAndUpload({ - blob, - type, - signal, - mediaKey, - }); - return { - ...encrypted, - clientUrl: encrypted.url, - filehash, - id: filehash, - uploadhash: encrypted.encFilehash, - mediaBlob: blob, - }; -} diff --git a/src/lib/wapi/functions/fix-chat.js b/src/lib/wapi/functions/fix-chat.js deleted file mode 100644 index 86390b6ba..000000000 --- a/src/lib/wapi/functions/fix-chat.js +++ /dev/null @@ -1,48 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export async function pinChat(chatId, type = true, notExist = false) { - if (typeof type != 'boolean' || typeof notExist != 'boolean') { - var text = 'incorrect parameter, insert a boolean true or false'; - return WAPI.scope(chatId, true, null, text); - } - let typeFix = type ? 'pin' : 'unpin', - retult = void 0; - var chat = await WAPI.sendExist(chatId, true, notExist); - if (!chat.erro) { - var m = { - type: 'pinChat', - typefix: typeFix, - }, - To = await WAPI.getchatId(chat.id); - await Store.pinChat - .setPin(chat, type) - .then((_) => { - var obj = WAPI.scope(To, false, 'OK', null); - Object.assign(obj, m); - retult = obj; - }) - .catch((error) => { - var obj = WAPI.scope(To, true, error, 'Pin Chat first'); - Object.assign(obj, m); - retult = obj; - }); - return retult; - } else { - return chat; - } -} diff --git a/src/lib/wapi/functions/forward-messages.js b/src/lib/wapi/functions/forward-messages.js deleted file mode 100644 index 1d625576e..000000000 --- a/src/lib/wapi/functions/forward-messages.js +++ /dev/null @@ -1,64 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -import { getMessageById } from './get-message-by-id'; - -export async function forwardMessages(chatId, messagesId, skipMyMessages) { - if (!Array.isArray(messagesId)) { - messagesId = [messagesId]; - } - - await WAPI.sendExist(chatId); - const chat = WPP.whatsapp.ChatStore.get(chatId); - if (!chat) { - throw { - error: true, - code: 'chat_not_found', - message: 'Chat not found', - chatId: chatId, - }; - } - - const messages = []; - - for (const msg of messagesId) { - const msgId = typeof msg === 'string' ? msg : msg.id; - const messageData = await getMessageById(msgId, null, false); - - if (!messageData) { - throw { - error: true, - code: 'message_not_found', - message: 'Message not Found', - messageId: msgId, - }; - } - - messages.push(messageData); - } - - const toForward = messages.filter((msg) => - skipMyMessages ? !msg.isSentByMe : true - ); - - await chat.forwardMessages(toForward); - await new Promise((resolve) => setTimeout(resolve, 100)); // Wait collection update - - const msgs = chat.msgs.getModelsArray().slice(messagesId.length * -1); - - return msgs.map((m) => m.id._serialized); -} diff --git a/src/lib/wapi/functions/get-all-chats-ids.js b/src/lib/wapi/functions/get-all-chats-ids.js deleted file mode 100644 index 70c0bf99c..000000000 --- a/src/lib/wapi/functions/get-all-chats-ids.js +++ /dev/null @@ -1,25 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export const getAllChatIds = function (done) { - const chatIds = WPP.whatsapp.ChatStore.map( - (chat) => chat.id._serialized || chat.id - ); - - if (done !== undefined) done(chatIds); - return chatIds; -}; diff --git a/src/lib/wapi/functions/get-all-chats-with-messages.js b/src/lib/wapi/functions/get-all-chats-with-messages.js deleted file mode 100644 index 71284a6ec..000000000 --- a/src/lib/wapi/functions/get-all-chats-with-messages.js +++ /dev/null @@ -1,30 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export async function getAllChatsWithMessages(newOnly) { - const x = []; - if (newOnly) { - x.push( - WAPI.getAllChatsWithNewMsg().map((c) => WAPI.getChat(c.id._serialized)) - ); - } else { - x.push(WAPI.getAllChatIds().map((c) => WAPI.getChat(c))); - } - const _result = (await Promise.all(x)).flatMap((x) => x); - const result = JSON.stringify(_result); - return JSON.parse(result); -} diff --git a/src/lib/wapi/functions/get-all-chats.js b/src/lib/wapi/functions/get-all-chats.js deleted file mode 100644 index a0f82c0e9..000000000 --- a/src/lib/wapi/functions/get-all-chats.js +++ /dev/null @@ -1,25 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export const getAllChats = function (done) { - const chats = WPP.whatsapp.ChatStore.map((chat) => - WAPI._serializeChatObj(chat) - ); - - if (done !== undefined) done(chats); - return chats; -}; diff --git a/src/lib/wapi/functions/get-all-contacts.js b/src/lib/wapi/functions/get-all-contacts.js deleted file mode 100644 index 572bee18a..000000000 --- a/src/lib/wapi/functions/get-all-contacts.js +++ /dev/null @@ -1,25 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export const getAllContacts = async function () { - let contacts = await Promise.all( - WPP.whatsapp.ContactStore.map(async (contact) => { - return await WAPI._serializeContactObj(contact); - }) - ); - return contacts; -}; diff --git a/src/lib/wapi/functions/get-all-group-metadata.js b/src/lib/wapi/functions/get-all-group-metadata.js deleted file mode 100644 index 1257ff6ba..000000000 --- a/src/lib/wapi/functions/get-all-group-metadata.js +++ /dev/null @@ -1,25 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export function getAllGroupMetadata(done) { - const groupData = WPP.whatsapp.GroupMetadataStore.map( - (groupData) => groupData.attributes - ); - - if (done !== undefined) done(groupData); - return groupData; -} diff --git a/src/lib/wapi/functions/get-all-groups.js b/src/lib/wapi/functions/get-all-groups.js deleted file mode 100644 index 84dd8dcff..000000000 --- a/src/lib/wapi/functions/get-all-groups.js +++ /dev/null @@ -1,23 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export function getAllGroups(done) { - const groups = WPP.whatsapp.ChatStore.filter((chat) => chat.isGroup); - - if (done !== undefined) done(groups); - return groups; -} diff --git a/src/lib/wapi/functions/get-all-messages-in-chat.js b/src/lib/wapi/functions/get-all-messages-in-chat.js deleted file mode 100644 index a3187fef6..000000000 --- a/src/lib/wapi/functions/get-all-messages-in-chat.js +++ /dev/null @@ -1,44 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export async function getAllMessagesInChat( - id, - includeMe, - includeNotifications, - done -) { - var chat = await WAPI.sendExist(id); - let output = []; - if (!chat.erro) { - const messages = chat.msgs.getModelsArray(); - for (const i in messages) { - if (i === 'remove') { - continue; - } - const messageObj = messages[i]; - - let message = WAPI.processMessageObj( - messageObj, - includeMe, - includeNotifications - ); - if (message) output.push(message); - } - } - if (done !== undefined) done(output); - return output; -} diff --git a/src/lib/wapi/functions/get-all-new-messages.js b/src/lib/wapi/functions/get-all-new-messages.js deleted file mode 100644 index 5b65fa601..000000000 --- a/src/lib/wapi/functions/get-all-new-messages.js +++ /dev/null @@ -1,28 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -import { getAllChatsWithNewMessages } from './get-chats-with-new-messages'; - -export const getAllNewMessages = function () { - const _newMessages = - getAllChatsWithNewMessages() - .map((c) => WAPI.getChat(c.id)) - .flatMap((c) => c.msgs.filter((x) => x.isNewMsg)) - .map(WAPI._serializeMessageObj) || []; - - return _newMessages; -}; diff --git a/src/lib/wapi/functions/get-all-unread-messages.js b/src/lib/wapi/functions/get-all-unread-messages.js deleted file mode 100644 index 85d7a5742..000000000 --- a/src/lib/wapi/functions/get-all-unread-messages.js +++ /dev/null @@ -1,35 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -import { getAllChatsWithNewMessages } from './get-chats-with-new-messages'; - -/** - * Retrieves undread messages - * x.ack === -1 - * TODO: Test this fn, seems incorrect, should not be async - */ -export const getAllUnreadMessages = async function () { - const queries = getAllChatsWithNewMessages().map((c) => - WPP.chat.getMessages(c.id, { - count: c.unreadCount, - }) - ); - - const chatMessages = await Promise.all(queries); - - return chatMessages.flat().map(WAPI._serializeMessageObj); -}; diff --git a/src/lib/wapi/functions/get-battery-level.js b/src/lib/wapi/functions/get-battery-level.js deleted file mode 100644 index 4397f7160..000000000 --- a/src/lib/wapi/functions/get-battery-level.js +++ /dev/null @@ -1,20 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export function getBatteryLevel() { - return WPP.whatsapp.Conn.attributes.battery; -} diff --git a/src/lib/wapi/functions/get-chat-by-id.js b/src/lib/wapi/functions/get-chat-by-id.js deleted file mode 100644 index 3d8adbd26..000000000 --- a/src/lib/wapi/functions/get-chat-by-id.js +++ /dev/null @@ -1,28 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export async function getChatById(id, done) { - let found = await WAPI.getChat(id); - if (found) { - found = WAPI._serializeChatObj(found); - } else { - found = false; - } - - if (done !== undefined) done(found); - return found; -} diff --git a/src/lib/wapi/functions/get-chat-by-name.js b/src/lib/wapi/functions/get-chat-by-name.js deleted file mode 100644 index e142e7476..000000000 --- a/src/lib/wapi/functions/get-chat-by-name.js +++ /dev/null @@ -1,22 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export function getChatByName(name, done) { - const found = WPP.chat.find((chat) => chat.name === name); - if (done !== undefined) done(found); - return found; -} diff --git a/src/lib/wapi/functions/get-chat.js b/src/lib/wapi/functions/get-chat.js deleted file mode 100644 index cd3018934..000000000 --- a/src/lib/wapi/functions/get-chat.js +++ /dev/null @@ -1,32 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export function getChat(id) { - if (!id) { - return false; - } - id = typeof id == 'string' ? id : id._serialized; - const found = WPP.whatsapp.ChatStore.get(id); - if (found) { - found.sendMessage = found.sendMessage - ? found.sendMessage - : function () { - return WPP.whatsapp.functions.sendTextMsgToChat(this, ...arguments); - }; - } - return found; -} diff --git a/src/lib/wapi/functions/get-chats-with-new-messages.js b/src/lib/wapi/functions/get-chats-with-new-messages.js deleted file mode 100644 index 5191ad86e..000000000 --- a/src/lib/wapi/functions/get-chats-with-new-messages.js +++ /dev/null @@ -1,27 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -import { hasUndreadMessages } from './has-unread-messages'; - -export const getAllChatsWithNewMessages = function (done) { - const chats = WPP.whatsapp.ChatStore.filter(hasUndreadMessages).map((chat) => - WAPI._serializeChatObj(chat) - ); - - if (done !== undefined) done(chats); - return chats; -}; diff --git a/src/lib/wapi/functions/get-common-groups.js b/src/lib/wapi/functions/get-common-groups.js deleted file mode 100644 index c108d0b0c..000000000 --- a/src/lib/wapi/functions/get-common-groups.js +++ /dev/null @@ -1,43 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export async function getCommonGroups(participantId, done) { - let output = []; - let groups = window.WAPI.getAllGroups(); - for (let idx in groups) { - try { - let participants = await window.WAPI.getGroupParticipantIDs( - groups[idx].id - ); - if ( - participants.filter((participant) => participant == participantId) - .length - ) { - output.push(groups[idx]); - } - } catch (err) { - console.log('Error in group:'); - console.log(groups[idx]); - console.log(err); - } - } - - if (done !== undefined) { - done(output); - } - return output; -} diff --git a/src/lib/wapi/functions/get-contact.js b/src/lib/wapi/functions/get-contact.js deleted file mode 100644 index 0aee01ab9..000000000 --- a/src/lib/wapi/functions/get-contact.js +++ /dev/null @@ -1,23 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export const getContact = function (id, done) { - const found = WPP.whatsapp.ContactStore.get(id); - - if (done !== undefined) done(window.WAPI._serializeContactObj(found)); - return window.WAPI._serializeContactObj(found); -}; diff --git a/src/lib/wapi/functions/get-group-metadata.js b/src/lib/wapi/functions/get-group-metadata.js deleted file mode 100644 index 88d71479e..000000000 --- a/src/lib/wapi/functions/get-group-metadata.js +++ /dev/null @@ -1,22 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export async function getGroupMetadata(id, done) { - let output = WPP.whatsapp.GroupMetadataStore.find(id); - if (done !== undefined) done(output); - return output; -} diff --git a/src/lib/wapi/functions/get-group-participant-ids.js b/src/lib/wapi/functions/get-group-participant-ids.js deleted file mode 100644 index bfaa2047d..000000000 --- a/src/lib/wapi/functions/get-group-participant-ids.js +++ /dev/null @@ -1,27 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -import { _getGroupParticipants } from './get-group-participants'; - -export async function getGroupParticipantIDs(groupId, done) { - const output = await Promise.resolve(WPP.group.getParticipants()).then( - (participants) => participants.map((p) => p.id) - ); - - if (done !== undefined) done(output); - return output; -} diff --git a/src/lib/wapi/functions/get-group-participants.js b/src/lib/wapi/functions/get-group-participants.js deleted file mode 100644 index 94a9dccc2..000000000 --- a/src/lib/wapi/functions/get-group-participants.js +++ /dev/null @@ -1,21 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export async function _getGroupParticipants(id) { - const metadata = await WAPI.getGroupMetadata(id); - return metadata.participants; -} diff --git a/src/lib/wapi/functions/get-host.js b/src/lib/wapi/functions/get-host.js deleted file mode 100644 index 177c674a9..000000000 --- a/src/lib/wapi/functions/get-host.js +++ /dev/null @@ -1,20 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export function getHost() { - return WPP.whatsapp.Conn.attributes; -} diff --git a/src/lib/wapi/functions/get-list-mute.js b/src/lib/wapi/functions/get-list-mute.js deleted file mode 100644 index 832c8de8f..000000000 --- a/src/lib/wapi/functions/get-list-mute.js +++ /dev/null @@ -1,52 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export async function getListMute(type = 'all') { - var muteList = (await window.Store.Mute)._models, - noMute = new Array(), - toMute = new Array(); - for (var i in muteList) - muteList[i].__x_isMuted - ? toMute.push(WAPI.interfaceMute(muteList[i])) - : noMute.push(WAPI.interfaceMute(muteList[i])); - var r = null; - console.log(0, type); - switch (type) { - case 'all': - r = [ - { - total: toMute.length + noMute.length, - amountToMute: toMute.length, - amountnoMute: noMute.length, - }, - toMute, - noMute, - ]; - break; - case 'toMute': - r = [{ total: toMute.length }, toMute]; - break; - case 'noMute': - r = [{ total: noMute.length }, noMute]; - break; - } - return r; -} -export function interfaceMute(arr) { - let { attributes, expiration, id, isMuted, isState, promises, stale } = arr; - return { attributes, expiration, id, isMuted, isState, promises, stale }; -} diff --git a/src/lib/wapi/functions/get-me.js b/src/lib/wapi/functions/get-me.js deleted file mode 100644 index 8cc798960..000000000 --- a/src/lib/wapi/functions/get-me.js +++ /dev/null @@ -1,25 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export function getMe(done) { - const rawMe = WPP.whatsapp.ContactStore.get( - WPP.whatsapp.UserPrefs.getMaybeMeUser() - ); - - if (done !== undefined) done(rawMe.all); - return rawMe.all; -} diff --git a/src/lib/wapi/functions/get-message-by-id.js b/src/lib/wapi/functions/get-message-by-id.js deleted file mode 100644 index 2fc4d36a0..000000000 --- a/src/lib/wapi/functions/get-message-by-id.js +++ /dev/null @@ -1,50 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export async function getMessageById(id, done, serialize = true) { - //Parse message ID - - if (typeof id === 'object' && id._serialized) { - id = id._serialized; - } - - if (typeof id !== 'string') { - return false; - } - - const msg = await WPP.chat.getMessageById(id); - - if (!msg) { - return false; - } - - let result = false; - - if (serialize) { - try { - result = WAPI.processMessageObj(msg, true, true); - } catch (err) {} - } else { - result = msg; - } - - if (typeof done === 'function') { - done(result); - } else { - return result; - } -} diff --git a/src/lib/wapi/functions/get-messages.js b/src/lib/wapi/functions/get-messages.js deleted file mode 100644 index 9c68ddce3..000000000 --- a/src/lib/wapi/functions/get-messages.js +++ /dev/null @@ -1,34 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export async function getMessages(chatId, params = {}, serialize = true) { - const msgs = await WPP.chat.getMessages(chatId, params); - - if (!Array.isArray(msgs)) { - const error = new Error(`Failed to fetch messages for ${chatId}`); - - Object.assign(error, msgs); - - throw error; - } - - const result = msgs - .map((m) => new WPP.whatsapp.MsgStore.modelClass(m)) - .map((m) => WAPI.processMessageObj(m, true, true)); - - return result; -} diff --git a/src/lib/wapi/functions/get-my-contacts.js b/src/lib/wapi/functions/get-my-contacts.js deleted file mode 100644 index bcc04383f..000000000 --- a/src/lib/wapi/functions/get-my-contacts.js +++ /dev/null @@ -1,24 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export const getMyContacts = function (done) { - const contacts = WPP.whatsapp.ContactStore.filter( - (contact) => contact.isMyContact === true - ).map((contact) => WAPI._serializeContactObj(contact)); - if (done !== undefined) done(contacts); - return contacts; -}; diff --git a/src/lib/wapi/functions/get-new-id.js b/src/lib/wapi/functions/get-new-id.js deleted file mode 100644 index dd4085cd6..000000000 --- a/src/lib/wapi/functions/get-new-id.js +++ /dev/null @@ -1,25 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export function getNewId() { - var text = ''; - var possible = - 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; - for (var i = 0; i < 20; i++) - text += possible.charAt(Math.floor(Math.random() * possible.length)); - return text; -} diff --git a/src/lib/wapi/functions/get-number-profile.js b/src/lib/wapi/functions/get-number-profile.js deleted file mode 100644 index c3fde5ee2..000000000 --- a/src/lib/wapi/functions/get-number-profile.js +++ /dev/null @@ -1,34 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export async function getNumberProfile(id, done) { - const result = await WPP.contact.queryExists(id); - - if (!result || result.wid === undefined) throw 404; - - const data = window.WAPI._serializeNumberStatusObj({ - jid: result.wid, - status: 200, - isBusiness: result.biz, - }); - if (data.status == 200) data.numberExists = true; - if (done !== undefined) { - done(window.WAPI._serializeNumberStatusObj(result)); - done(data); - } - return data; -} diff --git a/src/lib/wapi/functions/get-session-token.js b/src/lib/wapi/functions/get-session-token.js deleted file mode 100644 index 116e19db0..000000000 --- a/src/lib/wapi/functions/get-session-token.js +++ /dev/null @@ -1,29 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export async function getSessionTokenBrowser() { - if (window.localStorage) { - var localStorages = await JSON.parse(JSON.stringify(window.localStorage)); - let { WABrowserId, WASecretBundle, WAToken1, WAToken2 } = localStorages; - return { - WABrowserId, - WASecretBundle, - WAToken1, - WAToken2, - }; - } -} diff --git a/src/lib/wapi/functions/get-unread-messages-in-chat.js b/src/lib/wapi/functions/get-unread-messages-in-chat.js deleted file mode 100644 index 9aea5ca37..000000000 --- a/src/lib/wapi/functions/get-unread-messages-in-chat.js +++ /dev/null @@ -1,64 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export function getUnreadMessagesInChat( - id, - includeMe, - includeNotifications, - done -) { - // get chat and its messages - let chat = WAPI.getChat(id); - let messages = chat.msgs._models; - - // initialize result list - let output = []; - - // look for unread messages, newest is at the end of array - for (let i = messages.length - 1; i >= 0; i--) { - // system message: skip it - if (i === 'remove') { - continue; - } - - // get message - let messageObj = messages[i]; - - // found a read message: stop looking for others - if ( - typeof messageObj.isNewMsg !== 'boolean' || - messageObj.isNewMsg === false - ) { - continue; - } else { - messageObj.isNewMsg = false; - // process it - let message = WAPI.processMessageObj( - messageObj, - includeMe, - includeNotifications - ); - - // save processed message on result list - if (message) output.push(message); - } - } - // callback was passed: run it - if (done !== undefined) done(output); - // return result list - return output; -} diff --git a/src/lib/wapi/functions/get-unread-messages.js b/src/lib/wapi/functions/get-unread-messages.js deleted file mode 100644 index f8d082a0b..000000000 --- a/src/lib/wapi/functions/get-unread-messages.js +++ /dev/null @@ -1,103 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export function getUnreadMessages( - includeMe, - includeNotifications, - useUnreadCount, - done -) { - const chats = WPP.whatsapp.ChatStore.getModelsArray(); - const output = []; - - for (const chat in chats) { - if (isNaN(chat)) { - continue; - } - - const messageGroupObj = chats[chat]; - let messageGroup = WAPI._serializeChatObj(messageGroupObj); - messageGroup.messages = []; - - const messages = messageGroupObj.msgs._models; - for (let i = messages.length - 1; i >= 0; i--) { - const messageObj = messages[i]; - if ( - typeof messageObj.isNewMsg != 'boolean' || - messageObj.isNewMsg === false - ) { - continue; - } else { - messageObj.isNewMsg = false; - let message = WAPI.processMessageObj( - messageObj, - includeMe, - includeNotifications - ); - if (message) { - messageGroup.messages.push(message); - } - } - } - - if (messageGroup.messages.length > 0) { - output.push(messageGroup); - } else { - // No messages with isNewMsg true - if (useUnreadCount) { - // Will use unreadCount attribute to fetch last n messages from sender - let n = messageGroupObj.unreadCount; - for (let i = messages.length - 1; i >= 0; i--) { - const messageObj = messages[i]; - if (n > 0) { - if (!messageObj.isSentByMe) { - let message = WAPI.processMessageObj( - messageObj, - includeMe, - includeNotifications - ); - messageGroup.messages.unshift(message); - n -= 1; - } - } else if (n === -1) { - // chat was marked as unread so will fetch last message as unread - if (!messageObj.isSentByMe) { - let message = WAPI.processMessageObj( - messageObj, - includeMe, - includeNotifications - ); - messageGroup.messages.unshift(message); - break; - } - } else { - // unreadCount = 0 - break; - } - } - if (messageGroup.messages.length > 0) { - messageGroupObj.unreadCount = 0; // reset unread counter - output.push(messageGroup); - } - } - } - } - if (done !== undefined) { - done(output); - } - return output; -} diff --git a/src/lib/wapi/functions/get-wid.js b/src/lib/wapi/functions/get-wid.js deleted file mode 100644 index 659c6cced..000000000 --- a/src/lib/wapi/functions/get-wid.js +++ /dev/null @@ -1,20 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export function getWid() { - return WPP.whatsapp.UserPrefs.getMaybeMeUser()?._serialized; -} diff --git a/src/lib/wapi/functions/has-unread-messages.js b/src/lib/wapi/functions/has-unread-messages.js deleted file mode 100644 index d45b500f7..000000000 --- a/src/lib/wapi/functions/has-unread-messages.js +++ /dev/null @@ -1,20 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export const hasUndreadMessages = function (chat) { - return chat.unreadCount > 0; -}; diff --git a/src/lib/wapi/functions/index.js b/src/lib/wapi/functions/index.js deleted file mode 100644 index 60f079b81..000000000 --- a/src/lib/wapi/functions/index.js +++ /dev/null @@ -1,89 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export { areAllMessagesLoaded } from './are-all-messages-loaded'; -export { downloadFile } from './download-file-with-credentials'; -export { encryptAndUploadFile } from './encrypt-and-upload-file'; -export { getAllChats } from './get-all-chats'; -export { getAllChatIds } from './get-all-chats-ids'; -export { getAllChatsWithMessages } from './get-all-chats-with-messages'; -export { getAllContacts } from './get-all-contacts'; -export { getAllGroupMetadata } from './get-all-group-metadata'; -export { getAllGroups } from './get-all-groups'; -export { getAllMessagesInChat } from './get-all-messages-in-chat'; -export { getAllNewMessages } from './get-all-new-messages'; -export { getAllUnreadMessages } from './get-all-unread-messages'; -export { getBatteryLevel } from './get-battery-level'; -export { getChat } from './get-chat'; -export { getChatById } from './get-chat-by-id'; -export { getChatByName } from './get-chat-by-name'; -export { getAllChatsWithNewMessages } from './get-chats-with-new-messages'; -export { getCommonGroups } from './get-common-groups'; -export { getContact } from './get-contact'; -export { getGroupMetadata } from './get-group-metadata'; -export { getGroupParticipantIDs } from './get-group-participant-ids'; -export { _getGroupParticipants } from './get-group-participants'; -export { getHost } from './get-host'; -export { getWid } from './get-wid'; -export { getMe } from './get-me'; -export { getMyContacts } from './get-my-contacts'; -export { getNewId } from './get-new-id'; -export { getNumberProfile } from './get-number-profile'; -export { getUnreadMessages } from './get-unread-messages'; -export { getUnreadMessagesInChat } from './get-unread-messages-in-chat'; -export { hasUndreadMessages } from './has-unread-messages'; -export { isConnected } from './is-connected'; -export { isLoggedIn } from './is-logged-in'; -export { - asyncLoadAllEarlierMessages, - loadAllEarlierMessages, -} from './load-all-earlier-chat-messages'; -export { loadAndGetAllMessagesInChat } from './load-and-get-all-messages-in-chat'; -export { loadChatEarlierMessages } from './load-earlier-chat-messages'; -export { loadEarlierMessagesTillDate } from './load-earlier-messages-til-date'; -export { processFiles } from './process-files'; -export { processMessageObj } from './process-message-object'; -export { sendChatstate } from './send-chat-state'; -export { sendFile } from './send-file'; -export { sendImage } from './send-image'; -export { sendPtt } from './send-ptt'; -export { sendImageWithProduct } from './send-image-with-product'; -export { sendLocation } from './send-location'; -export { sendMessage } from './send-message'; -export { sendMessageOptions } from './sendMessageOptions'; -export { sendMessageWithTags } from './send-message-with-tags'; -export { sendMessageWithThumb } from './send-message-with-thumb'; -export { sendMessage2 } from './send-message2'; -export { sendVideoAsGif } from './send-video-as-gif'; -export { setMyName } from './set-my-name'; -export { forwardMessages } from './forward-messages'; -export { getMessageById } from './get-message-by-id'; -export { getMessages } from './get-messages'; -export { setTheme, getTheme } from './theme'; -export { sendLinkPreview } from './send-link-preview'; -export { sendExist, scope, getchatId } from './check-send-exist'; -export { setProfilePic } from './set-profile-pic'; -export { pinChat } from './fix-chat'; -export { getSessionTokenBrowser } from './get-session-token'; -export { sendMute } from './send-mute'; -export { createProduct } from './create-product'; -export { getListMute, interfaceMute } from './get-list-mute'; -export * from './phoneWatchdog'; -export * from './presence'; -export * from './set-online-presence'; -export * from './set-temporary-messages'; -export * from './star-messages'; diff --git a/src/lib/wapi/functions/is-connected.js b/src/lib/wapi/functions/is-connected.js deleted file mode 100644 index 1fb9ca91b..000000000 --- a/src/lib/wapi/functions/is-connected.js +++ /dev/null @@ -1,27 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export function isConnected(done) { - // Phone Disconnected icon appears when phone - const isConnected = - document.querySelector('[data-testid="alert-phone"]') == null && - document.querySelector('[data-testid="alert-computer"]') == null - ? true - : false; - if (done !== undefined) done(isConnected); - return isConnected; -} diff --git a/src/lib/wapi/functions/is-logged-in.js b/src/lib/wapi/functions/is-logged-in.js deleted file mode 100644 index 85f069bbb..000000000 --- a/src/lib/wapi/functions/is-logged-in.js +++ /dev/null @@ -1,26 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export function isLoggedIn(done) { - // Contact always exists when logged in - const isLogged = - WPP.whatsapp.ContactStore && - WPP.whatsapp.ContactStore.checksum !== undefined; - - if (done !== undefined) done(isLogged); - return isLogged; -} diff --git a/src/lib/wapi/functions/load-all-earlier-chat-messages.js b/src/lib/wapi/functions/load-all-earlier-chat-messages.js deleted file mode 100644 index 4b136ed72..000000000 --- a/src/lib/wapi/functions/load-all-earlier-chat-messages.js +++ /dev/null @@ -1,51 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export async function loadAllEarlierMessages(id, done) { - const chat = WAPI.getChat(id); - - if (!chat) { - done && done(false); - return false; - } - - // improve load speed - try { - await WPP.whatsapp.MsgStore.findQuery({ - remote: chat.id, - count: -1, - }); - } catch (error) {} - - while (!chat.msgs.msgLoadState.noEarlierMsgs) { - await chat.loadEarlierMsgs(); - } - - done && done(true); - return true; -} - -/** - * SYNC version - * Loads all earlier messages of given chat id - * @param {string} id Chat id - * @param {Funciton} done Optional callback - */ -export function asyncLoadAllEarlierMessages(id, done) { - loadAllEarlierMessages(id); - done(); -} diff --git a/src/lib/wapi/functions/load-and-get-all-messages-in-chat.js b/src/lib/wapi/functions/load-and-get-all-messages-in-chat.js deleted file mode 100644 index 958bc3546..000000000 --- a/src/lib/wapi/functions/load-and-get-all-messages-in-chat.js +++ /dev/null @@ -1,54 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export async function loadAndGetAllMessagesInChat( - id, - includeMe, - includeNotifications, - done -) { - return WAPI.loadAllEarlierMessages(id).then((_) => { - const chat = WAPI.getChat(id); - - if (!chat) { - throw { - error: true, - code: 'chat_not_found', - message: 'Chat not found', - }; - } - - let output = []; - const messages = chat.msgs.getModelsArray(); - - for (const i in messages) { - if (i === 'remove') { - continue; - } - const messageObj = messages[i]; - - let message = WAPI.processMessageObj( - messageObj, - includeMe, - includeNotifications - ); - if (message) output.push(message); - } - if (done !== undefined) done(output); - return output; - }); -} diff --git a/src/lib/wapi/functions/load-earlier-chat-messages.js b/src/lib/wapi/functions/load-earlier-chat-messages.js deleted file mode 100644 index 7248967dc..000000000 --- a/src/lib/wapi/functions/load-earlier-chat-messages.js +++ /dev/null @@ -1,26 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export async function loadChatEarlierMessages(id) { - const chat = WAPI.getChat(id); - if (chat) { - const someEarlierMessages = await chat.loadEarlierMsgs(); - if (someEarlierMessages) - return someEarlierMessages.map(WAPI._serializeMessageObj); - } - return false; -} diff --git a/src/lib/wapi/functions/load-earlier-messages-til-date.js b/src/lib/wapi/functions/load-earlier-messages-til-date.js deleted file mode 100644 index c0933f46f..000000000 --- a/src/lib/wapi/functions/load-earlier-messages-til-date.js +++ /dev/null @@ -1,31 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export function loadEarlierMessagesTillDate(id, lastMessage, done) { - const found = WAPI.getChat(id); - const x = function () { - if ( - found.msgs.getModelsArray()[0].t > lastMessage && - !found.msgs.msgLoadState.noEarlierMsgs - ) { - found.loadEarlierMsgs().then(x); - } else { - done(); - } - }; - x(); -} diff --git a/src/lib/wapi/functions/phoneWatchdog.js b/src/lib/wapi/functions/phoneWatchdog.js deleted file mode 100644 index ec2a06c51..000000000 --- a/src/lib/wapi/functions/phoneWatchdog.js +++ /dev/null @@ -1,60 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -let timer = null; -let pong = true; - -async function sendPing() { - // Check only if the interface is in CHAT and not disconnected - if ( - WPP.whatsapp.Stream.mode !== 'MAIN' || - WPP.whatsapp.Socket.state === 'TIMEOUT' - ) { - return; - } - - // Start phoneWatchdog if ping fails - if (!pong) { - WPP.whatsapp.Socket.phoneWatchdog.activate(); - WPP.whatsapp.Socket.phoneWatchdog.poke(250); - return; - } - - // Reset ping state - pong = false; - - // Send a ping request - return WPP.whatsapp.Socket.sendBasic({ - tag: WPP.whatsapp.Socket.tag('ping'), - data: ['admin', 'test'], - }).then(() => { - pong = true; - }); -} - -export function startPhoneWatchdog(interval = 15000) { - stopPhoneWatchdog(); - - timer = setInterval(sendPing, interval); -} - -export function stopPhoneWatchdog() { - if (timer) { - clearInterval(timer); - } - timer = null; -} diff --git a/src/lib/wapi/functions/presence.js b/src/lib/wapi/functions/presence.js deleted file mode 100644 index e8f54ad7a..000000000 --- a/src/lib/wapi/functions/presence.js +++ /dev/null @@ -1,49 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ -export async function subscribePresence(ids) { - if (!Array.isArray(ids)) { - ids = [ids]; - } - - let count = 0; - for (const id of ids) { - const wid = new WPP.whatsapp.WidFactory.createWid(id); - if (Store.Presence.get(wid)) { - continue; - } - await Store.Presence.find(wid); - count++; - } - return count; -} - -export async function unsubscribePresence(ids) { - if (!Array.isArray(ids)) { - ids = [ids]; - } - let count = 0; - for (const id of ids) { - const wid = new WPP.whatsapp.WidFactory.createWid(id); - const presence = Store.Presence.get(wid); - if (!presence) { - continue; - } - presence.delete(); - count++; - } - return count; -} diff --git a/src/lib/wapi/functions/process-files.js b/src/lib/wapi/functions/process-files.js deleted file mode 100644 index f01354ca9..000000000 --- a/src/lib/wapi/functions/process-files.js +++ /dev/null @@ -1,38 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export async function processFiles(chat, blobs) { - if (!Array.isArray(blobs)) { - blobs = [blobs]; - } - const mediaCollection = new Store.MediaCollection({ - chatParticipantCount: chat.getParticipantCount(), - }); - - await mediaCollection.processAttachments( - Debug.VERSION === '0.4.613' - ? blobs - : blobs.map((blob) => { - return { - file: blob, - }; - }), - chat, - 1 - ); - return mediaCollection; -} diff --git a/src/lib/wapi/functions/process-message-object.js b/src/lib/wapi/functions/process-message-object.js deleted file mode 100644 index d493f97e1..000000000 --- a/src/lib/wapi/functions/process-message-object.js +++ /dev/null @@ -1,28 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export function processMessageObj(messageObj, includeMe, includeNotifications) { - if (messageObj.isNotification) { - if (includeNotifications) return WAPI._serializeMessageObj(messageObj); - else return; - // System message - // (i.e. "Messages you send to this chat and calls are now secured with end-to-end encryption...") - } else if (messageObj.id.fromMe === false || includeMe) { - return WAPI._serializeMessageObj(messageObj); - } - return; -} diff --git a/src/lib/wapi/functions/send-chat-state.js b/src/lib/wapi/functions/send-chat-state.js deleted file mode 100644 index d2f029979..000000000 --- a/src/lib/wapi/functions/send-chat-state.js +++ /dev/null @@ -1,46 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export async function sendChatstate(state, chatId) { - state = parseInt(state, 10); - - const chat = WPP.whatsapp.ChatStore.get(chatId); - - if (!chat) { - throw { - error: true, - code: 'chat_not_found', - message: 'Chat not found', - }; - } - - switch (state) { - case 0: - window.Store.ChatStates.sendChatStateComposing(chat.id); - break; - case 1: - window.Store.ChatStates.sendChatStateRecording(chat.id); - break; - case 2: - window.Store.ChatStates.sendChatStatePaused(chat.id); - break; - default: - return false; - } - - return true; -} diff --git a/src/lib/wapi/functions/send-file.js b/src/lib/wapi/functions/send-file.js deleted file mode 100644 index dcd082393..000000000 --- a/src/lib/wapi/functions/send-file.js +++ /dev/null @@ -1,75 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -import { processFiles } from './process-files'; -import { base64ToFile } from '../helper'; -import { getMessageById } from './get-message-by-id'; - -export async function sendFile( - imgBase64, - chatid, - filename, - caption, - type, - quotedMessageId = null, - isViewOnce = false -) { - type = type ? type : 'sendFile'; - - if ( - (typeof filename != 'string' && filename != null) || - (typeof caption != 'string' && caption != null) - ) { - var text = 'incorrect parameter, insert an string.'; - return WAPI.scope(chatid, true, null, text); - } - var mime = imgBase64.match(/data:([a-zA-Z0-9]+\/[a-zA-Z0-9-.+]+).*,.*/); - if (mime && mime.length) { - mime = mime[1]; - } - var chat = await WAPI.sendExist(chatid); - if (!chat.erro) { - let quotedMsg = null; - - if (typeof quotedMessageId === 'string' && quotedMessageId) { - const message = await getMessageById(quotedMessageId, null, false); - - if (message && message.canReply()) { - quotedMsg = message; - } - } - - var mediaBlob = base64ToFile(imgBase64, filename); - var mediaCollection = await processFiles(chat, mediaBlob); - var media = mediaCollection.getModelsArray()[0]; - var result = - (await media.sendToChat(chat, { caption, quotedMsg, isViewOnce })) || ''; - var m = { type: type, filename: filename, text: caption, mimeType: mime }; - var to = await WAPI.getchatId(chat.id); - if (result === 'success' || result === 'OK') { - var obj = WAPI.scope(to, false, result, null); - Object.assign(obj, m); - return obj; - } else { - var obj = WAPI.scope(to, true, result, null); - Object.assign(obj, m); - return obj; - } - } else { - return chat; - } -} diff --git a/src/lib/wapi/functions/send-image-with-product.js b/src/lib/wapi/functions/send-image-with-product.js deleted file mode 100644 index f1e2753cb..000000000 --- a/src/lib/wapi/functions/send-image-with-product.js +++ /dev/null @@ -1,75 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -import { processFiles } from './process-files'; -import { base64ToFile } from '../helper'; - -/** - * Sends product with product image to given chat id - * @param {string} imgBase64 Base64 image data - * @param {string} chatid Chat id - * @param {string} caption Caption - * @param {string} bizNumber string the @c.us number of the business account from which you want to grab the product - * @param {string} productId string the id of the product within the main catalog of the aforementioned business - * @param {Function} done Optional callback - */ -export function sendImageWithProduct( - imgBase64, - chatid, - caption, - bizNumber, - productId, - done -) { - WPP.whatsapp.CatalogStore.findCarouselCatalog(bizNumber).then((cat) => { - if (cat && cat[0]) { - const product = cat[0].productCollection.get(productId); - const temp = { - productMsgOptions: { - businessOwnerJid: product.catalogWid.toString({ - legacy: !0, - }), - productId: product.id.toString(), - url: product.url, - productImageCount: product.productImageCollection.length, - title: product.name, - description: product.description, - currencyCode: product.currency, - priceAmount1000: product.priceAmount1000, - type: 'product', - }, - caption, - }; - - var idUser = new WPP.whatsapp.WidFactory.createWid(chatid); - - return WPP.chat.find(idUser).then((chat) => { - var mediaBlob = base64ToFile(imgBase64, product.name); - // var mc = new Store.MediaCollection(chat); - // mc.processFiles([mediaBlob], chat, 1) - processFiles(chat, mediaBlob).then((mc) => { - var media = mc.getModelsArray()[0]; - Object.entries(temp.productMsgOptions).map( - ([k, v]) => (media.mediaPrep._mediaData[k] = v) - ); - media.mediaPrep.sendToChat(chat, temp); - if (done !== undefined) done(true); - }); - }); - } - }); -} diff --git a/src/lib/wapi/functions/send-image.js b/src/lib/wapi/functions/send-image.js deleted file mode 100644 index e37e9b934..000000000 --- a/src/lib/wapi/functions/send-image.js +++ /dev/null @@ -1,47 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -import { sendFile } from './send-file'; - -/** - * Sends image to given chat if - * @param {string} imgBase64 base64 encoded file - * @param {string} chatid Chat id - * @param {string} filename - * @param {string} caption - * @param {string} quotedMessageId Quoted message id - * @param {boolean} isViewOnce Enable single view - * @param {Function} done Optional callback - */ -export function sendImage( - imgBase64, - chatid, - filename, - caption, - quotedMessageId, - isViewOnce -) { - return sendFile( - imgBase64, - chatid, - filename, - caption, - 'sendImage', - quotedMessageId, - isViewOnce - ); -} diff --git a/src/lib/wapi/functions/send-link-preview.js b/src/lib/wapi/functions/send-link-preview.js deleted file mode 100644 index 5c8e60098..000000000 --- a/src/lib/wapi/functions/send-link-preview.js +++ /dev/null @@ -1,68 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export async function sendLinkPreview(chatId, url, text) { - text = text || ''; - const _Path = { - Protocol: '^(https?:\\/\\/)?', - Domain: '((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|', - IP: '((\\d{1,3}\\.){3}\\d{1,3}))', - Port: '(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*', - Query: '(\\?[;&a-z\\d%_.~+=-]*)?', - End: '(\\#[-a-z\\d_]*)?$', - Reg: () => { - return new RegExp( - _Path.Protocol + - _Path.Domain + - _Path.IP + - _Path.Port + - _Path.Query + - _Path.End, - 'i' - ); - }, - }; - if (!_Path.Reg().test(url)) { - var text = - 'Use a valid HTTP protocol. Example: https://www.youtube.com/watch?v=V1bFr2SWP1'; - return WAPI.scope(chatId, true, null, text); - } - var chat = await WAPI.sendExist(chatId); - if (!chat.erro) { - // There are no support for link preview with MD - const linkPreview = WPP.conn.isMultiDevice() - ? undefined - : await WPP.whatsapp.functions.queryLinkPreview(url); - var result = - (await chat.sendMessage(text.includes(url) ? text : `${url}\n${text}`, { - linkPreview, - })) || ''; - var m = { type: 'LinkPreview', url: url, text: text }, - To = await WAPI.getchatId(chat.id); - if (result === 'success' || result === 'OK') { - var obj = WAPI.scope(To, false, result, null); - Object.assign(obj, m); - return obj; - } else { - var obj = WAPI.scope(To, true, result, null); - Object.assign(obj, m); - return obj; - } - } else { - return chat; - } -} diff --git a/src/lib/wapi/functions/send-location.js b/src/lib/wapi/functions/send-location.js deleted file mode 100644 index e8605dae4..000000000 --- a/src/lib/wapi/functions/send-location.js +++ /dev/null @@ -1,70 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export async function sendLocation( - chatId, - latitude, - longitude, - location = null -) { - var chat = await WAPI.sendExist(chatId); - - if (!chat.erro) { - var newId = WPP.chat.generateMessageID(chat.id); - - var message = { - ack: 0, - id: newId, - local: true, - self: 'out', - t: parseInt(new Date().getTime() / 1000), - from: WPP.whatsapp.UserPrefs.getMaybeMeUser(), - to: chat.id, - isNewMsg: true, - type: 'location', - lat: latitude, - lng: longitude, - loc: location, - }; - - var result = - ( - await Promise.all( - WPP.whatsapp.functions.addAndSendMsgToChat(chat, message) - ) - )[1] || ''; - var m = { - latitude: latitude, - longitude: longitude, - title: location, - type: 'location', - }, - obj, - To = await WAPI.getchatId(chat.id); - if (result == 'success' || result == 'OK') { - obj = WAPI.scope(To, false, result, null); - Object.assign(obj, m); - return obj; - } else { - obj = WAPI.scope(To, true, result, null); - Object.assign(obj, m); - return obj; - } - } else { - return chat; - } -} diff --git a/src/lib/wapi/functions/send-message-with-tags.js b/src/lib/wapi/functions/send-message-with-tags.js deleted file mode 100644 index f2f8ee11f..000000000 --- a/src/lib/wapi/functions/send-message-with-tags.js +++ /dev/null @@ -1,52 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export async function sendMessageWithTags(to, body) { - var chat = to.id ? to : WPP.whatsapp.ChatStore.get(to); - var chatId = chat.id._serialized; - var msgIveSent = chat.msgs.filter((msg) => msg.__x_isSentByMe)[0]; - if (!msgIveSent) { - return chat.sendMessage(body); - } - - var tempMsg = Object.create(msgIveSent); - var newId = WPP.chat.generateMessageID(chatId); - var mentionedJidList = - body - .match(/@(\d*)/g) - .map( - (x) => new WPP.whatsapp.WidFactory.createUserWid(x.replace('@', '')) - ) || undefined; - - var extend = { - ack: 0, - id: newId, - local: !0, - self: 'out', - t: parseInt(new Date().getTime() / 1000), - to: new WPP.whatsapp.WidFactory.createWid(chatId), - isNewMsg: !0, - type: 'chat', - body, - quotedMsg: null, - mentionedJidList, - }; - - Object.assign(tempMsg, extend); - await WPP.whatsapp.functions.addAndSendMsgToChat(chat, tempMsg); - return newId._serialized; -} diff --git a/src/lib/wapi/functions/send-message-with-thumb.js b/src/lib/wapi/functions/send-message-with-thumb.js deleted file mode 100644 index cb6aaf0b3..000000000 --- a/src/lib/wapi/functions/send-message-with-thumb.js +++ /dev/null @@ -1,46 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export function sendMessageWithThumb( - thumb, - url, - title, - description, - chatId, - done -) { - var chatSend = WAPI.getChat(chatId); - if (chatSend === undefined) { - if (done !== undefined) done(false); - return false; - } - var linkPreview = { - canonicalUrl: url, - description: description, - matchedText: url, - title: title, - thumbnail: thumb, - }; - chatSend.sendMessage(url, { - linkPreview: linkPreview, - mentionedJidList: [], - quotedMsg: null, - quotedMsgAdminGroupJid: null, - }); - if (done !== undefined) done(true); - return true; -} diff --git a/src/lib/wapi/functions/send-message.js b/src/lib/wapi/functions/send-message.js deleted file mode 100644 index 0f67eb082..000000000 --- a/src/lib/wapi/functions/send-message.js +++ /dev/null @@ -1,59 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export async function sendMessage(to, content) { - const chat = await WAPI.sendExist(to); - - if (!chat.erro) { - var newId = WPP.chat.generateMessageID(chat.id); - - var message = { - id: newId, - body: content, - type: 'chat', - subtype: null, - t: parseInt(new Date().getTime() / 1000), - from: WPP.whatsapp.UserPrefs.getMaybeMeUser(), - to: chat.id, - self: 'out', - isNewMsg: true, - local: true, - ack: 0, - urlText: null, - urlNumber: null, - }; - - var result = - ( - await Promise.all( - WPP.whatsapp.functions.addAndSendMsgToChat(chat, message) - ) - )[1] || ''; - - if (result === 'success' || result === 'OK') { - return newId?._serialized; - } else { - const m = { type: 'sendtext', text: message }; - const To = await WAPI.getchatId(chat.id); - const obj = WAPI.scope(To, true, result, null); - Object.assign(obj, m); - return obj; - } - } else { - return chat; - } -} diff --git a/src/lib/wapi/functions/send-message2.js b/src/lib/wapi/functions/send-message2.js deleted file mode 100644 index c4f13893a..000000000 --- a/src/lib/wapi/functions/send-message2.js +++ /dev/null @@ -1,37 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export function sendMessage2(id, message, done) { - var chat = WAPI.getChat(id); - if (chat !== undefined) { - try { - if (done !== undefined) { - chat.sendMessage(message).then(function () { - done(true); - }); - } else { - chat.sendMessage(message); - } - return true; - } catch (error) { - if (done !== undefined) done(false); - return false; - } - } - if (done !== undefined) done(false); - return false; -} diff --git a/src/lib/wapi/functions/send-mute.js b/src/lib/wapi/functions/send-mute.js deleted file mode 100644 index 69db83bc2..000000000 --- a/src/lib/wapi/functions/send-mute.js +++ /dev/null @@ -1,97 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export async function sendMute(chatId, time, type) { - var chat = await WAPI.sendExist(chatId); - if (!chat.erro) { - let TimeInt = null; - var result = null, - remove = null, - texto = null; - var To = await WAPI.getchatId(chat.id), - isMute = await window.Store.Mute.get(chat.id), - m = { type: 'sendMute', time: time, timeType: type }; - if (typeof time === 'number' && typeof type === 'string') { - switch (type) { - case 'hours': - TimeInt = parseInt( - new Date( - new Date().setHours(new Date().getHours() + time) - ).getTime() / 1000 - ); - break; - case 'minutes': - TimeInt = parseInt( - new Date( - new Date().setMinutes(new Date().getMinutes() + time) - ).getTime() / 1000 - ); - break; - case 'year': - TimeInt = parseInt( - new Date( - new Date().setDate(new Date().getDate() + time) - ).getTime() / 1000 - ); - break; - } - await window.Store.SendMute.sendConversationMute(chat.id, TimeInt, 0) - .then((e) => { - result = e; - }) - .catch((e) => { - result = e; - }); - } else { - remove = true; - await window.Store.SendMute.sendConversationMute( - chat.id, - 0, - isMute.__x_expiration - ) - .then((e) => { - result = e; - }) - .catch((e) => { - result = e; - }); - } - if (result.status === 200) { - if (remove) { - isMute.__x_expiration = 0; - isMute.__x_isMuted = false; - } else { - isMute.__x_expiration = TimeInt; - isMute.__x_isMuted = true; - } - var obj = WAPI.scope(To, false, result.status, null); - Object.assign(obj, m); - return obj; - } else { - if (remove) { - texto = 'is not mute to remove'; - } else { - texto = 'This chat is already mute'; - } - var obj = WAPI.scope(To, true, result['status'], texto); - Object.assign(obj, m); - return obj; - } - } else { - return chat; - } -} diff --git a/src/lib/wapi/functions/send-ptt.js b/src/lib/wapi/functions/send-ptt.js deleted file mode 100644 index e91018877..000000000 --- a/src/lib/wapi/functions/send-ptt.js +++ /dev/null @@ -1,79 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -import { processFiles } from './process-files'; -import { base64ToFile } from '../helper'; -import { getMessageById } from './get-message-by-id'; - -/** - * Sends image to given chat if - * @param {string} imgBase64 base64 encoded file - * @param {string} chatid Chat id - * @param {string} filename - * @param {string} caption - * @param {Function} done Optional callback - * @param {string} quotedMessageId Quoted message id - */ -export async function sendPtt( - imgBase64, - chatid, - filename, - caption, - done, - quotedMessageId = null -) { - var chat = await WAPI.sendExist(chatid); - - if (!chat.erro) { - let quotedMsg = null; - - if (typeof quotedMessageId === 'string' && quotedMessageId) { - const message = await getMessageById(quotedMessageId, null, false); - - if (message && message.canReply()) { - quotedMsg = message; - } - } - - var mediaBlob = base64ToFile(imgBase64, filename); - var mediaCollection = await processFiles(chat, mediaBlob); - var media = mediaCollection.getModelsArray()[0]; - media.mediaPrep._mediaData.type = 'ptt'; - - var result = (await media.sendToChat(chat, { caption, quotedMsg })) || ''; - - if (done !== undefined) done(true); - - var m = { - type: 'ptt', - filename: filename, - text: caption, - }; - var to = await WAPI.getchatId(chat.id); - if (result === 'success' || result === 'OK') { - var obj = WAPI.scope(to, false, result, null); - Object.assign(obj, m); - return obj; - } else { - var obj = WAPI.scope(to, true, result, null); - Object.assign(obj, m); - return obj; - } - } else { - return chat; - } -} diff --git a/src/lib/wapi/functions/send-video-as-gif.js b/src/lib/wapi/functions/send-video-as-gif.js deleted file mode 100644 index 1afd62880..000000000 --- a/src/lib/wapi/functions/send-video-as-gif.js +++ /dev/null @@ -1,61 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -import { processFiles } from './process-files'; -import { base64ToFile } from '../helper'; - -/** - * Sends video as a gif to given chat id - * @param {string} dataBase64 - * @param {string} chatid - * @param {string} filename - * @param {string} caption - * @param {Function} done Optional callback - */ -export async function sendVideoAsGif( - dataBase64, - chatid, - filename, - caption, - done -) { - var chat = await WAPI.sendExist(chatid); - if (!chat.erro) { - var mediaBlob = base64ToFile(dataBase64, filename); - var mediaCollection = await processFiles(chat, mediaBlob); - var media = mediaCollection.getModelsArray()[0]; - media.mediaPrep._mediaData.isGif = true; - media.mediaPrep._mediaData.gifAttribution = 1; - - var result = (await media.sendToChat(chat, { caption: caption })) || ''; - var m = { filename: filename, text: caption }, - To = await WAPI.getchatId(chat.id); - if (result === 'success' || result === 'OK') { - if (done !== undefined) done(false); - var obj = WAPI.scope(To, false, result, null); - Object.assign(obj, m); - return obj; - } else { - if (done !== undefined) done(true); - var obj = WAPI.scope(To, true, result, null); - Object.assign(obj, m); - return obj; - } - } else { - return chat; - } -} diff --git a/src/lib/wapi/functions/sendMessageOptions.js b/src/lib/wapi/functions/sendMessageOptions.js deleted file mode 100644 index 45b2df31a..000000000 --- a/src/lib/wapi/functions/sendMessageOptions.js +++ /dev/null @@ -1,145 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -import { getMessageById } from './get-message-by-id'; - -/** - * Send message with options - * @param {string} chatid the numberid xxx@c.us - * @param {string} content the message - * @param {string} options object aditionais - */ -export async function sendMessageOptions(chatId, content, options = {}) { - const chat = WPP.chat.get(chatId) || (await WPP.chat.find(chatId)); - - let attOptions = {}; - if (options.attachment) { - attOptions = await WWebJS.processMediaData( - options.attachment, - options.sendAudioAsVoice - ); - content = attOptions.preview; - delete options.attachment; - } - - let quotedMsgOptions = {}; - if (options.quotedMessageId) { - let quotedMessage = await getMessageById( - options.quotedMessageId, - null, - false - ); - if (quotedMessage && quotedMessage.canReply()) { - quotedMsgOptions = quotedMessage.msgContextInfo(chat); - } - delete options.quotedMessageId; - } - - if (options.mentionedJidList) { - options.mentionedJidList = options.mentionedJidList.map( - (cId) => WPP.whatsapp.ContactStore.get(cId).id - ); - } - - let locationOptions = {}; - if (options.location) { - locationOptions = { - type: 'location', - loc: options.location.description, - lat: options.location.latitude, - lng: options.location.longitude, - }; - delete options.location; - } - - let vcardOptions = {}; - if (options.contactCard) { - let contact = WPP.whatsapp.ContactStore.get(options.contactCard); - vcardOptions = { - body: WPP.whatsapp.VCard.vcardFromContactModel(contact).vcard, - type: 'vcard', - vcardFormattedName: contact.formattedName, - }; - delete options.contactCard; - } else if (options.contactCardList) { - let contacts = options.contactCardList.map((c) => - WPP.whatsapp.ContactStore.get(c) - ); - let vcards = contacts.map((c) => - WPP.whatsapp.VCard.vcardFromContactModel(c) - ); - vcardOptions = { - type: 'multi_vcard', - vcardList: vcards, - body: undefined, - }; - delete options.contactCardList; - } else if ( - options.parseVCards && - typeof content === 'string' && - content.startsWith('BEGIN:VCARD') - ) { - delete options.parseVCards; - try { - const parsed = await WPP.whatsapp.VCard.parseVcard(content); - if (parsed) { - vcardOptions = { - type: 'vcard', - vcardFormattedName: await WPP.whatsapp.VCard.vcardGetNameFromParsed( - parsed - ), - }; - } - } catch (_) { - // not a vcard - } - } - - if (options.linkPreview) { - delete options.linkPreview; - const link = await window.Store.Validators.findLink(content); - if (link && !WPP.conn.isMultiDevice()) { - const preview = await WPP.whatsapp.functions.queryLinkPreview(link.url); - preview.preview = true; - preview.subtype = 'url'; - options = { ...options, ...preview }; - } - } - const newMsgId = WPP.chat.generateMessageID(chat.id); - const fromwWid = WPP.whatsapp.UserPrefs.getMaybeMeUser(); - const message = { - id: newMsgId, - ack: 0, - body: content, - from: fromwWid, - to: chat.id, - local: !0, - self: 'out', - t: parseInt(new Date().getTime() / 1000), - isNewMsg: !0, - type: 'chat', - ...options, - ...locationOptions, - ...attOptions, - ...quotedMsgOptions, - ...vcardOptions, - }; - - await WPP.whatsapp.functions.addAndSendMsgToChat(chat, message); - - return newMsgId._serialized; -} diff --git a/src/lib/wapi/functions/set-my-name.js b/src/lib/wapi/functions/set-my-name.js deleted file mode 100644 index c17a9a5ca..000000000 --- a/src/lib/wapi/functions/set-my-name.js +++ /dev/null @@ -1,20 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export async function setMyName(name) { - await window.Store.Perfil.setPushname(name); -} diff --git a/src/lib/wapi/functions/set-online-presence.js b/src/lib/wapi/functions/set-online-presence.js deleted file mode 100644 index c12ea2774..000000000 --- a/src/lib/wapi/functions/set-online-presence.js +++ /dev/null @@ -1,28 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export async function setOnlinePresence(online) { - if (typeof online === 'undefined') { - online = true; - } - - if (online) { - await WPP.whatsapp.ChatPresence.sendPresenceAvailable(); - } else { - await WPP.whatsapp.ChatPresence.sendPresenceUnavailable(); - } -} diff --git a/src/lib/wapi/functions/set-profile-pic.js b/src/lib/wapi/functions/set-profile-pic.js deleted file mode 100644 index f7648dcd2..000000000 --- a/src/lib/wapi/functions/set-profile-pic.js +++ /dev/null @@ -1,29 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ -export async function setProfilePic(obj, id) { - if (!id) { - id = WPP.whatsapp.UserPrefs.getMaybeMeUser(); - } - const wid = WPP.whatsapp.WidFactory.createWid(id); - - let base64 = 'data:image/jpeg;base64,'; - return await WPP.whatsapp.functions.sendSetPicture( - wid, - base64 + obj.b, - base64 + obj.a - ); -} diff --git a/src/lib/wapi/functions/set-temporary-messages.js b/src/lib/wapi/functions/set-temporary-messages.js deleted file mode 100644 index d991a004e..000000000 --- a/src/lib/wapi/functions/set-temporary-messages.js +++ /dev/null @@ -1,43 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export async function setTemporaryMessages(chatId, value) { - const chat = WPP.whatsapp.ChatStore.get(chatId); - - if (!chat) { - throw { - error: true, - code: 'chat_not_found', - message: 'Chat not found', - }; - } - if (chat.isGroup) { - return await WPP.group.setProperty(chat.id, 'ephemeral', value); - } - - value = value ? 604800 : 0; - - await Store.changeEphemeralDuration(chat, value).catch((e) => { - throw { - error: true, - code: e.code || e.status || e.statusCode || 'unknown', - message: e.message || e.reason || 'Unknown Error', - }; - }); - - return true; -} diff --git a/src/lib/wapi/functions/star-messages.js b/src/lib/wapi/functions/star-messages.js deleted file mode 100644 index 3956feb99..000000000 --- a/src/lib/wapi/functions/star-messages.js +++ /dev/null @@ -1,57 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -import { getMessageById } from './get-message-by-id'; - -export async function starMessages(messagesId, star) { - if (typeof star === 'undefined') { - star = true; - } - - if (!Array.isArray(messagesId)) { - messagesId = [messagesId]; - } - - let messagesToStar = await Promise.all( - messagesId.map(async (msgId) => await getMessageById(msgId, null, false)) - ); - - // Ignore unchanged messages - messagesToStar = messagesToStar.filter((msg) => msg && msg.star !== star); - - // group by chat - const messagesPerChat = messagesToStar.reduce(function (r, msg) { - const id = msg.id.remote._serialized; - r[id] = r[id] || []; - r[id].push(msg); - return r; - }, Object.create(null)); - - let count = 0; - // Star Messages - for (const chatId in messagesPerChat) { - const chat = WPP.whatsapp.ChatStore.get(chatId); - const messages = messagesPerChat[chatId]; - - count += await chat - .sendStarMsgs(messages, star) - .then(() => messages.length) - .catch(() => 0); - } - - return count; -} diff --git a/src/lib/wapi/functions/theme.js b/src/lib/wapi/functions/theme.js deleted file mode 100644 index cad9b6be6..000000000 --- a/src/lib/wapi/functions/theme.js +++ /dev/null @@ -1,29 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export async function setTheme(type) { - if (type == 'dark' || type == 'light') { - await Store.Theme.setTheme(type); - return true; - } else { - return console.error('Use type dark or light'); - } -} - -export async function getTheme() { - return await Store.Theme.getTheme(); -} diff --git a/src/lib/wapi/globals.d.ts b/src/lib/wapi/globals.d.ts deleted file mode 100644 index 6dd6a64da..000000000 --- a/src/lib/wapi/globals.d.ts +++ /dev/null @@ -1,31 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -import type * as wajs from '@wppconnect/wa-js'; - -declare global { - interface Window { - WPP: typeof wajs; - } - const WPP: typeof wajs; -} - -declare global { - interface Window { - Store: any; - } -} diff --git a/src/lib/wapi/helper/array-buffer-to-base64.js b/src/lib/wapi/helper/array-buffer-to-base64.js deleted file mode 100644 index 53553f9e1..000000000 --- a/src/lib/wapi/helper/array-buffer-to-base64.js +++ /dev/null @@ -1,68 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export function arrayBufferToBase64(arrayBuffer) { - var base64 = ''; - var encodings = - 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; - - var bytes = new Uint8Array(arrayBuffer); - var byteLength = bytes.byteLength; - var byteRemainder = byteLength % 3; - var mainLength = byteLength - byteRemainder; - - var a, b, c, d; - var chunk; - - // Main loop deals with bytes in chunks of 3 - for (var i = 0; i < mainLength; i = i + 3) { - // Combine the three bytes into a single integer - chunk = (bytes[i] << 16) | (bytes[i + 1] << 8) | bytes[i + 2]; - - // Use bitmasks to extract 6-bit segments from the triplet - a = (chunk & 16515072) >> 18; // 16515072 = (2^6 - 1) << 18 - b = (chunk & 258048) >> 12; // 258048 = (2^6 - 1) << 12 - c = (chunk & 4032) >> 6; // 4032 = (2^6 - 1) << 6 - d = chunk & 63; // 63 = 2^6 - 1 - - // Convert the raw binary segments to the appropriate ASCII encoding - base64 += encodings[a] + encodings[b] + encodings[c] + encodings[d]; - } - - // Deal with the remaining bytes and padding - if (byteRemainder == 1) { - chunk = bytes[mainLength]; - - a = (chunk & 252) >> 2; // 252 = (2^6 - 1) << 2 - - // Set the 4 least significant bits to zero - b = (chunk & 3) << 4; // 3 = 2^2 - 1 - - base64 += encodings[a] + encodings[b] + '=='; - } else if (byteRemainder == 2) { - chunk = (bytes[mainLength] << 8) | bytes[mainLength + 1]; - - a = (chunk & 64512) >> 10; // 64512 = (2^6 - 1) << 10 - b = (chunk & 1008) >> 4; // 1008 = (2^6 - 1) << 4 - - // Set the 2 least significant bits to zero - c = (chunk & 15) << 2; // 15 = 2^4 - 1 - - base64 += encodings[a] + encodings[b] + encodings[c] + '='; - } - return base64; -} diff --git a/src/lib/wapi/helper/base64-to-file.js b/src/lib/wapi/helper/base64-to-file.js deleted file mode 100644 index 809942049..000000000 --- a/src/lib/wapi/helper/base64-to-file.js +++ /dev/null @@ -1,33 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ -export function base64ToFile(base64, filename) { - var arr = base64.split(','); - var mime = arr[0].match(/(?:data:)?(.*?)(?:;base64)?$/i)[1]; - mime = mime.split(/\s+;\s+/).join('; '); // Fix spaces, like "audio/ogg; codecs=opus" - - var bstr = window.Base64 ? window.Base64.atob(arr[1]) : atob(arr[1]); - var n = bstr.length; - var u8arr = new Uint8Array(n); - - while (n--) { - u8arr[n] = bstr.charCodeAt(n); - } - - return new File([u8arr], filename, { - type: mime, - }); -} diff --git a/src/lib/wapi/helper/generate-media-key.js b/src/lib/wapi/helper/generate-media-key.js deleted file mode 100644 index e2e12485e..000000000 --- a/src/lib/wapi/helper/generate-media-key.js +++ /dev/null @@ -1,26 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export function generateMediaKey(length) { - let result = ''; - let characters = - 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; - for (let i = 0; i < length; i++) { - result += characters.charAt(Math.floor(Math.random() * characters.length)); - } - return result; -} diff --git a/src/lib/wapi/helper/get-file-hash.js b/src/lib/wapi/helper/get-file-hash.js deleted file mode 100644 index 7ea5705f7..000000000 --- a/src/lib/wapi/helper/get-file-hash.js +++ /dev/null @@ -1,24 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -import * as jsSHA from '../jssha'; -export async function getFileHash(data) { - let buffer = await data.arrayBuffer(); - var sha = new jsSHA('SHA-256', 'ARRAYBUFFER'); - sha.update(buffer); - return sha.getHash('B64'); -} diff --git a/src/lib/wapi/helper/index.js b/src/lib/wapi/helper/index.js deleted file mode 100644 index c69e3c6fb..000000000 --- a/src/lib/wapi/helper/index.js +++ /dev/null @@ -1,21 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export { base64ToFile } from './base64-to-file'; -export { getFileHash } from './get-file-hash'; -export { generateMediaKey } from './generate-media-key'; -export { arrayBufferToBase64 } from './array-buffer-to-base64'; diff --git a/src/lib/wapi/helper/is-chat-message.js b/src/lib/wapi/helper/is-chat-message.js deleted file mode 100644 index 420df61b8..000000000 --- a/src/lib/wapi/helper/is-chat-message.js +++ /dev/null @@ -1,29 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export function isChatMessage(message) { - if (message.isSentByMe) { - return false; - } - if (message.isNotification) { - return false; - } - if (!message.isUserCreatedType) { - return false; - } - return true; -} diff --git a/src/lib/wapi/jsconfig.json b/src/lib/wapi/jsconfig.json deleted file mode 100644 index e9ede97e1..000000000 --- a/src/lib/wapi/jsconfig.json +++ /dev/null @@ -1,7 +0,0 @@ - -{ - "compilerOptions": { - "module": "commonjs", - "target": "es6" - } -} diff --git a/src/lib/wapi/jssha/index.js b/src/lib/wapi/jssha/index.js deleted file mode 100644 index 9bbde3196..000000000 --- a/src/lib/wapi/jssha/index.js +++ /dev/null @@ -1,1158 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -'use strict'; -(function (aa) { - function C(e, b, a) { - var k = 0, - h = [], - l = 0, - g, - m, - c, - f, - n, - q, - u, - r, - I = !1, - v = [], - x = [], - t, - y = !1, - z = !1, - w = -1; - a = a || {}; - g = a.encoding || 'UTF8'; - t = a.numRounds || 1; - if (t !== parseInt(t, 10) || 1 > t) - throw Error('numRounds must a integer >= 1'); - if ('SHA-1' === e) - (n = 512), - (q = K), - (u = ba), - (f = 160), - (r = function (b) { - return b.slice(); - }); - else if (0 === e.lastIndexOf('SHA-', 0)) - if ( - ((q = function (b, k) { - return L(b, k, e); - }), - (u = function (b, k, h, a) { - var d, f; - if ('SHA-224' === e || 'SHA-256' === e) - (d = (((k + 65) >>> 9) << 4) + 15), (f = 16); - else if ('SHA-384' === e || 'SHA-512' === e) - (d = (((k + 129) >>> 10) << 5) + 31), (f = 32); - else throw Error('Unexpected error in SHA-2 implementation'); - for (; b.length <= d; ) b.push(0); - b[k >>> 5] |= 128 << (24 - (k % 32)); - k = k + h; - b[d] = k & 4294967295; - b[d - 1] = (k / 4294967296) | 0; - h = b.length; - for (k = 0; k < h; k += f) a = L(b.slice(k, k + f), a, e); - if ('SHA-224' === e) b = [a[0], a[1], a[2], a[3], a[4], a[5], a[6]]; - else if ('SHA-256' === e) b = a; - else if ('SHA-384' === e) - b = [ - a[0].a, - a[0].b, - a[1].a, - a[1].b, - a[2].a, - a[2].b, - a[3].a, - a[3].b, - a[4].a, - a[4].b, - a[5].a, - a[5].b, - ]; - else if ('SHA-512' === e) - b = [ - a[0].a, - a[0].b, - a[1].a, - a[1].b, - a[2].a, - a[2].b, - a[3].a, - a[3].b, - a[4].a, - a[4].b, - a[5].a, - a[5].b, - a[6].a, - a[6].b, - a[7].a, - a[7].b, - ]; - else throw Error('Unexpected error in SHA-2 implementation'); - return b; - }), - (r = function (b) { - return b.slice(); - }), - 'SHA-224' === e) - ) - (n = 512), (f = 224); - else if ('SHA-256' === e) (n = 512), (f = 256); - else if ('SHA-384' === e) (n = 1024), (f = 384); - else if ('SHA-512' === e) (n = 1024), (f = 512); - else throw Error('Chosen SHA variant is not supported'); - else if ( - 0 === e.lastIndexOf('SHA3-', 0) || - 0 === e.lastIndexOf('SHAKE', 0) - ) { - var F = 6; - q = D; - r = function (b) { - var e = [], - a; - for (a = 0; 5 > a; a += 1) e[a] = b[a].slice(); - return e; - }; - w = 1; - if ('SHA3-224' === e) (n = 1152), (f = 224); - else if ('SHA3-256' === e) (n = 1088), (f = 256); - else if ('SHA3-384' === e) (n = 832), (f = 384); - else if ('SHA3-512' === e) (n = 576), (f = 512); - else if ('SHAKE128' === e) (n = 1344), (f = -1), (F = 31), (z = !0); - else if ('SHAKE256' === e) (n = 1088), (f = -1), (F = 31), (z = !0); - else throw Error('Chosen SHA variant is not supported'); - u = function (b, e, a, k, h) { - a = n; - var d = F, - f, - g = [], - l = a >>> 5, - m = 0, - c = e >>> 5; - for (f = 0; f < c && e >= a; f += l) - (k = D(b.slice(f, f + l), k)), (e -= a); - b = b.slice(f); - for (e %= a; b.length < l; ) b.push(0); - f = e >>> 3; - b[f >> 2] ^= d << ((f % 4) * 8); - b[l - 1] ^= 2147483648; - for (k = D(b, k); 32 * g.length < h; ) { - b = k[m % 5][(m / 5) | 0]; - g.push(b.b); - if (32 * g.length >= h) break; - g.push(b.a); - m += 1; - 0 === (64 * m) % a && D(null, k); - } - return g; - }; - } else throw Error('Chosen SHA variant is not supported'); - c = M(b, g, w); - m = A(e); - this.setHMACKey = function (b, a, h) { - var d; - if (!0 === I) throw Error('HMAC key already set'); - if (!0 === y) throw Error('Cannot set HMAC key after calling update'); - if (!0 === z) throw Error('SHAKE is not supported for HMAC'); - g = (h || {}).encoding || 'UTF8'; - a = M(a, g, w)(b); - b = a.binLen; - a = a.value; - d = n >>> 3; - h = d / 4 - 1; - if (d < b / 8) { - for (a = u(a, b, 0, A(e), f); a.length <= h; ) a.push(0); - a[h] &= 4294967040; - } else if (d > b / 8) { - for (; a.length <= h; ) a.push(0); - a[h] &= 4294967040; - } - for (b = 0; b <= h; b += 1) - (v[b] = a[b] ^ 909522486), (x[b] = a[b] ^ 1549556828); - m = q(v, m); - k = n; - I = !0; - }; - this.update = function (b) { - var a, - e, - d, - f = 0, - g = n >>> 5; - a = c(b, h, l); - b = a.binLen; - e = a.value; - a = b >>> 5; - for (d = 0; d < a; d += g) - f + n <= b && ((m = q(e.slice(d, d + g), m)), (f += n)); - k += f; - h = e.slice(f >>> 5); - l = b % n; - y = !0; - }; - this.getHash = function (b, a) { - var d, g, c, n; - if (!0 === I) throw Error('Cannot call getHash after setting HMAC key'); - c = N(a); - if (!0 === z) { - if (-1 === c.shakeLen) - throw Error('shakeLen must be specified in options'); - f = c.shakeLen; - } - switch (b) { - case 'HEX': - d = function (b) { - return O(b, f, w, c); - }; - break; - case 'B64': - d = function (b) { - return P(b, f, w, c); - }; - break; - case 'BYTES': - d = function (b) { - return Q(b, f, w); - }; - break; - case 'ARRAYBUFFER': - try { - g = new ArrayBuffer(0); - } catch (p) { - throw Error('ARRAYBUFFER not supported by this environment'); - } - d = function (b) { - return R(b, f, w); - }; - break; - case 'UINT8ARRAY': - try { - g = new Uint8Array(0); - } catch (p) { - throw Error('UINT8ARRAY not supported by this environment'); - } - d = function (b) { - return S(b, f, w); - }; - break; - default: - throw Error( - 'format must be HEX, B64, BYTES, ARRAYBUFFER, or UINT8ARRAY' - ); - } - n = u(h.slice(), l, k, r(m), f); - for (g = 1; g < t; g += 1) - !0 === z && - 0 !== f % 32 && - (n[n.length - 1] &= 16777215 >>> (24 - (f % 32))), - (n = u(n, f, 0, A(e), f)); - return d(n); - }; - this.getHMAC = function (b, a) { - var d, g, c, p; - if (!1 === I) - throw Error('Cannot call getHMAC without first setting HMAC key'); - c = N(a); - switch (b) { - case 'HEX': - d = function (b) { - return O(b, f, w, c); - }; - break; - case 'B64': - d = function (b) { - return P(b, f, w, c); - }; - break; - case 'BYTES': - d = function (b) { - return Q(b, f, w); - }; - break; - case 'ARRAYBUFFER': - try { - d = new ArrayBuffer(0); - } catch (v) { - throw Error('ARRAYBUFFER not supported by this environment'); - } - d = function (b) { - return R(b, f, w); - }; - break; - case 'UINT8ARRAY': - try { - d = new Uint8Array(0); - } catch (v) { - throw Error('UINT8ARRAY not supported by this environment'); - } - d = function (b) { - return S(b, f, w); - }; - break; - default: - throw Error( - 'outputFormat must be HEX, B64, BYTES, ARRAYBUFFER, or UINT8ARRAY' - ); - } - g = u(h.slice(), l, k, r(m), f); - p = q(x, A(e)); - p = u(g, f, n, p, f); - return d(p); - }; - } - function a(a, b) { - this.a = a; - this.b = b; - } - function T(a, b, d, k) { - var h, l, g, c, p; - b = b || [0]; - d = d || 0; - l = d >>> 3; - p = -1 === k ? 3 : 0; - for (h = 0; h < a.length; h += 1) - (c = h + l), - (g = c >>> 2), - b.length <= g && b.push(0), - (b[g] |= a[h] << (8 * (p + (c % 4) * k))); - return { value: b, binLen: 8 * a.length + d }; - } - function O(a, b, d, k) { - var h = ''; - b /= 8; - var l, g, c; - c = -1 === d ? 3 : 0; - for (l = 0; l < b; l += 1) - (g = a[l >>> 2] >>> (8 * (c + (l % 4) * d))), - (h += - '0123456789abcdef'.charAt((g >>> 4) & 15) + - '0123456789abcdef'.charAt(g & 15)); - return k.outputUpper ? h.toUpperCase() : h; - } - function P(a, b, d, k) { - var h = '', - l = b / 8, - g, - c, - p, - f; - f = -1 === d ? 3 : 0; - for (g = 0; g < l; g += 3) - for ( - c = g + 1 < l ? a[(g + 1) >>> 2] : 0, - p = g + 2 < l ? a[(g + 2) >>> 2] : 0, - p = - (((a[g >>> 2] >>> (8 * (f + (g % 4) * d))) & 255) << 16) | - (((c >>> (8 * (f + ((g + 1) % 4) * d))) & 255) << 8) | - ((p >>> (8 * (f + ((g + 2) % 4) * d))) & 255), - c = 0; - 4 > c; - c += 1 - ) - 8 * g + 6 * c <= b - ? (h += - 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.charAt( - (p >>> (6 * (3 - c))) & 63 - )) - : (h += k.b64Pad); - return h; - } - function Q(a, b, d) { - var k = ''; - b /= 8; - var h, c, g; - g = -1 === d ? 3 : 0; - for (h = 0; h < b; h += 1) - (c = (a[h >>> 2] >>> (8 * (g + (h % 4) * d))) & 255), - (k += String.fromCharCode(c)); - return k; - } - function R(a, b, d) { - b /= 8; - var k, - h = new ArrayBuffer(b), - c, - g; - g = new Uint8Array(h); - c = -1 === d ? 3 : 0; - for (k = 0; k < b; k += 1) - g[k] = (a[k >>> 2] >>> (8 * (c + (k % 4) * d))) & 255; - return h; - } - function S(a, b, d) { - b /= 8; - var k, - h = new Uint8Array(b), - c; - c = -1 === d ? 3 : 0; - for (k = 0; k < b; k += 1) - h[k] = (a[k >>> 2] >>> (8 * (c + (k % 4) * d))) & 255; - return h; - } - function N(a) { - var b = { outputUpper: !1, b64Pad: '=', shakeLen: -1 }; - a = a || {}; - b.outputUpper = a.outputUpper || !1; - !0 === a.hasOwnProperty('b64Pad') && (b.b64Pad = a.b64Pad); - if (!0 === a.hasOwnProperty('shakeLen')) { - if (0 !== a.shakeLen % 8) throw Error('shakeLen must be a multiple of 8'); - b.shakeLen = a.shakeLen; - } - if ('boolean' !== typeof b.outputUpper) - throw Error('Invalid outputUpper formatting option'); - if ('string' !== typeof b.b64Pad) - throw Error('Invalid b64Pad formatting option'); - return b; - } - function M(a, b, d) { - switch (b) { - case 'UTF8': - case 'UTF16BE': - case 'UTF16LE': - break; - default: - throw Error('encoding must be UTF8, UTF16BE, or UTF16LE'); - } - switch (a) { - case 'HEX': - a = function (b, a, e) { - var g = b.length, - c, - p, - f, - n, - q, - u; - if (0 !== g % 2) - throw Error('String of HEX type must be in byte increments'); - a = a || [0]; - e = e || 0; - q = e >>> 3; - u = -1 === d ? 3 : 0; - for (c = 0; c < g; c += 2) { - p = parseInt(b.substr(c, 2), 16); - if (isNaN(p)) - throw Error('String of HEX type contains invalid characters'); - n = (c >>> 1) + q; - for (f = n >>> 2; a.length <= f; ) a.push(0); - a[f] |= p << (8 * (u + (n % 4) * d)); - } - return { value: a, binLen: 4 * g + e }; - }; - break; - case 'TEXT': - a = function (a, e, c) { - var g, - m, - p = 0, - f, - n, - q, - u, - r, - t; - e = e || [0]; - c = c || 0; - q = c >>> 3; - if ('UTF8' === b) - for (t = -1 === d ? 3 : 0, f = 0; f < a.length; f += 1) - for ( - g = a.charCodeAt(f), - m = [], - 128 > g - ? m.push(g) - : 2048 > g - ? (m.push(192 | (g >>> 6)), m.push(128 | (g & 63))) - : 55296 > g || 57344 <= g - ? m.push( - 224 | (g >>> 12), - 128 | ((g >>> 6) & 63), - 128 | (g & 63) - ) - : ((f += 1), - (g = - 65536 + - (((g & 1023) << 10) | (a.charCodeAt(f) & 1023))), - m.push( - 240 | (g >>> 18), - 128 | ((g >>> 12) & 63), - 128 | ((g >>> 6) & 63), - 128 | (g & 63) - )), - n = 0; - n < m.length; - n += 1 - ) { - r = p + q; - for (u = r >>> 2; e.length <= u; ) e.push(0); - e[u] |= m[n] << (8 * (t + (r % 4) * d)); - p += 1; - } - else if ('UTF16BE' === b || 'UTF16LE' === b) - for ( - t = -1 === d ? 2 : 0, - m = - ('UTF16LE' === b && 1 !== d) || ('UTF16LE' !== b && 1 === d), - f = 0; - f < a.length; - f += 1 - ) { - g = a.charCodeAt(f); - !0 === m && ((n = g & 255), (g = (n << 8) | (g >>> 8))); - r = p + q; - for (u = r >>> 2; e.length <= u; ) e.push(0); - e[u] |= g << (8 * (t + (r % 4) * d)); - p += 2; - } - return { value: e, binLen: 8 * p + c }; - }; - break; - case 'B64': - a = function (b, a, e) { - var c = 0, - m, - p, - f, - n, - q, - u, - r, - t; - if (-1 === b.search(/^[a-zA-Z0-9=+\/]+$/)) - throw Error('Invalid character in base-64 string'); - p = b.indexOf('='); - b = b.replace(/\=/g, ''); - if (-1 !== p && p < b.length) - throw Error("Invalid '=' found in base-64 string"); - a = a || [0]; - e = e || 0; - u = e >>> 3; - t = -1 === d ? 3 : 0; - for (p = 0; p < b.length; p += 4) { - q = b.substr(p, 4); - for (f = n = 0; f < q.length; f += 1) - (m = - 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.indexOf( - q.charAt(f) - )), - (n |= m << (18 - 6 * f)); - for (f = 0; f < q.length - 1; f += 1) { - r = c + u; - for (m = r >>> 2; a.length <= m; ) a.push(0); - a[m] |= ((n >>> (16 - 8 * f)) & 255) << (8 * (t + (r % 4) * d)); - c += 1; - } - } - return { value: a, binLen: 8 * c + e }; - }; - break; - case 'BYTES': - a = function (b, a, e) { - var c, m, p, f, n, q; - a = a || [0]; - e = e || 0; - p = e >>> 3; - q = -1 === d ? 3 : 0; - for (m = 0; m < b.length; m += 1) - (c = b.charCodeAt(m)), - (n = m + p), - (f = n >>> 2), - a.length <= f && a.push(0), - (a[f] |= c << (8 * (q + (n % 4) * d))); - return { value: a, binLen: 8 * b.length + e }; - }; - break; - case 'ARRAYBUFFER': - try { - a = new ArrayBuffer(0); - } catch (k) { - throw Error('ARRAYBUFFER not supported by this environment'); - } - a = function (b, a, e) { - return T(new Uint8Array(b), a, e, d); - }; - break; - case 'UINT8ARRAY': - try { - a = new Uint8Array(0); - } catch (k) { - throw Error('UINT8ARRAY not supported by this environment'); - } - a = function (b, a, e) { - return T(b, a, e, d); - }; - break; - default: - throw Error( - 'format must be HEX, TEXT, B64, BYTES, ARRAYBUFFER, or UINT8ARRAY' - ); - } - return a; - } - function y(a, b) { - return (a << b) | (a >>> (32 - b)); - } - function U(e, b) { - return 32 < b - ? ((b -= 32), - new a((e.b << b) | (e.a >>> (32 - b)), (e.a << b) | (e.b >>> (32 - b)))) - : 0 !== b - ? new a((e.a << b) | (e.b >>> (32 - b)), (e.b << b) | (e.a >>> (32 - b))) - : e; - } - function x(a, b) { - return (a >>> b) | (a << (32 - b)); - } - function t(e, b) { - var d = null, - d = new a(e.a, e.b); - return (d = - 32 >= b - ? new a( - (d.a >>> b) | ((d.b << (32 - b)) & 4294967295), - (d.b >>> b) | ((d.a << (32 - b)) & 4294967295) - ) - : new a( - (d.b >>> (b - 32)) | ((d.a << (64 - b)) & 4294967295), - (d.a >>> (b - 32)) | ((d.b << (64 - b)) & 4294967295) - )); - } - function V(e, b) { - var d = null; - return (d = - 32 >= b - ? new a(e.a >>> b, (e.b >>> b) | ((e.a << (32 - b)) & 4294967295)) - : new a(0, e.a >>> (b - 32))); - } - function ca(a, b, d) { - return (a & b) ^ (~a & d); - } - function da(e, b, d) { - return new a((e.a & b.a) ^ (~e.a & d.a), (e.b & b.b) ^ (~e.b & d.b)); - } - function W(a, b, d) { - return (a & b) ^ (a & d) ^ (b & d); - } - function ea(e, b, d) { - return new a( - (e.a & b.a) ^ (e.a & d.a) ^ (b.a & d.a), - (e.b & b.b) ^ (e.b & d.b) ^ (b.b & d.b) - ); - } - function fa(a) { - return x(a, 2) ^ x(a, 13) ^ x(a, 22); - } - function ga(e) { - var b = t(e, 28), - d = t(e, 34); - e = t(e, 39); - return new a(b.a ^ d.a ^ e.a, b.b ^ d.b ^ e.b); - } - function ha(a) { - return x(a, 6) ^ x(a, 11) ^ x(a, 25); - } - function ia(e) { - var b = t(e, 14), - d = t(e, 18); - e = t(e, 41); - return new a(b.a ^ d.a ^ e.a, b.b ^ d.b ^ e.b); - } - function ja(a) { - return x(a, 7) ^ x(a, 18) ^ (a >>> 3); - } - function ka(e) { - var b = t(e, 1), - d = t(e, 8); - e = V(e, 7); - return new a(b.a ^ d.a ^ e.a, b.b ^ d.b ^ e.b); - } - function la(a) { - return x(a, 17) ^ x(a, 19) ^ (a >>> 10); - } - function ma(e) { - var b = t(e, 19), - d = t(e, 61); - e = V(e, 6); - return new a(b.a ^ d.a ^ e.a, b.b ^ d.b ^ e.b); - } - function G(a, b) { - var d = (a & 65535) + (b & 65535); - return ( - ((((a >>> 16) + (b >>> 16) + (d >>> 16)) & 65535) << 16) | (d & 65535) - ); - } - function na(a, b, d, k) { - var h = (a & 65535) + (b & 65535) + (d & 65535) + (k & 65535); - return ( - ((((a >>> 16) + (b >>> 16) + (d >>> 16) + (k >>> 16) + (h >>> 16)) & - 65535) << - 16) | - (h & 65535) - ); - } - function H(a, b, d, k, h) { - var c = (a & 65535) + (b & 65535) + (d & 65535) + (k & 65535) + (h & 65535); - return ( - ((((a >>> 16) + - (b >>> 16) + - (d >>> 16) + - (k >>> 16) + - (h >>> 16) + - (c >>> 16)) & - 65535) << - 16) | - (c & 65535) - ); - } - function oa(e, b) { - var d, k, c; - d = (e.b & 65535) + (b.b & 65535); - k = (e.b >>> 16) + (b.b >>> 16) + (d >>> 16); - c = ((k & 65535) << 16) | (d & 65535); - d = (e.a & 65535) + (b.a & 65535) + (k >>> 16); - k = (e.a >>> 16) + (b.a >>> 16) + (d >>> 16); - return new a(((k & 65535) << 16) | (d & 65535), c); - } - function pa(e, b, d, k) { - var c, l, g; - c = (e.b & 65535) + (b.b & 65535) + (d.b & 65535) + (k.b & 65535); - l = (e.b >>> 16) + (b.b >>> 16) + (d.b >>> 16) + (k.b >>> 16) + (c >>> 16); - g = ((l & 65535) << 16) | (c & 65535); - c = - (e.a & 65535) + - (b.a & 65535) + - (d.a & 65535) + - (k.a & 65535) + - (l >>> 16); - l = (e.a >>> 16) + (b.a >>> 16) + (d.a >>> 16) + (k.a >>> 16) + (c >>> 16); - return new a(((l & 65535) << 16) | (c & 65535), g); - } - function qa(e, b, d, k, c) { - var l, g, m; - l = - (e.b & 65535) + - (b.b & 65535) + - (d.b & 65535) + - (k.b & 65535) + - (c.b & 65535); - g = - (e.b >>> 16) + - (b.b >>> 16) + - (d.b >>> 16) + - (k.b >>> 16) + - (c.b >>> 16) + - (l >>> 16); - m = ((g & 65535) << 16) | (l & 65535); - l = - (e.a & 65535) + - (b.a & 65535) + - (d.a & 65535) + - (k.a & 65535) + - (c.a & 65535) + - (g >>> 16); - g = - (e.a >>> 16) + - (b.a >>> 16) + - (d.a >>> 16) + - (k.a >>> 16) + - (c.a >>> 16) + - (l >>> 16); - return new a(((g & 65535) << 16) | (l & 65535), m); - } - function B(e, b) { - return new a(e.a ^ b.a, e.b ^ b.b); - } - function A(e) { - var b = [], - d; - if ('SHA-1' === e) - b = [1732584193, 4023233417, 2562383102, 271733878, 3285377520]; - else if (0 === e.lastIndexOf('SHA-', 0)) - switch ( - ((b = [ - 3238371032, 914150663, 812702999, 4144912697, 4290775857, 1750603025, - 1694076839, 3204075428, - ]), - (d = [ - 1779033703, 3144134277, 1013904242, 2773480762, 1359893119, - 2600822924, 528734635, 1541459225, - ]), - e) - ) { - case 'SHA-224': - break; - case 'SHA-256': - b = d; - break; - case 'SHA-384': - b = [ - new a(3418070365, b[0]), - new a(1654270250, b[1]), - new a(2438529370, b[2]), - new a(355462360, b[3]), - new a(1731405415, b[4]), - new a(41048885895, b[5]), - new a(3675008525, b[6]), - new a(1203062813, b[7]), - ]; - break; - case 'SHA-512': - b = [ - new a(d[0], 4089235720), - new a(d[1], 2227873595), - new a(d[2], 4271175723), - new a(d[3], 1595750129), - new a(d[4], 2917565137), - new a(d[5], 725511199), - new a(d[6], 4215389547), - new a(d[7], 327033209), - ]; - break; - default: - throw Error('Unknown SHA variant'); - } - else if (0 === e.lastIndexOf('SHA3-', 0) || 0 === e.lastIndexOf('SHAKE', 0)) - for (e = 0; 5 > e; e += 1) - b[e] = [ - new a(0, 0), - new a(0, 0), - new a(0, 0), - new a(0, 0), - new a(0, 0), - ]; - else throw Error('No SHA variants supported'); - return b; - } - function K(a, b) { - var d = [], - k, - c, - l, - g, - m, - p, - f; - k = b[0]; - c = b[1]; - l = b[2]; - g = b[3]; - m = b[4]; - for (f = 0; 80 > f; f += 1) - (d[f] = - 16 > f ? a[f] : y(d[f - 3] ^ d[f - 8] ^ d[f - 14] ^ d[f - 16], 1)), - (p = - 20 > f - ? H(y(k, 5), (c & l) ^ (~c & g), m, 1518500249, d[f]) - : 40 > f - ? H(y(k, 5), c ^ l ^ g, m, 1859775393, d[f]) - : 60 > f - ? H(y(k, 5), W(c, l, g), m, 2400959708, d[f]) - : H(y(k, 5), c ^ l ^ g, m, 3395469782, d[f])), - (m = g), - (g = l), - (l = y(c, 30)), - (c = k), - (k = p); - b[0] = G(k, b[0]); - b[1] = G(c, b[1]); - b[2] = G(l, b[2]); - b[3] = G(g, b[3]); - b[4] = G(m, b[4]); - return b; - } - function ba(a, b, d, c) { - var h; - for (h = (((b + 65) >>> 9) << 4) + 15; a.length <= h; ) a.push(0); - a[b >>> 5] |= 128 << (24 - (b % 32)); - b += d; - a[h] = b & 4294967295; - a[h - 1] = (b / 4294967296) | 0; - b = a.length; - for (h = 0; h < b; h += 16) c = K(a.slice(h, h + 16), c); - return c; - } - function L(e, b, d) { - var k, - h, - l, - g, - m, - p, - f, - n, - q, - u, - r, - t, - v, - x, - y, - A, - z, - w, - F, - B, - C, - D, - E = [], - J; - if ('SHA-224' === d || 'SHA-256' === d) - (u = 64), - (t = 1), - (D = Number), - (v = G), - (x = na), - (y = H), - (A = ja), - (z = la), - (w = fa), - (F = ha), - (C = W), - (B = ca), - (J = c); - else if ('SHA-384' === d || 'SHA-512' === d) - (u = 80), - (t = 2), - (D = a), - (v = oa), - (x = pa), - (y = qa), - (A = ka), - (z = ma), - (w = ga), - (F = ia), - (C = ea), - (B = da), - (J = X); - else throw Error('Unexpected error in SHA-2 implementation'); - d = b[0]; - k = b[1]; - h = b[2]; - l = b[3]; - g = b[4]; - m = b[5]; - p = b[6]; - f = b[7]; - for (r = 0; r < u; r += 1) - 16 > r - ? ((q = r * t), - (n = e.length <= q ? 0 : e[q]), - (q = e.length <= q + 1 ? 0 : e[q + 1]), - (E[r] = new D(n, q))) - : (E[r] = x(z(E[r - 2]), E[r - 7], A(E[r - 15]), E[r - 16])), - (n = y(f, F(g), B(g, m, p), J[r], E[r])), - (q = v(w(d), C(d, k, h))), - (f = p), - (p = m), - (m = g), - (g = v(l, n)), - (l = h), - (h = k), - (k = d), - (d = v(n, q)); - b[0] = v(d, b[0]); - b[1] = v(k, b[1]); - b[2] = v(h, b[2]); - b[3] = v(l, b[3]); - b[4] = v(g, b[4]); - b[5] = v(m, b[5]); - b[6] = v(p, b[6]); - b[7] = v(f, b[7]); - return b; - } - function D(e, b) { - var d, - c, - h, - l, - g = [], - m = []; - if (null !== e) - for (c = 0; c < e.length; c += 2) - b[(c >>> 1) % 5][((c >>> 1) / 5) | 0] = B( - b[(c >>> 1) % 5][((c >>> 1) / 5) | 0], - new a(e[c + 1], e[c]) - ); - for (d = 0; 24 > d; d += 1) { - l = A('SHA3-'); - for (c = 0; 5 > c; c += 1) { - h = b[c][0]; - var p = b[c][1], - f = b[c][2], - n = b[c][3], - q = b[c][4]; - g[c] = new a(h.a ^ p.a ^ f.a ^ n.a ^ q.a, h.b ^ p.b ^ f.b ^ n.b ^ q.b); - } - for (c = 0; 5 > c; c += 1) m[c] = B(g[(c + 4) % 5], U(g[(c + 1) % 5], 1)); - for (c = 0; 5 > c; c += 1) - for (h = 0; 5 > h; h += 1) b[c][h] = B(b[c][h], m[c]); - for (c = 0; 5 > c; c += 1) - for (h = 0; 5 > h; h += 1) - l[h][(2 * c + 3 * h) % 5] = U(b[c][h], Y[c][h]); - for (c = 0; 5 > c; c += 1) - for (h = 0; 5 > h; h += 1) - b[c][h] = B( - l[c][h], - new a( - ~l[(c + 1) % 5][h].a & l[(c + 2) % 5][h].a, - ~l[(c + 1) % 5][h].b & l[(c + 2) % 5][h].b - ) - ); - b[0][0] = B(b[0][0], Z[d]); - } - return b; - } - var c, X, Y, Z; - c = [ - 1116352408, 1899447441, 3049323471, 3921009573, 961987163, 1508970993, - 2453635748, 2870763221, 3624381080, 310598401, 607225278, 1426881987, - 1925078388, 2162078206, 2614888103, 3248222580, 3835390401, 4022224774, - 264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986, - 2554220882, 2821834349, 2952996808, 3210313671, 3336571891, 3584528711, - 113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291, - 1695183700, 1986661051, 2177026350, 2456956037, 2730485921, 2820302411, - 3259730800, 3345764771, 3516065817, 3600352804, 4094571909, 275423344, - 430227734, 506948616, 659060556, 883997877, 958139571, 1322822218, - 1537002063, 1747873779, 1955562222, 2024104815, 2227730452, 2361852424, - 2428436474, 2756734187, 3204031479, 3329325298, - ]; - X = [ - new a(c[0], 3609767458), - new a(c[1], 602891725), - new a(c[2], 3964484399), - new a(c[3], 2173295548), - new a(c[4], 4081628472), - new a(c[5], 3053834265), - new a(c[6], 2937671579), - new a(c[7], 3664609560), - new a(c[8], 2734883394), - new a(c[9], 1164996542), - new a(c[10], 1323610764), - new a(c[11], 3590304994), - new a(c[12], 4068182383), - new a(c[13], 991336113), - new a(c[14], 633803317), - new a(c[15], 3479774868), - new a(c[16], 2666613458), - new a(c[17], 944711139), - new a(c[18], 2341262773), - new a(c[19], 2007800933), - new a(c[20], 1495990901), - new a(c[21], 1856431235), - new a(c[22], 3175218132), - new a(c[23], 2198950837), - new a(c[24], 3999719339), - new a(c[25], 766784016), - new a(c[26], 2566594879), - new a(c[27], 3203337956), - new a(c[28], 1034457026), - new a(c[29], 2466948901), - new a(c[30], 3758326383), - new a(c[31], 168717936), - new a(c[32], 1188179964), - new a(c[33], 1546045734), - new a(c[34], 1522805485), - new a(c[35], 2643833823), - new a(c[36], 2343527390), - new a(c[37], 1014477480), - new a(c[38], 1206759142), - new a(c[39], 344077627), - new a(c[40], 1290863460), - new a(c[41], 3158454273), - new a(c[42], 3505952657), - new a(c[43], 106217008), - new a(c[44], 3606008344), - new a(c[45], 1432725776), - new a(c[46], 1467031594), - new a(c[47], 851169720), - new a(c[48], 3100823752), - new a(c[49], 1363258195), - new a(c[50], 3750685593), - new a(c[51], 3785050280), - new a(c[52], 3318307427), - new a(c[53], 3812723403), - new a(c[54], 2003034995), - new a(c[55], 3602036899), - new a(c[56], 1575990012), - new a(c[57], 1125592928), - new a(c[58], 2716904306), - new a(c[59], 442776044), - new a(c[60], 593698344), - new a(c[61], 3733110249), - new a(c[62], 2999351573), - new a(c[63], 3815920427), - new a(3391569614, 3928383900), - new a(3515267271, 566280711), - new a(3940187606, 3454069534), - new a(4118630271, 4000239992), - new a(116418474, 1914138554), - new a(174292421, 2731055270), - new a(289380356, 3203993006), - new a(460393269, 320620315), - new a(685471733, 587496836), - new a(852142971, 1086792851), - new a(1017036298, 365543100), - new a(1126000580, 2618297676), - new a(1288033470, 3409855158), - new a(1501505948, 4234509866), - new a(1607167915, 987167468), - new a(1816402316, 1246189591), - ]; - Z = [ - new a(0, 1), - new a(0, 32898), - new a(2147483648, 32906), - new a(2147483648, 2147516416), - new a(0, 32907), - new a(0, 2147483649), - new a(2147483648, 2147516545), - new a(2147483648, 32777), - new a(0, 138), - new a(0, 136), - new a(0, 2147516425), - new a(0, 2147483658), - new a(0, 2147516555), - new a(2147483648, 139), - new a(2147483648, 32905), - new a(2147483648, 32771), - new a(2147483648, 32770), - new a(2147483648, 128), - new a(0, 32778), - new a(2147483648, 2147483658), - new a(2147483648, 2147516545), - new a(2147483648, 32896), - new a(0, 2147483649), - new a(2147483648, 2147516424), - ]; - Y = [ - [0, 36, 3, 41, 18], - [1, 44, 10, 45, 2], - [62, 6, 43, 15, 61], - [28, 55, 25, 21, 56], - [27, 20, 39, 8, 14], - ]; - 'function' === typeof define && define.amd - ? define(function () { - return C; - }) - : 'undefined' !== typeof exports - ? ('undefined' !== typeof module && module.exports && (module.exports = C), - (exports = C)) - : (aa.jsSHA = C); -})(this); diff --git a/src/lib/wapi/listeners/add-all-new-messages.js b/src/lib/wapi/listeners/add-all-new-messages.js deleted file mode 100644 index 6d69119c7..000000000 --- a/src/lib/wapi/listeners/add-all-new-messages.js +++ /dev/null @@ -1,37 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export function allNewMessagesListener() { - window.WAPI.allNewMessagesListener = (callback) => - WPP.whatsapp.MsgStore.on('add', (newMessage) => { - if (newMessage && newMessage.isNewMsg) { - setTimeout( - () => { - let message = window.WAPI.processMessageObj( - newMessage, - true, - false - ); - if (message) { - callback(message); - } - }, - newMessage.body ? 0 : 2000 - ); - } - }); -} diff --git a/src/lib/wapi/listeners/add-new-messages.js b/src/lib/wapi/listeners/add-new-messages.js deleted file mode 100644 index 366436725..000000000 --- a/src/lib/wapi/listeners/add-new-messages.js +++ /dev/null @@ -1,34 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export function addNewMessagesListener() { - window.WAPI.waitNewMessages = waitNewMessages; -} - -/** - * Registers a callback to be called when a new message arrives the WAPI. - * @param rmCallbackAfterUse - Boolean - Specify if the callback need to be executed only once - * @param done - function - Callback function to be called when a new message arrives. - * @returns {boolean} - */ -function waitNewMessages(rmCallbackAfterUse = true, done) { - window.WAPI._newMessagesCallbacks.push({ - callback: done, - rmAfterUse: rmCallbackAfterUse, - }); - return true; -} diff --git a/src/lib/wapi/listeners/add-on-added-to-group.js b/src/lib/wapi/listeners/add-on-added-to-group.js deleted file mode 100644 index aa95e7b6e..000000000 --- a/src/lib/wapi/listeners/add-on-added-to-group.js +++ /dev/null @@ -1,49 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export function addOnAddedToGroup() { - /** - * Registers a callback that fires when your host phone is added to a group. - * @param callback - function - Callback function to be called when a message acknowledgement changes. The callback returns 3 variables - * @returns {boolean} - */ - window.WAPI.onAddedToGroup = function (callback) { - WPP.whatsapp.MsgStore.on('add', (message) => { - /** - * Mensagem precisa ser: - * - Nova - * - É uma notificação - * - Do tipo de eventos de grupo - * - Evento de adicionado no grupo - */ - if ( - message.isNewMsg && - message.isNotification && - message.type === 'gp2' && - message.subtype === 'add' - ) { - try { - const data = WAPI._serializeChatObj(message.chat); - callback(data); - } catch (error) { - console.error(error); - } - } - }); - return true; - }; -} diff --git a/src/lib/wapi/listeners/add-on-live-location.js b/src/lib/wapi/listeners/add-on-live-location.js deleted file mode 100644 index 098b0e76e..000000000 --- a/src/lib/wapi/listeners/add-on-live-location.js +++ /dev/null @@ -1,75 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export function addOnLiveLocation() { - const callbacks = []; - - /** - * Trigger the event - */ - function fireCallback(data) { - const location = Object.assign({}, data); - if (location.jid) { - location.id = location.jid.toString(); - } - - for (const callback of callbacks) { - try { - callback(location); - } catch (error) {} - } - } - - WPP.on('chat.live_location_start', (e) => { - fireCallback({ - type: 'enable', - id: e.id.toString(), - lat: e.lat, - lng: e.lng, - accuracy: e.accuracy, - speed: e.speed, - degrees: e.degrees, - shareDuration: e.shareDuration, - }); - }); - - WPP.on('chat.live_location_update', (e) => { - fireCallback({ - type: 'update', - id: e.id.toString(), - lat: e.lat, - lng: e.lng, - accuracy: e.accuracy, - speed: e.speed, - degrees: e.degrees, - elapsed: e.elapsed, - lastUpdated: e.lastUpdated, - }); - }); - - WPP.on('chat.live_location_end', (e) => { - fireCallback({ - type: 'disablle', - id: e.id.toString(), - chat: e.chat.toString(), - }); - }); - - window.WAPI.onLiveLocation = async function (callback) { - callbacks.push(callback); - }; -} diff --git a/src/lib/wapi/listeners/add-on-new-ack.js b/src/lib/wapi/listeners/add-on-new-ack.js deleted file mode 100644 index 37d6e23f8..000000000 --- a/src/lib/wapi/listeners/add-on-new-ack.js +++ /dev/null @@ -1,23 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export function addOnNewAcks() { - window.WAPI.waitNewAcknowledgements = function (callback) { - WPP.whatsapp.MsgStore.on('change:ack', callback); - return true; - }; -} diff --git a/src/lib/wapi/listeners/add-on-notification-message.js b/src/lib/wapi/listeners/add-on-notification-message.js deleted file mode 100644 index 256e1f766..000000000 --- a/src/lib/wapi/listeners/add-on-notification-message.js +++ /dev/null @@ -1,30 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export function addOnNotificationMessage() { - window.WAPI.onNotificationMessage = function (callback) { - WPP.whatsapp.MsgStore.on('add', (message) => { - if (!message.isNotification || !message.isNewMsg) { - return; - } - const data = WAPI._serializeMessageObj(message); - callback(data); - }); - - return true; - }; -} diff --git a/src/lib/wapi/listeners/add-on-participants-change.js b/src/lib/wapi/listeners/add-on-participants-change.js deleted file mode 100644 index 7ded6b9cc..000000000 --- a/src/lib/wapi/listeners/add-on-participants-change.js +++ /dev/null @@ -1,98 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -let groupParticpiantsEvents = {}; - -/** - * Registers on participants change listener - */ -export function addOnParticipantsChange() { - /** - * Registers a callback to participant changes on a certain, specific group - * @param groupId - string - The id of the group that you want to attach the callback to. - * @param callback - function - Callback function to be called when a message acknowledgement changes. The callback returns 3 variables - * @returns {boolean} - */ - window.WAPI.onParticipantsChanged = async function (groupId, callback) { - const subtypeEvents = [ - 'invite', - 'add', - 'remove', - 'leave', - 'promote', - 'demote', - ]; - const chat = WPP.whatsapp.ChatStore.get(groupId); - //attach all group Participants to the events object as 'add' - const metadata = WPP.whatsapp.GroupMetadataStore.get(groupId); - if (!groupParticpiantsEvents[groupId]) { - groupParticpiantsEvents[groupId] = {}; - metadata.participants.forEach((participant) => { - groupParticpiantsEvents[groupId][participant.id.toString()] = { - subtype: 'add', - from: metadata.owner, - }; - }); - } - let i = 0; - chat.on('change:groupMetadata.participants', (_) => - chat.on('all', (x, y) => { - const { isGroup, previewMessage } = y; - if ( - isGroup && - x === 'change' && - previewMessage && - previewMessage.type === 'gp2' && - subtypeEvents.includes(previewMessage.subtype) - ) { - const { subtype, from, recipients } = previewMessage; - const rec = recipients[0].toString(); - if ( - groupParticpiantsEvents[groupId][rec] && - groupParticpiantsEvents[groupId][recipients[0]].subtype == subtype - ) { - //ignore, this is a duplicate entry - // console.log('duplicate event') - } else { - //ignore the first message - if (i == 0) { - //ignore it, plus 1, - i++; - } else { - groupParticpiantsEvents[groupId][rec] = { - subtype, - from, - }; - //fire the callback - // // previewMessage.from.toString() - // x removed y - // x added y - callback({ - by: from.toString(), - action: subtype, - who: recipients, - }); - chat.off('all', this); - i = 0; - } - } - } - }) - ); - return true; - }; -} diff --git a/src/lib/wapi/listeners/add-on-presence-changed.js b/src/lib/wapi/listeners/add-on-presence-changed.js deleted file mode 100644 index 320d454d6..000000000 --- a/src/lib/wapi/listeners/add-on-presence-changed.js +++ /dev/null @@ -1,74 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export function addOnPresenceChanged() { - window.WAPI.onPresenceChanged = function (callback) { - setTimeout(() => { - WPP.whatsapp.ChatStore.map((c) => c.presence.subscribe()); - }, 1000); - - WPP.whatsapp.PresenceStore.on('change:chatstate.type', (chatstate) => { - try { - // Search precense model from chatstate - const presence = WPP.whatsapp.PresenceStore.getModelsArray().find( - (m) => m.chatstate === chatstate - ); - - // Ignore not initialized presences - if (!presence || !presence.hasData || !presence.chatstate.type) { - return; - } - - const contact = WPP.whatsapp.ContactStore.get(presence.id); - - const data = { - id: presence.id, - isOnline: presence.isOnline, - isGroup: presence.isGroup, - isUser: presence.isUser, - shortName: contact ? contact.formattedShortName : '', - state: presence.chatstate.type, - t: Date.now(), - }; - - if (presence.isUser) { - data.isContact = !presence.chatstate.deny; - } - - if (presence.isGroup) { - data.participants = presence.chatstates - .getModelsArray() - .filter((c) => !!c.type) - .map((c) => { - const contact = WPP.whatsapp.ContactStore.get(c.id); - - return { - id: c.id.toString(), - state: c.type, - shortName: contact ? contact.formattedShortName : '', - }; - }); - } - - callback(data); - } catch (error) { - console.log(error); - } - }); - return true; - }; -} diff --git a/src/lib/wapi/listeners/add-on-state-change.js b/src/lib/wapi/listeners/add-on-state-change.js deleted file mode 100644 index b28be437b..000000000 --- a/src/lib/wapi/listeners/add-on-state-change.js +++ /dev/null @@ -1,47 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export function addOnStateChange() { - let initialized = false; - let getData = () => { - return WPP.whatsapp.Socket.state; - }; - - window.WAPI.onStateChange = function (callback) { - WPP.whatsapp.Socket.on('change:state', () => callback(getData())); - if (!initialized) { - initialized = true; - callback(getData()); - } - return true; - }; -} - -export function addOnStreamChange() { - let initialized = false; - let getData = () => { - return WPP.whatsapp.Socket.stream; - }; - window.WAPI.onStreamChange = function (callback) { - WPP.whatsapp.Socket.on('change:stream', () => callback(getData())); - if (!initialized) { - initialized = true; - callback(getData()); - } - return true; - }; -} diff --git a/src/lib/wapi/listeners/index.js b/src/lib/wapi/listeners/index.js deleted file mode 100644 index 2eaaeb699..000000000 --- a/src/lib/wapi/listeners/index.js +++ /dev/null @@ -1,27 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export { initNewMessagesListener } from './init-listeners'; -export { addNewMessagesListener } from './add-new-messages'; -export { allNewMessagesListener } from './add-all-new-messages'; -export { addOnStateChange, addOnStreamChange } from './add-on-state-change'; -export { addOnNewAcks } from './add-on-new-ack'; -export { addOnLiveLocation } from './add-on-live-location'; -export { addOnParticipantsChange } from './add-on-participants-change'; -export { addOnPresenceChanged } from './add-on-presence-changed'; -export { addOnAddedToGroup } from './add-on-added-to-group'; -export { addOnNotificationMessage } from './add-on-notification-message'; diff --git a/src/lib/wapi/listeners/init-listeners.js b/src/lib/wapi/listeners/init-listeners.js deleted file mode 100644 index bc6106a6c..000000000 --- a/src/lib/wapi/listeners/init-listeners.js +++ /dev/null @@ -1,102 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export function initNewMessagesListener() { - window.WAPI._newMessagesListener = WPP.whatsapp.MsgStore.on( - 'add', - (newMessage) => { - if ( - newMessage && - newMessage.isNewMsg && - !newMessage.isSentByMe && - !newMessage.isStatusV3 - ) { - setTimeout( - () => { - let message = window.WAPI.processMessageObj( - newMessage, - false, - false - ); - if (message) { - window.WAPI._newMessagesQueue.push(message); - window.WAPI._newMessagesBuffer.push(message); - } - - // Starts debouncer time to don't call a callback for each message if more than one message arrives - // in the same second - if ( - !window.WAPI._newMessagesDebouncer && - window.WAPI._newMessagesQueue.length > 0 - ) { - window.WAPI._newMessagesDebouncer = setTimeout(() => { - let queuedMessages = window.WAPI._newMessagesQueue; - - window.WAPI._newMessagesDebouncer = null; - window.WAPI._newMessagesQueue = []; - - let removeCallbacks = []; - - window.WAPI._newMessagesCallbacks.forEach(function ( - callbackObj - ) { - if (callbackObj.callback !== undefined) { - callbackObj.callback(queuedMessages); - } - if (callbackObj.rmAfterUse === true) { - removeCallbacks.push(callbackObj); - } - }); - - // Remove removable callbacks. - removeCallbacks.forEach(function (rmCallbackObj) { - let callbackIndex = - window.WAPI._newMessagesCallbacks.indexOf(rmCallbackObj); - window.WAPI._newMessagesCallbacks.splice(callbackIndex, 1); - }); - }, 1000); - } - }, - newMessage.body ? 0 : 2000 - ); - } - } - ); - - window.WAPI._unloadInform = (event) => { - // Save in the buffer the ungot unreaded messages - window.WAPI._newMessagesBuffer.forEach((message) => { - Object.keys(message).forEach((key) => - message[key] === undefined ? delete message[key] : '' - ); - }); - sessionStorage.setItem( - 'saved_msgs', - JSON.stringify(window.WAPI._newMessagesBuffer) - ); - - // Inform callbacks that the page will be reloaded. - window.WAPI._newMessagesCallbacks.forEach(function (callbackObj) { - if (callbackObj.callback !== undefined) { - callbackObj.callback({ - status: -1, - message: 'page will be reloaded, wait and register callback again.', - }); - } - }); - }; -} diff --git a/src/lib/wapi/serializers/index.js b/src/lib/wapi/serializers/index.js deleted file mode 100644 index 9c2b4c2fe..000000000 --- a/src/lib/wapi/serializers/index.js +++ /dev/null @@ -1,24 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export { _serializeChatObj } from './serialize-chat'; -export { _serializeRawObj } from './serialize-raw'; -export { _serializeMessageObj } from './serialize-message'; -export { _serializeContactObj } from './serialize-contact'; -export { _serializeNumberStatusObj } from './serialize-number-status'; -export { _serializeProfilePicThumb } from './serialize-profile-pic-thumb'; -export { _profilePicfunc } from './serialize-profilePic'; diff --git a/src/lib/wapi/serializers/serialize-chat.js b/src/lib/wapi/serializers/serialize-chat.js deleted file mode 100644 index 33fbed8ef..000000000 --- a/src/lib/wapi/serializers/serialize-chat.js +++ /dev/null @@ -1,46 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -import { _serializeRawObj } from './serialize-raw'; - -/** - * Serializes a chat object - * - * @param rawChat Chat object - * @returns {Chat} - */ -export const _serializeChatObj = (obj) => { - if (obj == undefined) { - return null; - } - return Object.assign(window.WAPI._serializeRawObj(obj), { - kind: obj.kind, - isBroadcast: obj.isBroadcast, - isGroup: obj.isGroup, - isUser: obj.isUser, - contact: obj['contact'] - ? window.WAPI._serializeContactObj(obj['contact']) - : null, - groupMetadata: obj['groupMetadata'] - ? window.WAPI._serializeRawObj(obj['groupMetadata']) - : null, - presence: obj['presence'] - ? window.WAPI._serializeRawObj(obj['presence']) - : null, - msgs: null, - }); -}; diff --git a/src/lib/wapi/serializers/serialize-contact.js b/src/lib/wapi/serializers/serialize-contact.js deleted file mode 100644 index 86383fff9..000000000 --- a/src/lib/wapi/serializers/serialize-contact.js +++ /dev/null @@ -1,43 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export const _serializeContactObj = (obj) => { - if (obj == undefined) { - return null; - } - - let profile = null; - - if (!obj.profilePicThumb && obj.id && WPP.whatsapp.ProfilePicThumbStore) { - let thumb = WPP.whatsapp.ProfilePicThumbStore.get(obj.id); - profile = thumb ? WAPI._serializeProfilePicThumb(thumb) : {}; - } - - return Object.assign(window.WAPI._serializeRawObj(obj), { - formattedName: obj.formattedName, - isHighLevelVerified: obj.isHighLevelVerified, - isMe: obj.isMe, - isMyContact: obj.isMyContact, - isPSA: obj.isPSA, - isUser: obj.isUser, - isVerified: obj.isVerified, - isWAContact: obj.isWAContact, - profilePicThumbObj: profile, - statusMute: obj.statusMute, - msgs: null, - }); -}; diff --git a/src/lib/wapi/serializers/serialize-message.js b/src/lib/wapi/serializers/serialize-message.js deleted file mode 100644 index 888e68d84..000000000 --- a/src/lib/wapi/serializers/serialize-message.js +++ /dev/null @@ -1,46 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export const _serializeMessageObj = (obj) => { - if (obj == undefined) { - return null; - } - if (obj.quotedMsg && obj.quotedMsgObj) obj.quotedMsgObj(); - return Object.assign(window.WAPI._serializeRawObj(obj), { - id: obj.id._serialized, - from: obj.from._serialized, - quotedParticipant: obj?.quotedParticipant?._serialized, - author: obj?.author?._serialized, - chatId: obj?.id?.remote || obj?.chatId?._serialized, - to: obj?.to?._serialized, - fromMe: obj?.id?.fromMe, - sender: obj['senderObj'] - ? WAPI._serializeContactObj(obj['senderObj']) - : null, - timestamp: obj['t'], - content: obj['body'], - isGroupMsg: obj.isGroupMsg, - isLink: obj.isLink, - isMMS: obj.isMMS, - isMedia: obj.isMedia, - isNotification: obj.isNotification, - isPSA: obj.isPSA, - type: obj.type, - quotedMsgId: obj?._quotedMsgObj?.id?._serialized, - mediaData: window.WAPI._serializeRawObj(obj['mediaData']), - }); -}; diff --git a/src/lib/wapi/serializers/serialize-number-status.js b/src/lib/wapi/serializers/serialize-number-status.js deleted file mode 100644 index 6600810ae..000000000 --- a/src/lib/wapi/serializers/serialize-number-status.js +++ /dev/null @@ -1,32 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export const _serializeNumberStatusObj = (obj) => { - if (obj == undefined) { - return null; - } - - return Object.assign( - {}, - { - id: obj.jid, - status: obj.status, - isBusiness: obj.biz === true, - canReceiveMessage: obj.status === 200, - } - ); -}; diff --git a/src/lib/wapi/serializers/serialize-profile-pic-thumb.js b/src/lib/wapi/serializers/serialize-profile-pic-thumb.js deleted file mode 100644 index 171b83052..000000000 --- a/src/lib/wapi/serializers/serialize-profile-pic-thumb.js +++ /dev/null @@ -1,34 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export const _serializeProfilePicThumb = (obj) => { - if (obj == undefined) { - return null; - } - - return Object.assign( - {}, - { - eurl: obj.eurl, - id: obj.id, - img: obj.img, - imgFull: obj.imgFull, - raw: obj.raw, - tag: obj.tag, - } - ); -}; diff --git a/src/lib/wapi/serializers/serialize-profilePic.js b/src/lib/wapi/serializers/serialize-profilePic.js deleted file mode 100644 index aab59cd19..000000000 --- a/src/lib/wapi/serializers/serialize-profilePic.js +++ /dev/null @@ -1,31 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export const _profilePicfunc = async (id) => { - const wid = WPP.whatsapp.WidFactory.createWid(id); - let pic = WPP.whatsapp.ProfilePicThumbStore.get(wid); - - if (!pic) { - pic = await WPP.whatsapp.ProfilePicThumbStore.find(wid); - } - - if (pic) { - return WAPI._serializeProfilePicThumb(pic); - } - - return null; -}; diff --git a/src/lib/wapi/serializers/serialize-raw.js b/src/lib/wapi/serializers/serialize-raw.js deleted file mode 100644 index 15cbc100e..000000000 --- a/src/lib/wapi/serializers/serialize-raw.js +++ /dev/null @@ -1,23 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export const _serializeRawObj = (obj) => { - if (obj && obj.toJSON) { - return obj.toJSON(); - } - return {}; -}; diff --git a/src/lib/wapi/store/store-objects.js b/src/lib/wapi/store/store-objects.js deleted file mode 100644 index 9f33df3f6..000000000 --- a/src/lib/wapi/store/store-objects.js +++ /dev/null @@ -1,99 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export const storeObjects = [ - { - id: 'Store', - conditions: (module) => - module.default && module.default.Chat && module.default.Msg - ? module.default - : null, - }, - { - id: 'MediaCollection', - conditions: (module) => - module.default && - module.default.prototype && - module.default.prototype.processAttachments !== undefined - ? module.default - : null, - }, - { - id: 'GroupInvite', - conditions: (module) => (module.sendQueryGroupInviteCode ? module : null), - }, - { - id: 'Archive', - conditions: (module) => (module.setArchive ? module : null), - }, - { - id: 'pinChat', - conditions: (module) => - module.setPin.toString().includes('.unproxy') ? module : null, - }, - { - id: 'Perfil', - conditions: (module) => module.setPushname && !module.getComposeContents, - }, - { - id: 'ChatStates', - conditions: (module) => - module.sendChatStatePaused && - module.sendChatStateRecording && - module.sendChatStateComposing - ? module - : null, - }, - { - id: 'MediaObject', - conditions: (module) => - module.getOrCreateMediaObject && module.disassociateMediaFromStickerPack - ? module - : null, - }, - { - id: 'UploadUtils', - conditions: (module) => - module.default && module.default.encryptAndUpload ? module.default : null, - }, - { - id: 'Theme', - conditions: (module) => - module.getTheme && module.setTheme ? module : null, - }, - { - id: 'SendMute', - conditions: (module) => (module.sendConversationMute ? module : null), - }, - { - id: 'Validators', - conditions: (module) => (module.findLinks ? module : null), - }, - { - id: 'changeEphemeralDuration', - conditions: (module) => module.changeEphemeralDuration, - }, - { - id: 'sendCreateGroup', - conditions: (module) => module.sendCreateGroup, - }, - { - id: 'sendQueryGroupInvite', - conditions: (module) => - module.sendQueryGroupInvite ? module.sendQueryGroupInvite : null, - }, -]; diff --git a/src/lib/wapi/wapi.js b/src/lib/wapi/wapi.js deleted file mode 100644 index 554fc68b5..000000000 --- a/src/lib/wapi/wapi.js +++ /dev/null @@ -1,542 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -import { - _getGroupParticipants, - areAllMessagesLoaded, - asyncLoadAllEarlierMessages, - downloadFile, - encryptAndUploadFile, - forwardMessages, - getAllChatIds, - getAllChats, - getAllChatsWithMessages, - getAllChatsWithNewMessages, - getAllContacts, - getAllGroupMetadata, - getAllGroups, - getAllMessagesInChat, - getAllNewMessages, - getAllUnreadMessages, - getBatteryLevel, - getChat, - getChatById, - getChatByName, - getCommonGroups, - getContact, - getGroupMetadata, - getGroupParticipantIDs, - getHost, - getWid, - getMe, - getMessageById, - getMyContacts, - getNewId, - getNumberProfile, - getUnreadMessages, - getUnreadMessagesInChat, - hasUndreadMessages, - isConnected, - isLoggedIn, - loadAllEarlierMessages, - loadAndGetAllMessagesInChat, - loadChatEarlierMessages, - loadEarlierMessagesTillDate, - processFiles, - processMessageObj, - sendMessageOptions, - sendChatstate, - sendFile, - sendPtt, - sendImage, - sendImageWithProduct, - createProduct, - sendLocation, - sendMessage, - sendMessage2, - sendMessageWithTags, - sendMessageWithThumb, - sendVideoAsGif, - setMyName, - getTheme, - setTheme, - sendLinkPreview, - scope, - getchatId, - sendExist, - setProfilePic, - pinChat, - getSessionTokenBrowser, - sendMute, - getListMute, - interfaceMute, - startPhoneWatchdog, - stopPhoneWatchdog, - setTemporaryMessages, - starMessages, - subscribePresence, - unsubscribePresence, - getMessages, - setOnlinePresence, -} from './functions'; -import { - base64ToFile, - generateMediaKey, - getFileHash, - arrayBufferToBase64, -} from './helper'; -import { - addNewMessagesListener, - addOnAddedToGroup, - addOnLiveLocation, - addOnNewAcks, - addOnNotificationMessage, - addOnParticipantsChange, - addOnPresenceChanged, - addOnStateChange, - addOnStreamChange, - allNewMessagesListener, - initNewMessagesListener, -} from './listeners'; -import { - _serializeChatObj, - _serializeContactObj, - _serializeMessageObj, - _serializeNumberStatusObj, - _serializeProfilePicThumb, - _serializeRawObj, - _profilePicfunc, -} from './serializers'; -import { getBusinessProfilesProducts, getOrderbyMsg } from './business'; -import { storeObjects } from './store/store-objects'; - -const readyPromise = new Promise((resolve) => { - if (WPP.isReady) { - resolve(); - return; - } - WPP.webpack.onReady(resolve); -}); - -if (typeof window.Store === 'undefined') { - window.Store = {}; - window.Store.promises = {}; - - readyPromise.then(() => { - for (const store of storeObjects) { - window.Store.promises[store.id] = Promise.resolve( - WPP.webpack.search(store.conditions) - ) - .then((m) => { - if (!m) { - console.error(`Store Object '${store.id}' was not found`); - } - return m; - }) - .then(store.conditions) - .then((m) => { - if (store.id === 'Store') { - window.Store = Object.assign({}, window.Store, m); - } else { - window.Store[store.id] = m; - } - }); - } - }); -} - -if (typeof window.WAPI === 'undefined') { - window.WAPI = { - lastRead: {}, - }; - //others - window.WAPI.interfaceMute = interfaceMute; - //Profile - window.WAPI.setProfilePic = setProfilePic; - window.WAPI.getSessionTokenBrowser = getSessionTokenBrowser; - - // Chat Functions - window.WAPI.scope = scope; - window.WAPI.getchatId = getchatId; - window.WAPI.sendExist = sendExist; - window.WAPI.pinChat = pinChat; - window.WAPI.setTemporaryMessages = setTemporaryMessages; - - // Layout Functions - window.WAPI.setTheme = setTheme; - window.WAPI.getTheme = getTheme; - - // Serializers assignations - window.WAPI._serializeRawObj = _serializeRawObj; - window.WAPI._serializeChatObj = _serializeChatObj; - window.WAPI._serializeContactObj = _serializeContactObj; - window.WAPI._serializeMessageObj = _serializeMessageObj; - window.WAPI._serializeNumberStatusObj = _serializeNumberStatusObj; - window.WAPI._serializeProfilePicThumb = _serializeProfilePicThumb; - window.WAPI._profilePicfunc = _profilePicfunc; - - // Chatting functions - window.WAPI.sendChatstate = sendChatstate; - window.WAPI.sendMessageWithThumb = sendMessageWithThumb; - window.WAPI.processMessageObj = processMessageObj; - window.WAPI.sendMessageWithTags = sendMessageWithTags; - window.WAPI.sendMessage = sendMessage; - window.WAPI.sendMessage2 = sendMessage2; - window.WAPI.sendImage = sendImage; - window.WAPI.sendPtt = sendPtt; - window.WAPI.sendFile = sendFile; - window.WAPI.setMyName = setMyName; - window.WAPI.sendVideoAsGif = sendVideoAsGif; - window.WAPI.processFiles = processFiles; - window.WAPI.sendImageWithProduct = sendImageWithProduct; - window.WAPI.createProduct = createProduct; - window.WAPI.forwardMessages = forwardMessages; - window.WAPI.encryptAndUploadFile = encryptAndUploadFile; - window.WAPI.setOnlinePresence = setOnlinePresence; - window.WAPI.sendLocation = sendLocation; - window.WAPI.sendLinkPreview = sendLinkPreview; - window.WAPI.sendMessageOptions = sendMessageOptions; - window.WAPI.starMessages = starMessages; - - // Retrieving functions - window.WAPI.getAllContacts = getAllContacts; - window.WAPI.getMyContacts = getMyContacts; - window.WAPI.getContact = getContact; - window.WAPI.getAllChats = getAllChats; - window.WAPI.haveNewMsg = hasUndreadMessages; - window.WAPI.getAllChatsWithNewMsg = getAllChatsWithNewMessages; - window.WAPI.getAllChatIds = getAllChatIds; - window.WAPI.getAllNewMessages = getAllNewMessages; - window.WAPI.getAllUnreadMessages = getAllUnreadMessages; - window.WAPI.getAllChatsWithMessages = getAllChatsWithMessages; - window.WAPI.getAllGroups = getAllGroups; - window.WAPI.getChat = getChat; - window.WAPI.getChatByName = getChatByName; - window.WAPI.getNewId = getNewId; - window.WAPI.getChatById = getChatById; - window.WAPI.getUnreadMessagesInChat = getUnreadMessagesInChat; - window.WAPI.loadEarlierMessages = loadChatEarlierMessages; - window.WAPI.loadAllEarlierMessages = loadAllEarlierMessages; - window.WAPI.asyncLoadAllEarlierMessages = asyncLoadAllEarlierMessages; - window.WAPI.areAllMessagesLoaded = areAllMessagesLoaded; - window.WAPI.loadEarlierMessagesTillDate = loadEarlierMessagesTillDate; - window.WAPI.getAllGroupMetadata = getAllGroupMetadata; - window.WAPI.getGroupMetadata = getGroupMetadata; - window.WAPI._getGroupParticipants = _getGroupParticipants; - window.WAPI.getGroupParticipantIDs = getGroupParticipantIDs; - window.WAPI.getAllMessagesInChat = getAllMessagesInChat; - window.WAPI.loadAndGetAllMessagesInChat = loadAndGetAllMessagesInChat; - window.WAPI.getUnreadMessages = getUnreadMessages; - window.WAPI.getCommonGroups = getCommonGroups; - window.WAPI.downloadFile = downloadFile; - window.WAPI.getNumberProfile = getNumberProfile; - window.WAPI.getMessageById = getMessageById; - window.WAPI.getMessages = getMessages; - window.WAPI.getFileHash = getFileHash; - window.WAPI.generateMediaKey = generateMediaKey; - window.WAPI.arrayBufferToBase64 = arrayBufferToBase64; - window.WAPI.getListMute = getListMute; - - // Device functions - window.WAPI.getHost = getHost; - window.WAPI.getWid = getWid; - window.WAPI.getMe = getMe; - window.WAPI.isConnected = isConnected; - window.WAPI.isLoggedIn = isLoggedIn; - window.WAPI.getBatteryLevel = getBatteryLevel; - window.WAPI.base64ImageToFile = base64ToFile; - window.WAPI.base64ToFile = base64ToFile; - window.WAPI.sendMute = sendMute; - window.WAPI.startPhoneWatchdog = startPhoneWatchdog; - window.WAPI.stopPhoneWatchdog = stopPhoneWatchdog; - window.WAPI.subscribePresence = subscribePresence; - window.WAPI.unsubscribePresence = unsubscribePresence; - - // business functions - window.WAPI.getBusinessProfilesProducts = getBusinessProfilesProducts; - window.WAPI.getOrderbyMsg = getOrderbyMsg; - - // Listeners initialization - window.WAPI._newMessagesQueue = []; - window.WAPI._newMessagesBuffer = - sessionStorage.getItem('saved_msgs') != null - ? JSON.parse(sessionStorage.getItem('saved_msgs')) - : []; - window.WAPI._newMessagesDebouncer = null; - window.WAPI._newMessagesCallbacks = []; - - // Listeners - window.addEventListener('unload', window.WAPI._unloadInform, false); - window.addEventListener('beforeunload', window.WAPI._unloadInform, false); - window.addEventListener('pageunload', window.WAPI._unloadInform, false); - // On-work below: - - window.WAPI.getProfilePicSmallFromId = async function (id) { - return await WPP.whatsapp.ProfilePicThumbStore.find(id).then( - async function (d) { - if (d.img !== undefined) { - return await window.WAPI.downloadFileWithCredentials(d.img); - } else { - return false; - } - }, - function (e) { - return false; - } - ); - }; - - window.WAPI.getProfilePicFromId = async function (id) { - return await WPP.whatsapp.ProfilePicThumbStore.find(id).then( - async function (d) { - if (d.imgFull !== undefined) { - return await window.WAPI.downloadFileWithCredentials(d.imgFull); - } else { - return false; - } - }, - function (e) { - return false; - } - ); - }; - - window.WAPI.downloadFileWithCredentials = async function (url) { - if (!axios || !url) return false; - const ab = ( - await axios.get(url, { - responseType: 'arraybuffer', - }) - ).data; - return btoa( - new Uint8Array(ab).reduce( - (data, byte) => data + String.fromCharCode(byte), - '' - ) - ); - }; - - window.WAPI._serializeNumberStatusObj = (obj) => { - if (obj == undefined) { - return null; - } - - return Object.assign( - {}, - { - id: obj.jid, - status: obj.status, - isBusiness: obj.biz === true, - canReceiveMessage: obj.status === 200, - } - ); - }; - - window.WAPI.checkNumberStatus = async function (id) { - const result = await WPP.contact.queryExists(id); - - if (!result) { - return { - id: id, - isBusiness: false, - canReceiveMessage: false, - numberExists: false, - status: 404, - }; - } - - return { - id: result.wid, - isBusiness: result.biz, - canReceiveMessage: true, - numberExists: true, - status: 200, - }; - }; - - window.WAPI.getChatIsOnline = async function (chatId) { - const chat = WPP.whatsapp.ChatStore.get(chatId); - if (!chat) { - return false; - } - await chat.presence.subscribe(); - return chat.presence.attributes.isOnline; - }; - - window.WAPI.getLastSeen = async function (chatId) { - const chat = WPP.whatsapp.ChatStore.get(chatId); - if (!chat) { - return false; - } - if (!chat.presence.hasData) { - await chat.presence.subscribe(); - await new Promise((resolve) => setTimeout(resolve, 100)); - } - return chat.presence.chatstate.t || false; - }; - - window.WAPI.getWAVersion = function () { - return window.Debug.VERSION; - }; - - /** - * @param NumberChatsDelete Number of chats that will be deleted - */ - //Add Marcelo 21/10/2023 - window.WAPI.deleteOldChats = async function (NumberChatsDelete) { - const options = { - onlyWithUnreadMessage: false, - onlyUsers: true, - }; - - try { - const chats = await window.WAPI.chat.list(options); - chats.reverse(); - const numChatsToDelete = Math.min(NumberChatsDelete, chats.length); - - for (let i = 0; i < numChatsToDelete; i++) { - await window.WAPI.chat - .delete(chats[i].id._serialized) - .then((_) => true) - .catch((_) => false); - } - } catch (e) { - console.error('Erro:', e); - return e; - } - }; - - /** - * @param id The id of the conversation - * @param archive boolean true => archive, false => unarchive - * @return boolean true: worked, false: didnt work (probably already in desired state) - */ - window.WAPI.archiveChat = async function (id, archive) { - const promise = Store.Archive.setArchive( - WPP.whatsapp.ChatStore.get(id), - archive - ) - .then((_) => true) - .catch((_) => false); - - return await Promise.resolve(promise); - }; - - /** - * @param content Status Message Text - * @param options {backgroundColor: '#0275d8', font: 2} - */ - window.WAPI.sendTextStatus = async function (content, options) { - try { - const result = await WPP.status.sendTextStatus(content, options); - return result; - } catch (err) { - console.log(err); - return err; - } - }; - - /** - * @param base64 data:image/jpeg;base64, - * @param options {backgroundColor: '#0275d8', font: 2} - */ - window.WAPI.sendImageStatus = async function (base64, options) { - try { - const result = await WPP.status.sendImageStatus(base64, options); - return result; - } catch (err) { - console.log(err); - return err; - } - }; - - /** - * @param base64 data:video/mp4;base64, - * @param options {backgroundColor: '#0275d8', font: 2} - */ - window.WAPI.sendVideoStatus = async function (base64, options) { - try { - const result = await WPP.status.sendVideoStatus(base64, options); - return result; - } catch (err) { - console.log(err); - return err; - } - }; - - window.WAPI.takeOver = async function () { - await WPP.whatsapp.Socket.takeover(); - return true; - }; - - /** - * Registers a callback to be called when your phone receives a new call request. - * @param callback - function - Callback function to be called upon a new call. returns a call object. - * @returns {boolean} - */ - window.WAPI.onIncomingCall = function (callback) { - WPP.whatsapp.CallStore.on('add', callback); - return true; - }; - - /** - * Registers a callback to be called when the interface change - * @param callback - function - Callback function to be called upon interface change. returns a call object. - * @returns {boolean} - */ - window.WAPI.onInterfaceChange = function (callback) { - const getData = () => ({ - displayInfo: WPP.whatsapp.Stream.displayInfo, - mode: WPP.whatsapp.Stream.mode, - info: WPP.whatsapp.Stream.info, - }); - callback(getData()); - WPP.whatsapp.Stream.on('change:info change:displayInfo change:mode', () => { - callback(getData()); - }); - return true; - }; - - window.WAPI.setMessagesAdminsOnly = async function (chatId, option) { - await WPP.group.setProperty(chatId, 'announcement', option); - return true; - }; - - window.WAPI.logout = async function () { - return await WPP.conn.logout(); - }; - - /** - * @todo Temporary fix while is not implemented on WA-JS - */ - window.WAPI.isRegistered = function () { - const m = WPP.webpack.search((m) => m.isRegistered); - return m.isRegistered(); - }; - - readyPromise.then(addOnStreamChange); - readyPromise.then(addOnStateChange); - readyPromise.then(initNewMessagesListener); - readyPromise.then(addNewMessagesListener); - readyPromise.then(allNewMessagesListener); - readyPromise.then(addOnNewAcks); - readyPromise.then(addOnAddedToGroup); - readyPromise.then(addOnLiveLocation); - readyPromise.then(addOnParticipantsChange); - readyPromise.then(addOnNotificationMessage); - readyPromise.then(addOnPresenceChanged); -} diff --git a/src/lib/wapi/webpack.config.js b/src/lib/wapi/webpack.config.js deleted file mode 100644 index 295bdffa4..000000000 --- a/src/lib/wapi/webpack.config.js +++ /dev/null @@ -1,39 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -const path = require('path'); - -module.exports = { - entry: ['regenerator-runtime/runtime.js', './wapi.js'], - mode: 'production', - // devtool: 'source-map', - module: { - rules: [ - { - test: /\.m?js$/, - exclude: /(node_modules|bower_components)/, - use: { - loader: 'babel-loader', - }, - }, - ], - }, - output: { - path: path.resolve(__dirname, '../../../dist/lib/wapi'), - filename: 'wapi.js', - }, -}; diff --git a/src/tests/01.qrcode.test.ts b/src/tests/01.qrcode.test.ts deleted file mode 100644 index d8309a33e..000000000 --- a/src/tests/01.qrcode.test.ts +++ /dev/null @@ -1,80 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ -import * as wppconnect from '../index'; -import * as assert from 'assert'; -import { sleep } from '../utils/sleep'; - -describe('QRCode test', function () { - let client: wppconnect.Whatsapp = null; - - this.timeout(20000); - - before(async function () { - if (process.env.SKIP_QR_CODE) { - this.skip(); - } - - wppconnect.defaultLogger.level = 'none'; - - client = await wppconnect.create({ - session: 'qrcode-reader', - waitForLogin: false, - autoClose: 0, - }); - - await client.waitForPageLoad(); - }); - - after(async function () { - if (client) { - await client.close(); - } - }); - - it('Get QRCode', async function () { - const result = await client.getQrCode(); - assert.ok(result); - assert.ok(result.urlCode); - assert.ok(result.base64Image); - }); - - it('Await QRCode change', async function () { - this.timeout(60000); - - const first = await client.getQrCode(); - await sleep(25000); - const second = await client.getQrCode(); - - assert.ok(second); - assert.ok(second.urlCode !== first.urlCode); - assert.ok(second.base64Image !== first.base64Image); - }); - - it('Await QRCode reload button', async function () { - this.timeout(8 * 20000 + 20000); - - const result = await new Promise((resolve) => { - client.waitForQrCodeScan((q, a, attempt) => { - if (attempt > 6) { - resolve(true); - } - }); - }); - - assert.ok(result); - }); -}); diff --git a/src/tests/02.basic.test.ts b/src/tests/02.basic.test.ts deleted file mode 100644 index 816f8cacb..000000000 --- a/src/tests/02.basic.test.ts +++ /dev/null @@ -1,156 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ -import * as assert from 'assert'; -import { describeAuthenticatedTest, testUserId } from './common'; - -describeAuthenticatedTest('Basic functions', function (getClient) { - it('getAllChats', function (done) { - getClient() - .getAllChats() - .then((result) => { - assert.ok(result); - done(); - }); - }); - - it('getAllGroups', function (done) { - getClient() - .getAllGroups() - .then((result) => { - assert.ok(result); - done(); - }); - }); - - it('getNumberProfile', async function () { - const result = await getClient().getNumberProfile(testUserId); - assert.ok(result); - }); - - it('getAllUnreadMessages', async function () { - const result = await getClient().getAllUnreadMessages(); - assert.ok(result); - }); - - it('getAllContacts', async function () { - const result = await getClient().getAllContacts(); - assert.ok(result); - }); - - it('getAllChatsWithMessages', async function () { - const result = await getClient().getAllChatsWithMessages(); - assert.ok(result); - }); - - it('getAllMessagesInChat', async function () { - const result = await getClient().getAllMessagesInChat( - testUserId, - true, - false - ); - assert.ok(result); - }); - - it('getAllUnreadMessages', async function () { - const result = await getClient().getAllUnreadMessages(); - assert.ok(result); - }); - - it('getBatteryLevel', async function () { - const result = await getClient().getBatteryLevel(); - assert.ok(result); - }); - - it('getBlockList', async function () { - const result = await getClient().getBlockList(); - assert.ok(result); - }); - - it('getChatById', async function () { - const result = await getClient().getChatById(testUserId); - assert.ok(result); - }); - - it('getChatIsOnline', async function () { - const result = await getClient().getChatIsOnline(testUserId); - assert.ok(typeof result === 'boolean'); - }); - - it('getConnectionState', async function () { - const result = await getClient().getConnectionState(); - assert.ok(result); - }); - - it('getContact', async function () { - const result = await getClient().getContact(testUserId); - assert.ok(result); - }); - - it('getHostDevice', async function () { - const result = await getClient().getHostDevice(); - assert.ok(result); - }); - - it('getLastSeen', async function () { - const result = await getClient().getLastSeen(testUserId); - assert.ok(result); - }); - - it('getListMutes', async function () { - const result = await getClient().getListMutes(); - assert.ok(result); - }); - - // it('getMessageById', async function () { - // const result = await getClient().getMessageById(); - // assert.ok(result); - // }); - - it('getProfilePicFromServer', async function () { - const result = await getClient().getProfilePicFromServer(testUserId); - assert.ok(result); - }); - - it('getStatus', async function () { - const result = await getClient().getStatus(testUserId); - assert.ok(result); - }); - - it('getTheme', async function () { - const result = await getClient().getTheme(); - assert.ok(result); - }); - - it('getWAVersion', async function () { - const result = await getClient().getWAVersion(); - assert.ok(result); - }); - - it('loadAndGetAllMessagesInChat', async function () { - const result = await getClient().loadAndGetAllMessagesInChat( - testUserId, - true, - true - ); - assert.ok(result); - }); - - it('sendText', async function () { - const result = await getClient().sendText(testUserId, 'Send Text'); - assert.ok(result); - }); -}); diff --git a/src/tests/03.group.test.ts b/src/tests/03.group.test.ts deleted file mode 100644 index c0ae756ae..000000000 --- a/src/tests/03.group.test.ts +++ /dev/null @@ -1,56 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ -import * as assert from 'assert'; -import { describeAuthenticatedTest, testGroupID } from './common'; - -describeAuthenticatedTest('Group functions', function (getClient) { - before(function () { - if (!testGroupID) { - this.skip(); - } - }); - - it('getGroupAdmins', async function () { - const result = await getClient().getGroupAdmins(testGroupID); - assert.ok(result); - }); - - it('getGroupInfoFromInviteLink', async function () { - const result = await getClient().getGroupInfoFromInviteLink(testGroupID); - assert.ok(result); - }); - - it('getGroupInviteLink', async function () { - const result = await getClient().getGroupInviteLink(testGroupID); - assert.ok(result); - }); - - it('getGroupMembers', async function () { - const result = await getClient().getGroupMembers(testGroupID); - assert.ok(result); - }); - - it('getGroupMembersIds', async function () { - const result = await getClient().getGroupMembersIds(testGroupID); - assert.ok(result); - }); - - // it('joinGroup', async function () { - // const result = await getClient().joinGroup(); - // assert.ok(result); - // }); -}); diff --git a/src/tests/04.chat.test.ts b/src/tests/04.chat.test.ts deleted file mode 100644 index 36a5ed340..000000000 --- a/src/tests/04.chat.test.ts +++ /dev/null @@ -1,187 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ -import * as assert from 'assert'; -import { sleep } from '../utils/sleep'; -import { describeAuthenticatedTest, testUserId } from './common'; - -describeAuthenticatedTest('Chat functions', function (getClient) { - it('star message', async function () { - const client = getClient(); - - await client.sendText(testUserId, 'Message 1'); - const msg2 = await client.sendText(testUserId, 'Message 2'); - await client.sendText(testUserId, 'Message 3'); - - let msg = await client.getMessageById(msg2.id); - assert.strictEqual(msg.star, false); - - let result = await client.starMessage(msg2.id, true); - assert.strictEqual(result, 1); - - // Star a starred message - result = await client.starMessage(msg2.id, true); - assert.strictEqual(result, 0); - - msg = await client.getMessageById(msg2.id); - assert.strictEqual(msg.star, true); - - result = await client.starMessage(msg2.id, false); - assert.strictEqual(result, 1); - - // Unstar a unstarred message - result = await client.starMessage(msg2.id, false); - assert.strictEqual(result, 0); - - msg = await client.getMessageById(msg2.id); - assert.strictEqual(msg.star, false); - }); - - it('clear chat', async function () { - const client = getClient(); - - const host = await client.getHostDevice(); - - const chatId = host.wid._serialized; - - const msgs1 = await client.getAllMessagesInChat(chatId, true, false); - - await client.sendText(chatId, 'Message 1'); - const msg2 = await client.sendText(chatId, 'Message 2'); - await client.sendText(chatId, 'Message 3'); - - await sleep(2000); - - await client.starMessage(msg2.id, true); - - await sleep(2000); - - const msgs2 = await client.getAllMessagesInChat(chatId, true, false); - - assert.ok(msgs2.length > msgs1.length); - - await sleep(2000); - - await client.clearChat(chatId, true); - - await sleep(2000); - - const msgs3 = await client.getAllMessagesInChat(chatId, true, false); - assert.strictEqual(msgs3.length, 1); - - await client.clearChat(chatId, false); - - await sleep(2000); - - const msgs4 = await client.getAllMessagesInChat(chatId, true, false); - assert.strictEqual(msgs4.length, 0); - }); - - it('forward a single message', async function () { - const client = getClient(); - - const host = await client.getHostDevice(); - - assert.ok(host); - - const msg = await client.sendText( - host.wid._serialized, - 'Message to forward' - ); - - const r = await client.forwardMessages(testUserId, msg.id, false); - - assert.strictEqual(r.length, 1); - - const fmsg = await client.getMessageById(r[0]); - - assert.strictEqual(fmsg.body, 'Message to forward'); - }); - - it('forward multiple messages', async function () { - const client = getClient(); - - const host = await client.getHostDevice(); - - assert.ok(host); - - const msg1 = await client.sendText( - host.wid._serialized, - 'Message 1 to forward' - ); - const msg2 = await client.sendText( - host.wid._serialized, - 'Message 2 to forward' - ); - - const r = await client.forwardMessages( - testUserId, - [msg1.id, msg2.id], - false - ); - - assert.strictEqual(r.length, 2); - - const fmsg1 = await client.getMessageById(r[0]); - const fmsg2 = await client.getMessageById(r[1]); - - assert.strictEqual(fmsg1.body, 'Message 1 to forward'); - assert.strictEqual(fmsg2.body, 'Message 2 to forward'); - }); - - it('archive chat', async function () { - const client = getClient(); - - // Ensure chat is not archived - await client.sendText(testUserId, 'unarchive chat'); - - await sleep(1000); - let chat = await client.getChatById(testUserId); - - assert.strictEqual(chat.archive, false); - - // ensure the first archive is OK - let result = await client.archiveChat(testUserId, true); - - assert.strictEqual(result, true); - - await sleep(1000); - // ensure the second archive is not OK - result = await client.archiveChat(testUserId, true); - - assert.strictEqual(result, false); - - await sleep(1000); - chat = await client.getChatById(testUserId); - - assert.strictEqual(chat.archive, true); - - // ensure the first unarchive is OK - result = await client.archiveChat(testUserId, false); - - assert.strictEqual(result, true); - - await sleep(1000); - chat = await client.getChatById(testUserId); - - assert.strictEqual(chat.archive, false); - - // ensure the second unarchive is not OK - result = await client.archiveChat(testUserId, false); - - assert.strictEqual(result, false); - }); -}); diff --git a/src/tests/common.ts b/src/tests/common.ts deleted file mode 100644 index 2a02761cd..000000000 --- a/src/tests/common.ts +++ /dev/null @@ -1,66 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ -import { Suite } from 'mocha'; -import * as wppconnect from '../'; - -export const testUserId = process.env.TEST_USER_ID; -export const testGroupID = process.env.TEST_GROUP_ID; - -export function describeAuthenticatedTest( - title: string, - fn: (this: Suite, getClient: () => wppconnect.Whatsapp) => void -) { - describe(title, async function () { - let client: wppconnect.Whatsapp; - - if (testUserId) { - this.timeout(60000); - } - - before(async function () { - if (!testUserId) { - console.warn( - 'Please, set environment variable TEST_USER_ID to run authenticated tests' - ); - return this.skip(); - } - wppconnect.defaultLogger.level = 'none'; - client = await wppconnect.create({ - session: 'test-authenticated', - updatesLog: false, - disableWelcome: true, - waitForLogin: false, - }); - const authenticated = await client.waitForLogin().catch(() => false); - - if (!authenticated) { - console.warn( - 'Please, set create a authenticated session for "test-authenticated".' - ); - return this.skip(); - } - }); - - after(async function () { - if (client) { - await client.close().catch(() => null); - } - }); - - fn.call(this, () => client); - }); -} diff --git a/src/token-store/fileTokenStore.ts b/src/token-store/fileTokenStore.ts deleted file mode 100644 index e579e2f69..000000000 --- a/src/token-store/fileTokenStore.ts +++ /dev/null @@ -1,203 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ -/// -import * as fs from 'fs'; -import * as path from 'path'; -import sanitize from 'sanitize-filename'; -import { defaultLogger } from '../utils/logger'; -import { isValidSessionToken } from './isValidSessionToken'; -import { SessionToken, TokenStore } from './types'; - -export interface FileTokenStoreOptions { - /** - * Decode function to parse token file (Default `JSON.parse`) {@link defaultFileTokenStoreOptions} - * @default `JSON.parse` - */ - decodeFunction: (text: string) => any; - - /** - * Encode function to save tokens (Default `JSON.stringify`) - * @default `JSON.stringify` - */ - encodeFunction: (data: any) => string; - - /** - * Encoding used to read and save files - * @default 'utf8' - */ - encoding: BufferEncoding; - - /** - * @default '.data.json' - */ - fileExtension: string; - - /** - * Folder path to store tokens - * @default './tokens' - */ - path: string; -} - -export const defaultFileTokenStoreOptions: FileTokenStoreOptions = { - decodeFunction: JSON.parse, - encodeFunction: JSON.stringify, - encoding: 'utf8', - fileExtension: '.data.json', - path: './tokens', -}; - -/** - * Token Store using file - * - * ```typescript - * // Example of typescript with FileTokenStore - * import * as wppconnect from '@wppconnect-team/wppconnect'; - * - * const myTokenStore = new wppconnect.tokenStore.FileTokenStore({ - * // decodeFunction: JSON.parse, - * // encodeFunction: JSON.stringify, - * // encoding: 'utf8', - * // fileExtension: '.my.ext', - * // path: './a_custom_path', - * }); - * - * wppconnect.create({ - * session: 'mySession', - * tokenStore: myTokenStore, - * }); - * - * wppconnect.create({ - * session: 'otherSession', - * tokenStore: myTokenStore, - * }); - * ``` - */ -export class FileTokenStore implements TokenStore { - protected options: FileTokenStoreOptions; - - constructor(options: Partial = {}) { - this.options = Object.assign( - {}, - defaultFileTokenStoreOptions, - options - ) as FileTokenStoreOptions; - } - - /** - * Resolve the path of file - * @param sessionName Name of session - * @returns Full path of token file - */ - protected resolverPath(sessionName: string): string { - const filename = sanitize(sessionName) + this.options.fileExtension; - return path.resolve(process.cwd(), path.join(this.options.path, filename)); - } - - public async getToken( - sessionName: string - ): Promise { - const filePath = this.resolverPath(sessionName); - - if (!fs.existsSync(filePath)) { - return undefined; - } - - const text = await fs.promises - .readFile(filePath, { - encoding: this.options.encoding, - }) - .catch(() => null); - - if (!text) { - return undefined; - } - - try { - return this.options.decodeFunction(text); - } catch (error) { - defaultLogger.debug(error); - return undefined; - } - } - - public async setToken( - sessionName: string, - tokenData: SessionToken | null - ): Promise { - if (!tokenData || !isValidSessionToken(tokenData)) { - return false; - } - - if (!fs.existsSync(this.options.path)) { - await fs.promises.mkdir(this.options.path, { recursive: true }); - } - - const filePath = this.resolverPath(sessionName); - - try { - const text = this.options.encodeFunction(tokenData); - - await fs.promises.writeFile(filePath, text, { - encoding: this.options.encoding, - }); - return true; - } catch (error) { - defaultLogger.debug(error); - return false; - } - } - - public async removeToken(sessionName: string): Promise { - const filePath = this.resolverPath(sessionName); - - if (!fs.existsSync(filePath)) { - return false; - } - - try { - await fs.promises.unlink(filePath); - return true; - } catch (error) { - defaultLogger.debug(error); - return false; - } - } - - public async listTokens(): Promise { - if (!fs.existsSync(this.options.path)) { - return []; - } - - try { - let files = await fs.promises.readdir(this.options.path); - - // Only sessions with same fileExtension - files = files.filter((file) => file.endsWith(this.options.fileExtension)); - - // Return name only - files = files.map((file) => - path.basename(file, this.options.fileExtension) - ); - - return files; - } catch (error) { - defaultLogger.debug(error); - return []; - } - } -} diff --git a/src/token-store/index.ts b/src/token-store/index.ts deleted file mode 100644 index 2972f7cb4..000000000 --- a/src/token-store/index.ts +++ /dev/null @@ -1,21 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ -export * from './fileTokenStore'; -export * from './isValidSessionToken'; -export * from './isValidTokenStore'; -export * from './memoryTokenStore'; -export * from './types'; diff --git a/src/token-store/isValidSessionToken.ts b/src/token-store/isValidSessionToken.ts deleted file mode 100644 index faedb0a8f..000000000 --- a/src/token-store/isValidSessionToken.ts +++ /dev/null @@ -1,38 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ -import { SessionToken } from './types'; - -/** - * Validate the object to check is a valid token - * @param token Token to validate - * @returns Token is valid - */ -export function isValidSessionToken(token: any): token is SessionToken { - const requiredAttribbutes = [ - 'WABrowserId', - 'WASecretBundle', - 'WAToken1', - 'WAToken2', - ]; - - return ( - token && - requiredAttribbutes.every( - (attr) => typeof token[attr] === 'string' && token[attr].length > 0 - ) - ); -} diff --git a/src/token-store/isValidTokenStore.ts b/src/token-store/isValidTokenStore.ts deleted file mode 100644 index 49566c2ee..000000000 --- a/src/token-store/isValidTokenStore.ts +++ /dev/null @@ -1,28 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ -import { TokenStore } from './types'; - -const keys = ['getToken', 'setToken', 'removeToken', 'listTokens']; - -/** - * Check and validate if the object implements the TokenStore interface - * @param object Object to check that implements the TokenStore interface - * @returns true if the object is a valid else false - */ -export function isValidTokenStore(object: any): object is TokenStore { - return keys.every((k) => k in object && typeof object[k] === 'function'); -} diff --git a/src/token-store/memoryTokenStore.ts b/src/token-store/memoryTokenStore.ts deleted file mode 100644 index d385de91c..000000000 --- a/src/token-store/memoryTokenStore.ts +++ /dev/null @@ -1,66 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ -import { SessionToken, TokenStore } from './types'; - -/** - * Token Store using im memory - * - * ```typescript - * // Example of typescript with MemoryTokenStore - * import * as wppconnect from '@wppconnect-team/wppconnect'; - * - * const myTokenStore = new wppconnect.tokenStore.MemoryTokenStore(); - * - * wppconnect.create({ - * session: 'mySession', - * tokenStore: myTokenStore, - * }); - * - * wppconnect.create({ - * session: 'otherSession', - * tokenStore: myTokenStore, - * }); - * ``` - */ -export class MemoryTokenStore implements TokenStore { - protected tokens: { - [key: string]: any; - } = {}; - - public getToken(sessionName: string): SessionToken | undefined { - return this.tokens[sessionName]; - } - public setToken( - sessionName: string, - tokenData: SessionToken | null - ): boolean { - if (!tokenData) { - return false; - } - this.tokens[sessionName] = tokenData; - - return true; - } - public removeToken(sessionName: string): boolean { - delete this.tokens[sessionName]; - return true; - } - - public listTokens(): string[] { - return Object.keys(this.tokens); - } -} diff --git a/src/token-store/types.ts b/src/token-store/types.ts deleted file mode 100644 index 242951ef3..000000000 --- a/src/token-store/types.ts +++ /dev/null @@ -1,136 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -/** - * Session token of WhatsApp to authenticate the web interface - * ```typescript - * // Example of SessionToken - * { - * WABrowserId: '"UnXjH....."', - * WASecretBundle: '{"key":"+i/nRgWJ....","encKey":"kGdMR5t....","macKey":"+i/nRgW...."}', - * WAToken1: '"0i8...."', - * WAToken2: '"1@lPpzwC...."', - * } - * ``` - */ -export interface SessionToken { - WABrowserId: string; - WAToken1: string; - WAToken2: string; - WASecretBundle: string; -} - -/** - * Standard interface to manage tokens - * - * ```typescript - * // Example of typescript with TokenStore and redis - * import * as wppconnect from '@wppconnect-team/wppconnect'; - * import * as redis from 'redis'; - * - * const redisClient = redis.createClient(6379, '127.0.0.1'); - * - * // Base of interface: - * const myTokenStore: wppconnect.tokenStore.TokenStore = { - * getToken: (sessionName: string) => { - * // Your logic here - * }), - * setToken: (sessionName: string, tokenData: wppconnect.tokenStore.SessionToken) => { - * // Your logic here - * }), - * removeToken: (sessionName: string) => { - * // Your logic here - * }), - * listTokens: () => { - * // Your logic here - * }), - * }; - * - * // Example with redis - * const myTokenStore: wppconnect.tokenStore.TokenStore = { - * getToken: (sessionName: string) => - * new Promise((resolve, reject) => { - * redisClient.get(sessionName, (err, reply) => { - * if (err) { - * return reject(err); - * } - * resolve(JSON.parse(reply)); - * }); - * }), - * setToken: (sessionName: string, tokenData: wppconnect.tokenStore.SessionToken) => - * new Promise((resolve) => { - * redisClient.set(sessionName, JSON.stringify(tokenData), (err, reply) => { - * return resolve(err ? false : true); - * }); - * }), - * removeToken: (sessionName: string) => - * new Promise((resolve) => { - * redisClient.del(sessionName, (err) => { - * return resolve(err ? false : true); - * }); - * }), - * listTokens: () => - * new Promise((resolve) => { - * redisClient.keys('*', (err, keys) => { - * if (err) { - * return resolve([]); - * } - * return resolve(keys); - * }); - * }), - * }; - * - * wppconnect.create({ - * session: 'mySession', - * tokenStore: myTokenStore, - * }); - * - * wppconnect.create({ - * session: 'otherSession', - * tokenStore: myTokenStore, - * }); - * ``` - */ -export interface TokenStore { - /** - * Return the session data if exists - * @param sessionName Name of session - */ - getToken(sessionName: string): Promise | T | undefined; - - /** - * Store the session token data - * @param sessionName Name of session - * @param tokenData Session token data - */ - setToken( - sessionName: string, - tokenData: T | null - ): Promise | boolean; - - /** - * Remove the session - * @param sessionName Name of session - * @returns Token was removed - */ - removeToken(sessionName: string): Promise | boolean; - - /** - * A liste of avaliable sessions - */ - listTokens(): Promise | string[]; -} diff --git a/src/types/Evaluate.d.ts b/src/types/Evaluate.d.ts deleted file mode 100644 index 3b63d4a23..000000000 --- a/src/types/Evaluate.d.ts +++ /dev/null @@ -1,28 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export declare type EvaluateFn = - | string - | ((arg1: T, ...args: U[]) => V); - -export declare type EvaluateFnReturnType = T extends ( - ...args: any[] -) => infer R - ? R - : any; - -export declare type SerializableOrJSHandle = Serializable | JSHandle; diff --git a/src/types/WAPI.d.ts b/src/types/WAPI.d.ts deleted file mode 100644 index 66708a841..000000000 --- a/src/types/WAPI.d.ts +++ /dev/null @@ -1,207 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -import { - Chat, - Contact, - ContactStatus, - GetMessagesParam, - GroupCreation, - HostDevice, - Id, - Message, - PartialMessage, - PresenceEvent, - ProfilePicThumbObj, - SendFileResult, - SendLinkResult, - SendPttResult, - SendStickerResult, - WhatsappProfile, -} from '../api/model'; -import { SessionToken } from '../token-store'; - -interface WAPI { - allNewMessagesListener: (callback: Function) => void; - archiveChat: (chatId: string, option: boolean) => boolean; - arrayBufferToBase64: (buffer: ArrayBuffer) => string; - checkNumberStatus: (contactId: string) => Promise; - downloadFile: (data: string) => Promise; - forwardMessage: ( - toChatId: string | Wid, - msgId: string | MsgKey, - options?: { - displayCaptionText?: boolean; - multicast?: boolean; - } - ) => boolean; - getAllChats: () => Chat[]; - getAllChatsWithMessages: (withNewMessageOnly?: boolean) => Chat[]; - getAllChatsWithNewMsg: () => Chat[]; - getAllContacts: () => Contact[]; - getAllMessagesInChat: ( - chatId: string, - includeMe: boolean, - includeNotifications: boolean - ) => Message[]; - getAllNewMessages: () => Message[]; - getAllUnreadMessages: () => PartialMessage[]; - getBatteryLevel: () => number; - getBusinessProfilesProducts: (to: string) => any; - getOrderbyMsg: (messageId: string) => any; - getChat: (contactId: string) => Chat; - getChatById: (contactId: string) => Chat; - getChatIsOnline: (chatId: string) => Promise; - getLastSeen: (chatId: string) => Promise; - getContact: (contactId: string) => Contact; - getGroupParticipantIDs: (groupId: string) => Id[]; - getHost: () => HostDevice; - getWid: () => string; - getListMute: (type?: string) => object; - getMessageById: (messageId: string) => Promise; - getMessages: (chatId: string, params: GetMessagesParam) => Promise; - getNumberProfile: (contactId: string) => WhatsappProfile; - getSessionTokenBrowser: (removePath?: boolean) => SessionToken; - getTheme: () => string; - getUnreadMessages: ( - includeMe: boolean, - includeNotifications: boolean, - useUnreadCount: boolean - ) => any; - getWAVersion: () => string; - isConnected: () => boolean; - isLoggedIn: () => boolean; - isRegistered: () => boolean; - joinGroup: (groupId: string) => Promise; - leaveGroup: (groupId: string) => any; - loadAndGetAllMessagesInChat: ( - chatId: string, - includeMe: boolean, - includeNotifications: boolean - ) => Message[]; - loadEarlierMessages: (contactId: string) => Message[]; - logout: () => Promise; - onAddedToGroup: (callback: Function) => any; - onIncomingCall: (callback: Function) => any; - onInterfaceChange: (callback: Function) => void; - onLiveLocation: (callback: Function) => any; - onNotificationMessage: (callback: (message: Message) => void) => any; - onParticipantsChanged: (groupId: string, callback: Function) => any; - onStateChange: (callback: Function) => void; - onStreamChange: (callback: Function) => void; - onPresenceChanged: (callback: (presence: PresenceEvent) => void) => void; - pinChat: ( - chatId: string, - option: boolean, - nonExistent?: boolean - ) => Promise; - sendChatstate: (chatState: string, chatId: string) => void; - sendFile: ( - base64: string, - to: string, - filename: string, - caption: string, - type?: string, - quotedMessageId?: string, - isViewOnce?: boolean - ) => Promise; - sendImage: ( - imgBase64: string, - to: string, - filename: string, - caption?: string, - quotedMessageId?: string, - isViewOnce?: boolean - ) => Promise; - sendImageWithProduct: ( - base64: string, - to: string, - caption: string, - bizNumber: string, - productId: string - ) => any; - sendLinkPreview: ( - chatId: string, - url: string, - title: string - ) => Promise; - sendLocation: ( - to: string, - latitude: string, - longitude: string, - title: string - ) => Promise; - sendMessage: (to: string, content: string) => Promise; - sendMessageOptions: ( - chat: any, - content: any, - options?: any - ) => Promise; - sendMessageWithThumb: ( - thumb: string, - url: string, - title: string, - description: string, - chatId: string - ) => void; - sendMute: (id: string, time: number, type: string) => Promise; - sendPtt: ( - base64: string, - to: string, - filename: string, - caption: string, - done: () => void, - quotedMessageId?: string - ) => Promise; - sendVideoAsGif: ( - base64: string, - to: string, - filename: string, - caption: string - ) => void; - setMessagesAdminsOnly: (chatId: string, option: boolean) => boolean; - setMyName: (name: string) => void; - setOnlinePresence: (online: boolean) => void; - setProfilePic: (path: string, to?: string) => Promise; - setTemporaryMessages: (chatId: string, value: string) => Promise; - setTheme: (theme?: string) => boolean; - starMessages: ( - messagesId: string[] | string, - star: boolean - ) => Promise; - startPhoneWatchdog: (interval: number) => void; - stopPhoneWatchdog: () => void; - subscribePresence: (id: string | string[]) => Promise; - takeOver: () => boolean; - unsubscribePresence: (id: string | string[]) => Promise; - waitNewAcknowledgements: (callback: Function) => void; - waitNewMessages: (rmCallback: boolean, callback: Function) => void; - _profilePicfunc: (contactId: string) => Promise; - _serializeChatObj: (chat: any) => any; - processMessageObj: ( - messageObj: any, - includeMe: boolean, - includeNotifications: boolean - ) => any; -} - -declare global { - interface Window { - WAPI: WAPI; - } - const WAPI: WAPI; -} diff --git a/src/utils/ffmpeg.ts b/src/utils/ffmpeg.ts deleted file mode 100644 index 21b505464..000000000 --- a/src/utils/ffmpeg.ts +++ /dev/null @@ -1,123 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ -import execa from 'execa'; -import * as fs from 'fs'; -import * as path from 'path'; -import rimraf from 'rimraf'; -import * as tmp from 'tmp'; -import { lookpath } from 'lookpath'; - -const tmpDir = tmp.dirSync({}); - -let i = 0; - -process.on('exit', () => { - // Remove only on exit signal - try { - // Use rimraf because it is synchronous - rimraf.sync(tmpDir.name); - } catch (error) {} -}); - -export async function getFfmpegPath() { - let ffmpegPath = process.env['FFMPEG_PATH']; - - if (ffmpegPath) { - const isExecutable = await fs.promises - .access(ffmpegPath, fs.constants.X_OK) - .then(() => true) - .catch(() => false); - - if (isExecutable) { - return ffmpegPath; - } - } - - ffmpegPath = await lookpath('ffmpeg', { - include: [ - 'C:\\FFmpeg\\bin', - 'C:\\FFmpeg\\FFmpeg\\bin', - 'C:\\Program Files\\ffmpeg\\bin', - 'C:\\Program Files (x86)\\ffmpeg\\bin', - ], - }); - - if (!ffmpegPath) { - try { - ffmpegPath = require('ffmpeg-static'); - } catch (error) {} - } - - if (!ffmpegPath) { - throw new Error( - 'Error: FFMPEG not found. Please install ffmpeg or define the env FFMPEG_PATH or install ffmpeg-static' - ); - } - - return ffmpegPath; -} - -/** - * Convert a file to a compatible MP4-GIF for WhatsApp - * @param inputBase64 Gif in base64 format - * @returns base64 of a MP4-GIF for WhatsApp - */ -export async function convertToMP4GIF(inputBase64: string): Promise { - const inputPath = path.join(tmpDir.name, `${i++}`); - const outputPath = path.join(tmpDir.name, `${i++}.mp4`); - - if (inputBase64.includes(',')) { - inputBase64 = inputBase64.split(',')[1]; - } - - fs.writeFileSync(inputPath, Buffer.from(inputBase64, 'base64')); - - /** - * fluent-ffmpeg is a good alternative, - * but to work with MP4 you must use fisical file or ffmpeg will not work - * Because of that, I made the choice to use temporary file - */ - const ffmpegPath = await getFfmpegPath(); - - try { - const out = await execa(ffmpegPath, [ - '-i', - inputPath, - '-movflags', - 'faststart', - '-pix_fmt', - 'yuv420p', - '-vf', - 'scale=trunc(iw/2)*2:trunc(ih/2)*2', - '-f', - 'mp4', - outputPath, - ]); - - if (out.exitCode === 0) { - const outputBase64 = fs.readFileSync(outputPath); - return 'data:video/mp4;base64,' + outputBase64.toString('base64'); - } - - throw out.stderr; - } finally { - rimraf(inputPath, () => null); - rimraf(outputPath, () => null); - } - - return ''; -} diff --git a/src/utils/logger.ts b/src/utils/logger.ts deleted file mode 100644 index fbda03650..000000000 --- a/src/utils/logger.ts +++ /dev/null @@ -1,67 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ -import { config, createLogger, format, transports } from 'winston'; -import { FormatWrap, TransformableInfo } from 'logform'; - -export type LogLevel = - | 'error' - | 'warn' - | 'info' - | 'http' - | 'verbose' - | 'debug' - | 'silly'; - -export interface MetaInfo { - session?: string; - type?: string; -} - -export interface SessionInfo extends TransformableInfo, MetaInfo {} - -export const formatLabelSession: FormatWrap = format( - (info: SessionInfo, opts?: any) => { - const parts = []; - if (info.session) { - parts.push(info.session); - delete info.session; - } - if (info.type) { - parts.push(info.type); - delete info.type; - } - - if (parts.length) { - let prefix = parts.join(':'); - info.message = `[${prefix}] ${info.message}`; - } - return info; - } -); - -export const defaultLogger = createLogger({ - level: 'silly', - levels: config.npm.levels, - format: format.combine( - formatLabelSession(), - format.colorize(), - format.padLevels(), - format.simple() - ), - // defaultMeta: { service: 'venon-bot' }, - transports: [new transports.Console()], -}); diff --git a/src/utils/semver.ts b/src/utils/semver.ts deleted file mode 100644 index e3f40b2f9..000000000 --- a/src/utils/semver.ts +++ /dev/null @@ -1,45 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -const VPAT = /^\d+(\.\d+){0,2}$/; - -/** - * Compares two versions - * @return true if local is up to date, false otherwise - * @param local - * @param remote - */ -export function upToDate(local: string, remote: string) { - if (!local || !remote || local.length === 0 || remote.length === 0) - return false; - if (local == remote) return true; - if (VPAT.test(local) && VPAT.test(remote)) { - const lparts = local.split('.'); - while (lparts.length < 3) lparts.push('0'); - const rparts = remote.split('.'); - while (rparts.length < 3) rparts.push('0'); - for (let i = 0; i < 3; i++) { - const l = parseInt(lparts[i], 10); - const r = parseInt(rparts[i], 10); - if (l === r) continue; - return l > r; - } - return true; - } else { - return local >= remote; - } -} diff --git a/src/utils/sleep.ts b/src/utils/sleep.ts deleted file mode 100644 index d19a17b03..000000000 --- a/src/utils/sleep.ts +++ /dev/null @@ -1,20 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export function sleep(time: number): Promise { - return new Promise((resolve: TimerHandler) => setTimeout(resolve, time)); -} diff --git a/tsconfig.json b/tsconfig.json deleted file mode 100644 index cfecd74d3..000000000 --- a/tsconfig.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "compilerOptions": { - /* Basic Options */ - "target": "es5" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */, - "resolveJsonModule": true, - "module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */, - // "lib": [], /* Specify library files to be included in the compilation. */ - // "allowJs": true, /* Allow javascript files to be compiled. */ - // "checkJs": true, /* Report errors in .js files. */ - // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ - "declaration": true /* Generates corresponding '.d.ts' file. */, - // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ - "sourceMap": false /* Generates corresponding '.map' file. */, - // "outFile": "./", /* Concatenate and emit output to single file. */ - "outDir": "./dist" /* Redirect output structure to the directory. */, - // "rootDir": "./src/", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ - // "composite": true, /* Enable project compilation */ - "removeComments": false /* Do not emit comments to output. */, - // "noEmit": true, /* Do not emit outputs. */ - // "importHelpers": true, /* Import emit helpers from 'tslib'. */ - // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ - // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ - - /* Strict Type-Checking Options */ - // "strict": true, /* Enable all strict type-checking options. */ - // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ - // "strictNullChecks": true, /* Enable strict null checks. */ - // "strictFunctionTypes": true, /* Enable strict checking of function types. */ - // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ - // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ - // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ - - /* Additional Checks */ - // "noUnusedLocals": true, /* Report errors on unused locals. */ - // "noUnusedParameters": true, /* Report errors on unused parameters. */ - // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ - // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ - - /* Module Resolution Options */ - // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ - // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ - // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ - // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ - // "typeRoots": [], /* List of folders to include type definitions from. */ - "types": [ - "./src/types/WAPI", - "@types/mocha" - ] /* Type declaration files to be included in compilation. */, - // "allowSyntheticDefaultImports": true /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */, - "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */, - // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ - "skipLibCheck": true, - - /* Source Map Options */ - // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ - // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ - // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ - // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ - - /* Experimental Options */ - "experimentalDecorators": true /* Enables experimental support for ES7 decorators. */, - "emitDecoratorMetadata": true /* Enables experimental support for emitting type metadata for decorators. */ - }, - "include": ["src/**/*"], - "exclude": ["img/*", "src/tests/**/*"] -} diff --git a/typedoc.json b/typedoc.json deleted file mode 100644 index 811de49e8..000000000 --- a/typedoc.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "$schema": "https://typedoc.org/schema.json", - "disableSources": false, - "entryPoints": ["src/index.ts"], - "excludeExternals": false, - "excludePrivate": true, - "excludeProtected": true, - "includeVersion": true, - "out": "api-docs", - "gaID": "G-LTZL26963K", - "visibilityFilters": { - "external": false - } -} From 7084e22888bd8e83d6030860d4e614b209d919db Mon Sep 17 00:00:00 2001 From: gekkedev <17025257+gekkedev@users.noreply.github.com> Date: Wed, 12 Jun 2024 14:11:08 +0000 Subject: [PATCH 07/12] Reapply "typo in path" This reverts commit d68afa37eb0d093657a3b718872e4339ce9d0512. --- .codebeatignore | 3 + .commitlintrc.json | 13 + .eslintrc.js | 100 + .github/FUNDING.yml | 2 + .github/ISSUE_TEMPLATE/bug_report.md | 41 + .github/ISSUE_TEMPLATE/feature_request.md | 17 + .github/ISSUE_TEMPLATE/support_question.md | 20 + .github/PULL_REQUEST_TEMPLATE.md | 8 + .github/renovate.json | 72 + .github/workflows/build.yml | 41 + .github/workflows/codeql-analysis.yml | 71 + .github/workflows/commitlint.yml | 16 + .github/workflows/lint.yml | 41 + .github/workflows/nightly.yml | 84 + .github/workflows/publish.yml | 81 + .github/workflows/release.yml | 48 + .gitignore | 19 + .husky/.gitignore | 1 + .husky/commit-msg | 4 + .husky/pre-commit | 4 + .npmignore | 24 + .npmrc | 1 + .prettierignore | 2 + .prettierrc | 11 + .release-it.yml | 15 + .vscode/extensions.json | 6 + .vscode/settings.json | 9 + CHANGELOG.md | 612 + CONTRIBUTING.md | 3 + LICENSE.md | 157 + README.md | 94 + Update.md | 5 + docs/getting-started/basic-functions.md | 325 + docs/getting-started/configuring-logger.md | 87 + docs/getting-started/creating-client.md | 188 + docs/getting-started/installation.md | 13 + docs/getting-started/receiving-messages.md | 30 + examples/basic/.gitignore | 4 + examples/basic/README.md | 15 + examples/basic/index.js | 37 + examples/basic/package.json | 11 + examples/bot-functions/.gitignore | 4 + examples/bot-functions/README.md | 15 + examples/bot-functions/index.js | 113 + examples/bot-functions/package.json | 13 + examples/newsletter/.gitignore | 4 + examples/newsletter/README.md | 13 + examples/newsletter/index.js | 42 + examples/newsletter/package.json | 11 + examples/orders/.gitignore | 4 + examples/orders/README.md | 13 + examples/orders/index.js | 51 + examples/orders/package.json | 11 + examples/rest/README.md | 49 + examples/rest/index.js | 141 + img/wppconnect-banner.jpeg | Bin 0 -> 46584 bytes package-lock.json | 14819 ++++++++++++++++ package.json | 135 + src/api/helpers/base64-mimetype.ts | 30 + src/api/helpers/decrypt.ts | 112 + src/api/helpers/download-file.ts | 61 + src/api/helpers/evaluate-and-return.ts | 146 + src/api/helpers/exposed.enum.ts | 30 + src/api/helpers/file-to-base64.ts | 54 + src/api/helpers/filename-from-mimetype.ts | 33 + src/api/helpers/index.ts | 24 + src/api/helpers/scrape-img-qr.ts | 62 + src/api/helpers/scrape-login.ts | 34 + src/api/helpers/select-sticker.ts | 77 + src/api/layers/README.md | 14 + src/api/layers/business.layer.ts | 259 + src/api/layers/catalog.layer.ts | 318 + src/api/layers/community.layer.ts | 154 + src/api/layers/controls.layer.ts | 299 + src/api/layers/group.layer.ts | 452 + src/api/layers/host.layer.ts | 599 + src/api/layers/labels.layer.ts | 146 + src/api/layers/listener.layer.ts | 681 + src/api/layers/newsletter.layer.ts | 112 + src/api/layers/profile.layer.ts | 169 + src/api/layers/retriever.layer.ts | 636 + src/api/layers/sender.layer.ts | 1420 ++ src/api/layers/status.layer.ts | 188 + src/api/layers/ui.layer.ts | 62 + src/api/model/ack.ts | 42 + src/api/model/chat.ts | 50 + src/api/model/contact-status.ts | 22 + src/api/model/contact.ts | 64 + src/api/model/enum/ack-type.ts | 31 + src/api/model/enum/chat-state.ts | 22 + src/api/model/enum/definitions.ts | 606 + src/api/model/enum/group-notification-type.ts | 28 + src/api/model/enum/group-property.ts | 47 + src/api/model/enum/index.ts | 26 + src/api/model/enum/interface-mode.ts | 55 + src/api/model/enum/interface-state.ts | 51 + src/api/model/enum/message-type.ts | 65 + src/api/model/enum/socket-state.ts | 92 + src/api/model/enum/status-find.ts | 66 + src/api/model/get-messages-param.ts | 43 + src/api/model/group-creation.ts | 24 + src/api/model/group-metadata.ts | 41 + src/api/model/host-device.ts | 53 + src/api/model/id.ts | 25 + src/api/model/incoming-call.ts | 34 + src/api/model/index.ts | 38 + src/api/model/initializer.ts | 78 + src/api/model/label.ts | 23 + src/api/model/live-location.ts | 70 + src/api/model/message-id.ts | 25 + src/api/model/message.ts | 89 + src/api/model/partial-message.ts | 41 + src/api/model/participant-event.ts | 25 + src/api/model/presence-event.ts | 40 + src/api/model/presence.ts | 23 + src/api/model/profile-pic-thumb.ts | 29 + src/api/model/qrcode.ts | 21 + src/api/model/result.ts | 50 + src/api/model/whatsapp-profile.ts | 26 + src/api/model/wid.ts | 39 + src/api/whatsapp.ts | 249 + src/config/WAuserAgente.ts | 20 + src/config/create-config.ts | 202 + src/config/puppeteer.config.ts | 61 + src/controllers/auth.ts | 89 + src/controllers/browser.ts | 374 + src/controllers/initializer.ts | 275 + src/controllers/websocket.ts | 59 + src/controllers/welcome.ts | 86 + src/index.ts | 27 + src/lib/README.md | 3 + src/lib/wapi/.babelrc | 20 + .../get-business-profiles-products.js | 39 + src/lib/wapi/business/get-order-by-msg.js | 54 + src/lib/wapi/business/index.js | 18 + src/lib/wapi/business/send-payment-request.js | 47 + .../wapi/functions/are-all-messages-loaded.js | 26 + src/lib/wapi/functions/check-send-exist.js | 83 + src/lib/wapi/functions/create-product.js | 55 + .../download-file-with-credentials.js | 41 + .../wapi/functions/encrypt-and-upload-file.js | 39 + src/lib/wapi/functions/fix-chat.js | 48 + src/lib/wapi/functions/forward-messages.js | 64 + src/lib/wapi/functions/get-all-chats-ids.js | 25 + .../functions/get-all-chats-with-messages.js | 30 + src/lib/wapi/functions/get-all-chats.js | 25 + src/lib/wapi/functions/get-all-contacts.js | 25 + .../wapi/functions/get-all-group-metadata.js | 25 + src/lib/wapi/functions/get-all-groups.js | 23 + .../functions/get-all-messages-in-chat.js | 44 + .../wapi/functions/get-all-new-messages.js | 28 + .../wapi/functions/get-all-unread-messages.js | 35 + src/lib/wapi/functions/get-battery-level.js | 20 + src/lib/wapi/functions/get-chat-by-id.js | 28 + src/lib/wapi/functions/get-chat-by-name.js | 22 + src/lib/wapi/functions/get-chat.js | 32 + .../functions/get-chats-with-new-messages.js | 27 + src/lib/wapi/functions/get-common-groups.js | 43 + src/lib/wapi/functions/get-contact.js | 23 + src/lib/wapi/functions/get-group-metadata.js | 22 + .../functions/get-group-participant-ids.js | 27 + .../wapi/functions/get-group-participants.js | 21 + src/lib/wapi/functions/get-host.js | 20 + src/lib/wapi/functions/get-list-mute.js | 52 + src/lib/wapi/functions/get-me.js | 25 + src/lib/wapi/functions/get-message-by-id.js | 50 + src/lib/wapi/functions/get-messages.js | 34 + src/lib/wapi/functions/get-my-contacts.js | 24 + src/lib/wapi/functions/get-new-id.js | 25 + src/lib/wapi/functions/get-number-profile.js | 34 + src/lib/wapi/functions/get-session-token.js | 29 + .../functions/get-unread-messages-in-chat.js | 64 + src/lib/wapi/functions/get-unread-messages.js | 103 + src/lib/wapi/functions/get-wid.js | 20 + src/lib/wapi/functions/has-unread-messages.js | 20 + src/lib/wapi/functions/index.js | 89 + src/lib/wapi/functions/is-connected.js | 27 + src/lib/wapi/functions/is-logged-in.js | 26 + .../load-all-earlier-chat-messages.js | 51 + .../load-and-get-all-messages-in-chat.js | 54 + .../functions/load-earlier-chat-messages.js | 26 + .../load-earlier-messages-til-date.js | 31 + src/lib/wapi/functions/phoneWatchdog.js | 60 + src/lib/wapi/functions/presence.js | 49 + src/lib/wapi/functions/process-files.js | 38 + .../wapi/functions/process-message-object.js | 28 + src/lib/wapi/functions/send-chat-state.js | 46 + src/lib/wapi/functions/send-file.js | 75 + .../wapi/functions/send-image-with-product.js | 75 + src/lib/wapi/functions/send-image.js | 47 + src/lib/wapi/functions/send-link-preview.js | 68 + src/lib/wapi/functions/send-location.js | 70 + .../wapi/functions/send-message-with-tags.js | 52 + .../wapi/functions/send-message-with-thumb.js | 46 + src/lib/wapi/functions/send-message.js | 59 + src/lib/wapi/functions/send-message2.js | 37 + src/lib/wapi/functions/send-mute.js | 97 + src/lib/wapi/functions/send-ptt.js | 79 + src/lib/wapi/functions/send-video-as-gif.js | 61 + src/lib/wapi/functions/sendMessageOptions.js | 145 + src/lib/wapi/functions/set-my-name.js | 20 + src/lib/wapi/functions/set-online-presence.js | 28 + src/lib/wapi/functions/set-profile-pic.js | 29 + .../wapi/functions/set-temporary-messages.js | 43 + src/lib/wapi/functions/star-messages.js | 57 + src/lib/wapi/functions/theme.js | 29 + src/lib/wapi/globals.d.ts | 31 + src/lib/wapi/helper/array-buffer-to-base64.js | 68 + src/lib/wapi/helper/base64-to-file.js | 33 + src/lib/wapi/helper/generate-media-key.js | 26 + src/lib/wapi/helper/get-file-hash.js | 24 + src/lib/wapi/helper/index.js | 21 + src/lib/wapi/helper/is-chat-message.js | 29 + src/lib/wapi/jsconfig.json | 7 + src/lib/wapi/jssha/index.js | 1158 ++ .../wapi/listeners/add-all-new-messages.js | 37 + src/lib/wapi/listeners/add-new-messages.js | 34 + .../wapi/listeners/add-on-added-to-group.js | 49 + .../wapi/listeners/add-on-live-location.js | 75 + src/lib/wapi/listeners/add-on-new-ack.js | 23 + .../listeners/add-on-notification-message.js | 30 + .../listeners/add-on-participants-change.js | 98 + .../wapi/listeners/add-on-presence-changed.js | 74 + src/lib/wapi/listeners/add-on-state-change.js | 47 + src/lib/wapi/listeners/index.js | 27 + src/lib/wapi/listeners/init-listeners.js | 102 + src/lib/wapi/serializers/index.js | 24 + src/lib/wapi/serializers/serialize-chat.js | 46 + src/lib/wapi/serializers/serialize-contact.js | 43 + src/lib/wapi/serializers/serialize-message.js | 46 + .../serializers/serialize-number-status.js | 32 + .../serialize-profile-pic-thumb.js | 34 + .../wapi/serializers/serialize-profilePic.js | 31 + src/lib/wapi/serializers/serialize-raw.js | 23 + src/lib/wapi/store/store-objects.js | 99 + src/lib/wapi/wapi.js | 542 + src/lib/wapi/webpack.config.js | 39 + src/tests/01.qrcode.test.ts | 80 + src/tests/02.basic.test.ts | 156 + src/tests/03.group.test.ts | 56 + src/tests/04.chat.test.ts | 187 + src/tests/common.ts | 66 + src/token-store/fileTokenStore.ts | 203 + src/token-store/index.ts | 21 + src/token-store/isValidSessionToken.ts | 38 + src/token-store/isValidTokenStore.ts | 28 + src/token-store/memoryTokenStore.ts | 66 + src/token-store/types.ts | 136 + src/types/Evaluate.d.ts | 28 + src/types/WAPI.d.ts | 207 + src/utils/ffmpeg.ts | 123 + src/utils/logger.ts | 67 + src/utils/semver.ts | 45 + src/utils/sleep.ts | 20 + tsconfig.json | 66 + typedoc.json | 14 + 256 files changed, 35254 insertions(+) create mode 100644 .codebeatignore create mode 100644 .commitlintrc.json create mode 100644 .eslintrc.js create mode 100644 .github/FUNDING.yml create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/ISSUE_TEMPLATE/support_question.md create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 .github/renovate.json create mode 100644 .github/workflows/build.yml create mode 100644 .github/workflows/codeql-analysis.yml create mode 100644 .github/workflows/commitlint.yml create mode 100644 .github/workflows/lint.yml create mode 100644 .github/workflows/nightly.yml create mode 100644 .github/workflows/publish.yml create mode 100644 .github/workflows/release.yml create mode 100644 .gitignore create mode 100644 .husky/.gitignore create mode 100755 .husky/commit-msg create mode 100755 .husky/pre-commit create mode 100644 .npmignore create mode 100644 .npmrc create mode 100644 .prettierignore create mode 100644 .prettierrc create mode 100644 .release-it.yml create mode 100644 .vscode/extensions.json create mode 100644 .vscode/settings.json create mode 100644 CHANGELOG.md create mode 100644 CONTRIBUTING.md create mode 100644 LICENSE.md create mode 100644 README.md create mode 100644 Update.md create mode 100644 docs/getting-started/basic-functions.md create mode 100644 docs/getting-started/configuring-logger.md create mode 100644 docs/getting-started/creating-client.md create mode 100644 docs/getting-started/installation.md create mode 100644 docs/getting-started/receiving-messages.md create mode 100644 examples/basic/.gitignore create mode 100644 examples/basic/README.md create mode 100644 examples/basic/index.js create mode 100644 examples/basic/package.json create mode 100644 examples/bot-functions/.gitignore create mode 100644 examples/bot-functions/README.md create mode 100644 examples/bot-functions/index.js create mode 100644 examples/bot-functions/package.json create mode 100644 examples/newsletter/.gitignore create mode 100644 examples/newsletter/README.md create mode 100644 examples/newsletter/index.js create mode 100644 examples/newsletter/package.json create mode 100644 examples/orders/.gitignore create mode 100644 examples/orders/README.md create mode 100644 examples/orders/index.js create mode 100644 examples/orders/package.json create mode 100644 examples/rest/README.md create mode 100644 examples/rest/index.js create mode 100644 img/wppconnect-banner.jpeg create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 src/api/helpers/base64-mimetype.ts create mode 100644 src/api/helpers/decrypt.ts create mode 100644 src/api/helpers/download-file.ts create mode 100644 src/api/helpers/evaluate-and-return.ts create mode 100644 src/api/helpers/exposed.enum.ts create mode 100644 src/api/helpers/file-to-base64.ts create mode 100644 src/api/helpers/filename-from-mimetype.ts create mode 100644 src/api/helpers/index.ts create mode 100644 src/api/helpers/scrape-img-qr.ts create mode 100644 src/api/helpers/scrape-login.ts create mode 100644 src/api/helpers/select-sticker.ts create mode 100644 src/api/layers/README.md create mode 100644 src/api/layers/business.layer.ts create mode 100644 src/api/layers/catalog.layer.ts create mode 100644 src/api/layers/community.layer.ts create mode 100644 src/api/layers/controls.layer.ts create mode 100644 src/api/layers/group.layer.ts create mode 100644 src/api/layers/host.layer.ts create mode 100644 src/api/layers/labels.layer.ts create mode 100644 src/api/layers/listener.layer.ts create mode 100644 src/api/layers/newsletter.layer.ts create mode 100644 src/api/layers/profile.layer.ts create mode 100644 src/api/layers/retriever.layer.ts create mode 100644 src/api/layers/sender.layer.ts create mode 100644 src/api/layers/status.layer.ts create mode 100644 src/api/layers/ui.layer.ts create mode 100644 src/api/model/ack.ts create mode 100644 src/api/model/chat.ts create mode 100644 src/api/model/contact-status.ts create mode 100644 src/api/model/contact.ts create mode 100644 src/api/model/enum/ack-type.ts create mode 100644 src/api/model/enum/chat-state.ts create mode 100644 src/api/model/enum/definitions.ts create mode 100644 src/api/model/enum/group-notification-type.ts create mode 100644 src/api/model/enum/group-property.ts create mode 100644 src/api/model/enum/index.ts create mode 100644 src/api/model/enum/interface-mode.ts create mode 100644 src/api/model/enum/interface-state.ts create mode 100644 src/api/model/enum/message-type.ts create mode 100644 src/api/model/enum/socket-state.ts create mode 100644 src/api/model/enum/status-find.ts create mode 100644 src/api/model/get-messages-param.ts create mode 100644 src/api/model/group-creation.ts create mode 100644 src/api/model/group-metadata.ts create mode 100644 src/api/model/host-device.ts create mode 100644 src/api/model/id.ts create mode 100644 src/api/model/incoming-call.ts create mode 100644 src/api/model/index.ts create mode 100644 src/api/model/initializer.ts create mode 100644 src/api/model/label.ts create mode 100644 src/api/model/live-location.ts create mode 100644 src/api/model/message-id.ts create mode 100644 src/api/model/message.ts create mode 100644 src/api/model/partial-message.ts create mode 100644 src/api/model/participant-event.ts create mode 100644 src/api/model/presence-event.ts create mode 100644 src/api/model/presence.ts create mode 100644 src/api/model/profile-pic-thumb.ts create mode 100644 src/api/model/qrcode.ts create mode 100644 src/api/model/result.ts create mode 100644 src/api/model/whatsapp-profile.ts create mode 100644 src/api/model/wid.ts create mode 100644 src/api/whatsapp.ts create mode 100644 src/config/WAuserAgente.ts create mode 100644 src/config/create-config.ts create mode 100644 src/config/puppeteer.config.ts create mode 100644 src/controllers/auth.ts create mode 100644 src/controllers/browser.ts create mode 100644 src/controllers/initializer.ts create mode 100644 src/controllers/websocket.ts create mode 100644 src/controllers/welcome.ts create mode 100644 src/index.ts create mode 100644 src/lib/README.md create mode 100644 src/lib/wapi/.babelrc create mode 100644 src/lib/wapi/business/get-business-profiles-products.js create mode 100644 src/lib/wapi/business/get-order-by-msg.js create mode 100644 src/lib/wapi/business/index.js create mode 100644 src/lib/wapi/business/send-payment-request.js create mode 100644 src/lib/wapi/functions/are-all-messages-loaded.js create mode 100644 src/lib/wapi/functions/check-send-exist.js create mode 100644 src/lib/wapi/functions/create-product.js create mode 100644 src/lib/wapi/functions/download-file-with-credentials.js create mode 100644 src/lib/wapi/functions/encrypt-and-upload-file.js create mode 100644 src/lib/wapi/functions/fix-chat.js create mode 100644 src/lib/wapi/functions/forward-messages.js create mode 100644 src/lib/wapi/functions/get-all-chats-ids.js create mode 100644 src/lib/wapi/functions/get-all-chats-with-messages.js create mode 100644 src/lib/wapi/functions/get-all-chats.js create mode 100644 src/lib/wapi/functions/get-all-contacts.js create mode 100644 src/lib/wapi/functions/get-all-group-metadata.js create mode 100644 src/lib/wapi/functions/get-all-groups.js create mode 100644 src/lib/wapi/functions/get-all-messages-in-chat.js create mode 100644 src/lib/wapi/functions/get-all-new-messages.js create mode 100644 src/lib/wapi/functions/get-all-unread-messages.js create mode 100644 src/lib/wapi/functions/get-battery-level.js create mode 100644 src/lib/wapi/functions/get-chat-by-id.js create mode 100644 src/lib/wapi/functions/get-chat-by-name.js create mode 100644 src/lib/wapi/functions/get-chat.js create mode 100644 src/lib/wapi/functions/get-chats-with-new-messages.js create mode 100644 src/lib/wapi/functions/get-common-groups.js create mode 100644 src/lib/wapi/functions/get-contact.js create mode 100644 src/lib/wapi/functions/get-group-metadata.js create mode 100644 src/lib/wapi/functions/get-group-participant-ids.js create mode 100644 src/lib/wapi/functions/get-group-participants.js create mode 100644 src/lib/wapi/functions/get-host.js create mode 100644 src/lib/wapi/functions/get-list-mute.js create mode 100644 src/lib/wapi/functions/get-me.js create mode 100644 src/lib/wapi/functions/get-message-by-id.js create mode 100644 src/lib/wapi/functions/get-messages.js create mode 100644 src/lib/wapi/functions/get-my-contacts.js create mode 100644 src/lib/wapi/functions/get-new-id.js create mode 100644 src/lib/wapi/functions/get-number-profile.js create mode 100644 src/lib/wapi/functions/get-session-token.js create mode 100644 src/lib/wapi/functions/get-unread-messages-in-chat.js create mode 100644 src/lib/wapi/functions/get-unread-messages.js create mode 100644 src/lib/wapi/functions/get-wid.js create mode 100644 src/lib/wapi/functions/has-unread-messages.js create mode 100644 src/lib/wapi/functions/index.js create mode 100644 src/lib/wapi/functions/is-connected.js create mode 100644 src/lib/wapi/functions/is-logged-in.js create mode 100644 src/lib/wapi/functions/load-all-earlier-chat-messages.js create mode 100644 src/lib/wapi/functions/load-and-get-all-messages-in-chat.js create mode 100644 src/lib/wapi/functions/load-earlier-chat-messages.js create mode 100644 src/lib/wapi/functions/load-earlier-messages-til-date.js create mode 100644 src/lib/wapi/functions/phoneWatchdog.js create mode 100644 src/lib/wapi/functions/presence.js create mode 100644 src/lib/wapi/functions/process-files.js create mode 100644 src/lib/wapi/functions/process-message-object.js create mode 100644 src/lib/wapi/functions/send-chat-state.js create mode 100644 src/lib/wapi/functions/send-file.js create mode 100644 src/lib/wapi/functions/send-image-with-product.js create mode 100644 src/lib/wapi/functions/send-image.js create mode 100644 src/lib/wapi/functions/send-link-preview.js create mode 100644 src/lib/wapi/functions/send-location.js create mode 100644 src/lib/wapi/functions/send-message-with-tags.js create mode 100644 src/lib/wapi/functions/send-message-with-thumb.js create mode 100644 src/lib/wapi/functions/send-message.js create mode 100644 src/lib/wapi/functions/send-message2.js create mode 100644 src/lib/wapi/functions/send-mute.js create mode 100644 src/lib/wapi/functions/send-ptt.js create mode 100644 src/lib/wapi/functions/send-video-as-gif.js create mode 100644 src/lib/wapi/functions/sendMessageOptions.js create mode 100644 src/lib/wapi/functions/set-my-name.js create mode 100644 src/lib/wapi/functions/set-online-presence.js create mode 100644 src/lib/wapi/functions/set-profile-pic.js create mode 100644 src/lib/wapi/functions/set-temporary-messages.js create mode 100644 src/lib/wapi/functions/star-messages.js create mode 100644 src/lib/wapi/functions/theme.js create mode 100644 src/lib/wapi/globals.d.ts create mode 100644 src/lib/wapi/helper/array-buffer-to-base64.js create mode 100644 src/lib/wapi/helper/base64-to-file.js create mode 100644 src/lib/wapi/helper/generate-media-key.js create mode 100644 src/lib/wapi/helper/get-file-hash.js create mode 100644 src/lib/wapi/helper/index.js create mode 100644 src/lib/wapi/helper/is-chat-message.js create mode 100644 src/lib/wapi/jsconfig.json create mode 100644 src/lib/wapi/jssha/index.js create mode 100644 src/lib/wapi/listeners/add-all-new-messages.js create mode 100644 src/lib/wapi/listeners/add-new-messages.js create mode 100644 src/lib/wapi/listeners/add-on-added-to-group.js create mode 100644 src/lib/wapi/listeners/add-on-live-location.js create mode 100644 src/lib/wapi/listeners/add-on-new-ack.js create mode 100644 src/lib/wapi/listeners/add-on-notification-message.js create mode 100644 src/lib/wapi/listeners/add-on-participants-change.js create mode 100644 src/lib/wapi/listeners/add-on-presence-changed.js create mode 100644 src/lib/wapi/listeners/add-on-state-change.js create mode 100644 src/lib/wapi/listeners/index.js create mode 100644 src/lib/wapi/listeners/init-listeners.js create mode 100644 src/lib/wapi/serializers/index.js create mode 100644 src/lib/wapi/serializers/serialize-chat.js create mode 100644 src/lib/wapi/serializers/serialize-contact.js create mode 100644 src/lib/wapi/serializers/serialize-message.js create mode 100644 src/lib/wapi/serializers/serialize-number-status.js create mode 100644 src/lib/wapi/serializers/serialize-profile-pic-thumb.js create mode 100644 src/lib/wapi/serializers/serialize-profilePic.js create mode 100644 src/lib/wapi/serializers/serialize-raw.js create mode 100644 src/lib/wapi/store/store-objects.js create mode 100644 src/lib/wapi/wapi.js create mode 100644 src/lib/wapi/webpack.config.js create mode 100644 src/tests/01.qrcode.test.ts create mode 100644 src/tests/02.basic.test.ts create mode 100644 src/tests/03.group.test.ts create mode 100644 src/tests/04.chat.test.ts create mode 100644 src/tests/common.ts create mode 100644 src/token-store/fileTokenStore.ts create mode 100644 src/token-store/index.ts create mode 100644 src/token-store/isValidSessionToken.ts create mode 100644 src/token-store/isValidTokenStore.ts create mode 100644 src/token-store/memoryTokenStore.ts create mode 100644 src/token-store/types.ts create mode 100644 src/types/Evaluate.d.ts create mode 100644 src/types/WAPI.d.ts create mode 100644 src/utils/ffmpeg.ts create mode 100644 src/utils/logger.ts create mode 100644 src/utils/semver.ts create mode 100644 src/utils/sleep.ts create mode 100644 tsconfig.json create mode 100644 typedoc.json diff --git a/.codebeatignore b/.codebeatignore new file mode 100644 index 000000000..cb2e1f485 --- /dev/null +++ b/.codebeatignore @@ -0,0 +1,3 @@ +src/lib/wapi/jssha/index.js +docs/ +docs/assets/ diff --git a/.commitlintrc.json b/.commitlintrc.json new file mode 100644 index 000000000..2921a4b34 --- /dev/null +++ b/.commitlintrc.json @@ -0,0 +1,13 @@ +{ + "$schema": "https://json.schemastore.org/commitlintrc.json", + "extends": ["@commitlint/config-conventional"], + "rules": { + "body-max-line-length": [0, "always", 100], + "header-max-length": [2, "always", 120], + "subject-case": [ + 1, + "never", + ["sentence-case", "start-case", "pascal-case", "upper-case"] + ] + } +} diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 000000000..782870b64 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,100 @@ +// eslint-disable-next-line no-undef, header/header +module.exports = { + root: true, + parser: '@typescript-eslint/parser', + plugins: ['@typescript-eslint', 'header'], + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/eslint-recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:prettier/recommended', + ], + rules: { + // @todo more restrictive + '@typescript-eslint/ban-ts-comment': 'off', + '@typescript-eslint/ban-types': 'off', + '@typescript-eslint/explicit-module-boundary-types': 'off', + '@typescript-eslint/no-empty-function': 'off', + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/no-inferrable-types': 'off', + '@typescript-eslint/no-namespace': 'off', + '@typescript-eslint/no-unused-vars': 'off', + '@typescript-eslint/no-var-requires': 'off', + '@typescript-eslint/prefer-namespace-keyword': 'off', + 'no-async-promise-executor': 'off', + 'no-constant-condition': 'off', + 'no-empty': ['error', { allowEmptyCatch: true }], + 'no-useless-catch': 'off', + 'no-useless-escape': 'off', + 'prefer-const': 'off', + 'header/header': [ + 2, + 'block', + [ + '', + ' * This file is part of WPPConnect.', + ' *', + ' * WPPConnect is free software: you can redistribute it and/or modify', + ' * it under the terms of the GNU Lesser General Public License as published by', + ' * the Free Software Foundation, either version 3 of the License, or', + ' * (at your option) any later version.', + ' *', + ' * WPPConnect is distributed in the hope that it will be useful,', + ' * but WITHOUT ANY WARRANTY; without even the implied warranty of', + ' * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the', + ' * GNU Lesser General Public License for more details.', + ' *', + ' * You should have received a copy of the GNU Lesser General Public License', + ' * along with WPPConnect. If not, see .', + ' ', + ], + 1, + ], + 'prettier/prettier': [ + 'error', + { + endOfLine: 'auto', + }, + ], + }, + overrides: [ + { + files: ['src/lib/**/*.js'], + parser: '@babel/eslint-parser', + plugins: ['@babel'], + parserOptions: { + ecmaVersion: 6, + sourceType: 'module', + }, + env: { + amd: true, + commonjs: true, + es6: true, + browser: true, + node: false, + }, + globals: { + axios: true, + Debug: true, + Store: true, + WAPI: true, + WPP: true, + webpackJsonp: true, + WWebJS: true, + }, + rules: { + // @todo more restrictive + '@typescript-eslint/no-array-constructor': 'off', + 'no-prototype-builtins': 'off', + 'no-redeclare': 'off', + }, + }, + { + files: ['src/lib/**/webpack.*.js', 'src/lib/**/gulpfile.js'], + env: { + browser: false, + node: true, + }, + }, + ], +}; diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 000000000..8703191ec --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,2 @@ +github: [icleitoncosta, joaosouz4dev] +open_collective: wppconnect diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 000000000..38bd067fd --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,41 @@ +--- +name: Bug report +about: Create a report to help us improve +labels: 'bug, needs triage' +--- + +## Description + +[Description of the bug, When Issue Happens] + +## Environment + +- **WPPConnect version(s):** X.Y.Z +- **WA-JS version(s):** X.Y.Z +- **Browser:** Chrome XX / Chromium XX +- **OS:** Windows X / OSX X.Y.Z +- **Node version:** Node XY +- **WhatsApp version:** X.YYYY.ZZ +- **MultiDevice (BETA):** yes/no + +## Steps to Reproduce + +1. [First Step] +2. [Second Step] +3. [and so on...] + +## Log Output + +``` +If relevant, paste all of your Log Output +``` + +## Your Code + +``` +If relevant, paste all of your challenge code in here +``` + +## Additional context / Screenshot + +Add any other context about the problem here. If applicable, add screenshots to help explain. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 000000000..71aa4f4a6 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,17 @@ +--- +name: Feature request +about: "I have a suggestion (and may want to implement it \U0001F642)!" +labels: 'enhancement, needs triage' +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. diff --git a/.github/ISSUE_TEMPLATE/support_question.md b/.github/ISSUE_TEMPLATE/support_question.md new file mode 100644 index 000000000..a2f3fd0d2 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/support_question.md @@ -0,0 +1,20 @@ +--- +name: Support Question +about: 'If you have a question, please check out our Documentation or Discord!' +labels: 'question, needs triage' +--- + +**Before adding this issue, make sure you do the following to make sure this is not a duplicate:** + +1. Search through the repo's previous issues +2. Read through the readme at least once +3. Search the docs for the feature you're looking for + +We primarily use GitHub as an issue tracker; for usage and support questions, please check out these resources below. Thanks! 😁. + +--- + +- Documentation: https://wppconnect.io/wppconnect/ +- Discord: https://discord.gg/qCJ95FVbzR +- WhatsApp Group: [https://chat.whatsapp.com/EGLVbeFGgt40OkbOCX8Sei] +- Also have a look at the readme for more information on how to get support: diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 000000000..051f7c6dd --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,8 @@ +Fixes # . + +## Changes proposed in this pull request + +- +- + +To test (it takes a while): `npm install github:/wppconnect#` diff --git a/.github/renovate.json b/.github/renovate.json new file mode 100644 index 000000000..53b22e871 --- /dev/null +++ b/.github/renovate.json @@ -0,0 +1,72 @@ +{ + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + "extends": [ + "config:base", + ":prHourlyLimitNone", + ":prNotPending", + ":semanticCommits" + ], + "prConcurrentLimit": 3, + "lockFileMaintenance": { + "enabled": true, + "automerge": true + }, + "packageRules": [ + { + "description": "Use bump strategy", + "matchPackagePatterns": ["*"], + "rangeStrategy": "bump", + "semanticCommitType": "build" + }, + { + "matchManagers": ["github-actions"], + "semanticCommitType": "ci", + "addLabels": ["github_actions"] + }, + { + "matchManagers": ["npm"], + "addLabels": ["javascript"] + }, + { + "matchDepTypes": ["devDependencies"], + "semanticCommitScope": "deps-dev" + }, + { + "description": "Show in changelog package updates", + "matchPackagePatterns": ["^@wppconnect/"], + "semanticCommitType": "fix" + }, + { + "description": "Automatically merge minor and patch-level updates", + "matchUpdateTypes": ["minor", "patch", "pin", "digest"], + "automerge": true, + "automergeStrategy": "squash", + "automergeType": "pr" + }, + { + "description": "Ignore major version", + "matchPackageNames": ["boxen"], + "allowedVersions": "<6" + }, + { + "description": "Ignore major version", + "matchPackageNames": ["chalk"], + "allowedVersions": "<5" + }, + { + "description": "Ignore major version", + "matchPackageNames": ["execa"], + "allowedVersions": "<6" + }, + { + "description": "Ignore major version", + "matchPackageNames": ["file-type"], + "allowedVersions": "<17" + }, + { + "description": "Ignore major version", + "matchPackageNames": ["latest-version"], + "allowedVersions": "<6" + } + ] +} diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 000000000..14a635d97 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,41 @@ +name: build + +on: + push: + branches: + - '*' + pull_request: + branches: + - '*' + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Node + uses: actions/setup-node@v4.0.2 + with: + node-version: 18.x + + - name: Get npm cache directory + id: npm-cache + run: | + echo "::set-output name=dir::$(npm config get cache)" + - name: Setup npm cache + uses: actions/cache@v4 + with: + path: ${{ steps.npm-cache.outputs.dir }} + key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} + restore-keys: | + ${{ runner.os }}-node- + + - name: Install Dependencies + run: npm ci || npm install + env: + PUPPETEER_SKIP_DOWNLOAD: true + + - name: Build source + run: npm run build diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml new file mode 100644 index 000000000..d485d19bc --- /dev/null +++ b/.github/workflows/codeql-analysis.yml @@ -0,0 +1,71 @@ +# For most projects, this workflow file will not need changing; you simply need +# to commit it to your repository. +# +# You may wish to alter this file to override the set of languages analyzed, +# or to provide custom queries or build logic. +name: "CodeQL" + +on: + push: + branches: [master] + pull_request: + # The branches below must be a subset of the branches above + branches: [master] + schedule: + - cron: '0 0 * * 5' + +jobs: + analyze: + name: Analyze + runs-on: ubuntu-latest + + strategy: + fail-fast: false + matrix: + # Override automatic language detection by changing the below list + # Supported options are ['csharp', 'cpp', 'go', 'java', 'javascript', 'python'] + language: ['javascript'] + # Learn more... + # https://docs.github.com/en/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#overriding-automatic-language-detection + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + # We must fetch at least the immediate parents so that if this is + # a pull request then we can checkout the head. + fetch-depth: 2 + + # If this run was triggered by a pull request event, then checkout + # the head of the pull request instead of the merge commit. + - run: git checkout HEAD^2 + if: ${{ github.event_name == 'pull_request' }} + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v3 + with: + languages: ${{ matrix.language }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + # queries: ./path/to/local/query, your-org/your-repo/queries@main + + # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). + # If this step fails, then you should remove it and run the build manually (see below) + - name: Autobuild + uses: github/codeql-action/autobuild@v3 + + # ℹ️ Command-line programs to run using the OS shell. + # 📚 https://git.io/JvXDl + + # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines + # and modify them (or add more) to build your code if your project + # uses a compiled language + + #- run: | + # make bootstrap + # make release + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v3 diff --git a/.github/workflows/commitlint.yml b/.github/workflows/commitlint.yml new file mode 100644 index 000000000..d71a21cd0 --- /dev/null +++ b/.github/workflows/commitlint.yml @@ -0,0 +1,16 @@ +name: commit lint +on: [pull_request] + +jobs: + commitlint: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Lint commit + uses: wagoid/commitlint-github-action@v5.5.1 + with: + configFile: './.commitlintrc.js' diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 000000000..0c5def7d5 --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,41 @@ +name: lint + +on: + push: + branches: + - '*' + pull_request: + branches: + - '*' + +jobs: + lint: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Node + uses: actions/setup-node@v4.0.2 + with: + node-version: 18.x + + - name: Get npm cache directory + id: npm-cache + run: | + echo "::set-output name=dir::$(npm config get cache)" + - name: Setup npm cache + uses: actions/cache@v4 + with: + path: ${{ steps.npm-cache.outputs.dir }} + key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} + restore-keys: | + ${{ runner.os }}-node- + + - name: Install Dependencies + run: npm ci || npm install + env: + PUPPETEER_SKIP_DOWNLOAD: true + + - name: Lint source + run: npm run lint diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml new file mode 100644 index 000000000..85521d561 --- /dev/null +++ b/.github/workflows/nightly.yml @@ -0,0 +1,84 @@ +name: Nightly Release + +on: + push: + branches: + - 'master' + +jobs: + nightly: + runs-on: ubuntu-latest + continue-on-error: true + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Fetching tags + run: git fetch --tags -f || true + + - name: Setup Node + uses: actions/setup-node@v4.0.2 + with: + node-version: 18.x + + - name: Get npm cache directory + id: npm-cache + run: | + echo "::set-output name=dir::$(npm config get cache)" + - name: Setup npm cache + uses: actions/cache@v4 + with: + path: ${{ steps.npm-cache.outputs.dir }} + key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} + restore-keys: | + ${{ runner.os }}-node- + + - name: Install Dependencies + run: npm ci || npm install + env: + PUPPETEER_SKIP_DOWNLOAD: true + + - name: Update version to alpha + run: npm version prerelease --preid=alpha --no-git --no-git-tag-version + + - name: Build NPM package + run: npm pack && mv wppconnect-*.tgz wppconnect-nightly.tgz + + - name: Build API-Docs + run: npm run docs:build + + - name: Generate Changelog + id: generate_changelog + run: | + changelog=$(npm run changelog:preview --silent) + changelog="${changelog//$'\n'/'%0A'}" + changelog="${changelog//$'\r'/'%0D'}" + echo -e "set-output name=changelog::${changelog-}\n" + echo -e "::set-output name=changelog::${changelog}\n" + + - name: Update Nightly TAG + uses: richardsimko/update-tag@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: nightly + + - name: Update Nightly Release + uses: meeDamian/github-release@2.0 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + token: ${{ secrets.GITHUB_TOKEN }} + tag: nightly + commitish: ${{ github.sha }} + name: Nightly Release + body: ${{ steps.generate_changelog.outputs.changelog }} + draft: false + prerelease: true + files: > + wppconnect-nightly.tgz + api-docs/ + gzip: folders + allow_override: true diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 000000000..f18c1b2b8 --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,81 @@ +name: Publish + +on: + push: + tags: + - 'v*' + +jobs: + publish: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Fetching tags + run: git fetch --tags -f || true + + - name: Setup Node + uses: actions/setup-node@v4.0.2 + with: + node-version: 18.x + registry-url: 'https://registry.npmjs.org' + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + + - name: Get npm cache directory + id: npm-cache + run: | + echo "::set-output name=dir::$(npm config get cache)" + - name: Setup npm cache + uses: actions/cache@v4 + with: + path: ${{ steps.npm-cache.outputs.dir }} + key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} + restore-keys: | + ${{ runner.os }}-node- + + - name: Install Dependencies + run: npm ci || npm install + env: + PUPPETEER_SKIP_DOWNLOAD: true + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + + - name: Publish in NPM + run: npm publish + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + + - name: Generate Changelog + id: generate_changelog + run: | + changelog=$(npm run changelog:last --silent) + changelog="${changelog//$'\n'/'%0A'}" + changelog="${changelog//$'\r'/'%0D'}" + echo -e "set-output name=changelog::${changelog-}\n" + echo -e "::set-output name=changelog::${changelog}\n" + + - name: Create Release + id: create_release + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: ${{ github.ref }} + release_name: ${{ github.ref }} + body: ${{ steps.generate_changelog.outputs.changelog }} + draft: false + prerelease: false + + - name: Build API-Docs + run: npm run docs:build + continue-on-error: true + + - name: Deploy API-Docs + uses: peaceiris/actions-gh-pages@v3 + continue-on-error: true + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./api-docs diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 000000000..c7770a490 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,48 @@ +name: release + +on: + workflow_dispatch: + inputs: + increment: + description: 'Tipo de incremento: patch, minor, major ou pre*' + required: true + default: 'patch' + +jobs: + release: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + token: ${{ secrets.PERSONAL_TOKEN }} + + - name: Setup GIT + run: | + git config --global user.name "github-actions[bot]" + git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com" + + - name: Setup Node + uses: actions/setup-node@v4.0.2 + with: + node-version: 18.x + + - name: Get npm cache directory + id: npm-cache + run: | + echo "::set-output name=dir::$(npm config get cache)" + - name: Setup npm cache + uses: actions/cache@v4 + with: + path: ${{ steps.npm-cache.outputs.dir }} + key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} + restore-keys: | + ${{ runner.os }}-node- + + - name: Install Dependencies + run: npm ci || npm install + env: + PUPPETEER_SKIP_DOWNLOAD: true + + - name: Release + run: 'npx release-it --increment ${{ github.event.inputs.increment }}' diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..cbe21bfa4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +.DS_Store +.idea/ +*.tgz +/debug.log +006.png +api-docs +app.js +app.ts +app2.js +assets +dist.zip +dist/ +gohan.jpg +node_modules +session +session-* +src/app.ts +tokens +yarn.lock \ No newline at end of file diff --git a/.husky/.gitignore b/.husky/.gitignore new file mode 100644 index 000000000..31354ec13 --- /dev/null +++ b/.husky/.gitignore @@ -0,0 +1 @@ +_ diff --git a/.husky/commit-msg b/.husky/commit-msg new file mode 100755 index 000000000..e8511eaea --- /dev/null +++ b/.husky/commit-msg @@ -0,0 +1,4 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +npx --no-install commitlint --edit $1 diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100755 index 000000000..f91359dc2 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,4 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +npx --no-install pretty-quick --staged diff --git a/.npmignore b/.npmignore new file mode 100644 index 000000000..dc1d63782 --- /dev/null +++ b/.npmignore @@ -0,0 +1,24 @@ +.* +*.map +*.tgz +*.zip +api-docs +app.js +app.ts +app2.js +assets +bot-functions +CONTRIBUTING.md +debug.log +docs +LICENSE +media +session +session-* +src +tokens +tsconfig.json +typedoc.json +Update.md +UPDATES.md +examples \ No newline at end of file diff --git a/.npmrc b/.npmrc new file mode 100644 index 000000000..e9ee3cb4d --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +legacy-peer-deps=true \ No newline at end of file diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 000000000..53253fe4c --- /dev/null +++ b/.prettierignore @@ -0,0 +1,2 @@ +docs +dist \ No newline at end of file diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 000000000..7ba6b977a --- /dev/null +++ b/.prettierrc @@ -0,0 +1,11 @@ +{ + "singleQuote": true, + "overrides": [ + { + "files": "*.json5", + "options": { + "parser": "json" + } + } + ] +} diff --git a/.release-it.yml b/.release-it.yml new file mode 100644 index 000000000..6329139e9 --- /dev/null +++ b/.release-it.yml @@ -0,0 +1,15 @@ +git: + commitMessage: 'chore(release): v${version}' + tagAnnotation: 'chore(release): v${version}' + tagName: 'v${version}' + requireCleanWorkingDir: false + +hooks: + after:bump: + - 'npm run changelog:update' + +# automatic publish from github workflow +npm: + publish: false + private: true + registry: 'OMITTED' diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 000000000..11bdeb77e --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,6 @@ +{ + // List of extensions which should be recommended for users of this workspace. + "recommendations": ["dbaeumer.vscode-eslint", "esbenp.prettier-vscode"], + // List of extensions recommended by VS Code that should not be recommended for users of this workspace. + "unwantedRecommendations": [] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 000000000..ec4f617a5 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,9 @@ +{ + "files.eol": "\n", + "[javascript]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[typescript]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + } +} diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 000000000..9c2e28acd --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,612 @@ +# 1.31.0 (2024-06-10) + +### Bug Fixes + +- **deps:** update dependency @wppconnect/wa-js to ^3.3.1 ([#2205](https://github.com/wppconnect-team/wppconnect/issues/2205)) ([89c3298](https://github.com/wppconnect-team/wppconnect/commit/89c3298209aed64e68fa28a9bd2102f1ae366d31)) + +## 1.30.3 (2024-05-03) + +### Bug Fixes + +- **deps:** update dependency @wppconnect/wa-js to ^3.2.4 ([#2168](https://github.com/wppconnect-team/wppconnect/issues/2168)) ([df59aec](https://github.com/wppconnect-team/wppconnect/commit/df59aecc61415f6163dcd9e1ab79ebb0c9b8402f)) + +## 1.30.2 (2024-04-25) + +### Bug Fixes + +- Upgrade whatsappVersion ([b8b1ec7](https://github.com/wppconnect-team/wppconnect/commit/b8b1ec75e5b2926e96fe83f21921f49824eea9cc)) + +## 1.30.1 (2024-03-11) + +- fix: Fixed login by qr code ([5ebd5f5](https://github.com/wppconnect-team/wppconnect/commit/5ebd5f5)) + +## 1.30.0 (2024-03-10) + +- fix(deps): update dependency @wppconnect/wa-js to v3 (#2103) ([3f5a658](https://github.com/wppconnect-team/wppconnect/commit/3f5a658)), closes [#2103](https://github.com/wppconnect-team/wppconnect/issues/2103) + +## 1.29.0 (2024-01-25) + +- [FIX] version whatsapp web ([716cd97](https://github.com/wppconnect-team/wppconnect/commit/716cd97)) + +## 1.28.4 (2023-12-25) + +- fix: Remove unnecessary code for close instance (close #1835) ([43f2a9b](https://github.com/wppconnect-team/wppconnect/commit/43f2a9b)), closes [#1835](https://github.com/wppconnect-team/wppconnect/issues/1835) + +## 1.28.3 (2023-11-15) + +- feat: Added client.getCommonGroups function ([194c898](https://github.com/wppconnect-team/wppconnect/commit/194c898)) + +## 1.28.2 (2023-11-04) + +- chore: Update release-it ([4869dc8](https://github.com/wppconnect-team/wppconnect/commit/4869dc8)) + +## 1.28.1 (2023-11-01) + +- fix : update version whatsappVersion 2.2347.x ([6fe090a](https://github.com/wppconnect-team/wppconnect/commit/6fe090a)) + +# 1.28.0 (2023-08-16) + +## 1.27.3 (2023-06-14) + +### Bug Fixes + +- **deps:** update dependency @wppconnect/wa-version to ^1.2.49 ([#1729](https://github.com/wppconnect-team/wppconnect/issues/1729)) ([bcb26ce](https://github.com/wppconnect-team/wppconnect/commit/bcb26cea7f5b02f1ba28b2a8311a586832b5659c)) + +## 1.27.2 (2023-06-05) + +## 1.27.1 (2023-06-04) + +### Bug Fixes + +- Reverting to previous fix as a temporary workaround ([#1718](https://github.com/wppconnect-team/wppconnect/issues/1718)) ([a0375b6](https://github.com/wppconnect-team/wppconnect/commit/a0375b6086507882600b4d24e12be23add1c4e29)) + +# 1.27.0 (2023-06-02) + +### Bug Fixes + +- **deps:** update dependency @wppconnect/wa-version to ^1.2.44 ([#1716](https://github.com/wppconnect-team/wppconnect/issues/1716)) ([a62cb18](https://github.com/wppconnect-team/wppconnect/commit/a62cb188f1ee0f0dba8c49ab9638c943486835e7)) + +# 1.26.0 (2023-06-01) + +# 1.25.0 (2023-05-30) + +### Bug Fixes + +- **deps:** update dependency @wppconnect/wa-version to ^1.2.42 ([#1700](https://github.com/wppconnect-team/wppconnect/issues/1700)) ([1c07a4b](https://github.com/wppconnect-team/wppconnect/commit/1c07a4b410037dbb748749e9faefde0fc4f04903)) + +# 1.24.0 (2023-04-29) + +## 1.23.2 (2023-04-03) + +## 1.23.1 (2023-03-25) + +### Bug Fixes + +- Fixed multiple inChat emit events ([#1598](https://github.com/wppconnect-team/wppconnect/issues/1598)) ([4900765](https://github.com/wppconnect-team/wppconnect/commit/4900765f20a7c879e597ce01ebcce05bf244006b)) + +# 1.23.0 (2023-03-12) + +### Bug Fixes + +- Reduced the number of log for events ([5b39646](https://github.com/wppconnect-team/wppconnect/commit/5b396467c594396741f61495da1c23bac19c8c94)) + +# 1.22.0 (2023-02-19) + +### Features + +- Added deviceSyncTimeout option (close [#1551](https://github.com/wppconnect-team/wppconnect/issues/1551)) ([d4458e5](https://github.com/wppconnect-team/wppconnect/commit/d4458e5c3727b4d96e1595a6f5fa2d798a2bd69a)) + +# 1.21.0 (2023-02-03) + +### Bug Fixes + +- **deps:** update dependency @wppconnect/wa-js to ^2.19.0 ([#1531](https://github.com/wppconnect-team/wppconnect/issues/1531)) ([09626d0](https://github.com/wppconnect-team/wppconnect/commit/09626d0b4921609633b77a1fcc2a67e9882a9dc4)) + +# 1.20.0 (2022-12-15) + +### Features + +- Added getVotes and getReactions functions ([49bb58f](https://github.com/wppconnect-team/wppconnect/commit/49bb58f9c0db9271a36cea4d650857f2ddbde74a)) + +## 1.19.2 (2022-12-11) + +## 1.19.1 (2022-11-18) + +### Bug Fixes + +- Fixed onMessage method (fix [#1351](https://github.com/wppconnect-team/wppconnect/issues/1351)) ([e8549a1](https://github.com/wppconnect-team/wppconnect/commit/e8549a10cf7b3ed5a04209bdd7d58b9a3c073f32)) + +# 1.19.0 (2022-11-02) + +## 1.18.1 (2022-10-20) + +### Bug Fixes + +- Fixed "Checking phone is connected" without autoClose ([ad63fb5](https://github.com/wppconnect-team/wppconnect/commit/ad63fb56a2255a67bcb16227fa6a61210f8633d1)) + +# 1.18.0 (2022-10-18) + +### Features + +- Improved QRCode re-scan (fix [#1189](https://github.com/wppconnect-team/wppconnect/issues/1189)) ([8ec5264](https://github.com/wppconnect-team/wppconnect/commit/8ec5264e55e01c15efd3e3c273c54e34cad166c9)) + +## 1.17.1 (2022-10-10) + +### Bug Fixes + +- **deps:** update dependency @wppconnect/wa-js to ^2.13.1 ([#1364](https://github.com/wppconnect-team/wppconnect/issues/1364)) ([ff92035](https://github.com/wppconnect-team/wppconnect/commit/ff92035cb05abc21a8e241d8c7d3d5be4614edfb)) + +# 1.17.0 (2022-09-17) + +### Bug Fixes + +- **deps:** update dependency @wppconnect/wa-version to ^1.1.154 ([#1334](https://github.com/wppconnect-team/wppconnect/issues/1334)) ([daa94ef](https://github.com/wppconnect-team/wppconnect/commit/daa94ef808660bd5acb143ceb8c9bff9a3a25a18)) + +## 1.16.1 (2022-08-09) + +# 1.16.0 (2022-08-05) + +### Bug Fixes + +- **deps:** update dependency @wppconnect/wa-js to ^2.10.0 ([dc8133a](https://github.com/wppconnect-team/wppconnect/commit/dc8133a2896c011830c874c94c780acd9368a25a)) + +# 1.15.0 (2022-07-20) + +## 1.14.5 (2022-07-11) + +## 1.14.4 (2022-06-20) + +## 1.14.3 (2022-06-17) + +### Bug Fixes + +- **deps:** update dependency @wppconnect/wa-js to ^2.7.2 ([#1181](https://github.com/wppconnect-team/wppconnect/issues/1181)) ([5208e62](https://github.com/wppconnect-team/wppconnect/commit/5208e621cf79ca5d80cca5ecf3c7b9068ca44e91)) + +## 1.14.2 (2022-06-11) + +### Bug Fixes + +- Added filename for sendFile when is using path or URL (fix [#1168](https://github.com/wppconnect-team/wppconnect/issues/1168)) ([5534fad](https://github.com/wppconnect-team/wppconnect/commit/5534fad0e056563cc3ce6b7699ea06f5eaff6da8)) + +## 1.14.1 (2022-06-08) + +# 1.14.0 (2022-06-08) + +### Bug Fixes + +- **deps:** update dependency @wppconnect/wa-js to ^2.6.0 ([27d5a52](https://github.com/wppconnect-team/wppconnect/commit/27d5a523c1dfa1a22c8be08cd7ff6d03af1fc0b1)) + +## 1.13.3 (2022-06-01) + +### Bug Fixes + +- Clear all token data when disconnected (fix [#1147](https://github.com/wppconnect-team/wppconnect/issues/1147)) ([4abcfed](https://github.com/wppconnect-team/wppconnect/commit/4abcfed97778ddb619df65fec0b1c3d0dc4debac)) + +## 1.13.2 (2022-05-28) + +### Bug Fixes + +- Migrate archiveChat and pinChat methods to WA-JS ([cee7e1c](https://github.com/wppconnect-team/wppconnect/commit/cee7e1ced23409d66365e42a35602265e0c09536)) + +## 1.13.1 (2022-05-10) + +# 1.13.0 (2022-04-25) + +### Features + +- Improved chat state to keep alive and online ([ba82005](https://github.com/wppconnect-team/wppconnect/commit/ba82005f11b8ecc8dacee08304b7d3a66bbea6b0)) + +## 1.12.8 (2022-03-13) + +### Bug Fixes + +- Fixed stuck state after logout ([bb9695a](https://github.com/wppconnect-team/wppconnect/commit/bb9695a61404a062daf1d0995ad2bb10af7c5006)) + +## 1.12.7 (2022-03-03) + +### Bug Fixes + +- Fixed onParticipantsChanged and onPresenceChanged function (fix [#864](https://github.com/wppconnect-team/wppconnect/issues/864), fix [#911](https://github.com/wppconnect-team/wppconnect/issues/911)) ([aff7f6c](https://github.com/wppconnect-team/wppconnect/commit/aff7f6cd34c22c086789ca4871c3113d8d8b2bb8)) + +## 1.12.6 (2022-02-22) + +### Bug Fixes + +- Fixed getGroupMembersIds and getGroupMembers for large chats (fix [#892](https://github.com/wppconnect-team/wppconnect/issues/892)) ([9cc34a5](https://github.com/wppconnect-team/wppconnect/commit/9cc34a5fddef52b01feba6194fff31aa19b388f0)) + +## 1.12.5 (2022-02-06) + +## 1.12.4 (2022-01-22) + +### Bug Fixes + +- Fixed getMessageById where the message is from status (fix [#823](https://github.com/wppconnect-team/wppconnect/issues/823)) ([ed57b97](https://github.com/wppconnect-team/wppconnect/commit/ed57b9700efd72f3de7c0c8d658d24b41f4da5d9)) + +## 1.12.3 (2022-01-21) + +### Bug Fixes + +- Updated @wppconnect/wa-js to v1.1.9 ([5074de1](https://github.com/wppconnect-team/wppconnect/commit/5074de182f401b8f8e6b382aa513ca2cc65ef488)) + +## 1.12.2 (2022-01-15) + +## 1.12.1 (2022-01-14) + +# 1.12.0 (2022-01-08) + +### Bug Fixes + +- Fixed downloadMedia (fix [#463](https://github.com/wppconnect-team/wppconnect/issues/463)) ([ea9ba75](https://github.com/wppconnect-team/wppconnect/commit/ea9ba75ec3e24103a7ccf55b0df43ffc8d46271b)) + +## 1.11.1 (2021-12-09) + +### Bug Fixes + +- Fixed getNumberProfile function (fix [#717](https://github.com/wppconnect-team/wppconnect/issues/717)) ([89a0720](https://github.com/wppconnect-team/wppconnect/commit/89a072066991213d301739b0788d19f05a9b0912)) + +# 1.11.0 (2021-12-09) + +### Bug Fixes + +- Fixed initialization of onPresenceChanged (fix [#704](https://github.com/wppconnect-team/wppconnect/issues/704)) ([0470ea8](https://github.com/wppconnect-team/wppconnect/commit/0470ea8a0fd15727f91e18c913b96f3c1e1f79a9)) + +## 1.10.3 (2021-11-18) + +## 1.10.2 (2021-11-15) + +### Bug Fixes + +- Fixed call of createWid function (fix [#647](https://github.com/wppconnect-team/wppconnect/issues/647)) ([c381000](https://github.com/wppconnect-team/wppconnect/commit/c3810003a4f145f9c3ec54f49cde97ddbe01a164)) + +## 1.10.1 (2021-11-11) + +### Features + +- Updated to latest version of WhatsApp ([f6d01a3](https://github.com/wppconnect-team/wppconnect/commit/f6d01a390db9577f46fee0072637ece981e54780)) + +# 1.10.0 (2021-11-06) + +## 1.9.4 (2021-10-21) + +## 1.9.3 (2021-10-21) + +### Bug Fixes + +- Fixed close method ([#579](https://github.com/wppconnect-team/wppconnect/issues/579)) ([ef42485](https://github.com/wppconnect-team/wppconnect/commit/ef42485505e9920b5b7826674949ed9d5e36d4e1)) + +## 1.9.2 (2021-10-12) + +### Features + +- Added onRevokedMessage (close [#434](https://github.com/wppconnect-team/wppconnect/issues/434)) ([b5df5bb](https://github.com/wppconnect-team/wppconnect/commit/b5df5bbcc3418204744057cf45089c3bb2228c57)) + +## 1.9.1 (2021-10-02) + +### Features + +- Added option to use setProfilePic using base64 (close [#505](https://github.com/wppconnect-team/wppconnect/issues/505)) ([87f1841](https://github.com/wppconnect-team/wppconnect/commit/87f184128c2b458f128ff26ac9ea081537b4c2a4)) + +# 1.9.0 (2021-10-02) + +## 1.8.14 (2021-09-19) + +### Bug Fixes + +- Allow to define chat type in sendMessageOptions (close [#504](https://github.com/wppconnect-team/wppconnect/issues/504)) ([bf76179](https://github.com/wppconnect-team/wppconnect/commit/bf761794559c02a5f7a2d842e68fd6562b68b0cb)) + +## 1.8.13 (2021-08-19) + +### Bug Fixes + +- Fixed file mime-type detection (fix [#409](https://github.com/wppconnect-team/wppconnect/issues/409)) ([1609e34](https://github.com/wppconnect-team/wppconnect/commit/1609e34e89b02eaba57cd2c0ef17e94393e89916)) + +## 1.8.12 (2021-08-05) + +## 1.8.11 (2021-08-04) + +### Features + +- Added setOnlinePresence function to define your presence ([627d1a5](https://github.com/wppconnect-team/wppconnect/commit/627d1a5f3a76ea4813420a4fc25784362497da39)) + +## 1.8.10 (2021-07-31) + +### Bug Fixes + +- Corrigido erro "null to object" ao enviar mensagem (fix [#378](https://github.com/wppconnect-team/wppconnect/issues/378)) ([ec103b9](https://github.com/wppconnect-team/wppconnect/commit/ec103b9cae33b993f95cacdb2a1d35fd3e4ecacc)) + +## 1.8.9 (2021-07-27) + +### Bug Fixes + +- Corrigido a função de fixar conversas (pinChat) (fix [#338](https://github.com/wppconnect-team/wppconnect/issues/338)) ([f6bf1f3](https://github.com/wppconnect-team/wppconnect/commit/f6bf1f3f1598719d38eeb9d84bf3a9c0d87de18d)) + +## 1.8.8 (2021-07-27) + +### Bug Fixes + +- Corrigido problema de ES Module (fix [#362](https://github.com/wppconnect-team/wppconnect/issues/362)) ([dcdefc4](https://github.com/wppconnect-team/wppconnect/commit/dcdefc4e7e0dbeb5cd3678ee0b7e7f92e8210dba)) + +## 1.8.7 (2021-07-26) + +## 1.8.6 (2021-07-23) + +## [1.8.5](https://github.com/wppconnect-team/wppconnect/compare/v1.8.4...v1.8.5) (2021-07-20) + +## 1.8.4 (2021-07-20) + +### Bug Fixes + +- Corrigido o envio de arquivos de tipos de áudio via URL (fix [#329](https://github.com/wppconnect-team/wppconnect/issues/329)) ([6e8b836](https://github.com/wppconnect-team/wppconnect/commit/6e8b836f40ecda9df4870b09d6fc11410a15e1f6)) + +## 1.8.3 (2021-07-14) + +### Bug Fixes + +- Corrigido disparos de onNotificationMessage e onParticipantsChanged ao iniciar ([d421f7b](https://github.com/wppconnect-team/wppconnect/commit/d421f7bc860ec4cee503340c14e676692094ac1d)) + +## 1.8.2 (2021-07-14) + +### Features + +- Adicionado recurso de recusar ligação do WhatsApp (close [#299](https://github.com/wppconnect-team/wppconnect/issues/299)) ([e7ef0b6](https://github.com/wppconnect-team/wppconnect/commit/e7ef0b6db0aecf57bd058c681127a0bdd756636b)) + +## [1.8.1](https://github.com/wppconnect-team/wppconnect/compare/v1.8.0...v1.8.1) (2021-07-12) + +### Bug Fixes + +- Atualizado a versão estável do WhatsApp ([08dabb2](https://github.com/wppconnect-team/wppconnect/commit/08dabb21f3b4d00175efc7d260a257a805fe4716)) + +# [1.8.0](https://github.com/wppconnect-team/wppconnect/compare/v1.7.5...v1.8.0) (2021-07-12) + +### Features + +- Estabilidade para evitar problemas na atualização do WhatsApp ([97d26ab](https://github.com/wppconnect-team/wppconnect/commit/97d26ab7b3c18ba699f4888d0b109a5b8bd9d3d7)) + +## [1.7.5](https://github.com/wppconnect-team/wppconnect/compare/v1.7.4...v1.7.5) (2021-07-09) + +### Bug Fixes + +- Corrigido injeção de script para nova versão do WhatsApp Web ([efd6fe7](https://github.com/wppconnect-team/wppconnect/commit/efd6fe76ffdd4b2ae3e287736a4bf3dd8315e23e)) + +## [1.7.4](https://github.com/wppconnect-team/wppconnect/compare/v1.7.3...v1.7.4) (2021-07-08) + +### Bug Fixes + +- Corrigido o disparo do evento onAddedToGroup ([9e0fcbe](https://github.com/wppconnect-team/wppconnect/commit/9e0fcbe6f022e4acbb047cfbd814c9012a293722)) + +## [1.7.3](https://github.com/wppconnect-team/wppconnect/compare/v1.7.2...v1.7.3) (2021-07-02) + +### Bug Fixes + +- Corrigido função onAddedToGroup (fix [#276](https://github.com/wppconnect-team/wppconnect/issues/276)) ([f034d1a](https://github.com/wppconnect-team/wppconnect/commit/f034d1ad69f43634da8d9924f7c968cd5fdcbe18)) +- Envolvido todos erros para separar erro da LIB do puppeteer ([68b933d](https://github.com/wppconnect-team/wppconnect/commit/68b933d8816ba3a2d0a0a34acdbbed2155d7dcf9)) + +### Performance Improvements + +- Removido chat da serialização de mensagem para maior desempenho ([#289](https://github.com/wppconnect-team/wppconnect/issues/289)) ([69df15c](https://github.com/wppconnect-team/wppconnect/commit/69df15cc39406ee4e9e3d5e1e35b8764d4247d73)) +- Removido o quotedMsgObj da serialização de mensagem e adicionado quotedMsgId ([#289](https://github.com/wppconnect-team/wppconnect/issues/289)) ([3f6daaf](https://github.com/wppconnect-team/wppconnect/commit/3f6daaf6235e6f3e4de8d417aafdfc5091fa170c)) + +## [1.7.2](https://github.com/wppconnect-team/wppconnect/compare/v1.7.1...v1.7.2) (2021-07-01) + +### Features + +- Adicionado nova função getMessages (fix [#282](https://github.com/wppconnect-team/wppconnect/issues/282)) ([ee783e4](https://github.com/wppconnect-team/wppconnect/commit/ee783e423292665c355f5232ccec8b363a872dd3)) + +## [1.7.1](https://github.com/wppconnect-team/wppconnect/compare/v1.7.0...v1.7.1) (2021-06-22) + +### Bug Fixes + +- Corrigido a função sendLocation (fix [#273](https://github.com/wppconnect-team/wppconnect/issues/273)) ([e3dd987](https://github.com/wppconnect-team/wppconnect/commit/e3dd987c4a5dd4412d50f7b86d67577384878e06)) + +# [1.7.0](https://github.com/wppconnect-team/wppconnect/compare/v1.6.0...v1.7.0) (2021-06-21) + +### Bug Fixes + +- Corrigido a função getProfilePicFromServer ([#240](https://github.com/wppconnect-team/wppconnect/issues/240)) ([b7061e5](https://github.com/wppconnect-team/wppconnect/commit/b7061e5da570ba146dd18695a9de7e62858d70bc)) +- Corrigido e melhorado a função de onLiveLocation (fix [#258](https://github.com/wppconnect-team/wppconnect/issues/258)) ([6bc6d7e](https://github.com/wppconnect-team/wppconnect/commit/6bc6d7e706eb2a6a30e8f24a81e466f35a2c2c10)) + +### Features + +- new functions catalog business ([#255](https://github.com/wppconnect-team/wppconnect/issues/255)) ([96d391e](https://github.com/wppconnect-team/wppconnect/commit/96d391e90dfea9e5dee8cd72d6d04e6d842c5ea2)) + +# [1.6.0](https://github.com/wppconnect-team/wppconnect/compare/v1.5.2...v1.6.0) (2021-06-02) + +### Bug Fixes + +- Fixed send message to non contact ([c66b597](https://github.com/wppconnect-team/wppconnect/commit/c66b597f80ed8d08c0c07ba0ca9252f6f328372e)) + +## [1.5.2](https://github.com/wppconnect-team/wppconnect/compare/v1.5.1...v1.5.2) (2021-05-24) + +### Bug Fixes + +- Fixed click to reload qr code, Update scrape-img-qr.ts ([a2104e4](https://github.com/wppconnect-team/wppconnect/commit/a2104e4b5bb50a606c90a2d7d42801289f33f2c1)) Thanks to @AlanMartines + +## [1.5.1](https://github.com/wppconnect-team/wppconnect/compare/v1.5.0...v1.5.1) (2021-05-21) + +### Bug Fixes + +- Fixed getGroupInviteLink function (fix [#214](https://github.com/wppconnect-team/wppconnect/issues/214)) ([597715b](https://github.com/wppconnect-team/wppconnect/commit/597715bc2984c2e4e56942830f893e52d61f9091)) + +### Features + +- Added revokeGroupInviteLink function; ([50feb3c](https://github.com/wppconnect-team/wppconnect/commit/50feb3ceeaa1ed5a0648158f85a11853931725cb)) + +# [1.5.0](https://github.com/wppconnect-team/wppconnect/compare/v1.4.1...v1.5.0) (2021-05-18) + +### Bug Fixes + +- Fixed sendFile return type ([#208](https://github.com/wppconnect-team/wppconnect/issues/208)) ([67dfad5](https://github.com/wppconnect-team/wppconnect/commit/67dfad5c54c598791dc0ac3a0947d5c339fffe2c)) +- Fixed sendPtt return type (fix [#208](https://github.com/wppconnect-team/wppconnect/issues/208)) ([5b701f7](https://github.com/wppconnect-team/wppconnect/commit/5b701f7834134e51d92cff9a86665bf1bce3abf6)) +- Fixed setChatState function (fix [#188](https://github.com/wppconnect-team/wppconnect/issues/188)) ([3351bf7](https://github.com/wppconnect-team/wppconnect/commit/3351bf797b49732efccc4306aca04f4899e3a32c)) + +### Features + +- Added onPresenceChanged to listen presence change ([4629699](https://github.com/wppconnect-team/wppconnect/commit/46296992602ea12631821d1345e5c6c32a5efd3d)) +- Added starMessage function to star/unstar messages ([b83fcbb](https://github.com/wppconnect-team/wppconnect/commit/b83fcbb6ec67578dcddb936ecb2bee079f5cdd46)) + +## [1.4.1](https://github.com/wppconnect-team/wppconnect/compare/v1.4.0...v1.4.1) (2021-05-14) + +### Bug Fixes + +- Fixed archiveChat function ([#194](https://github.com/wppconnect-team/wppconnect/issues/194)) ([1ee2bce](https://github.com/wppconnect-team/wppconnect/commit/1ee2bce38841fc4d123c08fc8395639bfada1c41)) +- Fixed clearChat function ([#194](https://github.com/wppconnect-team/wppconnect/issues/194)) ([4ee7a2e](https://github.com/wppconnect-team/wppconnect/commit/4ee7a2ec0c3bb58aab9ae4df4dc0a0c4f682617a)) +- Fixed return of forwardMessages function ([#194](https://github.com/wppconnect-team/wppconnect/issues/194)) ([d81f94b](https://github.com/wppconnect-team/wppconnect/commit/d81f94bc195a559222a07340ab1c1209c6251558)) + +# [1.4.0](https://github.com/wppconnect-team/wppconnect/compare/v1.3.6...v1.4.0) (2021-05-08) + +### Bug Fixes + +- Fixed getAllMessagesInChat function when chat not found ([2760f68](https://github.com/wppconnect-team/wppconnect/commit/2760f68e2347f4ec9b664315c4a1a89371760aab)) +- Fixed onParticipantsChanged function (fix [#171](https://github.com/wppconnect-team/wppconnect/issues/171)) ([08975a0](https://github.com/wppconnect-team/wppconnect/commit/08975a0657eaed1e4dfc1673003ffac9c657c87f)) +- Improved speed of loadAndGetAllMessagesInChat function (fix [#166](https://github.com/wppconnect-team/wppconnect/issues/166)) ([7f1348a](https://github.com/wppconnect-team/wppconnect/commit/7f1348ac75756822c9356ecc2fc8d793a84f0e30)) + +### Features + +- Added getAllBroadcastList function (close [#184](https://github.com/wppconnect-team/wppconnect/issues/184)) ([351be03](https://github.com/wppconnect-team/wppconnect/commit/351be03ba4801566753e8856ee3940fb362e202e)) +- Added onNotificationMessage function for notif. msg. ([#171](https://github.com/wppconnect-team/wppconnect/issues/171)) ([32c395b](https://github.com/wppconnect-team/wppconnect/commit/32c395b2f936b9b9d259ca43acaa44c02d455bb6)) + +## [1.3.6](https://github.com/wppconnect-team/wppconnect/compare/v1.3.5...v1.3.6) (2021-05-04) + +### Bug Fixes + +- Fixed getAllUnreadMessages and getAllNewMessages (fix [#170](https://github.com/wppconnect-team/wppconnect/issues/170)) ([c45314f](https://github.com/wppconnect-team/wppconnect/commit/c45314f25112a93b242ebd5985e5c69aa8008166)) + +## [1.3.5](https://github.com/wppconnect-team/wppconnect/compare/v1.3.3...v1.3.5) (2021-05-03) + +### Bug Fixes + +- Fixed deletion of tmp chrome user data dir on exit ([8586505](https://github.com/wppconnect-team/wppconnect/commit/85865059810ba9388f172c2ff3b681bae6a3b420)) +- Fixed sendVideoAsGif from URL ([0422a5b](https://github.com/wppconnect-team/wppconnect/commit/0422a5bf7ba94c8d5255592fbc6b5a959ca8ba7d)) + +### Features + +- Added sendGif method to send GIF in the chat ([#112](https://github.com/wppconnect-team/wppconnect/issues/112)) ([4ee590c](https://github.com/wppconnect-team/wppconnect/commit/4ee590c1d0c07bec7d5789deb60f693e0a524192)) + +## [1.3.4](https://github.com/wppconnect-team/wppconnect/compare/v1.3.3...v1.3.4) (2021-04-30) + +### Bug Fixes + +- Fixed deletion of tmp chrome user data dir on exit ([8586505](https://github.com/wppconnect-team/wppconnect/commit/85865059810ba9388f172c2ff3b681bae6a3b420)) + +## [1.3.3](https://github.com/wppconnect-team/wppconnect/compare/v1.3.2...v1.3.3) (2021-04-28) + +## [1.3.2](https://github.com/wppconnect-team/wppconnect/compare/v1.3.1...v1.3.2) (2021-04-28) + +### Bug Fixes + +- Fixed message ID generator ([0da9a62](https://github.com/wppconnect-team/wppconnect/commit/0da9a62490073642aa00dc4f7052465de271f7f3)) +- Fixed sendContact with custom name ([#152](https://github.com/wppconnect-team/wppconnect/issues/152)) ([47a51f0](https://github.com/wppconnect-team/wppconnect/commit/47a51f060814ab79704b160227c350092e2abe3f)) + +### Features + +- Allow to define contact name in sendContactVcardList ([#152](https://github.com/wppconnect-team/wppconnect/issues/152)) ([474e5a0](https://github.com/wppconnect-team/wppconnect/commit/474e5a061496cd96ca4864b0d033813bc47c573a)) + +## [1.3.1](https://github.com/wppconnect-team/wppconnect/compare/v1.3.0...v1.3.1) (2021-04-20) + +### Features + +- Added function to enable and disable temporary messages ([5a9a289](https://github.com/wppconnect-team/wppconnect/commit/5a9a2891785e6b34e3bcb6a6cee3502101e36d7f)) +- Added options to edit group description, subject and properties ([07d155f](https://github.com/wppconnect-team/wppconnect/commit/07d155fb5ca891223881100b28931c4fbbf37740)) + +# [1.3.0](https://github.com/wppconnect-team/wppconnect/compare/v1.2.6...v1.3.0) (2021-04-16) + +### Bug Fixes + +- corrects update instructions ([#124](https://github.com/wppconnect-team/wppconnect/issues/124)) ([8cbfb9b](https://github.com/wppconnect-team/wppconnect/commit/8cbfb9b2c48879d5c6709a40eb7e53188a1347f2)) + +### Features + +- Created tokenStore interface for session data management ([a3a76c3](https://github.com/wppconnect-team/wppconnect/commit/a3a76c3e2e01581ff2ae4e40199eab5957bac0a3)) + +## [1.2.6](https://github.com/wppconnect-team/wppconnect/compare/v1.2.5...v1.2.6) (2021-04-12) + +### Bug Fixes + +- Fixed sendFile from URL ([ff63fed](https://github.com/wppconnect-team/wppconnect/commit/ff63fedd51793896169cc09097e13d99290ec031)) + +## [1.2.5](https://github.com/wppconnect-team/wppconnect/compare/v1.2.4...v1.2.5) (2021-04-07) + +### Bug Fixes + +- Fixed event dispose to stop listeners ([#103](https://github.com/wppconnect-team/wppconnect/issues/103)) ([0682c06](https://github.com/wppconnect-team/wppconnect/commit/0682c06122dc534789cea5721a515e4bdd96e4de)) + +### Features + +- Added phoneWatchdog verification ([6616fa2](https://github.com/wppconnect-team/wppconnect/commit/6616fa22567fe0ea1f35fff32ec1f8b070e76695)) + +## [1.2.4](https://github.com/wppconnect-team/wppconnect/compare/v1.2.3...v1.2.4) (2021-03-30) + +### Bug Fixes + +- Fixed inject token for authentication ([c36466f](https://github.com/wppconnect-team/wppconnect/commit/c36466faddda75dcbfcc7f1e18d275917e41e707)) + +## [1.2.3](https://github.com/wppconnect-team/wppconnect/compare/v1.2.2...v1.2.3) (2021-03-29) + +### Bug Fixes + +- Fixed downloadMedia with new WhatsApp version (fix [#76](https://github.com/wppconnect-team/wppconnect/issues/76)) ([f61e118](https://github.com/wppconnect-team/wppconnect/commit/f61e1183937e8dd2989d892b6a8e7b8e117cd22e)) + +## [1.2.2](https://github.com/wppconnect-team/wppconnect/compare/v1.2.1...v1.2.2) (2021-03-29) + +### Bug Fixes + +- Fixed logged token delete on disconnect ([883d0d4](https://github.com/wppconnect-team/wppconnect/commit/883d0d415a6dd7d05625adcefaa0d3d397fc11ed)) +- Fixed statusFind callback (#fix 57) ([cc0d3d6](https://github.com/wppconnect-team/wppconnect/commit/cc0d3d69855ae219699ea65a53e63379f72e3aa6)) + +## [1.2.1](https://github.com/wppconnect-team/wppconnect/compare/v1.2.0...v1.2.1) (2021-03-04) + +### Bug Fixes + +- Fixed send to status@broadcast ([a0c8d20](https://github.com/wppconnect-team/wppconnect/commit/a0c8d2053d15851dbde34b3a4f3ce03481f8ea09)) + +# [1.2.0](https://github.com/wppconnect-team/wppconnect/compare/v1.1.0...v1.2.0) (2021-03-02) + +### Bug Fixes + +- Increased timeout WhatsApp page load ([c1f8f03](https://github.com/wppconnect-team/wppconnect/commit/c1f8f03476038bceb9f62fd6648124b774794551)) + +### Features + +- Improved module loader ([#27](https://github.com/wppconnect-team/wppconnect/issues/27)) ([0f44d20](https://github.com/wppconnect-team/wppconnect/commit/0f44d2030b34c0101b3f34d995d824f240aa5548)) + +# [1.1.0](https://github.com/wppconnect-team/wppconnect/compare/v1.0.3...v1.1.0) (2021-02-27) + +### Bug Fixes + +- Fixed decryptFile function ([c92597b](https://github.com/wppconnect-team/wppconnect/commit/c92597bb7bda03ee5b4905881894e13e0003e24b)) + +### Features + +- Allow pass browser/page in create method ([#19](https://github.com/wppconnect-team/wppconnect/issues/19)) ([a2902e8](https://github.com/wppconnect-team/wppconnect/commit/a2902e8840046407b56da59ba5d2c1e5c16b5c0b)) + +## [1.0.3](https://github.com/wppconnect-team/wppconnect/compare/v1.0.2...v1.0.3) (2021-02-26) + +### Bug Fixes + +- Fixed "sender" field in message return ([ca5f6ef](https://github.com/wppconnect-team/wppconnect/commit/ca5f6efea3bfcb6b58acd949d2d9035d1088de4f)) + +### chore + +- Deprecated create with argument option position based ([020e71c](https://github.com/wppconnect-team/wppconnect/commit/020e71c7e95eb20a0a623b6e7c218f52c32a172b)) + +### BREAKING CHANGES + +- Deprecated create from argument in favor of CreateOptions + +## [1.0.2](https://github.com/wppconnect-team/wppconnect/compare/v1.0.1...v1.0.2) (2021-02-25) + +### Bug Fixes + +- WhatsApp Web v2.2106.5 compatibility ([fa9d575](https://github.com/wppconnect-team/wppconnect/commit/fa9d575bff21d2a97dda59378e49740b15460a63)) + +## [1.0.1](https://github.com/wppconnect-team/wppconnect/compare/v1.0.0...v1.0.1) (2021-02-24) + +### Bug Fixes + +- Fixed sendPtt from audio with codecs ([2a8b476](https://github.com/wppconnect-team/wppconnect/commit/2a8b476de07366267bb1e683ac632f2e6b815a75)) + +### Features + +- Added sendPtt from file ([ae38c8e](https://github.com/wppconnect-team/wppconnect/commit/ae38c8e38c6c8b731b0ceda008c9224b497f42fd)) + +# [1.0.0](https://github.com/wppconnect-team/wppconnect/compare/v0.0.2...v1.0.0) (2021-02-24) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 000000000..3035a2aae --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,3 @@ +# Contributing + +PRs are welcome. Just please mantain the code as clean as possible and use common JS conventions diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 000000000..0927556b5 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,157 @@ +### GNU LESSER GENERAL PUBLIC LICENSE + +Version 3, 29 June 2007 + +Copyright (C) 2007 Free Software Foundation, Inc. + + +Everyone is permitted to copy and distribute verbatim copies of this +license document, but changing it is not allowed. + +This version of the GNU Lesser General Public License incorporates the +terms and conditions of version 3 of the GNU General Public License, +supplemented by the additional permissions listed below. + +#### 0. Additional Definitions. + +As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the +GNU General Public License. + +"The Library" refers to a covered work governed by this License, other +than an Application or a Combined Work as defined below. + +An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + +A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + +The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + +The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + +#### 1. Exception to Section 3 of the GNU GPL. + +You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + +#### 2. Conveying Modified Versions. + +If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + +- a) under this License, provided that you make a good faith effort + to ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or +- b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + +#### 3. Object Code Incorporating Material from Library Header Files. + +The object code form of an Application may incorporate material from a +header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + +- a) Give prominent notice with each copy of the object code that + the Library is used in it and that the Library and its use are + covered by this License. +- b) Accompany the object code with a copy of the GNU GPL and this + license document. + +#### 4. Combined Works. + +You may convey a Combined Work under terms of your choice that, taken +together, effectively do not restrict modification of the portions of +the Library contained in the Combined Work and reverse engineering for +debugging such modifications, if you also do each of the following: + +- a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. +- b) Accompany the Combined Work with a copy of the GNU GPL and this + license document. +- c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. +- d) Do one of the following: + - 0) Convey the Minimal Corresponding Source under the terms of + this License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + - 1) Use a suitable shared library mechanism for linking with + the Library. A suitable mechanism is one that (a) uses at run + time a copy of the Library already present on the user's + computer system, and (b) will operate properly with a modified + version of the Library that is interface-compatible with the + Linked Version. +- e) Provide Installation Information, but only if you would + otherwise be required to provide such information under section 6 + of the GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the Application + with a modified version of the Linked Version. (If you use option + 4d0, the Installation Information must accompany the Minimal + Corresponding Source and Corresponding Application Code. If you + use option 4d1, you must provide the Installation Information in + the manner specified by section 6 of the GNU GPL for conveying + Corresponding Source.) + +#### 5. Combined Libraries. + +You may place library facilities that are a work based on the Library +side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + +- a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities, conveyed under the terms of this License. +- b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + +#### 6. Revised Versions of the GNU Lesser General Public License. + +The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +as you received it specifies that a certain numbered version of the +GNU Lesser General Public License "or any later version" applies to +it, you have the option of following the terms and conditions either +of that published version or of any later version published by the +Free Software Foundation. If the Library as you received it does not +specify a version number of the GNU Lesser General Public License, you +may choose any version of the GNU Lesser General Public License ever +published by the Free Software Foundation. + +If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/README.md b/README.md new file mode 100644 index 000000000..864ab074d --- /dev/null +++ b/README.md @@ -0,0 +1,94 @@ +# WPPConnect 📞 + +![WPPConnect Banner](./img/wppconnect-banner.jpeg) + +[![npm version](https://img.shields.io/npm/v/@wppconnect-team/wppconnect.svg?color=green)](https://www.npmjs.com/package/@wppconnect-team/wppconnect) +[![Downloads](https://img.shields.io/npm/dm/@wppconnect-team/wppconnect.svg)](https://www.npmjs.com/package/@wppconnect-team/wppconnect) +[![Average time to resolve an issue](https://isitmaintained.com/badge/resolution/wppconnect-team/wppconnect.svg)](https://isitmaintained.com/project/wppconnect-team/wppconnect 'Average time to resolve an issue') +[![Percentage of issues still open](https://isitmaintained.com/badge/open/wppconnect-team/wppconnect.svg)](https://isitmaintained.com/project/wppconnect-team/wppconnect 'Percentage of issues still open') +[![Build Status](https://img.shields.io/github/actions/workflow/status/wppconnect-team/wppconnect/build.yml?branch=master)](https://github.com/wppconnect-team/wppconnect/actions) +[![Lint Status](https://img.shields.io/github/actions/workflow/status/wppconnect-team/wppconnect/lint.yml?branch=master&label=lint)](https://github.com/wppconnect-team/wppconnect/actions) +[![release-it](https://img.shields.io/badge/%F0%9F%93%A6%F0%9F%9A%80-release--it-e10079.svg)](https://github.com/release-it/release-it) + +> WPPConnect is an open source project developed by the JavaScript community with the aim of exporting functions from WhatsApp Web to the node, which can be used to support the creation of any interaction, such as customer service, media sending, intelligence recognition based on phrases artificial and many other things, use your imagination... 😀🤔💭 + +

+ Getting Started • + Basic Function • + Documentation +

+ +## Our online channels + +[![Discord](https://img.shields.io/discord/844351092758413353?color=blueviolet&label=Discord&logo=discord&style=flat)](https://discord.gg/JU5JGGKGNG) +[![Telegram Group](https://img.shields.io/badge/Telegram-Group-32AFED?logo=telegram)](https://t.me/wppconnect) +[![WhatsApp Group](https://img.shields.io/badge/WhatsApp-Group-25D366?logo=whatsapp)](https://chat.whatsapp.com/LJaQu6ZyNvnBPNAVRbX00K) +[![YouTube](https://img.shields.io/youtube/channel/subscribers/UCD7J9LG08PmGQrF5IS7Yv9A?label=YouTube)](https://www.youtube.com/c/wppconnect) + +## Functions + +| | | +| ---------------------------------------------------------- | --- | +| Automatic QR Refresh | ✔ | +| Send **text, image, video, audio and docs** | ✔ | +| Get **contacts, chats, groups, group members, Block List** | ✔ | +| Send contacts | ✔ | +| Send stickers | ✔ | +| Send stickers GIF | ✔ | +| Multiple Sessions | ✔ | +| Forward Messages | ✔ | +| Receive message | ✔ | +| insert user section | ✔ | +| Send _location_ | ✔ | +| **and much more** | ✔ | + +See more at WhatsApp methods + +## Installation + +The first thing that you had to do is install the `npm package` : + +```bash +npm i --save @wppconnect-team/wppconnect +``` + +See more at Getting Started + +## Development + +Building WPPConnect is really simple, to build the entire project just run + +```bash +> npm run build +``` + +## Maintainers + +Maintainers are needed, I cannot keep with all the updates by myself. If you are +interested please open a Pull Request. + +## Contributing + +Pull requests are welcome. For major changes, please open an issue first to +discuss what you would like to change. + +## Star History + +[![Star History Chart](https://api.star-history.com/svg?repos=wppconnect-team/wppconnect,wppconnect-team/wa-js&type=Date)](https://star-history.com/#wppconnect-team/wppconnect&wppconnect-team/wa-js&Date) + +## License + +This file is part of WPPConnect. + +WPPConnect is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +WPPConnect is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with WPPConnect. If not, see . diff --git a/Update.md b/Update.md new file mode 100644 index 000000000..620de2e84 --- /dev/null +++ b/Update.md @@ -0,0 +1,5 @@ +# Update checking + +Whatsapp is in constant change, in order to tackle this issue I suggest keeping your Wppconnect package always up-to-date. + +The method/function names won't change, only their core algorithm. This way you won't have to makes changes in your code at every update. They will remain the same forever. diff --git a/docs/getting-started/basic-functions.md b/docs/getting-started/basic-functions.md new file mode 100644 index 000000000..c3967fa86 --- /dev/null +++ b/docs/getting-started/basic-functions.md @@ -0,0 +1,325 @@ +# Basic functions (usage) + +Not every available function will be listed, for further look, every function +available can be found in {@link Whatsapp} + +## Summary + +- [Chatting](#chatting) + - [sendContactVcard](#sendcontactvcard) + - [sendContactVcardList](#sendcontactvcardlist) + - [sendText](#sendtext) + - [sendLocation](#sendlocation) + - [sendLinkPreview](#sendlinkpreview) + - [sendImage](#sendimage) + - [sendFile](#sendfile) + - [sendFileFromBase64](#sendfilefrombase64) + - [sendImageAsStickerGif](#sendimageasstickergif) + - [sendImageAsSticker](#sendimageassticker) + - [sendMentioned](#sendmentioned) + - [reply](#reply) + - [reply with mention](#reply-with-mention) + - [sendMessageOptions](#sendmessageoptions) + - [sendVideoAsGif](#sendvideoasgif) + - [forwardMessages](#forwardmessages) + - [sendSeen](#sendseen) + - [startTyping](#starttyping) + - [stopTyping](#stoptyping) + - [setChatState](#setchatstate) + +## Chatting + +> Here, `chatId` could be `@c.us` or `-@g.us` + +### sendContactVcard + +Send contact + +```javascript +await client + .sendContactVcard('000000000000@c.us', '111111111111@c.us', 'Name of contact') + .then((result) => { + console.log('Result: ', result); //return object success + }) + .catch((erro) => { + console.error('Error when sending: ', erro); //return object error + }); +``` + +### sendContactVcardList + +Send a list of contact cards + +```javascript +await client + .sendContactVcardList('000000000000@c.us', [ + '111111111111@c.us', + '222222222222@c.us', + ]) + .then((result) => { + console.log('Result: ', result); //return object success + }) + .catch((erro) => { + console.error('Error when sending: ', erro); //return object error + }); +``` + +### sendText + +Send basic text + +```javascript +await client + .sendText('000000000000@c.us', '👋 Hello from wppconnect!') + .then((result) => { + console.log('Result: ', result); //return object success + }) + .catch((erro) => { + console.error('Error when sending: ', erro); //return object error + }); +``` + +### sendLocation + +Send location + +```javascript +await client + .sendLocation('000000000000@c.us', '-13.6561589', '-69.7309264', 'Brasil') + .then((result) => { + console.log('Result: ', result); //return object success + }) + .catch((erro) => { + console.error('Error when sending: ', erro); //return object error + }); +``` + +### sendLinkPreview + +Automatically sends a link with the auto-generated link preview. You can also add a custom message to be added. + +```javascript +await client + .sendLinkPreview( + '000000000000@c.us', + 'https://www.youtube.com/watch?v=V1bFr2SWP1I', + 'Kamakawiwo ole' + ) + .then((result) => { + console.log('Result: ', result); //return object success + }) + .catch((erro) => { + console.error('Error when sending: ', erro); //return object error + }); +``` + +### sendImage + +Send an image (you can also upload an image using a valid HTTP protocol) + +```javascript +await client + .sendImage( + '000000000000@c.us', + 'path/to/img.jpg', + 'image-name', + 'Caption text' + ) + .then((result) => { + console.log('Result: ', result); //return object success + }) + .catch((erro) => { + console.error('Error when sending: ', erro); //return object error + }); +``` + +### sendFile + +Send a file (wppconnect will take care of mime types, just needs the path).\ +You can also upload an image using a valid HTTP protocol + +```javascript +await client + .sendFile( + '000000000000@c.us', + 'path/to/file.pdf', + 'file_name', + 'See my file in pdf' + ) + .then((result) => { + console.log('Result: ', result); //return object success + }) + .catch((erro) => { + console.error('Error when sending: ', erro); //return object error + }); +``` + +### sendFileFromBase64 + +Sends a file. + +> base64 parameter should have mime type already defined + +```javascript +await client + .sendFileFromBase64( + '000000000000@c.us', + base64PDF, + 'file_name.pdf', + 'See my file in pdf' + ) + .then((result) => { + console.log('Result: ', result); //return object success + }) + .catch((erro) => { + console.error('Error when sending: ', erro); //return object error + }); +``` + +### sendImageAsStickerGif + +Generates a sticker from the provided animated gif image and sends it (Send an image as an animated sticker)\ +Image path imageBase64 A valid gif and webp image will be required. You can also send it via HTTP/HTTPS () + +```javascript +await client + .sendImageAsStickerGif('000000000000@c.us', './image.gif') + .then((result) => { + console.log('Result: ', result); //return object success + }) + .catch((erro) => { + console.error('Error when sending: ', erro); //return object error + }); +``` + +### sendImageAsSticker + +Generates a sticker from a given image and sends it (Send Image As Sticker)\ +image path imageBase64 A valid PNG, JPG, and WebP image will be required. You can also send it via HTTP/HTTPS () + +```javascript +await client + .sendImageAsSticker('000000000000@c.us', './image.jpg') + .then((result) => { + console.log('Result: ', result); //return object success + }) + .catch((erro) => { + console.error('Error when sending: ', erro); //return object error + }); +``` + +### sendMentioned + +Send `@tagged` message + +```javascript +await client.sendMentioned( + '000000000000@c.us', + 'Hello @5218113130740 and @5218243160777!', + ['5218113130740', '5218243160777'] +); +``` + +### reply + +Reply to a message + +```javascript +await client.reply( + '000000000000@c.us', + 'This is a reply!', + message.id.toString() +); +``` + +### reply with mention + +Reply to a message with a mention + +```javascript +await client.reply( + '000000000000@c.us', + 'Hello @5218113130740 and @5218243160777! This is a reply with mention!', + message.id.toString(), + ['5218113130740', '5218243160777'] +); +``` + +### sendMessageOptions + +Send a message with options + +```javascript +await client + .sendMessageOptions( + '000000000000@c.us', + 'This is a reply!', + { + quotedMessageId: reply, + } + ) + .then((result) => { + console.log(result); + }) + .catch((e) => { + console.log(e); + }); + +``` + +### sendVideoAsGif + +Send a gif + +```javascript +await client.sendVideoAsGif( + '000000000000@c.us', + 'path/to/video.mp4', + 'video.gif', + 'Gif image file' +); +``` + +### forwardMessages + +Forwards messages + +```javascript +await client.forwardMessages( + '000000000000@c.us', + [message.id.toString()], + true +); +``` + +### sendSeen + +Send seen ✔️✔️ + +```javascript +await client.sendSeen('000000000000@c.us'); +``` + +### startTyping + +Start typing... + +```javascript +await client.startTyping('000000000000@c.us'); +``` + +### stopTyping + +Stop typing + +```javascript +await client.stopTyping('000000000000@c.us'); +``` + +### setChatState + +Set chat state (0: Typing, 1: Recording, 2: Paused) + +```javascript +await client.setChatState('000000000000@c.us', 0 | 1 | 2); +``` diff --git a/docs/getting-started/configuring-logger.md b/docs/getting-started/configuring-logger.md new file mode 100644 index 000000000..0c91e9b18 --- /dev/null +++ b/docs/getting-started/configuring-logger.md @@ -0,0 +1,87 @@ +# Configuring the logger + +`Wppconnect Bot` uses the [winston](https://github.com/winstonjs/winston) package for log management. + +`wppconnect.defaultLogger` is an instance of `winston.createLogger`. + +## Default log level + +The default log level is `info` + +```javascript +// Supports ES6 +// import * as wppconnect from '@wppconnect-team/wppconnect'; +const wppconnect = require('@wppconnect-team/wppconnect'); + +// Levels: 'error', 'warn', 'info', 'http', 'verbose', 'debug', 'silly' +// All logs: 'silly' +wppconnect.defaultLogger.level = 'silly'; + +// If you want to stop console logging +wppconnect.defaultLogger.transports.forEach((t) => (t.silent = true)); +``` + +## Using a custom logger + +```javascript +// Supports ES6 +// import * as wppconnect from '@wppconnect-team/wppconnect'; +// import * as winston from 'winston'; +const wppconnect = require('@wppconnect-team/wppconnect'); +const winston = require('winston'); + +const logger = winston.createLogger({ + level: 'info', + format: winston.format.json(), + defaultMeta: { service: 'user-service' }, + transports: [ + // + // - Write all logs with level `error` and below to `error.log` + // - Write all logs with level `info` and below to `combined.log` + // + new winston.transports.File({ filename: 'error.log', level: 'error' }), + new winston.transports.File({ filename: 'combined.log' }), + ], +}); + +wppconnect + .create({ + session: 'sessionName', + logger: logger, + }) + .then((client) => { + client.start(); + }) + .catch((erro) => { + console.log(erro); + }); +``` + +## Log to file + +By default, wppconnect uses the Console transport for logging. + +If you want to save the log to a file, you can configure +using the [winston transport](https://github.com/winstonjs/winston#transports) + +```javascript +// Supports ES6 +// import * as wppconnect from '@wppconnect-team/wppconnect'; +// import * as winston from 'winston'; +const wppconnect = require('@wppconnect-team/wppconnect'); +const winston = require('winston'); + +// Optional: Remove all default transports +wppconnect.defaultLogger.clear(); // Remove all transports + +// Create a file transport +const files = new winston.transports.File({ filename: 'combined.log' }); +wppconnect.defaultLogger.add(files); // Add file transport + +//Optional: create a custom console with error level +const console = new winston.transports.Console({ level: 'erro' }); +wppconnect.defaultLogger.add(console); // Add console transport + +//Optional: Remove the custom transport +wppconnect.defaultLogger.remove(console); // Remove console transport +``` diff --git a/docs/getting-started/creating-client.md b/docs/getting-started/creating-client.md new file mode 100644 index 000000000..733af456e --- /dev/null +++ b/docs/getting-started/creating-client.md @@ -0,0 +1,188 @@ +# Creating a Client + +To start using `Wppconnect Bot`, create a file and call the {@link create} method.\ +That method returns a `Promise` of {@link Whatsapp}. + +```javascript +// Supports ES6 +// import { create, Whatsapp } from '@wppconnect-team/wppconnect'; +const wppconnect = require('@wppconnect-team/wppconnect'); + +wppconnect + .create() + .then((client) => client.start()) + .catch((error) => console.log(error)); +``` + +## Multi sessions + +If you want to start more than one session, for example, +in case you have different departments in your project, +then you had to specify it in your code like in that example: + +```javascript +// Init sales WhatsApp bot +wppconnect.create({session: 'sales'}).then((client) => client.start()); + +// Init support WhatsApp bot +wppconnect.create({session: 'support'}).then((client) => client.start()); +``` + +## Passing options on create + +The {@link create} method third parameter can have the following optional parameters (see all parameters in {@link CreateOptions}): + +```javascript +wppconnect.create({ + session: 'sessionName', //Pass the name of the client you want to start the bot + catchQR: (base64Qrimg, asciiQR, attempts, urlCode) => { + console.log('Number of attempts to read the qrcode: ', attempts); + console.log('Terminal qrcode: ', asciiQR); + console.log('base64 image string qrcode: ', base64Qrimg); + console.log('urlCode (data-ref): ', urlCode); + }, + statusFind: (statusSession, session) => { + console.log('Status Session: ', statusSession); //return isLogged || notLogged || browserClose || qrReadSuccess || qrReadFail || autocloseCalled || desconnectedMobile || deleteToken + //Create session wss return "serverClose" case server for close + console.log('Session name: ', session); + }, + onLoadingScreen: (percent, message) => { + console.log('LOADING_SCREEN', percent, message); + }, + headless: true, // Headless Chrome + devtools: false, // Open devtools by default + useChrome: true, // If false will use Chromium instance + debug: false, // Opens a debug session + logQR: true, // Logs QR automatically in terminal + browserWS: '', // If you want to use browserWSEndpoint + browserArgs: [''], // Parameters to be added into the Chrome browser instance + puppeteerOptions: {}, // Will be passed to puppeteer.launch + disableWelcome: false, // Option to disable the welcoming message which appears in the beginning + updatesLog: true, // Logs info updates automatically in terminal + autoClose: 60000, // Automatically closes the wppconnect only when scanning the QR code (default 60 seconds, if you want to turn it off, assign 0 or false) + tokenStore: 'file', // Define how to work with tokens, which can be a custom interface + folderNameToken: './tokens', //folder name when saving tokens + // BrowserSessionToken + // To receive the client's token use the function await client.getSessionTokenBrowser() + sessionToken: { + WABrowserId: '"UnXjH....."', + WASecretBundle: '{"key":"+i/nRgWJ....","encKey":"kGdMR5t....","macKey":"+i/nRgW...."}', + WAToken1: '"0i8...."', + WAToken2: '"1@lPpzwC...."', + } + }) + .then((client) => client.start()) + .catch((error) => console.log(error)); +``` + +### Callback Status Session + +More details in {@link StatusFind} + +| Status | Condition | +|----------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `isLogged` | When the user is already logged in to the browser | +| `notLogged` | When the user is not connected to the browser, it is necessary to scan the QR code through the cell phone in the option WhatsApp Web | +| `browserClose` | If the browser is closed this parameter is returned | +| `qrReadSuccess` | If the user is not logged in, the QR code is passed on the terminal a callback is returned. After the correct reading by cell phone this parameter is returned | +| `qrReadFail` | If the browser stops when the QR code scan is in progress, this parameter is returned | +| `autocloseCalled` | The browser was closed using the autoClose command | +| `desconnectedMobile` | Client has disconnected in to mobile | +| `serverClose` | Client has disconnected in to wss | +| `deleteToken` | If you pass true within the function `client.getSessionTokenBrowser(true)` | + +```javascript +const wppconnect = require('@wppconnect-team/wppconnect'); +wppconnect + .create({ + session: 'sessionName', + statusFind: (statusSession, session) => { + // return: isLogged || notLogged || browserClose || qrReadSuccess || qrReadFail || autocloseCalled || desconnectedMobile || deleteToken + console.log('Status Session: ', statusSession); + // create session wss return "serverClose" case server for close + console.log('Session name: ', session); + }, + }) + .then((client) => client.start()) + .catch((error) => console.log(error)); +``` + +### Phone connection verification +To enforce the phone connection verification, you can use the code below or check the documentation {@link Whatsapp.startPhoneWatchdog}.: +```javascript +// To start with default interval. +client.startPhoneWatchdog(); + +// To start with custom interval. +client.startPhoneWatchdog(30000); // 30s + +// To stop. +client.stopPhoneWatchdog(); +``` + +### Exporting QR Code + +By default, a QR code will appear on the terminal. If you need to pass the QR +somewhere else here is how (See {@link CatchQRCallback}): + +```javascript +const fs = require('fs'); +const wppconnect = require('@wppconnect-team/wppconnect'); + +wppconnect + .create({ + session: 'sessionName', + catchQR: (base64Qr, asciiQR) => { + console.log(asciiQR); // Optional to log the QR in the terminal + var matches = base64Qr.match(/^data:([A-Za-z-+\/]+);base64,(.+)$/), + response = {}; + + if (matches.length !== 3) { + return new Error('Invalid input string'); + } + response.type = matches[1]; + response.data = new Buffer.from(matches[2], 'base64'); + + var imageBuffer = response; + require('fs').writeFile( + 'out.png', + imageBuffer['data'], + 'binary', + function (err) { + if (err != null) { + console.log(err); + } + } + ); + }, + logQR: false, + }) + .then((client) => client.start()) + .catch((error) => console.log(error)); +``` + +### Saving Session Token + +Read the {@link TokenStore} + +### Multidevice (BETA) + +To use multidevice account, you have to set a fixed user data dir for the browser to keep it logged, +because WhatsApp changed the way of authentication. + +To setup this, you can use the example below: + +```javascript +wppconnect + .create({ + // ... + session: 'mySessionName', + puppeteerOptions: { + userDataDir: './tokens/mySessionName', // or your custom directory + }, + // ... + }) + .then((client) => client.start()) + .catch((error) => console.log(error)); +``` + diff --git a/docs/getting-started/installation.md b/docs/getting-started/installation.md new file mode 100644 index 000000000..0dee56f67 --- /dev/null +++ b/docs/getting-started/installation.md @@ -0,0 +1,13 @@ +# Installation + +The first thing that you had to do is install the `npm package`: + +```bash +npm i --save @wppconnect-team/wppconnect +``` + +or for [Nightly releases](https://github.com/wppconnect-team/wppconnect/releases/tag/nightly): + +```bash +> npm i --save https://github.com/wppconnect-team/wppconnect/releases/download/nightly/wppconnect-nightly.tgz +``` diff --git a/docs/getting-started/receiving-messages.md b/docs/getting-started/receiving-messages.md new file mode 100644 index 000000000..c3ba60e65 --- /dev/null +++ b/docs/getting-started/receiving-messages.md @@ -0,0 +1,30 @@ +# Receiving Messages + +To receive messages, you can use the code below + +```javascript +// Supports ES6 +// import { create, Whatsapp } from '@wppconnect-team/wppconnect'; +const wppconnect = require('@wppconnect-team/wppconnect'); + +wppconnect + .create() + .then((client) => client.start()) + .catch((error) => console.log(error)); + +function start(client) { + client.onMessage((message) => { + if (message.body === 'Hello') { + client + .sendText(message.from, 'Hello, how I may help you?') + .then((result) => { + console.log('Result: ', result); //return object success + }) + .catch((erro) => { + console.error('Error when sending: ', erro); //return object error + }); + } + }); + client.start() +} +``` diff --git a/examples/basic/.gitignore b/examples/basic/.gitignore new file mode 100644 index 000000000..27826cf8a --- /dev/null +++ b/examples/basic/.gitignore @@ -0,0 +1,4 @@ +node_modules +tokens +package-lock.json +debug.log \ No newline at end of file diff --git a/examples/basic/README.md b/examples/basic/README.md new file mode 100644 index 000000000..a642373a7 --- /dev/null +++ b/examples/basic/README.md @@ -0,0 +1,15 @@ +# Simple example to start the Wppconnect and send a order message + +Is necessary to login with a business account + +> Wppconnect is a high-performance system developed with JavaScript to create a bot for WhatsApp, support for creating any interaction, such as customer service, media sending, sentence recognition based on artificial intelligence and all types of design architecture for WhatsApp. + +## Maintainers + +Maintainers are needed, I cannot keep with all the updates by myself. If you are +interested please open a Pull Request. + +## Contributing + +Pull requests are welcome. For major changes, please open an issue first to +discuss what you would like to change. diff --git a/examples/basic/index.js b/examples/basic/index.js new file mode 100644 index 000000000..b2c1eb0ad --- /dev/null +++ b/examples/basic/index.js @@ -0,0 +1,37 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ +const wppconnect = require('../../dist'); + +wppconnect + .create() + .then((client) => start(client)) + .catch((erro) => { + console.log(erro); + }); + +function start(client) { + client.onMessage((message) => { + if (message.body === 'Hi' && message.isGroupMsg === false) { + client + .sendText(message.from, 'Welcome Wppconnect') + .then((result) => {}) + .catch((erro) => { + console.error('Error when sending: ', erro); //return object error + }); + } + }); +} diff --git a/examples/basic/package.json b/examples/basic/package.json new file mode 100644 index 000000000..ec7411cb3 --- /dev/null +++ b/examples/basic/package.json @@ -0,0 +1,11 @@ +{ + "name": "wppconnect-functions", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "start": "node index.js", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "license": "ISC" +} diff --git a/examples/bot-functions/.gitignore b/examples/bot-functions/.gitignore new file mode 100644 index 000000000..27826cf8a --- /dev/null +++ b/examples/bot-functions/.gitignore @@ -0,0 +1,4 @@ +node_modules +tokens +package-lock.json +debug.log \ No newline at end of file diff --git a/examples/bot-functions/README.md b/examples/bot-functions/README.md new file mode 100644 index 000000000..cf0cb71aa --- /dev/null +++ b/examples/bot-functions/README.md @@ -0,0 +1,15 @@ +# Bot to test functions + +> Need to do _npm install_ in the main wppconnect folder and _npm start_ here + +| Message | Return | +| ------------------------------------------------------- | ---------------------------- | +| `!ping` | pong | +| `!ping reply` | pong like reply | +| `!chats` | total chats opened | +| `!info` | infos about connection | +| `!location` | send location | +| `!sendto ` | send msg to some number | +| `!pin ` | freeze this chat | +| `!typing ` | change state chat to typing | +| `!ChatState < 0: Typing or 1: Recording or 2: Paused >` | change state chat to options | diff --git a/examples/bot-functions/index.js b/examples/bot-functions/index.js new file mode 100644 index 000000000..e7500d1f0 --- /dev/null +++ b/examples/bot-functions/index.js @@ -0,0 +1,113 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ +const wppconnect = require('../../dist'); + +wppconnect + .create({ + session: 'teste', + onLoadingScreen: (percent, message) => { + console.log('LOADING_SCREEN', percent, message); + }, + }) + .then((client) => start(client)) + .catch((erro) => { + console.log(erro); + }); + +function start(client) { + console.log('Starting bot...'); + client.onMessage(async (msg) => { + try { + if (msg.body == '!ping') { + // Send a new message to the same chat + client.sendText(msg.from, 'pong'); + } else if (msg.body == '!ping reply') { + // Send a new message as a reply to the current one + client.reply(msg.from, 'pong', msg.id.toString()); + } else if (msg.body == '!chats') { + const chats = await client.getAllChats(); + client.sendText(msg.from, `The bot has ${chats.length} chats open.`); + } else if (msg.body == '!info') { + let info = await client.getHostDevice(); + let message = `_*Connection info*_\n\n`; + message += `*User name:* ${info.pushname}\n`; + message += `*Number:* ${info.wid.user}\n`; + message += `*Battery:* ${info.battery}\n`; + message += `*Plugged:* ${info.plugged}\n`; + message += `*Device Manufacturer:* ${info.phone.device_manufacturer}\n`; + message += `*WhatsApp version:* ${info.phone.wa_version}\n`; + client.sendText(msg.from, message); + } else if (msg.body.startsWith('!sendto ')) { + // Direct send a new message to specific id + let number = msg.body.split(' ')[1]; + let messageIndex = msg.body.indexOf(number) + number.length; + let message = msg.body.slice(messageIndex, msg.body.length); + number = number.includes('@c.us') ? number : `${number}@c.us`; + client.sendText(number, message); + } else if (msg.body.startsWith('!pin ')) { + let option = msg.body.split(' ')[1]; + if (option == 'true') { + await client.pinChat(msg.from, true); + } else { + await client.pinChat(msg.from, false); + } + } else if (msg.body.startsWith('!typing ')) { + const option = msg.body.split(' ')[1]; + if (option == 'true') { + // Start typing... + await client.startTyping(msg.from); + } else { + // Stop typing + await client.stopTyping(msg.from); + } + } else if (msg.body.startsWith('!ChatState ')) { + const option = msg.body.split(' ')[1]; + if (option == '1') { + await client.setChatState(msg.from, '0'); + } else if (option == '2') { + await client.setChatState(msg.from, '1'); + } else { + await client.setChatState(msg.from, '2'); + } + } else if (msg.body.startsWith('!btn')) { + await client.sendMessageOptions(msg.from, 'teste', { + title: 'CALÇA JEN FEMININA', + footer: 'Escolha uma opção abaixo', + isDynamicReplyButtonsMsg: true, + dynamicReplyButtons: [ + { + buttonId: 'idSim', + buttonText: { + displayText: 'SIM', + }, + type: 1, + }, + { + buttonId: 'idNao', + buttonText: { + displayText: 'NÃO', + }, + type: 1, + }, + ], + }); + } + } catch (e) { + console.log(e); + } + }); +} diff --git a/examples/bot-functions/package.json b/examples/bot-functions/package.json new file mode 100644 index 000000000..7c499e261 --- /dev/null +++ b/examples/bot-functions/package.json @@ -0,0 +1,13 @@ +{ + "name": "wppconnect-functions", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "start": "node index.js", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC" +} diff --git a/examples/newsletter/.gitignore b/examples/newsletter/.gitignore new file mode 100644 index 000000000..27826cf8a --- /dev/null +++ b/examples/newsletter/.gitignore @@ -0,0 +1,4 @@ +node_modules +tokens +package-lock.json +debug.log \ No newline at end of file diff --git a/examples/newsletter/README.md b/examples/newsletter/README.md new file mode 100644 index 000000000..1238961d9 --- /dev/null +++ b/examples/newsletter/README.md @@ -0,0 +1,13 @@ +# Simple example to use functions of newsletter + +> Wppconnect is a high-performance system developed with JavaScript to create a bot for WhatsApp, support for creating any interaction, such as customer service, media sending, sentence recognition based on artificial intelligence and all types of design architecture for WhatsApp. + +## Maintainers + +Maintainers are needed, I cannot keep with all the updates by myself. If you are +interested please open a Pull Request. + +## Contributing + +Pull requests are welcome. For major changes, please open an issue first to +discuss what you would like to change. diff --git a/examples/newsletter/index.js b/examples/newsletter/index.js new file mode 100644 index 000000000..988a88dbc --- /dev/null +++ b/examples/newsletter/index.js @@ -0,0 +1,42 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ +const wppconnect = require('../../dist'); + +wppconnect + .create({ + session: 'teste', + }) + .then((client) => start(client)) + .catch((erro) => { + console.log(erro); + }); + +function start(client) { + client.onMessage(async (message) => { + if (message.body === 'create newsletter' && message.isGroupMsg === false) { + const t = await client.createNewsletter('WPP Test Newsletter2', { + description: 'test', + }); + console.log(t); + await client.sendText(message.from, '```' + JSON.stringify(t) + '```'); + await client.sendText( + message.from, + 'Check the channels of connected device' + ); + } + }); +} diff --git a/examples/newsletter/package.json b/examples/newsletter/package.json new file mode 100644 index 000000000..ec7411cb3 --- /dev/null +++ b/examples/newsletter/package.json @@ -0,0 +1,11 @@ +{ + "name": "wppconnect-functions", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "start": "node index.js", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "license": "ISC" +} diff --git a/examples/orders/.gitignore b/examples/orders/.gitignore new file mode 100644 index 000000000..27826cf8a --- /dev/null +++ b/examples/orders/.gitignore @@ -0,0 +1,4 @@ +node_modules +tokens +package-lock.json +debug.log \ No newline at end of file diff --git a/examples/orders/README.md b/examples/orders/README.md new file mode 100644 index 000000000..1db83d7a5 --- /dev/null +++ b/examples/orders/README.md @@ -0,0 +1,13 @@ +# Simple example to start the Wppconnect + +> Wppconnect is a high-performance system developed with JavaScript to create a bot for WhatsApp, support for creating any interaction, such as customer service, media sending, sentence recognition based on artificial intelligence and all types of design architecture for WhatsApp. + +## Maintainers + +Maintainers are needed, I cannot keep with all the updates by myself. If you are +interested please open a Pull Request. + +## Contributing + +Pull requests are welcome. For major changes, please open an issue first to +discuss what you would like to change. diff --git a/examples/orders/index.js b/examples/orders/index.js new file mode 100644 index 000000000..c5b551930 --- /dev/null +++ b/examples/orders/index.js @@ -0,0 +1,51 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ +const wppconnect = require('../../dist'); + +const froms = []; +wppconnect + .create() + .then((client) => start(client)) + .catch((erro) => { + console.log(erro); + }); + +function start(client) { + client.onMessage(async (message) => { + if (message.body === 'new order' && message.isGroupMsg === false) { + const order = await client.sendOrderMessage(message.from, [ + { type: 'custom', name: 'Item with cost test', price: 120000, qnt: 2 }, + ]); + froms.push(message.from); + client.sendText( + message.from, + `Please, save your order id, and get order for test porpouse` + ); + client.sendText(message.from, `${order.id}`); + } + if (message?.body?.includes('order id=') && message?.isGroupMsg === false) { + const id = message?.body.split('=')[1]; + const order = await client.getOrder(id); + client.sendText(message.from, '```' + JSON.stringify(order) + '```'); + } + }); + client.onOrderStatusUpdate((data) => { + froms.forEach((from) => { + client.sendText(from, '```' + JSON.stringify(data) + '```'); + }); + }); +} diff --git a/examples/orders/package.json b/examples/orders/package.json new file mode 100644 index 000000000..ec7411cb3 --- /dev/null +++ b/examples/orders/package.json @@ -0,0 +1,11 @@ +{ + "name": "wppconnect-functions", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "start": "node index.js", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "license": "ISC" +} diff --git a/examples/rest/README.md b/examples/rest/README.md new file mode 100644 index 000000000..5c0af9a8b --- /dev/null +++ b/examples/rest/README.md @@ -0,0 +1,49 @@ +# Exemplo para consumir a Lib via REST + +2 formas foram criadas neste exemplo + Requisição via GET para saber o status de conexão com o WhatsApp + http://127.0.0.1:3000/getconnectionstatus + + Requisição via POST para envio de mensagem + http://127.0.0.1:3000/sendmessage + os parâmetros que devem ser passados são: + + { + "telnumber": "554190000000", + "message": "Envio de mensagem WPPCONNECT!!!!" + } + + + curl --location --request POST 'http://127.0.0.1:3000/sendmessage' \ + --header 'Content-Type: application/json' \ + --data-raw '{ + "telnumber": "554190000000", + "message": "Envio de mensagem WPPCONNECT!!!!" + }' + + +# Example to consume Lib via REST + +2 shapes were created in this example + GET request to know the connection status with WhatsApp + http://127.0.0.1:3000/getconnectionstatus + + + Request via POST to send a message + http://127.0.0.1:3000/sendmessage + + the parameters that must be passed are: + + { + "telnumber": "554190000000", + "message": "Envio de mensagem WPPCONNECT!!!!" + } + + + curl --location --request POST 'http://127.0.0.1:3000/sendmessage' \ + --header 'Content-Type: application/json' \ + --data-raw '{ + "telnumber": "554190000000", + "message": "Envio de mensagem WPPCONNECT!!!!" + }' + diff --git a/examples/rest/index.js b/examples/rest/index.js new file mode 100644 index 000000000..fdef4bbba --- /dev/null +++ b/examples/rest/index.js @@ -0,0 +1,141 @@ +const express = require('express'); +const app = express(); +const wppconnect = require('@wppconnect-team/wppconnect'); +var Instancia; //variável que receberá o cliente para ser chamada em outras funções da lib + //variable that the client will receive to be called in other lib functions + + +app.use(express.json());//parser utizado para requisições via post,....parser used for requests via post, +app.use(express.urlencoded({ extended : true })); + + +app.get('/getconnectionstatus', async function (req, res) { + + console.log("Solicitou status de conexao"); + console.log("Requested connection status"); + + var mensagemretorno =''; //mensagem de retorno da requisição ... request return message + var sucesso = false; //Se houve sucesso na requisição ... If the request was successful + var return_object; + + const executa = async()=>{ + + if (typeof(Instancia) === "object"){ // Validando se a lib está iniciada .... Validating if lib is started + mensagemretorno = await Instancia.getConnectionState(); // validadado o estado da conexão com o whats + //whats connection status validated + sucesso = true; + }else{ + mensagemretorno = 'A instancia não foi inicializada - The instance was not initialized'; + } + return_object = { + status : sucesso, + message :mensagemretorno, + }; + res.send(return_object); + }; + executa(); + + }); + +app.post('/sendmessage', async function (req, res) { + + console.log("Solicitou envio de mensagem VIA POST"); + console.log("Requested sending VIA POST message"); + + //parametros vindos na requisição ... parameters coming in the request + var telnumber = req.body.telnumber; + var mensagemparaenvio = req.body.message; + //***********/ + + var mensagemretorno =''; //mensagem de retorno da requisição ... request return message + var sucesso = false; //Se houve sucesso na requisição ... If the request was successful + var return_object; + + const executa = async()=>{ + + if (typeof(Instancia) === "object"){ // Validando se a lib está iniciada .... Validating if lib is started + status = await Instancia.getConnectionState(); // validadado o estado da conexão com o whats + //whats connection status validated + if(status === 'CONNECTED'){ + let numeroexiste = await Instancia.checkNumberStatus(telnumber+'@c.us'); //Validando se o número existe ... Validating if the number exists + if(numeroexiste.canReceiveMessage===true){ + await Instancia + .sendText(numeroexiste.id._serialized, mensagemparaenvio) + .then((result) => { + console.log('Result: ', result); //return object success + sucesso=true; + mensagemretorno=result.id; + }) + .catch((erro) => { + console.error('Error when sending: ', erro); //return object error + }); + }else{ + mensagemretorno='O numero não está disponível ou está bloqueado - The number is not available or is blocked.'; + } + }else{ + mensagemretorno = 'Valide sua conexao com a internet ou QRCODE - Validate your internet connection or QRCODE'; + } + }else{ + mensagemretorno = 'A instancia não foi inicializada - The instance was not initialized'; + } + return_object = { + status : sucesso, + message :mensagemretorno, + }; + res.send(return_object); + }; + executa(); + + }); + + +startWPP(); //chama a função para inicializar a lib...... call function to initialize the lib + +async function startWPP (){ + await wppconnect.create({session: 'teste', + catchQR: (base64Qr, asciiQR, attempts, urlCode) => { + }, + statusFind: (statusSession, session) => { + console.log('Status Session: ', statusSession); //return isLogged || notLogged || browserClose || qrReadSuccess || qrReadFail || autocloseCalled || desconnectedMobile || deleteToken + //Create session wss return "serverClose" case server for close + console.log('Session name: ', session); + }, + headless: true, // Headless chrome + devtools: false, // Open devtools by default + useChrome: true, // If false will use Chromium instance + debug: false, // Opens a debug session + logQR: true, // Logs QR automatically in terminal + browserWS: '', // If u want to use browserWSEndpoint + browserArgs: [''], // Parameters to be added into the chrome browser instance + puppeteerOptions: {}, // Will be passed to puppeteer.launch + disableWelcome: false, // Option to disable the welcoming message which appears in the beginning + updatesLog: true, // Logs info updates automatically in terminal + autoClose: 60000, // Automatically closes the wppconnect only when scanning the QR code (default 60 seconds, if you want to turn it off, assign 0 or false) + tokenStore: 'file', // Define how work with tokens, that can be a custom interface + folderNameToken: './tokens', //folder name when saving tokens + }).then((client) => { + start(client); + }).catch((erro) => console.log(erro)); + +} + +async function start(client) { + Instancia = client; //Será utilizado nas requisições REST ..... It will be used in REST requests + + client.onMessage( async (message) => { + + }); + client.onAck(ack => { + + }); + client.onStateChange( async (state) => { + + }); + +} + + + +const porta = '3000'; +var server = app.listen(porta); +console.log('Servidor iniciado na porta %s', server.address().port); \ No newline at end of file diff --git a/img/wppconnect-banner.jpeg b/img/wppconnect-banner.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..86f03f0bccaac944c54229fb4ef3706fb3dfdf12 GIT binary patch literal 46584 zcmeFY2Ut^Ew>BD3L_{p~&Q_#LPh3Xq4(Z?@>pCf=LfD4qr%CF-Ea=Ccv;;(Y~(j}@(G?%Yjp}9;$bLHywt5;~R(bCY+ z-K4vA{l<-(H?CZzXQ02qKt8|m>md}sT3)z#ncVOOEe$RC?*C%>`4w>UG6kLraDn1B zfbu5Ag_{&V8v$Iu#JqTcEa^WACB+5m%NH-vP?4)&-T+WiP?ANaxJrBF>V?Y`RDfTX zRF`g2)8DeV%y9p)j!O>>BNOXwu-+e$QPJrvyy7y-5KC8&m?CBgT?6;m#U>DGN63;M?{e?+DiePdu`z8%#wMJ*0?-DKjGkWwzbBPnh9 zdW%K3_sjIpVZc?gj+8eq+yp!X>^}MjoBulb{|13eRR9XDDZ&rR&*6FYU+-LAZqB28 z6rP8;M?;xB`YxOD^Ph^Pt4Hx%%^RM5G1&e?*z=3!pT>Wesia$f#4ye=`T^m}G5Sh? z@B`s`>(>F0dO-et_v=9EJNoY6HV66e8_fop>OYJ0{{MTd{!Q1K=AFN(y2H`_H%;5g zSpHSf`!!$x3dw(m?C&7`uqOk5EH&QvN;06ssJgJU8`3K^+E6b;<1&!ecx2u0pR@Kp0 zw})@Df2JYZ@<(`XWA;V7X?s4->l4i)g`0N{Ebbr}lYQ}<*1C#r-#;;Cbln8xV;K=& z!_l0tgmv(v&jAKLF$3VRMVVK^mn#`3012YMAbBN_vqeQ%m^ASHMD^8pd{(9sU_wP$ zfAXi7+K_1}Gd_Y3-TW_Hex1(CBv5r2d?0zp9VCpuV39K8g-jcdTlu^)A$f-xd_?%f zj?Yp!Gavl&OqMJ5HBZUf{Nl_0<*zQd{4V>iZi!6K`J1a||APKci9|PkG1rq)`77(^ zB<8;|e)3Oz!~RsnCwhMqkWL5T^NZ|1KFo}lOk?f!S2!L&rJTG)XwTogc#uH4sU`lI zUdxL~yRkgCFK+YVo*Ca$``|2!-x&Vc2>)c0e}73Cwn(ABdwU$s!@V7L2!If-$SF++ z0m!DYQ}d>DjBypMRP-(mf5hM>M8Hx5tz}*T?N3z?#QS$RM!Tsx)~$RK;bs<^2~=zA zRz7j%319$$@FOQ)yfZr|{vPdcF*eI+{P&nwz}HuP$3LPUpM^ZU^gF;ryAg|kjH@dG z?p&&R^*3>-IJ#vfRqAeBaNK8fkePfAxMKfd!wnFPyyp6c5*Ow#i($ zmXZ(hJmL^kR|^hn=GB2OkQ(%A-R_NBFA0>Hbk4C4HP6?_;7#>8W2?+NBdU&n*dITJ zY3jK}PwffECn17Hl(hJlm1qs%Z56u`jNk8t(!b9yO40AEkJyZd%xFBko1~`RB(LmX zd)YOtzq>FeD#D|5%-;_s*|Wg3cXlq|CQ_rZKfPXa*os3&rOYkx@7eNHgkUpCJey1C z-kl?+)}H`71Ny*k@0Y z#}uRec-YR2kQ%=3Wm=mKwtLn~lJ5so47MNx-EG~9ADaT1O#QDCs256EY80-gIc|mZ z90p`<{2Mj*m}s;g$FE0d-P#vmI)!-bitk>xbTMx-Fn=QUX#e%W`xpBYtYbXymz@sE zHD69#Y7W#li(Km+lKEDYMvBku<@q<_f3&v~^Y*;{U(Egung4?EFW&Tjwu5;6!}SCI z;`%55bFTjv;$NEmrM;b4#s8G+{};1=>OuYs#{Wk;;{O~NsekqQQMLaVZ?t~<%V6wV*GW(gy#74}kMMNqn>0;89^=DfC+4ajE>+6?xLJ7YMS zx^ER|a9aNirr&1>+`1n}utwSOjSxVZC$yqU-y5_U*5%c_cnFNgY2?8#b=oWMGy_H7gcp3#Jp4<0qM9@(X=qSy`^{`{Ia|< z2@-=u*sLnnhdZ~$dE=zMk;TCEJ&)i@Qup2TR@J%d=)q zf=2_fE_Xhjw*8@a8A}g{3b-2O-&Cx=OmR;~{PVvL?*8=ra{1^h;RzS!Ub@A{TgYV! z{XIa)Cn~Q<>f2$TTmjLMEVmWfLq1(B|4?~j{PtWs<@}b`HZhUAgdFD0>vS-is!Z$j z%~J&WCTgu)hZhAszwjvw@@&TAZOq9YU>30>oU~;fr1Uc85MU186sa)+&#OPBJdWf8 zS_j>>f5eh;TYdSj_m=d22w;Ds5twY@PjpnI0X|}&V(7~zi!C^asCe^&$sxSzHR=`9 z?OC0+#ud2*J2_ojL&>f7k&xb!&lS3FkbO8Y-^)Ppz!LnTU#AO(Md(4)gJn_>t9&fG zj4;aM*?s+7lrNL{9{a?F?L7Rpiahq9Y`dyC~b~vK92O$}f$oap)|~-DD_0Rd0R6`5OTQ`r|~U!U^d_( z&%iDToi;Y;@iyK0DRv!f-W3<39ooUBn=b9#$S5*@+GX)p*Uyy0P9bSrd;LW%e@8PK z6o!}WDa*K`H*;|REm(6}#pEbD?pV%I+f;w{gvG19!pM%B=dpmBfX+U!si3A__WF~t zPm^1rMS_+IO^^|hWZaLHR>{5q0_feF;D9VzB@kn&XB*bcda_DFCa}#%-?samax^hQhD}-d>7z)Fi^{} zGQkNVSIe&lKBxW<1jkL&@{KOP>Q>Ss`Y75~ZmisFTtUz5U8^#CNT$zwlBdRyA0N>t zzvO-Ph_klnS`jCx@-V#e@RjRvqs+j^{{>$ELt*|EL4SbGe}_e$8SgLo{tCd~rT@F~ z$Bn;K8@Iv*{Ps7&@rU8~zX<-Tf~?S!Uz+{B+5bT4UwHfi20+&PUo}tru#)!SUjXJ^ z)Gx;HaX|C?GM9Tzz~^h`hBb!2FgE`{{*vicjB@%2kg>rE+w z)l(sY;GAMC<1yGqsQFmf!I*8_eUl?pI%5)J?IGxNq_V=3-87W@dCeQ!-y%26q_|cl z@WkUxRO$LWuYHCtSi^1#_jYLDq_208H2K8Tu9?Z3a4e*_bztskx`0Zo%Qz=(Ls2FM z!lMS|?^#@49v>rpz6T%nM3`8!$%265A+W4cSOzIk2+F1A|RI7^B#YY!OPBonxlEPgaj!&ROZ^m`iO-THRVJhjGZHFq^bP z2ykY6N#%*-r5YJ?+op6phuBg`bcqJ~ooz_q=>DDE2-92?+Mw0kgSr)3&}zd!Ebzo{ z;*~1yT&*r#5q@!Q#RmhUQoEQ3f#`;2{szQSEY*%m%??OQ}`x{(;o&+ zrdfZll;{%ef-VQ%ri{B4wun~&<@lj`2Uxn#wKMlTdzZ(z$5CS_q{kv8I7V1ED#j)a z34bGo^|MXp5FM%Y8&a9|f8WUG6V#GlO;;5iOC!d5P;WA`mF3jgB7G25hDWfoI@T98 z-=bTtaBS?wesgg?*fJBDQAurJP4|!CsTS>O**Q$&ra|j_*Xm7F>TcEsyziQ}zPKlB z44&6gRJZI@*KCYJ-Vjcp`l_Nx^QXhx-z&(;4S>TNYjcYm6k1@qMP+a|W$|CeI0wMo zq)M$d=Ld~POs>Dpf6%b5ga9gqQ+~*QC=$jpqsOR+o0WS-DN z%lt*26(opN^foN8)*dIR_`l$kG4hV|sMtp(jo2LGO!+)~5h~s)a`+RLet&jjNxbIT zA=;>}B`f2^7_c~Iza^Zrqi{S_MmOQ*yOaJCkeRvf_!hQbJ<@no@$l%8{B@I$sySN< zVUCGUw72}AnlVf8y)3^rTFY6Ehbm(Da@FX9v>9MMNeAy4Z zm6xNDW~gS1>~bfdepFDX`EJg`YwH7(Zeyn4lB{Ktj~K)In~jc}RoAAcjrfMgXUkD( zPKvi($6FlDSZtOoeZotn(AG3?cA9f8o7y>VHT;o_q=AC%D6#Z`QO>dS~7FsiHyr zCxC{C&RX*&jb;>#K4~^BsBQx1j+t6P2uxDBUgFd3!3Xq>rBzGD-P(~IOhuyG0sil# zhMHR?Qu~Um-&^~MgEKA>Tzm}-jYqyWyKQX-_iI;rCdU`2hE_7z-cSE%$#^Sl#(g(F zKmP?vUUv&a{S7ucUht!p^^)1w?R+LRsI&2yW%4EXH9725EXR9A6@#fX|KE;9%PgPnD`LL0NXK63? zbHuAWfH}aig=(Hi9^}Z?qGIE+GItnkg7wbV`%<+uVPlJn7GC1oMSG57v71UkcOw#) zw>)*S>VSEHMI}OZCo}*nzLL@UlePGtfavq4fbW&>C!lA%yKMIWRu7BTEe`tYo}OJ; z^-b{KE9iarI2v$C;)Hvi#~;2M(XI4f#Q%RmgJSjI-otwQvD%{e3qZ5ERn4~zTy5+z z_29-m-xUNp;0^z)tJeDp?cB#BOXi>b!*{4_%Z?2e#qIu&A|4YlM+dwfd-gsNwmgH- zz|4~(_7|;hP<(*TMJsR zQ9(^&7qhAjW(hjO76wi68P5-~Af_)ubu3 zZg%D}-W$7u2zb2?Ngq3EgUk(D`f{v{if@PWzBkn`t13&%RmBTcfKrGgb*Ux^l3X(i z>6!seu?4}Jb)rb>N`1t2sSGC+!|GPTK!@@DbkOimfB|@hcEB?>V1LO=)jWFeq|_h( zK#d~y?((q1SQqKIy?tx#3aZx2(8f{JFV*A7{GsYtN9>@CriLuu*de|2cq`pUQE0@n z>nSl8xJWv{oveSKNG~m2U_;BQt7`_smXjW&))mz>IIUP52H}k1N%YRS8kr{6G{8Qh zG)G3c`bs-We}dokq%~faaTo*ldFY|QKS3ohA{+=^pY*pdoC(nbPCPj}J<-dGO|k}wqDh1?f=IQ-CQiAONdqF(q9G9i%}Sai$_Yc`NCie&n4}JR z?Fw?Fa3}Ti8UGc5X}!OP1poS1CY{d1+PE*|1ta34+E*-%(&oiXV^_LQ(SVFdnx`5n zm0byxU}6nkZiiQH@kEm$=aqnb6|(^3Fm42;E~pIDBG7A^f+pg(nT&&I^I%oZeh|hp zqIv8jMZbgd>Jz5izCmM99)7xaibrPDb5+FlUXNZ=ezHHo6xbDpYVB?AZw_@_6I70s z-B%T?iF?HA#; z`U01P$V)L@pzAYAEozMyI4vtL+$dCU{ z7`N?g7C&bT(;ch%T;AI&#aj=b0W@yrPImq-?CBzxu&>*APkKegW4~$>%hdcZr8*)K zgt2b6zm&Ss*a$3*Pz#&Q2dCMSe z{Sp6yk0ocU^78dt#*PAtMzy&R1KOhO(g|WQUS(=berml`;}_zlu~) z+II8#yX+mH-FM%a={**C`CaoBt}>rt)7PU1QhE2Pa@XThg!Q$n>mO7ca=eJKV7jcL z!uLhpE^78ol%|%ZMAEd$Y97{*xa&TkxnNWBc1rqCkxF^Yz1H*av@*C8$t*e&)qk5V zOWOlsc*6(B|-1m1^Tsxj80m-2-}RIqP#v^+&CSvfGN`{E=7p6fB(H^d?p#)0T!$uvH9l=Y-vEJMc!sMq%#q zp%Wimzkhj{j7Ww)P~t7IrwKFIQMi~`K4jo7ZImL$ksX(yLQ?ndHDA0l5l9GR`J?Hz zWj-C$!2f#Ntcu;cD2X?53AHz2j3Kd!8|^i*0=U1qckFZuaT=&)ox4l9HGFEg-2H;omiW5Ykr~% zEst^7gxV9loAD!S$tJw5O3{Ujl4ex@B$=-AXG#Y2l}P6ly$rq#?V^kfo0Q1Px(_d6 z4uMjFz=xdv)P6!=0QHjd12oQXyhJo8eY7N8$3WOSpG8xn1+E`sFjm0SzW6EGgq6DI zZAedKJw|!}_T%lzSGoJvKYkQ3n?9pl-w!gLgpMBvW9_>y4p3Gt{vLi#s9L7jmdJ9f z7gvJTb+FC_CjkkEr{k!W}u3W)w6!%7+R#bH+3imo(yPr-S$oB&VyR z%tc5CiP7lu0sHxsHm=mk0mNVmz3+f;)PW2O6!yL8v9rl&C99jw5G~WNzH?ElH>fDK zeGg}>1-YUbnspj)8`8s=V!!W&C*inY530<&f4G-3V?)OCuv|+a9bE7dn})Ff53P>L7LCcwUn80u|=< zaE_+Qc%|aTY~_bexNaC20~0QpHp);XtTl={eqI3Qm0QO9-l6H83qy?ydC@A!J9+S* zC`4@qTyClK5{15yWKh?uB%5Bp7Cjj}mskCSqC}@hWBv;$kGwwZs?3{9hD-mjhRk!lY4dH=KNKHSNu9O6)(CVKigD1)G@FDPQ8k<^6{xmvb zYBX)jJzl$O-i96iN*J+^Dn4C8%*UHQ)Rp$l2p_UrGv=>n4Kw`CQy-Q7L3bm&?oz42 z+jzv===JWl9>1>pWlu_z&*BzBIJ@i@6ujH8gfD3ueRs}!iA~P%BsH|Rs)$9{R9r!tlL{avXIIO770|K+?;6x(~=T?q}zxo?FvKlG>bSIN0KH-S`vT>B_XO2=!eW z;2jo5h$7AFev@Zd#@&FIum03%883~y^FI8bd}}Ox$UJ-UiRw<9>&whG@Qa(#cl)CH zQid!uUy16aU9)A|fFxl+KyY*q-*5{l{zBR8-I^7x83X738@{Cs8~)q70RL5V+|+BM z9DHx=m^Dt_m$acX$nrw-_kTorLNzrSh~H=^6?(K)o440r&{N4oKL49&mlQjXtf3t< z(u}=mnf*n+1F;F{-R}h$8U_WZm4UcGpO=P1(L=i6h$>ukxnh#lboP0GhiqBFlWp@Qw zJ{Uyc?j0k_AoEG!ZE`|k$9+TLe7{CE={}L#PFrG)%34#nRbS5YT1<>Njfpy3cNVHP z{nAO)XW6sU<)jO|WF4qpq&+0-x7>8HePGplbR1W5!NdUPVTL9(sq5jOu2{L2j968aV0Jx?s*vZM>dT^B#d9rVS`OspjYv@UGlAYt!&pd( z9@1wb-dITPj!VwdYOpDWIqyW%Cp#`j+aUeZwyKGte{tjb5;-?N5MHQVb|Y}O6CbrH zW^-T6#2~zEe^>*$uVLDD@+^%B1Gw_#^Pl?5|J@2D8^zb%-|q^*pz>O9Vcm_lHQHG^ zuPih}ko_zWQQ)m=a7@a}kkZWXg|tE@v)9dz>1e2l2;brJ^#J%j7kf-MwG#cn$4%+5 z$jz~gm#b<*(=Oq2V~Q|6c$jc*D1S{F3A?}4RyeD&GU(TN6U##5V2iSUUI5a|xjWsj zb>5`?P)_li(g?B4c*s-Z)?U2tC z)vvds2adj*E@4UxjmHhwWUiL$7-&cv#x1X9#}6+*lq@%o(efYacWadPMLDO8y>Ho= zI=G2?3O`vBShs(??c&HNEB9jXowjYL`3jzuz^2#p01+)#k*Xca)7HeDsj{*aEz7DZ zU>*AFW#@rF%4#yM?AlaM@#O^G>Rc1UW|gQ8unFDmuZI^#t^StgBAA9*`t485pmdp1 z^x%`9x>EgbjFFDDcViNro>9^xi~AB?irW*Ys-k4^*6jpHiagQJ9Z(lE2x;14muB?n z&#b8PWg0$zat~?@E-eqjU0x@mnOO6mE_2A&$I3Hp*@uil{2?+&LR&{>X}8AcyD2~a zl7NCu5kMb@`u?@k=O;kG;ea|-0VP3|%3#d}Mm1@1sf&Gk8?fv;$2j!9O5GjTcEVa7 zXZH0t)IeJQT@fDKk4iCrxgs?&b!}jH7YbkSL=H2%4SOo;@^s3QIt6_7wRA&AMl+MA zt~jrT`iS8^d524ZI;z|Ug#Ftvv${oVV(CHZ-JdHxeB-sbY4IEprP_K57mKm_Z8nt} z`MiQFtmBpv?%0)S?DsLL`JPuhYR|?$`6RjNbcS3`7u#jEM#~HNXkm2EGNOyk-i<(q z{n-uibLa>7H+sD~RgKXQ`=$fp7Xoo7ZrQ&hStf>{y%uG01M{FI*ot+`BO?xPrJPDQ zpBFKGFvP$*eHc7vGsE%|z=JgkQWX3ipE)P{cxx8ev>`PNqv{+kYw&^eR}H5+U}Yxm zTF#JX`xoMa++U4&Ue}j$kj_nuJP7HH6*iJK^xP&QJJ&Oz3+pKnm_H_P_FuZtrxE4pgQNb3qj!G-Bx_YM zv$d%wu&=_(Z0Qz>aYGM121ZneOH458f~SQxoel+A{Vkq<~ zd^S-nRVIee7_WP_3ZQ(NN_JbdCMEz6wajE{+m!C|7gW>rGVsE5t)%5LcsepU%_3OB zlVw$3MmIM+Cikq2o7Rl9{mMn?DS?esUKh$T!}po`wiwuVv`q)egm^{W*i~6Pap&cz zmDDI&aH^~Xce%EuOY0U-xRzMx4#&;9nkK}$%LC;aa>5&eBF}D{Ix~}FGEYZrW_SBK ziW|g1EU}Ku>wV2Y6cnq-fmXLa7hU?j?`rvLllcb?@2pQ`O0CqSZQM!tHQFHP3s#jlS}Q7AU-ld2S#|s(+N*Nl_>T^y<@%+(>TY5u8RrbLy)>>iUC32K83-R905$5=I!>KuyN4tt8qY<)u8$zc>x?_k>>bQ zHT7|?(dr=GZ=0>sk-@sefQ+r=wO#V`RxmE;(XT$^KdaDs*b#9WdO1xR3?NaZ-S)>} zQ?d6P^a(NeQEg-jVb|R1{QQ!o|9j9dKWna$PU94h2ST(3zhQnx-rq^Bfd)3jg4DV) zcoRX7co^)48l&jg8HVJ<}WVtVVxXOsx`qc zZbaYhh_`8D@c+y#T=G${6Q=@7F+odziP}IE)){TCDZSG!-CMUR14ElbR?>ESl?VWF z8z!r(GS}0ssdF-@m`}}pk3beo!%zRhn3uno#43i?erjwQJa^s50%BnxIddcSfl^%6 z-i_5*p8~3}88Lw@yYKhmoENAG-|uT|rQ5#m#(KEuYrhq$Cx@Zi>ZvMg5isx6{<8PM z3(r(D4}dupP;k68hc`j!8&ET3euy^A@>**If7*ClCoL*g6!@K+!5-TaSd)tW=2pkI zt3-8$EndmSy9dpYXU@^=5@$TTeDv=6C1!GLI^1 z#Sqt`KVh3h>AQ1+RST@lvM;q1)_CSKS--WC4MVesC)cL43cL0!5m;N62b@w(I)Yn| z;%PcrFL5Pq(l&X#w{*YdhJZMazm3a%@3s!F{NfrkMw=+x8|CN-l=jAXhL^TeeLdMi1{UIB?gRcNj|L3s^XpqS!aVX0Uxshl|pX7Rw(;g4ny6C2H+c z?2*n%9TFYf(FDdV$M7*ohYv)*Q9KM8GFIoIU$3v@RmW&*+96(sRC4vU%XbV2(Aq?^F= z{RdWuq?s6;UV(GiL6a_Gtu+45aFofcQ;ZqmlvXip6k(@Y>a)L_1ib#Sfw?58Ps$eW zwZeaTHfl*8-qU`+TEOWBztJp0oXGeC3aNtP42=0m4aZ>k&NGWr z6MLf&rFl-5HgmIS1176hAVOtJlrCjatL{HD&7kzC+v6STo;>V&bj^426vM1m(=d1#yn7E5GC3}%TnpRO6 zOhA_Lokda@(gjNwW@9Mo1RH-&UWux{le7ZZ*}>$KidM!lb%$!%LI%nk?rB1$oa}mX zrgKb4;pZj9@~5(PX(19Uk8odXQszG059JV_hHPD)G;l`4%xXrLg>~N%jH9P};qM3^ z7uCQ`Fj9>t%wb`=?33rQrt$()91Ckrf53qR+`g@S_y&cr5#YhWh`AO4r>10i$ltjI zH@SYfzQBH1C&j^T0Ovw#Y3g(;wTW_+j?#RWgrXkF=ruoVA#bp=ATQuuW=~Rqft=XX z=PJb#H7kfU;^TQ(SKGU(Mw!LSo$3eN85i2poFdc%X9UhV-v0!2i*u{(DSLi=KYj0= zf7_wH*!xz^0DX59!5es{NDQq>GP7M%yj_yqGGArTQuGA0nM0gyi{%!*Tb-~U|)`YV7 zZx8BfmWp~c=9h6zoF}TiD0Mm2AkNz@^+}r{C?QR4Ihpp7wVoxh)0aO1m4)P#^2O_= zWohqBL*{jPhA*+EngpXFe*zZwSh+2y{AG?+rw)LGahHd7N(*MJw2L5U9*VJ)h6uc>pEz}2V?bIXe{?fRh?+3)Pj-_lg6qqU1IZ~&vDiky086sdfa;yEl}qRJCeU$9=B z)f|hrkKx4XH?KU_dmV*T`f`1=Z3msRsa@LlpbJm;WkEAIUJj#RB^#5Yx55b@*Qytv zIk-3ADP+H^ey92a2jRE!^5`I`R(MG%+7jtvWu?=b!2;HF(&if}P(nwpzIfo)dh&c2 zs96!#59u82WRvX*^bDHqyYmwu%)Z`MtrCpbTYBT zlnJVVZ@vlkKLJ;S)S{G$Pes@7r0cjEudY3GCdd}mWoP$?U<68JlGaG^(6*12FEXv! znn3j6P;xh(18>AWFa=O4$QE9C^ZZ!ZeY(8WFsNU9NL0b($<4B8v|Dh0gb_j&jt7TV z>A{;$P<~pn9n}`YaY!7r4Bl1I|66Y9f~prdh$(~Q)EoXOm?ZEe82ZT|;fzq4@>`{r z)6lT4i>Y)`!?L_&G?uSiR5RmYlx^XQt%xffMeMtSRr+s2hp(f z1RQuXZC{NT4;zwRpSadFASO9E(kg*+k6jb=gtO;rk*A7Yxd8%Uba&FhCP_suGk71) zIB1})nLUf-*n^{;IUpgTV%ME3@V0GxQE6xiEZH@jkG5TDT|SGvuv|SQyWgxykSJtk zZP5}^nNLJwz*3eN>Leub5x}441-HF>{fIuIqZ-__9dy-ZeSqRC9N8O&V$Z*Um0g?z z!ybBwu6Ov-PhlAD?y@XVg-joKl&PRxf(J_U#+qqe++^fGs;#e$rZGny=nRwuul5Mq z8*Al*y3j0@oi^a<|*J=+}G=p$d`_qGBYFgP0mzd zrXv=KPNkxGj@hJ`TQu1i;VOYdIh$eM3 zAV+PwDFh9_N>yi_54iDncm`U$wN_XzV;KsrSz9*k^~J-UhkC@##*+i4xb5k-nB$w-am@&a}9-Icx|oPD@6+C@XrGDYenZaOO!RfY4t$!5%iQQejfgZsdz z_nF#ochcd(4YV<4u5D)X`*$n5lmQphUjmL2k#raT7Ga2Ev zbi=#z)9?$wG^3762OV{SsVFb;hL78S(;Z&;Z-`vwLP!;d*^6! z;*Qk(31EA;?(p#Z4?KZR{>cJYv9XomC10%S2K~2mjT$lR^Dq`@$_Ny6PeY+4f4189 zTJkfe;q9D^i$vevZHG?{lJyNtm0>u+7WLJRyLkA#!_X&+d(c;x%H1QD-n@1QpDuge z%G~D?+Qph*9RM8}k{MH!ZS_CNov{sS>JZTgh{|o@^g0ZxyXq6zaY_6VjZbvHu`Pn_EmBq{ZXlAd9^ofJmY_g|iB+k9K-Z#?!~cu?ts zcWW86_c0nOSc$=81ZK0ns)<$y}K4@bA@XVzMa zuYjCKpuJyaq^Gw#_~P;t1xAsf*Ma_3ihSg3a@v73&riT3-+yn!g*8#kRJ`R;D$f!1 z)t`U?-QtI5{~-*JL41iDDe^C$rA;vqe_sAhEXcH46FWk5#uyl4l{MrE+!5sbJ(s6p z2VqZJMN9H(T7Ca$K6L&B)3F)uyP!mQIj7F)4=lA6NP>Kd$6 zZ&<>ruIg^z8vC@Om97ahIsj|U>NIo0>-z-H3&GfN5cAIIa{`Epnc{nUVg^;qAXC3( zJ4;bnQOUbA^)~$Bo$3)k`VC1Dgo0y1*#p-gds#(=s}gh*K~eEl1+pz?By}JSL2Ar| zC1g#U`dLT%KwW#kuR?J}jN`qk=T(H)fgUb8@QX*P$sy-~yvFes8sA-nAlYlMGg5iT zF&lRxjLJA^yCJ&<`(3Ys+@Jc$GvylV2Q`t$=NzJMcgmd^!8*nP#+QC!y}b67*Vbb- zIXhee;WVNr3P)9aS=9qP?lr_`&7c23L(w#@*cQxJ^oZ#|X%dR2qV_s(FD`5?7w8y5 z>HUt42WlzZA~LGv21cDkk` zx(duKJUp3%=rb$r{#9aug3U9E7ubEdtu$m+_(bC=WnXoh>l#qA1`ph%b@kI^;-TEF zZeubBT;sFx#3dVJ%}mFn@@IK3o=%*FV~kK6HhnS9Cpp9ZV-TLmz|jj8bN?O=!wf3pkA>@g1#J%&zcL|ftjoMqx@sas$b37_m!`X z1)7>|PU4nCk1z{gB6dn8403qGJ2&ix0s#;n1B;-leD=+8tj^Za?Z^WH=mA!vmM_H( z4RvuVLp#1RZX+Nn^>XJ97;C}F?&L*(y|ghSU}i~xjn0RL{r(u$VdM;Ryq%rLOJrjCNf%BZe_kNP~{tuu|_Ceig#MkZ; z*E8+2$a%q;0R^*07^$>A7O%-c1-!QHiUg^9)yu;Q{Hhh$o`0PK%M|VU`(H9m-zm5X zP5W%LkQ6_+(3PRP^kck`;&bu`06-^!Crhb)$&uR1FlKG;X#V;iGqV_^UU>{%$(DoJE3qwvCX!F>zlwmPXM7 z*?VHnlc4YJl$jwP!$+KLKX?Qb0O5Rvc6`U+y4&JU0cGrDkG`T*k7m8Z`F-sS9&XmH zslr|iZ`qRFO}ntNkYlRV<2Bz`?O-`8eQ8oW z?&p~{49v6a{x((^(TBbmu(^KPu=Q``cgzBmP-#7H`iBi`eKhKs6u9xXc*O8L{y15} zXsaadg0|$`U0YES^gCl=0c>`Gn(PVVQCiu}?-tHRw;pX))?Dz430s(NKs1jyY-pp{w-31tYRBpFEVjRNh*)N&nw54YmBh1%^ zELD2)h6!9#o1Jkca-v_m&7#ixz?iLo-B+k-|FO-Cuir#y190w{6*pFt zna9d(!OZy$d`0CwMLyf5t!r)~rd0)rnQO(PPWBpS4;j>#QV4U8>l=96`hV98N`Sq2~~zM(NXVnX_E+$D5*;!(Npv&C1Bz)-txk)$bmlMVM&j}gEcTI8%iTNBajP35 zkPvEGK5(p1sD*x?Bg$T979Ve9)k|P+z}-7CHGUE)I9EjQsVVM1M8W&chNaeNOW|uN zqb4%%<~fW;docXFL1Rq$yM8iQEM}&f=R)_JHl_E$h)h+z(E+pK+FH}!_Y|MWmwIMm zY-1{uH7k#zpfqM4h2?B@)%@|Q>W5`?Zc8f%uW`p_UFU9A|L(%|2|anG)nL2W?dii< zlK^#ZZm+qk%;8oY75ruuIC;IIXR5=k=%+Bk<-S~2Y5Y_USSI?Eb42m{o&-zJ^PhlT zm|0uEQKj1M-uu(vuUigS7=OKsTc47F%FXtqErM=Zf9%1DRM~4u#f^2jNvgpDFwMMw zOd5Fice%aYg6_M|8TYf4G79SlL-8~X@Af|~rnvjbW@y{%qJ+q?mMn;lyuG<6t6EpF z5NWr!y79nkxFC{ek@sB7SrM={c1)UE zX?fo0#v}*YN6W#4J^jPw4-f={C>v5L*gd-wB2haoVS0=c8W}Xxyi%rJe6Re(m>8X6 zE4ILCxJE3)&o-^Z<>$K!JlhhoIE07E#N;Sx>ko|O<}J!e2wGJhNK6f>i5j&okpE04 zEcv3E#WyC+9jsM88m&k(RQDM5Y0ghLs#6~#AuS|}F+(FuFpo7s!Z+S%0Tpq}yQ)%q z^4oOetyu2K>NVxM6&OJaeQ->mZ-|BmG(c=r?Bii_smlv*Qvnqd{cy+CuEd-2Tp4kl zJ?5s5HFO7)I`~R#+Q-L3!yJcgABRQTq;S`*bGI5qoYFPf2ALg&G>IeM`ODCqRkCzqJvsDcdu_sgiE8%2!&NNu zo9#aosXa?PN);3I+q^s4aKYB{F>B;}sWrIY#VIsRs#-SizIQUG{q;v&@wS{9wu$6$ zsy_c-o1dBVewjNE){26nj8o7$%~0}K6*Yignfi|S=pYOcu%$L|GT$3DDz!%=Dl^>6SxEz{zGp}0<=xzlS~J>T7a$2h7!M{0zXf>&|`M$h^z>*NkOZuq1T zCPPF>NNU znI3up$_61l^omrR&#Jbqx>0urS6KmK<-i5(ILEk`7q4V;e0r533CZkm{oWL@q+vU6 zQ)6Asb-sBzYu7wP*H!yR_Zh)KK-@t<`Yr=gcEP=oA60`+w=OTS?-F~OH8*X!4|mA> zV)B}=Ek%5CbSrDvN-lT8_{UEdDHtuSe@Q=?-gb5!__5LCoWx|O;r=Bis!KobkU?HO zL)uH)4TsQD&SZv16?chZ(YYBPvr)ABL~~mX^|DrP{Ax!0j-uf(Bs8ru!vn}@@7fQ2 zTt{Pna$WN}qv#3=UxEIW`4H@sx^-vQUVS-nRlmcHv&6Hjc-;oeCrsWbh%n30Hno{7 zuN&^0@2SRuQnEFVJ@VflZ}9G3xQVi7x|_8#3pc%PzZ@W74Pdr<@*rY~_F%m;5S<%n z(I;N^vdJ~TvY|wk+IexpBK}5Yy41#(6CQrNcC;3HK+FMEf(VzTRfxRUS8jbXSkTbSAkYS7kdaCHY+}f1o zTnWw2%k3Fo8VOUSf{KeqaA0>Qq4b4=(taX(L_OJq>FQX~qh{ImoBX&LIVJ+w#^(Cg zv~l7hhahnSqR}2O)L-;ZhGUSU(g-C$Hn29*nQg>!qtVx3OR{>F(#V2UNPWK~64ruX z*{i|zm+WQ)#Ltwpi`#pjK?MdY_GznXxy$@B2&rQ&Tb2XJ1X zU9yRe^H%3uN-=C$<}Nv(Egkv>xJ#-q#URge3P_=6>Ne5~Ym`y9sRG6G$Md{{#Kr9y3D(=J- z6?>-pi+UC@{GFid{j2V2%B=!+e?s}0fG~fjnA(+F-|)+XW#R77Mg_nX7|v9V}gS>45$Xw@CP zgcRp~2sd`{IA1U3O(hCd569m-bSue8%!6 z%w^(A=vYj1lHJY%=Cs||8X^ESrn&%i+S_>r!gxG>T1BjWKEr=p=HR4KI4>*S2yzdYcy+Rc?K%j@IeK+33&nz%QI^B6w)wzX+NYcK= z&vj|68Z5GHq-7jCtQjxDgB2|(p}pok$^q!wvKWinVr_!xfc4lQIFoTh9-r&{!}nC7 z%_F@;t@@q)OV4W{d@*Ey%r9_Jc)k6OF*s<8+$mGdC0Z3AbV*wSjOuqo@ji&WAvk+s zP}HbA+HYNe*+>uo4JcG zky{0{zVwMD=qyCu%^qOAah4zf7FSPcP79-cMRQTVm^O+6_gB zK8?jAeCxI z@h?V65hhLdZRCxW{7cglXD}ok8$*@-yJg_suO3V{n^`#2=q4jziD*smr}1Xps?}Ku zMT_kE4vgtw+{Y+gSd+jP?M9GmC&=HnBf$oQ-VcTwGp|~A2A6gMm0fb8fI8(L+4mD9 z1moxj`Twn5lq~$V+Owg?5zZM5BmeNbvP(X>8MMe z?`w+(RDj?^6QOa@v5XDe*TzM~nsbxBo~f)I^N=>780R|A#XD7r!SyfB+T=Ivd43c< zIYj!3?)jx#7f(L6V0BUCbv08LIz);ko-Y#i-8a-NE9%P|E8kAW_Hw1OIM!cJDiCQ0 zx5+ns#E%ByJ_Mk%0^sl355yehzYh5t&(E_=!9iKuLL%d@;u3Dofup&7PoP09SC}`_gKoxie_=SJrLE$7YfgNA6VWIfr58MafG+fcQ(-6qA7iV7(!{kmpge z!`<7dzZyIOGC(uW%mu9u)ziJHu(QGcT?F4WBnWbz`9 z(0}0!X0^8LbXl@Q!j9wClaGh{U6b~Zt`;U1HEMnXU6kXoad8^w`uHC`AEUy7qVf#j zMM~j|Lz9ey;=fOFyh~H7DtPT9&Dx3)!ULtbdS(R{Nn{Il0eoU8CmTa>jpDQ2Bux6| zvOM^P0htlKOj}4_q}EtS_fTid)Xnqb7I;k+&bwXNq`#LY6VFX^O>me-qoL|z=0lS4 z47%9QFGN*8iXy3-l}rnzX5G8O6&oi?9+#?nRG@g5PA=JuMQ1`6Qtf9SGZCvYu-8`C z`q4ohPI;CdXBMDXvo1sN?80N&F{gxtHRPpHP~o%zop(=(apq-}H?DKV^kS17l9wI4lVxmsBTs)@iG`i^uz?)CUGyDIPThs=VLveL|G z{p6bbdaT}Hf^|wP&zId7O$E=PS36VW9rNZRv}WwiK?@DI2RZ))ACR0YUYv}{)H8%; zuvg)^)4&a2K4AdEKLzyBj21Oox)4+Go?CjU5v6r|)x{PwiaN^$2TOUb7SY%xfg>T; z)pPD#5#(HoK@Hyg4LIZKp_6-a4dpM`;n#wnEq12f};wB^s^X7vWZZ2~5S? zNlT<;y%QJpPg;3i6&oB-JIeu6Doy}39)G4d*#|>feDD1=>|F>HwN_FdNQ_1v>50u~ zq-v>uHtDKXbPG6;cf4wUXxt9l02@e!Pb;2TJuP$VX3ga34=!_)u@(eh8$_043M5l0 zsUm@Vmv;Z@<*nr|bDjv5XI>s@Eild-BGdfN$t>I2T(hO>iDGe)Bb19oW#pptFE%#A zAlF&QvK~PQz2;5D?iebUuCoMYmW6V^(eAQf@4IjC240CI{GD+;uAb1cwrs!8I>P){ zuHIOTaI;tmNLp9&BTv;ONh>_0?r1My)y4cRv`}kdWxL>HtU+*mQzwo?mb1DmsQ+@u zGIS!<8;GmKxeG2l^H0(@gVb(5?55?#3$evc^9DQSF)U-B-nGis7h?o>ACG1QJ0Q zZ4S-%3g>(jJvrR?;M?m`&#-j(Bx+4pf>Ety$toqqe)+;bBUy?nmfE6+;ZWrzFm-$FH=wj_ALX&Mwlbk!nqp&Qr|=z6ntovx==U2S?maaaXgBhM z;u)VMBU9AA@8tB++d3y|hK-fDE~ZD94|=~b6IJF<%C3`_$Et*-C~YjO7O%btd>TDa z>=CTjUG8hE*BSa_+JY%dC6MRGm=QIJe^#K@xbQ_e?0}=508dwBOfK+*?2GR?KUeY? zxer6Bd~%0o6ARP`R;#4M=|W16Bk5lEN>^C*S;h=g?a+i+cNHkRZbIG}?P1}TR_xAE z(csyeDwT|UZ<4E(FqljfpcpW;)K|7uP(BFniY<$nmx~y>d_Z$_Y7b{iJIww$HK{(< zyHxv9@JLqF{a|>r=YXz;+)qp2JW*BZRJNM-Np>SKqT+mF9B&380uH!Ij!`pKCOEcK zmQLHhdwbOdJGOIe8Rr)Jd9;>;FgZax^@jCnQ!|v6-vHP_K%bK56@+o$NM7poRDWaR z$G10*2CIxDesU8}ny4JtZazUH+m>^X?JGxe!4PRE z!Hiea;LD}46+!ic4a8pRGx>gOG4*=oar?+zTdCGq*;SP=NaOLn+jLU`Q5trr#AEoWVD+u@OC& z#__gzk1mW}0;z$br+?<&U&Z?Q2h?)(eVeCnmW;2V;d8pvdt!JrS=(Dvm`Pui6 z!tl}>XI864O>xv@b%=oo*FAXPLwJ|}J|n?lD7iwyFRxCq5~A>TW{YO$V7CvDQ$2MJ zAJTYn6Tr;{uXXIqVD2{RIqD;JV<4rK6&2KUunt6viAE()X3fhR%uw|e*@WATqm6Z! zg*&lm8yx1tC6x~Z78QhC+x6WdT*2@Q3|q6Zc+fXlS$1u4x+Q9aY;t9YdHTbcM^9d$uxL z*g%=kdd8=pj7gFy?&Gui^#0bx zC(83-+dCS4DMjOMqv{2*De3}`?@Ue)8=!45e{egAc*?ZjocAsIz{BXI*rGG1N+4*dL0*+1@}#=1?3@y$PT5om z(?jgM>TAryoH2V!;`R<=>VE?)JsWYKVPrj9)v!K7s7&gvQB?z$OqDq}v#&YN|7Y)Q zm^_`FlVsWe{RRw^YTUxS%l^7J2fzFYiJm&NeR^)>Pd{y-KR>;1g5b8E!EijUe4k$> zPmmQm{*U+g&x%v)nz;x~519=A({**}O_0&MF#PmU?%CH>Zt(z3lNTALwHPP&>DP|6 zqY+#hqj^)~B0FUAn-+tsBlDMb#^)_uWok=+@^bwacMB| zh3S5MY3-WI$mii_Me5zHXU1;X=&oVtT(+?pMtMd$0B7n z-agT2uTwR#SuPK;X|`1O3;%ds9c8^bKm2mW5Bufioaa*Uq@k@fFE!qrG>l;TZ^)cX z;8O{-J=A>Epl_#vsg`|e%4~HBi_f(&rkjN4CHzpUI#frVH&croujmLzBOPG)3S8v; zRIl8&kP-RuB+Be9N+j1jqfcTGwi(2e`HBHo#4Y9#hE$t6=2<xcdVIN+F0|=4p$n^(zb<8~8fUs(#|tLfo>l~K-UlO~2(&Sa zJ#lSj{+ft@xaSPmY$kITp7;x?IS}Y-l?bclXxag}f5kiaWWn9Y*V7}5RH~~AV)+w1 zU`5gTCTnXdu^O+{d2z$BIuVYtld$z}#+3NP=}{N)k`$?XX|E{rF=Y{h-&({)_5${I zQ>$N-EqW`)JsKn`IzxnR*OnK|+XfX@I8#f9&`LZaZzuFHH0zlWE1wKtQ+B4(+z>8g=l4)eO_NR9~6|GLt9uGQt;N7H?Qy0V_Nz*}LXL#jgaDjI(3VSO5 z$FpNS)VXZsvRh6GSI~+-YT5Vpahu6G=RbPQjp^O_AZ@hW3M5Nj&5HPnUOYboE(}+E zNG)OA_zhTR+qL>B+;Amy?C*qTk6G&K>Up=yCFTp(;Hxd(6AH6e+r@DU^3CLyD|9_CKO#sxvLBPz;Cj zW^gF4$^&WlTm2lbV|)Awv2O6a>TH#IJmw9 zkjiX&l^qTt-TM-RV{)&5dZ@nK1aar*R9^H)n{YFAuF9CQqzq^j=_cS?_>q~Y9ykC) z542iZ;S!^O%qa@CmOR#Ik>Rhy>l>m=D-)($h-%45alvbNrhp9BV2L6l%$};K6h7dP|1S_EFBwAvU`?#WP?a6)#W)r03r*J8`T58%9Hc@h4!N%ZbYZ} z)ky1>>T1DdO?e~jAZ7NL^$gZ;#qT{_L?Pn{#EF-G8Z(Q?B?=~rQpIOAW!N)4GP_Sur zKCEN+(Z^T+c0pe4^;b8a?LG1lc#3eYa(-FkVueWkN_V z<#u5Qa%r>e9^GW+$8s~(&I^SucGv50aM2HIiQ(x~Th9HY(|}9@a60H#7|RaGDqmrz zMOwuY!xPdVd`eDRqlt(#8AzHQ=4aP@aTZ!C$&wa7`4&TncVrPVKb8}J`jw>FpIoqK{I(OJ9A6&|T;`(8m(Kdd-JHg3tzT7-Dcc6C!V@cAS;MQZQUYp$6hT zE|16N3xNxb<_aEz&Xtn6GA}PoR=V#P#u=_S9Y(yJVU_V|neUD!Rf;%OuNm%r9hkgj zdmH|aIhHw=8I9%khd*|hdU&()m}X=Vg!+llfs#wtwk9XZ zs|rHsjmK*BrPdA+KE3Rj(i2S{c;Y0s76BJ5pNa}`(vSq5sHW5zsJe5m6SXa2s57#M%!_U)2}Vo|cfeiF_cCxTG!lhQLrG@55fhw0g% z2Pu8+(yM!3xG4uyfe4C@&AkFM1Bqhc4b6Am$#eh^%M)X#BMR(I(Btt|kRK!Lf{&g?Ztc>h`c6Hg@qR(9l; zK_+g}`knQRHfwuA45gL<9Pr5EbI!LanhGLe_6tS*Uf4L7p89al4bTR21y=s(R$gFE zCvLgif~Rkg4Rn8fI7e$sRMRD?^lh6(-%PD6qK$PW;2x}qm!k_$^w}kQstiH7;j(NTm(J8Yz7-n$(%AxZSOazfjC8`BQ+Ps zk=_PHysjlG9tZx6Wo+?Dfl*1J4p(k8};;OlWD`A1)N&XL_{>^G~0>wXwcODczfr`_un6VKbT zLxJ=12aLU+vc;0WJ;nIV(4;uY{vLib+bX|_p~L0XVhzyt@fQxz%ea228+0>j*GmO{ z8lHG42X7%B8Dz5U^lNsF$m;*B|C-VXr;%r34#2K`-K+%m6_d_gY~uO+gr^IxJ7pHi z)>~bg$F)~~omGyS$&}#}W@=QoQ0;fKtL%FK8x6I+n=LAPeNRH73@)4_ZEm-5+zJmYB@Infd7z~{ZD!` z-^l-4Z^rxoz%5~Gl^YpJVTP7rtq=Dl0(ex`=$cf+uDemBy5QToVdt&49a8NX(7Y|U z!Kir3)TY>O@nus0cAY+i}^vvS>4b4o;#ttAM!U%v4`8m|-RHq7c1S8gs>%a9@z zscUT2cRQ(So){4LNoRO(%p-y+ZWb!t2DI0+Y^UvW(a$o3t3>1Uby5=uyu*+9XQuw` zxzIlje%|*~7V2ZqVx5eWAwFI>P@di895)!+ONO_A@4cnHX<^0N1bXEJi2}Eq%V8>G zk~K;E<%S(PSpL6%jkbw0qim<=Q`*gTP4ox^3A5y#x$V%^PGZVLw)N_F>YKjMY^YvE z?}a} zz|-m$M3+dV!fSA+5oMp1yZh$b1}97jL$R%c(3(S#sPtiVn&~(DfNf&=TV>kf>WHnJ zPy0(x4m~QC3RY~YpxRi?-Bwizn?oMn8gbuwE6QkYmC$^1czv&p*IQ}(fZJpdug)ZG zrz;U>JZ|0#ETz@KI#|on>zh})BWN%4E1~N#UncBYPvSEn15`-Y-7#WOQqZyjhq%S9 zEY2`g@W8V5BwWt5^0CKPiaQy;zq^(3b$t5e8CwJyub2nx(^oM@R3qpcJ!H^$8;|%b zyM{<=3AB)jvy|Wz=4fu}DQp%Uv)m^MN_XyZcfo?ZDd#smQe^X)PB1NnpK(xY|M676 zWdh@yM3TNhlVV4P*r{MhA-bLsBd zSXQ${XFM?V`jy~%}n zy!wyiL3OF}S*qk%^M0a1(OaIrUc<;^-_B7DQ3HD z^c44MpzFx-T6e%U75kQAR31~mKgaBUxH~);`a1Z}`ucVpEl1X}D=Rr6Q_9jTA`4}n z>0~1`&YnLQdbCn|lcw&6>@yXv8G_80p;!Et1X)y7t!zkEDrrtf7Mf608sLJ1q|1N6 zK8j_ZbB^k#8}krh1UbVz$*Ef9^Ay5a#J(RBUCUdixEs5%hf%zA?qqUqE8HaqK6~sv zpt%8pj)nGr^Y}Vv4dt8tZ~_u|)Xc(oU@As;@akl~NL-{)gE-Q*7i1HB<($BE3+U=yyGiXsjhmX6<6Um@FQ1jXZyWPSy-@DSGt| z#T92qzhBb)Par3#3n{;XLd{Bsjc^sOxZXL|6cSsbPNbRs4C>04?#}3~>el#IW3@zy z{ZEaRw8cY2<3yMiHFV6`>_4OVfAPN>G&%KeTN?q$sj0AZ3$_nMp(qsB#OCQ;{qvqAud=*YZD)~h_o&0i;OX~L|C<@3HYVRUS3@-9=il`K z3or&!#;`|A)b$!SRO99cXUUl|I%?mu5;i2@I-4SeWv^b<_0|07L>#)olYCXn%ofIf zM)3u{K{kEKnf|NCuFaX74#*7u2IM=h$4-iFp4B<9QIH3~LN4~w+*OPo%kh{$3?W>} zI*81lExxr=5FzQ}Yh;2|N4(*8FGn*p77~_B`wSgAi#aTWsWeOKyI?xH>FRFi1IVyH7b$`edT)Q=yxcgOa}s zs9t0r2i!dwq8ZjR*EuAuAshoQ;mVIkNFy)OE#T10ZPQUkwrlAj%3wE?SX*{qyHS!U zntuqApL01XJCI%~4LpCaa~E0kRVl6~Glg;UC;dy&za@I^pP1e4hbd*tn znbcU)wsXJeU_&P4t+n2~UY6o)?Jb#YQc$Ab*0_kte3z9vMXmcS-K;KZWaeU$a5OX2 zk2dbiaUoqD^S_}fY7Z4}DN3ws1M-Ev14+hs;8v?SLj6IQ-+fB!p`00KVJ0> z6&jUeZD-2j9bV@TkrO@m7#D9$e=1vWsPDDHGvZM1?S}nDNjZPk@v%_YF--zZd?7Uq zYYH2DP8nGkXDDo-&6k^fs4Ul5MUUF6PJ@J)7O3-NbxCi%V7b=M+DbC5CnYX{7rJb+ z+-eN-q-$Qg-GS|bR8_{e6g~rNVnYA`wbW&igTuZlOhIU?$0Ck&fa%d(WidQ-yPW%9 zu%L^{bc{FkX-qVzahRy$_Oc8PxHL?Dq|?MAd;(B07+gi=x4%Y}CQbc_OV;L2bWP>< zlm<-(7=3A|@E;Re>d&_Yoj~lSVVx|uRa+tNFC>^?W*pp_$k$Gz8MpWh1wd$UuQ$CAJi#QOLyF< z)dBZzxcu2%c8kmIa{J~nTZM(R7XegG9}!*-3et_}B`TJv!LOkDriH6KU^_?`9zAgm z?HAg+JWgZ#e1Z?OxJ$`@j@F8y9+Vu$?I-;P$P|!>zw)Yr7vLb|kHho6GJ$r}o^p}F zhKd*=V3C_wk`wn*IoWOCd@#~K(%Nbj&ka3_fiiyI_?8v;tV?-5eI&=O--_IeTM8kw9YxLk|G@|Qkhadm@x~|LFUcSoOhLG_f!Uk%%k5Iq*bWb zUE>v#a1di|q7_*avlr%m1C+g7NdNv7%pm{`TUa~IX9U_N%d)569U{|5oVR)j%Dk5| z9M9$LPQS3#vGNn4*&kS!?rr1bs;Aq~L_9l!FdYWlS$Y0RtIZL} z6l$615S=gEkIfDeE}Xg|G?#*MDLi5C+&|Hz*jjcm+q2hc-p(&rYFH^ho3sk?rJK$I z^(~_0ZYv|dC=VVP4BdYbBYPQ>zXqQoB~RL@rpE-{XY0iAU3b<kMx zO4$_|(}xa4&$IKtzc#y{vSqp~#833JnVZ*FXfA}c$Cf4y8-oQBI^7mK4|vKpB$?$6 z>vj%apfqJ|ZQiQ!xxLg`kLVHsDZMSCiFJhny+db;PbAyQT(%>@>fz4EepwYSE58+M z?y`pqAmmQf$+wFiH;l8E*VwLY2WRK&+aK#k(61F^VRov44c9owbB>W~krKu@u*g6|&q0YkNbdgd zGxBypFC4qj4$7nj=d}+9bQ)ud)T6XIuKA3x+r0K$5-7g8Kc1{JGq<}5{uWi+A>ono zEClCulw4@?)NA!BQO`CZ7+pqKTkB2Bz#za&3tbk$3Kajj*>K$&r8u!G=vv4YR`2Ul2c4cX0eX=JXB*+C@{!K2(n(3uH1XxS|!kQC#52l zofKwSMY=tLS?G%3j;i4e z<3h6{3gakR+4?K%Sr%qA_q!4Mt3&_dyKWBwp*ar$01Z$3hB)5Wlam{+)B0b}eSbAn zpx8$JV$m}YqsnGngKR2PzSGNY?7{$!V2c&Z^ph}&_&V3-N(5w@zZ;~cTSX|v4MY2z!K zlXWUQ8YLg}3^?b#boF^blrRt}*H77rl$%9^?3*N6_F3TmMMW6l)kQ4RUGuo~ZB=TY zHw&b_f?GMbHfWLj7(r&S18Hjq!kZ@S~3rC&;jZ!1c#^@@;{ zcShSU!D8E`tNWGKU~`9rcoXUN?*WhDCF&WJxgXXh)ph-)CTk~4CQ9iIax#hi(+ZAYgo4)ySPCCMl~QyWbbCv2}~dE!^q!E)>Fr+XGv zHua}ymFk5`&xs!~P#yP@f)99~Z10KfUe6E}nGnO+M4t-o1eyH1Nm8GPE^jD9r7*pe@(f3taax=Ls3IC2bot#?xB~2onl}s{CN3tdE(89k%b-JO@d^i}H{vAK^-JV$t+qNXc>VkV^NGVm_YhtyJIgqyQeBz`e zn4Y+i6e`#Iya)9s^5Ju0pjV;T)s9~aGZ@GBCfN1hJW_`RHX_P3>`$EEP99TRcCJLBuhKDb#+Po`8?97Z&?DpsYpqrP2X zJ)iJWk=qVQQy70f$+)f1wldUFSfbo1B|kC;T?9>LvLjFJCT6r%EnBbICV(0iKTz00E5l^qzG8o z6tW%HaC!1gd&D0uTGoY`IlP0);^mUpOVhv3ERbh{4){~u#K#~I`~7lvcMlwN9NH|0 zGs0ZDYVsN)+%EQ7*Gre}l_1!`ie61Ge5vPC;iM_b(m*E)YwKP8j4j^BEA_6!wOFkH ze@;D5HxI<)2)u95)|x_@eXtDlJ|*JjM>iX-g@rCAoIiwfy{}%kx|a}~m=c|!6ME%R z1Gm;#Ii7y*KOTN;`Agv?Y7#sqvb|Voi^=GnA3T1vy`y2>>>FxF4^dWyb4B0K3#Y9P zrG~sHKeBKO6&k+cs|OYYcZtHcjuBHaa2RLVlCClP;8_!PX0AH zxvgGwXX0(E6Ssh2aH-^LSObqlKo&!8Kj_ACX=d1+{@TAQDoa|$th$=}nzLHP3^JXR zy8MMiJz6ZP5_B7Gu6TS<5{i75)m00p+GO#|TVL+0xPQ+;_gK5bd~Tas^ANBhsIRqb z_VeIg|IzEB0Rs;D(Ppdhui-86svv$Jwc|B(6iUtuzRw9%L?Jh<(3Y6 zzX3kV{SxFBClS5qR#EF`bdY*C`WePZot18bKI99#&=wT=v!Q!PA{-?455-YbgLrQu zKyDk^ulgI%G+EJj?%JtYG)d1mYdPf}r{8105R-UJqr0jKk$>H~?NV5&F~~LQ&bQe; zqedsOuLRJ!-y<~td2Qftz$(Y;mk#Y4cJ`x_=bpV)``lsCHjr9Txo_vCrZ8h4<@-mI^lWHNVJ-FHB;_~+JOpQWJ>6|){( zndX__CVavbg&k4`Y@9dz+;mF4cV=qSQZLLyVpTT%R>X&t*9orFK|jw27`C2%WnaWY z?($#BVy4{|mVyqI@tj6z|5djgYbB)-qt~d$2=eWBhwPe<)<1qqp80oTE9ol`_u3XD zJVfE~&PguDVQU9GnXfq^s?PK2y}gRYN4zI2QOnmsRJfWM00lyPJv$>aVH^u3Qx zEt}oez|=3qNP)nHRN|`(KLcL@F30(0E(Mjx43$Su?37t+jI$Cu=t+dVWwjVB0?}qt zK(eAsI*I4~rpLJM}_{fa0_DW~g8l-0pp;w~~I2&qmYND*E=^-wc zg*;Zx%knGc)0h7Sei#iMY$^B|bx_*tM}SwlSS{{%?w~2>KR4AViUL}L3!=*cZR7ox z!_!miFUA%=F8hg^6zj2k?KQ}Hf@{}Z$xA26^@})NGsy^_8UC^hD-uD69ZR|_EuvDb z#wN_Ejod{CN){J9Kd7rQ$4;i& zCl~xZV;)hHc|$-=>3jymwt4JFZPvHHuXrYadZG~QF`w<@BT&UHiY z7&AXe70hk73tQt9R=^l2K#0btdUOQoLvdsA9D;!4aVv2G^d0wn0Bj1 zto>rdfC_-ddjW60c;6uQC$dv7u^w)Lb>^jH~TVk4q-P@EHVH|Vpu{CINR1kXlY?cPDQ0IpBu zYnN_N>YCT-W9FLJd@d*NKyS@zj8491 zU{;?@$g`I4ST>4ARt>$5Ld+<$#;EO)){j4aJW&lgA#*kg(etC{4GfoxD`Vz`Rn@a+ zl>Dy|_fL&^%3j;5m=5X(X=lin_M6NCr;}YBYE3(wqKDs@y!1#+7QJ~w>0h5~R1EBy z;HJ74{CdyjetG20ysl3UcUI26p{1)imy3YP`(gN&`st$4*FCvWMDmW&_&Tec1`;chC5vrC@NPwl;5zq24^6fL||% zw@XjN?>zmOAN>xa#|&#uRuXQ%29mbv1YS-0=$ET&gyr-eO#xNH5DY4JDkFa6)!ub6 zP`Tqhn;WbJRA0pX^jc}FH?XyAJ$u)_WUU7=PFz_DrLTbvF=giJ*jt5uGZ!)(<$+>R zFXCzwN-$B=-e_~XS=JgY*nVdq_(W}B^ws}X@&12&a9yM2GmVYKOzc@R%p~NQqfpygIMb}!!yV|W6jCBL=3f4a4|8HM=9o!n8YVZBQ^`b!arc<+w%`YCL zUmm6A2bX?r&9~g@x3lBq{Z5@H%|2ls*e$RHHauZneAj6VP8k_+HEO`;GsOuw2H~gm zEB9*}dsD9*$)xgm*66qsXqql$g;D=fe5`%?jnIsAbtqC#q-`agBu}-( zG2QWdK1P!GGWYIzRdQd|!iB5Ps$z0#2s))%X0w#MI!;^Rp2RrJ2(=Cf0~IRBLci5x z-a)k%q7Pn_9Tj1}9_>9x#pJ}FFoX?T#2E1r29W+%p!x<{L?CK(lZKI za+seiQTXJPLF@u&7Ijt6GIQJx2wBR^9XxLLEEeIvyc{f|+9!t>M{7dE1vR5}u9PH) zoGliJ1&2u#ez$sauhmyU5%ozLdFH=<-!_nCabjMm`1YT*jO)5wsGp6_{a3nEYqeSl z2c9LVt8j_=cGePP7kFoW@6pS2Vww2+cQhfD>1y!J@W%EPthW)6*;OZ2w^3lbA{D7F z`F)cf0DrZtNs3ND5MtS(gHh`-=Fzia>FTbl=7DC)6@HE6pvON$WGn)WTj6jcN{(7K zc{nGiXL9J|YA0Lz+I=kJoZCEMlJ)I9KL{J-_+6*lg*F_|P_#KWR>OOEcKFqw-|pGw zUwYrX&RK()AjQYn!BS}Wp&B$pl&lHXSkx$C<7xAr{STTluZ*fnNmH>KOfRotNbr2Y zu(tF3=Z$w)+g6_Zw<+@f_4x&zQPWlB4w*t8(io&4TC=K+{iS`*mh5sc%PmRyPPld6yx=&(e2OVq@7|qDUEVWxuYblWrG9xOz-%4G$87!N zqLDQ?+~Iw|D>LA>_k$`g!IW43^*gT;TR)&)vCh?YF}l9HRIR<@iUp%S)TL&y`Zp1* zy+V+M7z_X4bT&lHms94d&M+nF0#V~~K<6O{+07nd+Cf(srtW4bYc^wnqkS6xS9{+X z&{Wo~9V}x(P!NJrl_E`g3n+-vga}9=fT1Z2y_XQ_Sg0XXDN2(j1_-FMKnNfN5DBSje)s;of3nU#d++r;Ywcv8lie1T_?uOZ6@GfZyPeaBUd^tT z9T!-yv?OMHvNbee145p9L`asH6)|gDJgRAyc!Fusikqxsd8(IwID3&iKjkSKTPR7D zw0aP3QSFf73tga@0oE8b8btJUr#Nzul^)aXgKH*>)fOcFOAz^B$O)?!6OUz zS8XReGdSIB249s}h96EBQjw}$pC)x+Z*1tsnw*9Uc>*D-y?yG;fCCN#^c+oe4CXD6 z>3u^Vpjdrln-?Cyrto(Lx7hAzOXWL3Hm-k}XwSX3IFj5_tPjsZoOheOhp5-G)#+S% z5cUm=LbN=ym2(^CA({@@hT7tncA$`Z8wwXlvkpVRN!c0Rd@kOtF|c@!2nd9z_Y(mm z=AKK!My$4a#8Ne1uu%VOm1bgum=t0YtL(t36+^nSV8CJZAAuMt{y@l7?9ph>@6AP_ zF3&iFC@{tlrF#ls!Y{#}UZsR^M1-35K-39k#QZcCh~UnhQ(^WAuCi0Idb#06_NE6d zoO>RPTmB|3kMiG1X!ZB2*0f%1?3&tfk)!9kmn<>nV%-VKyJqsd6U}?pJIG{!+NXI> zvYFvgs<0ssEWId0^$yAze$WCD+#LN0RB)R7z^MU9*)^m*F@k5;v&!Lm#uef#-Q%9?-(b83Hg)Y^?Hce`mBg)G0hC0&q zx0$x16bS`-jD&~Tg{CvpcJ(5+1~CGpaphqz0(+^T#~oIZrA7$hTAWhTo$?`@-rRcU zUFSDpy@WLT!LzF_d)X^CmMz1O=rG+7uJlfPF7!kBz+g?!D{BQ)iFuitI3{~a#4UD$ z$*sAcPlluKVQGiEW^O^f3hq%cWTIWhFg*q>6cY|3t}68EoB ze~)qf*IJ=>2j8|FXOT!X;F1~K^PsD#s!gl~B3 z&5KgjY%Id(Y)ZV`?O0#et1Q9&3W8y>-iWSTAq*<*br<_`tr-q(ItWiIJ487*i=`FL zZ+N|xJD*qQhkVQ+*cvshXm#-obyhg=l7C3!XL6xVfNx-U zP`wjavu|j5jypqLuJ-Y+oLh2PAg4c5DuH<;`!oO=$+F-KALkz1NmpDX~K4I z;_{7gA&X9PGY*8E=heKgb$R;jmTPt(i)$ zD}KuNYPKV8-4a}^E-|3?up7L-)`L+J@3GqH%-oAwcQR}U8Po0vP?4dU;}i2NK!1+2 z)T}6!L2R8|Z+t4~P~+?~;Ny~Jv^<+5%j8|5Nx;4|SIuud(^o6zD;2<{t~d8xs5-YH zDAnpGy))Xi?m;hyxF~nw0+yo!Qr|Y5cf)IKL!WGY94V^Efcrk^1Wi7diPd~~-XGXb z?kO5>!~aM;UXp?xlUZ!pTKV;jmW|xGJq%b%fer=<9KH>X3UhOO6vp1qxHH7)V*mMAS4QkLPZ8&T8nu2+3v5-LYC! zkizw~E7!b$9Zv76R9?2=%w1GtCCOu_#OK4ffzek-8iH$S%|dZNK-}iXtc%`zNdpUh z3{C@w{cD1~&ILwfm^LqoAy0!p_eeyANid+vZrB=pNZ~()ieHfYO@Ql1SYV46N*_t zNpya;yDlRMUVxK?qE6TEK8Z=S@)JqCW{2r3M~g|n%`GBj=z4189B zb05irc00Gk`zww61NGD5J{_FC(x5t|XFEIu?+lxqSyZuyl0H7s|JjarTENxIB+9!T z#};@_AyyV?zLl~_8F(HU{Lz(I+j zyKkv)XOIec+?SC17NAtwHO)4QiYi&R<6)j)pD&yt)=>~fE11@<9;XfK19%% zKPocMnd!FLO9#8$dYrUVw_L;6{)JmIi1?c#l>2;DCT7ljE=%pp-fxybUw2pe+$xx? zbc<0|<8 zjhVe-U;dWdlV7^NFCiYMEc%2Kj3<2^BVM;p06S)4ZPsE{TjqFGX9q83x?IvOIm5Dji?kTlx^r=ZNUPwuAyF4|-wr z6^&qE>_W@a2sH73!1n|&Y8Hc@P*ttF)JS5@Z=+7m=7~w1^$H!Z)>!2A-O~QNtx2fT zv5I@roX`WWTNJ)o8>IV*SQ59O1~W@!{Ga>QuM~V z>&m>k>7%ZG0T-`SvdpQF{Og?bho=$Y*sVKQ)ed#q?2u_!>&5PA!;T%f+xvShe0>e~ zA9MmUOZwfTb;9SP_mCLXmFxmLtm;AYWZz-oQ&Dh-Xn4nm1aiL~eYP`QOzu77DI9n& zo4R|tujTYWe%;!;MiDL`wjmPlV+|QJrPD3qTkTyo-w~RVDM7SceZfuc5*aE+8$RhR zS<>&$knP?1WE8DgDImUo7J3slej)yCeq!j9m)>2i8n@^@l^oCH34`ZTUS@4uPW=Rq zt`PZBKC2#LoLgg!h=j_y0sHjYeB&s6Oa)UK_c%mQcxk@dgNY-M3~?7TQ=zL7dT-o6 zq~aUvNl*6;vW*qIfJcn9RYdTG6@L4r&qm)}z%sORa-cg<5@bzp+^aRJ@bie0o*6b{1UeTG`?%ZOyJTMK8n=a(*QYD<~9-L!5t&Phrswv`w@ zD}>~p>>o|TCO!f}9f>LOk0sv8)&s_GxX+D95>c?*nN?nfoxN`$LL&TL^m`3Sr2*0-if@ucS#YrOGe#m;T&bv}xXjymkUTmYyj$o%s zVQZV1Zu`fagiRY#wyUvvj@uruRs``SvV(uGa7+ga%bV2Ao0M)T{qghiS$I8XDoZa0 z_SvX3ZGDJ)F?PAb>4iZlgVz45L$c7Q+-)RO{i;?05{1!Ock975TS6^NJVH!84V-W@ z4Z~BRefY-x-KaK6=*PV7;vw@#kGqU2+0>xD2^f7TwU=J|Qd!wQBX<}sw+STK_1?5= z5P~)LJ9N5;sP^LDXy8ceH<)p?cPW@$5uCWu4{Mci^Z7!3Y6oDGb$LF-BfCPu*{ zxXRACtTfA7ryO^hNmnk*{zH3bNYw6G6aXsZWK$?X6Fht#j{plBnH`E1Q)9@Y_2c9 zCG_G`oA5p=Pl^Vp&p1UF^cpm7X)qSVUfI;ayMu>W<*&K~KK`6v9SMp=smKv!y19H{^=R%|zeeTUH+o+$P)p($M~-tFTYhJA*ZSrb4{7wKKV0aq z2>hWH`9oQF<OpCcRp-5dZXRW^2R@ff`KhmF}rsC`+Jl!jwbEoQvR^ra>l zIl8>z>&0>`KrO#f|II`HLj5-n{i`egUpD^jg2#MJjzqPX#ScC{KF55H#UCwJ+r2Z7 z-17S&PD(mnuL$Gr1!f;F>P;WDM8WSZA$ROq7N5}?KJU$cYBKHVPsD$=@jSBkNZD`V zq{I@SleZUGOMRsCSbn(BTcOn|f@rc90sFb}R z(|ss~CS!ItS2Ka$__Qp?s^ID1_6c>EJeUJ`C52WH7(G!8X4LZF4CuY}YpM!$40IkK zEyXt>a9Y);{5`gHh8ORS-z_|W7_ zLrs-QwTy53{Swnd_JgWX&XC17w!v{hxWx0@QJ3jLp*NWKu1SV_RK6%7*j(2I#EfAUIWxIrn*^%Y;`nqm;?&$a& zgVIcMzo0$5M^lVfqpz*6a<#dA*3Zmy$`Y&fwzUPNafGN`0^Fkpp(>}&>O7T)PFz** zENqc>-=j*&7eQhr&fRH@H`~#~+#?fl`n@FuFwA|Quisnh3T^~k@SW{n<Y99M_s?kS<)|b->cDiJe8eT*f65 z5UB_INY!?wSrKVyk_~=Xiq>aUtt;RjTIBC6Mf-vGb|bEmdvrFtj1c?Oh;r!5_Py@$ z?t)sepSx%f(b>w>S&wRHA{cmOX}4QAzb1>9B!)V|s)Z{!PGxQkzp_>%e>!v}YE)LGxT=(1(D|DD5d?N`u){XvW}E?lLC_py6N4Up`uwY^3_bll-}78b-ApnBIjV(HZ#B&Z+*%vj^_62*5}1}-{1AVzg5&eTWliueX`be;g%B-nA4BO z1vf{hih4Az6Vb#3?VpY4MBU|MFPMmyKYDRBFb0MN&cb+E#eT6=WmG8Y>WDD(Il@X+ zF$V!Ac-iQFn9vHp-!bpBXD1n-R{T74<-3=OKJ?z(9F?*@TF$sM0af>-9_Tdij{*_H z)AJTQ&_-(u!&p(A0bV%N#3`PT&>TES~z=Cd+(6OjCxTmH-_&8Rcb zs3vEQ?o|-EoJ%Gn79U6keJg)})ZEL6?+(v98Pa`cF$g}sM{PVUQug&^@Ju*xkcyj2 zc@;Ym0U{%f**+W>-JxoI%nZMeRN;3`7@DG}n+?)+DV4?mH;r?v`4F2)xK=aQgfmPz z5u)J{&zgp&WU8)FbL%t!XO)&q`yg0;DAU|a1JJ@v^u9Q_{*gQeMt4)cpLB3#N~(tB zM`;{!*g8^wbS+cB*5`7ZHpcq7$z&b0H_f(d6nr^}>9(P#`;Cc1&g}*`t0nglLy{YQ znMM0>W)kVEPnoZqO$nhIyuEf#JRs-Y35%Vm1LG#i+`hYe6$Rr*aaXIG+Oxi1{ zep;AXNC)s)+1DR@HxzQD4UTT|r)y(Z{!yT+oCOBJ9CIfEmq_T|KkD3tt^8I=3eIYl z6CoCJq--3iH6`_KI?odgt&R@i`f*`+{$(+U7J9c&Rp`t?T#}r^VeW{!mouEqx88kU^{Iq_ zwlZ6*EUo+9H#uE|Pc^n+M%e$V0dg_DQ z_mC3ril-mj%y=LsbT_ZXp0}&%bxHjyGm3XaJN9Z-xJ(A)IPr@6;4^8pM|{N_Jf)fQ zd^MGoTAE(7vR9nC!l&79SZ2pJM@T6Og>#RH<#TMq|iO`deT8CrqCTU(BP6U z6y&hEyI7ACkaN>}AtzP0!CDMqrmP_NkIpWAFrW+)94Q&N+&igqVcl$5XTb!C7drLCQz|aC&}n$+Vi^&izugE zsHTvM$DRmqz>MkqZVKD>YKdQi3FS`8qngWDuCsTWV4hs`xpwn?lFgej3F1#B6&mu# zwl^X_aJO1k`gBqgb#bxM&8%g*jW20K5JCaPlkUg)e@VhaTYDg5uxh88g@Iic7M$x{$ zFYLM{M$?R1IRltaw8oVrm76rPJM`XjO7w9>CjuwptUkIj$m!3mRNTr12&oE$y&Xkoz$q0rv;Jai~d zQAaIPhqHgi%Rer&ND0<;;*E7*DDY?$_~YvabXge)_vnkkr%Ni%Gf3SpE_izCJS5us zEro*?2Z3B9_-c5H!n~p4-FJ`LD%h=xY5~Y9FX2o1c!9He8>PX=WnMgbFz?-T&9=G(Ttow|?VQ_T@y+QsnTe;38Eur9q_v5*7c0;y*xo$o%E##6Qq(`~MjnP^FyE zOsG^qeL1E^n2_>5DjiHHn*eA!9PxGq0Le_jgyUR?9V!ywu}XRHmKK~CE(&?5 z(wMk0h^9RjN{S21UkW}2Ys*1It6rl}@6!1V4TA7Wntc58Zgh-cd??nWk zQnRW!=YVND>#)X@7Z*_tQb0uxPdoq_46iX&npaaeqP{xp#Dh)~+X+*KAn=xV{nBfv z|C~E2@_Y98AGr#suXv#OcQB)(W1v#Pl$3X~|A~>MgyA(o5T#e8+26`e`(5QRq5_fu zpz#OLf5GGLW%J`7fE1j7hpzmI#P?RAGyCTkKb${7c%Pr-&ym5E&Y!W&7cEZ*tW(f0CVltl)2#{}Xlm z>C2$N{}1>-QTHe0LuV>L*8yuhg-*Ny%!`7R3!QjN)4omBb04IQdTn&+U%d5yiU0G! Lf5QV5zxMwJ?GN}n literal 0 HcmV?d00001 diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..bfccac4ff --- /dev/null +++ b/package-lock.json @@ -0,0 +1,14819 @@ +{ + "name": "@wppconnect-team/wppconnect", + "version": "1.31.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@wppconnect-team/wppconnect", + "version": "1.31.0", + "license": "LGPL-3.0-or-later", + "dependencies": { + "@wppconnect/wa-js": "^3.3.1", + "@wppconnect/wa-version": "^1.4.213", + "atob": "^2.1.2", + "axios": "^1.7.2", + "boxen": "^5.1.2", + "catch-exit": "^1.2.2", + "chalk": "~4.1.2", + "chrome-launcher": "^0.15.2", + "execa": "^5.1.1", + "file-type": "~16.5.4", + "futoin-hkdf": "^1.5.3", + "latest-version": "^5.1.0", + "logform": "^2.6.0", + "lookpath": "^1.2.2", + "mime-types": "^2.1.35", + "puppeteer": "^22.10.0", + "puppeteer-extra": "^3.3.6", + "puppeteer-extra-plugin-stealth": "^2.11.2", + "puppeteer-extra-plugin-user-data-dir": "^2.4.1", + "puppeteer-extra-plugin-user-preferences": "^2.4.1", + "qrcode-terminal": "^0.12.0", + "reflect-metadata": "^0.2.1", + "rimraf": "^3.0.2", + "sanitize-filename": "^1.6.3", + "sharp": "0.33.4", + "tmp": "^0.2.3", + "tree-kill": "^1.2.2", + "winston": "^3.13.0", + "ws": "^8.17.0" + }, + "devDependencies": { + "@babel/core": "^7.24.7", + "@babel/eslint-parser": "^7.24.7", + "@babel/eslint-plugin": "^7.24.7", + "@babel/preset-env": "^7.24.7", + "@commitlint/cli": "^19.3.0", + "@commitlint/config-conventional": "^19.2.2", + "@commitlint/cz-commitlint": "^19.2.0", + "@types/atob": "^2.1.4", + "@types/mime-types": "^2.1.4", + "@types/mocha": "^10.0.6", + "@types/node": "^18.19.34", + "@types/rimraf": "^4.0.5", + "@types/sharp": "^0.32.0", + "@types/shelljs": "^0.8.15", + "@types/tmp": "^0.2.6", + "@types/ws": "^8.5.10", + "@typescript-eslint/eslint-plugin": "^5.62.0", + "@typescript-eslint/parser": "^5.62.0", + "babel-loader": "^9.1.3", + "commitizen": "^4.3.0", + "concurrently": "^8.2.2", + "conventional-changelog-cli": "^4.1.0", + "eslint": "^8.57.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-header": "^3.1.1", + "eslint-plugin-prettier": "^4.2.1", + "husky": "^9.0.11", + "mocha": "^10.4.0", + "prettier": "^2.8.8", + "pretty-quick": "^4.0.0", + "regenerator-runtime": "^0.14.1", + "release-it": "^17.3.0", + "shx": "^0.3.4", + "ts-node": "^10.9.2", + "typedoc": "^0.25.13", + "typescript": "^5.4.5", + "webpack": "^5.91.0", + "webpack-cli": "^5.1.4" + }, + "optionalDependencies": { + "@img/sharp-win32-x64": "^0.33.4", + "fsevents": "^2.3.3" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.7.tgz", + "integrity": "sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.7.tgz", + "integrity": "sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.7", + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helpers": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/template": "^7.24.7", + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/eslint-parser": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.24.7.tgz", + "integrity": "sha512-SO5E3bVxDuxyNxM5agFv480YA2HO6ohZbGxbazZdIk3KQOPOGVNw6q78I9/lbviIf95eq6tPozeYnJLbjnC8IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", + "eslint-visitor-keys": "^2.1.0", + "semver": "^6.3.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || >=14.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.11.0", + "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0" + } + }, + "node_modules/@babel/eslint-plugin": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/eslint-plugin/-/eslint-plugin-7.24.7.tgz", + "integrity": "sha512-lODNPJnM+OfcxxBvdmI2YmUeC0fBK3k9yET5O+1Eukr8d5VpO19c6ARtNheE2t2i/8XNYTzp3HeGEAAGZH3nnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-rule-composer": "^0.3.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || >=14.0.0" + }, + "peerDependencies": { + "@babel/eslint-parser": "^7.11.0", + "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0" + } + }, + "node_modules/@babel/generator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", + "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.7", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz", + "integrity": "sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz", + "integrity": "sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.7.tgz", + "integrity": "sha512-kTkaDl7c9vO80zeX1rJxnuRpEsD5tA81yh11X1gQo+PhSti3JS+7qeZo9U4RHobKRiFPKaGK3svUAeb8D0Q7eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-member-expression-to-functions": "^7.24.7", + "@babel/helper-optimise-call-expression": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.7.tgz", + "integrity": "sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.1.tgz", + "integrity": "sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", + "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", + "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", + "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.7.tgz", + "integrity": "sha512-LGeMaf5JN4hAT471eJdBs/GK1DoYIJ5GCtZN/EsL6KUiiDZOvO/eKE11AMZJa2zP4zk4qe9V2O/hxAmkRc8p6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz", + "integrity": "sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz", + "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz", + "integrity": "sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.7.tgz", + "integrity": "sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-wrap-function": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.7.tgz", + "integrity": "sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-member-expression-to-functions": "^7.24.7", + "@babel/helper-optimise-call-expression": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", + "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz", + "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz", + "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz", + "integrity": "sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.7.tgz", + "integrity": "sha512-N9JIYk3TD+1vq/wn77YnJOqMtfWhNewNE+DJV4puD2X7Ew9J4JvrzrFDfTfyv5EgEXVy9/Wt8QiOErzEmv5Ifw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-function-name": "^7.24.7", + "@babel/template": "^7.24.7", + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.7.tgz", + "integrity": "sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.24.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", + "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", + "dev": true, + "license": "MIT", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.7.tgz", + "integrity": "sha512-TiT1ss81W80eQsN+722OaeQMY/G4yTb4G9JrqeiDADs3N8lbPMGldWi9x8tyqCW5NLx1Jh2AvkE6r6QvEltMMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.7.tgz", + "integrity": "sha512-unaQgZ/iRu/By6tsjMZzpeBZjChYfLYry6HrEXPoz3KmfF0sVBQ1l8zKMQ4xRGLWVsjuvB8nQfjNP/DcfEOCsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz", + "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.7.tgz", + "integrity": "sha512-utA4HuR6F4Vvcr+o4DnjL8fCOlgRFGbeeBEGNg3ZTrLFw6VWG5XmUrvcQ0FjIYMU2ST4XcR2Wsp7t9qOAPnxMg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz", + "integrity": "sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz", + "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz", + "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.7.tgz", + "integrity": "sha512-o+iF77e3u7ZS4AoAuJvapz9Fm001PuD2V3Lp6OSE4FYQke+cSewYtnek+THqGRWyQloRCyvWL1OkyfNEl9vr/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-remap-async-to-generator": "^7.24.7", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz", + "integrity": "sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-remap-async-to-generator": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz", + "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.7.tgz", + "integrity": "sha512-Nd5CvgMbWc+oWzBsuaMcbwjJWAcp5qzrbg69SZdHSP7AMY0AbWFqFO0WTFCA1jxhMCwodRwvRec8k0QUbZk7RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz", + "integrity": "sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz", + "integrity": "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.7.tgz", + "integrity": "sha512-CFbbBigp8ln4FU6Bpy6g7sE8B/WmCmzvivzUC6xDAdWVsjYTXijpuuGJmYkAaoWAzcItGKT3IOAbxRItZ5HTjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz", + "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/template": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.7.tgz", + "integrity": "sha512-19eJO/8kdCQ9zISOf+SEUJM/bAUIsvY3YDnXZTupUCQ8LgrWnsG/gFB9dvXqdXnRXMAM8fvt7b0CBKQHNGy1mw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz", + "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz", + "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz", + "integrity": "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz", + "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz", + "integrity": "sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz", + "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.7.tgz", + "integrity": "sha512-U9FcnA821YoILngSmYkW6FjyQe2TyZD5pHt4EVIhmcTkrJw/3KqcrRSxuOo5tFZJi7TE19iDyI1u+weTI7bn2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz", + "integrity": "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.7.tgz", + "integrity": "sha512-vcwCbb4HDH+hWi8Pqenwnjy+UiklO4Kt1vfspcQYFhJdpthSnW8XvWGyDZWKNVrVbVViI/S7K9PDJZiUmP2fYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz", + "integrity": "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz", + "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz", + "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.7.tgz", + "integrity": "sha512-iFI8GDxtevHJ/Z22J5xQpVqFLlMNstcLXh994xifFwxxGslr2ZXXLWgtBeLctOD63UFDArdvN6Tg8RFw+aEmjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.7.tgz", + "integrity": "sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-hoist-variables": "^7.24.7", + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz", + "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz", + "integrity": "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz", + "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz", + "integrity": "sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz", + "integrity": "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz", + "integrity": "sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz", + "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz", + "integrity": "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.7.tgz", + "integrity": "sha512-tK+0N9yd4j+x/4hxF3F0e0fu/VdcxU18y5SevtyM/PCFlQvXbR0Zmlo2eBrKtVipGNFzpq56o8WsIIKcJFUCRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz", + "integrity": "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz", + "integrity": "sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz", + "integrity": "sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz", + "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz", + "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz", + "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz", + "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz", + "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz", + "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz", + "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.7.tgz", + "integrity": "sha512-VtR8hDy7YLB7+Pet9IarXjg/zgCMSF+1mNS/EQEiEaUPoFXCVsHG64SIxcaaI2zJgRiv+YmgaQESUfWAdbjzgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz", + "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz", + "integrity": "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz", + "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz", + "integrity": "sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.7.tgz", + "integrity": "sha512-1YZNsc+y6cTvWlDHidMBsQZrZfEFjRIo/BZCT906PMdzOyXtSLTgqGdrpcuTDCXyd11Am5uQULtDIcCfnTc8fQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.24.7", + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.7", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.7", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.24.7", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.24.7", + "@babel/plugin-transform-async-generator-functions": "^7.24.7", + "@babel/plugin-transform-async-to-generator": "^7.24.7", + "@babel/plugin-transform-block-scoped-functions": "^7.24.7", + "@babel/plugin-transform-block-scoping": "^7.24.7", + "@babel/plugin-transform-class-properties": "^7.24.7", + "@babel/plugin-transform-class-static-block": "^7.24.7", + "@babel/plugin-transform-classes": "^7.24.7", + "@babel/plugin-transform-computed-properties": "^7.24.7", + "@babel/plugin-transform-destructuring": "^7.24.7", + "@babel/plugin-transform-dotall-regex": "^7.24.7", + "@babel/plugin-transform-duplicate-keys": "^7.24.7", + "@babel/plugin-transform-dynamic-import": "^7.24.7", + "@babel/plugin-transform-exponentiation-operator": "^7.24.7", + "@babel/plugin-transform-export-namespace-from": "^7.24.7", + "@babel/plugin-transform-for-of": "^7.24.7", + "@babel/plugin-transform-function-name": "^7.24.7", + "@babel/plugin-transform-json-strings": "^7.24.7", + "@babel/plugin-transform-literals": "^7.24.7", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", + "@babel/plugin-transform-member-expression-literals": "^7.24.7", + "@babel/plugin-transform-modules-amd": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.7", + "@babel/plugin-transform-modules-systemjs": "^7.24.7", + "@babel/plugin-transform-modules-umd": "^7.24.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", + "@babel/plugin-transform-new-target": "^7.24.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", + "@babel/plugin-transform-numeric-separator": "^7.24.7", + "@babel/plugin-transform-object-rest-spread": "^7.24.7", + "@babel/plugin-transform-object-super": "^7.24.7", + "@babel/plugin-transform-optional-catch-binding": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.7", + "@babel/plugin-transform-parameters": "^7.24.7", + "@babel/plugin-transform-private-methods": "^7.24.7", + "@babel/plugin-transform-private-property-in-object": "^7.24.7", + "@babel/plugin-transform-property-literals": "^7.24.7", + "@babel/plugin-transform-regenerator": "^7.24.7", + "@babel/plugin-transform-reserved-words": "^7.24.7", + "@babel/plugin-transform-shorthand-properties": "^7.24.7", + "@babel/plugin-transform-spread": "^7.24.7", + "@babel/plugin-transform-sticky-regex": "^7.24.7", + "@babel/plugin-transform-template-literals": "^7.24.7", + "@babel/plugin-transform-typeof-symbol": "^7.24.7", + "@babel/plugin-transform-unicode-escapes": "^7.24.7", + "@babel/plugin-transform-unicode-property-regex": "^7.24.7", + "@babel/plugin-transform-unicode-regex": "^7.24.7", + "@babel/plugin-transform-unicode-sets-regex": "^7.24.7", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.4", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "dev": true + }, + "node_modules/@babel/runtime": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz", + "integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", + "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz", + "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-hoist-variables": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", + "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@colors/colors": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", + "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@commitlint/cli": { + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-19.3.0.tgz", + "integrity": "sha512-LgYWOwuDR7BSTQ9OLZ12m7F/qhNY+NpAyPBgo4YNMkACE7lGuUnuQq1yi9hz1KA4+3VqpOYl8H1rY/LYK43v7g==", + "dev": true, + "dependencies": { + "@commitlint/format": "^19.3.0", + "@commitlint/lint": "^19.2.2", + "@commitlint/load": "^19.2.0", + "@commitlint/read": "^19.2.1", + "@commitlint/types": "^19.0.3", + "execa": "^8.0.1", + "yargs": "^17.0.0" + }, + "bin": { + "commitlint": "cli.js" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/cli/node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/@commitlint/cli/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/cli/node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true, + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/@commitlint/cli/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/cli/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/cli/node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/cli/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/cli/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/cli/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@commitlint/cli/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/config-conventional": { + "version": "19.2.2", + "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-19.2.2.tgz", + "integrity": "sha512-mLXjsxUVLYEGgzbxbxicGPggDuyWNkf25Ht23owXIH+zV2pv1eJuzLK3t1gDY5Gp6pxdE60jZnWUY5cvgL3ufw==", + "dev": true, + "dependencies": { + "@commitlint/types": "^19.0.3", + "conventional-changelog-conventionalcommits": "^7.0.2" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/config-validator": { + "version": "19.0.3", + "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-19.0.3.tgz", + "integrity": "sha512-2D3r4PKjoo59zBc2auodrSCaUnCSALCx54yveOFwwP/i2kfEAQrygwOleFWswLqK0UL/F9r07MFi5ev2ohyM4Q==", + "dev": true, + "dependencies": { + "@commitlint/types": "^19.0.3", + "ajv": "^8.11.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/cz-commitlint": { + "version": "19.2.0", + "resolved": "https://registry.npmjs.org/@commitlint/cz-commitlint/-/cz-commitlint-19.2.0.tgz", + "integrity": "sha512-kudzHMY9/GxflGyAWMiisiBq2UkyQL1D1eWjGKoC66qQ+5jxRYeDaiVwTdPxYMnmehftNcpksZATDYKqdPP0Wg==", + "dev": true, + "dependencies": { + "@commitlint/ensure": "^19.0.3", + "@commitlint/load": "^19.2.0", + "@commitlint/types": "^19.0.3", + "chalk": "^5.3.0", + "lodash.isplainobject": "^4.0.6", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">=v18" + }, + "peerDependencies": { + "commitizen": "^4.0.3", + "inquirer": "^9.0.0" + } + }, + "node_modules/@commitlint/cz-commitlint/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@commitlint/ensure": { + "version": "19.0.3", + "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-19.0.3.tgz", + "integrity": "sha512-SZEpa/VvBLoT+EFZVb91YWbmaZ/9rPH3ESrINOl0HD2kMYsjvl0tF7nMHh0EpTcv4+gTtZBAe1y/SS6/OhfZzQ==", + "dev": true, + "dependencies": { + "@commitlint/types": "^19.0.3", + "lodash.camelcase": "^4.3.0", + "lodash.kebabcase": "^4.1.1", + "lodash.snakecase": "^4.1.1", + "lodash.startcase": "^4.4.0", + "lodash.upperfirst": "^4.3.1" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/execute-rule": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-19.0.0.tgz", + "integrity": "sha512-mtsdpY1qyWgAO/iOK0L6gSGeR7GFcdW7tIjcNFxcWkfLDF5qVbPHKuGATFqRMsxcO8OUKNj0+3WOHB7EHm4Jdw==", + "dev": true, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/format": { + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-19.3.0.tgz", + "integrity": "sha512-luguk5/aF68HiF4H23ACAfk8qS8AHxl4LLN5oxPc24H+2+JRPsNr1OS3Gaea0CrH7PKhArBMKBz5RX9sA5NtTg==", + "dev": true, + "dependencies": { + "@commitlint/types": "^19.0.3", + "chalk": "^5.3.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/format/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@commitlint/is-ignored": { + "version": "19.2.2", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-19.2.2.tgz", + "integrity": "sha512-eNX54oXMVxncORywF4ZPFtJoBm3Tvp111tg1xf4zWXGfhBPKpfKG6R+G3G4v5CPlRROXpAOpQ3HMhA9n1Tck1g==", + "dev": true, + "dependencies": { + "@commitlint/types": "^19.0.3", + "semver": "^7.6.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/is-ignored/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@commitlint/is-ignored/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@commitlint/is-ignored/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/@commitlint/lint": { + "version": "19.2.2", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-19.2.2.tgz", + "integrity": "sha512-xrzMmz4JqwGyKQKTpFzlN0dx0TAiT7Ran1fqEBgEmEj+PU98crOFtysJgY+QdeSagx6EDRigQIXJVnfrI0ratA==", + "dev": true, + "dependencies": { + "@commitlint/is-ignored": "^19.2.2", + "@commitlint/parse": "^19.0.3", + "@commitlint/rules": "^19.0.3", + "@commitlint/types": "^19.0.3" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/load": { + "version": "19.2.0", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-19.2.0.tgz", + "integrity": "sha512-XvxxLJTKqZojCxaBQ7u92qQLFMMZc4+p9qrIq/9kJDy8DOrEa7P1yx7Tjdc2u2JxIalqT4KOGraVgCE7eCYJyQ==", + "dev": true, + "dependencies": { + "@commitlint/config-validator": "^19.0.3", + "@commitlint/execute-rule": "^19.0.0", + "@commitlint/resolve-extends": "^19.1.0", + "@commitlint/types": "^19.0.3", + "chalk": "^5.3.0", + "cosmiconfig": "^9.0.0", + "cosmiconfig-typescript-loader": "^5.0.0", + "lodash.isplainobject": "^4.0.6", + "lodash.merge": "^4.6.2", + "lodash.uniq": "^4.5.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/load/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@commitlint/message": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-19.0.0.tgz", + "integrity": "sha512-c9czf6lU+9oF9gVVa2lmKaOARJvt4soRsVmbR7Njwp9FpbBgste5i7l/2l5o8MmbwGh4yE1snfnsy2qyA2r/Fw==", + "dev": true, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/parse": { + "version": "19.0.3", + "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-19.0.3.tgz", + "integrity": "sha512-Il+tNyOb8VDxN3P6XoBBwWJtKKGzHlitEuXA5BP6ir/3loWlsSqDr5aecl6hZcC/spjq4pHqNh0qPlfeWu38QA==", + "dev": true, + "dependencies": { + "@commitlint/types": "^19.0.3", + "conventional-changelog-angular": "^7.0.0", + "conventional-commits-parser": "^5.0.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/read": { + "version": "19.2.1", + "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-19.2.1.tgz", + "integrity": "sha512-qETc4+PL0EUv7Q36lJbPG+NJiBOGg7SSC7B5BsPWOmei+Dyif80ErfWQ0qXoW9oCh7GTpTNRoaVhiI8RbhuaNw==", + "dev": true, + "dependencies": { + "@commitlint/top-level": "^19.0.0", + "@commitlint/types": "^19.0.3", + "execa": "^8.0.1", + "git-raw-commits": "^4.0.0", + "minimist": "^1.2.8" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/read/node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/@commitlint/read/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/read/node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true, + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/@commitlint/read/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/read/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/read/node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/read/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/read/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/read/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@commitlint/read/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/resolve-extends": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-19.1.0.tgz", + "integrity": "sha512-z2riI+8G3CET5CPgXJPlzftH+RiWYLMYv4C9tSLdLXdr6pBNimSKukYP9MS27ejmscqCTVA4almdLh0ODD2KYg==", + "dev": true, + "dependencies": { + "@commitlint/config-validator": "^19.0.3", + "@commitlint/types": "^19.0.3", + "global-directory": "^4.0.1", + "import-meta-resolve": "^4.0.0", + "lodash.mergewith": "^4.6.2", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/rules": { + "version": "19.0.3", + "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-19.0.3.tgz", + "integrity": "sha512-TspKb9VB6svklxNCKKwxhELn7qhtY1rFF8ls58DcFd0F97XoG07xugPjjbVnLqmMkRjZDbDIwBKt9bddOfLaPw==", + "dev": true, + "dependencies": { + "@commitlint/ensure": "^19.0.3", + "@commitlint/message": "^19.0.0", + "@commitlint/to-lines": "^19.0.0", + "@commitlint/types": "^19.0.3", + "execa": "^8.0.1" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/rules/node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/@commitlint/rules/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/rules/node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true, + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/@commitlint/rules/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/rules/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/rules/node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/rules/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/rules/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/rules/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@commitlint/rules/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/to-lines": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-19.0.0.tgz", + "integrity": "sha512-vkxWo+VQU5wFhiP9Ub9Sre0FYe019JxFikrALVoD5UGa8/t3yOJEpEhxC5xKiENKKhUkTpEItMTRAjHw2SCpZw==", + "dev": true, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/top-level": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-19.0.0.tgz", + "integrity": "sha512-KKjShd6u1aMGNkCkaX4aG1jOGdn7f8ZI8TR1VEuNqUOjWTOdcDSsmglinglJ18JTjuBX5I1PtjrhQCRcixRVFQ==", + "dev": true, + "dependencies": { + "find-up": "^7.0.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/top-level/node_modules/find-up": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-7.0.0.tgz", + "integrity": "sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==", + "dev": true, + "dependencies": { + "locate-path": "^7.2.0", + "path-exists": "^5.0.0", + "unicorn-magic": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/top-level/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/top-level/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/top-level/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/top-level/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/@commitlint/top-level/node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/types": { + "version": "19.0.3", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-19.0.3.tgz", + "integrity": "sha512-tpyc+7i6bPG9mvaBbtKUeghfyZSDgWquIDfMgqYtTbmZ9Y9VzEm2je9EYcQ0aoz5o7NvGS+rcDec93yO08MHYA==", + "dev": true, + "dependencies": { + "@types/conventional-commits-parser": "^5.0.0", + "chalk": "^5.3.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/types/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@dabh/diagnostics": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", + "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", + "dependencies": { + "colorspace": "1.1.x", + "enabled": "2.0.x", + "kuler": "^2.0.0" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.2.0.tgz", + "integrity": "sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", + "dev": true + }, + "node_modules/@hutson/parse-repository-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-5.0.0.tgz", + "integrity": "sha512-e5+YUKENATs1JgYHMzTr2MW/NDcXGfYFAuOQU8gJgF/kEh4EqKgfGrfLI67bMD4tbhZVlkigz/9YYwWcbOFthg==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@iarna/toml": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", + "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==", + "dev": true + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.33.4", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.4.tgz", + "integrity": "sha512-p0suNqXufJs9t3RqLBO6vvrgr5OhgbWp76s5gTRvdmxmuv9E1rcaqGUsl3l4mKVmXPkTkTErXediAui4x+8PSA==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "glibc": ">=2.26", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.0.2" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.33.4", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.4.tgz", + "integrity": "sha512-0l7yRObwtTi82Z6ebVI2PnHT8EB2NxBgpK2MiKJZJ7cz32R4lxd001ecMhzzsZig3Yv9oclvqqdV93jo9hy+Dw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "glibc": ">=2.26", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.0.2" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.2.tgz", + "integrity": "sha512-tcK/41Rq8IKlSaKRCCAuuY3lDJjQnYIW1UXU1kxcEKrfL8WR7N6+rzNoOxoQRJWTAECuKwgAHnPvqXGN8XfkHA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "macos": ">=11", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.2.tgz", + "integrity": "sha512-Ofw+7oaWa0HiiMiKWqqaZbaYV3/UGL2wAPeLuJTx+9cXpCRdvQhCLG0IH8YGwM0yGWGLpsF4Su9vM1o6aer+Fw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "macos": ">=10.13", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.2.tgz", + "integrity": "sha512-iLWCvrKgeFoglQxdEwzu1eQV04o8YeYGFXtfWU26Zr2wWT3q3MTzC+QTCO3ZQfWd3doKHT4Pm2kRmLbupT+sZw==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.28", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.2.tgz", + "integrity": "sha512-x7kCt3N00ofFmmkkdshwj3vGPCnmiDh7Gwnd4nUwZln2YjqPxV1NlTyZOvoDWdKQVDL911487HOueBvrpflagw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.26", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.2.tgz", + "integrity": "sha512-cmhQ1J4qVhfmS6szYW7RT+gLJq9dH2i4maq+qyXayUSn9/3iY2ZeWpbAgSpSVbV2E1JUL2Gg7pwnYQ1h8rQIog==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.28", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.2.tgz", + "integrity": "sha512-E441q4Qdb+7yuyiADVi5J+44x8ctlrqn8XgkDTwr4qPJzWkaHwD489iZ4nGDgcuya4iMN3ULV6NwbhRZJ9Z7SQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.26", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.2.tgz", + "integrity": "sha512-3CAkndNpYUrlDqkCM5qhksfE+qSIREVpyoeHIU6jd48SJZViAmznoQQLAv4hVXF7xyUB9zf+G++e2v1ABjCbEQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "musl": ">=1.2.2", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.2.tgz", + "integrity": "sha512-VI94Q6khIHqHWNOh6LLdm9s2Ry4zdjWJwH56WoiJU7NTeDwyApdZZ8c+SADC8OH98KWNQXnE01UdJ9CSfZvwZw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "musl": ">=1.2.2", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.33.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.4.tgz", + "integrity": "sha512-RUgBD1c0+gCYZGCCe6mMdTiOFS0Zc/XrN0fYd6hISIKcDUbAW5NtSQW9g/powkrXYm6Vzwd6y+fqmExDuCdHNQ==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.28", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.0.2" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.33.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.4.tgz", + "integrity": "sha512-2800clwVg1ZQtxwSoTlHvtm9ObgAax7V6MTAB/hDT945Tfyy3hVkmiHpeLPCKYqYR1Gcmv1uDZ3a4OFwkdBL7Q==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.26", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.0.2" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.33.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.4.tgz", + "integrity": "sha512-h3RAL3siQoyzSoH36tUeS0PDmb5wINKGYzcLB5C6DIiAn2F3udeFAum+gj8IbA/82+8RGCTn7XW8WTFnqag4tQ==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.31", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.0.2" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.33.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.4.tgz", + "integrity": "sha512-GoR++s0XW9DGVi8SUGQ/U4AeIzLdNjHka6jidVwapQ/JebGVQIpi52OdyxCNVRE++n1FCLzjDovJNozif7w/Aw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.26", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.0.2" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.33.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.4.tgz", + "integrity": "sha512-nhr1yC3BlVrKDTl6cO12gTpXMl4ITBUZieehFvMntlCXFzH2bvKG76tBL2Y/OqhupZt81pR7R+Q5YhJxW0rGgQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "musl": ">=1.2.2", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.0.2" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.33.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.4.tgz", + "integrity": "sha512-uCPTku0zwqDmZEOi4ILyGdmW76tH7dm8kKlOIV1XC5cLyJ71ENAAqarOHQh0RLfpIpbV5KOpXzdU6XkJtS0daw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "musl": ">=1.2.2", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.0.2" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.33.4", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.4.tgz", + "integrity": "sha512-Bmmauh4sXUsUqkleQahpdNXKvo+wa1V9KhT2pDA4VJGKwnKMJXiSTGphn0gnJrlooda0QxCtXc6RX1XAU6hMnQ==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.1.1" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.33.4", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.4.tgz", + "integrity": "sha512-99SJ91XzUhYHbx7uhK3+9Lf7+LjwMGQZMDlO/E/YVJ7Nc3lyDFZPGhjwiYdctoH2BOzW9+TnfqcaMKt0jHLdqw==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.33.4", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.4.tgz", + "integrity": "sha512-3QLocdTRVIrFNye5YocZl+KKpYKP+fksi1QhmOArgx7GyhIbQp/WrJRu176jm8IxromS7RIkzMiMINVdBtC8Aw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@inquirer/figures": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.3.tgz", + "integrity": "sha512-ErXXzENMH5pJt5/ssXV0DfWUZqly8nGzf0UcBV9xTnP+KyffE2mqyxIMBrZ8ijQck2nU0TQm40EQB53YreyWHw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@ljharb/through": { + "version": "2.3.13", + "resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.13.tgz", + "integrity": "sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { + "version": "5.1.1-v1", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", + "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", + "dev": true, + "dependencies": { + "eslint-scope": "5.1.1" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@octokit/auth-token": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz", + "integrity": "sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==", + "dev": true, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/core": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.1.0.tgz", + "integrity": "sha512-BDa2VAMLSh3otEiaMJ/3Y36GU4qf6GI+VivQ/P41NC6GHcdxpKlqV0ikSZ5gdQsmS3ojXeRx5vasgNTinF0Q4g==", + "dev": true, + "dependencies": { + "@octokit/auth-token": "^4.0.0", + "@octokit/graphql": "^7.0.0", + "@octokit/request": "^8.0.2", + "@octokit/request-error": "^5.0.0", + "@octokit/types": "^12.0.0", + "before-after-hook": "^2.2.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/endpoint": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.4.tgz", + "integrity": "sha512-DWPLtr1Kz3tv8L0UvXTDP1fNwM0S+z6EJpRcvH66orY6Eld4XBMCSYsaWp4xIm61jTWxK68BrR7ibO+vSDnZqw==", + "dev": true, + "dependencies": { + "@octokit/types": "^12.0.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/graphql": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.0.2.tgz", + "integrity": "sha512-OJ2iGMtj5Tg3s6RaXH22cJcxXRi7Y3EBqbHTBRq+PQAqfaS8f/236fUrWhfSn8P4jovyzqucxme7/vWSSZBX2Q==", + "dev": true, + "dependencies": { + "@octokit/request": "^8.0.1", + "@octokit/types": "^12.0.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/openapi-types": { + "version": "20.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-20.0.0.tgz", + "integrity": "sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==", + "dev": true + }, + "node_modules/@octokit/plugin-paginate-rest": { + "version": "11.3.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.3.1.tgz", + "integrity": "sha512-ryqobs26cLtM1kQxqeZui4v8FeznirUsksiA+RYemMPJ7Micju0WSkv50dBksTuZks9O5cg4wp+t8fZ/cLY56g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/types": "^13.5.0" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": "5" + } + }, + "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/openapi-types": { + "version": "22.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-22.2.0.tgz", + "integrity": "sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/types": { + "version": "13.5.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.5.0.tgz", + "integrity": "sha512-HdqWTf5Z3qwDVlzCrP8UJquMwunpDiMPt5er+QjGzL4hqr/vBVY/MauQgS1xWxCDT1oMx1EULyqxncdCY/NVSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^22.2.0" + } + }, + "node_modules/@octokit/plugin-request-log": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-4.0.0.tgz", + "integrity": "sha512-2uJI1COtYCq8Z4yNSnM231TgH50bRkheQ9+aH8TnZanB6QilOnx8RMD2qsnamSOXtDj0ilxvevf5fGsBhBBzKA==", + "dev": true, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": ">=5" + } + }, + "node_modules/@octokit/plugin-rest-endpoint-methods": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.2.2.tgz", + "integrity": "sha512-EI7kXWidkt3Xlok5uN43suK99VWqc8OaIMktY9d9+RNKl69juoTyxmLoWPIZgJYzi41qj/9zU7G/ljnNOJ5AFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/types": "^13.5.0" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": "^5" + } + }, + "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/openapi-types": { + "version": "22.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-22.2.0.tgz", + "integrity": "sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/types": { + "version": "13.5.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.5.0.tgz", + "integrity": "sha512-HdqWTf5Z3qwDVlzCrP8UJquMwunpDiMPt5er+QjGzL4hqr/vBVY/MauQgS1xWxCDT1oMx1EULyqxncdCY/NVSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^22.2.0" + } + }, + "node_modules/@octokit/request": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.2.0.tgz", + "integrity": "sha512-exPif6x5uwLqv1N1irkLG1zZNJkOtj8bZxuVHd71U5Ftuxf2wGNvAJyNBcPbPC+EBzwYEbBDdSFb8EPcjpYxPQ==", + "dev": true, + "dependencies": { + "@octokit/endpoint": "^9.0.0", + "@octokit/request-error": "^5.0.0", + "@octokit/types": "^12.0.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/request-error": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.0.1.tgz", + "integrity": "sha512-X7pnyTMV7MgtGmiXBwmO6M5kIPrntOXdyKZLigNfQWSEQzVxR4a4vo49vJjTWX70mPndj8KhfT4Dx+2Ng3vnBQ==", + "dev": true, + "dependencies": { + "@octokit/types": "^12.0.0", + "deprecation": "^2.0.0", + "once": "^1.4.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/rest": { + "version": "20.1.1", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-20.1.1.tgz", + "integrity": "sha512-MB4AYDsM5jhIHro/dq4ix1iWTLGToIGk6cWF5L6vanFaMble5jTX/UBQyiv05HsWnwUtY8JrfHy2LWfKwihqMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/core": "^5.0.2", + "@octokit/plugin-paginate-rest": "11.3.1", + "@octokit/plugin-request-log": "^4.0.0", + "@octokit/plugin-rest-endpoint-methods": "13.2.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/types": { + "version": "12.6.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.6.0.tgz", + "integrity": "sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==", + "dev": true, + "dependencies": { + "@octokit/openapi-types": "^20.0.0" + } + }, + "node_modules/@pnpm/config.env-replace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", + "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", + "dev": true, + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", + "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", + "dev": true, + "dependencies": { + "graceful-fs": "4.2.10" + }, + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "node_modules/@pnpm/npm-conf": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz", + "integrity": "sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==", + "dev": true, + "dependencies": { + "@pnpm/config.env-replace": "^1.1.0", + "@pnpm/network.ca-file": "^1.0.1", + "config-chain": "^1.1.11" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@puppeteer/browsers": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.2.3.tgz", + "integrity": "sha512-bJ0UBsk0ESOs6RFcLXOt99a3yTDcOKlzfjad+rhFwdaG1Lu/Wzq58GHYCDTlZ9z6mldf4g+NTb+TXEfe0PpnsQ==", + "dependencies": { + "debug": "4.3.4", + "extract-zip": "2.0.1", + "progress": "2.0.3", + "proxy-agent": "6.4.0", + "semver": "7.6.0", + "tar-fs": "3.0.5", + "unbzip2-stream": "1.4.3", + "yargs": "17.7.2" + }, + "bin": { + "browsers": "lib/cjs/main-cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@puppeteer/browsers/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@puppeteer/browsers/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@puppeteer/browsers/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@sindresorhus/merge-streams": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", + "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dependencies": { + "defer-to-connect": "^1.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@tokenizer/token": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==" + }, + "node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==" + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "node_modules/@types/atob": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@types/atob/-/atob-2.1.4.tgz", + "integrity": "sha512-FisOhG87cCFqzCgq6FUtSYsTMOHCB/p28zJbSN1QBo4ZGJfg9PEhMjdIV++NDeOnloUUe0Gz6jwBV+L1Ac00Mw==", + "dev": true + }, + "node_modules/@types/conventional-commits-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz", + "integrity": "sha512-loB369iXNmAZglwWATL+WRe+CRMmmBPtpolYzIebFaX4YA3x+BEfLqhUAV9WanycKI3TG1IMr5bMJDajDKLlUQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/eslint": { + "version": "8.56.3", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.3.tgz", + "integrity": "sha512-PvSf1wfv2wJpVIFUMSb+i4PvqNYkB9Rkp9ZDO3oaWzq4SKhsQk4mrMBr3ZH06I0hKrVGLBacmgl8JM4WVjb9dg==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "node_modules/@types/mime-types": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@types/mime-types/-/mime-types-2.1.4.tgz", + "integrity": "sha512-lfU4b34HOri+kAY5UheuFMWPDOI+OPceBSHZKp69gEyTL/mmJ4cnU6Y/rlme3UL3GyOn6Y42hyIEw0/q8sWx5w==", + "dev": true + }, + "node_modules/@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "dev": true + }, + "node_modules/@types/mocha": { + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.6.tgz", + "integrity": "sha512-dJvrYWxP/UcXm36Qn36fxhUKu8A/xMRXVT2cliFF1Z7UA9liG5Psj3ezNSZw+5puH2czDXRLcXQxf8JbJt0ejg==", + "dev": true + }, + "node_modules/@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" + }, + "node_modules/@types/node": { + "version": "18.19.34", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.34.tgz", + "integrity": "sha512-eXF4pfBNV5DAMKGbI02NnDtWrQ40hAN558/2vvS4gMpMIxaf6JmD7YjnZbq0Q9TDSSkKBamime8ewRoomHdt4g==", + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", + "dev": true + }, + "node_modules/@types/rimraf": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/rimraf/-/rimraf-4.0.5.tgz", + "integrity": "sha512-DTCZoIQotB2SUJnYgrEx43cQIUYOlNZz0AZPbKU4PSLYTUdML5Gox0++z4F9kQocxStrCmRNhi4x5x/UlwtKUA==", + "deprecated": "This is a stub types definition. rimraf provides its own type definitions, so you do not need this installed.", + "dev": true, + "dependencies": { + "rimraf": "*" + } + }, + "node_modules/@types/semver": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", + "dev": true + }, + "node_modules/@types/sharp": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/@types/sharp/-/sharp-0.32.0.tgz", + "integrity": "sha512-OOi3kL+FZDnPhVzsfD37J88FNeZh6gQsGcLc95NbeURRGvmSjeXiDcyWzF2o3yh/gQAUn2uhh/e+CPCa5nwAxw==", + "deprecated": "This is a stub types definition. sharp provides its own type definitions, so you do not need this installed.", + "dev": true, + "dependencies": { + "sharp": "*" + } + }, + "node_modules/@types/shelljs": { + "version": "0.8.15", + "resolved": "https://registry.npmjs.org/@types/shelljs/-/shelljs-0.8.15.tgz", + "integrity": "sha512-vzmnCHl6hViPu9GNLQJ+DZFd6BQI2DBTUeOvYHqkWQLMfKAAQYMb/xAmZkTogZI/vqXHCWkqDRymDI5p0QTi5Q==", + "dev": true, + "dependencies": { + "@types/glob": "~7.2.0", + "@types/node": "*" + } + }, + "node_modules/@types/shelljs/node_modules/@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/tmp": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/@types/tmp/-/tmp-0.2.6.tgz", + "integrity": "sha512-chhaNf2oKHlRkDGt+tiKE2Z5aJ6qalm7Z9rlLdBwmOiAAf09YQvvoLXjWK4HWPF1xU/fqvMgfNfpVoBscA/tKA==", + "dev": true + }, + "node_modules/@types/triple-beam": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", + "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==" + }, + "node_modules/@types/ws": { + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", + "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.12.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", + "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", + "dev": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", + "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", + "dev": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", + "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", + "dev": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@wppconnect/wa-js": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@wppconnect/wa-js/-/wa-js-3.3.1.tgz", + "integrity": "sha512-mwMdb7WRdiPWTQLWIo0XruPYbknBRXkN661uUzaIe4c+mEr02J/3nIchgAl0OfYdP+cZwGl3gmBlGLgqsePdwA==", + "license": "Apache-2.0", + "engines": { + "whatsapp-web": ">=2.2326.10-beta" + } + }, + "node_modules/@wppconnect/wa-version": { + "version": "1.4.213", + "resolved": "https://registry.npmjs.org/@wppconnect/wa-version/-/wa-version-1.4.213.tgz", + "integrity": "sha512-ph1z68Ijk0bCE920JZ7jf5+ICwHBJl/D+RFjvSnCMCb3WgsCUwIxuNBo8Dnjkx2hw+jAlBfd585yqQIjpT5/RQ==", + "license": "Apache-2.0", + "dependencies": { + "node-fetch": "^2.7.0", + "semver": "^7.5.4" + } + }, + "node_modules/@wppconnect/wa-version/node_modules/semver": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "dev": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/add-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", + "integrity": "sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==", + "dev": true + }, + "node_modules/agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-sequence-parser": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz", + "integrity": "sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==", + "dev": true + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", + "dev": true + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.map": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/array.prototype.map/-/array.prototype.map-1.0.6.tgz", + "integrity": "sha512-nK1psgF2cXqP3wSyCSq0Hc7zwNq3sfljQqaG27r/7a7ooNUnn5nGq6yYWyks9jMO5EoFQ0ax80hSg6oXSRNXaw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" + }, + "node_modules/async-retry": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", + "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", + "dev": true, + "dependencies": { + "retry": "0.13.1" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axios": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", + "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/b4a": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.6.tgz", + "integrity": "sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==" + }, + "node_modules/babel-loader": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", + "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", + "dev": true, + "dependencies": { + "find-cache-dir": "^4.0.0", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.10.tgz", + "integrity": "sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.1", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz", + "integrity": "sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.1", + "core-js-compat": "^3.36.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.1.tgz", + "integrity": "sha512-JfTApdE++cgcTWjsiCQlLyFBMbTUft9ja17saCc93lgV33h4tuCVj7tlvu//qpLwaG+3yEz7/KhahGrUMkVq9g==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/bare-events": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.2.0.tgz", + "integrity": "sha512-Yyyqff4PIFfSuthCZqLlPISTWHmnQxoPuAvkmgzsJEmG3CesdIv6Xweayl0JkCZJSB2yYIdJyEz97tpxNhgjbg==", + "optional": true + }, + "node_modules/bare-fs": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.2.0.tgz", + "integrity": "sha512-+VhW202E9eTVGkX7p+TNXtZC4RTzj9JfJW7PtfIbZ7mIQ/QT9uOafQTx7lx2n9ERmWsXvLHF4hStAFn4gl2mQw==", + "optional": true, + "dependencies": { + "bare-events": "^2.0.0", + "bare-os": "^2.0.0", + "bare-path": "^2.0.0", + "streamx": "^2.13.0" + } + }, + "node_modules/bare-os": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.2.0.tgz", + "integrity": "sha512-hD0rOPfYWOMpVirTACt4/nK8mC55La12K5fY1ij8HAdfQakD62M+H4o4tpfKzVGLgRDTuk3vjA4GqGXXCeFbag==", + "optional": true + }, + "node_modules/bare-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.0.tgz", + "integrity": "sha512-DIIg7ts8bdRKwJRJrUMy/PICEaQZaPGZ26lsSx9MJSwIhSrcdHn7/C8W+XmnG/rKi6BaRcz+JO00CjZteybDtw==", + "optional": true, + "dependencies": { + "bare-os": "^2.1.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/basic-ftp": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.4.tgz", + "integrity": "sha512-8PzkB0arJFV4jJWSGOYR+OEic6aeKMu/osRhBULN6RY0ykby6LKhbmuQ5ublvaas5BOwboah5D87nrHyuh8PPA==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/before-after-hook": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", + "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/boxen": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", + "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", + "dependencies": { + "ansi-align": "^3.0.0", + "camelcase": "^6.2.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.1", + "string-width": "^4.2.2", + "type-fest": "^0.20.2", + "widest-line": "^3.1.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "node_modules/browserslist": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "dev": true, + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cacheable-lookup": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", + "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", + "dev": true, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cacheable-request/node_modules/json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==" + }, + "node_modules/cacheable-request/node_modules/keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dependencies": { + "json-buffer": "3.0.0" + } + }, + "node_modules/cacheable-request/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/cachedir": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz", + "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001589", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001589.tgz", + "integrity": "sha512-vNQWS6kI+q6sBlHbh71IIeC+sRwK2N3EDySc/updIGhIee2x5z00J4c1242/5/d6EpEMdOnk/m+6tuk4/tcsqg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/catch-exit": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/catch-exit/-/catch-exit-1.2.2.tgz", + "integrity": "sha512-7rZ3CgzR3L3fDcEjtxj0bV6/zEhf9P7jkjm7ucMSTqBVhvCrwp+/Dbq26AqC+O0HxpIqY+pz9O+xKlvGqUBDmg==", + "dependencies": { + "human-signals": "2.1.0" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chrome-launcher": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.2.tgz", + "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==", + "dependencies": { + "@types/node": "*", + "escape-string-regexp": "^4.0.0", + "is-wsl": "^2.2.0", + "lighthouse-logger": "^1.0.0" + }, + "bin": { + "print-chrome-path": "bin/print-chrome-path.js" + }, + "engines": { + "node": ">=12.13.0" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/chromium-bidi": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.5.19.tgz", + "integrity": "sha512-UA6zL77b7RYCjJkZBsZ0wlvCTD+jTjllZ8f6wdO4buevXgTZYjV+XLB9CiEa2OuuTGGTLnI7eN9I60YxuALGQg==", + "dependencies": { + "mitt": "3.0.1", + "urlpattern-polyfill": "10.0.0", + "zod": "3.22.4" + }, + "peerDependencies": { + "devtools-protocol": "*" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-deep": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz", + "integrity": "sha512-we+NuQo2DHhSl+DP6jlUiAhyAjBQrYnpOk15rN6c6JSPScjiCLh8IbSU+VTcph6YS3o7mASE8a0+gbZ7ChLpgg==", + "dependencies": { + "for-own": "^0.1.3", + "is-plain-object": "^2.0.1", + "kind-of": "^3.0.2", + "lazy-cache": "^1.0.3", + "shallow-clone": "^0.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "node_modules/colorspace": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", + "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", + "dependencies": { + "color": "^3.1.3", + "text-hex": "1.0.x" + } + }, + "node_modules/colorspace/node_modules/color": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "dependencies": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + } + }, + "node_modules/colorspace/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/colorspace/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/commitizen": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/commitizen/-/commitizen-4.3.0.tgz", + "integrity": "sha512-H0iNtClNEhT0fotHvGV3E9tDejDeS04sN1veIebsKYGMuGscFaswRoYJKmT3eW85eIJAs0F28bG2+a/9wCOfPw==", + "dev": true, + "dependencies": { + "cachedir": "2.3.0", + "cz-conventional-changelog": "3.3.0", + "dedent": "0.7.0", + "detect-indent": "6.1.0", + "find-node-modules": "^2.1.2", + "find-root": "1.1.0", + "fs-extra": "9.1.0", + "glob": "7.2.3", + "inquirer": "8.2.5", + "is-utf8": "^0.2.1", + "lodash": "4.17.21", + "minimist": "1.2.7", + "strip-bom": "4.0.0", + "strip-json-comments": "3.1.1" + }, + "bin": { + "commitizen": "bin/commitizen", + "cz": "bin/git-cz", + "git-cz": "bin/git-cz" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/commitizen/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/commitizen/node_modules/minimist": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", + "dev": true + }, + "node_modules/compare-func": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", + "dev": true, + "dependencies": { + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/concurrently": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz", + "integrity": "sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.2", + "date-fns": "^2.30.0", + "lodash": "^4.17.21", + "rxjs": "^7.8.1", + "shell-quote": "^1.8.1", + "spawn-command": "0.0.2", + "supports-color": "^8.1.1", + "tree-kill": "^1.2.2", + "yargs": "^17.7.2" + }, + "bin": { + "conc": "dist/bin/concurrently.js", + "concurrently": "dist/bin/concurrently.js" + }, + "engines": { + "node": "^14.13.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" + } + }, + "node_modules/concurrently/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "dev": true, + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/configstore": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", + "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", + "dev": true, + "dependencies": { + "dot-prop": "^6.0.1", + "graceful-fs": "^4.2.6", + "unique-string": "^3.0.0", + "write-file-atomic": "^3.0.3", + "xdg-basedir": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/yeoman/configstore?sponsor=1" + } + }, + "node_modules/configstore/node_modules/dot-prop": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", + "dev": true, + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/conventional-changelog": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-5.1.0.tgz", + "integrity": "sha512-aWyE/P39wGYRPllcCEZDxTVEmhyLzTc9XA6z6rVfkuCD2UBnhV/sgSOKbQrEG5z9mEZJjnopjgQooTKxEg8mAg==", + "dev": true, + "dependencies": { + "conventional-changelog-angular": "^7.0.0", + "conventional-changelog-atom": "^4.0.0", + "conventional-changelog-codemirror": "^4.0.0", + "conventional-changelog-conventionalcommits": "^7.0.2", + "conventional-changelog-core": "^7.0.0", + "conventional-changelog-ember": "^4.0.0", + "conventional-changelog-eslint": "^5.0.0", + "conventional-changelog-express": "^4.0.0", + "conventional-changelog-jquery": "^5.0.0", + "conventional-changelog-jshint": "^4.0.0", + "conventional-changelog-preset-loader": "^4.1.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/conventional-changelog-angular": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz", + "integrity": "sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==", + "dev": true, + "dependencies": { + "compare-func": "^2.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/conventional-changelog-atom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-4.0.0.tgz", + "integrity": "sha512-q2YtiN7rnT1TGwPTwjjBSIPIzDJCRE+XAUahWxnh+buKK99Kks4WLMHoexw38GXx9OUxAsrp44f9qXe5VEMYhw==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/conventional-changelog-cli": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-cli/-/conventional-changelog-cli-4.1.0.tgz", + "integrity": "sha512-MscvILWZ6nWOoC+p/3Nn3D2cVLkjeQjyZPUr0bQ+vUORE/SPrkClJh8BOoMNpS4yk+zFJ5LlgXACxH6XGQoRXA==", + "dev": true, + "dependencies": { + "add-stream": "^1.0.0", + "conventional-changelog": "^5.1.0", + "meow": "^12.0.1", + "tempfile": "^5.0.0" + }, + "bin": { + "conventional-changelog": "cli.mjs" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/conventional-changelog-codemirror": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-4.0.0.tgz", + "integrity": "sha512-hQSojc/5imn1GJK3A75m9hEZZhc3urojA5gMpnar4JHmgLnuM3CUIARPpEk86glEKr3c54Po3WV/vCaO/U8g3Q==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/conventional-changelog-conventionalcommits": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-7.0.2.tgz", + "integrity": "sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==", + "dev": true, + "dependencies": { + "compare-func": "^2.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/conventional-changelog-core": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-7.0.0.tgz", + "integrity": "sha512-UYgaB1F/COt7VFjlYKVE/9tTzfU3VUq47r6iWf6lM5T7TlOxr0thI63ojQueRLIpVbrtHK4Ffw+yQGduw2Bhdg==", + "dev": true, + "dependencies": { + "@hutson/parse-repository-url": "^5.0.0", + "add-stream": "^1.0.0", + "conventional-changelog-writer": "^7.0.0", + "conventional-commits-parser": "^5.0.0", + "git-raw-commits": "^4.0.0", + "git-semver-tags": "^7.0.0", + "hosted-git-info": "^7.0.0", + "normalize-package-data": "^6.0.0", + "read-pkg": "^8.0.0", + "read-pkg-up": "^10.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/conventional-changelog-ember": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-4.0.0.tgz", + "integrity": "sha512-D0IMhwcJUg1Y8FSry6XAplEJcljkHVlvAZddhhsdbL1rbsqRsMfGx/PIkPYq0ru5aDgn+OxhQ5N5yR7P9mfsvA==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/conventional-changelog-eslint": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-5.0.0.tgz", + "integrity": "sha512-6JtLWqAQIeJLn/OzUlYmzd9fKeNSWmQVim9kql+v4GrZwLx807kAJl3IJVc3jTYfVKWLxhC3BGUxYiuVEcVjgA==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/conventional-changelog-express": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-4.0.0.tgz", + "integrity": "sha512-yWyy5c7raP9v7aTvPAWzqrztACNO9+FEI1FSYh7UP7YT1AkWgv5UspUeB5v3Ibv4/o60zj2o9GF2tqKQ99lIsw==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/conventional-changelog-jquery": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-5.0.0.tgz", + "integrity": "sha512-slLjlXLRNa/icMI3+uGLQbtrgEny3RgITeCxevJB+p05ExiTgHACP5p3XiMKzjBn80n+Rzr83XMYfRInEtCPPw==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/conventional-changelog-jshint": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-4.0.0.tgz", + "integrity": "sha512-LyXq1bbl0yG0Ai1SbLxIk8ZxUOe3AjnlwE6sVRQmMgetBk+4gY9EO3d00zlEt8Y8gwsITytDnPORl8al7InTjg==", + "dev": true, + "dependencies": { + "compare-func": "^2.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/conventional-changelog-preset-loader": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-4.1.0.tgz", + "integrity": "sha512-HozQjJicZTuRhCRTq4rZbefaiCzRM2pr6u2NL3XhrmQm4RMnDXfESU6JKu/pnKwx5xtdkYfNCsbhN5exhiKGJA==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/conventional-changelog-writer": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-7.0.1.tgz", + "integrity": "sha512-Uo+R9neH3r/foIvQ0MKcsXkX642hdm9odUp7TqgFS7BsalTcjzRlIfWZrZR1gbxOozKucaKt5KAbjW8J8xRSmA==", + "dev": true, + "dependencies": { + "conventional-commits-filter": "^4.0.0", + "handlebars": "^4.7.7", + "json-stringify-safe": "^5.0.1", + "meow": "^12.0.1", + "semver": "^7.5.2", + "split2": "^4.0.0" + }, + "bin": { + "conventional-changelog-writer": "cli.mjs" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/conventional-changelog-writer/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-writer/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-writer/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/conventional-commit-types": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/conventional-commit-types/-/conventional-commit-types-3.0.0.tgz", + "integrity": "sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==", + "dev": true + }, + "node_modules/conventional-commits-filter": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-4.0.0.tgz", + "integrity": "sha512-rnpnibcSOdFcdclpFwWa+pPlZJhXE7l+XK04zxhbWrhgpR96h33QLz8hITTXbcYICxVr3HZFtbtUAQ+4LdBo9A==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/conventional-commits-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz", + "integrity": "sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==", + "dev": true, + "dependencies": { + "is-text-path": "^2.0.0", + "JSONStream": "^1.3.5", + "meow": "^12.0.1", + "split2": "^4.0.0" + }, + "bin": { + "conventional-commits-parser": "cli.mjs" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/core-js-compat": { + "version": "3.36.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.1.tgz", + "integrity": "sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==", + "dev": true, + "dependencies": { + "browserslist": "^4.23.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cosmiconfig-typescript-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-5.0.0.tgz", + "integrity": "sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==", + "dev": true, + "dependencies": { + "jiti": "^1.19.1" + }, + "engines": { + "node": ">=v16" + }, + "peerDependencies": { + "@types/node": "*", + "cosmiconfig": ">=8.2", + "typescript": ">=4" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-random-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", + "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", + "dev": true, + "dependencies": { + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/crypto-random-string/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cz-conventional-changelog": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/cz-conventional-changelog/-/cz-conventional-changelog-3.3.0.tgz", + "integrity": "sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.1", + "commitizen": "^4.0.3", + "conventional-commit-types": "^3.0.0", + "lodash.map": "^4.5.1", + "longest": "^2.0.1", + "word-wrap": "^1.0.3" + }, + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@commitlint/load": ">6.1.1" + } + }, + "node_modules/cz-conventional-changelog/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cz-conventional-changelog/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cz-conventional-changelog/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/cz-conventional-changelog/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/cz-conventional-changelog/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/cz-conventional-changelog/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/cz-conventional-changelog/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/dargs": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-8.1.0.tgz", + "integrity": "sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/data-uri-to-buffer": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", + "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/date-fns": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.21.0" + }, + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "dev": true + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", + "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", + "dev": true, + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", + "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "dependencies": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/deprecation": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", + "dev": true + }, + "node_modules/detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/devtools-protocol": { + "version": "0.0.1286932", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1286932.tgz", + "integrity": "sha512-wu58HMQll9voDjR4NlPyoDEw1syfzaBNHymMMZ/QOXiHRNluOnDgu9hp1yHOKYoMlxCh4lSSiugLITe6Fvu1eA==", + "license": "BSD-3-Clause" + }, + "node_modules/diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/duplexer3": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", + "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.4.681", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.681.tgz", + "integrity": "sha512-1PpuqJUFWoXZ1E54m8bsLPVYwIVCRzvaL+n5cjigGga4z854abDnFRc+cTa2th4S79kyGqya/1xoR7h+Y5G5lg==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/enabled": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz", + "integrity": "sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/envinfo": { + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.1.tgz", + "integrity": "sha512-8PiZgZNIB4q/Lw4AhOvAfB/ityHAd2bli3lESSWmWSzSsl5dKpy5N1d1Rfkd2teq/g9xN90lc6o98DOjMeYHpg==", + "dev": true, + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.4.tgz", + "integrity": "sha512-vZYJlk2u6qHYxBOTjAeg7qUxHdNfih64Uu2J8QqWgXZ2cri0ZpJAkzDUK/q593+mvKwlxyaxr6F1Q+3LKoQRgg==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.6", + "call-bind": "^1.0.7", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.2", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.1", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.0", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.1", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "dev": true + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-module-lexer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", + "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", + "dev": true + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-goat": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", + "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-header": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-header/-/eslint-plugin-header-3.1.1.tgz", + "integrity": "sha512-9vlKxuJ4qf793CmeeSrZUvVClw6amtpghq3CuWcB5cUNnWHQhgcqy5eF8oVKFk1G3Y/CbchGfEaw3wiIJaNmVg==", + "dev": true, + "peerDependencies": { + "eslint": ">=7.7.0" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", + "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "eslint": ">=7.28.0", + "prettier": ">=2.0.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-rule-composer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz", + "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "dev": true, + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/external-editor/node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/extract-zip/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/fecha": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" + }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-type": { + "version": "16.5.4", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.5.4.tgz", + "integrity": "sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==", + "dependencies": { + "readable-web-to-node-stream": "^3.0.0", + "strtok3": "^6.2.4", + "token-types": "^4.1.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/file-type?sponsor=1" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", + "dev": true, + "dependencies": { + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-node-modules": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/find-node-modules/-/find-node-modules-2.1.3.tgz", + "integrity": "sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg==", + "dev": true, + "dependencies": { + "findup-sync": "^4.0.0", + "merge": "^2.1.1" + } + }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "dev": true + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/findup-sync": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz", + "integrity": "sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==", + "dev": true, + "dependencies": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^4.0.2", + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true + }, + "node_modules/fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" + }, + "node_modules/follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha512-SKmowqGTJoPzLO1T0BBJpkfp3EMacCMOuH40hOUbrbzElVktk4DioXVM99QkLCyKoiuOmyjgcWMpVz2xjE7LZw==", + "dependencies": { + "for-in": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/form-data-encoder": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", + "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", + "dev": true, + "engines": { + "node": ">= 14.17" + } + }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dev": true, + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/futoin-hkdf": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/futoin-hkdf/-/futoin-hkdf-1.5.3.tgz", + "integrity": "sha512-SewY5KdMpaoCeh7jachEWFsh1nNlaDjNHZXWqL5IGwtpEYHTgkr2+AMCgNwKWkcc0wpSYrZfR7he4WdmHFtDxQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", + "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-uri": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.3.tgz", + "integrity": "sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==", + "dependencies": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4", + "fs-extra": "^11.2.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/git-raw-commits": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-4.0.0.tgz", + "integrity": "sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==", + "dev": true, + "dependencies": { + "dargs": "^8.0.0", + "meow": "^12.0.1", + "split2": "^4.0.0" + }, + "bin": { + "git-raw-commits": "cli.mjs" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/git-semver-tags": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-7.0.1.tgz", + "integrity": "sha512-NY0ZHjJzyyNXHTDZmj+GG7PyuAKtMsyWSwh07CR2hOZFa+/yoTsXci/nF2obzL8UDhakFNkD9gNdt/Ed+cxh2Q==", + "dev": true, + "dependencies": { + "meow": "^12.0.1", + "semver": "^7.5.2" + }, + "bin": { + "git-semver-tags": "cli.mjs" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/git-semver-tags/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/git-semver-tags/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/git-semver-tags/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/git-up": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz", + "integrity": "sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==", + "dev": true, + "dependencies": { + "is-ssh": "^1.4.0", + "parse-url": "^8.1.0" + } + }, + "node_modules/git-url-parse": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-14.0.0.tgz", + "integrity": "sha512-NnLweV+2A4nCvn4U/m2AoYu0pPKlsmhK9cknG7IMwsjFY1S2jxM+mAhsDxyxfCIGfGaD+dozsyX4b6vkYc83yQ==", + "dev": true, + "dependencies": { + "git-up": "^7.0.0" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "node_modules/global-directory": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz", + "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==", + "dev": true, + "dependencies": { + "ini": "4.1.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/global-directory/node_modules/ini": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", + "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "dependencies": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dependencies": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/got/node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", + "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "dependencies": { + "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hosted-git-info": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.1.tgz", + "integrity": "sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/http2-wrapper": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", + "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", + "dev": true, + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/http2-wrapper/node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", + "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/husky": { + "version": "9.0.11", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.0.11.tgz", + "integrity": "sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw==", + "dev": true, + "bin": { + "husky": "bin.mjs" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-meta-resolve": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.0.0.tgz", + "integrity": "sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/inquirer": { + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.5.tgz", + "integrity": "sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.5.5", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "dev": true, + "dependencies": { + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-in-ci": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-in-ci/-/is-in-ci-0.1.0.tgz", + "integrity": "sha512-d9PXLEY0v1iJ64xLiQMJ51J128EYHAaOR4yZqQi8aHGfw6KgifM3/Viw1oZZ1GCVmb3gBuyhLyHj0HgR2DhSXQ==", + "dev": true, + "bin": { + "is-in-ci": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container/node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "dev": true, + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-installed-globally/node_modules/global-dirs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "dev": true, + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-installed-globally/node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-npm": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.0.0.tgz", + "integrity": "sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-ssh": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.0.tgz", + "integrity": "sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==", + "dev": true, + "dependencies": { + "protocols": "^2.0.1" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-text-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-2.0.0.tgz", + "integrity": "sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==", + "dev": true, + "dependencies": { + "text-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", + "dev": true + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/issue-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-7.0.0.tgz", + "integrity": "sha512-jgAw78HO3gs9UrKqJNQvfDj9Ouy8Mhu40fbEJ8yXff4MW8+/Fcn9iFjyWUQ6SKbX8ipPk3X5A3AyfYHRu6uVLw==", + "dev": true, + "dependencies": { + "lodash.capitalize": "^4.2.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.uniqby": "^4.7.0" + }, + "engines": { + "node": "^18.17 || >=20.6.1" + } + }, + "node_modules/iterate-iterator": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/iterate-iterator/-/iterate-iterator-1.0.2.tgz", + "integrity": "sha512-t91HubM4ZDQ70M9wqp+pcNpu8OyJ9UAtXntT/Bcsvp5tZMnz9vRa+IunKXeI8AnfZMTv0jNuVEmGeLSMjVvfPw==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/iterate-value": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/iterate-value/-/iterate-value-1.0.2.tgz", + "integrity": "sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==", + "dev": true, + "dependencies": { + "es-get-iterator": "^1.0.2", + "iterate-iterator": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jiti": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==" + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", + "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", + "dev": true + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true, + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "dependencies": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "bin.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kuler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" + }, + "node_modules/latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "dependencies": { + "package-json": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lighthouse-logger": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz", + "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", + "dependencies": { + "debug": "^2.6.9", + "marky": "^1.2.2" + } + }, + "node_modules/lighthouse-logger/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/lighthouse-logger/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "dev": true + }, + "node_modules/lodash.capitalize": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", + "integrity": "sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==", + "dev": true + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true + }, + "node_modules/lodash.escaperegexp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==", + "dev": true + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "dev": true + }, + "node_modules/lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==", + "dev": true + }, + "node_modules/lodash.map": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", + "integrity": "sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.mergewith": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", + "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", + "dev": true + }, + "node_modules/lodash.snakecase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", + "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==", + "dev": true + }, + "node_modules/lodash.startcase": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", + "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", + "dev": true + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "dev": true + }, + "node_modules/lodash.uniqby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", + "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==", + "dev": true + }, + "node_modules/lodash.upperfirst": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz", + "integrity": "sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/logform": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.6.0.tgz", + "integrity": "sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ==", + "dependencies": { + "@colors/colors": "1.6.0", + "@types/triple-beam": "^1.3.2", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/longest": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-2.0.1.tgz", + "integrity": "sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lookpath": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/lookpath/-/lookpath-1.2.2.tgz", + "integrity": "sha512-k2Gmn8iV6qdME3ztZC2spubmQISimFOPLuQKiPaLcVdRz0IpdxrNClVepMlyTJlhodm/zG/VfbkWERm3kUIh+Q==", + "bin": { + "lookpath": "bin/lookpath.js" + }, + "engines": { + "npm": ">=6.13.4" + } + }, + "node_modules/lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", + "dev": true + }, + "node_modules/macos-release": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-3.2.0.tgz", + "integrity": "sha512-fSErXALFNsnowREYZ49XCdOHF8wOPWuFOGQrAhP7x5J/BqQv+B02cNsTykGpDgRVx43EKg++6ANmTaGTtW+hUA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/marked": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", + "dev": true, + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/marky": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/marky/-/marky-1.2.5.tgz", + "integrity": "sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==" + }, + "node_modules/meow": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz", + "integrity": "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==", + "dev": true, + "engines": { + "node": ">=16.10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/merge/-/merge-2.1.1.tgz", + "integrity": "sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==", + "dev": true + }, + "node_modules/merge-deep": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/merge-deep/-/merge-deep-3.0.3.tgz", + "integrity": "sha512-qtmzAS6t6grwEkNrunqTBdn0qKwFgNWvlxUbAV8es9M7Ot1EbyApytCnvE0jALPa46ZpKDUo527kKiaWplmlFA==", + "dependencies": { + "arr-union": "^3.1.0", + "clone-deep": "^0.2.4", + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==" + }, + "node_modules/mixin-object": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", + "integrity": "sha512-ALGF1Jt9ouehcaXaHhn6t1yGWRqGaHkPFndtFVHfZXOvkIZ/yoGaSi0AHVTafb3ZBGg4dr/bDwnaEKqCXzchMA==", + "dependencies": { + "for-in": "^0.1.3", + "is-extendable": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-object/node_modules/for-in": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", + "integrity": "sha512-F0to7vbBSHP8E3l6dCjxNOLuSFAACIxFy3UehTUlG7svlXi37HHsDkyVcHo0Pq8QwrE+pXvWSVX3ZT1T9wAZ9g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mocha": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.4.0.tgz", + "integrity": "sha512-eqhGB8JKapEYcC4ytX/xrzKforgEc3j1pGlAXVy3eRwrtAy5/nIfT1SvgGzfN0XZZxeLq0aQWkOUAmqIJiv+bA==", + "dev": true, + "dependencies": { + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.4", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "8.1.0", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "5.0.1", + "ms": "2.1.3", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "workerpool": "6.2.1", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/mocha/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/mocha/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/mocha/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mocha/node_modules/minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/mocha/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/new-github-release-url": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/new-github-release-url/-/new-github-release-url-2.0.0.tgz", + "integrity": "sha512-NHDDGYudnvRutt/VhKFlX26IotXe1w0cmkDm6JGquh5bz/bDTw0LufSmH/GxTjEdpHEO+bVKFTwdrcGa/9XlKQ==", + "dev": true, + "dependencies": { + "type-fest": "^2.5.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/new-github-release-url/node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "dev": true + }, + "node_modules/normalize-package-data": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.0.tgz", + "integrity": "sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==", + "dev": true, + "dependencies": { + "hosted-git-info": "^7.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/normalize-package-data/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/normalize-package-data/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/one-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "dependencies": { + "fn.name": "1.x.x" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz", + "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==", + "dev": true, + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open/node_modules/is-wsl": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "dev": true, + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/os-name": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-5.1.0.tgz", + "integrity": "sha512-YEIoAnM6zFmzw3PQ201gCVCIWbXNyKObGlVvpAVvraAeOHnlYVKFssbA/riRX5R40WA6kKrZ7Dr7dWzO3nKSeQ==", + "dev": true, + "dependencies": { + "macos-release": "^3.1.0", + "windows-release": "^5.0.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pac-proxy-agent": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.1.tgz", + "integrity": "sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==", + "dependencies": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.2", + "pac-resolver": "^7.0.0", + "socks-proxy-agent": "^8.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-resolver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", + "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "dependencies": { + "degenerator": "^5.0.0", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "dependencies": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-path": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.0.0.tgz", + "integrity": "sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==", + "dev": true, + "dependencies": { + "protocols": "^2.0.0" + } + }, + "node_modules/parse-url": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-8.1.0.tgz", + "integrity": "sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==", + "dev": true, + "dependencies": { + "parse-path": "^7.0.0" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/peek-readable": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-4.1.0.tgz", + "integrity": "sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==", + "engines": { + "node": ">=8" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "dev": true, + "dependencies": { + "find-up": "^6.3.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/pkg-dir/node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/pretty-quick": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-quick/-/pretty-quick-4.0.0.tgz", + "integrity": "sha512-M+2MmeufXb/M7Xw3Afh1gxcYpj+sK0AxEfnfF958ktFeAyi5MsKY5brymVURQLgPLV1QaF5P4pb2oFJ54H3yzQ==", + "dev": true, + "dependencies": { + "execa": "^5.1.1", + "find-up": "^5.0.0", + "ignore": "^5.3.0", + "mri": "^1.2.0", + "picocolors": "^1.0.0", + "picomatch": "^3.0.1", + "tslib": "^2.6.2" + }, + "bin": { + "pretty-quick": "lib/cli.mjs" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "prettier": "^3.0.0" + } + }, + "node_modules/pretty-quick/node_modules/picomatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-3.0.1.tgz", + "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise.allsettled": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/promise.allsettled/-/promise.allsettled-1.0.7.tgz", + "integrity": "sha512-hezvKvQQmsFkOdrZfYxUxkyxl8mgFQeT259Ajj9PXdbg9VzBCWrItOev72JyWxkCD5VSSqAeHmlN3tWx4DlmsA==", + "dev": true, + "dependencies": { + "array.prototype.map": "^1.0.5", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "iterate-value": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", + "dev": true + }, + "node_modules/protocols": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.1.tgz", + "integrity": "sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==", + "dev": true + }, + "node_modules/proxy-agent": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.4.0.tgz", + "integrity": "sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.3", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.0.1", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pupa": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.1.0.tgz", + "integrity": "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==", + "dev": true, + "dependencies": { + "escape-goat": "^4.0.0" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/puppeteer": { + "version": "22.10.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-22.10.0.tgz", + "integrity": "sha512-ZOkZd6a6t0BdKcWb0wAYHWQqCfdlN1PPnXOmg/XNrbo6gJhYWFX4qCNb6ahSn8TpAqBqLCoD4Q010F7GwOM7mA==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@puppeteer/browsers": "2.2.3", + "cosmiconfig": "9.0.0", + "devtools-protocol": "0.0.1286932", + "puppeteer-core": "22.10.0" + }, + "bin": { + "puppeteer": "lib/esm/puppeteer/node/cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/puppeteer-core": { + "version": "22.10.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-22.10.0.tgz", + "integrity": "sha512-I54J4Vy4I07UHsgB1QSmuFoF7KNQjJWcvFBPhtY+ezMdBfwgGDr8dzYrJa11aPgP9kxIUHjhktcMmmfJkOAtTw==", + "license": "Apache-2.0", + "dependencies": { + "@puppeteer/browsers": "2.2.3", + "chromium-bidi": "0.5.19", + "debug": "4.3.4", + "devtools-protocol": "0.0.1286932", + "ws": "8.17.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/puppeteer-extra": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/puppeteer-extra/-/puppeteer-extra-3.3.6.tgz", + "integrity": "sha512-rsLBE/6mMxAjlLd06LuGacrukP2bqbzKCLzV1vrhHFavqQE/taQ2UXv3H5P0Ls7nsrASa+6x3bDbXHpqMwq+7A==", + "dependencies": { + "@types/debug": "^4.1.0", + "debug": "^4.1.1", + "deepmerge": "^4.2.2" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "@types/puppeteer": "*", + "puppeteer": "*", + "puppeteer-core": "*" + }, + "peerDependenciesMeta": { + "@types/puppeteer": { + "optional": true + }, + "puppeteer": { + "optional": true + }, + "puppeteer-core": { + "optional": true + } + } + }, + "node_modules/puppeteer-extra-plugin": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/puppeteer-extra-plugin/-/puppeteer-extra-plugin-3.2.3.tgz", + "integrity": "sha512-6RNy0e6pH8vaS3akPIKGg28xcryKscczt4wIl0ePciZENGE2yoaQJNd17UiEbdmh5/6WW6dPcfRWT9lxBwCi2Q==", + "dependencies": { + "@types/debug": "^4.1.0", + "debug": "^4.1.1", + "merge-deep": "^3.0.1" + }, + "engines": { + "node": ">=9.11.2" + }, + "peerDependencies": { + "playwright-extra": "*", + "puppeteer-extra": "*" + }, + "peerDependenciesMeta": { + "playwright-extra": { + "optional": true + }, + "puppeteer-extra": { + "optional": true + } + } + }, + "node_modules/puppeteer-extra-plugin-stealth": { + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/puppeteer-extra-plugin-stealth/-/puppeteer-extra-plugin-stealth-2.11.2.tgz", + "integrity": "sha512-bUemM5XmTj9i2ZerBzsk2AN5is0wHMNE6K0hXBzBXOzP5m5G3Wl0RHhiqKeHToe/uIH8AoZiGhc1tCkLZQPKTQ==", + "dependencies": { + "debug": "^4.1.1", + "puppeteer-extra-plugin": "^3.2.3", + "puppeteer-extra-plugin-user-preferences": "^2.4.1" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "playwright-extra": "*", + "puppeteer-extra": "*" + }, + "peerDependenciesMeta": { + "playwright-extra": { + "optional": true + }, + "puppeteer-extra": { + "optional": true + } + } + }, + "node_modules/puppeteer-extra-plugin-user-data-dir": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/puppeteer-extra-plugin-user-data-dir/-/puppeteer-extra-plugin-user-data-dir-2.4.1.tgz", + "integrity": "sha512-kH1GnCcqEDoBXO7epAse4TBPJh9tEpVEK/vkedKfjOVOhZAvLkHGc9swMs5ChrJbRnf8Hdpug6TJlEuimXNQ+g==", + "dependencies": { + "debug": "^4.1.1", + "fs-extra": "^10.0.0", + "puppeteer-extra-plugin": "^3.2.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "playwright-extra": "*", + "puppeteer-extra": "*" + }, + "peerDependenciesMeta": { + "playwright-extra": { + "optional": true + }, + "puppeteer-extra": { + "optional": true + } + } + }, + "node_modules/puppeteer-extra-plugin-user-data-dir/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/puppeteer-extra-plugin-user-preferences": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/puppeteer-extra-plugin-user-preferences/-/puppeteer-extra-plugin-user-preferences-2.4.1.tgz", + "integrity": "sha512-i1oAZxRbc1bk8MZufKCruCEC3CCafO9RKMkkodZltI4OqibLFXF3tj6HZ4LZ9C5vCXZjYcDWazgtY69mnmrQ9A==", + "dependencies": { + "debug": "^4.1.1", + "deepmerge": "^4.2.2", + "puppeteer-extra-plugin": "^3.2.3", + "puppeteer-extra-plugin-user-data-dir": "^2.4.1" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "playwright-extra": "*", + "puppeteer-extra": "*" + }, + "peerDependenciesMeta": { + "playwright-extra": { + "optional": true + }, + "puppeteer-extra": { + "optional": true + } + } + }, + "node_modules/qrcode-terminal": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz", + "integrity": "sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ==", + "bin": { + "qrcode-terminal": "bin/qrcode-terminal.js" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/queue-tick": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", + "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==" + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-8.1.0.tgz", + "integrity": "sha512-PORM8AgzXeskHO/WEv312k9U03B8K9JSiWF/8N9sUuFjBa+9SF2u6K7VClzXwDXab51jCd8Nd36CNM+zR97ScQ==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.1", + "normalize-package-data": "^6.0.0", + "parse-json": "^7.0.0", + "type-fest": "^4.2.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-10.1.0.tgz", + "integrity": "sha512-aNtBq4jR8NawpKJQldrQcSW9y/d+KWH4v24HWkHljOZ7H0av+YTGANBzRh9A5pw7v/bLVsLVPpOhJ7gHNVy8lA==", + "dev": true, + "dependencies": { + "find-up": "^6.3.0", + "read-pkg": "^8.1.0", + "type-fest": "^4.2.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "4.10.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.10.3.tgz", + "integrity": "sha512-JLXyjizi072smKGGcZiAJDCNweT8J+AuRxmPZ1aG7TERg4ijx9REl8CNhbr36RV4qXqL1gO1FF9HL8OkVmmrsA==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg/node_modules/json-parse-even-better-errors": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.1.tgz", + "integrity": "sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-pkg/node_modules/lines-and-columns": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.4.tgz", + "integrity": "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/read-pkg/node_modules/parse-json": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-7.1.1.tgz", + "integrity": "sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.21.4", + "error-ex": "^1.3.2", + "json-parse-even-better-errors": "^3.0.0", + "lines-and-columns": "^2.0.3", + "type-fest": "^3.8.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg/node_modules/parse-json/node_modules/type-fest": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", + "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "4.10.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.10.3.tgz", + "integrity": "sha512-JLXyjizi072smKGGcZiAJDCNweT8J+AuRxmPZ1aG7TERg4ijx9REl8CNhbr36RV4qXqL1gO1FF9HL8OkVmmrsA==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readable-web-to-node-stream": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", + "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", + "dependencies": { + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dev": true, + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/reflect-metadata": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.1.tgz", + "integrity": "sha512-i5lLI6iw9AU3Uu4szRNPPEkomnkjRTaVt9hy/bn5g/oSzekBSMeLZblcjP74AW0vBabqERLLIrz+gR8QYR54Tw==" + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "dev": true, + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/registry-auth-token": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz", + "integrity": "sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==", + "dependencies": { + "rc": "1.2.8" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dev": true, + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/release-it": { + "version": "17.3.0", + "resolved": "https://registry.npmjs.org/release-it/-/release-it-17.3.0.tgz", + "integrity": "sha512-7t9a2WEwqQKCdteshZUrO/3RX60plS5CzYAFr5+4Zj8qvRx1pFOFVglJSz4BeFAEd2yejpPxfI60+qRUzLEDZw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/webpro" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/webpro" + } + ], + "license": "MIT", + "dependencies": { + "@iarna/toml": "2.2.5", + "@octokit/rest": "20.1.1", + "async-retry": "1.3.3", + "chalk": "5.3.0", + "cosmiconfig": "9.0.0", + "execa": "8.0.1", + "git-url-parse": "14.0.0", + "globby": "14.0.1", + "got": "13.0.0", + "inquirer": "9.2.22", + "is-ci": "3.0.1", + "issue-parser": "7.0.0", + "lodash": "4.17.21", + "mime-types": "2.1.35", + "new-github-release-url": "2.0.0", + "node-fetch": "3.3.2", + "open": "10.1.0", + "ora": "8.0.1", + "os-name": "5.1.0", + "promise.allsettled": "1.0.7", + "proxy-agent": "6.4.0", + "semver": "7.6.2", + "shelljs": "0.8.5", + "update-notifier": "7.0.0", + "url-join": "5.0.0", + "wildcard-match": "5.1.3", + "yargs-parser": "21.1.1" + }, + "bin": { + "release-it": "bin/release-it.js" + }, + "engines": { + "node": "^18.18.0 || ^20.8.0 || ^22.0.0" + } + }, + "node_modules/release-it/node_modules/@sindresorhus/is": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", + "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/release-it/node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "dev": true, + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.1" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/release-it/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/release-it/node_modules/cacheable-request": { + "version": "10.2.14", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", + "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "^4.0.2", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.3", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/release-it/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/release-it/node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 12" + } + }, + "node_modules/release-it/node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/release-it/node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/release-it/node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/release-it/node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/release-it/node_modules/emoji-regex": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", + "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", + "dev": true, + "license": "MIT" + }, + "node_modules/release-it/node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/release-it/node_modules/execa/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/release-it/node_modules/globby": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.1.tgz", + "integrity": "sha512-jOMLD2Z7MAhyG8aJpNOpmziMOP4rPLcc95oQPKXBazW82z+CEgPFBQvEpRUa1KeIMUJo4Wsm+q6uzO/Q/4BksQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.2", + "ignore": "^5.2.4", + "path-type": "^5.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/release-it/node_modules/got": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/got/-/got-13.0.0.tgz", + "integrity": "sha512-XfBk1CxOOScDcMr9O1yKkNaQyy865NbYs+F7dr4H0LZMVgCj2Le59k6PqbNHoL5ToeaEQUYh6c6yMfVcc6SJxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.8", + "decompress-response": "^6.0.0", + "form-data-encoder": "^2.1.2", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/release-it/node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/release-it/node_modules/inquirer": { + "version": "9.2.22", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.22.tgz", + "integrity": "sha512-SqLLa/Oe5rZUagTR9z+Zd6izyatHglbmbvVofo1KzuVB54YHleWzeHNLoR7FOICGOeQSqeLh1cordb3MzhGcEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/figures": "^1.0.2", + "@ljharb/through": "^2.3.13", + "ansi-escapes": "^4.3.2", + "chalk": "^5.3.0", + "cli-cursor": "^3.1.0", + "cli-width": "^4.1.0", + "external-editor": "^3.1.0", + "lodash": "^4.17.21", + "mute-stream": "1.0.0", + "ora": "^5.4.1", + "run-async": "^3.0.0", + "rxjs": "^7.8.1", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/release-it/node_modules/inquirer/node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/release-it/node_modules/inquirer/node_modules/ora/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/release-it/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/release-it/node_modules/lowercase-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/release-it/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/release-it/node_modules/mimic-response": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", + "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/release-it/node_modules/mute-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/release-it/node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/release-it/node_modules/normalize-url": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz", + "integrity": "sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/release-it/node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/release-it/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/release-it/node_modules/ora": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-8.0.1.tgz", + "integrity": "sha512-ANIvzobt1rls2BDny5fWZ3ZVKyD6nscLvfFRpQgfWsythlcsVUC9kL0zq6j2Z5z9wwp1kd7wpsD/T9qNPVLCaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "cli-cursor": "^4.0.0", + "cli-spinners": "^2.9.2", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.0.0", + "log-symbols": "^6.0.0", + "stdin-discarder": "^0.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/release-it/node_modules/ora/node_modules/cli-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/release-it/node_modules/ora/node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/release-it/node_modules/ora/node_modules/is-unicode-supported": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.0.0.tgz", + "integrity": "sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/release-it/node_modules/ora/node_modules/log-symbols": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", + "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "is-unicode-supported": "^1.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/release-it/node_modules/ora/node_modules/log-symbols/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/release-it/node_modules/ora/node_modules/string-width": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz", + "integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/release-it/node_modules/ora/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/release-it/node_modules/p-cancelable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/release-it/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/release-it/node_modules/path-type": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", + "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/release-it/node_modules/responselike": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", + "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", + "dev": true, + "license": "MIT", + "dependencies": { + "lowercase-keys": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/release-it/node_modules/restore-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/release-it/node_modules/restore-cursor/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/release-it/node_modules/restore-cursor/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/release-it/node_modules/restore-cursor/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/release-it/node_modules/run-async": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", + "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/release-it/node_modules/semver": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/release-it/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/release-it/node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/release-it/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/release-it/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/release-it/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", + "dependencies": { + "lowercase-keys": "^1.0.0" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-applescript": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", + "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", + "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "get-intrinsic": "^1.2.2", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-stable-stringify": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", + "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", + "engines": { + "node": ">=10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/sanitize-filename": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", + "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", + "dependencies": { + "truncate-utf8-bytes": "^1.0.0" + } + }, + "node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/semver-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", + "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semver-diff/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-diff/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-diff/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", + "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.2", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shallow-clone": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz", + "integrity": "sha512-J1zdXCky5GmNnuauESROVu31MQSnLoYvlyEn6j2Ztk6Q5EHFIhxkMhYcv6vuDzl2XEzoRr856QwzMgWM/TmZgw==", + "dependencies": { + "is-extendable": "^0.1.1", + "kind-of": "^2.0.1", + "lazy-cache": "^0.2.3", + "mixin-object": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shallow-clone/node_modules/kind-of": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz", + "integrity": "sha512-0u8i1NZ/mg0b+W3MGGw5I7+6Eib2nx72S/QvXa0hYjEkjTknYmEYQJwGu3mLC0BrhtJjtQafTkyRUQ75Kx0LVg==", + "dependencies": { + "is-buffer": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shallow-clone/node_modules/lazy-cache": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", + "integrity": "sha512-gkX52wvU/R8DVMMt78ATVPFMJqfW8FPz1GZ1sVHBVQHmu/WvhIWE4cE1GBzhJNFicDeYhnwp6Rl35BcAIM3YOQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sharp": { + "version": "0.33.4", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.4.tgz", + "integrity": "sha512-7i/dt5kGl7qR4gwPRD2biwD2/SvBn3O04J77XKFgL2OnZtQw+AG9wnuS/csmu80nPRHLYE9E41fyEiG8nhH6/Q==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.3", + "semver": "^7.6.0" + }, + "engines": { + "libvips": ">=8.15.2", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.33.4", + "@img/sharp-darwin-x64": "0.33.4", + "@img/sharp-libvips-darwin-arm64": "1.0.2", + "@img/sharp-libvips-darwin-x64": "1.0.2", + "@img/sharp-libvips-linux-arm": "1.0.2", + "@img/sharp-libvips-linux-arm64": "1.0.2", + "@img/sharp-libvips-linux-s390x": "1.0.2", + "@img/sharp-libvips-linux-x64": "1.0.2", + "@img/sharp-libvips-linuxmusl-arm64": "1.0.2", + "@img/sharp-libvips-linuxmusl-x64": "1.0.2", + "@img/sharp-linux-arm": "0.33.4", + "@img/sharp-linux-arm64": "0.33.4", + "@img/sharp-linux-s390x": "0.33.4", + "@img/sharp-linux-x64": "0.33.4", + "@img/sharp-linuxmusl-arm64": "0.33.4", + "@img/sharp-linuxmusl-x64": "0.33.4", + "@img/sharp-wasm32": "0.33.4", + "@img/sharp-win32-ia32": "0.33.4", + "@img/sharp-win32-x64": "0.33.4" + } + }, + "node_modules/sharp/node_modules/semver": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "dev": true, + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/shiki": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.7.tgz", + "integrity": "sha512-dNPAPrxSc87ua2sKJ3H5dQ/6ZaY8RNnaAqK+t0eG7p0Soi2ydiqbGOTaZCqaYvA/uZYfS1LJnemt3Q+mSfcPCg==", + "dev": true, + "dependencies": { + "ansi-sequence-parser": "^1.1.0", + "jsonc-parser": "^3.2.0", + "vscode-oniguruma": "^1.7.0", + "vscode-textmate": "^8.0.0" + } + }, + "node_modules/shx": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/shx/-/shx-0.3.4.tgz", + "integrity": "sha512-N6A9MLVqjxZYcVn8hLmtneQWIJtp8IKzMP4eMnx+nqkvXoqinUPCbUFLp2UcWTEIUONhlk0ewxr/jaVGlc+J+g==", + "dev": true, + "dependencies": { + "minimist": "^1.2.3", + "shelljs": "^0.8.5" + }, + "bin": { + "shx": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/side-channel": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.5.tgz", + "integrity": "sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.1.tgz", + "integrity": "sha512-B6w7tkwNid7ToxjZ08rQMT8M9BJAf8DKx8Ft4NivzH0zBUfd6jldGcisJn/RLgxcX3FPNDdNQCUEMMT79b+oCQ==", + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz", + "integrity": "sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "socks": "^2.7.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "devOptional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spawn-command": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz", + "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==", + "dev": true + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz", + "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==", + "dev": true + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "dev": true, + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==" + }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "engines": { + "node": "*" + } + }, + "node_modules/stdin-discarder": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", + "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stop-iteration-iterator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", + "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "dev": true, + "dependencies": { + "internal-slot": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/streamx": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.16.1.tgz", + "integrity": "sha512-m9QYj6WygWyWa3H1YY69amr4nVgy61xfjys7xO7kviL5rfIEc2naf+ewFiOA+aEJD7y0JO3h2GoiUv4TDwEGzQ==", + "dependencies": { + "fast-fifo": "^1.1.0", + "queue-tick": "^1.0.1" + }, + "optionalDependencies": { + "bare-events": "^2.2.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strtok3": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-6.3.0.tgz", + "integrity": "sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==", + "dependencies": { + "@tokenizer/token": "^0.3.0", + "peek-readable": "^4.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-fs": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.5.tgz", + "integrity": "sha512-JOgGAmZyMgbqpLwct7ZV8VzkEB6pxXFBVErLtb+XCOqzc6w1xiWKI9GVd6bwk68EX7eJ4DWmfXVmq8K2ziZTGg==", + "dependencies": { + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^2.1.1", + "bare-path": "^2.1.0" + } + }, + "node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/temp-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-3.0.0.tgz", + "integrity": "sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==", + "dev": true, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/tempfile": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-5.0.0.tgz", + "integrity": "sha512-bX655WZI/F7EoTDw9JvQURqAXiPHi8o8+yFxPF2lWYyz1aHnmMRuXWqL6YB6GmeO0o4DIYWHLgGNi/X64T+X4Q==", + "dev": true, + "dependencies": { + "temp-dir": "^3.0.0" + }, + "engines": { + "node": ">=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terser": { + "version": "5.28.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.28.1.tgz", + "integrity": "sha512-wM+bZp54v/E9eRRGXb5ZFDvinrJIOaTapx3WUokyVGZu5ucVCK55zEgGd5Dl2fSr3jUo5sDiERErUWLY6QPFyA==", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.20", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser-webpack-plugin/node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/text-extensions": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-2.4.0.tgz", + "integrity": "sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" + }, + "node_modules/tmp": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "engines": { + "node": ">=14.14" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/token-types": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-4.2.1.tgz", + "integrity": "sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==", + "dependencies": { + "@tokenizer/token": "^0.3.0", + "ieee754": "^1.2.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/triple-beam": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", + "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/truncate-utf8-bytes": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", + "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", + "dependencies": { + "utf8-byte-length": "^1.0.1" + } + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node/node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz", + "integrity": "sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typedoc": { + "version": "0.25.13", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.25.13.tgz", + "integrity": "sha512-pQqiwiJ+Z4pigfOnnysObszLiU3mVLWAExSPf+Mu06G/qsc3wzbuM56SZQvONhHLncLUhYzOVkjFFpFfL5AzhQ==", + "dev": true, + "dependencies": { + "lunr": "^2.3.9", + "marked": "^4.3.0", + "minimatch": "^9.0.3", + "shiki": "^0.14.7" + }, + "bin": { + "typedoc": "bin/typedoc" + }, + "engines": { + "node": ">= 16" + }, + "peerDependencies": { + "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x" + } + }, + "node_modules/typedoc/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/typedoc/node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/typescript": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "dev": true, + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unbzip2-stream": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "dependencies": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unique-string": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", + "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", + "dev": true, + "dependencies": { + "crypto-random-string": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/universal-user-agent": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", + "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", + "dev": true + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/update-notifier": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-7.0.0.tgz", + "integrity": "sha512-Hv25Bh+eAbOLlsjJreVPOs4vd51rrtCrmhyOJtbpAojro34jS4KQaEp4/EvlHJX7jSO42VvEFpkastVyXyIsdQ==", + "dev": true, + "dependencies": { + "boxen": "^7.1.1", + "chalk": "^5.3.0", + "configstore": "^6.0.0", + "import-lazy": "^4.0.0", + "is-in-ci": "^0.1.0", + "is-installed-globally": "^0.4.0", + "is-npm": "^6.0.0", + "latest-version": "^7.0.0", + "pupa": "^3.1.0", + "semver": "^7.5.4", + "semver-diff": "^4.0.0", + "xdg-basedir": "^5.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/yeoman/update-notifier?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/@sindresorhus/is": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", + "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "dev": true, + "dependencies": { + "defer-to-connect": "^2.0.1" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/update-notifier/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/boxen": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz", + "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==", + "dev": true, + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^7.0.1", + "chalk": "^5.2.0", + "cli-boxes": "^3.0.0", + "string-width": "^5.1.2", + "type-fest": "^2.13.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/cacheable-request": { + "version": "10.2.14", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", + "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", + "dev": true, + "dependencies": { + "@types/http-cache-semantics": "^4.0.2", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.3", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/update-notifier/node_modules/camelcase": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", + "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/update-notifier/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/update-notifier/node_modules/got": { + "version": "12.6.1", + "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", + "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", + "dev": true, + "dependencies": { + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.8", + "decompress-response": "^6.0.0", + "form-data-encoder": "^2.1.2", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/latest-version": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", + "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", + "dev": true, + "dependencies": { + "package-json": "^8.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/lowercase-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/update-notifier/node_modules/mimic-response": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", + "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/normalize-url": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", + "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/p-cancelable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "dev": true, + "engines": { + "node": ">=12.20" + } + }, + "node_modules/update-notifier/node_modules/package-json": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.1.tgz", + "integrity": "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==", + "dev": true, + "dependencies": { + "got": "^12.1.0", + "registry-auth-token": "^5.0.1", + "registry-url": "^6.0.0", + "semver": "^7.3.7" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/registry-auth-token": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", + "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==", + "dev": true, + "dependencies": { + "@pnpm/npm-conf": "^2.1.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/update-notifier/node_modules/registry-url": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", + "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", + "dev": true, + "dependencies": { + "rc": "1.2.8" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/responselike": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", + "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", + "dev": true, + "dependencies": { + "lowercase-keys": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/update-notifier/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/widest-line": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", + "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", + "dev": true, + "dependencies": { + "string-width": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-join": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-5.0.0.tgz", + "integrity": "sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", + "dependencies": { + "prepend-http": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/urlpattern-polyfill": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", + "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==" + }, + "node_modules/utf8-byte-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", + "integrity": "sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/vscode-oniguruma": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", + "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==", + "dev": true + }, + "node_modules/vscode-textmate": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz", + "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==", + "dev": true + }, + "node_modules/watchpack": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", + "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", + "dev": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/webpack": { + "version": "5.91.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.91.0.tgz", + "integrity": "sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==", + "dev": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.21.10", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.16.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", + "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", + "dev": true, + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^2.1.1", + "@webpack-cli/info": "^2.0.2", + "@webpack-cli/serve": "^2.0.5", + "colorette": "^2.0.14", + "commander": "^10.0.1", + "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/webpack-cli/node_modules/interpret": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-cli/node_modules/rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "dev": true, + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-merge/node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-merge/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-merge/node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/webpack/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz", + "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.6", + "call-bind": "^1.0.5", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true + }, + "node_modules/wildcard-match": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/wildcard-match/-/wildcard-match-5.1.3.tgz", + "integrity": "sha512-a95hPUk+BNzSGLntNXYxsjz2Hooi5oL7xOfJR6CKwSsSALh7vUNuTlzsrZowtYy38JNduYFRVhFv19ocqNOZlg==", + "dev": true + }, + "node_modules/windows-release": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-5.1.1.tgz", + "integrity": "sha512-NMD00arvqcq2nwqc5Q6KtrSRHK+fVD31erE5FEMahAw5PmVCgD7MUXodq3pdZSUkqA9Cda2iWx6s1XYwiJWRmw==", + "dev": true, + "dependencies": { + "execa": "^5.1.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/winston": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.13.0.tgz", + "integrity": "sha512-rwidmA1w3SE4j0E5MuIufFhyJPBDG7Nu71RkZor1p2+qHvJSZ9GYDA81AyleQcZbh/+V6HjeBdfnTZJm9rSeQQ==", + "dependencies": { + "@colors/colors": "^1.6.0", + "@dabh/diagnostics": "^2.0.2", + "async": "^3.2.3", + "is-stream": "^2.0.0", + "logform": "^2.4.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "safe-stable-stringify": "^2.3.1", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.7.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/winston-transport": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.7.0.tgz", + "integrity": "sha512-ajBj65K5I7denzer2IYW6+2bNIVqLGDHqDw3Ow8Ohh+vdW+rv4MZ6eiDvHoKhfJFZ2auyN8byXieDDJ96ViONg==", + "dependencies": { + "logform": "^2.3.2", + "readable-stream": "^3.6.0", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true + }, + "node_modules/workerpool": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.0.tgz", + "integrity": "sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xdg-basedir": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", + "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "3.22.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", + "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 000000000..8af82d079 --- /dev/null +++ b/package.json @@ -0,0 +1,135 @@ +{ + "name": "@wppconnect-team/wppconnect", + "version": "1.31.0", + "description": "WPPConnect is an open source project developed by the JavaScript community with the aim of exporting functions from WhatsApp Web to the node, which can be used to support the creation of any interaction, such as customer service, media sending, intelligence recognition based on phrases artificial and many other things, use your imagination... 😀🤔💭", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "scripts": { + "build:client": "tsc", + "build:wapi": "cd src/lib/wapi/ && webpack", + "build": "npm run build:wapi && npm run build:client", + "changelog:last": "conventional-changelog -p angular -r 2", + "changelog:preview": "conventional-changelog -p angular -u", + "changelog:update": "conventional-changelog -p angular -i CHANGELOG.md -s", + "clean": "shx rm -rf session dist", + "commit": "cz", + "docs:build": "npm run docs:clean && typedoc && npm run docs:copy-images", + "docs:clean": "shx rm -rf api-docs", + "docs:copy-images": "shx cp -R ./img ./api-docs", + "lint:js": "npx eslint -c .eslintrc.js --ext .js src", + "lint:ts": "npx eslint -c .eslintrc.js --ext .ts src", + "lint": "npm run lint:ts && npm run lint:js", + "prepare": "husky install && npm run clean && npm run build", + "release": "release-it", + "start": "npm run build:client && tsc app.ts && node app.js", + "test": "mocha -r ts-node/register src/tests/**/*.test.ts", + "watch": "concurrently \"npm run build:wapi -- --mode=development -w -d eval-source-map\" \"npm run build:client -- -w --sourceMap\"" + }, + "config": { + "commitizen": { + "path": "@commitlint/cz-commitlint" + } + }, + "repository": { + "type": "git", + "url": "git+https://github.com/wppconnect-team/wppconnect.git" + }, + "keywords": [ + "whatsapp", + "javascript", + "bot", + "chat bot", + "bot", + "typescript", + "automatization", + "puppeteer" + ], + "author": "wppconnect-team", + "license": "LGPL-3.0-or-later", + "bugs": { + "url": "https://github.com/wppconnect-team/wppconnect/issues" + }, + "publishConfig": { + "access": "public" + }, + "homepage": "https://github.com/wppconnect-team/wppconnect#readme", + "devDependencies": { + "@babel/core": "^7.24.7", + "@babel/eslint-parser": "^7.24.7", + "@babel/eslint-plugin": "^7.24.7", + "@babel/preset-env": "^7.24.7", + "@commitlint/cli": "^19.3.0", + "@commitlint/config-conventional": "^19.2.2", + "@commitlint/cz-commitlint": "^19.2.0", + "@types/atob": "^2.1.4", + "@types/mime-types": "^2.1.4", + "@types/mocha": "^10.0.6", + "@types/node": "^18.19.34", + "@types/rimraf": "^4.0.5", + "@types/sharp": "^0.32.0", + "@types/shelljs": "^0.8.15", + "@types/tmp": "^0.2.6", + "@types/ws": "^8.5.10", + "@typescript-eslint/eslint-plugin": "^5.62.0", + "@typescript-eslint/parser": "^5.62.0", + "babel-loader": "^9.1.3", + "commitizen": "^4.3.0", + "concurrently": "^8.2.2", + "conventional-changelog-cli": "^4.1.0", + "eslint": "^8.57.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-header": "^3.1.1", + "eslint-plugin-prettier": "^4.2.1", + "husky": "^9.0.11", + "mocha": "^10.4.0", + "prettier": "^2.8.8", + "pretty-quick": "^4.0.0", + "regenerator-runtime": "^0.14.1", + "release-it": "^17.3.0", + "shx": "^0.3.4", + "ts-node": "^10.9.2", + "typedoc": "^0.25.13", + "typescript": "^5.4.5", + "webpack": "^5.91.0", + "webpack-cli": "^5.1.4" + }, + "dependencies": { + "@wppconnect/wa-js": "^3.3.1", + "@wppconnect/wa-version": "^1.4.213", + "atob": "^2.1.2", + "axios": "^1.7.2", + "boxen": "^5.1.2", + "catch-exit": "^1.2.2", + "chalk": "~4.1.2", + "chrome-launcher": "^0.15.2", + "execa": "^5.1.1", + "file-type": "~16.5.4", + "futoin-hkdf": "^1.5.3", + "latest-version": "^5.1.0", + "logform": "^2.6.0", + "lookpath": "^1.2.2", + "mime-types": "^2.1.35", + "puppeteer": "^22.10.0", + "puppeteer-extra": "^3.3.6", + "puppeteer-extra-plugin-stealth": "^2.11.2", + "puppeteer-extra-plugin-user-data-dir": "^2.4.1", + "puppeteer-extra-plugin-user-preferences": "^2.4.1", + "qrcode-terminal": "^0.12.0", + "reflect-metadata": "^0.2.1", + "rimraf": "^3.0.2", + "sanitize-filename": "^1.6.3", + "sharp": "0.33.4", + "tmp": "^0.2.3", + "tree-kill": "^1.2.2", + "winston": "^3.13.0", + "ws": "^8.17.0" + }, + "optionalDependencies": { + "@img/sharp-win32-x64": "^0.33.4", + "fsevents": "^2.3.3" + }, + "directories": { + "doc": "docs", + "example": "examples" + } +} diff --git a/src/api/helpers/base64-mimetype.ts b/src/api/helpers/base64-mimetype.ts new file mode 100644 index 000000000..ce746dd97 --- /dev/null +++ b/src/api/helpers/base64-mimetype.ts @@ -0,0 +1,30 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export function base64MimeType(encoded: string) { + let result = null; + if (typeof encoded !== 'string') { + return result; + } + + const mime = encoded.match(/data:([a-zA-Z0-9]+\/[a-zA-Z0-9-.+]+).*,.*/); + if (mime && mime.length) { + result = mime[1]; + } + + return result; +} diff --git a/src/api/helpers/decrypt.ts b/src/api/helpers/decrypt.ts new file mode 100644 index 000000000..e80f210cd --- /dev/null +++ b/src/api/helpers/decrypt.ts @@ -0,0 +1,112 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +import * as crypto from 'crypto'; +import hkdf from 'futoin-hkdf'; +import atob = require('atob'); +import { ResponseType } from 'axios'; + +export const makeOptions = (useragentOverride: string) => ({ + responseType: 'arraybuffer' as ResponseType, + headers: { + 'User-Agent': processUA(useragentOverride), + DNT: '1', + 'Upgrade-Insecure-Requests': '1', + origin: 'https://web.whatsapp.com/', + referer: 'https://web.whatsapp.com/', + }, +}); + +export const timeout = (ms: number) => + new Promise((res) => setTimeout(res, ms)); +export const mediaTypes = { + IMAGE: 'Image', + VIDEO: 'Video', + AUDIO: 'Audio', + PTT: 'Audio', + DOCUMENT: 'Document', + STICKER: 'Image', +}; + +const processUA = (userAgent: string) => { + let ua = + userAgent || + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.63 Safari/537.36'; + if (!ua.includes('WhatsApp')) ua = 'WhatsApp/2.16.352 ' + ua; + return ua; +}; + +export const magix = ( + fileData: any, + mediaKeyBase64: any, + mediaType: any, + expectedSize?: number +) => { + const encodedHex = fileData.toString('hex'); + const encodedBytes = hexToBytes(encodedHex); + const mediaKeyBytes: any = base64ToBytes(mediaKeyBase64); + const info = `WhatsApp ${mediaTypes[mediaType.toUpperCase()]} Keys`; + const hash: string = 'sha256'; + const salt: any = new Uint8Array(32); + const expandedSize = 112; + const mediaKeyExpanded = hkdf(mediaKeyBytes, expandedSize, { + salt, + info, + hash, + }); + const iv = mediaKeyExpanded.slice(0, 16); + const cipherKey = mediaKeyExpanded.slice(16, 48); + const decipher = crypto.createDecipheriv('aes-256-cbc', cipherKey, iv); + const decoded: Buffer = decipher.update(encodedBytes); + const mediaDataBuffer = expectedSize + ? fixPadding(decoded, expectedSize) + : decoded; + return mediaDataBuffer; +}; + +const fixPadding = (data: Buffer, expectedSize: number) => { + let padding = (16 - (expectedSize % 16)) & 0xf; + if (padding > 0) { + if (expectedSize + padding == data.length) { + // console.log(`trimmed: ${padding} bytes`); + data = data.slice(0, data.length - padding); + } else if (data.length + padding == expectedSize) { + // console.log(`adding: ${padding} bytes`); + let arr = new Uint16Array(padding).map((b) => padding); + data = Buffer.concat([data, Buffer.from(arr)]); + } + } + //@ts-ignore + return Buffer.from(data, 'utf-8'); +}; + +const hexToBytes = (hexStr: any) => { + const intArray = []; + for (let i = 0; i < hexStr.length; i += 2) { + intArray.push(parseInt(hexStr.substr(i, 2), 16)); + } + return new Uint8Array(intArray); +}; + +const base64ToBytes = (base64Str: any) => { + const binaryStr = atob(base64Str); + const byteArray = new Uint8Array(binaryStr.length); + for (let i = 0; i < binaryStr.length; i++) { + byteArray[i] = binaryStr.charCodeAt(i); + } + return byteArray; +}; diff --git a/src/api/helpers/download-file.ts b/src/api/helpers/download-file.ts new file mode 100644 index 000000000..b0c86eb98 --- /dev/null +++ b/src/api/helpers/download-file.ts @@ -0,0 +1,61 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +import axios from 'axios'; + +export async function downloadFileToBase64( + _path: string, + _mines: (string | RegExp)[] = [] +): Promise { + if (!Array.isArray(_mines)) { + console.error(`set mines string array, not "${typeof _mines}" `); + return false; + } + + const reHttp = /^https?:/; + + if (!reHttp.test(_path)) { + return false; + } + + try { + const response = await axios.get(_path, { + responseType: 'arraybuffer', + }); + + const mimeType = response.headers['content-type']; + + if (_mines.length) { + const isValidMime = _mines.some((m) => { + if (typeof m === 'string') { + return m === mimeType; + } + return m.exec(mimeType); + }); + if (!isValidMime) { + console.error(`Content-Type "${mimeType}" of ${_path} is not allowed`); + return false; + } + } + + const content = Buffer.from(response.data, 'binary').toString('base64'); + + return `data:${mimeType};base64,${content}`; + } catch (error) {} + + return false; +} diff --git a/src/api/helpers/evaluate-and-return.ts b/src/api/helpers/evaluate-and-return.ts new file mode 100644 index 000000000..2cf9e8024 --- /dev/null +++ b/src/api/helpers/evaluate-and-return.ts @@ -0,0 +1,146 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +import { Page } from 'puppeteer'; + +import { + EvaluateFn, + EvaluateFnReturnType, + SerializableOrJSHandle, +} from '../../types/Evaluate'; + +//EvaluateFn, EvaluateFnReturnType, SerializableOrJSHandle // + +export async function evaluateAndReturn( + page: Page, + pageFunction: T, + ...args: SerializableOrJSHandle[] +): Promise< + EvaluateFnReturnType extends PromiseLike + ? U + : EvaluateFnReturnType +> { + // See https://github.com/puppeteer/puppeteer/blob/41f23beb0da2433cf9103e5d8fc22a03b1820336/src/common/ExecutionContext.ts#L196 + + let functionText = pageFunction.toString(); + try { + new Function('(' + functionText + ')'); + } catch (error) { + // This means we might have a function shorthand. Try another + // time prefixing 'function '. + if (functionText.startsWith('async ')) { + functionText = + 'async function ' + functionText.substring('async '.length); + } else { + functionText = 'function ' + functionText; + } + try { + new Function('(' + functionText + ')'); + } catch (error) { + // We tried hard to serialize, but there's a weird beast here. + throw new Error('Passed function is not well-serializable!'); + } + } + + /** + * Polyfill async/await and promise converter + * See https://github.com/basarat/typescript-book/blob/master/docs/async-await.md + */ + const func = new Function(` + var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); + }; + + var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + }; + var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } + }; + var _this; // for arrow function + + return new Promise(async (resolve) => { + try { + return resolve(await (${functionText}).apply(this, arguments)); + } catch (error) { + return resolve({ + __error: JSON.parse(JSON.stringify(error, Object.getOwnPropertyNames(error))), + }); + } + });`); + + const result = (await page.evaluate(func as any, ...args)) as any; + + if (result !== null && typeof result === 'object' && '__error' in result) { + const errorMessage = + result.__error.message || JSON.stringify(result.__error); + + const error = new Error(errorMessage); + + Object.assign(error, result.__error); + + let jsStack = error.stack; + Error.captureStackTrace(error); + if (jsStack) { + error.stack = `${ + error.stack || '' + }\nJS Stack: ${jsStack}\nFunction: ${functionText}`; + } + + throw error; + } + + return result; +} diff --git a/src/api/helpers/exposed.enum.ts b/src/api/helpers/exposed.enum.ts new file mode 100644 index 000000000..581a0914e --- /dev/null +++ b/src/api/helpers/exposed.enum.ts @@ -0,0 +1,30 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export enum ExposedFn { + OnMessage = 'onMessage', + OnAnyMessage = 'onAnyMessage', + onAck = 'onAck', + onNotificationMessage = 'onNotificationMessage', + onParticipantsChanged = 'onParticipantsChanged', + onStateChange = 'onStateChange', + onStreamChange = 'onStreamChange', + onIncomingCall = 'onIncomingCall', + onInterfaceChange = 'onInterfaceChange', + onPresenceChanged = 'onPresenceChanged', + onLiveLocation = 'onLiveLocation', +} diff --git a/src/api/helpers/file-to-base64.ts b/src/api/helpers/file-to-base64.ts new file mode 100644 index 000000000..0e7eea459 --- /dev/null +++ b/src/api/helpers/file-to-base64.ts @@ -0,0 +1,54 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +import * as mimeTypes from 'mime-types'; +import * as fileType from 'file-type'; +import * as fs from 'fs'; + +/** + * Converts given file into base64 string + * @param path file path + * @param mime Optional, will retrieve file mime automatically if not defined (Example: 'image/png') + */ +export async function fileToBase64(path: string, mime?: string | false) { + if (fs.existsSync(path)) { + const base64 = fs.readFileSync(path, { encoding: 'base64' }); + if (mime === undefined) { + mime = mimeTypes.lookup(path); + } + if (!mime) { + const result = await fileType.fromFile(path); + mime = result?.mime; + } + if (!mime) { + mime = 'application/octet-stream'; + } + const data = `data:${mime};base64,${base64}`; + return data; + } else { + return false; + } +} + +export async function Mine(path: string) { + if (fs.existsSync(path)) { + const mime = await mimeTypes.lookup(path); + return mime; + } else { + return false; + } +} diff --git a/src/api/helpers/filename-from-mimetype.ts b/src/api/helpers/filename-from-mimetype.ts new file mode 100644 index 000000000..cb8ab8474 --- /dev/null +++ b/src/api/helpers/filename-from-mimetype.ts @@ -0,0 +1,33 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +import * as path from 'path'; +import * as mime from 'mime-types'; + +export function filenameFromMimeType( + filename: string, + mimeType: string +): string { + const filenameExtension = path.extname(filename); + const mimeExtension = mime.extension(mimeType); + + if (!mimeExtension || filenameExtension === mimeExtension) { + return filename; + } + + return path.basename(filename, filenameExtension) + '.' + mimeExtension; +} diff --git a/src/api/helpers/index.ts b/src/api/helpers/index.ts new file mode 100644 index 000000000..5c777e35f --- /dev/null +++ b/src/api/helpers/index.ts @@ -0,0 +1,24 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export { fileToBase64 } from './file-to-base64'; +export { base64MimeType } from './base64-mimetype'; +export { downloadFileToBase64 } from './download-file'; +export { stickerSelect, resizeImg } from './select-sticker'; +export { scrapeImg } from './scrape-img-qr'; +export { scrapeLogin } from './scrape-login'; +export { evaluateAndReturn } from './evaluate-and-return'; diff --git a/src/api/helpers/scrape-img-qr.ts b/src/api/helpers/scrape-img-qr.ts new file mode 100644 index 000000000..a5d93ace7 --- /dev/null +++ b/src/api/helpers/scrape-img-qr.ts @@ -0,0 +1,62 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +import { Page } from 'puppeteer'; +import { ScrapQrcode } from '../model/qrcode'; + +export async function scrapeImg(page: Page): Promise { + let click = await page + .evaluate(() => { + const selectorImg = document.querySelector('canvas'); + const selectorUrl = selectorImg.closest('[data-ref]'); + //const buttonReload = selectorUrl.querySelector('[role="button"]') as HTMLButtonElement; + const buttonReload = selectorUrl.querySelector('button'); + if (buttonReload != null) { + buttonReload.click(); + return true; + } + return false; + }) + .catch(() => false); + + if (click) { + await page.waitForFunction(() => { + const selectorImg = document.querySelector('canvas'); + const selectorUrl = selectorImg.closest('[data-ref]'); + return selectorUrl.getAttribute('data-ref'); + }); + } + + const result = await page + .evaluate(() => { + const selectorImg = document.querySelector('canvas'); + const selectorUrl = selectorImg.closest('[data-ref]'); + + if (selectorImg != null && selectorUrl != null) { + let data = { + base64Image: selectorImg.toDataURL(), + urlCode: selectorUrl.getAttribute('data-ref'), + }; + return data; + } else { + return undefined; + } + }) + .catch(() => undefined); + + return result; +} diff --git a/src/api/helpers/scrape-login.ts b/src/api/helpers/scrape-login.ts new file mode 100644 index 000000000..e20a8297d --- /dev/null +++ b/src/api/helpers/scrape-login.ts @@ -0,0 +1,34 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +import { Page } from 'puppeteer'; +export async function scrapeLogin(page: Page): Promise { + const result = await page.evaluate(() => { + const count = document.querySelector('._9a59P'); + let data: boolean; + data = false; + if (count != null) { + const text = count.textContent, + timeNumber = text.match('Invalid'); + if (timeNumber) { + data = true; + } + return data; + } + }); + return result; +} diff --git a/src/api/helpers/select-sticker.ts b/src/api/helpers/select-sticker.ts new file mode 100644 index 000000000..2dae6e10d --- /dev/null +++ b/src/api/helpers/select-sticker.ts @@ -0,0 +1,77 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +import sharp from 'sharp'; + +interface selectOutput { + webpBase64: string; + metadata: { + width?: number; + height?: number; + }; +} + +export async function stickerSelect(_B: Buffer, _t: number) { + let _w: sharp.Sharp, _ins: Buffer; + switch (_t) { + case 0: + _ins = await sharp(_B, { failOnError: false }) + .resize({ width: 512, height: 512 }) + .toBuffer(); + _w = sharp(_ins, { failOnError: false }).webp(); + break; + case 1: + _w = sharp(_B, { animated: true }).webp(); + break; + default: + console.error('Enter a valid number 0 or 1'); + return false; + } + + const metadata = await _w.metadata(); + + if (metadata.width > 512 || metadata.pageHeight > 512) { + console.error( + `Invalid image size (max 512x512):${metadata.width}x${metadata.pageHeight}` + ); + return false; + } + + const obj: selectOutput = { + webpBase64: (await _w.toBuffer()).toString('base64'), + metadata: { + width: metadata.width, + height: metadata.pageHeight, + }, + }; + + return obj; +} + +interface CreateSize { + width?: number; + height?: number; +} +export async function resizeImg(buff: Buffer, size: CreateSize) { + const _ins = await sharp(buff, { failOnError: false }) + .resize({ width: size.width, height: size.height }) + .toBuffer(), + _w = sharp(_ins, { failOnError: false }).jpeg(), + _webb64 = (await _w.toBuffer()).toString('base64'); + + return _webb64; +} diff --git a/src/api/layers/README.md b/src/api/layers/README.md new file mode 100644 index 000000000..90434ccbc --- /dev/null +++ b/src/api/layers/README.md @@ -0,0 +1,14 @@ +# Layers + +## Each layer should extends the previous one in the next order + +1. Host layer +2. Profile layer +3. Listener layer +4. Sender layer +5. Retriever layer +6. Group layer +7. Controls layer +8. Business layer (Optional) + +**Controls layer** should be enough diff --git a/src/api/layers/business.layer.ts b/src/api/layers/business.layer.ts new file mode 100644 index 000000000..5a6dcf8f2 --- /dev/null +++ b/src/api/layers/business.layer.ts @@ -0,0 +1,259 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +import { Page } from 'puppeteer'; +import { ControlsLayer } from './controls.layer'; +import { CreateConfig } from '../../config/create-config'; +import { evaluateAndReturn } from '../helpers'; +import { BusinessProfileModel } from '@wppconnect/wa-js/dist/whatsapp'; +import { Chat } from '../model'; + +export class BusinessLayer extends ControlsLayer { + constructor(public page: Page, session?: string, options?: CreateConfig) { + super(page, session, options); + } + + /** + * Querys product catalog + * @param id Buisness profile id ('00000@c.us') + */ + public async getBusinessProfilesProducts(id: string) { + return evaluateAndReturn( + this.page, + ({ id }) => WAPI.getBusinessProfilesProducts(id), + { id } + ); + } + /** + * Get Business Profile + * @param id Buisness profile id ('00000@c.us') + */ + public async getBusinessProfile(id: string) { + return evaluateAndReturn( + this.page, + async ({ id }) => { + return JSON.parse( + JSON.stringify(await WPP.contact.getBusinessProfile(id)) + ); + }, + { id } + ); + } + /** + * Querys order catalog + * @param messageId string + * @returns Message object + */ + public async getOrderbyMsg(messageId: string) { + return evaluateAndReturn( + this.page, + ({ messageId }) => WAPI.getOrderbyMsg(messageId), + { messageId } + ); + } + + /** + * Update your business profile + * + * @example + * ```javascript + * await client.editBusinessProfile({description: 'New description for profile'}); + * ``` + * + * ```javascript + * await client.editBusinessProfile({categories: { + id: "133436743388217", + localized_display_name: "Artes e entretenimento", + not_a_biz: false, + }}); + * ``` + * + * ```javascript + * await client.editBusinessProfile({address: 'Street 01, New York'}); + * ``` + * + * ```javascript + * await client.editBusinessProfile({email: 'test@test.com.br'}); + * ``` + * + * Change website of profile (max 2 sites) + * ```javascript + * await client.editBusinessProfile({website: [ + "https://www.wppconnect.io", + "https://www.teste2.com.br", +]}); + * ``` + * + * Change businessHours for Specific Hours + * ```javascript + * await client.editBusinessProfile({ businessHours: { + * { + tue: { + mode: "specific_hours", + hours: [ + [ + 540, + 1080, + ], + ], + }, + wed: { + mode: "specific_hours", + hours: [ + [ + 540, + 1080, + ], + ], + }, + thu: { + mode: "specific_hours", + hours: [ + [ + 540, + 1080, + ], + ], + }, + fri: { + mode: "specific_hours", + hours: [ + [ + 540, + 1080, + ], + ], + }, + sat: { + mode: "specific_hours", + hours: [ + [ + 540, + 1080, + ], + ], + }, + sun: { + mode: "specific_hours", + hours: [ + [ + 540, + 1080, + ], + ], + }, + } + }, + timezone: "America/Sao_Paulo" + }); + * + * Change businessHours for Always Opened + * ```javascript + * await client.editBusinessProfile({ businessHours: { + { + mon: { + mode: "open_24h", + }, + tue: { + mode: "open_24h", + }, + wed: { + mode: "open_24h", + }, + thu: { + mode: "open_24h", + }, + fri: { + mode: "open_24h", + }, + sat: { + mode: "open_24h", + }, + sun: { + mode: "open_24h", + }, + } + timezone: "America/Sao_Paulo" + }); + * + * Change businessHours for Appointment Only + * ```javascript + * await client.editBusinessProfile({ businessHours: { { + mon: { + mode: "appointment_only", + }, + tue: { + mode: "appointment_only", + }, + wed: { + mode: "appointment_only", + }, + thu: { + mode: "appointment_only", + }, + fri: { + mode: "appointment_only", + }, + sat: { + mode: "appointment_only", + }, + sun: { + mode: "appointment_only", + }, + } + timezone: "America/Sao_Paulo" + }); + * + * + * ``` + */ + public async editBusinessProfile(options: any) { + return await evaluateAndReturn( + this.page, + async ({ options }) => { + return JSON.parse( + JSON.stringify(await WPP.profile.editBusinessProfile(options)) + ); + }, + { options } + ); + } + + /** + * Sends product with product image to given chat id + * @param to Chat id + * @param base64 Base64 image data + * @param caption Message body + * @param businessId Business id number that owns the product ('0000@c.us') + * @param productId Product id, see method getBusinessProfilesProducts for more info + */ + public async sendImageWithProduct( + to: string, + base64: string, + caption: string, + businessId: string, + productId: string + ) { + return evaluateAndReturn( + this.page, + ({ to, base64, businessId, caption, productId }) => { + WAPI.sendImageWithProduct(base64, to, caption, businessId, productId); + }, + { to, base64, businessId, caption, productId } + ); + } +} diff --git a/src/api/layers/catalog.layer.ts b/src/api/layers/catalog.layer.ts new file mode 100644 index 000000000..6a639ca0d --- /dev/null +++ b/src/api/layers/catalog.layer.ts @@ -0,0 +1,318 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +import { Page } from 'puppeteer'; +import { CreateConfig } from '../../config/create-config'; +import { evaluateAndReturn } from '../helpers'; +import { HostLayer } from './host.layer'; +import { CommunityLayer } from './community.layer'; + +export class CatalogLayer extends CommunityLayer { + constructor(public page: Page, session?: string, options?: CreateConfig) { + super(page, session, options); + } + + /** + * Create a product on catalog + * @param name Product name + * @param image Product image + * @param description Product description + * @param price Product price + * @param isHidden Product visibility + * @param url Product url + * @param retailerId Product own ID system + * @param currency Product currency + * @example + * ```javascript + * client.createtProduct( + * 'Product name', + * 'image in base64', + * 'product description', + * '89.90', + * true, + * 'https://wppconnect.io', + * 'AKA001', + * ); + * ``` + */ + public async createProduct( + name: string, + image: string, + description: string, + price: number, + isHidden: boolean, + url: string, + retailerId: string, + currency: string + ) { + return evaluateAndReturn( + this.page, + ({ + name, + image, + description, + price, + isHidden, + url, + retailerId, + currency, + }) => + WPP.catalog.createProduct({ + name, + image, + description, + price, + isHidden, + url, + retailerId, + currency, + }), + { name, image, description, price, isHidden, url, retailerId, currency } + ); + } + /** + * Querys all products + * @param id Buisness profile id ('00000@c.us') + * @param qnt limit to load products - Default: 10 + */ + public async getProducts(id: string, qnt: number) { + return evaluateAndReturn( + this.page, + ({ id, qnt }) => WPP.catalog.getProducts(id, qnt), + { id, qnt } + ); + } + + /** + * Create a new product on catalog + * @param id Buisness profile id ('00000@c.us') + * @param productId ID of Product + */ + public async getProductById(id: string, productId: string) { + return evaluateAndReturn( + this.page, + ({ id, productId }) => WPP.catalog.getProductById(id, productId), + { id, productId } + ); + } + + /** + * Edit product on catalog + * @param productId Product ID + * @param options Object with options + * @example + * ```javascript + * client.editProduct('56989897878' { + * name: 'Product name', + * description: 'product description', + * price: '89.90', + * isHidden: true, + * url: 'https://wppconnect.io', + * retailerId: 'AKA001', + * }); + * ``` + */ + public async editProduct(productId: string, options: string) { + return evaluateAndReturn( + this.page, + ({ productId, options }) => WPP.catalog.editProduct(productId, options), + { productId, options } + ); + } + /** + * Delete product(s) on catalog + * @param productsId Products ID + * @example + * ```javascript + * //Delete one product + * client.delProducts(['56989897878']); + * + * // Delete various products + * client.delProducts(['56989897878','565657878']); + * ``` + */ + public async delProducts(productsId: string[]) { + return evaluateAndReturn( + this.page, + ({ productsId }) => WPP.catalog.delProducts(productsId), + { productsId } + ); + } + + /** + * Add image on product This function change main image of product, for change additional images use client.addImage + * @param productId Product ID + * @param image Image in base64 + * @example + * ```javascript + * client.changeProductImage('56989897878', 'base64/string'); + * ``` + */ + public async changeProductImage(productId: string, image: string) { + return evaluateAndReturn( + this.page, + ({ productId, image }) => + WPP.catalog.changeProductImage(productId, image), + { productId, image } + ); + } + + /** + * Add image on product This function include additional images on product for change main image use client.changeProductImage + * @param productId Product ID + * @param image Image in base64 + * @example + * ```javascript + * client.addProductImage('56989897878', 'base64/string'); + * ``` + */ + public async addProductImage(productId: string, image: string) { + return evaluateAndReturn( + this.page, + ({ productId, image }) => WPP.catalog.addProductImage(productId, image), + { productId, image } + ); + } + + /** + * Remove image on product This function remove additional images of product for change main image use client.changeProductImage + * @param productId Product ID + * @param index Index array of additional imagens + * @example + * ```javascript + * client.removeProductImage('56989897878', '1'); + * ``` + */ + public async removeProductImage(productId: string, index: string) { + return evaluateAndReturn( + this.page, + ({ productId, index }) => + WPP.catalog.removeProductImage(productId, index), + { productId, index } + ); + } + + /** + * Query all collections + * @param id Product ID + * @param qnt Max qnt collections - Default 10 + * @param maxProducts Max products in array products of collection - Default 10 + * @example + * ```javascript + * client.getCollections('5521988556558@c.us', '10','20'); + * ``` + */ + public async getCollections(id: string, qnt: string, maxProducts: string) { + return evaluateAndReturn( + this.page, + ({ id, qnt, maxProducts }) => + WPP.catalog.getCollections(id, qnt, maxProducts), + { id, qnt, maxProducts } + ); + } + + /** + * Create new collection + * @param collectionName Product ID + * @param productsId Index array of additional imagens + * @example + * ```javascript + * client.createCollection('Name of collection', ['655632565','5689859898']); + * ``` + */ + public async createCollection(collectionName: string, productsId: string) { + return evaluateAndReturn( + this.page, + ({ collectionName, productsId }) => + WPP.catalog.createCollection(collectionName, productsId), + { collectionName, productsId } + ); + } + + /** + * Edit a collection + * @param collectionId Collection id + * @param options Options arguments + * @example + * ```javascript + * client.editCollection('656565898', { + * collectionName: 'New Name for collection', + * productsToAdd: ['5656523223'], + * productsToRemove: ['5656523232'] + * }); + * ``` + */ + public async editCollection(collectionId: string, options: string) { + return evaluateAndReturn( + this.page, + ({ collectionId, options }) => + WPP.catalog.editCollection(collectionId, options), + { collectionId, options } + ); + } + + /** + * Delete a collection + * @param collectionId Collection id + * @param options Options arguments + * @example + * ```javascript + * client.deleteCollection('65666565898'); + * ``` + */ + public async deleteCollection(collectionId: string) { + return evaluateAndReturn( + this.page, + ({ collectionId }) => WPP.catalog.deleteCollection(collectionId), + { collectionId } + ); + } + + /** + * Set product visibility + * @param productId Product id + * @param value True for visibility, false for non visible + * @example + * ```javascript + * client.setProductVisibility('65666565898', false); + * ``` + */ + public async setProductVisibility(productId: string, value: boolean) { + return evaluateAndReturn( + this.page, + ({ productId, value }) => + WPP.catalog.setProductVisibility(productId, value), + { productId, value } + ); + } + + /** + * Update options to customer cart your products + * @param value True for enabled, false for non enabled + * @example + * ```javascript + * client.updateCartEnabled(false); + * ``` + */ + public async updateCartEnabled(value: boolean) { + return evaluateAndReturn( + this.page, + ({ value }) => WPP.catalog.updateCartEnabled(value), + { value } + ); + } +} diff --git a/src/api/layers/community.layer.ts b/src/api/layers/community.layer.ts new file mode 100644 index 000000000..101f5cace --- /dev/null +++ b/src/api/layers/community.layer.ts @@ -0,0 +1,154 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +import { Page } from 'puppeteer'; +import { CreateConfig } from '../../config/create-config'; +import { evaluateAndReturn } from '../helpers'; +import { Wid } from '../model'; +import { NewsletterLayer } from './newsletter.layer'; + +export class CommunityLayer extends NewsletterLayer { + constructor(public page: Page, session?: string, options?: CreateConfig) { + super(page, session, options); + } + + /** + * Create a community + * + * @category Community + * @param groupIds Array with groups id + */ + public async createCommunity( + name: string, + description: string, + groupIds: string[] | Wid[] + ): Promise { + return evaluateAndReturn( + this.page, + (name, description, groupIds) => + WPP.community.create(name, description, groupIds), + name, + description, + groupIds + ); + } + + /** + * Deactivate a community + * @category Community + * @param communityId id + */ + public async deactivateCommunity(communityId: string | Wid): Promise { + return evaluateAndReturn( + this.page, + (communityId) => WPP.community.deactivate(communityId), + communityId + ); + } + + /** + * Add groups to community + * + * @category Community + * @param communityId id + */ + public async addSubgroupsCommunity( + communityId: string | Wid, + groupsIds: string[] + ): Promise { + return evaluateAndReturn( + this.page, + (communityId, groupsIds) => + WPP.community.addSubgroups(communityId, groupsIds), + communityId, + groupsIds + ); + } + + /** + * Remove groups of community + * + * @category Community + * @param communityId id + */ + public async removeSubgroupsCommunity( + communityId: string | Wid, + groupsIds: string[] + ): Promise { + return evaluateAndReturn( + this.page, + (communityId, groupsIds) => + WPP.community.removeSubgroups(communityId, groupsIds), + communityId, + groupsIds + ); + } + + /** + * Remove admin of community participant + * + * @category Community + * @param communityId id + */ + public async demoteCommunityParticipant( + communityId: string | Wid, + participantId: string[] | string + ): Promise { + return evaluateAndReturn( + this.page, + (communityId, participantId) => + WPP.community.demoteParticipants(communityId, participantId), + communityId, + participantId + ); + } + + /** + * Promote participant of community to admin + * + * @category Community + * @param communityId id + */ + public async promoteCommunityParticipant( + communityId: string | Wid, + participantId: string[] | string + ): Promise { + return evaluateAndReturn( + this.page, + (communityId, participantId) => + WPP.community.promoteParticipants(communityId, participantId), + communityId, + participantId + ); + } + + /** + * Get all participants of a community + * + * @category Community + * @param communityId id + */ + public async getCommunityParticipants( + communityId: string | Wid + ): Promise { + return evaluateAndReturn( + this.page, + (communityId) => WPP.community.getParticipants(communityId), + communityId + ); + } +} diff --git a/src/api/layers/controls.layer.ts b/src/api/layers/controls.layer.ts new file mode 100644 index 000000000..df1db56f6 --- /dev/null +++ b/src/api/layers/controls.layer.ts @@ -0,0 +1,299 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +import { EditMessageOptions } from '@wppconnect/wa-js/dist/chat/functions/editMessage'; +import { MsgKey } from '@wppconnect/wa-js/dist/whatsapp'; +import { Page } from 'puppeteer'; +import { CreateConfig } from '../../config/create-config'; +import { evaluateAndReturn } from '../helpers'; +import { UILayer } from './ui.layer'; +import { Message } from '../model'; + +export class ControlsLayer extends UILayer { + constructor(public page: Page, session?: string, options?: CreateConfig) { + super(page, session, options); + } + + /** + * Unblock contact + * @category Blocklist + * @param contactId {string} id '000000000000@c.us' + * @returns boolean + */ + public async unblockContact(contactId: string) { + await evaluateAndReturn( + this.page, + (contactId) => WPP.blocklist.unblockContact(contactId), + contactId + ); + + return true; + } + + /** + * Block contact + * @category Blocklist + * @param contactId {string} id '000000000000@c.us' + * @returns boolean + */ + public async blockContact(contactId: string) { + await evaluateAndReturn( + this.page, + (contactId) => WPP.blocklist.blockContact(contactId), + contactId + ); + + return true; + } + + /** + * puts the chat as unread + * @category Chat + * @param contactId {string} id '000000000000@c.us' + * @returns boolean + */ + public async markUnseenMessage(contactId: string) { + await evaluateAndReturn( + this.page, + (contactId) => WPP.chat.markIsUnread(contactId), + contactId + ); + return true; + } + + /** + * Deletes the given chat + * @category Chat + * @param chatId {string} id '000000000000@c.us' + * @returns boolean + */ + public async deleteChat(chatId: string) { + const result = await evaluateAndReturn( + this.page, + (chatId) => WPP.chat.delete(chatId), + chatId + ); + return result.status === 200; + } + + /** + * Archive and unarchive chat messages with true or false + * @category Chat + * @param chatId {string} id '000000000000@c.us' + * @param option {boolean} true or false + * @returns boolean + */ + public async archiveChat(chatId: string, option: boolean = true) { + return evaluateAndReturn( + this.page, + ({ chatId, option }) => WPP.chat.archive(chatId, option), + { chatId, option } + ); + } + + /** + * Pin and Unpin chat messages with true or false + * @category Chat + * @param chatId {string} id '000000000000@c.us' + * @param option {boolean} true or false + * @param nonExistent {boolean} Pin chat, non-existent (optional) + * @returns object + */ + public async pinChat(chatId: string, option: boolean, nonExistent?: boolean) { + if (nonExistent) { + await evaluateAndReturn( + this.page, + ({ chatId }) => WPP.chat.find(chatId), + { chatId } + ); + } + + return await evaluateAndReturn( + this.page, + ({ chatId, option }) => WPP.chat.pin(chatId, option), + { chatId, option } + ); + } + + /** + * Deletes all messages of given chat + * @category Chat + * @param chatId + * @param keepStarred Keep starred messages + * @returns boolean + */ + public async clearChat(chatId: string, keepStarred = true) { + const result = await evaluateAndReturn( + this.page, + ({ chatId, keepStarred }) => WPP.chat.clear(chatId, keepStarred), + { chatId, keepStarred } + ); + + return result.status === 200; + } + + /** + * Deletes message of given message id + * @category Chat + * @param chatId The chat id from which to delete the message. + * @param messageId The specific message id of the message to be deleted + * @param onlyLocal If it should only delete locally (message remains on the other recipienct's phone). Defaults to false. + */ + public async deleteMessage( + chatId: string, + messageId: string[] | string, + onlyLocal = false, + deleteMediaInDevice = true + ) { + await evaluateAndReturn( + this.page, + ({ chatId, messageId, onlyLocal, deleteMediaInDevice }) => + WPP.chat.deleteMessage( + chatId, + messageId, + deleteMediaInDevice, + !onlyLocal + ), + { chatId, messageId, onlyLocal, deleteMediaInDevice } + ); + + return true; + } + + /** + * Edits message of given message id + * @category Chat + * @param msgId The specific message id of the message to be edited + * @param newText New content of specified message + * @param options Common message options + * + * @example + * ```javascript + * // Simple message + * client.editMessage('true_@c.us_messageId', 'new Text For Simple Message'); + * ``` + */ + public async editMessage( + msgId: string | MsgKey, + newText: string, + options: EditMessageOptions = {} + ) { + const editResult = await evaluateAndReturn( + this.page, + ({ msgId, newText, options }) => + WPP.chat.editMessage(msgId, newText, options), + { msgId, newText, options } + ); + + const result = (await evaluateAndReturn( + this.page, + async ({ messageId }) => { + return JSON.parse(JSON.stringify(await WAPI.getMessageById(messageId))); + }, + { messageId: editResult.id } + )) as Message; + + if (result.body !== newText) throw editResult; + + return result; + } + + /** + * Stars message of given message id + * @category Chat + * @param messagesId The specific message id of the message to be starred + * @param star Add or remove star of the message. Defaults to true. + */ + public async starMessage( + messagesId: string[] | string, + star = true + ): Promise { + return await evaluateAndReturn( + this.page, + ({ messagesId, star }) => WAPI.starMessages(messagesId, star), + { messagesId, star } + ); + } + + /** + * Allow only admin to send messages with true or false + * @category Group + * @param chatId {string} id '000000000000@c.us' + * @param option {boolean} true or false + * @returns boolean + */ + public async setMessagesAdminsOnly(chatId: string, option: boolean) { + return evaluateAndReturn( + this.page, + ({ chatId, option }) => WAPI.setMessagesAdminsOnly(chatId, option), + { chatId, option } + ); + } + + /** + * Enable or disable temporary messages with true or false + * @category Chat + * @param chatOrGroupId id '000000000000@c.us' or '000000-000000@g.us' + * @param value true or false + * @returns boolean + */ + public async setTemporaryMessages(chatOrGroupId: string, value: boolean) { + return await evaluateAndReturn( + this.page, + ({ chatOrGroupId, value }) => + WAPI.setTemporaryMessages(chatOrGroupId, value), + { chatOrGroupId, value } + ); + } + + /** + * Change limits of whatsapp web + * * @example + * ```javascript + * //Change the maximum size (bytes) for uploading media (max 70MB) + * WPP.conn.setLimit('maxMediaSize',16777216); + * + * //Change the maximum size (bytes) for uploading files (max 1GB) + * WPP.conn.setLimit('maxFileSize',104857600); + * + * //Change the maximum number of contacts that can be selected when sharing (Default 5) + * WPP.conn.setLimit('maxShare',100); + * + * //Change the maximum time (seconds) of a video status + * WPP.conn.setLimit('statusVideoMaxDuration',120); + * + * //Remove pinned conversation limit (only whatsapp web) (Default 3) + * WPP.conn.setLimit('unlimitedPin',true); + * ``` + * @category Chat + */ + public async setLimit( + key: + | 'maxMediaSize' + | 'maxFileSize' + | 'maxShare' + | 'statusVideoMaxDuration' + | 'unlimitedPin', + value: boolean | number + ) { + return await evaluateAndReturn( + this.page, + ({ key, value }) => WPP.conn.setLimit(key as any, value), + { key, value } + ); + } +} diff --git a/src/api/layers/group.layer.ts b/src/api/layers/group.layer.ts new file mode 100644 index 000000000..9c8196667 --- /dev/null +++ b/src/api/layers/group.layer.ts @@ -0,0 +1,452 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +import { Page } from 'puppeteer'; +import { CreateConfig } from '../../config/create-config'; +import { + evaluateAndReturn, + base64MimeType, + fileToBase64, + downloadFileToBase64, +} from '../helpers'; +import { Id, Wid } from '../model'; +import { GroupProperty } from '../model/enum'; +import { RetrieverLayer } from './retriever.layer'; + +export class GroupLayer extends RetrieverLayer { + constructor(public page: Page, session?: string, options?: CreateConfig) { + super(page, session, options); + } + + /** + * Removes the host device from the group + * @category Group + * @param groupId group id + */ + public async leaveGroup(groupId: string) { + return evaluateAndReturn( + this.page, + (groupId) => WPP.group.leave(groupId), + groupId + ); + } + + /** + * Retrieves group members as [Id] objects + * @category Group + * @param groupId group id + */ + public async getGroupMembersIds(groupId: string): Promise { + return evaluateAndReturn( + this.page, + (groupId: string) => + Promise.resolve(WPP.group.getParticipants(groupId)).then( + (participants) => participants.map((p) => p.id as any) + ), + groupId + ); + } + + /** + * Returns group members [Contact] objects + * @category Group + * @param groupId + */ + public async getGroupMembers(groupId: string) { + const membersIds = await this.getGroupMembersIds(groupId); + const actions = membersIds.map((memberId) => { + return this.getContact(memberId._serialized); + }); + return Promise.all(actions); + } + + /** + * Generates group-invite link + * @category Group + * @param chatId + * @returns Invitation link + */ + public async getGroupInviteLink(chatId: string) { + const code = await evaluateAndReturn( + this.page, + (chatId) => WPP.group.getInviteCode(chatId), + chatId + ); + + return `https://chat.whatsapp.com/${code}`; + } + + /** + * Revokes group-invite link and generate new one. + * @category Group + * @param chatId + * @returns Invitation link + */ + public async revokeGroupInviteLink(chatId: string) { + const code = await evaluateAndReturn( + this.page, + (chatId) => WPP.group.revokeInviteCode(chatId), + chatId + ); + + return `https://chat.whatsapp.com/${code}`; + } + + /** + * Generates group-invite link + * @category Group + * @param inviteCode + * @returns Invite code from group link. Example: CMJYfPFqRyE2GxrnkldYED + */ + public async getGroupInfoFromInviteLink(inviteCode: string) { + inviteCode = inviteCode.replace('chat.whatsapp.com/', ''); + inviteCode = inviteCode.replace('invite/', ''); + inviteCode = inviteCode.replace('https://', ''); + inviteCode = inviteCode.replace('http://', ''); + return await evaluateAndReturn( + this.page, + (inviteCode) => WPP.group.getGroupInfoFromInviteCode(inviteCode), + inviteCode + ); + } + + /** + * Creates a new chat group + * @category Group + * @param groupName Group name + * @param contacts Contacts that should be added. + */ + public async createGroup(groupName: string, contacts: string | string[]) { + return await evaluateAndReturn( + this.page, + ({ groupName, contacts }) => WPP.group.create(groupName, contacts, null), + { groupName, contacts } + ); + } + + /** + * Removes participant from group + * @category Group + * @param groupId Chat id ('0000000000-00000000@g.us') + * @param participantId Participant id'000000000000@c.us' + */ + public async removeParticipant( + groupId: string, + participantId: string | string[] + ) { + return await evaluateAndReturn( + this.page, + ({ groupId, participantId }) => + WPP.group.removeParticipants(groupId, participantId), + { groupId, participantId } + ); + } + + /** + * Adds participant to Group + * @category Group + * @param groupId Chat id ('0000000000-00000000@g.us') + * @param participantId Participant id'000000000000@c.us' + */ + public async addParticipant( + groupId: string, + participantId: string | string[] + ) { + return await evaluateAndReturn( + this.page, + ({ groupId, participantId }) => + WPP.group.addParticipants(groupId, participantId), + { groupId, participantId } + ); + } + + /** + * Promotes participant as Admin in given group + * @category Group + * @param groupId Chat id ('0000000000-00000000@g.us') + * @param participantId Participant id'000000000000@c.us' + */ + public async promoteParticipant( + groupId: string, + participantId: string | string[] + ) { + await evaluateAndReturn( + this.page, + ({ groupId, participantId }) => + WPP.group.promoteParticipants(groupId, participantId), + { groupId, participantId } + ); + + return true; + } + + /** + * Demotes admin privileges of participant + * @category Group + * @param groupId Chat id ('0000000000-00000000@g.us') + * @param participantId Participant id'000000000000@c.us' + */ + public async demoteParticipant( + groupId: string, + participantId: string | string[] + ) { + return await evaluateAndReturn( + this.page, + ({ groupId, participantId }) => + WPP.group.demoteParticipants(groupId, participantId), + { groupId, participantId } + ); + + return true; + } + + /** + * Retrieves group admins + * @category Group + * @param chatId Group/Chat id ('0000000000-00000000@g.us') + */ + public async getGroupAdmins(chatId: string) { + const participants = await evaluateAndReturn( + this.page, + (chatId) => + Promise.resolve(WPP.group.getParticipants(chatId)).then( + (participants) => participants.map((p) => p.toJSON()) + ), + chatId + ); + + return participants.filter((p) => p.isAdmin).map((p) => p.id); + } + /** + * Join a group with invite code + * @category Group + * @param inviteCode + */ + public async joinGroup(inviteCode: string) { + inviteCode = inviteCode.replace('chat.whatsapp.com/', ''); + inviteCode = inviteCode.replace('invite/', ''); + inviteCode = inviteCode.replace('https://', ''); + inviteCode = inviteCode.replace('http://', ''); + return await evaluateAndReturn( + this.page, + (inviteCode) => WPP.group.join(inviteCode), + inviteCode + ); + } + + /** + * Set group description (if allowed) + * @category Group + * @param groupId Group ID ('000000-000000@g.us') + * @param description New group description + * @returns empty object + */ + public async setGroupDescription(groupId: string, description: string) { + return await evaluateAndReturn( + this.page, + ({ groupId, description }) => + WPP.group.setDescription(groupId, description), + { groupId, description } + ); + } + + /** + * Set group subject (if allowed) + * @category Group + * @param groupId Group ID ('000000-000000@g.us') + * @param title New group subject + * @returns empty object + */ + public async setGroupSubject(groupId: string, title: string) { + return await evaluateAndReturn( + this.page, + ({ groupId, title }) => WPP.group.setSubject(groupId, title), + { groupId, title } + ); + } + + /** + * Enable or disable group properties, see {@link GroupProperty for details} + * @category Group + * @param groupId Group ID ('000000-000000@g.us') + * @param property + * @param value true or false + * @returns empty object + */ + public async setGroupProperty( + groupId: string, + property: GroupProperty, + value: boolean + ) { + return await evaluateAndReturn( + this.page, + ({ groupId, property, value }) => + WPP.group.setProperty(groupId, property, value), + { groupId, property, value } + ); + } + + /** + * Set group icon + * @category Group + * @param groupId Group ID ('000000-000000@g.us') + * @param base64 Image in base64 ( data:image/jpeg;base64,..... ) + * @returns empty object + */ + public async setGroupIcon(groupId: string, pathOrBase64: string) { + let base64: string = ''; + if (pathOrBase64.startsWith('data:')) { + base64 = pathOrBase64; + } else { + let fileContent = await downloadFileToBase64(pathOrBase64, [ + 'image/gif', + 'image/png', + 'image/jpg', + 'image/jpeg', + 'image/webp', + ]); + if (!fileContent) { + fileContent = await fileToBase64(pathOrBase64); + } + if (fileContent) { + base64 = fileContent; + } + } + + if (!base64) { + const error = new Error('Empty or invalid file or base64'); + Object.assign(error, { + code: 'empty_file', + }); + throw error; + } + + const mimeInfo = base64MimeType(base64); + + if (!mimeInfo || !mimeInfo.includes('image')) { + const error = new Error( + 'Not an image, allowed formats png, jpeg and webp' + ); + Object.assign(error, { + code: 'invalid_image', + }); + throw error; + } + + return await evaluateAndReturn( + this.page, + ({ groupId, base64 }) => WPP.group.setIcon(groupId, base64), + { groupId, base64 } + ); + } + /** + * Set group subject (if allowed) + * @category Group + * @param groupId Group ID ('0000000000@g.us') + * @returns empty object + */ + public async removeGroupIcon(groupId: string) { + if (!groupId) { + throw new Error('Empty or invalid group id'); + } + + return await evaluateAndReturn( + this.page, + ({ groupId }) => WPP.group.removeIcon(groupId), + { groupId } + ); + } + + /** + * Get the max number of participants for a group + * @category Group + * @returns number + */ + public async getGroupSizeLimit() { + return await evaluateAndReturn(this.page, () => + WPP.group.getGroupSizeLimit() + ); + } + + /** + * Approve a membership request to group + * @category Group + * @param groupId Group ID ('000000-000000@g.us') + * @param wid @c.us + * @returns Promise + */ + public async approveGroupMembershipRequest( + groupId: string, + membershipIds: string | string[] + ): Promise< + { + error: any; + wid: Wid; + }[] + > { + return await evaluateAndReturn( + this.page, + ({ groupId, membershipIds }) => WPP.group.approve(groupId, membershipIds), + { groupId, membershipIds } + ); + } + + /** + * Reject a membership request to group + * @category Group + * @param groupId Group ID ('000000-000000@g.us') + * @param wid @c.us + * @returns Promise + */ + public async rejectGroupMembershipRequest( + groupId: string, + membershipIds: string | string[] + ): Promise< + { + error: any; + wid: Wid; + }[] + > { + return await evaluateAndReturn( + this.page, + ({ groupId, membershipIds }) => WPP.group.reject(groupId, membershipIds), + { groupId, membershipIds } + ); + } + + /** + * Retrieve a list of a membership approval requests + * @category Group + * @param groupId Group ID ('000000-000000@g.us') + * @returns Promise + */ + public async getGroupMembershipRequests(groupId: string): Promise< + { + addedBy: Wid; + id: Wid; + parentGroupId?: Wid; + requestMethod: 'InviteLink' | 'LinkedGroupJoin' | 'NonAdminAdd'; + t: number; + }[] + > { + return await evaluateAndReturn( + this.page, + ({ groupId }) => WPP.group.getMembershipRequests(groupId), + { groupId } + ); + } +} diff --git a/src/api/layers/host.layer.ts b/src/api/layers/host.layer.ts new file mode 100644 index 000000000..01c048f0d --- /dev/null +++ b/src/api/layers/host.layer.ts @@ -0,0 +1,599 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +import { Page } from 'puppeteer'; +import { Logger } from 'winston'; +import { CreateConfig, defaultOptions } from '../../config/create-config'; +import { + asciiQr, + isAuthenticated, + isInsideChat, + needsToScan, +} from '../../controllers/auth'; +import { initWhatsapp, injectApi } from '../../controllers/browser'; +import { defaultLogger, LogLevel } from '../../utils/logger'; +import { sleep } from '../../utils/sleep'; +import { evaluateAndReturn, scrapeImg } from '../helpers'; +import { + CatchQRCallback, + HostDevice, + LinkByCodeCallback, + LoadingScreenCallback, + StatusFindCallback, +} from '../model'; +import { SocketState } from '../model/enum'; +import { ScrapQrcode } from '../model/qrcode'; + +export class HostLayer { + readonly session: string; + readonly options: CreateConfig; + readonly logger: Logger; + + protected autoCloseInterval = null; + protected autoCloseCalled = false; + + protected isInitialized = false; + protected isInjected = false; + protected isStarted = false; + protected isLogged = false; + protected isInChat = false; + protected checkStartInterval?: NodeJS.Timer = null; + protected urlCode = ''; + protected attempt = 0; + + public catchQR?: CatchQRCallback = null; + public statusFind?: StatusFindCallback = null; + public onLoadingScreen?: LoadingScreenCallback = null; + public catchLinkCode?: LinkByCodeCallback = null; + + constructor(public page: Page, session?: string, options?: CreateConfig) { + this.session = session; + this.options = { ...defaultOptions, ...options }; + + this.logger = this.options.logger || defaultLogger; + + this.log('info', 'Initializing...'); + this.initialize(); + } + + protected log(level: LogLevel, message: string, meta: object = {}) { + this.logger.log({ + level, + message, + session: this.session, + type: 'client', + ...meta, + }); + } + + protected async initialize() { + this.page.on('close', () => { + this.cancelAutoClose(); + this.log('verbose', 'Page Closed', { type: 'page' }); + }); + + this.page.on('load', () => { + this.log('verbose', 'Page loaded', { type: 'page' }); + this.afterPageLoad(); + }); + + this.isInitialized = true; + } + + protected async afterPageLoad() { + this.log('verbose', 'Injecting wapi.js'); + + const options = { + deviceName: this.options.deviceName, + disableGoogleAnalytics: this.options.disableGoogleAnalytics, + googleAnalyticsId: this.options.googleAnalyticsId, + linkPreviewApiServers: this.options.linkPreviewApiServers, + poweredBy: this.options.poweredBy, + }; + + await evaluateAndReturn( + this.page, + (options) => { + (window as any).WPPConfig = options; + }, + options + ); + + this.isInjected = false; + + await injectApi(this.page, this.onLoadingScreen) + .then(() => { + this.isInjected = true; + this.log('verbose', 'wapi.js injected'); + this.afterPageScriptInjected(); + }) + .catch((e) => { + console.log(e); + this.log('verbose', 'wapi.js failed'); + }); + } + + protected async afterPageScriptInjected() { + this.getWAVersion() + .then((version) => { + this.log('info', `WhatsApp WEB version: ${version}`); + }) + .catch(() => null); + this.getWAJSVersion() + .then((version) => { + this.log('info', `WA-JS version: ${version}`); + }) + .catch(() => null); + + evaluateAndReturn(this.page, () => { + WPP.on('conn.auth_code_change', (window as any).checkQrCode); + }).catch(() => null); + evaluateAndReturn(this.page, () => { + WPP.on('conn.main_ready', (window as any).checkInChat); + }).catch(() => null); + this.checkInChat(); + this.checkQrCode(); + } + + public async start() { + if (this.isStarted) { + return; + } + + this.isStarted = true; + + await initWhatsapp( + this.page, + null, + false, + this.options.whatsappVersion, + this.log.bind(this) + ); + + await this.page.exposeFunction('checkQrCode', () => this.checkQrCode()); + /*await this.page.exposeFunction('loginByCode', (phone: string) => + this.loginByCode(phone) + );*/ + await this.page.exposeFunction('checkInChat', () => this.checkInChat()); + + this.checkStartInterval = setInterval(() => this.checkStart(), 5000); + + this.page.on('close', () => { + clearInterval(this.checkStartInterval as NodeJS.Timeout); + }); + } + + protected async checkStart() { + needsToScan(this.page) + .then((need) => {}) + .catch(() => null); + } + + protected async checkQrCode() { + const needScan = await needsToScan(this.page).catch(() => null); + + this.isLogged = !needScan; + if (!needScan) { + this.attempt = 0; + return; + } + + const result = await this.getQrCode(); + + if (!result?.urlCode || this.urlCode === result.urlCode) { + return; + } + if (typeof this.options.phoneNumber === 'string') { + return this.loginByCode(this.options.phoneNumber); + } + this.urlCode = result.urlCode; + this.attempt++; + + let qr = ''; + + if (this.options.logQR || this.catchQR) { + qr = await asciiQr(this.urlCode); + } + + if (this.options.logQR) { + this.log( + 'info', + `Waiting for QRCode Scan (Attempt ${this.attempt})...:\n${qr}`, + { code: this.urlCode } + ); + } else { + this.log('verbose', `Waiting for QRCode Scan: Attempt ${this.attempt}`); + } + + this.catchQR?.(result.base64Image, qr, this.attempt, result.urlCode); + } + + protected async loginByCode(phone: string) { + const code = await evaluateAndReturn( + this.page, + async ({ phone }) => { + return JSON.parse( + JSON.stringify(await WPP.conn.genLinkDeviceCodeForPhoneNumber(phone)) + ); + }, + { phone } + ); + if (this.options.logQR) { + this.log('info', `Waiting for Login By Code (Code: ${code})\n`); + } else { + this.log('verbose', `Waiting for Login By Code`); + } + this.catchLinkCode?.(code); + } + + protected async checkInChat() { + const inChat = await isInsideChat(this.page).catch(() => null); + + this.isInChat = !!inChat; + + if (!inChat) { + return; + } + this.log('http', 'Connected'); + this.statusFind?.('inChat', this.session); + } + + protected tryAutoClose() { + if (this.autoCloseInterval) { + this.cancelAutoClose(); + } + + if ( + (this.options.autoClose > 0 || this.options.deviceSyncTimeout > 0) && + !this.autoCloseInterval && + !this.page.isClosed() + ) { + this.log('info', 'Closing the page'); + this.autoCloseCalled = true; + this.statusFind && this.statusFind('autocloseCalled', this.session); + try { + this.page.close(); + } catch (error) {} + } + } + + protected startAutoClose(time: number | null = null) { + if (time === null || time === undefined) { + time = this.options.autoClose; + } + + if (time > 0 && !this.autoCloseInterval) { + const seconds = Math.round(time / 1000); + this.log('info', `Auto close configured to ${seconds}s`); + + let remain = seconds; + this.autoCloseInterval = setInterval(() => { + if (this.page.isClosed()) { + this.cancelAutoClose(); + return; + } + remain -= 1; + if (remain % 10 === 0 || remain <= 5) { + this.log('http', `Auto close remain: ${remain}s`); + } + if (remain <= 0) { + this.tryAutoClose(); + } + }, 1000); + } + } + + protected cancelAutoClose() { + clearInterval(this.autoCloseInterval); + this.autoCloseInterval = null; + } + + public async getQrCode() { + let qrResult: ScrapQrcode | undefined; + + qrResult = await scrapeImg(this.page).catch(() => undefined); + + return qrResult; + } + + public async waitForQrCodeScan() { + if (!this.isStarted) { + throw new Error('waitForQrCodeScan error: Session not started'); + } + while (!this.page.isClosed() && !this.isLogged) { + await sleep(200); + const needScan = await needsToScan(this.page).catch(() => null); + this.isLogged = !needScan; + } + } + + public async waitForInChat() { + if (!this.isStarted) { + throw new Error('waitForInChat error: Session not started'); + } + + if (!this.isLogged) { + return false; + } + + const start = Date.now(); + + while (!this.page.isClosed() && this.isLogged && !this.isInChat) { + if ( + this.options.deviceSyncTimeout > 0 && + Date.now() - start >= this.options.deviceSyncTimeout + ) { + return false; + } + + await sleep(1000); + const inChat = isInsideChat(this.page).catch(() => null); + this.isInChat = !!inChat; + } + return this.isInChat; + } + + public async waitForPageLoad() { + while (!this.isInjected) { + await sleep(200); + } + + await this.page.waitForFunction(() => WPP.isReady).catch(() => {}); + } + + public async waitForLogin() { + this.log('http', 'Waiting page load'); + + await this.waitForPageLoad(); + + this.log('http', 'Checking is logged...'); + let authenticated = await isAuthenticated(this.page).catch(() => null); + + this.startAutoClose(); + + if (authenticated === false) { + this.log( + 'http', + typeof this.options.phoneNumber === 'string' + ? 'Waiting for Login by Code...' + : 'Waiting for QRCode Scan...' + ); + this.statusFind?.('notLogged', this.session); + await this.waitForQrCodeScan(); + + this.log( + 'http', + typeof this.options.phoneNumber === 'string' + ? 'Checking Login by Code status...' + : 'Checking QRCode status...' + ); + // Wait for interface update + await sleep(200); + authenticated = await isAuthenticated(this.page).catch(() => null); + + if (authenticated === null) { + this.log('warn', 'Failed to authenticate'); + this.statusFind?.('qrReadError', this.session); + } else if (authenticated) { + this.log('http', 'Login with success'); + this.statusFind?.('qrReadSuccess', this.session); + } else { + this.log('warn', 'Login Fail'); + this.statusFind?.('qrReadFail', this.session); + this.tryAutoClose(); + throw 'Failed to read the QRCode'; + } + } else if (authenticated === true) { + this.log('http', 'Authenticated'); + this.statusFind?.('isLogged', this.session); + } + + if (authenticated === true) { + // Reinicia o contador do autoclose + this.cancelAutoClose(); + // Wait for interface update + await sleep(200); + this.startAutoClose(this.options.deviceSyncTimeout); + this.log('http', 'Checking phone is connected...'); + const inChat = await this.waitForInChat(); + + if (!inChat) { + this.log('warn', 'Phone not connected'); + this.statusFind?.('phoneNotConnected', this.session); + this.tryAutoClose(); + throw 'Phone not connected'; + } + this.cancelAutoClose(); + return true; + } + + if (authenticated === false) { + this.tryAutoClose(); + this.log('warn', 'Not logged'); + throw 'Not logged'; + } + + this.tryAutoClose(); + + if (this.autoCloseCalled) { + this.log('error', 'Auto Close Called'); + throw 'Auto Close Called'; + } + + if (this.page.isClosed()) { + this.log('error', 'Page Closed'); + throw 'Page Closed'; + } + + this.log('error', 'Unknow error'); + throw 'Unknow error'; + } + + /** + * @category Host + * @returns Current host device details + */ + public async getHostDevice(): Promise { + return await evaluateAndReturn(this.page, () => WAPI.getHost()); + } + + /** + * @category Host + * @returns Current wid connected + */ + public async getWid(): Promise { + return await evaluateAndReturn(this.page, () => WAPI.getWid()); + } + + /** + * Retrieves WA version + * @category Host + */ + public async getWAVersion() { + await this.page + .waitForFunction(() => WAPI.getWAVersion()) + .catch(() => null); + + return await evaluateAndReturn(this.page, () => WAPI.getWAVersion()); + } + + /** + * Retrieves WA-JS version + * @category Host + */ + public async getWAJSVersion() { + await this.page.waitForFunction(() => WPP.version).catch(() => null); + + return await evaluateAndReturn(this.page, () => WPP.version); + } + + /** + * Retrieves the connecction state + * @category Host + */ + public async getConnectionState(): Promise { + return await evaluateAndReturn(this.page, () => { + return WPP.whatsapp.Socket.state as SocketState; + }); + } + + /** + * Retrieves if the phone is online. Please note that this may not be real time. + * @category Host + */ + public async isConnected() { + return await evaluateAndReturn(this.page, () => WAPI.isConnected()); + } + + /** + * Check is online + * @category Host + */ + public async isOnline(): Promise { + return await evaluateAndReturn(this.page, () => WPP.conn.isOnline()); + } + + /** + * Retrieves if the phone is online. Please note that this may not be real time. + * @category Host + */ + public async isLoggedIn() { + return await evaluateAndReturn(this.page, () => WAPI.isLoggedIn()); + } + + /** + * Retrieves Battery Level + * @category Host + */ + public async getBatteryLevel() { + return await evaluateAndReturn(this.page, () => WAPI.getBatteryLevel()); + } + + /** + * Start phone Watchdog, forcing the phone connection verification. + * + * @category Host + * @param interval interval number in miliseconds + */ + public async startPhoneWatchdog(interval: number = 15000) { + return await evaluateAndReturn( + this.page, + (interval) => WAPI.startPhoneWatchdog(interval), + interval + ); + } + + /** + * Stop phone Watchdog, more details in {@link startPhoneWatchdog} + * @category Host + */ + public async stopPhoneWatchdog(interval: number) { + return await evaluateAndReturn(this.page, () => WAPI.stopPhoneWatchdog()); + } + + /** + * Check the current session is an MultiDevice session + * @category Host + */ + public async isMultiDevice() { + return await evaluateAndReturn(this.page, () => WPP.conn.isMultiDevice()); + } + /** + * Retrieve main interface is authenticated, loaded and synced + * @category Host + */ + public async isMainReady() { + return await evaluateAndReturn(this.page, () => WPP.conn.isMainReady()); + } + + /** + * Retrieve if is authenticated + * @category Host + */ + public async isAuthenticated() { + return await evaluateAndReturn(this.page, () => WPP.conn.isAuthenticated()); + } + + /** + * Retrieve if main interface is authenticated and loaded, bot not synced + * @category Host + */ + public async isMainLoaded() { + return await evaluateAndReturn(this.page, () => WPP.conn.isMainLoaded()); + } + + /** + * Retrieve if main interface is initializing + * @category Host + */ + public async isMainInit() { + return await evaluateAndReturn(this.page, () => WPP.conn.isMainInit()); + } + + /** + * Join or leave of WhatsApp Web beta program. + * Will return the value seted + * @category Host + */ + public async joinWebBeta(value: boolean): Promise { + return await evaluateAndReturn( + this.page, + (value) => WPP.conn.joinWebBeta(value), + value + ); + } +} diff --git a/src/api/layers/labels.layer.ts b/src/api/layers/labels.layer.ts new file mode 100644 index 000000000..1bcf0a665 --- /dev/null +++ b/src/api/layers/labels.layer.ts @@ -0,0 +1,146 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +import { Page } from 'puppeteer'; +import { CreateConfig } from '../../config/create-config'; +import { evaluateAndReturn } from '../helpers'; +import { CatalogLayer } from './catalog.layer'; + +export class LabelsLayer extends CatalogLayer { + constructor(public page: Page, session?: string, options?: CreateConfig) { + super(page, session, options); + } + /** + * Create New Label + * @category Labels + * + * @example + * ```javascript + * client.addNewLabel(`Name of label`); + * //or + * client.addNewLabel(`Name of label`, { labelColor: '#dfaef0' }); + * //or + * client.addNewLabel(`Name of label`, { labelColor: 4292849392 }); + * ``` + * @param name Name of label + * @param options options of label + */ + public async addNewLabel(name: string, options?: string) { + return await evaluateAndReturn( + this.page, + ({ name, options }) => { + WPP.labels.addNewLabel(name, options); + }, + { name, options } + ); + } + /** + * Add or delete label of chatId + * @category Labels + * + * @example + * ```javascript + * client.addOrRemoveLabels(['[number]@c.us','[number]@c.us'], + * [ + * { labelId:'76', type:'add' }, + * { labelId:'75', type:'remove' } + * ]); + * //or + * ``` + * @param chatIds ChatIds + * @param options options to remove or add + */ + public async addOrRemoveLabels( + chatIds: string, + options: { + labelId: string; + type: 'add' | 'remove'; + }[] + ) { + return await evaluateAndReturn( + this.page, + ({ chatIds, options }) => { + WPP.labels.addOrRemoveLabels(chatIds, options); + }, + { chatIds, options } + ); + } + /** + * Get all Labels + * + * @example + * ```javascript + * client.getAllLabels(); + * ``` + */ + public async getAllLabels() { + return evaluateAndReturn(this.page, () => WPP.labels.getAllLabels()); + } + + /** + * Get Label by id + * @category Labels + * @param id - Id of label + * + * @example + * ```javascript + * client.getLabelById('1'); + * ``` + */ + public async getLabelById(id: string) { + return await evaluateAndReturn( + this.page, + ({ id }) => { + WPP.labels.getLabelById(id); + }, + { id } + ); + } + /** + * Delete all Labels + * @category Labels + * + * @example + * ```javascript + * client.deleteAllLabels(); + * ``` + */ + public async deleteAllLabels() { + return await evaluateAndReturn(this.page, () => { + WPP.labels.deleteAllLabels(); + }); + } + /** + * Add or delete label of chatId + * @category Labels + * + * @example + * ```javascript + * client.deleteLabel(); + * ``` + * @param id Id or string to labels to delete + */ + public async deleteLabel(id: string | string[]) { + return await evaluateAndReturn( + this.page, + ({ id }) => { + WPP.labels.deleteLabel(id); + }, + { id } + ); + } +} diff --git a/src/api/layers/listener.layer.ts b/src/api/layers/listener.layer.ts new file mode 100644 index 000000000..51e0898c7 --- /dev/null +++ b/src/api/layers/listener.layer.ts @@ -0,0 +1,681 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +import { EventEmitter, captureRejectionSymbol } from 'events'; +import { Page } from 'puppeteer'; +import { CreateConfig } from '../../config/create-config'; +import { evaluateAndReturn } from '../helpers'; +import { ExposedFn } from '../helpers/exposed.enum'; +import { + Ack, + Chat, + LiveLocation, + Message, + ParticipantEvent, + PresenceEvent, + Wid, + IncomingCall, +} from '../model'; +import { MessageType, SocketState, SocketStream } from '../model/enum'; +import { InterfaceMode } from '../model/enum/interface-mode'; +import { InterfaceState } from '../model/enum/interface-state'; +import { ProfileLayer } from './profile.layer'; +import { Label } from '../model/label'; +import { MsgKey } from '@wppconnect/wa-js/dist/whatsapp'; + +declare global { + interface Window { + onMessage: any; + onAnyMessage: any; + onStateChange: any; + onStreamChange: any; + onIncomingCall: any; + onAck: any; + } +} + +export class ListenerLayer extends ProfileLayer { + private listenerEmitter = new EventEmitter({ + captureRejections: true, + }); + + constructor(public page: Page, session?: string, options?: CreateConfig) { + super(page, session, options); + + this.listenerEmitter.setMaxListeners(0); + + this.listenerEmitter.on(ExposedFn.onInterfaceChange, (state) => { + this.log('http', `Current state: ${state.mode} (${state.displayInfo})`); + }); + this.listenerEmitter[captureRejectionSymbol] = ( + reason: any, + event: string + ) => { + let message = `Unhandled Rejection in a ${event} event: `; + if (reason instanceof Error) { + if (reason.stack) { + message += reason.stack; + } else { + message += reason.toString(); + } + } else { + message += JSON.stringify(reason); + } + this.log('error', reason); + }; + } + + protected async afterPageScriptInjected() { + await super.afterPageScriptInjected(); + + const functions = [ + ...Object.values(ExposedFn), + 'onAddedToGroup', + 'onIncomingCall', + 'onRevokedMessage', + 'onReactionMessage', + 'onPollResponse', + 'onUpdateLabel', + 'onOrderStatusUpdate', + ]; + + for (const func of functions) { + const has = await this.page + .evaluate((func) => typeof window[func] === 'function', func) + .catch(() => false); + + if (!has) { + this.log('debug', `Exposing ${func} function`); + await this.page + .exposeFunction(func, (...args) => { + Promise.resolve().then(() => { + const count = this.listenerEmitter.listenerCount(func); + if (count > 0) { + this.log( + 'debug', + `Emitting ${func} event (${count} registered)` + ); + } + this.listenerEmitter.emit(func, ...args); + }); + }) + .catch(() => {}); + } + } + + await this.page + .evaluate(() => { + try { + if (!window['onMessage'].exposed) { + WPP.on('chat.new_message', (msg) => { + if (msg.isSentByMe || msg.isStatusV3) { + return; + } + const serialized = WAPI.processMessageObj(msg, false, false); + if (serialized) { + window['onMessage'](serialized); + } + }); + + window['onMessage'].exposed = true; + } + } catch (error) { + console.error(error); + } + try { + if (!window['onAck'].exposed) { + window.WAPI.waitNewAcknowledgements(window['onAck']); + window['onAck'].exposed = true; + } + } catch (error) { + console.error(error); + } + try { + if (!window['onAnyMessage'].exposed) { + WPP.on('chat.new_message', (msg) => { + const serialized = WAPI.processMessageObj(msg, true, false); + if (serialized) { + window['onAnyMessage'](serialized); + } + }); + window['onAnyMessage'].exposed = true; + } + } catch (error) { + console.error(error); + } + try { + if (!window['onStateChange'].exposed) { + window.WAPI.onStateChange(window['onStateChange']); + window['onStateChange'].exposed = true; + } + } catch (error) { + console.error(error); + } + try { + if (!window['onStreamChange'].exposed) { + window.WAPI.onStreamChange(window['onStreamChange']); + window['onStreamChange'].exposed = true; + } + } catch (error) { + console.error(error); + } + try { + if (!window['onAddedToGroup'].exposed) { + window.WAPI.onAddedToGroup(window['onAddedToGroup']); + window['onAddedToGroup'].exposed = true; + } + } catch (error) { + console.error(error); + } + try { + if (!window['onIncomingCall'].exposed) { + window.WAPI.onIncomingCall(window['onIncomingCall']); + window['onIncomingCall'].exposed = true; + } + } catch (error) { + console.error(error); + } + try { + if (!window['onInterfaceChange'].exposed) { + window.WAPI.onInterfaceChange(window['onInterfaceChange']); + window['onInterfaceChange'].exposed = true; + } + } catch (error) { + console.error(error); + } + try { + if (!window['onNotificationMessage'].exposed) { + window.WAPI.onNotificationMessage(window['onNotificationMessage']); + window['onNotificationMessage'].exposed = true; + } + } catch (error) { + console.error(error); + } + try { + if (!window['onPresenceChanged'].exposed) { + WPP.on('chat.presence_change', window['onPresenceChanged']); + window['onPresenceChanged'].exposed = true; + } + } catch (error) { + console.error(error); + } + try { + if (!window['onLiveLocation'].exposed) { + window.WAPI.onLiveLocation(window['onLiveLocation']); + window['onLiveLocation'].exposed = true; + } + } catch (error) { + console.error(error); + } + try { + if (!window['onRevokedMessage'].exposed) { + WPP.on('chat.msg_revoke', (data) => { + const eventData = { + author: data.author, + from: data.from, + to: data.to, + id: data.id._serialized, + refId: data.refId._serialized, + }; + window['onRevokedMessage'](eventData); + }); + window['onRevokedMessage'].exposed = true; + } + } catch (error) { + console.error(error); + } + try { + if (!window['onReactionMessage'].exposed) { + WPP.on('chat.new_reaction', (data) => { + const eventData = { + id: data.id, + msgId: data.msgId, + reactionText: data.reactionText, + read: data.read, + orphan: data.orphan, + orphanReason: data.orphanReason, + timestamp: data.timestamp, + }; + window['onReactionMessage'](eventData); + }); + window['onReactionMessage'].exposed = true; + } + } catch (error) { + console.error(error); + } + try { + if (!window['onPollResponse'].exposed) { + WPP.on('chat.poll_response', (data) => { + const eventData = { + msgId: data.msgId, + chatId: data.chatId, + selectedOptions: data.selectedOptions, + timestamp: data.timestamp, + sender: data.sender, + }; + window['onPollResponse'](eventData); + }); + window['onPollResponse'].exposed = true; + } + } catch (error) { + console.error(error); + } + try { + if (!window['onUpdateLabel'].exposed) { + WPP.on('chat.update_label', (data) => { + const eventData = { + chat: data.chat, + ids: data.ids, + labels: data.labels, + type: data.type, + }; + window['onUpdateLabel'](eventData); + }); + window['onUpdateLabel'].exposed = true; + } + } catch (error) { + console.error(error); + } + try { + if (!window['onOrderStatusUpdate'].exposed) { + WPP.on('order.payment_status', (data) => { + const eventData = { + method: data.method, + timestamp: data.timestamp, + reference_id: data.reference_id, + msgId: data.msgId, + }; + window['onOrderStatusUpdate'](eventData); + }); + window['onOrderStatusUpdate'].exposed = true; + } + } catch (error) { + console.error(error); + } + try { + if (!window['onParticipantsChanged'].exposed) { + WPP.on('group.participant_changed', (participantChangedEvent) => { + window['onParticipantsChanged'](participantChangedEvent); + }); + window['onParticipantsChanged'].exposed = true; + } + } catch (error) { + console.error(error); + } + }) + .catch(() => {}); + } + + /** + * Register the event and create a disposable object to stop the listening + * @param event Name of event + * @param listener The function to execute + * @returns Disposable object to stop the listening + */ + protected registerEvent( + event: string | symbol, + listener: (...args: any[]) => void + ) { + this.log('debug', `Registering ${event.toString()} event`); + this.listenerEmitter.on(event, listener); + return { + dispose: () => { + this.listenerEmitter.off(event, listener); + }, + }; + } + + /** + * @event Listens to all new messages received only. + * @returns Disposable object to stop the listening + */ + public onMessage(callback: (message: Message) => void) { + return this.registerEvent(ExposedFn.OnMessage, callback); + } + + /** + * @event Listens to all new messages, sent and received. + * @param to callback + * @fires Message + * @returns Disposable object to stop the listening + */ + public onAnyMessage(callback: (message: Message) => void) { + return this.registerEvent(ExposedFn.OnAnyMessage, callback); + } + + /** + * @event Listens to all notification messages, like group changes, join, leave + * @param to callback + * @fires Message + * @returns Disposable object to stop the listening + */ + public onNotificationMessage(callback: (message: Message) => void) { + return this.registerEvent(ExposedFn.onNotificationMessage, callback); + } + + /** + * @event Listens List of mobile states + * @returns Disposable object to stop the listening + */ + public onStateChange(callback: (state: SocketState) => void) { + return this.registerEvent(ExposedFn.onStateChange, callback); + } + + /** + * @event Returns the current state of the connection + * @returns Disposable object to stop the listening + */ + public onStreamChange(callback: (state: SocketStream) => void) { + return this.registerEvent(ExposedFn.onStreamChange, callback); + } + + /** + * @event Listens to interface mode change See {@link InterfaceState} and {@link InterfaceMode} for details + * @returns Disposable object to stop the listening + */ + public onInterfaceChange( + callback: (state: { + displayInfo: InterfaceState; + mode: InterfaceMode; + }) => void + ) { + return this.registerEvent(ExposedFn.onInterfaceChange, callback); + } + + /** + * @event Listens to messages acknowledgement Changes + * @returns Disposable object to stop the listening + */ + public onAck(callback: (ack: Ack) => void) { + return this.registerEvent(ExposedFn.onAck, callback); + } + + /** + * Escuta os eventos de Localização em tempo real de todos os chats + * @event Eventos de Localização em tempo real + * @param callback Função para ser executada quando houver alterações + * @returns Objeto descartável para parar de ouvir + */ + public onLiveLocation(callback: (liveLocationEvent: LiveLocation) => void): { + dispose: () => void; + }; + /** + * Escuta os eventos de Localização em tempo real + * @event Eventos de Localização em tempo real + * @param id Único ID ou lista de IDs de contatos para acompanhar a localização + * @param callback Função para ser executada quando houver alterações + * @returns Objeto descartável para parar de ouvir + */ + public onLiveLocation( + id: string | string[], + callback: (liveLocationEvent: LiveLocation) => void + ): { dispose: () => void }; + public onLiveLocation( + id: any, + callback?: (liveLocationEvent: LiveLocation) => void + ) { + const ids: string[] = []; + + if (typeof id === 'function') { + callback = id; + } else if (Array.isArray(id)) { + ids.push(...id); + } else { + ids.push(id); + } + + return this.registerEvent( + ExposedFn.onLiveLocation, + (event: LiveLocation) => { + // Only group events + if (ids.length && !ids.includes(event.id)) { + return; + } + callback(event); + } + ); + } + + /** + * @event Listens to participants changed + * @param to callback + * @returns Stream of ParticipantEvent + */ + public onParticipantsChanged(callback: (evData: ParticipantEvent) => void): { + dispose: () => void; + }; + /** + * @event Listens to participants changed + * @param to group id: xxxxx-yyyy@us.c + * @param to callback + * @returns Stream of ParticipantEvent + */ + public onParticipantsChanged( + groupId: string, + callback: (evData: ParticipantEvent) => void + ): { dispose: () => void }; + public onParticipantsChanged( + groupId: any, + callback?: (evData: ParticipantEvent) => void + ): { dispose: () => void } { + if (typeof groupId === 'function') { + callback = groupId; + groupId = null; + } + + return this.registerEvent(ExposedFn.onParticipantsChanged, (evData) => { + if (groupId && groupId !== evData.groupId) { + return; + } + callback({ + by: evData.author, + byPushName: evData.authorPushName, + groupId: evData.groupId, + action: evData.action, + operation: evData.operation, + who: evData.participants, + }); + }); + } + + /** + * @event Fires callback with Chat object every time the host phone is added to a group. + * @param to callback + * @returns Disposable object to stop the listening + */ + public onAddedToGroup(callback: (chat: Chat) => any) { + return this.registerEvent('onAddedToGroup', callback); + } + + /** + * @event Listen for incoming calls, whether audio or video (pending a reaction). + * To reject the call, simply call `rejectCall` {@link rejectCall} + * @returns Disposable object to stop listening + */ + public onIncomingCall(callback: (call: IncomingCall) => any) { + return this.registerEvent('onIncomingCall', callback); + } + + /** + * Listens to presence changed, by default, it will be triggered for active chats only or contacts subscribed (see {@link subscribePresence}) + * @event Listens to presence changed + * @param callback Callback of on presence changed + * @returns Disposable object to stop the listening + */ + public onPresenceChanged( + callback: (presenceChangedEvent: PresenceEvent) => void + ): { dispose: () => void }; + /** + * Listens to presence changed, the callback will triggered only for passed IDs + * @event Listens to presence changed + * @param id contact id (xxxxx@c.us) or group id: xxxxx-yyyy@g.us + * @param callback Callback of on presence changed + * @returns Disposable object to stop the listening + */ + public onPresenceChanged( + id: string | string[], + callback: (presenceChangedEvent: PresenceEvent) => void + ): { dispose: () => void }; + public onPresenceChanged( + id: any, + callback?: (presenceChangedEvent: PresenceEvent) => void + ): { dispose: () => void } { + const ids = []; + + if (typeof id === 'function') { + callback = id; + } else if (Array.isArray(id)) { + ids.push(...id); + } else { + ids.push(id); + } + + if (ids.length) { + this.subscribePresence(ids); + } + + return this.registerEvent( + ExposedFn.onPresenceChanged, + (presence: PresenceEvent) => { + // Only group events + if (ids.length && !ids.includes(presence.id)) { + return; + } + callback(presence); + } + ); + } + + /** + * Subscribe presence of a contact or group to use in onPresenceChanged (see {@link onPresenceChanged}) + * + * ```typescript + * // subcribe all contacts + * const contacts = await client.getAllContacts(); + * await client.subscribePresence(contacts.map((c) => c.id._serialized)); + * + * // subcribe all groups participants + * const chats = await client.getAllGroups(false); + * for (const c of chats) { + * const ids = c.groupMetadata.participants.map((p) => p.id._serialized); + * await client.subscribePresence(ids); + * } + * ``` + * + * @param id contact id (xxxxx@c.us) or group id: xxxxx-yyyy@g.us + * @returns number of subscribed + */ + public async subscribePresence(id: string | string[]): Promise { + return await evaluateAndReturn( + this.page, + (id) => WAPI.subscribePresence(id), + id + ); + } + /** + * Unsubscribe presence of a contact or group to use in onPresenceChanged (see {@link onPresenceChanged}) + * @param id contact id (xxxxx@c.us) or group id: xxxxx-yyyy@g.us + * @returns number of unsubscribed + */ + public async unsubscribePresence(id: string | string[]): Promise { + return await evaluateAndReturn( + this.page, + (id) => WAPI.unsubscribePresence(id), + id + ); + } + + /** + * @event Listens to revoked messages + * @returns Disposable object to stop the listening + */ + public onRevokedMessage( + callback: (data: { + author?: string; + from: string; + to: string; + id: string; + refId: String; + }) => any + ) { + return this.registerEvent('onRevokedMessage', callback); + } + + /** + * @event Listens to reaction messages + * @returns Disposable object to stop the listening + */ + public onReactionMessage( + callback: (data: { + id: string; + msgId: string; + reactionText: string; + read: boolean; + orphan: number; + orphanReason: any; + timestamp: number; + }) => any + ) { + return this.registerEvent('onReactionMessage', callback); + } + + /** + * @event Listens to poll response messages + * @returns Disposable object to stop the listening + */ + public onPollResponse( + callback: (data: { + msgId: string; + chatId: Wid; + selectedOptions: any; + timestamp: number; + sender: Wid; + }) => any + ) { + return this.registerEvent('onPollResponse', callback); + } + + /** + * @event Listens to update label + * @returns Disposable object to stop the listening + */ + public onUpdateLabel( + callback: (data: { + chat: Chat; + ids: string[]; + labels: Label[]; + type: 'add' | 'remove'; + }) => any + ) { + return this.registerEvent('onUpdateLabel', callback); + } + + /** + * @event Listens to update order status + * @returns Disposable object to stop the listening + */ + public onOrderStatusUpdate( + callback: (data: { + method: string; + timestamp: number; + reference_id: string; + msgId: MsgKey; + }) => any + ) { + return this.registerEvent('onOrderStatusUpdate', callback); + } +} diff --git a/src/api/layers/newsletter.layer.ts b/src/api/layers/newsletter.layer.ts new file mode 100644 index 000000000..6f6133694 --- /dev/null +++ b/src/api/layers/newsletter.layer.ts @@ -0,0 +1,112 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +import { Page } from 'puppeteer'; +import { CreateConfig } from '../../config/create-config'; +import { evaluateAndReturn } from '../helpers'; +import { HostLayer } from './host.layer'; + +export class NewsletterLayer extends HostLayer { + constructor(public page: Page, session?: string, options?: CreateConfig) { + super(page, session, options); + } + + /** + * Create Newsletter + * @category Newsletter + * + * @example + * ```javascript + * client.createNewsletter('Name for your newsletter', {description: 'Description for that', picture: ' WPP.newsletter.create(name, options), + name, + options + ); + } + + /** + * Destroy a Newsletter + * @category Newsletter + * + * @example + * ```javascript + * client.destroyNewsletter('[newsletter-id]@newsletter'); + * ``` + * @param name id of Newsletter + */ + public async destroyNewsletter(id: string) { + return evaluateAndReturn(this.page, (id) => WPP.newsletter.destroy(id), id); + } + + /** + * Edit a Newsletter + * @category Newsletter + * + * @example + * ```javascript + * client.editNewsletter('[newsletter-id]@newsletter', { + description: 'new description'; + name: 'new name'; + picture: ''; + }); + * ``` + * @param name id of Newsletter + */ + public async editNewsletter( + id: string, + opts?: { + description?: string; + name?: string; + picture?: string | null; + } + ) { + return evaluateAndReturn( + this.page, + (id, opts) => WPP.newsletter.edit(id, opts), + id, + opts + ); + } + + /** + * Mute a Newsletter + * @category Newsletter + * + * @example + * ```javascript + * client.muteNewsletter('[newsletter-id]@newsletter'); + * ``` + * @param name id of Newsletter + */ + public async muteNesletter(id: string) { + return evaluateAndReturn(this.page, (id) => WPP.newsletter.mute(id), id); + } +} diff --git a/src/api/layers/profile.layer.ts b/src/api/layers/profile.layer.ts new file mode 100644 index 000000000..30bfe5446 --- /dev/null +++ b/src/api/layers/profile.layer.ts @@ -0,0 +1,169 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +import { Page } from 'puppeteer'; +import { HostLayer } from './host.layer'; +import { + base64MimeType, + fileToBase64, + downloadFileToBase64, + resizeImg, + evaluateAndReturn, +} from '../helpers'; +import { CreateConfig } from '../../config/create-config'; +import { StatusLayer } from './status.layer'; + +export class ProfileLayer extends StatusLayer { + constructor(public page: Page, session?: string, options?: CreateConfig) { + super(page, session, options); + } + + /** + * @category Chat + * @param contactsId Example: 0000@c.us | [000@c.us, 1111@c.us] + * @param time duration of silence + * @param type kind of silence "hours" "minutes" "year" + * To remove the silence, just enter the contact parameter + */ + public async sendMute( + id: string, + time: number, + type: string + ): Promise { + const result = await evaluateAndReturn( + this.page, + (id, time, type) => WAPI.sendMute(id, time, type), + id, + time, + type + ); + if (result['erro'] == true) { + throw result; + } + return result; + } + + /** + * Change the theme + * @category Host + * @param string types "dark" or "light" + */ + public setTheme(type: string) { + return evaluateAndReturn(this.page, (type) => WAPI.setTheme(type), type); + } + + /** + * Sets current user profile status + * @category Profile + * @param status + */ + public async setProfileStatus(status: string) { + return await evaluateAndReturn( + this.page, + ({ status }) => { + WPP.profile.setMyStatus(status); + }, + { status } + ); + } + + /** + * Sets the user's current profile photo + * @category Profile + * @param name + */ + public async setProfilePic(pathOrBase64: string, to?: string) { + let base64: string = ''; + + if (pathOrBase64.startsWith('data:')) { + base64 = pathOrBase64; + } else { + let fileContent = await downloadFileToBase64(pathOrBase64, [ + 'image/gif', + 'image/png', + 'image/jpg', + 'image/jpeg', + 'image/webp', + ]); + if (!fileContent) { + fileContent = await fileToBase64(pathOrBase64); + } + if (fileContent) { + base64 = fileContent; + } + } + + if (!base64) { + const error = new Error('Empty or invalid file or base64'); + Object.assign(error, { + code: 'empty_file', + }); + throw error; + } + + const mimeInfo = base64MimeType(base64); + + if (!mimeInfo || !mimeInfo.includes('image')) { + const error = new Error( + 'Not an image, allowed formats png, jpeg and webp' + ); + Object.assign(error, { + code: 'invalid_image', + }); + throw error; + } + + const buff = Buffer.from( + base64.replace(/^data:image\/(png|jpe?g|webp);base64,/, ''), + 'base64' + ); + let _webb64_96 = await resizeImg(buff, { width: 96, height: 96 }), + _webb64_640 = await resizeImg(buff, { width: 640, height: 640 }); + let obj = { a: _webb64_640, b: _webb64_96 }; + + return await evaluateAndReturn( + this.page, + ({ obj, to }) => WAPI.setProfilePic(obj, to), + { + obj, + to, + } + ); + } + + /** + * Sets current user profile name + * @category Profile + * @param name + */ + public async setProfileName(name: string) { + return await evaluateAndReturn( + this.page, + ({ name }) => WPP.profile.setMyProfileName(name), + { name } + ); + } + /** + * Remove your profile picture + * @category Profile + */ + public async removeMyProfilePicture() { + return await evaluateAndReturn(this.page, () => + WPP.profile.removeMyProfilePicture() + ); + } +} diff --git a/src/api/layers/retriever.layer.ts b/src/api/layers/retriever.layer.ts new file mode 100644 index 000000000..d952b1119 --- /dev/null +++ b/src/api/layers/retriever.layer.ts @@ -0,0 +1,636 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +import { Page } from 'puppeteer'; +import { CreateConfig } from '../../config/create-config'; +import { SessionToken } from '../../token-store'; +import { evaluateAndReturn } from '../helpers'; +import { + Chat, + Contact, + ContactStatus, + ProfilePicThumbObj, + WhatsappProfile, + Wid, +} from '../model'; +import { SenderLayer } from './sender.layer'; +import { ChatListOptions } from '@wppconnect/wa-js/dist/chat'; + +export class RetrieverLayer extends SenderLayer { + constructor(public page: Page, session?: string, options?: CreateConfig) { + super(page, session, options); + } + + /** + * Returns a list of mute and non-mute users + * @category Chat + * @param type return type: all, toMute and noMute. + * @returns obj + */ + public async getListMutes(type?: string): Promise { + return await evaluateAndReturn( + this.page, + (type: string) => WAPI.getListMute(type), + type + ); + } + + /** + * Returns browser session token + * @category Host + * @returns obj [token] + */ + public async getSessionTokenBrowser( + removePath?: boolean + ): Promise { + if (removePath === true) { + await evaluateAndReturn(this.page, () => { + window['pathSession'] = true; + }); + } + if (await this.isMultiDevice()) { + return await this.page + .evaluate(() => { + if (window.localStorage) { + return { + WABrowserId: + window.localStorage.getItem('WABrowserId') || 'MultiDevice', + WASecretBundle: 'MultiDevice', + WAToken1: 'MultiDevice', + WAToken2: 'MultiDevice', + }; + } + return null; + }) + .catch(() => null); + } + return await this.page + .evaluate(() => { + if (window.localStorage) { + return { + WABrowserId: window.localStorage.getItem('WABrowserId'), + WASecretBundle: window.localStorage.getItem('WASecretBundle'), + WAToken1: window.localStorage.getItem('WAToken1'), + WAToken2: window.localStorage.getItem('WAToken2'), + }; + } + return null; + }) + .catch(() => null); + } + + /** + * Receive the current theme + * @category Host + * @returns string light or dark + */ + public async getTheme() { + return await evaluateAndReturn(this.page, () => WAPI.getTheme()); + } + + /** + * Receive all blocked contacts + * @category Blocklist + * @returns array of [0,1,2,3....] + */ + public async getBlockList() { + return await evaluateAndReturn(this.page, () => + WPP.blocklist.all().map((b) => b.toString()) + ); + } + + /** + * Retrieves all chats + * Deprecated in favor of {@link listChats} + * + * @category Chat + * @returns array of [Chat] + * @deprecated Deprecated in favor of listChats. + */ + public async getAllChats(withNewMessageOnly = false) { + this.logger.warn( + 'Deprecated: This function [getAllChats] is deprecated in favor of the listChats function. Please update your code accordingly.' + ); + if (withNewMessageOnly) { + return evaluateAndReturn(this.page, () => WAPI.getAllChatsWithNewMsg()); + } else { + return evaluateAndReturn(this.page, () => WAPI.getAllChats()); + } + } + + /** + * Return list of chats + * * @example + * ```javascript + * // All chats + * const chats = await client.listChats(); + * + * // Some chats + * const chats = client.listChats({count: 20}); + * + * // 20 chats before specific chat + * const chats = client.listChats({count: 20, direction: 'before', id: '[number]@c.us'}); + * + * // Only users chats + * const chats = await client.listChats({onlyUsers: true}); + * + * // Only groups chats + * const chats = await client.listChats({onlyGroups: true}); + * + * // Only with label Text + * const chats = await client.listChats({withLabels: ['Test']}); + * + * // Only with label id + * const chats = await client.listChats({withLabels: ['1']}); + * + * // Only with label with one of text or id + * const chats = await client.listChats({withLabels: ['Alfa','5']}); + * ``` + * @category Chat + * @returns array of [Chat] + */ + public async listChats(options?: ChatListOptions): Promise { + return await evaluateAndReturn( + this.page, + async ({ options }) => { + const chats = await WPP.chat.list(options); + + const serialized = chats.map((c) => WAPI._serializeChatObj(c)); + return serialized; + }, + { options } + ); + } + + /** + * Checks if a number is a valid WA number + * @category Contact + * @param contactId, you need to include the @c.us at the end. + * @returns contact detial as promise + */ + public async checkNumberStatus(contactId: string): Promise { + const result = await evaluateAndReturn( + this.page, + (contactId) => WPP.contact.queryExists(contactId), + contactId + ); + + if (!result) { + return { + id: contactId as any, + isBusiness: false, + canReceiveMessage: false, + numberExists: false, + status: 404, + }; + } + + return { + id: result.wid as any, + isBusiness: result.biz, + canReceiveMessage: true, + numberExists: true, + status: 200, + }; + } + + /** + * Retrieves all chats with messages + * Deprecated in favor of {@link listChats} + * + * @category Chat + * @returns array of [Chat] + * @deprecated Deprecated in favor of listChats. + */ + public async getAllChatsWithMessages(withNewMessageOnly = false) { + this.logger.warn( + 'Deprecated: This function [getAllChatsWithMessages] is deprecated in favor of the listChats function. Please update your code accordingly.' + ); + return evaluateAndReturn( + this.page, + (withNewMessageOnly: boolean) => + WAPI.getAllChatsWithMessages(withNewMessageOnly), + withNewMessageOnly + ); + } + + /** + * Retrieve all groups + * Deprecated in favor of {@link listChats} + * + * @category Group + * @returns array of groups + * @deprecated Deprecated in favor of listChats. + */ + public async getAllGroups(withNewMessagesOnly = false): Promise { + this.logger.warn( + 'Deprecated: This function [getAllGroups] is deprecated in favor of the listChats function. Please update your code accordingly.' + ); + return await evaluateAndReturn( + this.page, + async ({ withNewMessagesOnly }) => { + const chats = await WPP.chat.list({ + onlyGroups: true, + onlyWithUnreadMessage: withNewMessagesOnly, + }); + + const groups = await Promise.all( + chats.map((c) => WPP.group.ensureGroup(c.id)) + ); + + return groups.map((g) => WAPI._serializeChatObj(g)); + }, + { withNewMessagesOnly } + ); + } + + /** + * Retrieve all broadcast list + * @category Group + * @returns array of broadcast list + */ + public async getAllBroadcastList() { + const chats = await evaluateAndReturn(this.page, () => WAPI.getAllChats()); + return chats.filter( + (chat) => chat.isBroadcast && chat.id._serialized !== 'status@broadcast' + ); + } + + /** + * Retrieves contact detail object of given contact id + * @category Contact + * @param contactId + * @returns contact detial as promise + */ + public async getContact(contactId: string) { + return evaluateAndReturn( + this.page, + (contactId) => WAPI.getContact(contactId), + contactId + ); + } + + /** + * Retrieves all contacts + * @category Contact + * @returns array of [Contact] + */ + public async getAllContacts() { + return await evaluateAndReturn(this.page, () => WAPI.getAllContacts()); + } + + /** + * Retrieves chat object of given contact id + * @category Chat + * @param contactId + * @returns contact detial as promise + */ + public async getChatById(contactId: string): Promise { + return evaluateAndReturn( + this.page, + (contactId) => WAPI.getChatById(contactId), + contactId + ); + } + + /** + * Retrieves chat object of given contact id + * @category Chat + * @param contactId + * @returns contact detial as promise + * @deprecated + */ + public async getChat(contactId: string) { + return this.getChatById(contactId); + } + + /** + * Retorna dados da imagem do contato + * @category Contact + * @param chatId Chat id + * @returns url of the chat picture or undefined if there is no picture for the chat. + */ + public async getProfilePicFromServer( + chatId: string + ): Promise { + return evaluateAndReturn( + this.page, + (chatId) => WAPI._profilePicfunc(chatId), + chatId + ); + } + + /** + * Load more messages in chat object from server. Use this in a while loop + * Depreciado em favor de {@link getMessages} + * + * @deprecated Depreciado em favor de getMessages + * @category Chat + * @param contactId + * @returns contact detial as promise + */ + public async loadEarlierMessages(contactId: string) { + return evaluateAndReturn( + this.page, + (contactId) => WAPI.loadEarlierMessages(contactId), + contactId + ); + } + + /** + * Retrieves status of given contact + * @category Contact + * @param contactId + */ + public async getStatus(contactId: string): Promise { + return await evaluateAndReturn( + this.page, + async (contactId) => { + const status = await WPP.contact.getStatus(contactId); + + return { + id: contactId, + status: (status as any)?.status || status, + }; + }, + contactId + ); + } + + /** + * Checks if a number is a valid whatsapp number + * + * Deprecated in favor of checkNumberStatus + * @deprecated Deprecated in favor of checkNumberStatus + * @category Contact + * @param contactId, you need to include the @c.us at the end. + * @returns contact detial as promise + */ + public async getNumberProfile(contactId: string) { + this.log( + 'warn', + 'The getNumberProfile function is deprecated, please use checkNumberStatus' + ); + return evaluateAndReturn( + this.page, + (contactId) => WAPI.getNumberProfile(contactId), + contactId + ); + } + + /** + * Retrieves all undread Messages + * @category Chat + * @param includeMe + * @param includeNotifications + * @param useUnreadCount + * @returns any + * @deprecated + */ + public async getUnreadMessages( + includeMe: boolean, + includeNotifications: boolean, + useUnreadCount: boolean + ) { + return await evaluateAndReturn( + this.page, + ({ includeMe, includeNotifications, useUnreadCount }) => + WAPI.getUnreadMessages(includeMe, includeNotifications, useUnreadCount), + { includeMe, includeNotifications, useUnreadCount } + ); + } + + /** + * Retrieves all unread messages (where ack is -1) + * @category Chat + * @returns list of messages + */ + public async getAllUnreadMessages() { + return evaluateAndReturn(this.page, () => WAPI.getAllUnreadMessages()); + } + + /** + * Retrieves all new messages (where isNewMsg is true) + * @category Chat + * @returns List of messages + * @deprecated Use getAllUnreadMessages + */ + public async getAllNewMessages() { + return await evaluateAndReturn(this.page, () => WAPI.getAllNewMessages()); + } + + /** + * Retrieves all messages already loaded in a chat + * For loading every message use loadAndGetAllMessagesInChat + * Depreciado em favor de {@link getMessages} + * + * @deprecated Depreciado em favor de getMessages + * + * @category Chat + * @param chatId, the chat to get the messages from + * @param includeMe, include my own messages? boolean + * @param includeNotifications + * @returns any + */ + public async getAllMessagesInChat( + chatId: string, + includeMe: boolean, + includeNotifications: boolean + ) { + return await evaluateAndReturn( + this.page, + ({ chatId, includeMe, includeNotifications }) => + WAPI.getAllMessagesInChat(chatId, includeMe, includeNotifications), + { chatId, includeMe, includeNotifications } + ); + } + + /** + * Loads and Retrieves all Messages in a chat + * Depreciado em favor de {@link getMessages} + * + * @deprecated Depreciado em favor de getMessages + * @category Chat + * @param chatId, the chat to get the messages from + * @param includeMe, include my own messages? boolean + * @param includeNotifications + * @returns any + */ + public async loadAndGetAllMessagesInChat( + chatId: string, + includeMe = false, + includeNotifications = false + ) { + return await evaluateAndReturn( + this.page, + ({ chatId, includeMe, includeNotifications }) => + WAPI.loadAndGetAllMessagesInChat( + chatId, + includeMe, + includeNotifications + ), + { chatId, includeMe, includeNotifications } + ); + } + + /** + * Checks if a CHAT contact is online. + * @category Chat + * @param chatId chat id: xxxxx@c.us + */ + public async getChatIsOnline(chatId: string): Promise { + return await evaluateAndReturn( + this.page, + (chatId: string) => WAPI.getChatIsOnline(chatId), + chatId + ); + } + + /** + * Retrieves the last seen of a CHAT. + * @category Chat + * @param chatId chat id: xxxxx@c.us + */ + public async getLastSeen(chatId: string): Promise { + return await evaluateAndReturn( + this.page, + (chatId: string) => WAPI.getLastSeen(chatId), + chatId + ); + } + + /** + * Get the platform message from message ID + * + * The platform can be: + * android + * iphone + * web + * unknown + * @category Chat + * @param chatId chat id: xxxxx@c.us + */ + public async getPlatformFromMessage(msgId: string): Promise { + return await evaluateAndReturn( + this.page, + (msgId: string) => WPP.chat.getPlatformFromMessage(msgId), + msgId + ); + } + + /** + * Get the reactions of a message + * + * @category Chat + */ + public async getReactions(msgId: string): Promise<{ + reactionByMe: { + id: any; + orphan: number; + msgId: any; + reactionText: string; + read: boolean; + senderUserJid: string; + timestamp: number; + }; + reactions: { + aggregateEmoji: string; + hasReactionByMe: boolean; + senders: { + id: any; + orphan: number; + msgId: any; + reactionText: string; + read: boolean; + senderUserJid: string; + timestamp: number; + }[]; + }[]; + }> { + return await evaluateAndReturn( + this.page, + (msgId: string) => WPP.chat.getReactions(msgId), + msgId + ); + } + + /** + * Get the votes of a poll message + * + * @category Chat + */ + public async getVotes(msgId: string): Promise<{ + msgId: any; + chatId: Wid; + votes: { + selectedOptions: number[]; + timestamp: number; + sender: Wid; + }[]; + }> { + return await evaluateAndReturn( + this.page, + (msgId: string) => WPP.chat.getVotes(msgId), + msgId + ); + } + + /** + * Get the max number of participants for a group + * + * @category Group + */ + public async getGroupSizeLimit(): Promise { + return await evaluateAndReturn(this.page, () => + WPP.group.getGroupSizeLimit() + ); + } + + /** + * Get info of your sended order + * + * @example + * ```javascript + * const orderInfo = await client.getOrder(''); + * ``` + * @category Order + * @return Your order + */ + public async getOrder(msgId: string) { + return evaluateAndReturn(this.page, (msgId) => WPP.order.get(msgId), msgId); + } + + /** + * Get all commons groups for the contact + * + * @example + * ```javascript + * const groups_ids = await client.getCommonGroups('[number]@c.us'); + * ``` + * + * @category Group + * @param groupId Group ID ('000000-000000@g.us') + * @returns Promise + */ + public async getCommonGroups(wid: string) { + return await evaluateAndReturn( + this.page, + ({ wid }) => WPP.contact.getCommonGroups(wid), + { wid } + ); + } +} diff --git a/src/api/layers/sender.layer.ts b/src/api/layers/sender.layer.ts new file mode 100644 index 000000000..8c24365ba --- /dev/null +++ b/src/api/layers/sender.layer.ts @@ -0,0 +1,1420 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +import type { + FileMessageOptions, + ListMessageOptions, + LocationMessageOptions, + SendMessageReturn, + TextMessageOptions, + PoolMessageOptions, + ForwardMessagesOptions, +} from '@wppconnect/wa-js/dist/chat'; +import * as path from 'path'; +import { Page } from 'puppeteer'; +import { CreateConfig } from '../../config/create-config'; +import { convertToMP4GIF } from '../../utils/ffmpeg'; +import { sleep } from '../../utils/sleep'; +import { + base64MimeType, + downloadFileToBase64, + evaluateAndReturn, + fileToBase64, + stickerSelect, +} from '../helpers'; +import { filenameFromMimeType } from '../helpers/filename-from-mimetype'; +import { Message, SendFileResult, SendStickerResult } from '../model'; +import { ChatState } from '../model/enum'; +import { ListenerLayer } from './listener.layer'; +import { + OrderItems, + OrderMessageOptions, +} from '@wppconnect/wa-js/dist/chat/functions/sendOrderMessage'; + +export class SenderLayer extends ListenerLayer { + constructor(public page: Page, session?: string, options?: CreateConfig) { + super(page, session, options); + } + + /** + * Automatically sends a link with the auto generated link preview. You can also add a custom message to be added. + * + * Deprecated: please use {@link sendText} + * + * @category Chat + * @deprecated + * @param chatId + * @param url string A link, for example for youtube. e.g https://www.youtube.com/watch?v=Zi_XLOBDo_Y&list=RDEMe12_MlgO8mGFdeeftZ2nOQ&start_radio=1 + * @param text custom text as the message body, this includes the link or will be attached after the link + */ + public async sendLinkPreview(chatId: string, url: string, text: string = '') { + const message = text.includes(url) ? text : `${url}\n${text}`; + + const result = await evaluateAndReturn( + this.page, + ({ chatId, message }) => { + return WPP.chat.sendTextMessage(chatId, message, { linkPreview: true }); + }, + { chatId, message } + ); + + return result; + } + + /** + * Sends a text message to given chat + * @category Chat + * @param to chat id: xxxxx@us.c + * @param content text message + * + * @example + * ```javascript + * // Simple message + * client.sendText('@c.us', 'A simple message'); + * + * // A message with reply + * client.sendText('@c.us', 'A simple message', { + * quotedMsg: 'true_...@c.us_3EB01DE65ACC6_out' + * }); + * + * // With buttons + * client.sendText('@c.us', 'WPPConnect message with buttons', { + * useTemplateButtons: true, // False for legacy + * buttons: [ + * { + * url: 'https://wppconnect.io/', + * text: 'WPPConnect Site' + * }, + * { + * phoneNumber: '+55 11 22334455', + * text: 'Call me' + * }, + * { + * id: 'your custom id 1', + * text: 'Some text' + * }, + * { + * id: 'another id 2', + * text: 'Another text' + * } + * ], + * title: 'Title text' // Optional + * footer: 'Footer text' // Optional + * }); + * ``` + */ + public async sendText( + to: string, + content: string, + options?: TextMessageOptions + ): Promise { + const sendResult = await evaluateAndReturn( + this.page, + ({ to, content, options }) => + WPP.chat.sendTextMessage(to, content, { + ...options, + waitForAck: true, + }), + { to, content, options: options as any } + ); + + // I don't know why the evaluate is returning undefined for direct call + // To solve that, I added `JSON.parse(JSON.stringify())` to solve that + const result = (await evaluateAndReturn( + this.page, + async ({ messageId }) => { + return JSON.parse(JSON.stringify(await WAPI.getMessageById(messageId))); + }, + { messageId: sendResult.id } + )) as Message; + + if (result['erro'] == true) { + throw result; + } + + return result; + } + + /** + * + * @category Chat + * @param chat + * @param content + * @param options + * @returns + */ + public async sendMessageOptions( + chat: any, + content: any, + options?: any + ): Promise { + const messageId = await evaluateAndReturn( + this.page, + ({ chat, content, options }) => { + return WAPI.sendMessageOptions(chat, content, options); + }, + { chat, content, options } + ); + const result = (await evaluateAndReturn( + this.page, + (messageId: any) => WAPI.getMessageById(messageId), + messageId + )) as Message; + return result; + } + + /** + * Sends image message + * @category Chat + * @param to Chat id + * @param filePath File path or http link + * @param filename + * @param caption + * @param quotedMessageId Quoted message id + * @param isViewOnce Enable single view + */ + public async sendImage( + to: string, + filePath: string, + filename?: string, + caption?: string, + quotedMessageId?: string, + isViewOnce?: boolean + ) { + let base64 = await downloadFileToBase64(filePath, [ + 'image/gif', + 'image/png', + 'image/jpg', + 'image/jpeg', + 'image/webp', + ]); + + if (!base64) { + base64 = await fileToBase64(filePath); + } + + if (!base64) { + const obj = { + erro: true, + to: to, + text: 'No such file or directory, open "' + filePath + '"', + }; + throw obj; + } + + if (!filename) { + filename = path.basename(filePath); + } + + return await this.sendImageFromBase64( + to, + base64, + filename, + caption, + quotedMessageId, + isViewOnce + ); + } + + /** + * Sends image message + * @category Chat + * @param to Chat id + * @param base64 File path, http link or base64Encoded + * @param filename + * @param caption + * @param quotedMessageId Quoted message id + * @param isViewOnce Enable single view + * @param mentionedList + */ + public async sendImageFromBase64( + to: string, + base64: string, + filename: string, + caption?: string, + quotedMessageId?: string, + isViewOnce?: boolean, + mentionedList?: any + ) { + let mimeType = base64MimeType(base64); + + if (!mimeType) { + const obj = { + erro: true, + to: to, + text: 'Invalid base64!', + }; + throw obj; + } + + if (!mimeType.includes('image')) { + const obj = { + erro: true, + to: to, + text: 'Not an image, allowed formats png, jpeg and webp', + }; + throw obj; + } + + filename = filenameFromMimeType(filename, mimeType); + + const result = await evaluateAndReturn( + this.page, + async ({ + to, + base64, + filename, + caption, + quotedMessageId, + isViewOnce, + mentionedList, + }) => { + const result = await WPP.chat.sendFileMessage(to, base64, { + type: 'image', + isViewOnce, + filename, + caption, + quotedMsg: quotedMessageId, + waitForAck: true, + detectMentioned: true, + mentionedList: mentionedList, + }); + + return { + ack: result.ack, + id: result.id, + sendMsgResult: await result.sendMsgResult, + }; + }, + { + to, + base64, + filename, + caption, + quotedMessageId, + isViewOnce, + mentionedList, + } + ); + + return result; + } + + /** + * Sends message with thumbnail + * + * @deprecated: please use {@link sendText} with options + * + * @deprecated + * @category Chat + * @param pathOrBase64 + * @param url + * @param title + * @param description + * @param chatId + */ + public async sendMessageWithThumb( + pathOrBase64: string, + url: string, + title: string, + description: string, + chatId: string + ) { + let base64: string = ''; + + if (pathOrBase64.startsWith('data:')) { + base64 = pathOrBase64; + } else { + let fileContent = await downloadFileToBase64(pathOrBase64, [ + 'image/gif', + 'image/png', + 'image/jpg', + 'image/jpeg', + 'image/webp', + ]); + if (!fileContent) { + fileContent = await fileToBase64(pathOrBase64); + } + if (fileContent) { + base64 = fileContent; + } + } + + if (!base64) { + const error = new Error('Empty or invalid file or base64'); + Object.assign(error, { + code: 'empty_file', + }); + throw error; + } + + const mimeInfo = base64MimeType(base64); + + if (!mimeInfo || !mimeInfo.includes('image')) { + const error = new Error( + 'Not an image, allowed formats png, jpeg, webp and gif' + ); + Object.assign(error, { + code: 'invalid_image', + }); + throw error; + } + + const thumbnail = base64.replace( + /^data:image\/(png|jpe?g|webp|gif);base64,/, + '' + ); + + return evaluateAndReturn( + this.page, + ({ thumbnail, url, title, description, chatId }) => + WPP.chat.sendTextMessage(chatId, url, { + linkPreview: { + thumbnail: thumbnail, + canonicalUrl: url, + description: description, + matchedText: url, + title: title, + richPreviewType: 0, + doNotPlayInline: true, + }, + }), + { + thumbnail, + url, + title, + description, + chatId, + } + ); + } + + /** + * Replies to given mesage id of given chat id + * + * Deprecated: Please, use sendText with quotedMsg option + * + * @deprecated + * + * @category Chat + * @param to Chat id + * @param content Message body + * @param quotedMsg Message id to reply to. + */ + public async reply( + to: string, + content: string, + quotedMsg: string + ): Promise { + const result = await evaluateAndReturn( + this.page, + ({ to, content, quotedMsg }) => { + return WPP.chat.sendTextMessage(to, content, { quotedMsg }); + }, + { to, content, quotedMsg } + ); + + const message = (await evaluateAndReturn( + this.page, + (messageId: any) => WAPI.getMessageById(messageId), + result.id + )) as Message; + if (message['erro'] == true) { + throw message; + } + return message; + } + + /** + * Sends ptt audio + * base64 parameter should have mime type already defined + * @category Chat + * @param to Chat id + * @param base64 base64 data + * @param filename + * @param caption + * @param quotedMessageId Quoted message id + * @param messageId Set the id for this message + */ + public async sendPttFromBase64( + to: string, + base64: string, + filename: string, + caption?: string, + quotedMessageId?: string, + messageId?: string + ) { + const result = await evaluateAndReturn( + this.page, + async ({ to, base64, filename, caption, quotedMessageId, messageId }) => { + const result = await WPP.chat.sendFileMessage(to, base64, { + type: 'audio', + isPtt: true, + filename, + caption, + quotedMsg: quotedMessageId, + waitForAck: true, + messageId: messageId, + }); + + return { + ack: result.ack, + id: result.id, + sendMsgResult: await result.sendMsgResult, + }; + }, + { to, base64, filename, caption, quotedMessageId, messageId } + ); + + return result; + } + + /** + * Sends ptt audio from path + * @category Chat + * @param to Chat id + * @param filePath File path + * @param filename + * @param caption + * @param quotedMessageId Quoted message id + * @param messageId Set the id for this message + */ + public async sendPtt( + to: string, + filePath: string, + filename?: string, + caption?: string, + quotedMessageId?: string, + messageId?: string + ) { + return new Promise(async (resolve, reject) => { + let base64 = await downloadFileToBase64(filePath, [/^audio/]), + obj: { erro: boolean; to: string; text: string }; + + if (!base64) { + base64 = await fileToBase64(filePath); + } + + if (!base64) { + obj = { + erro: true, + to: to, + text: 'No such file or directory, open "' + filePath + '"', + }; + return reject(obj); + } + + if (!filename) { + filename = path.basename(filePath); + } + + return this.sendPttFromBase64( + to, + base64, + filename, + caption, + quotedMessageId, + messageId + ) + .then(resolve) + .catch(reject); + }); + } + + /** + * Sends file + * base64 parameter should have mime type already defined + * + * Deprecated: please use sendFile with options: sendFile(to, content, options) + * + * @deprecated + * + * @category Chat + * @param chatId Chat id + * @param base64 base64 data + * @param filename + * @param caption + */ + public async sendFileFromBase64( + chatId: string, + base64: string, + filename: string, + caption?: string + ) { + return this.sendFile(chatId, base64, filename, caption); + } + + /** + * Sends file from path or base64 + * + * @example + * ```javascript + * // Simple message + * client.sendFile('@c.us', 'data:text/plain;base64,V1BQQ29ubmVjdA=='); + * + * // With buttons + * client.sendFile('@c.us', 'data:text/plain;base64,V1BQQ29ubmVjdA==', { + * useTemplateButtons: true, // False for legacy + * buttons: [ + * { + * url: 'https://wppconnect.io/', + * text: 'WPPConnect Site' + * }, + * { + * phoneNumber: '+55 11 22334455', + * text: 'Call me' + * }, + * { + * id: 'your custom id 1', + * text: 'Some text' + * }, + * { + * id: 'another id 2', + * text: 'Another text' + * } + * ], + * title: 'Title text' // Optional + * footer: 'Footer text' // Optional + * }); + * ``` + * + * @category Chat + * @param to Chat id + * @param pathOrBase64 File path + * @param options + */ + public async sendFile( + to: string, + pathOrBase64: string, + options?: FileMessageOptions + ); + /** + * Sends file from path or base64 + * + * Deprecated: please use sendFile with options: sendFile(to, content, options) + * + * @deprecated + * + * @category Chat + * @param to Chat id + * @param pathOrBase64 File path or base64 + * @param filename The file name + * @param caption Caption for the filename + */ + public async sendFile( + to: string, + pathOrBase64: string, + filename?: string, + caption?: string + ); + public async sendFile( + to: string, + pathOrBase64: string, + nameOrOptions?: string | FileMessageOptions, + caption?: string + ) { + let options: FileMessageOptions = { type: 'auto-detect' }; + + if (typeof nameOrOptions === 'string') { + options.filename = nameOrOptions; + options.caption = caption; + } else if (typeof nameOrOptions === 'object') { + options = nameOrOptions; + } + + let base64 = ''; + + if (pathOrBase64.startsWith('data:')) { + base64 = pathOrBase64; + } else { + let fileContent = await downloadFileToBase64(pathOrBase64); + if (!fileContent) { + fileContent = await fileToBase64(pathOrBase64); + } + if (fileContent) { + base64 = fileContent; + } + + if (!options.filename) { + options.filename = path.basename(pathOrBase64); + } + } + + if (!base64) { + const error = new Error('Empty or invalid file or base64'); + Object.assign(error, { + code: 'empty_file', + }); + throw error; + } + + return evaluateAndReturn( + this.page, + async ({ to, base64, options }) => { + const result = await WPP.chat.sendFileMessage(to, base64, options); + return { + ack: result.ack, + id: result.id, + sendMsgResult: await result.sendMsgResult, + }; + }, + { to, base64, options: options as any } + ); + } + + /** + * Sends a video to given chat as a gif, with caption or not + * @category Chat + * @param to Chat id + * @param filePath File path + * @param filename + * @param caption + */ + public async sendVideoAsGif( + to: string, + filePath: string, + filename?: string, + caption?: string + ) { + let base64 = await downloadFileToBase64(filePath), + obj: { erro: boolean; to: string; text: string }; + + if (!base64) { + base64 = await fileToBase64(filePath); + } + + if (!base64) { + obj = { + erro: true, + to: to, + text: 'No such file or directory, open "' + filePath + '"', + }; + throw obj; + } + + if (!filename) { + filename = path.basename(filePath); + } + + return this.sendVideoAsGifFromBase64(to, base64, filename, caption); + } + + /** + * Sends a video to given chat as a gif, with caption or not, using base64 + * @category Chat + * @param to chat id xxxxx@us.c + * @param base64 base64 data:video/xxx;base64,xxx + * @param filename string xxxxx + * @param caption string xxxxx + */ + public async sendVideoAsGifFromBase64( + to: string, + base64: string, + filename: string, + caption?: string, + quotedMessageId?: string + ) { + const result = await evaluateAndReturn( + this.page, + async ({ to, base64, filename, caption, quotedMessageId }) => { + const result = await WPP.chat.sendFileMessage(to, base64, { + type: 'video', + isGif: true, + filename, + caption, + quotedMsg: quotedMessageId, + waitForAck: true, + }); + + return { + ack: result.ack, + id: result.id, + sendMsgResult: await result.sendMsgResult, + }; + }, + { to, base64, filename, caption, quotedMessageId } + ); + + return result; + } + + /** + * Sends a video to given chat as a gif, with caption or not, using base64 + * @category Chat + * @param to Chat id + * @param filePath File path + * @param filename + * @param caption + */ + public async sendGif( + to: string, + filePath: string, + filename?: string, + caption?: string + ) { + let base64 = await downloadFileToBase64(filePath), + obj: { erro: boolean; to: string; text: string }; + + if (!base64) { + base64 = await fileToBase64(filePath); + } + + if (!base64) { + obj = { + erro: true, + to: to, + text: 'No such file or directory, open "' + filePath + '"', + }; + throw obj; + } + + if (!filename) { + filename = path.basename(filePath); + } + + return this.sendGifFromBase64(to, base64, filename, caption); + } + + /** + * Sends a video to given chat as a gif, with caption or not, using base64 + * @category Chat + * @param to chat id xxxxx@us.c + * @param base64 base64 data:video/xxx;base64,xxx + * @param filename string xxxxx + * @param caption string xxxxx + */ + public async sendGifFromBase64( + to: string, + base64: string, + filename: string, + caption?: string + ) { + base64 = await convertToMP4GIF(base64); + + return await this.sendVideoAsGifFromBase64(to, base64, filename, caption); + } + /** + * Sends contact card to iven chat id + * @category Chat + * @param to Chat id + * @param contactsId Example: 0000@c.us | [000@c.us, 1111@c.us] + */ + public async sendContactVcard(to: string, contactsId: string, name?: string) { + const result = await evaluateAndReturn( + this.page, + ({ to, contactsId, name }) => { + return WPP.chat.sendVCardContactMessage(to, { + id: contactsId, + name: name, + }); + }, + { to, contactsId, name } + ); + return result; + } + + /** + * Send a list of contact cards + * @category Chat + * @param to Chat id + * @param contacts Example: | ['000@c.us', '1111@c.us', {id: '2222@c.us', name: 'Test'}] + */ + public async sendContactVcardList( + to: string, + contacts: (string | { id: string; name: string })[] + ) { + const result = await evaluateAndReturn( + this.page, + ({ to, contacts }) => { + return WPP.chat.sendVCardContactMessage(to, contacts); + }, + { to, contacts } + ); + return result; + } + + /** + * Forwards array of messages (could be ids or message objects) + * @category Chat + * @param to Chat id + * @param messages Array of messages ids to be forwarded + * @param skipMyMessages + * @returns array of messages ID + */ + public async forwardMessage( + toChatId: string, + msgId: string | string[], + options?: ForwardMessagesOptions + ): Promise { + return evaluateAndReturn( + this.page, + ({ toChatId, msgId, options }) => + WPP.chat.forwardMessage(toChatId, msgId, options), + { toChatId, msgId, options } + ); + } + + /** + * Generates sticker from the provided animated gif image and sends it (Send image as animated sticker) + * @category Chat + * @param pathOrBase64 image path imageBase64 A valid gif image is required. You can also send via http/https (http://www.website.com/img.gif) + * @param to chatId '000000000000@c.us' + */ + public async sendImageAsStickerGif(to: string, pathOrBase64: string) { + let base64: string = ''; + + if (pathOrBase64.startsWith('data:')) { + base64 = pathOrBase64; + } else { + let fileContent = await downloadFileToBase64(pathOrBase64, [ + 'image/gif', + 'image/webp', + ]); + if (!fileContent) { + fileContent = await fileToBase64(pathOrBase64); + } + if (fileContent) { + base64 = fileContent; + } + } + + if (!base64) { + const error = new Error('Empty or invalid file or base64'); + Object.assign(error, { + code: 'empty_file', + }); + throw error; + } + + const mimeInfo = base64MimeType(base64); + + if (!mimeInfo || !mimeInfo.includes('image')) { + const error = new Error('Not an image, allowed formats gig and webp'); + Object.assign(error, { + code: 'invalid_image', + }); + throw error; + } + + const buff = Buffer.from( + base64.replace(/^data:image\/(gif|webp);base64,/, ''), + 'base64' + ); + + let obj = await stickerSelect(buff, 1); + + if (!obj) { + const error = new Error( + 'Error with sharp library, check the console log' + ); + Object.assign(error, { + code: 'sharp_error', + }); + throw error; + } + + const { webpBase64 } = obj; + + return await evaluateAndReturn( + this.page, + ({ to, webpBase64 }) => { + return WPP.chat.sendFileMessage(to, webpBase64, { + type: 'sticker', + }); + }, + { to, webpBase64 } + ); + } + + /** + * Generates sticker from given image and sends it (Send Image As Sticker) + * @category Chat + * @param pathOrBase64 image path imageBase64 A valid png, jpg and webp image is required. You can also send via http/https (http://www.website.com/img.gif) + * @param to chatId '000000000000@c.us' + */ + public async sendImageAsSticker(to: string, pathOrBase64: string) { + let base64: string = ''; + + if (pathOrBase64.startsWith('data:')) { + base64 = pathOrBase64; + } else { + let fileContent = await downloadFileToBase64(pathOrBase64, [ + 'image/gif', + 'image/png', + 'image/jpg', + 'image/jpeg', + 'image/webp', + ]); + if (!fileContent) { + fileContent = await fileToBase64(pathOrBase64); + } + if (fileContent) { + base64 = fileContent; + } + } + + if (!base64) { + const error = new Error('Empty or invalid file or base64'); + Object.assign(error, { + code: 'empty_file', + }); + throw error; + } + + const mimeInfo = base64MimeType(base64); + + if (!mimeInfo || !mimeInfo.includes('image')) { + const error = new Error( + 'Not an image, allowed formats png, jpeg, webp and gif' + ); + Object.assign(error, { + code: 'invalid_image', + }); + throw error; + } + + const buff = Buffer.from( + base64.replace(/^data:image\/(png|jpe?g|webp|gif);base64,/, ''), + 'base64' + ); + + let obj = await stickerSelect(buff, 0); + + if (!obj) { + const error = new Error( + 'Error with sharp library, check the console log' + ); + Object.assign(error, { + code: 'sharp_error', + }); + throw error; + } + + const { webpBase64 } = obj; + + return await evaluateAndReturn( + this.page, + ({ to, webpBase64 }) => { + return WPP.chat.sendFileMessage(to, webpBase64, { + type: 'sticker', + }); + }, + { to, webpBase64 } + ); + } + + /** + * Sends location to given chat id + * @category Chat + * @param to Chat id + * @param options location options + */ + public async sendLocation(to: string, options: LocationMessageOptions); + /** + * Sends location to given chat id + * @category Chat + * @param to Chat id + * @param latitude Latitude + * @param longitude Longitude + * @param title Text caption + */ + public async sendLocation( + to: string, + latitude: string, + longitude: string, + title: string + ); + public async sendLocation( + to: string, + latitudeOrOptions: string | LocationMessageOptions, + longitude?: string, + title?: string + ) { + const options: LocationMessageOptions = + typeof latitudeOrOptions === 'string' + ? { + lat: latitudeOrOptions, + lng: longitude, + title: title, + } + : latitudeOrOptions; + + return await evaluateAndReturn( + this.page, + async ({ to, options }) => { + const result = await WPP.chat.sendLocationMessage(to, options); + + return { + ack: result.ack, + id: result.id, + sendMsgResult: await result.sendMsgResult, + }; + }, + { to, options: options as any } + ); + } + + /** + * Sets a chat status to seen. Marks all messages as ack: 3 + * @category Chat + * @param chatId chat id: xxxxx@us.c + */ + public async sendSeen(chatId: string) { + return evaluateAndReturn( + this.page, + (chatId) => WPP.chat.markIsRead(chatId), + chatId + ); + } + + /** + * Sets an audio or image view once. Marks message as played + * @category Chat + * @param msgId Message id: xxxxx@us.c + */ + public async markPlayed(msgId: string) { + return evaluateAndReturn( + this.page, + (msgId) => WPP.chat.markPlayed(msgId), + msgId + ); + } + + /** + * Starts typing ('Typing...' state) + * + * @example + * ```javascript + * // Keep sending typing state, use stopTyping to finish + * await client.startTyping('[number]@c.us'); + * + * // Keep sending typing state for 5 seconds + * await client.startTyping('[number]@c.us', 5000); + * ``` + * @category Chat + * @param to Chat Id + * @param duration Duration um milliseconds + */ + public async startTyping(to: string, duration?: number) { + return evaluateAndReturn( + this.page, + ({ to, duration }) => WPP.chat.markIsComposing(to, duration), + { + to, + duration, + } + ); + } + + /** + * Stops typing ('Typing...' state) + * @category Chat + * @param to Chat Id + */ + public async stopTyping(to: string) { + return evaluateAndReturn(this.page, ({ to }) => WPP.chat.markIsPaused(to), { + to, + }); + } + + /** + * Starts recording ('Recording...' state) + * @example + * ```javascript + * // Keep sending recording state, use `stopRecording` to finish + * await client.startRecording('[number]@c.us'); + * + * // Keep sending typing state for 5 seconds + * await client.startRecording('[number]@c.us', 5000); + * ``` + * @category Chat + * @param to Chat Id + * @param duration Duration um milliseconds + */ + public async startRecording(to: string, duration?: number) { + return evaluateAndReturn( + this.page, + ({ to, duration }) => WPP.chat.markIsRecording(to, duration), + { + to, + duration, + } + ); + } + + /** + * Stops recording ('Recording...' state) + * @category Chat + * @param to Chat Id + */ + public async stopRecording(to: string) { + return evaluateAndReturn(this.page, ({ to }) => WPP.chat.markIsPaused(to), { + to, + }); + } + + /** + * Update your online presence + * @category Chat + * @param online true for available presence and false for unavailable + */ + public async setOnlinePresence(online: boolean = true) { + return evaluateAndReturn( + this.page, + ({ online }) => WPP.conn.markAvailable(online), + { + online, + } + ); + } + + /** + * Sends text with tags + * @category Chat + */ + public async sendMentioned(to: string, message: string, mentioned: string[]) { + return await evaluateAndReturn( + this.page, + ({ to, message, mentioned }) => + WPP.chat.sendTextMessage(to, message, { + detectMentioned: true, + mentionedList: mentioned, + }), + { to, message, mentioned } + ); + } + + /** + * Sends a list message + * + * ```typescript + * // Example + * client.sendListMessage('@c.us', { + * buttonText: 'Click here', + * description: 'Choose one option', + * sections: [ + * { + * title: 'Section 1', + * rows: [ + * { + * rowId: 'my_custom_id', + * title: 'Test 1', + * description: 'Description 1', + * }, + * { + * rowId: '2', + * title: 'Test 2', + * description: 'Description 2', + * }, + * ], + * }, + * ], + * }); + * ``` + * + * @category Chat + */ + public async sendListMessage(to: string, options: ListMessageOptions) { + const sendResult = await evaluateAndReturn( + this.page, + ({ to, options }) => WPP.chat.sendListMessage(to, options), + { + to, + options: options, + } + ); + + // I don't know why the evaluate is returning undefined for direct call + // To solve that, I added `JSON.parse(JSON.stringify())` to solve that + const result = (await evaluateAndReturn( + this.page, + async ({ messageId }) => { + return JSON.parse(JSON.stringify(await WAPI.getMessageById(messageId))); + }, + { messageId: sendResult.id } + )) as Message; + + if (result['erro'] == true) { + throw result; + } + + return result; + } + + /** + * Send a create poll message + * + * @example + * ```javascript + * // Single pool + * client.sendPollMessage( + * '[number]@g.us', + * 'A poll name', + * ['Option 1', 'Option 2', 'Option 3'] + * ); + * ``` + * // Selectable Count + * ```javascript + * // Single pool + * client.sendPollMessage( + * '[number]@g.us', + * 'A poll name', + * ['Option 1', 'Option 2', 'Option 3'], + * { + * selectableCount: 1, + * } + * ); + * ``` + * + * @category Chat + */ + public async sendPollMessage( + chatId: string, + name: string, + choices: string[], + options?: PoolMessageOptions + ) { + const sendResult = await evaluateAndReturn( + this.page, + ({ chatId, name, choices, options }) => + WPP.chat.sendCreatePollMessage(chatId, name, choices, options), + { + chatId, + name, + choices, + options: options, + } + ); + + // I don't know why the evaluate is returning undefined for direct call + // To solve that, I added `JSON.parse(JSON.stringify())` to solve that + const result = (await evaluateAndReturn( + this.page, + async ({ messageId }) => { + return JSON.parse(JSON.stringify(await WAPI.getMessageById(messageId))); + }, + { messageId: sendResult.id } + )) as Message; + + if (result['erro'] == true) { + throw result; + } + + return result; + } + /** + * Sets the chat state + * Deprecated in favor of Use startTyping or startRecording functions + * @category Chat + * @param chatState + * @param chatId + * @deprecated Deprecated in favor of Use startTyping or startRecording functions + */ + public async setChatState(chatId: string, chatState: ChatState) { + return await evaluateAndReturn( + this.page, + ({ chatState, chatId }) => { + WAPI.sendChatstate(chatState, chatId); + }, + { chatState, chatId } + ); + } + + /** + * Send reaction to message + * @example + * ```javascript + * // For send Reaction, just to send emoji + * await client.sendReactionToMessage('[number]@c.us', '🤯'); + * + * // to remove reacition + * await client.startRecording('[number]@c.us', false); + * ``` + * @category Chat + * @param to Chat Id + * @param duration Duration um milliseconds + */ + public async sendReactionToMessage(msgId: string, reaction: string | false) { + return evaluateAndReturn( + this.page, + ({ msgId, reaction }) => WPP.chat.sendReactionToMessage(msgId, reaction), + { + msgId, + reaction, + } + ); + } + + /** + * Send an order message + * To send (prices, tax, shipping or discount), for example: USD 12.90, send them without dots or commas, like: 12900 + * + * @example + * ```javascript + * // Send an order with a product + * client.sendOrderMessage('[number]@c.us', [ + * { type: 'product', id: '67689897878', qnt: 2 }, + * { type: 'product', id: '37878774457', qnt: 1 }, + * ] + * + * // Send Order with a custom item + * client.sendOrderMessage('[number]@c.us', [ + * { type: 'custom', name: 'Item de cost test', price: 120000, qnt: 2 }, + * ] + * + * // Send Order with custom options + * client.sendOrderMessage('[number]@c.us', [ + * { type: 'product', id: '37878774457', qnt: 1 }, + * { type: 'custom', name: 'Item de cost test', price: 120000, qnt: 2 }, + * ], + * { tax: 10000, shipping: 4000, discount: 10000 } + * ``` + * + * @category Chat + */ + public async sendOrderMessage( + to: string, + items: OrderItems[], + options?: OrderMessageOptions + ) { + const sendResult = await evaluateAndReturn( + this.page, + ({ to, items, options }) => WPP.chat.sendOrderMessage(to, items, options), + { + to, + items, + options, + } + ); + + // I don't know why the evaluate is returning undefined for direct call + // To solve that, I added `JSON.parse(JSON.stringify())` to solve that + const result = (await evaluateAndReturn( + this.page, + async ({ messageId }) => { + return JSON.parse(JSON.stringify(await WAPI.getMessageById(messageId))); + }, + { messageId: sendResult.id } + )) as Message; + + if (result['erro'] == true) { + throw result; + } + + return result; + } +} diff --git a/src/api/layers/status.layer.ts b/src/api/layers/status.layer.ts new file mode 100644 index 000000000..626062bc0 --- /dev/null +++ b/src/api/layers/status.layer.ts @@ -0,0 +1,188 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +import { Page } from 'puppeteer'; +import { CreateConfig } from '../../config/create-config'; +import { LabelsLayer } from './labels.layer'; +import { + evaluateAndReturn, + base64MimeType, + fileToBase64, + downloadFileToBase64, +} from '../helpers'; +import { SendStatusOptions } from '@wppconnect/wa-js/dist/status'; + +export class StatusLayer extends LabelsLayer { + constructor(public page: Page, session?: string, options?: CreateConfig) { + super(page, session, options); + } + /** + * Send a image message to status stories + * @category Status + * + * @example + * ```javascript + * client.sendImageStatus('data:image/jpeg;base64,'); + * ``` + * + * @example + * ```javascript + * // Send with caption + * client.sendImageStatus('data:image/jpeg;base64,', { caption: 'example test' } ); + * ``` + * @param pathOrBase64 Path or base 64 image + */ + public async sendImageStatus( + pathOrBase64: string, + options?: SendStatusOptions & { caption?: string } + ) { + let base64: string = ''; + if (pathOrBase64.startsWith('data:')) { + base64 = pathOrBase64; + } else { + let fileContent = await downloadFileToBase64(pathOrBase64, [ + 'image/gif', + 'image/png', + 'image/jpg', + 'image/jpeg', + 'image/webp', + ]); + if (!fileContent) { + fileContent = await fileToBase64(pathOrBase64); + } + if (fileContent) { + base64 = fileContent; + } + } + + if (!base64) { + const error = new Error('Empty or invalid file or base64'); + Object.assign(error, { + code: 'empty_file', + }); + throw error; + } + + const mimeInfo = base64MimeType(base64); + + if (!mimeInfo || !mimeInfo.includes('image')) { + const error = new Error( + 'Not an image, allowed formats png, jpeg and webp' + ); + Object.assign(error, { + code: 'invalid_image', + }); + throw error; + } + return await evaluateAndReturn( + this.page, + ({ base64, options }) => { + WPP.status.sendImageStatus(base64, options); + }, + { base64, options } + ); + } + /** + * Send a video message to status stories + * @category Status + * + * @example + * ```javascript + * client.sendVideoStatus('data:video/mp4;base64,'); + * ``` + * @example + * ```javascript + * // Send with caption + * client.sendVideoStatus('data:video/mp4;base64,', { caption: 'example test' } ); + * ``` + * @param pathOrBase64 Path or base 64 image + */ + public async sendVideoStatus( + pathOrBase64: string, + options?: SendStatusOptions & { caption?: string } + ) { + let base64: string = ''; + if (pathOrBase64.startsWith('data:')) { + base64 = pathOrBase64; + } else { + let fileContent = await downloadFileToBase64(pathOrBase64); + if (!fileContent) { + fileContent = await fileToBase64(pathOrBase64); + } + if (fileContent) { + base64 = fileContent; + } + } + + if (!base64) { + const error = new Error('Empty or invalid file or base64'); + Object.assign(error, { + code: 'empty_file', + }); + throw error; + } + + return await evaluateAndReturn( + this.page, + ({ base64, options }) => { + WPP.status.sendVideoStatus(base64, options); + }, + { base64, options } + ); + } + + /** + * Send a text to status stories + * @category Status + * + * @example + * ```javascript + * client.sendTextStatus(`Bootstrap primary color: #0275d8`, { backgroundColor: '#0275d8', font: 2}); + * ``` + * @param pathOrBase64 Path or base 64 image + */ + public async sendTextStatus(text: string, options: string) { + return await evaluateAndReturn( + this.page, + ({ text, options }) => { + WPP.status.sendTextStatus(text, options); + }, + { text, options } + ); + } + + /** + * Mark status as read/seen + * @category Status + * + * @example + * ```javascript + * client.sendReadStatus('[phone_number]@c.us', 'false_status@broadcast_3A169E0FD4BC6E92212F_[]@c.us'); + * ``` + * @param chatId Chat ID of contact + * @param statusId ID of status msg + */ + public async sendReadStatus(chatId: string, statusId: string) { + return await evaluateAndReturn( + this.page, + ({ chatId, statusId }) => { + WPP.status.sendReadStatus(chatId, statusId); + }, + { chatId, statusId } + ); + } +} diff --git a/src/api/layers/ui.layer.ts b/src/api/layers/ui.layer.ts new file mode 100644 index 000000000..601d0cee9 --- /dev/null +++ b/src/api/layers/ui.layer.ts @@ -0,0 +1,62 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +import { Page } from 'puppeteer'; +import { CreateConfig } from '../../config/create-config'; +import { evaluateAndReturn } from '../helpers'; +import { GroupLayer } from './group.layer'; + +export class UILayer extends GroupLayer { + constructor(public page: Page, session?: string, options?: CreateConfig) { + super(page, session, options); + } + + /** + * Opens given chat at last message (bottom) + * Will fire natural workflow events of whatsapp web + * @category UI + * @param chatId + */ + public async openChat(chatId: string) { + return evaluateAndReturn( + this.page, + (chatId: string) => WPP.chat.openChatBottom(chatId), + chatId + ); + } + + /** + * Opens chat at given message position + * @category UI + * @param chatId Chat id + * @param messageId Message id (For example: '06D3AB3D0EEB9D077A3F9A3EFF4DD030') + */ + public async openChatAt(chatId: string, messageId: string) { + return evaluateAndReturn( + this.page, + (chatId: string) => WPP.chat.openChatAt(chatId, messageId), + chatId + ); + } + /** + * Return the current active chat + * @category UI + */ + public async getActiveChat() { + return evaluateAndReturn(this.page, () => WPP.chat.getActiveChat()); + } +} diff --git a/src/api/model/ack.ts b/src/api/model/ack.ts new file mode 100644 index 000000000..a9a67f8bb --- /dev/null +++ b/src/api/model/ack.ts @@ -0,0 +1,42 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +import { Id } from './id'; +import { AckType } from './enum'; + +export interface Ack { + id: Id; + body: string; + type: string; + t: number; + subtype: any; + notifyName: string; + from: string; + to: string; + self: string; + ack: AckType; + invis: boolean; + isNewMsg: boolean; + star: boolean; + loc: string; + lat: number; + lng: number; + mentionedJidList: any[]; + isForwarded: boolean; + labels: any[]; + ephemeralStartTimestamp: number; +} diff --git a/src/api/model/chat.ts b/src/api/model/chat.ts new file mode 100644 index 000000000..d2645b65f --- /dev/null +++ b/src/api/model/chat.ts @@ -0,0 +1,50 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +import { Contact } from './contact'; +import { GroupMetadata } from './group-metadata'; +import { MessageId } from './message-id'; +import { Presence } from './presence'; +import { Wid } from './wid'; + +export interface Chat { + id: Wid; + pendingMsgs: boolean; + lastReceivedKey: MessageId; + t: number; + unreadCount: number; + archive: boolean; + muteExpiration: number; + name: string; + notSpam: boolean; + pin: number; + msgs: null; + kind: string; + isAnnounceGrpRestrict: boolean; + ephemeralDuration: number; + hasChatBeenOpened: boolean; + unreadMentionCount: number; + hasUnreadMention: boolean; + archiveAtMentionViewedInDrawer: boolean; + isBroadcast: boolean; + isGroup: boolean; + isReadOnly: boolean; + isUser: boolean; + contact: Contact; + groupMetadata: GroupMetadata; + presence: Presence; +} diff --git a/src/api/model/contact-status.ts b/src/api/model/contact-status.ts new file mode 100644 index 000000000..d469a186e --- /dev/null +++ b/src/api/model/contact-status.ts @@ -0,0 +1,22 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export interface ContactStatus { + id: string; + status: string; + stale?: boolean; +} diff --git a/src/api/model/contact.ts b/src/api/model/contact.ts new file mode 100644 index 000000000..0d98d9e9e --- /dev/null +++ b/src/api/model/contact.ts @@ -0,0 +1,64 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +import { Wid } from './wid'; +import { ProfilePicThumbObj } from './profile-pic-thumb'; + +/** + * Data info of contact + */ +export interface Contact { + formattedName: string; + id: Wid; + isBusiness: boolean; + isEnterprise: boolean; + isHighLevelVerified: any; + isMe: boolean; + isMyContact: boolean; + isPSA: boolean; + isUser: boolean; + isVerified: any; + isWAContact: boolean; + labels: any[]; + msgs: any; + + /** + * Name of concat in your agenda + */ + name?: string; + plaintextDisabled: boolean; + + /** + * @deprecated Depreciado em favor da função {@link getProfilePicFromServer} + */ + profilePicThumbObj: ProfilePicThumbObj; + + /** + * Name defined by common contact + */ + pushname?: string; + sectionHeader: any; + shortName: string; + statusMute: boolean; + type: string; + verifiedLevel: any; + + /** + * Name defined by business contact + */ + verifiedName?: any; +} diff --git a/src/api/model/enum/ack-type.ts b/src/api/model/enum/ack-type.ts new file mode 100644 index 000000000..d4785f7a1 --- /dev/null +++ b/src/api/model/enum/ack-type.ts @@ -0,0 +1,31 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export enum AckType { + MD_DOWNGRADE = -7, + INACTIVE = -6, + CONTENT_UNUPLOADABLE = -5, + CONTENT_TOO_BIG = -4, + CONTENT_GONE = -3, + EXPIRED = -2, + FAILED = -1, + CLOCK = 0, + SENT = 1, + RECEIVED = 2, + READ = 3, + PLAYED = 4, +} diff --git a/src/api/model/enum/chat-state.ts b/src/api/model/enum/chat-state.ts new file mode 100644 index 000000000..910b34001 --- /dev/null +++ b/src/api/model/enum/chat-state.ts @@ -0,0 +1,22 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export enum ChatState { + Typing = 0, + Recording = 1, + Paused = 2, +} diff --git a/src/api/model/enum/definitions.ts b/src/api/model/enum/definitions.ts new file mode 100644 index 000000000..6d42e10b1 --- /dev/null +++ b/src/api/model/enum/definitions.ts @@ -0,0 +1,606 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +const defs = { + MAX_GROUP_SIZE: 101, + MAX_SUBJECT_LENGTH: 25, + IMG_MAX_EDGE: 1600, + IMG_MAX_BYTES: 1048576, + IMG_THUMB_MAX_EDGE: 100, + DOC_THUMB_MAX_EDGE: 480, + MAX_MEDIA_UPLOAD_SIZE: 16777216, + MAX_FILE_SIZE: 104857600, + MAX_FILES: 30, + SHOW_GIF_SEARCH: !1, + USE_NOTIFICATION_QUERY: !1, + FWD_UI_START_TS: 0, + GOOGLE_MAPS_DO_NOT_AUTH: !0, + GOOGLE_MAPS_KEYLESS: !1, + SUSPICIOUS_LINKS: !1, + FINAL_LIVE_LOCATION: !1, + STATUS_RANKING: !1, + FREQUENTLY_FORWARDED_MESSAGES: !1, + FREQUENTLY_FORWARDED_THRESHOLD: 5, + FREQUENTLY_FORWARDED_MAX: 1, + FREQUENTLY_FORWARDED_GROUP_SETTING: !1, + QUICK_MESSAGE_SEARCH: !1, + EPHEMERAL_MESSAGES: !1, + PRELOAD_STICKERS: !1, + PRODUCT_CATALOG_DEEPLINK: !1, + PRODUCT_CATALOG_OPEN_DEEPLINK: !1, + PRODUCT_MEDIA_ATTACHMENTS: !1, + WEB_CLEAN_INCOMING_FILENAME: !1, + WEB_VOIP_INTERNAL_TESTER: !1, + WEB_ENABLE_MODEL_STORAGE: !1, + WS_CAN_CACHE_REQUESTS: !1, + MAX_FORWARD_COUNT_GLOBAL: 5, + FREQUENTLY_FORWARDED_SENTINEL: 127, + MAX_SMB_LABEL_COUNT: 20, + DEFAULT_SMB__NEW_LABEL_COLOR: '#d6d7d7', + FB_CLB_TOKEN: '1063127757113399|745146ffa34413f9dbb5469f5370b7af', + FB_CLB_CHECK_URL: 'https://crashlogs.whatsapp.net/wa_fls_upload_check', + FB_CLB_URL: 'https://crashlogs.whatsapp.net/wa_clb_data', + G_MAPS_DIR_URL: 'https://maps.google.com/maps/dir', + G_MAPS_IMG_URL: 'https://maps.googleapis.com/maps/api/staticmap', + G_MAPS_SEARCH_URL: 'https://maps.google.com/maps/search', + G_MAPS_URL: 'https://maps.google.com/maps', + NOTIFICATION_PROMPT_DELAY: 1e4, + PTT_PLAYBACK_DELAY: 400, + NOTIFICATION_TIMEOUT: 5e3, + CALL_NOTIFICATION_TIMEOUT: 45e3, + IDLE_TIMEOUT: 6e4, + IDLE_TIMEOUT_WAIT: 78e4, + SEARCH_ZOOM: 17, + SEND_UNAVAILABLE_WAIT: 15e3, + SEND_PAUSED_WAIT: 2500, + CLEAR_CHAT_DIRTY_WAIT: 2500, + LOG_UPLOAD_INTERVAL: 36e5, + REVOKE_WINDOW: 4096, + WAM_ROTATE_INTERVAL: 300, + ALBUM_DIFF_INTERVAL: 600, + MAX_TXT_MSG_SIZE: 65536, + INITIAL_PAGE_SIZE: 768, + FREQUENTLY_FORWARDED_INITIAL_PAGE_SIZE: 308, + SUBSEQUENT_PAGE_SIZE: 3072, + OVERFLOWING_PAGE_THRESHOLD: 0.1, + GROUP_DESCRIPTION_INFO_PANEL_TRUNC_LENGTH: 100, + GROUP_DESCRIPTION_LENGTH: 0, + GROUPS_V3_RESTRICT_GROUPS: !1, + GROUPS_V3_ANNOUNCE_GROUPS: !1, + GROUPS_V3: !1, + INFO_DRAWER_MAX_ROWS: 10, + NUM_COLORS: 20, + FTS_MIN_CHARS: 2, + FTS_TTL: 6e4, + FTS_TYPING_DELAY: 300, + FTS_NUM_RESULTS: 30, + STICKERS: !1, + HSM_ASPECT_RATIO: 1.91, + TEMPLATE_DOC_MIME_TYPES: 1, + TEMPLATE_URL_START: 64, + TEMPLATE_URL_END: 32, + MMS_MEDIA_KEY_TTL: 1 / 0, + KEY_STORAGE_TEST: 'storage_test', + KEY_CLIENT_TOKEN: 'WAToken1', + KEY_SERVER_TOKEN: 'WAToken2', + KEY_SECRET: 'WASecretKey', + KEY_SECRET_BUNDLE: 'WASecretBundle', + KEY_SECURITY_NOTIFICATIONS: 'WASecurityNotifications', + KEY_BROWSER_ID: 'WABrowserId', + KEY_GEOCODER_LOCATION: 'WAGeocoderLocation', + KEY_GROUP_ASSIGNED_COLOR: 'WAGroupAssignedColor', + KEY_GMAPS_OVER_LIMIT: 'WAGmapsOverLimit', + KEY_GLOBAL_MUTE_SOUNDS: 'WAGlobalSounds', + KEY_GLOBAL_MUTE_NOTIFICATIONS: 'WAGlobalNotifications', + KEY_GLOBAL_MUTE_IN_APP_NOTIFICATIONS: 'WAGlobalInAppNotifications', + KEY_GLOBAL_MUTE_PREVIEWS: 'WAGlobalPreviews', + KEY_GLOBAL_COLLAPSE_MUTED: 'WAGlobalCollapseMuted', + KEY_NOTIFICATION_SOUND: 'WANotificationSound', + KEY_LANG: 'WALangPref', + KEY_LAST_ACTIVE_EMOJI_TAB: 'WALastActiveEmojiTab', + KEY_LAST_SELECTED_COMPOSE_BOX_PANEL: 'WALastActiveComposeBoxPanel', + KEY_LAST_CHAT_MUTE_DURATION: 'WALastChatMuteDuration', + KEY_UNKNOWN_ID: 'WAUnknownID', + KEY_VERSION: 'WAVersion', + KEY_LOAD_RETRY_GENERATION: 'WALoadRetryGeneration', + KEY_WHATSAPP_MUTEX: 'whatsapp-mutex', + KEY_LAST_WID: 'last-wid', + KEY_LAST_WID_MD: 'last-wid-md', + KEY_SAVE_TO_CAMERA_ROLL: 'save_to_camera_roll', + KEY_SMB_LABEL_COLOR_PALETTE: 'smb_label_color_palette', + KEY_LAST_PUSHNAME: 'last-pushname', + KEY_PROTO_VERSION: 'WAProtoVersion', + KEY_MOBILE_PLATFORM: 'mobile-platform', + KEY_REMEMBER_ME: 'remember-me', + KEY_LOGOUT_TOKEN: 'logout-token', + KEY_OLD_LOGOUT_CREDS: 'old-logout-cred', + KEY_NO_TAKEOVER: 'no-takeover', + KEY_WHATSAPP_LS_VERSION: 'ver', + KEY_WAM_BUFFER: 'wam-buffer', + KEY_WAM_INFO: 'wam-info', + KEY_TIME_SPENT_EVENT: 'WaTimeSpentEvent', + KEY_VIDEO_VOLUME: 'video-volume', + KEY_VIDEO_MUTE: 'video-mute', + KEY_CONTACT_CHECKSUM: 'contact-checksum', + KEY_COMPOSE_CONTENTS_PREFIX: 'compose-contents_', + COOKIE_REF: 'ref', + COOKIE_TOK: 'tok', + PAGE_SIZE: 50, + MSG_PRELOAD_THRESHOLD: 20, + MEDIA_QUERY_LIMIT: 50, + MIN_PIC_SIDE: 192, + MAX_PIC_SIDE: 640, + PROF_PIC_THUMB_SIDE: 96, + MAX_CAPTION_LENGTH: 1024, + MAX_PRODUCT_SUBTITLE_LENGTH: 70, + MAX_REPLY_PRODUCT_TITLE_LENGTH: 40, + MAX_REPLY_PRODUCT_DESC_LENGTH: 95, + ALBUM_MIN_SIZE: 4, + ALBUM_MAX_SIZE: 102, + ALBUM_MAX_HEIGHT: 168, + ALBUM_PADDING: 3, + PRESENCE_COMPOSING_TIMEOUT: 25e3, + PRESENCE_RESEND_WAIT: 1e4, + MIMETYPE_OGG: 'audio/ogg', + IMAGE_MIMES: 'image/*', + WEBP_MIMES: 'image/webp', + VIDEO_MIMES: 'video/mp4,video/3gpp,video/quicktime', + KEY_LOG_CURSOR: 'debugCursor', + MAX_STATUS_LENGTH: 139, + MAX_PUSHNAME_LENGTH: 25, + DISP_TYPE: { + CONVERSATION: 'CONVERSATION', + MSG_INFO: 'MSG_INFO', + STARRED_MSGS: 'STARRED_MSGS', + GALLERY: 'GALLERY', + REPLY_STAGE: 'REPLY_STAGE', + QUOTED_MSG: 'QUOTED_MSG', + CONTACT_CARD: 'CONTACT_CARD', + }, + SEND_LOGS_MAX_EMAIL_LENGTH: 320, + SEND_LOGS_MAX_SUBJECT_LENGTH: 50, + SEND_LOGS_MIN_DESC_LENGTH: 10, + SEND_LOGS_MAX_DESC_LENGTH: 500, + SEND_LOGS_MAX_SCREENSHOTS: 3, + SEND_LOGS_MAX_SCREENSHOT_SIZE: 10485760, + ACK: { + MD_DOWNGRADE: -7, + INACTIVE: -6, + CONTENT_UNUPLOADABLE: -5, + CONTENT_TOO_BIG: -4, + CONTENT_GONE: -3, + EXPIRED: -2, + FAILED: -1, + CLOCK: 0, + SENT: 1, + RECEIVED: 2, + READ: 3, + PLAYED: 4, + }, + ACK_STRING: { + SENDER: 'sender', + DELIVERY: 'delivery', + READ: 'read', + PLAYED: 'played', + INACTIVE: 'inactive', + }, + RETRY: { + VALIDATE_OLD_SESSION: 2, + MAX_RETRY: 5, + }, + KEY_BUNDLE_TYPE: '', + EDIT_ATTR: { + REVOKE: 7, + }, + DEVICE: { + PRIMARY_DEVICE: 0, + PRIMARY_VERSION: -1, + }, + BATTERY_LOW_THRESHOLD_1: 15, + BATTERY_LOW_THRESHOLD_2: 5, + BATTERY_DELAY: 1e4, + WAM_MAX_BUFFER_SIZE: 5e4, + SOCKET_STATE: { + OPENING: 'OPENING', + PAIRING: 'PAIRING', + UNPAIRED: 'UNPAIRED', + UNPAIRED_IDLE: 'UNPAIRED_IDLE', + CONNECTED: 'CONNECTED', + TIMEOUT: 'TIMEOUT', + CONFLICT: 'CONFLICT', + UNLAUNCHED: 'UNLAUNCHED', + PROXYBLOCK: 'PROXYBLOCK', + TOS_BLOCK: 'TOS_BLOCK', + SMB_TOS_BLOCK: 'SMB_TOS_BLOCK', + DEPRECATED_VERSION: 'DEPRECATED_VERSION', + }, + SOCKET_STREAM: { + DISCONNECTED: 'DISCONNECTED', + SYNCING: 'SYNCING', + RESUMING: 'RESUMING', + CONNECTED: 'CONNECTED', + }, + COLLECTION_HAS_SYNCED: 'collection_has_synced', + NEW_MSG_SENT: 'new_msg_sent', + DIAGNOSTIC_DELAY: 18e3, + ONE_BY_ONE_TRANS_GIF: + 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7', + WALLPAPER_COLOR: [ + '#ede9e4', + '#ccebdc', + '#aed8c7', + '#7acba5', + '#c7e9eb', + '#a9dbd8', + '#68d5d9', + '#6ec3d4', + '#f2dad5', + '#f2d5e1', + '#fbcad2', + '#ffa7a8', + '#cbdaec', + '#d7d3eb', + '#e5c0eb', + '#d0deb1', + '#dee0b4', + '#e6dfa8', + '#f7e9a8', + '#ffd1a4', + '#ff8a8c', + '#ff5978', + '#f56056', + '#dc6e4f', + '#e6e365', + '#73c780', + '#2293a4', + '#219ed9', + '#2b5aa6', + '#74676a', + '#48324d', + '#dee3e9', + '#d9dade', + '#c0c1c4', + '#7e90a3', + '#55626f', + '#243640', + '#162127', + ], + DEFAULT_CHAT_WALLPAPER: 'default_chat_wallpaper', + INVERT_TRANSPARENT: { + '#ede9e4': !1, + '#ccebdc': !1, + '#aed8c7': !1, + '#7acba5': !1, + '#c7e9eb': !1, + '#a9dbd8': !1, + '#68d5d9': !1, + '#6ec3d4': !1, + '#f2dad5': !1, + '#f2d5e1': !1, + '#fbcad2': !1, + '#ffa7a8': !1, + '#cbdaec': !1, + '#d7d3eb': !1, + '#e5c0eb': !1, + '#d0deb1': !1, + '#dee0b4': !1, + '#e6dfa8': !1, + '#f7e9a8': !1, + '#ffd1a4': !1, + '#ff8a8c': !0, + '#ff5978': !0, + '#f56056': !0, + '#dc6e4f': !0, + '#e6e365': !1, + '#73c780': !0, + '#2293a4': !0, + '#219ed9': !0, + '#2b5aa6': !0, + '#74676a': !0, + '#48324d': !0, + '#dee3e9': !1, + '#d9dade': !1, + '#c0c1c4': !1, + '#7e90a3': !0, + '#55626f': !0, + '#243640': !0, + '#162127': !0, + }, + L10N_PRIORITY: { + SAVED: 6, + PHONE: 5, + PREVIOUS: 4, + URL: 3, + BROWSER: 2, + DEFAULT: 1, + }, + RENDER_CURSOR: { + RECENT_AT_TOP: 'recent_at_top', + RECENT_AT_BOTTOM: 'recent_at_bottom', + CONVERSATION: 'conversation', + GROUP_CONVERSATION: 'group_conversation', + STARRED_DRAWER: 'starred_drawer', + }, + SECURITY_LINK: 'https://www.whatsapp.com/security/', + SMB_TOS_LEARN_MORE_LINK: + 'https://www.whatsapp.com/legal/small-business-terms/', + SERVER_WID: 'server@c.us', + PSA_WID: '0@c.us', + STATUS_WID: 'status@broadcast', + OFFICIAL_BIZ_WID: '16505361212@c.us', + VISIBILITY: { + ABOVE: 'above', + VISIBLE: 'visible', + BELOW: 'below', + }, + VIDEO_STREAM_URL: '/stream/video', + SPELL_CHECK_SKIP_WORDS: { + en_us: new Set([ + 'ain', + 'couldn', + 'didn', + 'doesn', + 'hadn', + 'hasn', + 'mightn', + 'mustn', + 'needn', + 'oughtn', + 'shan', + 'shouldn', + 'wasn', + 'weren', + 'wouldn', + 'Ain', + 'Couldn', + 'Didn', + 'Doesn', + 'Hadn', + 'Hasn', + 'Mightn', + 'Mustn', + 'Needn', + 'Oughtn', + 'Shan', + 'Shouldn', + 'Wasn', + 'Weren', + 'Wouldn', + ]), + en_gb: new Set([ + 'ain', + 'couldn', + 'didn', + 'doesn', + 'hadn', + 'hasn', + 'mightn', + 'mustn', + 'needn', + 'oughtn', + 'shan', + 'shouldn', + 'wasn', + 'weren', + 'wouldn', + 'Ain', + 'Couldn', + 'Didn', + 'Doesn', + 'Hadn', + 'Hasn', + 'Mightn', + 'Mustn', + 'Needn', + 'Oughtn', + 'Shan', + 'Shouldn', + 'Wasn', + 'Weren', + 'Wouldn', + ]), + en: new Set([ + 'ain', + 'couldn', + 'didn', + 'doesn', + 'hadn', + 'hasn', + 'mightn', + 'mustn', + 'needn', + 'oughtn', + 'shan', + 'shouldn', + 'wasn', + 'weren', + 'wouldn', + 'Ain', + 'Couldn', + 'Didn', + 'Doesn', + 'Hadn', + 'Hasn', + 'Mightn', + 'Mustn', + 'Needn', + 'Oughtn', + 'Shan', + 'Shouldn', + 'Wasn', + 'Weren', + 'Wouldn', + ]), + }, + GROUP_INVITE_LINK_URL: 'https://chat.whatsapp.com/', + GROUP_SETTING_TYPE: { + ANNOUNCEMENT: 'announcement', + RESTRICT: 'restrict', + NO_FREQUENTLY_FORWARDED: 'no_frequently_forwarded', + EPHEMERAL: 'ephemeral', + }, + GROUP_SETTING_TO_METADATA: { + announcement: 'announce', + restrict: 'restrict', + no_frequently_forwarded: 'noFrequentlyForwarded', + ephemeral: 'ephemeralDuration', + }, + L10N: { + DEFAULT: 'en', + }, + EMOJI: { + BUCKET_SIZE: 25, + CATEGORIES: { + SMILEYS_PEOPLE: 'SMILEYS_PEOPLE', + ANIMALS_NATURE: 'ANIMALS_NATURE', + FOOD_DRINK: 'FOOD_DRINK', + ACTIVITY: 'ACTIVITY', + TRAVEL_PLACES: 'TRAVEL_PLACES', + OBJECTS: 'OBJECTS', + SYMBOLS: 'SYMBOLS', + FLAGS: 'FLAGS', + }, + CATEGORY_MAPPING: { + 'Smileys & People': 'SMILEYS_PEOPLE', + 'Animals & Nature': 'ANIMALS_NATURE', + 'Food & Drink': 'FOOD_DRINK', + Activity: 'ACTIVITY', + 'Travel & Places': 'TRAVEL_PLACES', + Objects: 'OBJECTS', + Symbols: 'SYMBOLS', + Flags: 'FLAGS', + }, + ORDERED_CATEGORY_IDS: [ + 'SMILEYS_PEOPLE', + 'ANIMALS_NATURE', + 'FOOD_DRINK', + 'ACTIVITY', + 'TRAVEL_PLACES', + 'OBJECTS', + 'SYMBOLS', + 'FLAGS', + ], + EMOJI_TYPE: { + APPLE: 'APPLE', + WHATSAPP: 'WHATSAPP', + }, + LARGE_EMOJI_BASE_PATH: '/img', + LARGE_EMOJI_ELECTRON_BASE_PATH: 'img', + EMOJI_SPRITES_BASE_PATH: '/img', + EMOJI_SPRITES_ELECTRON_BASE_PATH: 'img', + }, + MSG_TYPE: { + NOTIFICATION: 'notification', + NOTIFICATION_TEMPLATE: 'notification_template', + GROUP_NOTIFICATION: 'group_notification', + GP2: 'gp2', + BROADCAST_NOTIFICATION: 'broadcast_notification', + E2E_NOTIFICATION: 'e2e_notification', + CALL_LOG: 'call_log', + PROTOCOL: 'protocol', + CHAT: 'chat', + LOCATION: 'location', + PAYMENT: 'payment', + VCARD: 'vcard', + CIPHERTEXT: 'ciphertext', + MULTI_VCARD: 'multi_vcard', + REVOKED: 'revoked', + OVERSIZED: 'oversized', + GROUPS_V4_INVITE: 'groups_v4_invite', + TEMPLATE: 'template', + HSM: 'hsm', + TEMPLATE_BUTTON_REPLY: 'template_button_reply', + IMAGE: 'image', + VIDEO: 'video', + AUDIO: 'audio', + PTT: 'ptt', + STICKER: 'sticker', + DOCUMENT: 'document', + PRODUCT: 'product', + UNKNOWN: 'unknown', + }, + TEMPLATE_SUBTYPE: { + IMAGE: 'image', + VIDEO: 'video', + LOCATION: 'location', + DOCUMENT: 'document', + TEXT: 'text', + }, + TEMPLATE_BUTTON_SUBTYPE: { + QUICK_REPLY: 'quick_reply', + CALL: 'call', + URL: 'url', + }, + NATIVE_PREF: { + LAST_SAVED_LOCATION: 'lastSavedLocation', + CONTENT_SETTINGS: 'contentSettings', + }, + TOUCHBAR_MAX_EMOJIS: 8, + VERIFIED_LEVEL: { + UNKNOWN: 0, + LOW: 1, + HIGH: 2, + }, + HOSTNAME: { + YOUTUBE: 'www.youtube.com', + YOUTUBE_SHORTENED: 'youtu.be', + INSTAGRAM: 'www.instagram.com', + STREAMABLE: 'streamable.com', + FACEBOOK: 'www.facebook.com', + FBWATCH: 'fbwat.ch', + LASSOVIDEOS: 'lassovideos.com', + }, + WHATSAPP_ORIGIN: 'https://whatsapp.com', + SMB_SEARCH_FILTERS: { + UNREAD: 'unread', + GROUP: 'group', + BROADCAST: 'broadcast', + }, + SMB_LABELS: { + MAX_LABEL_LENGTH: 100, + }, + PRODUCT_INQUIRY_TYPE: 'product_inquiry', + PRODUCT_LIST_ITEM_HEIGHT: 96, + LOADABLE_DELAY: 200, + MAX_EPHEMERAL_DURATION: 31536e3, + EPHEMERAL_SETTINGS: { + OFF: 0, + ONE_HOUR: 3600, + ONE_DAY: 86400, + ONE_WEEK: 604800, + ONE_MONTH: 2592e3, + ONE_YEAR: 31536e3, + }, + TAB_ORDERS: { + COMPOSE_BOX_INPUT: 1, + MESSAGE_LIST: 2, + CHAT_STARRED_DRAWER: 3, + CHAT_LIST_SEARCH: 3, + CHAT_LIST: 4, + CHAT_CONTACT_LIST: 4, + CHAT_IMAGE_GALLERY: 4, + CHAT_SEARCH_MSG_LIST: 4, + PANEL_SEARCH_INPUT: 5, + COMPOSE_BOX_MENU_BUTTON: 5, + }, + SPEEDY_RESUME_MAX_CHATS: 5e3, + MEDIA_VIEWER: { + ANIMATION_DURATION: 500, + CLOSE_ANIMATION_DURATION: 200, + ZOOM_IN_FACTOR: 2, + }, +}; diff --git a/src/api/model/enum/group-notification-type.ts b/src/api/model/enum/group-notification-type.ts new file mode 100644 index 000000000..54cd1da0b --- /dev/null +++ b/src/api/model/enum/group-notification-type.ts @@ -0,0 +1,28 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export enum GroupNotificationType { + Add = 'add', + Inivite = 'invite', + Remove = 'remove', + Leave = 'leave', + Subject = 'subject', + Description = 'description', + Picture = 'picture', + Announce = 'announce', + Restrict = 'restrict', +} diff --git a/src/api/model/enum/group-property.ts b/src/api/model/enum/group-property.ts new file mode 100644 index 000000000..48c765dfa --- /dev/null +++ b/src/api/model/enum/group-property.ts @@ -0,0 +1,47 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +/** + * Group properties + */ +export enum GroupProperty { + /** + * Define how can send message in the group + * `true` only admins + * `false` everyone + */ + ANNOUNCEMENT = 'announcement', + + /** + * Define how can edit the group data + * `true` only admins + * `false` everyone + */ + RESTRICT = 'restrict', + + /** + * Non-Documented + */ + NO_FREQUENTLY_FORWARDED = 'no_frequently_forwarded', + + /** + * Enable or disable temporary messages + * `true` to enable + * `false` to disable + */ + EPHEMERAL = 'ephemeral', +} diff --git a/src/api/model/enum/index.ts b/src/api/model/enum/index.ts new file mode 100644 index 000000000..3c668d004 --- /dev/null +++ b/src/api/model/enum/index.ts @@ -0,0 +1,26 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export { AckType } from './ack-type'; +export { ChatState } from './chat-state'; +export { GroupNotificationType } from './group-notification-type'; +export { SocketState, SocketStream } from './socket-state'; +export { MessageType, MediaType } from './message-type'; +export * from './group-property'; +export * from './interface-mode'; +export * from './interface-state'; +export * from './status-find'; diff --git a/src/api/model/enum/interface-mode.ts b/src/api/model/enum/interface-mode.ts new file mode 100644 index 000000000..87b5f2197 --- /dev/null +++ b/src/api/model/enum/interface-mode.ts @@ -0,0 +1,55 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export enum InterfaceMode { + /** + * QR code page. + */ + QR = 'QR', + /** + * Chat page. + */ + MAIN = 'MAIN', + /** + * Loading page, waiting data from smartphone. + */ + SYNCING = 'SYNCING', + /** + * Offline page, when there are no internet. + */ + OFFLINE = 'OFFLINE', + /** + * Conflic page, when there are another whatsapp web openned. + */ + CONFLICT = 'CONFLICT', + /** + * Blocked page, by proxy. + */ + PROXYBLOCK = 'PROXYBLOCK', + /** + * Blocked page. + */ + TOS_BLOCK = 'TOS_BLOCK', + /** + * Blocked page. + */ + SMB_TOS_BLOCK = 'SMB_TOS_BLOCK', + /** + * Deprecated page. + */ + DEPRECATED_VERSION = 'DEPRECATED_VERSION', +} diff --git a/src/api/model/enum/interface-state.ts b/src/api/model/enum/interface-state.ts new file mode 100644 index 000000000..e538ebc5e --- /dev/null +++ b/src/api/model/enum/interface-state.ts @@ -0,0 +1,51 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export enum InterfaceState { + /** + * When there are no internet. + */ + OFFLINE = 'OFFLINE', + /** + * When the whatsapp web page is loading. + */ + OPENING = 'OPENING', + /** + * When the whatsapp web is connecting to smartphone after QR code scan. + */ + PAIRING = 'PAIRING', + /** + * When the whatsapp web is syncing messages with smartphone. + */ + SYNCING = 'SYNCING', + /** + * When the whatsapp web is syncing messages with smartphone after a disconnection. + */ + RESUMING = 'RESUMING', + /** + * When the whatsapp web is connecting to whatsapp server. + */ + CONNECTING = 'CONNECTING', + /** + * When the whatsapp web is ready. + */ + NORMAL = 'NORMAL', + /** + * When the whatsapp web couldn't connect to smartphone. + */ + TIMEOUT = 'TIMEOUT', +} diff --git a/src/api/model/enum/message-type.ts b/src/api/model/enum/message-type.ts new file mode 100644 index 000000000..f943ca677 --- /dev/null +++ b/src/api/model/enum/message-type.ts @@ -0,0 +1,65 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export enum MessageType { + NOTIFICATION = 'notification', + NOTIFICATION_TEMPLATE = 'notification_template', + GROUP_NOTIFICATION = 'group_notification', + + /** + * Group data modification, like subtitle or description and group members (join, leave) + * See {@link GroupNotificationType} + */ + GP2 = 'gp2', + BROADCAST_NOTIFICATION = 'broadcast_notification', + E2E_NOTIFICATION = 'e2e_notification', + CALL_LOG = 'call_log', + PROTOCOL = 'protocol', + CHAT = 'chat', + LOCATION = 'location', + PAYMENT = 'payment', + VCARD = 'vcard', + CIPHERTEXT = 'ciphertext', + MULTI_VCARD = 'multi_vcard', + REVOKED = 'revoked', + OVERSIZED = 'oversized', + GROUPS_V4_INVITE = 'groups_v4_invite', + HSM = 'hsm', + TEMPLATE_BUTTON_REPLY = 'template_button_reply', + IMAGE = 'image', + VIDEO = 'video', + AUDIO = 'audio', + PTT = 'ptt', + STICKER = 'sticker', + DOCUMENT = 'document', + PRODUCT = 'product', + ORDER = 'order', + LIST = 'list', + LIST_RESPONSE = 'list_response', + BUTTONS_RESPONSE = 'buttons_response', + POLL_CREATION = 'poll_creation', + UNKNOWN = 'unknown', +} + +export enum MediaType { + IMAGE = 'Image', + VIDEO = 'Video', + AUDIO = 'Audio', + PTT = 'Audio', + DOCUMENT = 'Document', + STICKER = 'Image', +} diff --git a/src/api/model/enum/socket-state.ts b/src/api/model/enum/socket-state.ts new file mode 100644 index 000000000..907009cd9 --- /dev/null +++ b/src/api/model/enum/socket-state.ts @@ -0,0 +1,92 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +/** + * SocketState are the possible states of connection between WhatsApp page and phone. + */ +export enum SocketState { + /** + * Conflic page, when there are another whatsapp web openned. + */ + CONFLICT = 'CONFLICT', + /** + * When the whatsapp web is ready. + */ + CONNECTED = 'CONNECTED', + /** + * Deprecated page. + */ + DEPRECATED_VERSION = 'DEPRECATED_VERSION', + /** + * When the whatsapp web page is loading. + */ + OPENING = 'OPENING', + /** + * When the whatsapp web is connecting to smartphone after QR code scan. + */ + PAIRING = 'PAIRING', + /** + * Blocked page, by proxy. + */ + PROXYBLOCK = 'PROXYBLOCK', + /** + * Blocked page. + */ + SMB_TOS_BLOCK = 'SMB_TOS_BLOCK', + /** + * When the whatsapp web couldn't connect to smartphone. + */ + TIMEOUT = 'TIMEOUT', + /** + * Blocked page. + */ + TOS_BLOCK = 'TOS_BLOCK', + /** + * When the whatsapp web page is initialized yet. + */ + UNLAUNCHED = 'UNLAUNCHED', + /** + * Disconnected page, waiting for QRCode scan + */ + UNPAIRED = 'UNPAIRED', + /** + * Disconnected page with expired QRCode + */ + UNPAIRED_IDLE = 'UNPAIRED_IDLE', +} + +/** + * SocketStream are the possible states of connection between WhatsApp page and WhatsApp servers. + */ +export enum SocketStream { + /** + * Connected with WhatsApp servers + */ + CONNECTED = 'CONNECTED', + /** + * Disconnected from WhatsApp servers + */ + DISCONNECTED = 'DISCONNECTED', + /** + * Reconnecting to WhatsApp servers + */ + RESUMING = 'RESUMING', + /** + * Receiving data from WhatsApp servers + */ + SYNCING = 'SYNCING', +} diff --git a/src/api/model/enum/status-find.ts b/src/api/model/enum/status-find.ts new file mode 100644 index 000000000..251dab918 --- /dev/null +++ b/src/api/model/enum/status-find.ts @@ -0,0 +1,66 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +/** + * SocketState are the possible states of connection between WhatsApp page and phone. + */ +export enum StatusFind { + /** + * The browser was closed using the autoClose. + */ + autocloseCalled = 'autocloseCalled', + /** + * If the browser is closed this parameter is returned. + */ + browserClose = 'browserClose', + /** + * Client has disconnected in to mobile. + */ + desconnectedMobile = 'desconnectedMobile', + /** + * Client is ready to send and receive messages. + */ + inChat = 'inChat', + /** + * When the user is already logged in to the browser. + */ + isLogged = 'isLogged', + /** + * When the user is not connected to the browser, it is necessary to scan the QR code through the cell phone in the option WhatsApp Web. + */ + notLogged = 'notLogged', + /** + * Client couldn't connect to phone. + */ + phoneNotConnected = 'phoneNotConnected', + /** + * Failed to authenticate. + */ + qrReadError = 'qrReadError', + /** + * If the browser stops when the QR code scan is in progress, this parameter is returned. + */ + qrReadFail = 'qrReadFail', + /** + * If the user is not logged in, the QR code is passed on the terminal a callback is returned. After the correct reading by cell phone this parameter is returned. + */ + qrReadSuccess = 'qrReadSuccess', + /** + * Client has disconnected in to wss. + */ + serverClose = 'serverClose', +} diff --git a/src/api/model/get-messages-param.ts b/src/api/model/get-messages-param.ts new file mode 100644 index 000000000..5ccbaec51 --- /dev/null +++ b/src/api/model/get-messages-param.ts @@ -0,0 +1,43 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +/** + * Parâmetros para retorno de mensagens + */ +export interface GetMessagesParam { + /** + * Quantidade de mensagens para retornar + * informar `-1` para trazer tudo (Pode demorar e travar a interface) + * + * @default 20 + */ + count?: number; + /** + * ID da última mensagem para continuar a busca + * Isso funciona como paginação, então ao pegar um ID, + * você pode utilizar para obter as próximas mensagens a partir dele + */ + id?: string; + fromMe?: boolean; + /** + * Se você deseja recuperar as mensagems antes(before) ou depois(after) + * do ID informado. + * + * @default 'before' + */ + direction?: 'before' | 'after'; +} diff --git a/src/api/model/group-creation.ts b/src/api/model/group-creation.ts new file mode 100644 index 000000000..9a6584961 --- /dev/null +++ b/src/api/model/group-creation.ts @@ -0,0 +1,24 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +import { Wid } from './wid'; + +export interface GroupCreation { + status: number; + gid: Wid; + participants: { [key: string]: any[] }[]; +} diff --git a/src/api/model/group-metadata.ts b/src/api/model/group-metadata.ts new file mode 100644 index 000000000..40f29484a --- /dev/null +++ b/src/api/model/group-metadata.ts @@ -0,0 +1,41 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +import { Wid } from './wid'; + +export interface GroupMetadata { + id: Wid; + creation: number; + owner: Wid; + desc: string; + descId: string; + descTime: number; + descOwner: Wid; + restrict: boolean; + announce: boolean; + noFrequentlyForwarded: boolean; + ephemeralDuration: number; + size: number; + support: boolean; + suspended: boolean; + terminated: boolean; + isParentGroup: boolean; + defaultSubgroup: boolean; + displayCadminPromotion: boolean; + participants: any[]; + pendingParticipants: any[]; +} diff --git a/src/api/model/host-device.ts b/src/api/model/host-device.ts new file mode 100644 index 000000000..f7bb1eae4 --- /dev/null +++ b/src/api/model/host-device.ts @@ -0,0 +1,53 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +import { Wid } from './wid'; + +export interface HostDevice { + id: string; + ref: string; + refTTL: number; + wid: Wid; + connected: boolean; + me: Wid; + protoVersion: number[]; + clientToken: string; + serverToken: string; + isResponse: string; + battery: number; + plugged: boolean; + lc: string; + lg: string; + locales: string; + is24h: boolean; + platform: string; + phone: Phone; + tos: number; + smbTos: number; + pushname: string; + blockStoreAdds: boolean; +} + +export interface Phone { + wa_version: string; + mcc: string; + mnc: string; + os_version: string; + device_manufacturer: string; + device_model: string; + os_build_number: string; +} diff --git a/src/api/model/id.ts b/src/api/model/id.ts new file mode 100644 index 000000000..7c8422e8b --- /dev/null +++ b/src/api/model/id.ts @@ -0,0 +1,25 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export interface Id { + server: string; + user: string; + _serialized: string; + fromMe: boolean; + remote: string; + id: string; +} diff --git a/src/api/model/incoming-call.ts b/src/api/model/incoming-call.ts new file mode 100644 index 000000000..e24061c2b --- /dev/null +++ b/src/api/model/incoming-call.ts @@ -0,0 +1,34 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export interface IncomingCall { + /** alphanumeric ID of the call, can e.g. usable for hanging up */ + id: string, + /** ID of the caller, can be used to message them directly */ + peerJid: string, + /** Epoch timestamp (seconds) */ + offerTime: number, + isVideo: boolean, + isGroup: boolean, + groupJid: string | null, + canHandleLocally: boolean, + outgoing: boolean, + isSilenced: boolean, + offerReceivedWhileOffline: boolean, + webClientShouldHandle: boolean, + participants: any[] +} diff --git a/src/api/model/index.ts b/src/api/model/index.ts new file mode 100644 index 000000000..4a7cff578 --- /dev/null +++ b/src/api/model/index.ts @@ -0,0 +1,38 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export { Chat } from './chat'; +export { Contact } from './contact'; +export { GroupMetadata } from './group-metadata'; +export { Id } from './id'; +export { Message } from './message'; +export { ParticipantEvent } from './participant-event'; +export { PartialMessage } from './partial-message'; +export { Ack } from './ack'; +export { HostDevice } from './host-device'; +export { LiveLocation } from './live-location'; +export { ContactStatus } from './contact-status'; +export { GroupCreation } from './group-creation'; +export { WhatsappProfile } from './whatsapp-profile'; +export { IncomingCall } from './incoming-call'; +export * from './result'; +export * from './get-messages-param'; +export * from './initializer'; +export * from './message-id'; +export * from './presence-event'; +export * from './profile-pic-thumb'; +export * from './wid'; diff --git a/src/api/model/initializer.ts b/src/api/model/initializer.ts new file mode 100644 index 000000000..2113dae39 --- /dev/null +++ b/src/api/model/initializer.ts @@ -0,0 +1,78 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ +import { CreateConfig } from '../../config/create-config'; +import { SessionToken } from '../../token-store'; +import { StatusFind } from './enum'; + +/** + * A callback will be received, informing the status of the qrcode + */ +export type CatchQRCallback = ( + qrCode: string, + asciiQR: string, + attempt: number, + urlCode?: string +) => void; + +/** + * A callback will be received, informing the customer's status + */ +export type StatusFindCallback = ( + status: StatusFind | keyof typeof StatusFind, + session: string +) => void; + +/** + * A callback will be received, informing data as percentage and loading screen message + */ +export type LoadingScreenCallback = (percent: number, message: string) => void; + +/** + * A callback will be received, informing a code to you connect + */ +export type LinkByCodeCallback = (code: string) => void; + +export interface CreateOptions extends CreateConfig { + /** + * You must pass a string type parameter, this parameter will be the name of the client's session. If the parameter is not passed, the section name will be "session". + */ + session: string; + /** + * A callback will be received, informing the status of the qrcode + */ + catchQR?: CatchQRCallback; + + /** + * A callback will be received, informing a code to you connect + */ + catchLinkCode?: LinkByCodeCallback; + + /** + * A callback will be received, informing the customer's status + */ + statusFind?: StatusFindCallback; + + /** + * A callback will be received, informing data as percentage and loading screen message + */ + onLoadingScreen?: LoadingScreenCallback; + /** + * Pass the session token information you can receive this token with the await client.getSessionTokenBrowser () function + * @deprecated in favor of `sessionToken` + */ + browserSessionToken?: SessionToken; +} diff --git a/src/api/model/label.ts b/src/api/model/label.ts new file mode 100644 index 000000000..a53cbc431 --- /dev/null +++ b/src/api/model/label.ts @@ -0,0 +1,23 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ +export interface Label { + id: string; + name: string; + color: number | null; + count: number; + hexColor: string; +} diff --git a/src/api/model/live-location.ts b/src/api/model/live-location.ts new file mode 100644 index 000000000..c9de3d766 --- /dev/null +++ b/src/api/model/live-location.ts @@ -0,0 +1,70 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +/** + * Interface de dados para os eventos de Localização em tempo real + */ +export interface LiveLocation { + /** + * Tipo de evento de Localização em tempo real + * * enable - Quando inicia o compartilhamento + * * update - Atualzação de localização + * * disable - Fim do compartilhamento + */ + type: 'enable' | 'update' | 'disable'; + + /** + * ID de contato que realizou o compartilhamento + */ + id: string; + + /** + * Latitude em graus + */ + lat: number; + + /** + * Longitude em graus + */ + lng: number; + + /** + * Velocidade atual em milhar por hora (mp/h) + */ + speed: number; + + /** + * Precisão da localização em metros + */ + accuracy?: number; + + /** + * Tempo em segundos após o último compartilhamento + */ + elapsed?: number; + + /** + * Graus de direção + */ + degrees?: number; + + /** + * Tempo em segundos para o compartilhamento + * Somente no type:enable + */ + shareDuration?: number; +} diff --git a/src/api/model/message-id.ts b/src/api/model/message-id.ts new file mode 100644 index 000000000..fe9642935 --- /dev/null +++ b/src/api/model/message-id.ts @@ -0,0 +1,25 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +import { Wid } from './wid'; + +export interface MessageId { + fromMe: boolean; + id: string; + remote: Wid; + _serialized: string; +} diff --git a/src/api/model/message.ts b/src/api/model/message.ts new file mode 100644 index 000000000..0695ac74d --- /dev/null +++ b/src/api/model/message.ts @@ -0,0 +1,89 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +import { Chat } from './chat'; +import { Contact } from './contact'; +import { MessageType } from './enum'; + +/** available during the `onMessage` event */ +export interface Message { + id: string; + /** exists when it is a displayable message (i.e. `MessageType.CHAT` / `"chat"`); the body is not included in notifications like group removal, etc. (`gp2`) */ + body?: string; + type: MessageType; + /** + * When type is GP2: {@link GroupNotificationType} + */ + subtype: string; + t: number; + notifyName: string; + from: string; + to: string; + author: string; + self: string; + ack: number; + invis: boolean; + isNewMsg: boolean; + star: boolean; + recvFresh: boolean; + interactiveAnnotations: any[]; + clientUrl: string; + deprecatedMms3Url: string; + directPath: string; + mimetype: string; + filehash: string; + uploadhash: string; + size: number; + mediaKey: string; + mediaKeyTimestamp: number; + width: number; + height: number; + broadcast: boolean; + mentionedJidList: any[]; + isForwarded: boolean; + labels: any[]; + sender: Contact; + timestamp: number; + content: string; + isGroupMsg: boolean; + isMMS: boolean; + isMedia: boolean; + isNotification: boolean; + isPSA: boolean; + /** + * @deprecated Use `getChat` to get chat details + */ + chat: Chat; + lastSeen: null | number | boolean; + chatId: string; + /** + * @deprecated Use the `quotedMsgId` attribute in `getMessageById` to get the message details + */ + quotedMsgObj: null; + quotedMsgId: null; + mediaData: MediaData; + recipients?: string[]; +} + +export interface MediaData { + type: string; + mediaStage: string; + animationDuration: number; + animatedAsNewMsg: boolean; + _swStreamingSupported: boolean; + _listeningToSwSupport: boolean; +} diff --git a/src/api/model/partial-message.ts b/src/api/model/partial-message.ts new file mode 100644 index 000000000..d82bdd7bd --- /dev/null +++ b/src/api/model/partial-message.ts @@ -0,0 +1,41 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export interface PartialMessage { + id: ID; + body: string; + type: string; + t: number; + notifyName: string; + from: string; + to: string; + self: string; + ack: number; + invis: boolean; + star: boolean; + broadcast: boolean; + mentionedJidList: any[]; + isForwarded: boolean; + labels: any[]; +} + +interface ID { + fromMe: boolean; + remote: string; + id: string; + _serialized: string; +} diff --git a/src/api/model/participant-event.ts b/src/api/model/participant-event.ts new file mode 100644 index 000000000..5fb3edfc4 --- /dev/null +++ b/src/api/model/participant-event.ts @@ -0,0 +1,25 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export interface ParticipantEvent { + by?: string; + byPushName?: string; + groupId: string; + action: 'add' | 'remove' | 'demote' | 'promote' | 'leaver' | 'join'; + operation: 'add' | 'remove' | 'demote' | 'promote'; + who: string[]; +} diff --git a/src/api/model/presence-event.ts b/src/api/model/presence-event.ts new file mode 100644 index 000000000..22a61bc01 --- /dev/null +++ b/src/api/model/presence-event.ts @@ -0,0 +1,40 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export interface PresenceEvent { + /** + * ID of contact or group + */ + id: string; + isOnline: boolean; + isGroup: boolean; + isUser: boolean; + state: 'available' | 'composing' | 'recording' | 'unavailable'; + /** + * Timestramp of event `Date.now()` + */ + t: number; + /** + * If is an user, check is a contact + */ + isContact?: boolean; + participants?: { + id: string; + state: 'available' | 'composing' | 'recording' | 'unavailable'; + shortName: string; + }[]; +} diff --git a/src/api/model/presence.ts b/src/api/model/presence.ts new file mode 100644 index 000000000..a60554c1c --- /dev/null +++ b/src/api/model/presence.ts @@ -0,0 +1,23 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +import { Wid } from './wid'; + +export interface Presence { + id: Wid; + chatstates: any[]; +} diff --git a/src/api/model/profile-pic-thumb.ts b/src/api/model/profile-pic-thumb.ts new file mode 100644 index 000000000..6372dc38f --- /dev/null +++ b/src/api/model/profile-pic-thumb.ts @@ -0,0 +1,29 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ +import { Wid } from './wid'; + +/** + * Profile picture data + */ +export interface ProfilePicThumbObj { + eurl: string; + id: Wid; + img: string; + imgFull: string; + raw: null; + tag: string; +} diff --git a/src/api/model/qrcode.ts b/src/api/model/qrcode.ts new file mode 100644 index 000000000..78739d70f --- /dev/null +++ b/src/api/model/qrcode.ts @@ -0,0 +1,21 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export interface ScrapQrcode { + base64Image: string; + urlCode: string; +} diff --git a/src/api/model/result.ts b/src/api/model/result.ts new file mode 100644 index 000000000..60cd97f4c --- /dev/null +++ b/src/api/model/result.ts @@ -0,0 +1,50 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +import { HostDevice } from './host-device'; +import { MessageId } from './message-id'; + +export interface ScopeResult { + me: HostDevice; + to: MessageId & { + formattedName: string; + isBusiness: boolean; + isMyContact: boolean; + verifiedName: string; + pushname?: string; + }; + erro?: boolean; + text?: string | null; + status?: number | string; +} + +export interface SendFileResult extends ScopeResult { + type: string; + filename: string; + text?: string; + mimeType?: string; +} + +export interface SendStickerResult extends ScopeResult { + type: string; +} + +export interface SendPttResult extends ScopeResult { + type: string; + filename: string; + text?: string; +} diff --git a/src/api/model/whatsapp-profile.ts b/src/api/model/whatsapp-profile.ts new file mode 100644 index 000000000..3e14be36f --- /dev/null +++ b/src/api/model/whatsapp-profile.ts @@ -0,0 +1,26 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +import { Id } from './id'; + +export interface WhatsappProfile { + id: Id; + status: number; + isBusiness: boolean; + canReceiveMessage: boolean; + numberExists: boolean; +} diff --git a/src/api/model/wid.ts b/src/api/model/wid.ts new file mode 100644 index 000000000..c43633c2e --- /dev/null +++ b/src/api/model/wid.ts @@ -0,0 +1,39 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +/** + * ID of user or group + * "xxxxxxxxxx@c.us" for contacts + * "xxxxxxxxxx@g.us" for groups + */ +export interface Wid { + /** + * "c.us" for contacts + * "g.us" for groups + */ + server: string; + + /** + * number of contact or group + */ + user: string; + + /** + * user@server + */ + _serialized: string; +} diff --git a/src/api/whatsapp.ts b/src/api/whatsapp.ts new file mode 100644 index 000000000..78428a05d --- /dev/null +++ b/src/api/whatsapp.ts @@ -0,0 +1,249 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +import axios from 'axios'; +import { Page } from 'puppeteer'; +import { CreateConfig } from '../config/create-config'; +import { useragentOverride } from '../config/WAuserAgente'; +import { evaluateAndReturn } from './helpers'; +import { magix, makeOptions, timeout } from './helpers/decrypt'; +import { BusinessLayer } from './layers/business.layer'; +import { GetMessagesParam, Message } from './model'; +import treekill = require('tree-kill'); + +export class Whatsapp extends BusinessLayer { + private connected: boolean | null = null; + + constructor(public page: Page, session?: string, options?: CreateConfig) { + super(page, session, options); + + let interval: any = null; + + if (this.page) { + this.page.on('close', async () => { + clearInterval(interval); + }); + } + + interval = setInterval(async (state) => { + const newConnected = await page + .evaluate(() => WPP.conn.isRegistered()) + .catch(() => null); + + if (newConnected === null || newConnected === this.connected) { + return; + } + + this.connected = newConnected; + if (!newConnected) { + this.log('info', 'Session Unpaired', { type: 'session' }); + setTimeout(async () => { + if (this.statusFind) { + try { + this.statusFind('desconnectedMobile', session); + } catch (error) {} + } + }, 1000); + } + }, 1000); + } + + protected async afterPageScriptInjected() { + await super.afterPageScriptInjected(); + this.page + .evaluate(() => WPP.conn.isRegistered()) + .then((isAuthenticated) => { + this.connected = isAuthenticated; + }) + .catch(() => null); + } + /** + * Decrypts message file + * @param data Message object + * @returns Decrypted file buffer (null otherwise) + */ + public async downloadFile(data: string) { + return await evaluateAndReturn( + this.page, + (data) => WAPI.downloadFile(data), + data + ); + } + + /** + * Download and returns the media content in base64 format + * @param messageId Message ou id + * @returns Base64 of media + */ + public async downloadMedia(messageId: string | Message): Promise { + if (typeof messageId !== 'string') { + messageId = messageId.id; + } + + return await evaluateAndReturn( + this.page, + async (messageId) => + WPP.util.blobToBase64(await WPP.chat.downloadMedia(messageId)), + messageId + ); + } + + /** + * Get the puppeteer page instance + * @returns The Whatsapp page + */ + get waPage(): Page { + return this.page; + } + + /** + * Get the puppeteer page screenshot + * @returns The Whatsapp page screenshot encoded in base64 + */ + public async takeScreenshot() { + if (this.page) { + return await this.page.screenshot({ encoding: 'base64' }); + } + } + + /** + * Clicks on 'use here' button (When it get unlaunched) + * This method tracks the class of the button + * Whatsapp web might change this class name over the time + * Dont rely on this method + */ + public async useHere() { + return await evaluateAndReturn(this.page, () => WAPI.takeOver()); + } + + /** + * Logout whastapp + * @returns boolean + */ + public async logout() { + return await evaluateAndReturn(this.page, () => WPP.conn.logout()); + } + + /** + * Closes page and browser + * @internal + */ + public async close() { + const browser = this.page.browser(); + + if (!this.page.isClosed()) { + await this.page.close().catch(() => null); + + await browser.close().catch(() => null); + /* + Code removed as it is not necessary. + try { + const process = browser.process(); + if (process) { + treekill(process.pid, 'SIGKILL'); + } + } catch (error) {} + */ + } + + return true; + } + + /** + * Return PID process + * @internal + */ + public getPID() { + const browser = this.page.browser(); + const process = browser.process(); + return process.pid; + } + + /** + * Get message by id + * @param messageId string + * @returns Message object + */ + public async getMessageById(messageId: string) { + return (await evaluateAndReturn( + this.page, + (messageId: any) => WAPI.getMessageById(messageId), + messageId + )) as Message; + } + + /** + * Retorna uma lista de mensagens de um chat + * @param chatId string ID da conversa ou do grupo + * @param params GetMessagesParam Opções de filtragem de resultados (count, id, direction) veja {@link GetMessagesParam}. + * @returns Message object + */ + public async getMessages(chatId: string, params: GetMessagesParam = {}) { + return await evaluateAndReturn( + this.page, + ({ chatId, params }) => WAPI.getMessages(chatId, params), + { chatId, params: params as any } + ); + } + + /** + * Decrypts message file + * @param message Message object + * @returns Decrypted file buffer (null otherwise) + */ + public async decryptFile(message: Message) { + const mediaUrl = message.clientUrl || message.deprecatedMms3Url; + + const options = makeOptions(useragentOverride); + + if (!mediaUrl) + throw new Error( + 'message is missing critical data needed to download the file.' + ); + let haventGottenImageYet = true; + let res: any; + try { + while (haventGottenImageYet) { + res = await axios.get(mediaUrl.trim(), options); + if (res.status == 200) { + haventGottenImageYet = false; + } else { + await timeout(2000); + } + } + } catch (error) { + throw 'Error trying to download the file.'; + } + const buff = Buffer.from(res.data, 'binary'); + return magix(buff, message.mediaKey, message.type, message.size); + } + + /** + * Rejeita uma ligação recebida pelo WhatsApp + * @param callId string ID da ligação, caso não passado, todas ligações serão rejeitadas + * @returns Número de ligações rejeitadas + */ + public async rejectCall(callId?: string) { + return await evaluateAndReturn( + this.page, + ({ callId }) => WPP.call.rejectCall(callId), + { + callId, + } + ); + } +} diff --git a/src/config/WAuserAgente.ts b/src/config/WAuserAgente.ts new file mode 100644 index 000000000..be60f3671 --- /dev/null +++ b/src/config/WAuserAgente.ts @@ -0,0 +1,20 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +const useragentOverride = + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.63 Safari/537.36'; +export { useragentOverride }; diff --git a/src/config/create-config.ts b/src/config/create-config.ts new file mode 100644 index 000000000..77604fd47 --- /dev/null +++ b/src/config/create-config.ts @@ -0,0 +1,202 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ +import { Browser, BrowserContext, Page, launch } from 'puppeteer'; +import { Logger } from 'winston'; +import { SessionToken, TokenStore } from '../token-store'; +import { defaultLogger } from '../utils/logger'; + +// Server config +export interface CreateConfig { + /** + * Headless chrome + * @default true + */ + headless?: boolean | 'shell'; + /** + * Open devtools by default + * @default false + */ + devtools?: boolean; + /** + * If false will use Chromium instance + * @default true + */ + useChrome?: boolean; + /** + * Opens a debug session + * @default false + */ + debug?: boolean; + /** + * If you want to use browserWSEndpoint + */ + browserWS?: string; + /** + * Parameters to be added into the chrome browser instance + */ + browserArgs?: string[]; + /** + * Will be passed to puppeteer.launch + */ + puppeteerOptions?: Parameters[0]; + /** + * Pass a external browser instance, can be used with electron + */ + browser?: Browser | BrowserContext; + /** + * Pass a external page instance, can be used with electron + */ + page?: Page; + /** + * Logs QR automatically in terminal + * @default true + */ + logQR?: boolean; + /** + * Will disable the welcoming message which appears in the beginning + * @default false + */ + disableWelcome?: boolean; + /** + * Logs info updates automatically in terminal + * @default true + */ + updatesLog?: boolean; + /** + * Automatically closes the wppconnect only when scanning the QR code (default 60000 miliseconds, if you want to turn it off, assign 0 or false) + * @default 60000 + */ + autoClose?: number; + /** + * Automatically closes the wppconnect only when is syncing the device (default 180000 miliseconds, 3 minutes, if you want to turn it off, assign 0 or false) + * @default 180000 (3 minutes) + */ + deviceSyncTimeout?: number; + /** + * Wait for in chat to return a instance of {@link Whatsapp} + * @default false + */ + waitForLogin?: boolean; + /** + * Wait for in chat to return a instance of {@link Whatsapp} + * @default false + */ + logger?: Logger; + + /** + * Initial token to log in in WhatsApp. + * If not passed, the client will get it from {@link tokenStore}. + * @deprecated + */ + sessionToken?: SessionToken; + + /** + * Token store used to manage token {@link tokenStore} + * @default 'file' + * @deprecated + */ + tokenStore?: TokenStore | string; + + /** Folder name when saving tokens if {@link tokenStore} is 'file'. + * @default 'tokens' + */ + folderNameToken?: string; + + /** + * folder directory tokens, just inside the wppconnect folder, example: { mkdirFolderToken: '/node_modules', } //will save the tokens folder in the node_modules directory + * @deprecated See {@link tokenStore} + */ + mkdirFolderToken?: string; + + /** + * Creates a folder when inserting an object in the client's browser, to work it is necessary to pass the parameters in the function create browserSessionToken + * @deprecated See {@link tokenStore} + * @default true + */ + createPathFileToken?: boolean; + + /** + * Quando definido, essa opção força o carregamento de uma versão específica do WhatsApp WEB + * Normalmente, versões mais antigas continuam funcionando por mais um tempo, + * assim, com essa opção, é possível ter uma janela de tempo maior para se preparar para atualizações. + * Caso seja definido vazio ou null, será usado a versão atual, ou seja, sem forçar versão específica. + * @default 2.2134.x + */ + whatsappVersion?: string; + + /** + * Define the connected device name in WhatsApp app + * @default 'WPPConnect' + */ + deviceName?: string | false; + + /** + * Set custom Link Preview API servers + * @default null + */ + linkPreviewApiServers?: string[] | null; + + /** + * Disable custom Google Analytics + * @default true + */ + disableGoogleAnalytics?: boolean; + + /** + * Custom Google Analytics Tracker Id, like 'G-XXXXXXXXXX' + * collect analytics data to your GA account + * @default null + */ + googleAnalyticsId?: string | null; + + /** + * Custom variable for Google Analytics + * @default 'WPPConnect' + */ + poweredBy?: string; + + /** + * Insert the phone number for connect by link phone, qr code not wil generate + */ + phoneNumber?: string; +} + +export const defaultOptions: CreateConfig = { + folderNameToken: './tokens', + headless: true, + devtools: false, + useChrome: true, + debug: false, + logQR: true, + browserWS: '', + browserArgs: [''], + puppeteerOptions: {}, + disableWelcome: false, + updatesLog: true, + autoClose: 60000, + deviceSyncTimeout: 180000, + createPathFileToken: true, + waitForLogin: true, + logger: defaultLogger, + tokenStore: 'file', + whatsappVersion: '2.3000.1013232587-alpha', + deviceName: false, + linkPreviewApiServers: null, + disableGoogleAnalytics: true, + googleAnalyticsId: null, + poweredBy: 'WPPConnect', +}; diff --git a/src/config/puppeteer.config.ts b/src/config/puppeteer.config.ts new file mode 100644 index 000000000..0ac774fe0 --- /dev/null +++ b/src/config/puppeteer.config.ts @@ -0,0 +1,61 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +const puppeteerConfig = { + whatsappUrl: 'https://web.whatsapp.com', + chromiumArgs: [ + // `--app=${WAUrl}`, + '--log-level=3', // fatal only + //'--start-maximized', + '--no-default-browser-check', + '--disable-site-isolation-trials', + '--no-experiments', + '--ignore-gpu-blacklist', + '--ignore-certificate-errors', + '--ignore-certificate-errors-spki-list', + '--disable-gpu', + '--disable-extensions', + '--disable-default-apps', + '--enable-features=NetworkService', + '--disable-setuid-sandbox', + '--no-sandbox', + // Extras + '--disable-webgl', + '--disable-infobars', + '--window-position=0,0', + '--ignore-certifcate-errors', + '--ignore-certifcate-errors-spki-list', + '--disable-threaded-animation', + '--disable-threaded-scrolling', + '--disable-in-process-stack-traces', + '--disable-histogram-customizer', + '--disable-gl-extensions', + '--disable-composited-antialiasing', + '--disable-canvas-aa', + '--disable-3d-apis', + '--disable-accelerated-2d-canvas', + '--disable-accelerated-jpeg-decoding', + '--disable-accelerated-mjpeg-decode', + '--disable-app-list-dismiss-on-blur', + '--disable-accelerated-video-decode', + '--disable-dev-shm-usage', + '--autoplay-policy=no-user-gesture-required', + '--disable-blink-features=AutomationControlled', + ], +}; + +export { puppeteerConfig }; diff --git a/src/controllers/auth.ts b/src/controllers/auth.ts new file mode 100644 index 000000000..c1941a5ad --- /dev/null +++ b/src/controllers/auth.ts @@ -0,0 +1,89 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +import * as puppeteer from 'puppeteer'; +import * as qrcode from 'qrcode-terminal'; + +export const getInterfaceStatus = async ( + waPage: puppeteer.Page +): Promise>>> => { + return await waPage + .waitForFunction( + () => { + const elLoginWrapper = document.querySelector( + 'body > div > div > .landing-wrapper' + ); + const elQRCodeCanvas = document.querySelector('canvas'); + if (elLoginWrapper && elQRCodeCanvas) { + return 'UNPAIRED'; + } + + const streamStatus = WPP?.whatsapp?.Stream?.displayInfo; + if (['PAIRING', 'RESUMING', 'SYNCING'].includes(streamStatus)) { + return 'PAIRING'; + } + const elChat = document.querySelector('.app,.two') as HTMLDivElement; + if (elChat && elChat.attributes && elChat.tabIndex) { + return 'CONNECTED'; + } + return false; + }, + { + timeout: 0, + polling: 100, + } + ) + .then(async (element: puppeteer.HandleFor>>) => { + return (await element.evaluate((a: any) => a)) as puppeteer.HandleFor< + ReturnType + >; + }) + .catch(() => null); +}; + +/** + * Validates if client is authenticated + * @returns true if is authenticated, false otherwise + * @param waPage + */ +export const isAuthenticated = (waPage: puppeteer.Page) => { + return waPage.evaluate(() => WPP.conn.isRegistered()); +}; + +export const needsToScan = async (waPage: puppeteer.Page) => { + const connected = await isAuthenticated(waPage); + + return !connected; +}; + +export const isInsideChat = async (waPage: puppeteer.Page) => { + return await waPage.evaluate(() => WPP.conn.isMainReady()); +}; + +export const isConnectingToPhone = async (waPage: puppeteer.Page) => { + return await waPage.evaluate( + () => WPP.conn.isMainLoaded() && !WPP.conn.isMainReady() + ); +}; + +export async function asciiQr(code: string): Promise { + return new Promise((resolve) => { + qrcode.generate(code, { small: true }, (qrcode) => { + resolve(qrcode); + }); + }); +} diff --git a/src/controllers/browser.ts b/src/controllers/browser.ts new file mode 100644 index 000000000..15299ea0d --- /dev/null +++ b/src/controllers/browser.ts @@ -0,0 +1,374 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +import * as ChromeLauncher from 'chrome-launcher'; +import * as os from 'os'; +import * as path from 'path'; +import * as rimraf from 'rimraf'; +import * as waVersion from '@wppconnect/wa-version'; +import axios from 'axios'; +import { Browser, BrowserContext, Page } from 'puppeteer'; +import puppeteer from 'puppeteer-extra'; +import { CreateConfig } from '../config/create-config'; +import { puppeteerConfig } from '../config/puppeteer.config'; +import StealthPlugin from 'puppeteer-extra-plugin-stealth'; +import { useragentOverride } from '../config/WAuserAgente'; +import { WebSocketTransport } from './websocket'; +import { Logger } from 'winston'; +import { SessionToken } from '../token-store'; +import { LoadingScreenCallback } from '../api/model'; +import { LogLevel } from '../utils/logger'; +import { sleep } from '../utils/sleep'; + +export async function unregisterServiceWorker(page: Page) { + await page.evaluateOnNewDocument(() => { + // Remove existent service worker + navigator.serviceWorker + .getRegistrations() + .then((registrations) => { + for (let registration of registrations) { + registration.unregister(); + } + }) + .catch((err) => null); + + // Disable service worker registration + // @ts-ignore + navigator.serviceWorker.register = new Promise(() => {}); + + setInterval(() => { + window.onerror = console.error; + window.onunhandledrejection = console.error; + }, 500); + }); +} + +/** + * Força o carregamento de uma versão específica do WhatsApp WEB + * @param page Página a ser injetada + * @param version Versão ou expressão semver + */ +export async function setWhatsappVersion( + page: Page, + version: string, + log?: (level: LogLevel, message: string, meta?: object) => any +) { + let body: string | null = null; + try { + body = waVersion.getPageContent(version); + } catch (error) {} + + if (!body) { + log?.( + 'error', + `Version not available for ${version}, using latest as fallback` + ); + return; + } + + await page.setRequestInterception(true); + + page.on('request', (req) => { + if (req.url().startsWith('https://web.whatsapp.com/check-update')) { + req.abort(); + return; + } + if (req.url() !== 'https://web.whatsapp.com/') { + req.continue(); + return; + } + + req.respond({ + status: 200, + contentType: 'text/html', + body: body, + }); + }); +} + +export async function initWhatsapp( + page: Page, + token?: SessionToken, + clear = true, + version?: string, + log?: (level: LogLevel, message: string, meta?: object) => any +) { + await page.setUserAgent(useragentOverride); + + await unregisterServiceWorker(page); + + if (version) { + log?.('verbose', `Setting WhatsApp WEB version to ${version}`); + await setWhatsappVersion(page, version, log); + } + + log?.('verbose', `Loading WhatsApp WEB`); + await page.goto(puppeteerConfig.whatsappUrl, { + waitUntil: 'load', + timeout: 0, + referer: 'https://whatsapp.com/', + }); + log?.('verbose', 'WhatsApp WEB loaded'); + /*setTimeout(() => { + log?.('verbose', `Loading WhatsApp WEB`); + + const timeout = 10 * 1000; + page + .goto(puppeteerConfig.whatsappUrl, { + timeout, + waitUntil: 'domcontentloaded', + }) + .catch(() => {}); + + log?.('verbose', `WhatsApp WEB loaded`); + }, 1000); + */ + + return page; +} + +let lastPercent = null; +let lastPercentMessage = null; +export async function onLoadingScreen( + page: Page, + onLoadingScreenCallBack?: LoadingScreenCallback +) { + await page.evaluate(`function getElementByXpath(path) { + return document.evaluate(path, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; + }`); + + await page + .exposeFunction( + 'loadingScreen', + async (percent: number, message: string) => { + if (lastPercent !== percent || lastPercentMessage !== message) { + onLoadingScreenCallBack && onLoadingScreenCallBack(percent, message); + lastPercent = percent; + lastPercentMessage = message; + } + } + ) + .catch(() => null); + + await page.evaluate( + function (selectors) { + let observer = new MutationObserver(function () { + let window2: any = window; + + let progressBar = window2.getElementByXpath(selectors.PROGRESS); + let progressMessage = window2.getElementByXpath( + selectors.PROGRESS_MESSAGE + ); + + if (progressBar) { + if ( + this.lastPercent !== progressBar.value || + this.lastPercentMessage !== progressMessage.innerText + ) { + window2.loadingScreen(progressBar.value, progressMessage.innerText); + this.lastPercent = progressBar.value; + this.lastPercentMessage = progressMessage.innerText; + } + } + }); + + observer.observe(document, { + attributes: true, + childList: true, + characterData: true, + subtree: true, + }); + }, + { + PROGRESS: "//*[@id='app']/div/div/div[2]/progress", + PROGRESS_MESSAGE: "//*[@id='app']/div/div/div[3]", + } + ); +} + +export async function injectApi( + page: Page, + onLoadingScreenCallBack?: LoadingScreenCallback +) { + const injected = await page + .evaluate(() => { + // @ts-ignore + return ( + typeof window.WAPI !== 'undefined' && + typeof window.Store !== 'undefined' + ); + }) + .catch(() => false); + + if (injected) { + return; + } + + // Wait for some loaded modules + await page + .waitForFunction( + () => ((window as any)?.webpackChunkwhatsapp_web_client?.length || 0) > 3 + ) + .catch(() => null); + + await sleep(100); + + await page.addScriptTag({ + path: require.resolve('@wppconnect/wa-js'), + }); + + await page + .evaluate(() => { + WPP.chat.defaultSendMessageOptions.createChat = true; + WPP.conn.setKeepAlive(true); + }) + .catch(() => false); + + await page.addScriptTag({ + path: require.resolve( + path.join(__dirname, '../../dist/lib/wapi', 'wapi.js') + ), + }); + + await onLoadingScreen(page, onLoadingScreenCallBack); + // Make sure WAPI is initialized + await page + .waitForFunction(() => { + return ( + typeof window.WAPI !== 'undefined' && + typeof window.Store !== 'undefined' && + window.WPP.isReady + ); + }) + .catch(() => false); +} + +/** + * Initializes browser, will try to use chrome as default + * @param session + */ +export async function initBrowser( + session: string, + options: CreateConfig, + logger: Logger +): Promise { + if (options.useChrome) { + const chromePath = getChrome(); + if (chromePath) { + if (!options.puppeteerOptions) { + options.puppeteerOptions = {}; + } + options.puppeteerOptions.executablePath = chromePath; + } else { + logger.warn('Chrome not found, using chromium', { + session, + type: 'browser', + }); + } + } + + // Use stealth plugin to avoid being detected as a bot + puppeteer.use(StealthPlugin()); + + let browser = null; + if (options.browserWS && options.browserWS != '') { + const transport = await getTransport(options.browserWS); + browser = await puppeteer.connect({ transport }); + } else { + /** + * Setting the headless mode to the old Puppeteer mode, when using the 'new' mode, results in an error on CentOS7 and Debian11. + * Temporary fix. + */ + browser = await puppeteer.launch({ + headless: options.headless, + devtools: options.devtools, + args: options.browserArgs + ? options.browserArgs + : [...puppeteerConfig.chromiumArgs], + ...options.puppeteerOptions, + }); + + // Register an exit callback to remove user-data-dir + try { + const arg = browser + .process() + .spawnargs.find((s: string) => s.startsWith('--user-data-dir=')); + + if (arg) { + const tmpUserDataDir = arg.split('=')[1]; + + // Only if path is in TMP directory + if ( + path.relative(os.tmpdir(), tmpUserDataDir).startsWith('puppeteer') + ) { + process.on('exit', () => { + // Remove only on exit signal + try { + rimraf.sync(tmpUserDataDir); + } catch (error) {} + }); + } + } + } catch (error) {} + } + + return browser; +} + +export async function getOrCreatePage( + browser: Browser | BrowserContext +): Promise { + const pages = await browser.pages(); + + if (pages.length) { + return pages[0]; + } + + return await browser.newPage(); +} + +/** + * Retrieves chrome instance path + */ +function getChrome() { + try { + return ChromeLauncher.Launcher.getFirstInstallation(); + } catch (error) { + return undefined; + } +} + +async function getTransport(browserWS: string) { + let error = null; + try { + return await WebSocketTransport.create(browserWS, 10000); + } catch (e) { + error = e; + } + + // Automatic get the endpoint + try { + const endpointURL = + browserWS.replace(/ws(s)?:/, 'http$1:') + '/json/version'; + const data = await axios.get(endpointURL).then((r) => r.data); + + return await WebSocketTransport.create(data.webSocketDebuggerUrl, 10000); + } catch (e) {} + + // Throw first error + throw error; +} diff --git a/src/controllers/initializer.ts b/src/controllers/initializer.ts new file mode 100644 index 000000000..cb98e658a --- /dev/null +++ b/src/controllers/initializer.ts @@ -0,0 +1,275 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +import { Whatsapp } from '../api/whatsapp'; +import { CreateConfig, defaultOptions } from '../config/create-config'; +import { initBrowser, getOrCreatePage } from './browser'; +import { checkUpdates, welcomeScreen } from './welcome'; +import { SocketState, StatusFind } from '../api/model/enum'; +import { Browser } from 'puppeteer'; +import { + CatchQRCallback, + CreateOptions, + LinkByCodeCallback, + LoadingScreenCallback, + StatusFindCallback, +} from '../api/model/initializer'; +import { SessionToken } from '../token-store'; +import { defaultLogger } from '../utils/logger'; +import * as path from 'path'; +import * as fs from 'fs'; +import sanitize from 'sanitize-filename'; +import { sleep } from '../utils/sleep'; + +process.on( + 'unhandledRejection', + (reason: Error | any, promise: Promise) => { + let message = 'Unhandled Rejection: '; + if (reason instanceof Error) { + if (reason.stack) { + message += reason.stack; + } else { + message += reason.toString(); + } + } else { + message += JSON.stringify(reason); + } + + defaultLogger.error(message); + } +); + +/** + * Start the bot + * @returns Whatsapp page, with this parameter you will be able to access the bot functions + */ +export async function create(createOption: CreateOptions): Promise; +/** + * Start the bot + * You must pass a string type parameter, this parameter will be the name of the client's session. If the parameter is not passed, the section name will be "session". + * @returns Whatsapp page, with this parameter you will be able to access the bot functions + * @deprecated Deprecated in favor of create with {@link CreateOptions} (e.g., wppconnect.create({session: 'test'})). + */ +export async function create( + sessionName: string, + catchQR?: CatchQRCallback, + statusFind?: StatusFindCallback, + onLoadingScreen?: LoadingScreenCallback, + catchLinkCode?: LinkByCodeCallback, + options?: CreateConfig, + browserSessionToken?: SessionToken +): Promise; + +export async function create( + sessionOrOption: string | CreateOptions, + catchQR?: CatchQRCallback, + statusFind?: StatusFindCallback, + onLoadingScreen?: LoadingScreenCallback, + catchLinkCode?: LinkByCodeCallback, + options?: CreateConfig, + browserSessionToken?: SessionToken +): Promise { + let session = 'session'; + let usingDeprecatedCreate = false; + + if ( + typeof sessionOrOption === 'string' && + sessionOrOption.replace(/\s/g, '').length + ) { + session = sessionOrOption.replace(/\s/g, ''); + + usingDeprecatedCreate = + typeof sessionOrOption === 'string' || + typeof catchQR !== 'undefined' || + typeof statusFind !== 'undefined' || + typeof options !== 'undefined' || + typeof browserSessionToken !== 'undefined'; + } else if (typeof sessionOrOption === 'object') { + options = sessionOrOption; + if (sessionOrOption.session) session = sessionOrOption.session; + catchQR = sessionOrOption.catchQR || catchQR; + statusFind = sessionOrOption.statusFind || statusFind; + onLoadingScreen = sessionOrOption.onLoadingScreen || onLoadingScreen; + catchLinkCode = sessionOrOption.catchLinkCode || catchLinkCode; + + if (!options.sessionToken) { + options.sessionToken = + sessionOrOption.browserSessionToken || browserSessionToken; + } + } + + const mergedOptions = { ...defaultOptions, ...options }; + + const logger = mergedOptions.logger; + + if (usingDeprecatedCreate) { + logger.warn( + 'You are using deprecated create method, please use create({options}) See: https://wppconnect.io/wppconnect/pages/Getting%20Started/creating-client.html#passing-options-on-create' + ); + } + + if (!mergedOptions.disableWelcome) { + welcomeScreen(); + } + + if (mergedOptions.updatesLog) { + await checkUpdates(); + } + + let browser = mergedOptions.browser; + let page = mergedOptions.page; + + if (!browser && page) { + // Get browser from page + browser = page.browser(); + } else if (!browser && !page) { + if ( + !mergedOptions.browserWS && + !mergedOptions.puppeteerOptions?.userDataDir + ) { + mergedOptions.puppeteerOptions.userDataDir = path.resolve( + process.cwd(), + path.join(mergedOptions.folderNameToken, sanitize(session)) + ); + + if (!fs.existsSync(mergedOptions.puppeteerOptions.userDataDir)) { + fs.mkdirSync(mergedOptions.puppeteerOptions.userDataDir, { + recursive: true, + }); + } + } + + if (!mergedOptions.browserWS) { + logger.info( + `Using browser folder '${mergedOptions.puppeteerOptions.userDataDir}'`, + { + session, + type: 'browser', + } + ); + } + + // Initialize new browser + logger.info('Initializing browser...', { session, type: 'browser' }); + browser = await initBrowser(session, mergedOptions, logger).catch((e) => { + if (mergedOptions.browserWS && mergedOptions.browserWS != '') { + logger.error(`Error when try to connect ${mergedOptions.browserWS}`, { + session, + type: 'browser', + }); + } else { + logger.error(`Error no open browser`, { + session, + type: 'browser', + }); + } + logger.error(e.message, { + session, + type: 'browser', + }); + throw e; + }); + + logger.http('checking headless...', { + session, + type: 'browser', + }); + + if (mergedOptions.headless) { + logger.http('headless option is active, browser hidden', { + session, + type: 'browser', + }); + } else { + logger.http('headless option is disabled, browser visible', { + session, + type: 'browser', + }); + } + } + + if (!mergedOptions.browserWS && browser['_process']) { + browser['_process'].once('close', () => { + browser['isClose'] = true; + }); + } + + (browser as Browser).on('targetdestroyed', async (target: any) => { + if ( + typeof (browser as Browser).isConnected === 'function' && + !(browser as Browser).isConnected() + ) { + return; + } + const pages = await browser.pages(); + if (!pages.length) { + browser.close().catch(() => null); + } + }); + + (browser as Browser).on('disconnected', () => { + if (mergedOptions.browserWS) { + statusFind && statusFind('serverClose', session); + } else { + statusFind && statusFind('browserClose', session); + } + }); + + if (!page) { + // Initialize a page + page = await getOrCreatePage(browser); + } + + if (page) { + await page.setBypassCSP(true); + + const client = new Whatsapp(page, session, mergedOptions); + client.catchQR = catchQR; + client.statusFind = statusFind; + client.onLoadingScreen = onLoadingScreen; + client.catchLinkCode = catchLinkCode; + + await client.start(); + + if (mergedOptions.waitForLogin) { + const isLogged = await client.waitForLogin(); + if (!isLogged) { + throw 'Not Logged'; + } + + let waitLoginPromise = null; + client.onStateChange(async (state) => { + const connected = await page.evaluate(() => WPP.conn.isRegistered()); + if (!connected) { + await sleep(2000); + + if (!waitLoginPromise) { + waitLoginPromise = client + .waitForLogin() + .catch(() => {}) + .finally(() => { + waitLoginPromise = null; + }); + } + await waitLoginPromise; + } + }); + } + + return client; + } +} diff --git a/src/controllers/websocket.ts b/src/controllers/websocket.ts new file mode 100644 index 000000000..e47968471 --- /dev/null +++ b/src/controllers/websocket.ts @@ -0,0 +1,59 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ +import { ConnectionTransport } from 'puppeteer'; +import WebSocket from 'ws'; + +export class WebSocketTransport implements ConnectionTransport { + static create(url: string, timeout?: number): Promise { + return new Promise((resolve, reject) => { + const ws = new WebSocket(url, [], { + perMessageDeflate: false, + maxPayload: 256 * 1024 * 1024, // 256Mb + handshakeTimeout: timeout, + }); + + ws.addEventListener('open', () => resolve(new WebSocketTransport(ws))); + ws.addEventListener('error', reject); + }); + } + + private _ws: WebSocket; + onmessage?: (message: string) => void; + onclose?: () => void; + + constructor(ws: WebSocket) { + this._ws = ws; + this._ws.addEventListener('message', (event) => { + if (this.onmessage) this.onmessage.call(null, event.data); + }); + this._ws.addEventListener('close', () => { + if (this.onclose) this.onclose.call(null); + }); + // Silently ignore all errors - we don't know what to do with them. + this._ws.addEventListener('error', () => {}); + this.onmessage = null; + this.onclose = null; + } + + send(message: string): void { + this._ws.send(message); + } + + close(): void { + this._ws.close(); + } +} diff --git a/src/controllers/welcome.ts b/src/controllers/welcome.ts new file mode 100644 index 000000000..f737212ec --- /dev/null +++ b/src/controllers/welcome.ts @@ -0,0 +1,86 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ +import boxen from 'boxen'; +import chalk from 'chalk'; +import latestVersion from 'latest-version'; +import { defaultLogger as logger } from '../utils/logger'; +import { upToDate } from '../utils/semver'; +const { version } = require('../../package.json'); + +// Global +let welcomeShown = false; +let updatesChecked = false; + +export function welcomeScreen() { + if (welcomeShown) { + return; + } + welcomeShown = true; + logger.info(` + _ ______ ____ ______ __ + | | / / __ \\/ __ \\/ ____/___ ____ ____ ___ _____/ /_ + | | /| / / /_/ / /_/ / / / __ \\/ __ \\/ __ \\/ _ \\/ ___/ __/ + | |/ |/ / ____/ ____/ /___/ /_/ / / / / / / / __/ /__/ /_ + |__/|__/_/ /_/ \\____/\\____/_/ /_/_/ /_/\\___/\\___/\\__/`); +} + +export async function checkUpdates() { + // Check for updates if needed + if (!updatesChecked) { + updatesChecked = true; + await checkWPPConnectVersion(); + } +} + +/** + * Checs for a new versoin of wppconnect and logs + */ +async function checkWPPConnectVersion() { + logger.info('Checking for updates'); + await latestVersion('@wppconnect-team/wppconnect') + .then((latest) => { + if (upToDate(version, latest)) { + logger.info("You're up to date"); + } else { + logger.info('There is a new version available'); + logUpdateAvailable(version, latest); + } + }) + .catch(() => { + logger.warn('Failed to check updates'); + }); +} + +/** + * Logs a boxen of instructions to update + * @param current + * @param latest + */ +function logUpdateAvailable(current: string, latest: string) { + // prettier-ignore + const newVersionLog = + `There is a new version of ${chalk.bold(`Wppconnect`)} ${chalk.gray(current)} ➜ ${chalk.bold.green(latest)}\n` + + `Update your package by running:\n\n` + + `${chalk.bold('\>')} ${chalk.blueBright('npm update @wppconnect-team/wppconnect')}`; + + logger.info(boxen(newVersionLog, { padding: 1 })); + logger.info( + `For more info visit: ${chalk.underline( + 'https://github.com/wppconnect-team/wppconnect/blob/master/Update.md' + )}\n` + ); +} diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 000000000..94231a078 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,27 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ +import type * as WAJS from '@wppconnect/wa-js'; + +export * from './api/model'; +export * from './api/model/enum'; +export { Whatsapp } from './api/whatsapp'; +export { CreateConfig } from './config/create-config'; +export { create } from './controllers/initializer'; +export { defaultLogger } from './utils/logger'; +export * as tokenStore from './token-store'; + +export type { WAJS }; diff --git a/src/lib/README.md b/src/lib/README.md new file mode 100644 index 000000000..2cfb5e1de --- /dev/null +++ b/src/lib/README.md @@ -0,0 +1,3 @@ +# Files here should not be touched + +> Files inside this directory are automatically generated and copied into dist bundle with the build scripts diff --git a/src/lib/wapi/.babelrc b/src/lib/wapi/.babelrc new file mode 100644 index 000000000..b40c5fd0d --- /dev/null +++ b/src/lib/wapi/.babelrc @@ -0,0 +1,20 @@ +{ + "plugins": [], + "presets": [ + [ + "@babel/preset-env", + { + "targets": { + "esmodules": true, + "chrome": "50" + } + } + ] + ], + "env": { + "development": { + "sourceMaps": "inline", + "retainLines": true + } + } +} diff --git a/src/lib/wapi/business/get-business-profiles-products.js b/src/lib/wapi/business/get-business-profiles-products.js new file mode 100644 index 000000000..30e5bb9a1 --- /dev/null +++ b/src/lib/wapi/business/get-business-profiles-products.js @@ -0,0 +1,39 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export async function getBusinessProfilesProducts(id) { + let catalog = WPP.whatsapp.CatalogStore.get(id); + if (!catalog) { + catalog = await WPP.whatsapp.CatalogStore.find( + WPP.whatsapp.WidFactory.createWid(id) + ); + } + + if (!catalog) { + throw { + error: true, + code: 'catalog_not_found', + message: 'Catalog not found', + }; + } + + if (catalog.productCollection) { + return catalog.productCollection.serialize(); + } + + return []; +} diff --git a/src/lib/wapi/business/get-order-by-msg.js b/src/lib/wapi/business/get-order-by-msg.js new file mode 100644 index 000000000..7eed18c63 --- /dev/null +++ b/src/lib/wapi/business/get-order-by-msg.js @@ -0,0 +1,54 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +import { getMessageById } from '../functions/get-message-by-id'; + +export async function getOrderbyMsg(msgId) { + let msg = await getMessageById(msgId, null, false); + if (!msg) { + throw { + error: true, + code: 'message_not_found', + message: 'Message not found', + }; + } + if (msg.type !== 'order') { + throw { + error: true, + code: 'message_is_not_an_order', + message: 'Message is not an order', + }; + } + let order = WPP.whatsapp.OrderStore.get(msg.orderId); + if (!order) { + order = await WPP.whatsapp.OrderStore.findOrder( + msg.orderId, + msg.sellerJid, + msg.token + ); + } + + if (!order) { + throw { + error: true, + code: 'order_not_found', + message: 'Order not found', + }; + } + + return order.products; +} diff --git a/src/lib/wapi/business/index.js b/src/lib/wapi/business/index.js new file mode 100644 index 000000000..a547becc9 --- /dev/null +++ b/src/lib/wapi/business/index.js @@ -0,0 +1,18 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ +export { getBusinessProfilesProducts } from './get-business-profiles-products'; +export { getOrderbyMsg } from './get-order-by-msg'; diff --git a/src/lib/wapi/business/send-payment-request.js b/src/lib/wapi/business/send-payment-request.js new file mode 100644 index 000000000..dad396526 --- /dev/null +++ b/src/lib/wapi/business/send-payment-request.js @@ -0,0 +1,47 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +window.WAPI.sendPaymentRequest = async function ( + chatId, + amount1000, + currency, + noteMessage +) { + var chat = WPP.whatsapp.ChatStore.get(chatId); + var tempMsg = Object.create(chat.msgs.filter((msg) => msg.__x_isSentByMe)[0]); + var newId = WPP.chat.generateMessageID(chatId); + var extend = { + ack: 0, + id: newId, + local: !0, + self: 'out', + t: parseInt(new Date().getTime() / 1000), + to: chatId, + isNewMsg: !0, + type: 'payment', + subtype: 'request', + amount1000, + requestFrom: chatId, + currency, + noteMessage, + expiryTimestamp: parseInt( + new Date(new Date().setDate(new Date().getDate() + 1)).getTime() / 1000 + ), + }; + Object.assign(tempMsg, extend); + await WPP.whatsapp.functions.addAndSendMsgToChat(chat, tempMsg); +}; diff --git a/src/lib/wapi/functions/are-all-messages-loaded.js b/src/lib/wapi/functions/are-all-messages-loaded.js new file mode 100644 index 000000000..239e225e9 --- /dev/null +++ b/src/lib/wapi/functions/are-all-messages-loaded.js @@ -0,0 +1,26 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export function areAllMessagesLoaded(id, done) { + const found = WAPI.getChat(id); + if (!found.msgs.msgLoadState.noEarlierMsgs) { + if (done) done(false); + return false; + } + if (done) done(true); + return true; +} diff --git a/src/lib/wapi/functions/check-send-exist.js b/src/lib/wapi/functions/check-send-exist.js new file mode 100644 index 000000000..aca80a8aa --- /dev/null +++ b/src/lib/wapi/functions/check-send-exist.js @@ -0,0 +1,83 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export function scope(id, erro, status, text = null) { + let e = { + me: WPP.whatsapp.Conn.attributes, + to: id, + erro: erro, + text: text, + status: status, + }; + return e; +} +export async function getchatId(chatId) { + var to = await WAPI.getChatById(chatId), + objTo = to.lastReceivedKey || {}, + extend = { + formattedName: to.contact.formattedName, + isBusiness: to.contact.isBusiness, + isMyContact: to.contact.isMyContact, + verifiedName: to.contact.verifiedName, + pushname: to.contact.pushname, + }; + Object.assign(objTo, extend); + return objTo; +} + +export async function sendExist(chatId, returnChat = true, Send = true) { + if (!chatId) { + return scope(chatId, true, 500, 'Chat ID is empty'); + } + + // Check chat exists (group is always a chat) + let chat = await window.WAPI.getChat(chatId); + + if (!chat && chatId === 'status@broadcast') { + chat = new WPP.whatsapp.ChatStore.modelClass({ + id: WPP.whatsapp.WidFactory.createWid('status@broadcast'), + }); + WPP.whatsapp.ChatStore.add(chat); + chat = await window.WAPI.getChat(chatId); // Fix some methods + } + + // Check if contact number exists + if (!chat && !chatId.includes('@g')) { + let ck = await window.WAPI.checkNumberStatus(chatId); + + if (!ck.numberExists) { + return scope(chatId, true, ck.status, 'The number does not exist'); + } + + // Load chat ID for non contact + await WPP.chat.find(ck.id); + + chatId = ck.id._serialized; + chat = await window.WAPI.getChat(chatId); + } + + if (!chat) { + return scope(chatId, true, 404); + } + if (Send) { + await WPP.chat.markIsRead(chat.id).catch(() => null); + } + if (returnChat) { + return chat; + } + return scope(chatId, false, 200); +} diff --git a/src/lib/wapi/functions/create-product.js b/src/lib/wapi/functions/create-product.js new file mode 100644 index 000000000..8023c97d8 --- /dev/null +++ b/src/lib/wapi/functions/create-product.js @@ -0,0 +1,55 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +/** + * Sends product to catalog + * @param {string} imgBase64 Base64 image data + * @param {string} name Product name + * @param {string} description Product description + * @param {number} price Product price + * @param {boolean} isHidden Boolean that indicates if product is hidden or not. Default is false + * @param {string} url Product url + * @param {string} retailerId Registered product ID on another system + * @param {string} currency Currency of product + * @param {Function} done Optional callback + */ +export function createProduct( + imgBase64, + name, + description = null, + price = null, + isHidden = false, + url = null, + retailerId = null, + currency = 'BRL', + done +) { + WPP.catalog + .createProduct({ + name, + image: imgBase64, + description, + price, + isHidden, + url, + retailerId, + currency, + }) + .then((result) => { + if (done !== undefined) done(result); + }); +} diff --git a/src/lib/wapi/functions/download-file-with-credentials.js b/src/lib/wapi/functions/download-file-with-credentials.js new file mode 100644 index 000000000..98231e0e8 --- /dev/null +++ b/src/lib/wapi/functions/download-file-with-credentials.js @@ -0,0 +1,41 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export async function downloadFile(url) { + return await new Promise((resolve, reject) => { + let xhr = new XMLHttpRequest(); + xhr.onload = function () { + if (xhr.readyState == 4) { + if (xhr.status == 200) { + let reader = new FileReader(); + reader.readAsDataURL(xhr.response); + reader.onload = function (e) { + resolve(reader.result.substr(reader.result.indexOf(',') + 1)); + }; + } else { + console.error(xhr.statusText); + } + } else { + // console.log(err); + resolve(false); + } + }; + xhr.open('GET', url, true); + xhr.responseType = 'blob'; + xhr.send(null); + }); +} diff --git a/src/lib/wapi/functions/encrypt-and-upload-file.js b/src/lib/wapi/functions/encrypt-and-upload-file.js new file mode 100644 index 000000000..3575403fd --- /dev/null +++ b/src/lib/wapi/functions/encrypt-and-upload-file.js @@ -0,0 +1,39 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +import { generateMediaKey, getFileHash } from '../helper'; + +export async function encryptAndUploadFile(type, blob) { + const filehash = await getFileHash(blob); + const mediaKey = generateMediaKey(32); + const controller = new AbortController(); + const signal = controller.signal; + const encrypted = await window.Store.UploadUtils.encryptAndUpload({ + blob, + type, + signal, + mediaKey, + }); + return { + ...encrypted, + clientUrl: encrypted.url, + filehash, + id: filehash, + uploadhash: encrypted.encFilehash, + mediaBlob: blob, + }; +} diff --git a/src/lib/wapi/functions/fix-chat.js b/src/lib/wapi/functions/fix-chat.js new file mode 100644 index 000000000..86390b6ba --- /dev/null +++ b/src/lib/wapi/functions/fix-chat.js @@ -0,0 +1,48 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export async function pinChat(chatId, type = true, notExist = false) { + if (typeof type != 'boolean' || typeof notExist != 'boolean') { + var text = 'incorrect parameter, insert a boolean true or false'; + return WAPI.scope(chatId, true, null, text); + } + let typeFix = type ? 'pin' : 'unpin', + retult = void 0; + var chat = await WAPI.sendExist(chatId, true, notExist); + if (!chat.erro) { + var m = { + type: 'pinChat', + typefix: typeFix, + }, + To = await WAPI.getchatId(chat.id); + await Store.pinChat + .setPin(chat, type) + .then((_) => { + var obj = WAPI.scope(To, false, 'OK', null); + Object.assign(obj, m); + retult = obj; + }) + .catch((error) => { + var obj = WAPI.scope(To, true, error, 'Pin Chat first'); + Object.assign(obj, m); + retult = obj; + }); + return retult; + } else { + return chat; + } +} diff --git a/src/lib/wapi/functions/forward-messages.js b/src/lib/wapi/functions/forward-messages.js new file mode 100644 index 000000000..1d625576e --- /dev/null +++ b/src/lib/wapi/functions/forward-messages.js @@ -0,0 +1,64 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +import { getMessageById } from './get-message-by-id'; + +export async function forwardMessages(chatId, messagesId, skipMyMessages) { + if (!Array.isArray(messagesId)) { + messagesId = [messagesId]; + } + + await WAPI.sendExist(chatId); + const chat = WPP.whatsapp.ChatStore.get(chatId); + if (!chat) { + throw { + error: true, + code: 'chat_not_found', + message: 'Chat not found', + chatId: chatId, + }; + } + + const messages = []; + + for (const msg of messagesId) { + const msgId = typeof msg === 'string' ? msg : msg.id; + const messageData = await getMessageById(msgId, null, false); + + if (!messageData) { + throw { + error: true, + code: 'message_not_found', + message: 'Message not Found', + messageId: msgId, + }; + } + + messages.push(messageData); + } + + const toForward = messages.filter((msg) => + skipMyMessages ? !msg.isSentByMe : true + ); + + await chat.forwardMessages(toForward); + await new Promise((resolve) => setTimeout(resolve, 100)); // Wait collection update + + const msgs = chat.msgs.getModelsArray().slice(messagesId.length * -1); + + return msgs.map((m) => m.id._serialized); +} diff --git a/src/lib/wapi/functions/get-all-chats-ids.js b/src/lib/wapi/functions/get-all-chats-ids.js new file mode 100644 index 000000000..70c0bf99c --- /dev/null +++ b/src/lib/wapi/functions/get-all-chats-ids.js @@ -0,0 +1,25 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export const getAllChatIds = function (done) { + const chatIds = WPP.whatsapp.ChatStore.map( + (chat) => chat.id._serialized || chat.id + ); + + if (done !== undefined) done(chatIds); + return chatIds; +}; diff --git a/src/lib/wapi/functions/get-all-chats-with-messages.js b/src/lib/wapi/functions/get-all-chats-with-messages.js new file mode 100644 index 000000000..71284a6ec --- /dev/null +++ b/src/lib/wapi/functions/get-all-chats-with-messages.js @@ -0,0 +1,30 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export async function getAllChatsWithMessages(newOnly) { + const x = []; + if (newOnly) { + x.push( + WAPI.getAllChatsWithNewMsg().map((c) => WAPI.getChat(c.id._serialized)) + ); + } else { + x.push(WAPI.getAllChatIds().map((c) => WAPI.getChat(c))); + } + const _result = (await Promise.all(x)).flatMap((x) => x); + const result = JSON.stringify(_result); + return JSON.parse(result); +} diff --git a/src/lib/wapi/functions/get-all-chats.js b/src/lib/wapi/functions/get-all-chats.js new file mode 100644 index 000000000..a0f82c0e9 --- /dev/null +++ b/src/lib/wapi/functions/get-all-chats.js @@ -0,0 +1,25 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export const getAllChats = function (done) { + const chats = WPP.whatsapp.ChatStore.map((chat) => + WAPI._serializeChatObj(chat) + ); + + if (done !== undefined) done(chats); + return chats; +}; diff --git a/src/lib/wapi/functions/get-all-contacts.js b/src/lib/wapi/functions/get-all-contacts.js new file mode 100644 index 000000000..572bee18a --- /dev/null +++ b/src/lib/wapi/functions/get-all-contacts.js @@ -0,0 +1,25 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export const getAllContacts = async function () { + let contacts = await Promise.all( + WPP.whatsapp.ContactStore.map(async (contact) => { + return await WAPI._serializeContactObj(contact); + }) + ); + return contacts; +}; diff --git a/src/lib/wapi/functions/get-all-group-metadata.js b/src/lib/wapi/functions/get-all-group-metadata.js new file mode 100644 index 000000000..1257ff6ba --- /dev/null +++ b/src/lib/wapi/functions/get-all-group-metadata.js @@ -0,0 +1,25 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export function getAllGroupMetadata(done) { + const groupData = WPP.whatsapp.GroupMetadataStore.map( + (groupData) => groupData.attributes + ); + + if (done !== undefined) done(groupData); + return groupData; +} diff --git a/src/lib/wapi/functions/get-all-groups.js b/src/lib/wapi/functions/get-all-groups.js new file mode 100644 index 000000000..84dd8dcff --- /dev/null +++ b/src/lib/wapi/functions/get-all-groups.js @@ -0,0 +1,23 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export function getAllGroups(done) { + const groups = WPP.whatsapp.ChatStore.filter((chat) => chat.isGroup); + + if (done !== undefined) done(groups); + return groups; +} diff --git a/src/lib/wapi/functions/get-all-messages-in-chat.js b/src/lib/wapi/functions/get-all-messages-in-chat.js new file mode 100644 index 000000000..a3187fef6 --- /dev/null +++ b/src/lib/wapi/functions/get-all-messages-in-chat.js @@ -0,0 +1,44 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export async function getAllMessagesInChat( + id, + includeMe, + includeNotifications, + done +) { + var chat = await WAPI.sendExist(id); + let output = []; + if (!chat.erro) { + const messages = chat.msgs.getModelsArray(); + for (const i in messages) { + if (i === 'remove') { + continue; + } + const messageObj = messages[i]; + + let message = WAPI.processMessageObj( + messageObj, + includeMe, + includeNotifications + ); + if (message) output.push(message); + } + } + if (done !== undefined) done(output); + return output; +} diff --git a/src/lib/wapi/functions/get-all-new-messages.js b/src/lib/wapi/functions/get-all-new-messages.js new file mode 100644 index 000000000..5b65fa601 --- /dev/null +++ b/src/lib/wapi/functions/get-all-new-messages.js @@ -0,0 +1,28 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +import { getAllChatsWithNewMessages } from './get-chats-with-new-messages'; + +export const getAllNewMessages = function () { + const _newMessages = + getAllChatsWithNewMessages() + .map((c) => WAPI.getChat(c.id)) + .flatMap((c) => c.msgs.filter((x) => x.isNewMsg)) + .map(WAPI._serializeMessageObj) || []; + + return _newMessages; +}; diff --git a/src/lib/wapi/functions/get-all-unread-messages.js b/src/lib/wapi/functions/get-all-unread-messages.js new file mode 100644 index 000000000..85d7a5742 --- /dev/null +++ b/src/lib/wapi/functions/get-all-unread-messages.js @@ -0,0 +1,35 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +import { getAllChatsWithNewMessages } from './get-chats-with-new-messages'; + +/** + * Retrieves undread messages + * x.ack === -1 + * TODO: Test this fn, seems incorrect, should not be async + */ +export const getAllUnreadMessages = async function () { + const queries = getAllChatsWithNewMessages().map((c) => + WPP.chat.getMessages(c.id, { + count: c.unreadCount, + }) + ); + + const chatMessages = await Promise.all(queries); + + return chatMessages.flat().map(WAPI._serializeMessageObj); +}; diff --git a/src/lib/wapi/functions/get-battery-level.js b/src/lib/wapi/functions/get-battery-level.js new file mode 100644 index 000000000..4397f7160 --- /dev/null +++ b/src/lib/wapi/functions/get-battery-level.js @@ -0,0 +1,20 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export function getBatteryLevel() { + return WPP.whatsapp.Conn.attributes.battery; +} diff --git a/src/lib/wapi/functions/get-chat-by-id.js b/src/lib/wapi/functions/get-chat-by-id.js new file mode 100644 index 000000000..3d8adbd26 --- /dev/null +++ b/src/lib/wapi/functions/get-chat-by-id.js @@ -0,0 +1,28 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export async function getChatById(id, done) { + let found = await WAPI.getChat(id); + if (found) { + found = WAPI._serializeChatObj(found); + } else { + found = false; + } + + if (done !== undefined) done(found); + return found; +} diff --git a/src/lib/wapi/functions/get-chat-by-name.js b/src/lib/wapi/functions/get-chat-by-name.js new file mode 100644 index 000000000..e142e7476 --- /dev/null +++ b/src/lib/wapi/functions/get-chat-by-name.js @@ -0,0 +1,22 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export function getChatByName(name, done) { + const found = WPP.chat.find((chat) => chat.name === name); + if (done !== undefined) done(found); + return found; +} diff --git a/src/lib/wapi/functions/get-chat.js b/src/lib/wapi/functions/get-chat.js new file mode 100644 index 000000000..cd3018934 --- /dev/null +++ b/src/lib/wapi/functions/get-chat.js @@ -0,0 +1,32 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export function getChat(id) { + if (!id) { + return false; + } + id = typeof id == 'string' ? id : id._serialized; + const found = WPP.whatsapp.ChatStore.get(id); + if (found) { + found.sendMessage = found.sendMessage + ? found.sendMessage + : function () { + return WPP.whatsapp.functions.sendTextMsgToChat(this, ...arguments); + }; + } + return found; +} diff --git a/src/lib/wapi/functions/get-chats-with-new-messages.js b/src/lib/wapi/functions/get-chats-with-new-messages.js new file mode 100644 index 000000000..5191ad86e --- /dev/null +++ b/src/lib/wapi/functions/get-chats-with-new-messages.js @@ -0,0 +1,27 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +import { hasUndreadMessages } from './has-unread-messages'; + +export const getAllChatsWithNewMessages = function (done) { + const chats = WPP.whatsapp.ChatStore.filter(hasUndreadMessages).map((chat) => + WAPI._serializeChatObj(chat) + ); + + if (done !== undefined) done(chats); + return chats; +}; diff --git a/src/lib/wapi/functions/get-common-groups.js b/src/lib/wapi/functions/get-common-groups.js new file mode 100644 index 000000000..c108d0b0c --- /dev/null +++ b/src/lib/wapi/functions/get-common-groups.js @@ -0,0 +1,43 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export async function getCommonGroups(participantId, done) { + let output = []; + let groups = window.WAPI.getAllGroups(); + for (let idx in groups) { + try { + let participants = await window.WAPI.getGroupParticipantIDs( + groups[idx].id + ); + if ( + participants.filter((participant) => participant == participantId) + .length + ) { + output.push(groups[idx]); + } + } catch (err) { + console.log('Error in group:'); + console.log(groups[idx]); + console.log(err); + } + } + + if (done !== undefined) { + done(output); + } + return output; +} diff --git a/src/lib/wapi/functions/get-contact.js b/src/lib/wapi/functions/get-contact.js new file mode 100644 index 000000000..0aee01ab9 --- /dev/null +++ b/src/lib/wapi/functions/get-contact.js @@ -0,0 +1,23 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export const getContact = function (id, done) { + const found = WPP.whatsapp.ContactStore.get(id); + + if (done !== undefined) done(window.WAPI._serializeContactObj(found)); + return window.WAPI._serializeContactObj(found); +}; diff --git a/src/lib/wapi/functions/get-group-metadata.js b/src/lib/wapi/functions/get-group-metadata.js new file mode 100644 index 000000000..88d71479e --- /dev/null +++ b/src/lib/wapi/functions/get-group-metadata.js @@ -0,0 +1,22 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export async function getGroupMetadata(id, done) { + let output = WPP.whatsapp.GroupMetadataStore.find(id); + if (done !== undefined) done(output); + return output; +} diff --git a/src/lib/wapi/functions/get-group-participant-ids.js b/src/lib/wapi/functions/get-group-participant-ids.js new file mode 100644 index 000000000..bfaa2047d --- /dev/null +++ b/src/lib/wapi/functions/get-group-participant-ids.js @@ -0,0 +1,27 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +import { _getGroupParticipants } from './get-group-participants'; + +export async function getGroupParticipantIDs(groupId, done) { + const output = await Promise.resolve(WPP.group.getParticipants()).then( + (participants) => participants.map((p) => p.id) + ); + + if (done !== undefined) done(output); + return output; +} diff --git a/src/lib/wapi/functions/get-group-participants.js b/src/lib/wapi/functions/get-group-participants.js new file mode 100644 index 000000000..94a9dccc2 --- /dev/null +++ b/src/lib/wapi/functions/get-group-participants.js @@ -0,0 +1,21 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export async function _getGroupParticipants(id) { + const metadata = await WAPI.getGroupMetadata(id); + return metadata.participants; +} diff --git a/src/lib/wapi/functions/get-host.js b/src/lib/wapi/functions/get-host.js new file mode 100644 index 000000000..177c674a9 --- /dev/null +++ b/src/lib/wapi/functions/get-host.js @@ -0,0 +1,20 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export function getHost() { + return WPP.whatsapp.Conn.attributes; +} diff --git a/src/lib/wapi/functions/get-list-mute.js b/src/lib/wapi/functions/get-list-mute.js new file mode 100644 index 000000000..832c8de8f --- /dev/null +++ b/src/lib/wapi/functions/get-list-mute.js @@ -0,0 +1,52 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export async function getListMute(type = 'all') { + var muteList = (await window.Store.Mute)._models, + noMute = new Array(), + toMute = new Array(); + for (var i in muteList) + muteList[i].__x_isMuted + ? toMute.push(WAPI.interfaceMute(muteList[i])) + : noMute.push(WAPI.interfaceMute(muteList[i])); + var r = null; + console.log(0, type); + switch (type) { + case 'all': + r = [ + { + total: toMute.length + noMute.length, + amountToMute: toMute.length, + amountnoMute: noMute.length, + }, + toMute, + noMute, + ]; + break; + case 'toMute': + r = [{ total: toMute.length }, toMute]; + break; + case 'noMute': + r = [{ total: noMute.length }, noMute]; + break; + } + return r; +} +export function interfaceMute(arr) { + let { attributes, expiration, id, isMuted, isState, promises, stale } = arr; + return { attributes, expiration, id, isMuted, isState, promises, stale }; +} diff --git a/src/lib/wapi/functions/get-me.js b/src/lib/wapi/functions/get-me.js new file mode 100644 index 000000000..8cc798960 --- /dev/null +++ b/src/lib/wapi/functions/get-me.js @@ -0,0 +1,25 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export function getMe(done) { + const rawMe = WPP.whatsapp.ContactStore.get( + WPP.whatsapp.UserPrefs.getMaybeMeUser() + ); + + if (done !== undefined) done(rawMe.all); + return rawMe.all; +} diff --git a/src/lib/wapi/functions/get-message-by-id.js b/src/lib/wapi/functions/get-message-by-id.js new file mode 100644 index 000000000..2fc4d36a0 --- /dev/null +++ b/src/lib/wapi/functions/get-message-by-id.js @@ -0,0 +1,50 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export async function getMessageById(id, done, serialize = true) { + //Parse message ID + + if (typeof id === 'object' && id._serialized) { + id = id._serialized; + } + + if (typeof id !== 'string') { + return false; + } + + const msg = await WPP.chat.getMessageById(id); + + if (!msg) { + return false; + } + + let result = false; + + if (serialize) { + try { + result = WAPI.processMessageObj(msg, true, true); + } catch (err) {} + } else { + result = msg; + } + + if (typeof done === 'function') { + done(result); + } else { + return result; + } +} diff --git a/src/lib/wapi/functions/get-messages.js b/src/lib/wapi/functions/get-messages.js new file mode 100644 index 000000000..9c68ddce3 --- /dev/null +++ b/src/lib/wapi/functions/get-messages.js @@ -0,0 +1,34 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export async function getMessages(chatId, params = {}, serialize = true) { + const msgs = await WPP.chat.getMessages(chatId, params); + + if (!Array.isArray(msgs)) { + const error = new Error(`Failed to fetch messages for ${chatId}`); + + Object.assign(error, msgs); + + throw error; + } + + const result = msgs + .map((m) => new WPP.whatsapp.MsgStore.modelClass(m)) + .map((m) => WAPI.processMessageObj(m, true, true)); + + return result; +} diff --git a/src/lib/wapi/functions/get-my-contacts.js b/src/lib/wapi/functions/get-my-contacts.js new file mode 100644 index 000000000..bcc04383f --- /dev/null +++ b/src/lib/wapi/functions/get-my-contacts.js @@ -0,0 +1,24 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export const getMyContacts = function (done) { + const contacts = WPP.whatsapp.ContactStore.filter( + (contact) => contact.isMyContact === true + ).map((contact) => WAPI._serializeContactObj(contact)); + if (done !== undefined) done(contacts); + return contacts; +}; diff --git a/src/lib/wapi/functions/get-new-id.js b/src/lib/wapi/functions/get-new-id.js new file mode 100644 index 000000000..dd4085cd6 --- /dev/null +++ b/src/lib/wapi/functions/get-new-id.js @@ -0,0 +1,25 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export function getNewId() { + var text = ''; + var possible = + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + for (var i = 0; i < 20; i++) + text += possible.charAt(Math.floor(Math.random() * possible.length)); + return text; +} diff --git a/src/lib/wapi/functions/get-number-profile.js b/src/lib/wapi/functions/get-number-profile.js new file mode 100644 index 000000000..c3fde5ee2 --- /dev/null +++ b/src/lib/wapi/functions/get-number-profile.js @@ -0,0 +1,34 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export async function getNumberProfile(id, done) { + const result = await WPP.contact.queryExists(id); + + if (!result || result.wid === undefined) throw 404; + + const data = window.WAPI._serializeNumberStatusObj({ + jid: result.wid, + status: 200, + isBusiness: result.biz, + }); + if (data.status == 200) data.numberExists = true; + if (done !== undefined) { + done(window.WAPI._serializeNumberStatusObj(result)); + done(data); + } + return data; +} diff --git a/src/lib/wapi/functions/get-session-token.js b/src/lib/wapi/functions/get-session-token.js new file mode 100644 index 000000000..116e19db0 --- /dev/null +++ b/src/lib/wapi/functions/get-session-token.js @@ -0,0 +1,29 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export async function getSessionTokenBrowser() { + if (window.localStorage) { + var localStorages = await JSON.parse(JSON.stringify(window.localStorage)); + let { WABrowserId, WASecretBundle, WAToken1, WAToken2 } = localStorages; + return { + WABrowserId, + WASecretBundle, + WAToken1, + WAToken2, + }; + } +} diff --git a/src/lib/wapi/functions/get-unread-messages-in-chat.js b/src/lib/wapi/functions/get-unread-messages-in-chat.js new file mode 100644 index 000000000..9aea5ca37 --- /dev/null +++ b/src/lib/wapi/functions/get-unread-messages-in-chat.js @@ -0,0 +1,64 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export function getUnreadMessagesInChat( + id, + includeMe, + includeNotifications, + done +) { + // get chat and its messages + let chat = WAPI.getChat(id); + let messages = chat.msgs._models; + + // initialize result list + let output = []; + + // look for unread messages, newest is at the end of array + for (let i = messages.length - 1; i >= 0; i--) { + // system message: skip it + if (i === 'remove') { + continue; + } + + // get message + let messageObj = messages[i]; + + // found a read message: stop looking for others + if ( + typeof messageObj.isNewMsg !== 'boolean' || + messageObj.isNewMsg === false + ) { + continue; + } else { + messageObj.isNewMsg = false; + // process it + let message = WAPI.processMessageObj( + messageObj, + includeMe, + includeNotifications + ); + + // save processed message on result list + if (message) output.push(message); + } + } + // callback was passed: run it + if (done !== undefined) done(output); + // return result list + return output; +} diff --git a/src/lib/wapi/functions/get-unread-messages.js b/src/lib/wapi/functions/get-unread-messages.js new file mode 100644 index 000000000..f8d082a0b --- /dev/null +++ b/src/lib/wapi/functions/get-unread-messages.js @@ -0,0 +1,103 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export function getUnreadMessages( + includeMe, + includeNotifications, + useUnreadCount, + done +) { + const chats = WPP.whatsapp.ChatStore.getModelsArray(); + const output = []; + + for (const chat in chats) { + if (isNaN(chat)) { + continue; + } + + const messageGroupObj = chats[chat]; + let messageGroup = WAPI._serializeChatObj(messageGroupObj); + messageGroup.messages = []; + + const messages = messageGroupObj.msgs._models; + for (let i = messages.length - 1; i >= 0; i--) { + const messageObj = messages[i]; + if ( + typeof messageObj.isNewMsg != 'boolean' || + messageObj.isNewMsg === false + ) { + continue; + } else { + messageObj.isNewMsg = false; + let message = WAPI.processMessageObj( + messageObj, + includeMe, + includeNotifications + ); + if (message) { + messageGroup.messages.push(message); + } + } + } + + if (messageGroup.messages.length > 0) { + output.push(messageGroup); + } else { + // No messages with isNewMsg true + if (useUnreadCount) { + // Will use unreadCount attribute to fetch last n messages from sender + let n = messageGroupObj.unreadCount; + for (let i = messages.length - 1; i >= 0; i--) { + const messageObj = messages[i]; + if (n > 0) { + if (!messageObj.isSentByMe) { + let message = WAPI.processMessageObj( + messageObj, + includeMe, + includeNotifications + ); + messageGroup.messages.unshift(message); + n -= 1; + } + } else if (n === -1) { + // chat was marked as unread so will fetch last message as unread + if (!messageObj.isSentByMe) { + let message = WAPI.processMessageObj( + messageObj, + includeMe, + includeNotifications + ); + messageGroup.messages.unshift(message); + break; + } + } else { + // unreadCount = 0 + break; + } + } + if (messageGroup.messages.length > 0) { + messageGroupObj.unreadCount = 0; // reset unread counter + output.push(messageGroup); + } + } + } + } + if (done !== undefined) { + done(output); + } + return output; +} diff --git a/src/lib/wapi/functions/get-wid.js b/src/lib/wapi/functions/get-wid.js new file mode 100644 index 000000000..659c6cced --- /dev/null +++ b/src/lib/wapi/functions/get-wid.js @@ -0,0 +1,20 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export function getWid() { + return WPP.whatsapp.UserPrefs.getMaybeMeUser()?._serialized; +} diff --git a/src/lib/wapi/functions/has-unread-messages.js b/src/lib/wapi/functions/has-unread-messages.js new file mode 100644 index 000000000..d45b500f7 --- /dev/null +++ b/src/lib/wapi/functions/has-unread-messages.js @@ -0,0 +1,20 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export const hasUndreadMessages = function (chat) { + return chat.unreadCount > 0; +}; diff --git a/src/lib/wapi/functions/index.js b/src/lib/wapi/functions/index.js new file mode 100644 index 000000000..60f079b81 --- /dev/null +++ b/src/lib/wapi/functions/index.js @@ -0,0 +1,89 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export { areAllMessagesLoaded } from './are-all-messages-loaded'; +export { downloadFile } from './download-file-with-credentials'; +export { encryptAndUploadFile } from './encrypt-and-upload-file'; +export { getAllChats } from './get-all-chats'; +export { getAllChatIds } from './get-all-chats-ids'; +export { getAllChatsWithMessages } from './get-all-chats-with-messages'; +export { getAllContacts } from './get-all-contacts'; +export { getAllGroupMetadata } from './get-all-group-metadata'; +export { getAllGroups } from './get-all-groups'; +export { getAllMessagesInChat } from './get-all-messages-in-chat'; +export { getAllNewMessages } from './get-all-new-messages'; +export { getAllUnreadMessages } from './get-all-unread-messages'; +export { getBatteryLevel } from './get-battery-level'; +export { getChat } from './get-chat'; +export { getChatById } from './get-chat-by-id'; +export { getChatByName } from './get-chat-by-name'; +export { getAllChatsWithNewMessages } from './get-chats-with-new-messages'; +export { getCommonGroups } from './get-common-groups'; +export { getContact } from './get-contact'; +export { getGroupMetadata } from './get-group-metadata'; +export { getGroupParticipantIDs } from './get-group-participant-ids'; +export { _getGroupParticipants } from './get-group-participants'; +export { getHost } from './get-host'; +export { getWid } from './get-wid'; +export { getMe } from './get-me'; +export { getMyContacts } from './get-my-contacts'; +export { getNewId } from './get-new-id'; +export { getNumberProfile } from './get-number-profile'; +export { getUnreadMessages } from './get-unread-messages'; +export { getUnreadMessagesInChat } from './get-unread-messages-in-chat'; +export { hasUndreadMessages } from './has-unread-messages'; +export { isConnected } from './is-connected'; +export { isLoggedIn } from './is-logged-in'; +export { + asyncLoadAllEarlierMessages, + loadAllEarlierMessages, +} from './load-all-earlier-chat-messages'; +export { loadAndGetAllMessagesInChat } from './load-and-get-all-messages-in-chat'; +export { loadChatEarlierMessages } from './load-earlier-chat-messages'; +export { loadEarlierMessagesTillDate } from './load-earlier-messages-til-date'; +export { processFiles } from './process-files'; +export { processMessageObj } from './process-message-object'; +export { sendChatstate } from './send-chat-state'; +export { sendFile } from './send-file'; +export { sendImage } from './send-image'; +export { sendPtt } from './send-ptt'; +export { sendImageWithProduct } from './send-image-with-product'; +export { sendLocation } from './send-location'; +export { sendMessage } from './send-message'; +export { sendMessageOptions } from './sendMessageOptions'; +export { sendMessageWithTags } from './send-message-with-tags'; +export { sendMessageWithThumb } from './send-message-with-thumb'; +export { sendMessage2 } from './send-message2'; +export { sendVideoAsGif } from './send-video-as-gif'; +export { setMyName } from './set-my-name'; +export { forwardMessages } from './forward-messages'; +export { getMessageById } from './get-message-by-id'; +export { getMessages } from './get-messages'; +export { setTheme, getTheme } from './theme'; +export { sendLinkPreview } from './send-link-preview'; +export { sendExist, scope, getchatId } from './check-send-exist'; +export { setProfilePic } from './set-profile-pic'; +export { pinChat } from './fix-chat'; +export { getSessionTokenBrowser } from './get-session-token'; +export { sendMute } from './send-mute'; +export { createProduct } from './create-product'; +export { getListMute, interfaceMute } from './get-list-mute'; +export * from './phoneWatchdog'; +export * from './presence'; +export * from './set-online-presence'; +export * from './set-temporary-messages'; +export * from './star-messages'; diff --git a/src/lib/wapi/functions/is-connected.js b/src/lib/wapi/functions/is-connected.js new file mode 100644 index 000000000..1fb9ca91b --- /dev/null +++ b/src/lib/wapi/functions/is-connected.js @@ -0,0 +1,27 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export function isConnected(done) { + // Phone Disconnected icon appears when phone + const isConnected = + document.querySelector('[data-testid="alert-phone"]') == null && + document.querySelector('[data-testid="alert-computer"]') == null + ? true + : false; + if (done !== undefined) done(isConnected); + return isConnected; +} diff --git a/src/lib/wapi/functions/is-logged-in.js b/src/lib/wapi/functions/is-logged-in.js new file mode 100644 index 000000000..85f069bbb --- /dev/null +++ b/src/lib/wapi/functions/is-logged-in.js @@ -0,0 +1,26 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export function isLoggedIn(done) { + // Contact always exists when logged in + const isLogged = + WPP.whatsapp.ContactStore && + WPP.whatsapp.ContactStore.checksum !== undefined; + + if (done !== undefined) done(isLogged); + return isLogged; +} diff --git a/src/lib/wapi/functions/load-all-earlier-chat-messages.js b/src/lib/wapi/functions/load-all-earlier-chat-messages.js new file mode 100644 index 000000000..4b136ed72 --- /dev/null +++ b/src/lib/wapi/functions/load-all-earlier-chat-messages.js @@ -0,0 +1,51 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export async function loadAllEarlierMessages(id, done) { + const chat = WAPI.getChat(id); + + if (!chat) { + done && done(false); + return false; + } + + // improve load speed + try { + await WPP.whatsapp.MsgStore.findQuery({ + remote: chat.id, + count: -1, + }); + } catch (error) {} + + while (!chat.msgs.msgLoadState.noEarlierMsgs) { + await chat.loadEarlierMsgs(); + } + + done && done(true); + return true; +} + +/** + * SYNC version + * Loads all earlier messages of given chat id + * @param {string} id Chat id + * @param {Funciton} done Optional callback + */ +export function asyncLoadAllEarlierMessages(id, done) { + loadAllEarlierMessages(id); + done(); +} diff --git a/src/lib/wapi/functions/load-and-get-all-messages-in-chat.js b/src/lib/wapi/functions/load-and-get-all-messages-in-chat.js new file mode 100644 index 000000000..958bc3546 --- /dev/null +++ b/src/lib/wapi/functions/load-and-get-all-messages-in-chat.js @@ -0,0 +1,54 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export async function loadAndGetAllMessagesInChat( + id, + includeMe, + includeNotifications, + done +) { + return WAPI.loadAllEarlierMessages(id).then((_) => { + const chat = WAPI.getChat(id); + + if (!chat) { + throw { + error: true, + code: 'chat_not_found', + message: 'Chat not found', + }; + } + + let output = []; + const messages = chat.msgs.getModelsArray(); + + for (const i in messages) { + if (i === 'remove') { + continue; + } + const messageObj = messages[i]; + + let message = WAPI.processMessageObj( + messageObj, + includeMe, + includeNotifications + ); + if (message) output.push(message); + } + if (done !== undefined) done(output); + return output; + }); +} diff --git a/src/lib/wapi/functions/load-earlier-chat-messages.js b/src/lib/wapi/functions/load-earlier-chat-messages.js new file mode 100644 index 000000000..7248967dc --- /dev/null +++ b/src/lib/wapi/functions/load-earlier-chat-messages.js @@ -0,0 +1,26 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export async function loadChatEarlierMessages(id) { + const chat = WAPI.getChat(id); + if (chat) { + const someEarlierMessages = await chat.loadEarlierMsgs(); + if (someEarlierMessages) + return someEarlierMessages.map(WAPI._serializeMessageObj); + } + return false; +} diff --git a/src/lib/wapi/functions/load-earlier-messages-til-date.js b/src/lib/wapi/functions/load-earlier-messages-til-date.js new file mode 100644 index 000000000..c0933f46f --- /dev/null +++ b/src/lib/wapi/functions/load-earlier-messages-til-date.js @@ -0,0 +1,31 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export function loadEarlierMessagesTillDate(id, lastMessage, done) { + const found = WAPI.getChat(id); + const x = function () { + if ( + found.msgs.getModelsArray()[0].t > lastMessage && + !found.msgs.msgLoadState.noEarlierMsgs + ) { + found.loadEarlierMsgs().then(x); + } else { + done(); + } + }; + x(); +} diff --git a/src/lib/wapi/functions/phoneWatchdog.js b/src/lib/wapi/functions/phoneWatchdog.js new file mode 100644 index 000000000..ec2a06c51 --- /dev/null +++ b/src/lib/wapi/functions/phoneWatchdog.js @@ -0,0 +1,60 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +let timer = null; +let pong = true; + +async function sendPing() { + // Check only if the interface is in CHAT and not disconnected + if ( + WPP.whatsapp.Stream.mode !== 'MAIN' || + WPP.whatsapp.Socket.state === 'TIMEOUT' + ) { + return; + } + + // Start phoneWatchdog if ping fails + if (!pong) { + WPP.whatsapp.Socket.phoneWatchdog.activate(); + WPP.whatsapp.Socket.phoneWatchdog.poke(250); + return; + } + + // Reset ping state + pong = false; + + // Send a ping request + return WPP.whatsapp.Socket.sendBasic({ + tag: WPP.whatsapp.Socket.tag('ping'), + data: ['admin', 'test'], + }).then(() => { + pong = true; + }); +} + +export function startPhoneWatchdog(interval = 15000) { + stopPhoneWatchdog(); + + timer = setInterval(sendPing, interval); +} + +export function stopPhoneWatchdog() { + if (timer) { + clearInterval(timer); + } + timer = null; +} diff --git a/src/lib/wapi/functions/presence.js b/src/lib/wapi/functions/presence.js new file mode 100644 index 000000000..e8f54ad7a --- /dev/null +++ b/src/lib/wapi/functions/presence.js @@ -0,0 +1,49 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ +export async function subscribePresence(ids) { + if (!Array.isArray(ids)) { + ids = [ids]; + } + + let count = 0; + for (const id of ids) { + const wid = new WPP.whatsapp.WidFactory.createWid(id); + if (Store.Presence.get(wid)) { + continue; + } + await Store.Presence.find(wid); + count++; + } + return count; +} + +export async function unsubscribePresence(ids) { + if (!Array.isArray(ids)) { + ids = [ids]; + } + let count = 0; + for (const id of ids) { + const wid = new WPP.whatsapp.WidFactory.createWid(id); + const presence = Store.Presence.get(wid); + if (!presence) { + continue; + } + presence.delete(); + count++; + } + return count; +} diff --git a/src/lib/wapi/functions/process-files.js b/src/lib/wapi/functions/process-files.js new file mode 100644 index 000000000..f01354ca9 --- /dev/null +++ b/src/lib/wapi/functions/process-files.js @@ -0,0 +1,38 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export async function processFiles(chat, blobs) { + if (!Array.isArray(blobs)) { + blobs = [blobs]; + } + const mediaCollection = new Store.MediaCollection({ + chatParticipantCount: chat.getParticipantCount(), + }); + + await mediaCollection.processAttachments( + Debug.VERSION === '0.4.613' + ? blobs + : blobs.map((blob) => { + return { + file: blob, + }; + }), + chat, + 1 + ); + return mediaCollection; +} diff --git a/src/lib/wapi/functions/process-message-object.js b/src/lib/wapi/functions/process-message-object.js new file mode 100644 index 000000000..d493f97e1 --- /dev/null +++ b/src/lib/wapi/functions/process-message-object.js @@ -0,0 +1,28 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export function processMessageObj(messageObj, includeMe, includeNotifications) { + if (messageObj.isNotification) { + if (includeNotifications) return WAPI._serializeMessageObj(messageObj); + else return; + // System message + // (i.e. "Messages you send to this chat and calls are now secured with end-to-end encryption...") + } else if (messageObj.id.fromMe === false || includeMe) { + return WAPI._serializeMessageObj(messageObj); + } + return; +} diff --git a/src/lib/wapi/functions/send-chat-state.js b/src/lib/wapi/functions/send-chat-state.js new file mode 100644 index 000000000..d2f029979 --- /dev/null +++ b/src/lib/wapi/functions/send-chat-state.js @@ -0,0 +1,46 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export async function sendChatstate(state, chatId) { + state = parseInt(state, 10); + + const chat = WPP.whatsapp.ChatStore.get(chatId); + + if (!chat) { + throw { + error: true, + code: 'chat_not_found', + message: 'Chat not found', + }; + } + + switch (state) { + case 0: + window.Store.ChatStates.sendChatStateComposing(chat.id); + break; + case 1: + window.Store.ChatStates.sendChatStateRecording(chat.id); + break; + case 2: + window.Store.ChatStates.sendChatStatePaused(chat.id); + break; + default: + return false; + } + + return true; +} diff --git a/src/lib/wapi/functions/send-file.js b/src/lib/wapi/functions/send-file.js new file mode 100644 index 000000000..dcd082393 --- /dev/null +++ b/src/lib/wapi/functions/send-file.js @@ -0,0 +1,75 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +import { processFiles } from './process-files'; +import { base64ToFile } from '../helper'; +import { getMessageById } from './get-message-by-id'; + +export async function sendFile( + imgBase64, + chatid, + filename, + caption, + type, + quotedMessageId = null, + isViewOnce = false +) { + type = type ? type : 'sendFile'; + + if ( + (typeof filename != 'string' && filename != null) || + (typeof caption != 'string' && caption != null) + ) { + var text = 'incorrect parameter, insert an string.'; + return WAPI.scope(chatid, true, null, text); + } + var mime = imgBase64.match(/data:([a-zA-Z0-9]+\/[a-zA-Z0-9-.+]+).*,.*/); + if (mime && mime.length) { + mime = mime[1]; + } + var chat = await WAPI.sendExist(chatid); + if (!chat.erro) { + let quotedMsg = null; + + if (typeof quotedMessageId === 'string' && quotedMessageId) { + const message = await getMessageById(quotedMessageId, null, false); + + if (message && message.canReply()) { + quotedMsg = message; + } + } + + var mediaBlob = base64ToFile(imgBase64, filename); + var mediaCollection = await processFiles(chat, mediaBlob); + var media = mediaCollection.getModelsArray()[0]; + var result = + (await media.sendToChat(chat, { caption, quotedMsg, isViewOnce })) || ''; + var m = { type: type, filename: filename, text: caption, mimeType: mime }; + var to = await WAPI.getchatId(chat.id); + if (result === 'success' || result === 'OK') { + var obj = WAPI.scope(to, false, result, null); + Object.assign(obj, m); + return obj; + } else { + var obj = WAPI.scope(to, true, result, null); + Object.assign(obj, m); + return obj; + } + } else { + return chat; + } +} diff --git a/src/lib/wapi/functions/send-image-with-product.js b/src/lib/wapi/functions/send-image-with-product.js new file mode 100644 index 000000000..f1e2753cb --- /dev/null +++ b/src/lib/wapi/functions/send-image-with-product.js @@ -0,0 +1,75 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +import { processFiles } from './process-files'; +import { base64ToFile } from '../helper'; + +/** + * Sends product with product image to given chat id + * @param {string} imgBase64 Base64 image data + * @param {string} chatid Chat id + * @param {string} caption Caption + * @param {string} bizNumber string the @c.us number of the business account from which you want to grab the product + * @param {string} productId string the id of the product within the main catalog of the aforementioned business + * @param {Function} done Optional callback + */ +export function sendImageWithProduct( + imgBase64, + chatid, + caption, + bizNumber, + productId, + done +) { + WPP.whatsapp.CatalogStore.findCarouselCatalog(bizNumber).then((cat) => { + if (cat && cat[0]) { + const product = cat[0].productCollection.get(productId); + const temp = { + productMsgOptions: { + businessOwnerJid: product.catalogWid.toString({ + legacy: !0, + }), + productId: product.id.toString(), + url: product.url, + productImageCount: product.productImageCollection.length, + title: product.name, + description: product.description, + currencyCode: product.currency, + priceAmount1000: product.priceAmount1000, + type: 'product', + }, + caption, + }; + + var idUser = new WPP.whatsapp.WidFactory.createWid(chatid); + + return WPP.chat.find(idUser).then((chat) => { + var mediaBlob = base64ToFile(imgBase64, product.name); + // var mc = new Store.MediaCollection(chat); + // mc.processFiles([mediaBlob], chat, 1) + processFiles(chat, mediaBlob).then((mc) => { + var media = mc.getModelsArray()[0]; + Object.entries(temp.productMsgOptions).map( + ([k, v]) => (media.mediaPrep._mediaData[k] = v) + ); + media.mediaPrep.sendToChat(chat, temp); + if (done !== undefined) done(true); + }); + }); + } + }); +} diff --git a/src/lib/wapi/functions/send-image.js b/src/lib/wapi/functions/send-image.js new file mode 100644 index 000000000..e37e9b934 --- /dev/null +++ b/src/lib/wapi/functions/send-image.js @@ -0,0 +1,47 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +import { sendFile } from './send-file'; + +/** + * Sends image to given chat if + * @param {string} imgBase64 base64 encoded file + * @param {string} chatid Chat id + * @param {string} filename + * @param {string} caption + * @param {string} quotedMessageId Quoted message id + * @param {boolean} isViewOnce Enable single view + * @param {Function} done Optional callback + */ +export function sendImage( + imgBase64, + chatid, + filename, + caption, + quotedMessageId, + isViewOnce +) { + return sendFile( + imgBase64, + chatid, + filename, + caption, + 'sendImage', + quotedMessageId, + isViewOnce + ); +} diff --git a/src/lib/wapi/functions/send-link-preview.js b/src/lib/wapi/functions/send-link-preview.js new file mode 100644 index 000000000..5c8e60098 --- /dev/null +++ b/src/lib/wapi/functions/send-link-preview.js @@ -0,0 +1,68 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export async function sendLinkPreview(chatId, url, text) { + text = text || ''; + const _Path = { + Protocol: '^(https?:\\/\\/)?', + Domain: '((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|', + IP: '((\\d{1,3}\\.){3}\\d{1,3}))', + Port: '(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*', + Query: '(\\?[;&a-z\\d%_.~+=-]*)?', + End: '(\\#[-a-z\\d_]*)?$', + Reg: () => { + return new RegExp( + _Path.Protocol + + _Path.Domain + + _Path.IP + + _Path.Port + + _Path.Query + + _Path.End, + 'i' + ); + }, + }; + if (!_Path.Reg().test(url)) { + var text = + 'Use a valid HTTP protocol. Example: https://www.youtube.com/watch?v=V1bFr2SWP1'; + return WAPI.scope(chatId, true, null, text); + } + var chat = await WAPI.sendExist(chatId); + if (!chat.erro) { + // There are no support for link preview with MD + const linkPreview = WPP.conn.isMultiDevice() + ? undefined + : await WPP.whatsapp.functions.queryLinkPreview(url); + var result = + (await chat.sendMessage(text.includes(url) ? text : `${url}\n${text}`, { + linkPreview, + })) || ''; + var m = { type: 'LinkPreview', url: url, text: text }, + To = await WAPI.getchatId(chat.id); + if (result === 'success' || result === 'OK') { + var obj = WAPI.scope(To, false, result, null); + Object.assign(obj, m); + return obj; + } else { + var obj = WAPI.scope(To, true, result, null); + Object.assign(obj, m); + return obj; + } + } else { + return chat; + } +} diff --git a/src/lib/wapi/functions/send-location.js b/src/lib/wapi/functions/send-location.js new file mode 100644 index 000000000..e8605dae4 --- /dev/null +++ b/src/lib/wapi/functions/send-location.js @@ -0,0 +1,70 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export async function sendLocation( + chatId, + latitude, + longitude, + location = null +) { + var chat = await WAPI.sendExist(chatId); + + if (!chat.erro) { + var newId = WPP.chat.generateMessageID(chat.id); + + var message = { + ack: 0, + id: newId, + local: true, + self: 'out', + t: parseInt(new Date().getTime() / 1000), + from: WPP.whatsapp.UserPrefs.getMaybeMeUser(), + to: chat.id, + isNewMsg: true, + type: 'location', + lat: latitude, + lng: longitude, + loc: location, + }; + + var result = + ( + await Promise.all( + WPP.whatsapp.functions.addAndSendMsgToChat(chat, message) + ) + )[1] || ''; + var m = { + latitude: latitude, + longitude: longitude, + title: location, + type: 'location', + }, + obj, + To = await WAPI.getchatId(chat.id); + if (result == 'success' || result == 'OK') { + obj = WAPI.scope(To, false, result, null); + Object.assign(obj, m); + return obj; + } else { + obj = WAPI.scope(To, true, result, null); + Object.assign(obj, m); + return obj; + } + } else { + return chat; + } +} diff --git a/src/lib/wapi/functions/send-message-with-tags.js b/src/lib/wapi/functions/send-message-with-tags.js new file mode 100644 index 000000000..f2f8ee11f --- /dev/null +++ b/src/lib/wapi/functions/send-message-with-tags.js @@ -0,0 +1,52 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export async function sendMessageWithTags(to, body) { + var chat = to.id ? to : WPP.whatsapp.ChatStore.get(to); + var chatId = chat.id._serialized; + var msgIveSent = chat.msgs.filter((msg) => msg.__x_isSentByMe)[0]; + if (!msgIveSent) { + return chat.sendMessage(body); + } + + var tempMsg = Object.create(msgIveSent); + var newId = WPP.chat.generateMessageID(chatId); + var mentionedJidList = + body + .match(/@(\d*)/g) + .map( + (x) => new WPP.whatsapp.WidFactory.createUserWid(x.replace('@', '')) + ) || undefined; + + var extend = { + ack: 0, + id: newId, + local: !0, + self: 'out', + t: parseInt(new Date().getTime() / 1000), + to: new WPP.whatsapp.WidFactory.createWid(chatId), + isNewMsg: !0, + type: 'chat', + body, + quotedMsg: null, + mentionedJidList, + }; + + Object.assign(tempMsg, extend); + await WPP.whatsapp.functions.addAndSendMsgToChat(chat, tempMsg); + return newId._serialized; +} diff --git a/src/lib/wapi/functions/send-message-with-thumb.js b/src/lib/wapi/functions/send-message-with-thumb.js new file mode 100644 index 000000000..cb6aaf0b3 --- /dev/null +++ b/src/lib/wapi/functions/send-message-with-thumb.js @@ -0,0 +1,46 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export function sendMessageWithThumb( + thumb, + url, + title, + description, + chatId, + done +) { + var chatSend = WAPI.getChat(chatId); + if (chatSend === undefined) { + if (done !== undefined) done(false); + return false; + } + var linkPreview = { + canonicalUrl: url, + description: description, + matchedText: url, + title: title, + thumbnail: thumb, + }; + chatSend.sendMessage(url, { + linkPreview: linkPreview, + mentionedJidList: [], + quotedMsg: null, + quotedMsgAdminGroupJid: null, + }); + if (done !== undefined) done(true); + return true; +} diff --git a/src/lib/wapi/functions/send-message.js b/src/lib/wapi/functions/send-message.js new file mode 100644 index 000000000..0f67eb082 --- /dev/null +++ b/src/lib/wapi/functions/send-message.js @@ -0,0 +1,59 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export async function sendMessage(to, content) { + const chat = await WAPI.sendExist(to); + + if (!chat.erro) { + var newId = WPP.chat.generateMessageID(chat.id); + + var message = { + id: newId, + body: content, + type: 'chat', + subtype: null, + t: parseInt(new Date().getTime() / 1000), + from: WPP.whatsapp.UserPrefs.getMaybeMeUser(), + to: chat.id, + self: 'out', + isNewMsg: true, + local: true, + ack: 0, + urlText: null, + urlNumber: null, + }; + + var result = + ( + await Promise.all( + WPP.whatsapp.functions.addAndSendMsgToChat(chat, message) + ) + )[1] || ''; + + if (result === 'success' || result === 'OK') { + return newId?._serialized; + } else { + const m = { type: 'sendtext', text: message }; + const To = await WAPI.getchatId(chat.id); + const obj = WAPI.scope(To, true, result, null); + Object.assign(obj, m); + return obj; + } + } else { + return chat; + } +} diff --git a/src/lib/wapi/functions/send-message2.js b/src/lib/wapi/functions/send-message2.js new file mode 100644 index 000000000..c4f13893a --- /dev/null +++ b/src/lib/wapi/functions/send-message2.js @@ -0,0 +1,37 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export function sendMessage2(id, message, done) { + var chat = WAPI.getChat(id); + if (chat !== undefined) { + try { + if (done !== undefined) { + chat.sendMessage(message).then(function () { + done(true); + }); + } else { + chat.sendMessage(message); + } + return true; + } catch (error) { + if (done !== undefined) done(false); + return false; + } + } + if (done !== undefined) done(false); + return false; +} diff --git a/src/lib/wapi/functions/send-mute.js b/src/lib/wapi/functions/send-mute.js new file mode 100644 index 000000000..69db83bc2 --- /dev/null +++ b/src/lib/wapi/functions/send-mute.js @@ -0,0 +1,97 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export async function sendMute(chatId, time, type) { + var chat = await WAPI.sendExist(chatId); + if (!chat.erro) { + let TimeInt = null; + var result = null, + remove = null, + texto = null; + var To = await WAPI.getchatId(chat.id), + isMute = await window.Store.Mute.get(chat.id), + m = { type: 'sendMute', time: time, timeType: type }; + if (typeof time === 'number' && typeof type === 'string') { + switch (type) { + case 'hours': + TimeInt = parseInt( + new Date( + new Date().setHours(new Date().getHours() + time) + ).getTime() / 1000 + ); + break; + case 'minutes': + TimeInt = parseInt( + new Date( + new Date().setMinutes(new Date().getMinutes() + time) + ).getTime() / 1000 + ); + break; + case 'year': + TimeInt = parseInt( + new Date( + new Date().setDate(new Date().getDate() + time) + ).getTime() / 1000 + ); + break; + } + await window.Store.SendMute.sendConversationMute(chat.id, TimeInt, 0) + .then((e) => { + result = e; + }) + .catch((e) => { + result = e; + }); + } else { + remove = true; + await window.Store.SendMute.sendConversationMute( + chat.id, + 0, + isMute.__x_expiration + ) + .then((e) => { + result = e; + }) + .catch((e) => { + result = e; + }); + } + if (result.status === 200) { + if (remove) { + isMute.__x_expiration = 0; + isMute.__x_isMuted = false; + } else { + isMute.__x_expiration = TimeInt; + isMute.__x_isMuted = true; + } + var obj = WAPI.scope(To, false, result.status, null); + Object.assign(obj, m); + return obj; + } else { + if (remove) { + texto = 'is not mute to remove'; + } else { + texto = 'This chat is already mute'; + } + var obj = WAPI.scope(To, true, result['status'], texto); + Object.assign(obj, m); + return obj; + } + } else { + return chat; + } +} diff --git a/src/lib/wapi/functions/send-ptt.js b/src/lib/wapi/functions/send-ptt.js new file mode 100644 index 000000000..e91018877 --- /dev/null +++ b/src/lib/wapi/functions/send-ptt.js @@ -0,0 +1,79 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +import { processFiles } from './process-files'; +import { base64ToFile } from '../helper'; +import { getMessageById } from './get-message-by-id'; + +/** + * Sends image to given chat if + * @param {string} imgBase64 base64 encoded file + * @param {string} chatid Chat id + * @param {string} filename + * @param {string} caption + * @param {Function} done Optional callback + * @param {string} quotedMessageId Quoted message id + */ +export async function sendPtt( + imgBase64, + chatid, + filename, + caption, + done, + quotedMessageId = null +) { + var chat = await WAPI.sendExist(chatid); + + if (!chat.erro) { + let quotedMsg = null; + + if (typeof quotedMessageId === 'string' && quotedMessageId) { + const message = await getMessageById(quotedMessageId, null, false); + + if (message && message.canReply()) { + quotedMsg = message; + } + } + + var mediaBlob = base64ToFile(imgBase64, filename); + var mediaCollection = await processFiles(chat, mediaBlob); + var media = mediaCollection.getModelsArray()[0]; + media.mediaPrep._mediaData.type = 'ptt'; + + var result = (await media.sendToChat(chat, { caption, quotedMsg })) || ''; + + if (done !== undefined) done(true); + + var m = { + type: 'ptt', + filename: filename, + text: caption, + }; + var to = await WAPI.getchatId(chat.id); + if (result === 'success' || result === 'OK') { + var obj = WAPI.scope(to, false, result, null); + Object.assign(obj, m); + return obj; + } else { + var obj = WAPI.scope(to, true, result, null); + Object.assign(obj, m); + return obj; + } + } else { + return chat; + } +} diff --git a/src/lib/wapi/functions/send-video-as-gif.js b/src/lib/wapi/functions/send-video-as-gif.js new file mode 100644 index 000000000..1afd62880 --- /dev/null +++ b/src/lib/wapi/functions/send-video-as-gif.js @@ -0,0 +1,61 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +import { processFiles } from './process-files'; +import { base64ToFile } from '../helper'; + +/** + * Sends video as a gif to given chat id + * @param {string} dataBase64 + * @param {string} chatid + * @param {string} filename + * @param {string} caption + * @param {Function} done Optional callback + */ +export async function sendVideoAsGif( + dataBase64, + chatid, + filename, + caption, + done +) { + var chat = await WAPI.sendExist(chatid); + if (!chat.erro) { + var mediaBlob = base64ToFile(dataBase64, filename); + var mediaCollection = await processFiles(chat, mediaBlob); + var media = mediaCollection.getModelsArray()[0]; + media.mediaPrep._mediaData.isGif = true; + media.mediaPrep._mediaData.gifAttribution = 1; + + var result = (await media.sendToChat(chat, { caption: caption })) || ''; + var m = { filename: filename, text: caption }, + To = await WAPI.getchatId(chat.id); + if (result === 'success' || result === 'OK') { + if (done !== undefined) done(false); + var obj = WAPI.scope(To, false, result, null); + Object.assign(obj, m); + return obj; + } else { + if (done !== undefined) done(true); + var obj = WAPI.scope(To, true, result, null); + Object.assign(obj, m); + return obj; + } + } else { + return chat; + } +} diff --git a/src/lib/wapi/functions/sendMessageOptions.js b/src/lib/wapi/functions/sendMessageOptions.js new file mode 100644 index 000000000..45b2df31a --- /dev/null +++ b/src/lib/wapi/functions/sendMessageOptions.js @@ -0,0 +1,145 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +import { getMessageById } from './get-message-by-id'; + +/** + * Send message with options + * @param {string} chatid the numberid xxx@c.us + * @param {string} content the message + * @param {string} options object aditionais + */ +export async function sendMessageOptions(chatId, content, options = {}) { + const chat = WPP.chat.get(chatId) || (await WPP.chat.find(chatId)); + + let attOptions = {}; + if (options.attachment) { + attOptions = await WWebJS.processMediaData( + options.attachment, + options.sendAudioAsVoice + ); + content = attOptions.preview; + delete options.attachment; + } + + let quotedMsgOptions = {}; + if (options.quotedMessageId) { + let quotedMessage = await getMessageById( + options.quotedMessageId, + null, + false + ); + if (quotedMessage && quotedMessage.canReply()) { + quotedMsgOptions = quotedMessage.msgContextInfo(chat); + } + delete options.quotedMessageId; + } + + if (options.mentionedJidList) { + options.mentionedJidList = options.mentionedJidList.map( + (cId) => WPP.whatsapp.ContactStore.get(cId).id + ); + } + + let locationOptions = {}; + if (options.location) { + locationOptions = { + type: 'location', + loc: options.location.description, + lat: options.location.latitude, + lng: options.location.longitude, + }; + delete options.location; + } + + let vcardOptions = {}; + if (options.contactCard) { + let contact = WPP.whatsapp.ContactStore.get(options.contactCard); + vcardOptions = { + body: WPP.whatsapp.VCard.vcardFromContactModel(contact).vcard, + type: 'vcard', + vcardFormattedName: contact.formattedName, + }; + delete options.contactCard; + } else if (options.contactCardList) { + let contacts = options.contactCardList.map((c) => + WPP.whatsapp.ContactStore.get(c) + ); + let vcards = contacts.map((c) => + WPP.whatsapp.VCard.vcardFromContactModel(c) + ); + vcardOptions = { + type: 'multi_vcard', + vcardList: vcards, + body: undefined, + }; + delete options.contactCardList; + } else if ( + options.parseVCards && + typeof content === 'string' && + content.startsWith('BEGIN:VCARD') + ) { + delete options.parseVCards; + try { + const parsed = await WPP.whatsapp.VCard.parseVcard(content); + if (parsed) { + vcardOptions = { + type: 'vcard', + vcardFormattedName: await WPP.whatsapp.VCard.vcardGetNameFromParsed( + parsed + ), + }; + } + } catch (_) { + // not a vcard + } + } + + if (options.linkPreview) { + delete options.linkPreview; + const link = await window.Store.Validators.findLink(content); + if (link && !WPP.conn.isMultiDevice()) { + const preview = await WPP.whatsapp.functions.queryLinkPreview(link.url); + preview.preview = true; + preview.subtype = 'url'; + options = { ...options, ...preview }; + } + } + const newMsgId = WPP.chat.generateMessageID(chat.id); + const fromwWid = WPP.whatsapp.UserPrefs.getMaybeMeUser(); + const message = { + id: newMsgId, + ack: 0, + body: content, + from: fromwWid, + to: chat.id, + local: !0, + self: 'out', + t: parseInt(new Date().getTime() / 1000), + isNewMsg: !0, + type: 'chat', + ...options, + ...locationOptions, + ...attOptions, + ...quotedMsgOptions, + ...vcardOptions, + }; + + await WPP.whatsapp.functions.addAndSendMsgToChat(chat, message); + + return newMsgId._serialized; +} diff --git a/src/lib/wapi/functions/set-my-name.js b/src/lib/wapi/functions/set-my-name.js new file mode 100644 index 000000000..c17a9a5ca --- /dev/null +++ b/src/lib/wapi/functions/set-my-name.js @@ -0,0 +1,20 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export async function setMyName(name) { + await window.Store.Perfil.setPushname(name); +} diff --git a/src/lib/wapi/functions/set-online-presence.js b/src/lib/wapi/functions/set-online-presence.js new file mode 100644 index 000000000..c12ea2774 --- /dev/null +++ b/src/lib/wapi/functions/set-online-presence.js @@ -0,0 +1,28 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export async function setOnlinePresence(online) { + if (typeof online === 'undefined') { + online = true; + } + + if (online) { + await WPP.whatsapp.ChatPresence.sendPresenceAvailable(); + } else { + await WPP.whatsapp.ChatPresence.sendPresenceUnavailable(); + } +} diff --git a/src/lib/wapi/functions/set-profile-pic.js b/src/lib/wapi/functions/set-profile-pic.js new file mode 100644 index 000000000..f7648dcd2 --- /dev/null +++ b/src/lib/wapi/functions/set-profile-pic.js @@ -0,0 +1,29 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ +export async function setProfilePic(obj, id) { + if (!id) { + id = WPP.whatsapp.UserPrefs.getMaybeMeUser(); + } + const wid = WPP.whatsapp.WidFactory.createWid(id); + + let base64 = 'data:image/jpeg;base64,'; + return await WPP.whatsapp.functions.sendSetPicture( + wid, + base64 + obj.b, + base64 + obj.a + ); +} diff --git a/src/lib/wapi/functions/set-temporary-messages.js b/src/lib/wapi/functions/set-temporary-messages.js new file mode 100644 index 000000000..d991a004e --- /dev/null +++ b/src/lib/wapi/functions/set-temporary-messages.js @@ -0,0 +1,43 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export async function setTemporaryMessages(chatId, value) { + const chat = WPP.whatsapp.ChatStore.get(chatId); + + if (!chat) { + throw { + error: true, + code: 'chat_not_found', + message: 'Chat not found', + }; + } + if (chat.isGroup) { + return await WPP.group.setProperty(chat.id, 'ephemeral', value); + } + + value = value ? 604800 : 0; + + await Store.changeEphemeralDuration(chat, value).catch((e) => { + throw { + error: true, + code: e.code || e.status || e.statusCode || 'unknown', + message: e.message || e.reason || 'Unknown Error', + }; + }); + + return true; +} diff --git a/src/lib/wapi/functions/star-messages.js b/src/lib/wapi/functions/star-messages.js new file mode 100644 index 000000000..3956feb99 --- /dev/null +++ b/src/lib/wapi/functions/star-messages.js @@ -0,0 +1,57 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +import { getMessageById } from './get-message-by-id'; + +export async function starMessages(messagesId, star) { + if (typeof star === 'undefined') { + star = true; + } + + if (!Array.isArray(messagesId)) { + messagesId = [messagesId]; + } + + let messagesToStar = await Promise.all( + messagesId.map(async (msgId) => await getMessageById(msgId, null, false)) + ); + + // Ignore unchanged messages + messagesToStar = messagesToStar.filter((msg) => msg && msg.star !== star); + + // group by chat + const messagesPerChat = messagesToStar.reduce(function (r, msg) { + const id = msg.id.remote._serialized; + r[id] = r[id] || []; + r[id].push(msg); + return r; + }, Object.create(null)); + + let count = 0; + // Star Messages + for (const chatId in messagesPerChat) { + const chat = WPP.whatsapp.ChatStore.get(chatId); + const messages = messagesPerChat[chatId]; + + count += await chat + .sendStarMsgs(messages, star) + .then(() => messages.length) + .catch(() => 0); + } + + return count; +} diff --git a/src/lib/wapi/functions/theme.js b/src/lib/wapi/functions/theme.js new file mode 100644 index 000000000..cad9b6be6 --- /dev/null +++ b/src/lib/wapi/functions/theme.js @@ -0,0 +1,29 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export async function setTheme(type) { + if (type == 'dark' || type == 'light') { + await Store.Theme.setTheme(type); + return true; + } else { + return console.error('Use type dark or light'); + } +} + +export async function getTheme() { + return await Store.Theme.getTheme(); +} diff --git a/src/lib/wapi/globals.d.ts b/src/lib/wapi/globals.d.ts new file mode 100644 index 000000000..6dd6a64da --- /dev/null +++ b/src/lib/wapi/globals.d.ts @@ -0,0 +1,31 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +import type * as wajs from '@wppconnect/wa-js'; + +declare global { + interface Window { + WPP: typeof wajs; + } + const WPP: typeof wajs; +} + +declare global { + interface Window { + Store: any; + } +} diff --git a/src/lib/wapi/helper/array-buffer-to-base64.js b/src/lib/wapi/helper/array-buffer-to-base64.js new file mode 100644 index 000000000..53553f9e1 --- /dev/null +++ b/src/lib/wapi/helper/array-buffer-to-base64.js @@ -0,0 +1,68 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export function arrayBufferToBase64(arrayBuffer) { + var base64 = ''; + var encodings = + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; + + var bytes = new Uint8Array(arrayBuffer); + var byteLength = bytes.byteLength; + var byteRemainder = byteLength % 3; + var mainLength = byteLength - byteRemainder; + + var a, b, c, d; + var chunk; + + // Main loop deals with bytes in chunks of 3 + for (var i = 0; i < mainLength; i = i + 3) { + // Combine the three bytes into a single integer + chunk = (bytes[i] << 16) | (bytes[i + 1] << 8) | bytes[i + 2]; + + // Use bitmasks to extract 6-bit segments from the triplet + a = (chunk & 16515072) >> 18; // 16515072 = (2^6 - 1) << 18 + b = (chunk & 258048) >> 12; // 258048 = (2^6 - 1) << 12 + c = (chunk & 4032) >> 6; // 4032 = (2^6 - 1) << 6 + d = chunk & 63; // 63 = 2^6 - 1 + + // Convert the raw binary segments to the appropriate ASCII encoding + base64 += encodings[a] + encodings[b] + encodings[c] + encodings[d]; + } + + // Deal with the remaining bytes and padding + if (byteRemainder == 1) { + chunk = bytes[mainLength]; + + a = (chunk & 252) >> 2; // 252 = (2^6 - 1) << 2 + + // Set the 4 least significant bits to zero + b = (chunk & 3) << 4; // 3 = 2^2 - 1 + + base64 += encodings[a] + encodings[b] + '=='; + } else if (byteRemainder == 2) { + chunk = (bytes[mainLength] << 8) | bytes[mainLength + 1]; + + a = (chunk & 64512) >> 10; // 64512 = (2^6 - 1) << 10 + b = (chunk & 1008) >> 4; // 1008 = (2^6 - 1) << 4 + + // Set the 2 least significant bits to zero + c = (chunk & 15) << 2; // 15 = 2^4 - 1 + + base64 += encodings[a] + encodings[b] + encodings[c] + '='; + } + return base64; +} diff --git a/src/lib/wapi/helper/base64-to-file.js b/src/lib/wapi/helper/base64-to-file.js new file mode 100644 index 000000000..809942049 --- /dev/null +++ b/src/lib/wapi/helper/base64-to-file.js @@ -0,0 +1,33 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ +export function base64ToFile(base64, filename) { + var arr = base64.split(','); + var mime = arr[0].match(/(?:data:)?(.*?)(?:;base64)?$/i)[1]; + mime = mime.split(/\s+;\s+/).join('; '); // Fix spaces, like "audio/ogg; codecs=opus" + + var bstr = window.Base64 ? window.Base64.atob(arr[1]) : atob(arr[1]); + var n = bstr.length; + var u8arr = new Uint8Array(n); + + while (n--) { + u8arr[n] = bstr.charCodeAt(n); + } + + return new File([u8arr], filename, { + type: mime, + }); +} diff --git a/src/lib/wapi/helper/generate-media-key.js b/src/lib/wapi/helper/generate-media-key.js new file mode 100644 index 000000000..e2e12485e --- /dev/null +++ b/src/lib/wapi/helper/generate-media-key.js @@ -0,0 +1,26 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export function generateMediaKey(length) { + let result = ''; + let characters = + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + for (let i = 0; i < length; i++) { + result += characters.charAt(Math.floor(Math.random() * characters.length)); + } + return result; +} diff --git a/src/lib/wapi/helper/get-file-hash.js b/src/lib/wapi/helper/get-file-hash.js new file mode 100644 index 000000000..7ea5705f7 --- /dev/null +++ b/src/lib/wapi/helper/get-file-hash.js @@ -0,0 +1,24 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +import * as jsSHA from '../jssha'; +export async function getFileHash(data) { + let buffer = await data.arrayBuffer(); + var sha = new jsSHA('SHA-256', 'ARRAYBUFFER'); + sha.update(buffer); + return sha.getHash('B64'); +} diff --git a/src/lib/wapi/helper/index.js b/src/lib/wapi/helper/index.js new file mode 100644 index 000000000..c69e3c6fb --- /dev/null +++ b/src/lib/wapi/helper/index.js @@ -0,0 +1,21 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export { base64ToFile } from './base64-to-file'; +export { getFileHash } from './get-file-hash'; +export { generateMediaKey } from './generate-media-key'; +export { arrayBufferToBase64 } from './array-buffer-to-base64'; diff --git a/src/lib/wapi/helper/is-chat-message.js b/src/lib/wapi/helper/is-chat-message.js new file mode 100644 index 000000000..420df61b8 --- /dev/null +++ b/src/lib/wapi/helper/is-chat-message.js @@ -0,0 +1,29 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export function isChatMessage(message) { + if (message.isSentByMe) { + return false; + } + if (message.isNotification) { + return false; + } + if (!message.isUserCreatedType) { + return false; + } + return true; +} diff --git a/src/lib/wapi/jsconfig.json b/src/lib/wapi/jsconfig.json new file mode 100644 index 000000000..e9ede97e1 --- /dev/null +++ b/src/lib/wapi/jsconfig.json @@ -0,0 +1,7 @@ + +{ + "compilerOptions": { + "module": "commonjs", + "target": "es6" + } +} diff --git a/src/lib/wapi/jssha/index.js b/src/lib/wapi/jssha/index.js new file mode 100644 index 000000000..9bbde3196 --- /dev/null +++ b/src/lib/wapi/jssha/index.js @@ -0,0 +1,1158 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +'use strict'; +(function (aa) { + function C(e, b, a) { + var k = 0, + h = [], + l = 0, + g, + m, + c, + f, + n, + q, + u, + r, + I = !1, + v = [], + x = [], + t, + y = !1, + z = !1, + w = -1; + a = a || {}; + g = a.encoding || 'UTF8'; + t = a.numRounds || 1; + if (t !== parseInt(t, 10) || 1 > t) + throw Error('numRounds must a integer >= 1'); + if ('SHA-1' === e) + (n = 512), + (q = K), + (u = ba), + (f = 160), + (r = function (b) { + return b.slice(); + }); + else if (0 === e.lastIndexOf('SHA-', 0)) + if ( + ((q = function (b, k) { + return L(b, k, e); + }), + (u = function (b, k, h, a) { + var d, f; + if ('SHA-224' === e || 'SHA-256' === e) + (d = (((k + 65) >>> 9) << 4) + 15), (f = 16); + else if ('SHA-384' === e || 'SHA-512' === e) + (d = (((k + 129) >>> 10) << 5) + 31), (f = 32); + else throw Error('Unexpected error in SHA-2 implementation'); + for (; b.length <= d; ) b.push(0); + b[k >>> 5] |= 128 << (24 - (k % 32)); + k = k + h; + b[d] = k & 4294967295; + b[d - 1] = (k / 4294967296) | 0; + h = b.length; + for (k = 0; k < h; k += f) a = L(b.slice(k, k + f), a, e); + if ('SHA-224' === e) b = [a[0], a[1], a[2], a[3], a[4], a[5], a[6]]; + else if ('SHA-256' === e) b = a; + else if ('SHA-384' === e) + b = [ + a[0].a, + a[0].b, + a[1].a, + a[1].b, + a[2].a, + a[2].b, + a[3].a, + a[3].b, + a[4].a, + a[4].b, + a[5].a, + a[5].b, + ]; + else if ('SHA-512' === e) + b = [ + a[0].a, + a[0].b, + a[1].a, + a[1].b, + a[2].a, + a[2].b, + a[3].a, + a[3].b, + a[4].a, + a[4].b, + a[5].a, + a[5].b, + a[6].a, + a[6].b, + a[7].a, + a[7].b, + ]; + else throw Error('Unexpected error in SHA-2 implementation'); + return b; + }), + (r = function (b) { + return b.slice(); + }), + 'SHA-224' === e) + ) + (n = 512), (f = 224); + else if ('SHA-256' === e) (n = 512), (f = 256); + else if ('SHA-384' === e) (n = 1024), (f = 384); + else if ('SHA-512' === e) (n = 1024), (f = 512); + else throw Error('Chosen SHA variant is not supported'); + else if ( + 0 === e.lastIndexOf('SHA3-', 0) || + 0 === e.lastIndexOf('SHAKE', 0) + ) { + var F = 6; + q = D; + r = function (b) { + var e = [], + a; + for (a = 0; 5 > a; a += 1) e[a] = b[a].slice(); + return e; + }; + w = 1; + if ('SHA3-224' === e) (n = 1152), (f = 224); + else if ('SHA3-256' === e) (n = 1088), (f = 256); + else if ('SHA3-384' === e) (n = 832), (f = 384); + else if ('SHA3-512' === e) (n = 576), (f = 512); + else if ('SHAKE128' === e) (n = 1344), (f = -1), (F = 31), (z = !0); + else if ('SHAKE256' === e) (n = 1088), (f = -1), (F = 31), (z = !0); + else throw Error('Chosen SHA variant is not supported'); + u = function (b, e, a, k, h) { + a = n; + var d = F, + f, + g = [], + l = a >>> 5, + m = 0, + c = e >>> 5; + for (f = 0; f < c && e >= a; f += l) + (k = D(b.slice(f, f + l), k)), (e -= a); + b = b.slice(f); + for (e %= a; b.length < l; ) b.push(0); + f = e >>> 3; + b[f >> 2] ^= d << ((f % 4) * 8); + b[l - 1] ^= 2147483648; + for (k = D(b, k); 32 * g.length < h; ) { + b = k[m % 5][(m / 5) | 0]; + g.push(b.b); + if (32 * g.length >= h) break; + g.push(b.a); + m += 1; + 0 === (64 * m) % a && D(null, k); + } + return g; + }; + } else throw Error('Chosen SHA variant is not supported'); + c = M(b, g, w); + m = A(e); + this.setHMACKey = function (b, a, h) { + var d; + if (!0 === I) throw Error('HMAC key already set'); + if (!0 === y) throw Error('Cannot set HMAC key after calling update'); + if (!0 === z) throw Error('SHAKE is not supported for HMAC'); + g = (h || {}).encoding || 'UTF8'; + a = M(a, g, w)(b); + b = a.binLen; + a = a.value; + d = n >>> 3; + h = d / 4 - 1; + if (d < b / 8) { + for (a = u(a, b, 0, A(e), f); a.length <= h; ) a.push(0); + a[h] &= 4294967040; + } else if (d > b / 8) { + for (; a.length <= h; ) a.push(0); + a[h] &= 4294967040; + } + for (b = 0; b <= h; b += 1) + (v[b] = a[b] ^ 909522486), (x[b] = a[b] ^ 1549556828); + m = q(v, m); + k = n; + I = !0; + }; + this.update = function (b) { + var a, + e, + d, + f = 0, + g = n >>> 5; + a = c(b, h, l); + b = a.binLen; + e = a.value; + a = b >>> 5; + for (d = 0; d < a; d += g) + f + n <= b && ((m = q(e.slice(d, d + g), m)), (f += n)); + k += f; + h = e.slice(f >>> 5); + l = b % n; + y = !0; + }; + this.getHash = function (b, a) { + var d, g, c, n; + if (!0 === I) throw Error('Cannot call getHash after setting HMAC key'); + c = N(a); + if (!0 === z) { + if (-1 === c.shakeLen) + throw Error('shakeLen must be specified in options'); + f = c.shakeLen; + } + switch (b) { + case 'HEX': + d = function (b) { + return O(b, f, w, c); + }; + break; + case 'B64': + d = function (b) { + return P(b, f, w, c); + }; + break; + case 'BYTES': + d = function (b) { + return Q(b, f, w); + }; + break; + case 'ARRAYBUFFER': + try { + g = new ArrayBuffer(0); + } catch (p) { + throw Error('ARRAYBUFFER not supported by this environment'); + } + d = function (b) { + return R(b, f, w); + }; + break; + case 'UINT8ARRAY': + try { + g = new Uint8Array(0); + } catch (p) { + throw Error('UINT8ARRAY not supported by this environment'); + } + d = function (b) { + return S(b, f, w); + }; + break; + default: + throw Error( + 'format must be HEX, B64, BYTES, ARRAYBUFFER, or UINT8ARRAY' + ); + } + n = u(h.slice(), l, k, r(m), f); + for (g = 1; g < t; g += 1) + !0 === z && + 0 !== f % 32 && + (n[n.length - 1] &= 16777215 >>> (24 - (f % 32))), + (n = u(n, f, 0, A(e), f)); + return d(n); + }; + this.getHMAC = function (b, a) { + var d, g, c, p; + if (!1 === I) + throw Error('Cannot call getHMAC without first setting HMAC key'); + c = N(a); + switch (b) { + case 'HEX': + d = function (b) { + return O(b, f, w, c); + }; + break; + case 'B64': + d = function (b) { + return P(b, f, w, c); + }; + break; + case 'BYTES': + d = function (b) { + return Q(b, f, w); + }; + break; + case 'ARRAYBUFFER': + try { + d = new ArrayBuffer(0); + } catch (v) { + throw Error('ARRAYBUFFER not supported by this environment'); + } + d = function (b) { + return R(b, f, w); + }; + break; + case 'UINT8ARRAY': + try { + d = new Uint8Array(0); + } catch (v) { + throw Error('UINT8ARRAY not supported by this environment'); + } + d = function (b) { + return S(b, f, w); + }; + break; + default: + throw Error( + 'outputFormat must be HEX, B64, BYTES, ARRAYBUFFER, or UINT8ARRAY' + ); + } + g = u(h.slice(), l, k, r(m), f); + p = q(x, A(e)); + p = u(g, f, n, p, f); + return d(p); + }; + } + function a(a, b) { + this.a = a; + this.b = b; + } + function T(a, b, d, k) { + var h, l, g, c, p; + b = b || [0]; + d = d || 0; + l = d >>> 3; + p = -1 === k ? 3 : 0; + for (h = 0; h < a.length; h += 1) + (c = h + l), + (g = c >>> 2), + b.length <= g && b.push(0), + (b[g] |= a[h] << (8 * (p + (c % 4) * k))); + return { value: b, binLen: 8 * a.length + d }; + } + function O(a, b, d, k) { + var h = ''; + b /= 8; + var l, g, c; + c = -1 === d ? 3 : 0; + for (l = 0; l < b; l += 1) + (g = a[l >>> 2] >>> (8 * (c + (l % 4) * d))), + (h += + '0123456789abcdef'.charAt((g >>> 4) & 15) + + '0123456789abcdef'.charAt(g & 15)); + return k.outputUpper ? h.toUpperCase() : h; + } + function P(a, b, d, k) { + var h = '', + l = b / 8, + g, + c, + p, + f; + f = -1 === d ? 3 : 0; + for (g = 0; g < l; g += 3) + for ( + c = g + 1 < l ? a[(g + 1) >>> 2] : 0, + p = g + 2 < l ? a[(g + 2) >>> 2] : 0, + p = + (((a[g >>> 2] >>> (8 * (f + (g % 4) * d))) & 255) << 16) | + (((c >>> (8 * (f + ((g + 1) % 4) * d))) & 255) << 8) | + ((p >>> (8 * (f + ((g + 2) % 4) * d))) & 255), + c = 0; + 4 > c; + c += 1 + ) + 8 * g + 6 * c <= b + ? (h += + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.charAt( + (p >>> (6 * (3 - c))) & 63 + )) + : (h += k.b64Pad); + return h; + } + function Q(a, b, d) { + var k = ''; + b /= 8; + var h, c, g; + g = -1 === d ? 3 : 0; + for (h = 0; h < b; h += 1) + (c = (a[h >>> 2] >>> (8 * (g + (h % 4) * d))) & 255), + (k += String.fromCharCode(c)); + return k; + } + function R(a, b, d) { + b /= 8; + var k, + h = new ArrayBuffer(b), + c, + g; + g = new Uint8Array(h); + c = -1 === d ? 3 : 0; + for (k = 0; k < b; k += 1) + g[k] = (a[k >>> 2] >>> (8 * (c + (k % 4) * d))) & 255; + return h; + } + function S(a, b, d) { + b /= 8; + var k, + h = new Uint8Array(b), + c; + c = -1 === d ? 3 : 0; + for (k = 0; k < b; k += 1) + h[k] = (a[k >>> 2] >>> (8 * (c + (k % 4) * d))) & 255; + return h; + } + function N(a) { + var b = { outputUpper: !1, b64Pad: '=', shakeLen: -1 }; + a = a || {}; + b.outputUpper = a.outputUpper || !1; + !0 === a.hasOwnProperty('b64Pad') && (b.b64Pad = a.b64Pad); + if (!0 === a.hasOwnProperty('shakeLen')) { + if (0 !== a.shakeLen % 8) throw Error('shakeLen must be a multiple of 8'); + b.shakeLen = a.shakeLen; + } + if ('boolean' !== typeof b.outputUpper) + throw Error('Invalid outputUpper formatting option'); + if ('string' !== typeof b.b64Pad) + throw Error('Invalid b64Pad formatting option'); + return b; + } + function M(a, b, d) { + switch (b) { + case 'UTF8': + case 'UTF16BE': + case 'UTF16LE': + break; + default: + throw Error('encoding must be UTF8, UTF16BE, or UTF16LE'); + } + switch (a) { + case 'HEX': + a = function (b, a, e) { + var g = b.length, + c, + p, + f, + n, + q, + u; + if (0 !== g % 2) + throw Error('String of HEX type must be in byte increments'); + a = a || [0]; + e = e || 0; + q = e >>> 3; + u = -1 === d ? 3 : 0; + for (c = 0; c < g; c += 2) { + p = parseInt(b.substr(c, 2), 16); + if (isNaN(p)) + throw Error('String of HEX type contains invalid characters'); + n = (c >>> 1) + q; + for (f = n >>> 2; a.length <= f; ) a.push(0); + a[f] |= p << (8 * (u + (n % 4) * d)); + } + return { value: a, binLen: 4 * g + e }; + }; + break; + case 'TEXT': + a = function (a, e, c) { + var g, + m, + p = 0, + f, + n, + q, + u, + r, + t; + e = e || [0]; + c = c || 0; + q = c >>> 3; + if ('UTF8' === b) + for (t = -1 === d ? 3 : 0, f = 0; f < a.length; f += 1) + for ( + g = a.charCodeAt(f), + m = [], + 128 > g + ? m.push(g) + : 2048 > g + ? (m.push(192 | (g >>> 6)), m.push(128 | (g & 63))) + : 55296 > g || 57344 <= g + ? m.push( + 224 | (g >>> 12), + 128 | ((g >>> 6) & 63), + 128 | (g & 63) + ) + : ((f += 1), + (g = + 65536 + + (((g & 1023) << 10) | (a.charCodeAt(f) & 1023))), + m.push( + 240 | (g >>> 18), + 128 | ((g >>> 12) & 63), + 128 | ((g >>> 6) & 63), + 128 | (g & 63) + )), + n = 0; + n < m.length; + n += 1 + ) { + r = p + q; + for (u = r >>> 2; e.length <= u; ) e.push(0); + e[u] |= m[n] << (8 * (t + (r % 4) * d)); + p += 1; + } + else if ('UTF16BE' === b || 'UTF16LE' === b) + for ( + t = -1 === d ? 2 : 0, + m = + ('UTF16LE' === b && 1 !== d) || ('UTF16LE' !== b && 1 === d), + f = 0; + f < a.length; + f += 1 + ) { + g = a.charCodeAt(f); + !0 === m && ((n = g & 255), (g = (n << 8) | (g >>> 8))); + r = p + q; + for (u = r >>> 2; e.length <= u; ) e.push(0); + e[u] |= g << (8 * (t + (r % 4) * d)); + p += 2; + } + return { value: e, binLen: 8 * p + c }; + }; + break; + case 'B64': + a = function (b, a, e) { + var c = 0, + m, + p, + f, + n, + q, + u, + r, + t; + if (-1 === b.search(/^[a-zA-Z0-9=+\/]+$/)) + throw Error('Invalid character in base-64 string'); + p = b.indexOf('='); + b = b.replace(/\=/g, ''); + if (-1 !== p && p < b.length) + throw Error("Invalid '=' found in base-64 string"); + a = a || [0]; + e = e || 0; + u = e >>> 3; + t = -1 === d ? 3 : 0; + for (p = 0; p < b.length; p += 4) { + q = b.substr(p, 4); + for (f = n = 0; f < q.length; f += 1) + (m = + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.indexOf( + q.charAt(f) + )), + (n |= m << (18 - 6 * f)); + for (f = 0; f < q.length - 1; f += 1) { + r = c + u; + for (m = r >>> 2; a.length <= m; ) a.push(0); + a[m] |= ((n >>> (16 - 8 * f)) & 255) << (8 * (t + (r % 4) * d)); + c += 1; + } + } + return { value: a, binLen: 8 * c + e }; + }; + break; + case 'BYTES': + a = function (b, a, e) { + var c, m, p, f, n, q; + a = a || [0]; + e = e || 0; + p = e >>> 3; + q = -1 === d ? 3 : 0; + for (m = 0; m < b.length; m += 1) + (c = b.charCodeAt(m)), + (n = m + p), + (f = n >>> 2), + a.length <= f && a.push(0), + (a[f] |= c << (8 * (q + (n % 4) * d))); + return { value: a, binLen: 8 * b.length + e }; + }; + break; + case 'ARRAYBUFFER': + try { + a = new ArrayBuffer(0); + } catch (k) { + throw Error('ARRAYBUFFER not supported by this environment'); + } + a = function (b, a, e) { + return T(new Uint8Array(b), a, e, d); + }; + break; + case 'UINT8ARRAY': + try { + a = new Uint8Array(0); + } catch (k) { + throw Error('UINT8ARRAY not supported by this environment'); + } + a = function (b, a, e) { + return T(b, a, e, d); + }; + break; + default: + throw Error( + 'format must be HEX, TEXT, B64, BYTES, ARRAYBUFFER, or UINT8ARRAY' + ); + } + return a; + } + function y(a, b) { + return (a << b) | (a >>> (32 - b)); + } + function U(e, b) { + return 32 < b + ? ((b -= 32), + new a((e.b << b) | (e.a >>> (32 - b)), (e.a << b) | (e.b >>> (32 - b)))) + : 0 !== b + ? new a((e.a << b) | (e.b >>> (32 - b)), (e.b << b) | (e.a >>> (32 - b))) + : e; + } + function x(a, b) { + return (a >>> b) | (a << (32 - b)); + } + function t(e, b) { + var d = null, + d = new a(e.a, e.b); + return (d = + 32 >= b + ? new a( + (d.a >>> b) | ((d.b << (32 - b)) & 4294967295), + (d.b >>> b) | ((d.a << (32 - b)) & 4294967295) + ) + : new a( + (d.b >>> (b - 32)) | ((d.a << (64 - b)) & 4294967295), + (d.a >>> (b - 32)) | ((d.b << (64 - b)) & 4294967295) + )); + } + function V(e, b) { + var d = null; + return (d = + 32 >= b + ? new a(e.a >>> b, (e.b >>> b) | ((e.a << (32 - b)) & 4294967295)) + : new a(0, e.a >>> (b - 32))); + } + function ca(a, b, d) { + return (a & b) ^ (~a & d); + } + function da(e, b, d) { + return new a((e.a & b.a) ^ (~e.a & d.a), (e.b & b.b) ^ (~e.b & d.b)); + } + function W(a, b, d) { + return (a & b) ^ (a & d) ^ (b & d); + } + function ea(e, b, d) { + return new a( + (e.a & b.a) ^ (e.a & d.a) ^ (b.a & d.a), + (e.b & b.b) ^ (e.b & d.b) ^ (b.b & d.b) + ); + } + function fa(a) { + return x(a, 2) ^ x(a, 13) ^ x(a, 22); + } + function ga(e) { + var b = t(e, 28), + d = t(e, 34); + e = t(e, 39); + return new a(b.a ^ d.a ^ e.a, b.b ^ d.b ^ e.b); + } + function ha(a) { + return x(a, 6) ^ x(a, 11) ^ x(a, 25); + } + function ia(e) { + var b = t(e, 14), + d = t(e, 18); + e = t(e, 41); + return new a(b.a ^ d.a ^ e.a, b.b ^ d.b ^ e.b); + } + function ja(a) { + return x(a, 7) ^ x(a, 18) ^ (a >>> 3); + } + function ka(e) { + var b = t(e, 1), + d = t(e, 8); + e = V(e, 7); + return new a(b.a ^ d.a ^ e.a, b.b ^ d.b ^ e.b); + } + function la(a) { + return x(a, 17) ^ x(a, 19) ^ (a >>> 10); + } + function ma(e) { + var b = t(e, 19), + d = t(e, 61); + e = V(e, 6); + return new a(b.a ^ d.a ^ e.a, b.b ^ d.b ^ e.b); + } + function G(a, b) { + var d = (a & 65535) + (b & 65535); + return ( + ((((a >>> 16) + (b >>> 16) + (d >>> 16)) & 65535) << 16) | (d & 65535) + ); + } + function na(a, b, d, k) { + var h = (a & 65535) + (b & 65535) + (d & 65535) + (k & 65535); + return ( + ((((a >>> 16) + (b >>> 16) + (d >>> 16) + (k >>> 16) + (h >>> 16)) & + 65535) << + 16) | + (h & 65535) + ); + } + function H(a, b, d, k, h) { + var c = (a & 65535) + (b & 65535) + (d & 65535) + (k & 65535) + (h & 65535); + return ( + ((((a >>> 16) + + (b >>> 16) + + (d >>> 16) + + (k >>> 16) + + (h >>> 16) + + (c >>> 16)) & + 65535) << + 16) | + (c & 65535) + ); + } + function oa(e, b) { + var d, k, c; + d = (e.b & 65535) + (b.b & 65535); + k = (e.b >>> 16) + (b.b >>> 16) + (d >>> 16); + c = ((k & 65535) << 16) | (d & 65535); + d = (e.a & 65535) + (b.a & 65535) + (k >>> 16); + k = (e.a >>> 16) + (b.a >>> 16) + (d >>> 16); + return new a(((k & 65535) << 16) | (d & 65535), c); + } + function pa(e, b, d, k) { + var c, l, g; + c = (e.b & 65535) + (b.b & 65535) + (d.b & 65535) + (k.b & 65535); + l = (e.b >>> 16) + (b.b >>> 16) + (d.b >>> 16) + (k.b >>> 16) + (c >>> 16); + g = ((l & 65535) << 16) | (c & 65535); + c = + (e.a & 65535) + + (b.a & 65535) + + (d.a & 65535) + + (k.a & 65535) + + (l >>> 16); + l = (e.a >>> 16) + (b.a >>> 16) + (d.a >>> 16) + (k.a >>> 16) + (c >>> 16); + return new a(((l & 65535) << 16) | (c & 65535), g); + } + function qa(e, b, d, k, c) { + var l, g, m; + l = + (e.b & 65535) + + (b.b & 65535) + + (d.b & 65535) + + (k.b & 65535) + + (c.b & 65535); + g = + (e.b >>> 16) + + (b.b >>> 16) + + (d.b >>> 16) + + (k.b >>> 16) + + (c.b >>> 16) + + (l >>> 16); + m = ((g & 65535) << 16) | (l & 65535); + l = + (e.a & 65535) + + (b.a & 65535) + + (d.a & 65535) + + (k.a & 65535) + + (c.a & 65535) + + (g >>> 16); + g = + (e.a >>> 16) + + (b.a >>> 16) + + (d.a >>> 16) + + (k.a >>> 16) + + (c.a >>> 16) + + (l >>> 16); + return new a(((g & 65535) << 16) | (l & 65535), m); + } + function B(e, b) { + return new a(e.a ^ b.a, e.b ^ b.b); + } + function A(e) { + var b = [], + d; + if ('SHA-1' === e) + b = [1732584193, 4023233417, 2562383102, 271733878, 3285377520]; + else if (0 === e.lastIndexOf('SHA-', 0)) + switch ( + ((b = [ + 3238371032, 914150663, 812702999, 4144912697, 4290775857, 1750603025, + 1694076839, 3204075428, + ]), + (d = [ + 1779033703, 3144134277, 1013904242, 2773480762, 1359893119, + 2600822924, 528734635, 1541459225, + ]), + e) + ) { + case 'SHA-224': + break; + case 'SHA-256': + b = d; + break; + case 'SHA-384': + b = [ + new a(3418070365, b[0]), + new a(1654270250, b[1]), + new a(2438529370, b[2]), + new a(355462360, b[3]), + new a(1731405415, b[4]), + new a(41048885895, b[5]), + new a(3675008525, b[6]), + new a(1203062813, b[7]), + ]; + break; + case 'SHA-512': + b = [ + new a(d[0], 4089235720), + new a(d[1], 2227873595), + new a(d[2], 4271175723), + new a(d[3], 1595750129), + new a(d[4], 2917565137), + new a(d[5], 725511199), + new a(d[6], 4215389547), + new a(d[7], 327033209), + ]; + break; + default: + throw Error('Unknown SHA variant'); + } + else if (0 === e.lastIndexOf('SHA3-', 0) || 0 === e.lastIndexOf('SHAKE', 0)) + for (e = 0; 5 > e; e += 1) + b[e] = [ + new a(0, 0), + new a(0, 0), + new a(0, 0), + new a(0, 0), + new a(0, 0), + ]; + else throw Error('No SHA variants supported'); + return b; + } + function K(a, b) { + var d = [], + k, + c, + l, + g, + m, + p, + f; + k = b[0]; + c = b[1]; + l = b[2]; + g = b[3]; + m = b[4]; + for (f = 0; 80 > f; f += 1) + (d[f] = + 16 > f ? a[f] : y(d[f - 3] ^ d[f - 8] ^ d[f - 14] ^ d[f - 16], 1)), + (p = + 20 > f + ? H(y(k, 5), (c & l) ^ (~c & g), m, 1518500249, d[f]) + : 40 > f + ? H(y(k, 5), c ^ l ^ g, m, 1859775393, d[f]) + : 60 > f + ? H(y(k, 5), W(c, l, g), m, 2400959708, d[f]) + : H(y(k, 5), c ^ l ^ g, m, 3395469782, d[f])), + (m = g), + (g = l), + (l = y(c, 30)), + (c = k), + (k = p); + b[0] = G(k, b[0]); + b[1] = G(c, b[1]); + b[2] = G(l, b[2]); + b[3] = G(g, b[3]); + b[4] = G(m, b[4]); + return b; + } + function ba(a, b, d, c) { + var h; + for (h = (((b + 65) >>> 9) << 4) + 15; a.length <= h; ) a.push(0); + a[b >>> 5] |= 128 << (24 - (b % 32)); + b += d; + a[h] = b & 4294967295; + a[h - 1] = (b / 4294967296) | 0; + b = a.length; + for (h = 0; h < b; h += 16) c = K(a.slice(h, h + 16), c); + return c; + } + function L(e, b, d) { + var k, + h, + l, + g, + m, + p, + f, + n, + q, + u, + r, + t, + v, + x, + y, + A, + z, + w, + F, + B, + C, + D, + E = [], + J; + if ('SHA-224' === d || 'SHA-256' === d) + (u = 64), + (t = 1), + (D = Number), + (v = G), + (x = na), + (y = H), + (A = ja), + (z = la), + (w = fa), + (F = ha), + (C = W), + (B = ca), + (J = c); + else if ('SHA-384' === d || 'SHA-512' === d) + (u = 80), + (t = 2), + (D = a), + (v = oa), + (x = pa), + (y = qa), + (A = ka), + (z = ma), + (w = ga), + (F = ia), + (C = ea), + (B = da), + (J = X); + else throw Error('Unexpected error in SHA-2 implementation'); + d = b[0]; + k = b[1]; + h = b[2]; + l = b[3]; + g = b[4]; + m = b[5]; + p = b[6]; + f = b[7]; + for (r = 0; r < u; r += 1) + 16 > r + ? ((q = r * t), + (n = e.length <= q ? 0 : e[q]), + (q = e.length <= q + 1 ? 0 : e[q + 1]), + (E[r] = new D(n, q))) + : (E[r] = x(z(E[r - 2]), E[r - 7], A(E[r - 15]), E[r - 16])), + (n = y(f, F(g), B(g, m, p), J[r], E[r])), + (q = v(w(d), C(d, k, h))), + (f = p), + (p = m), + (m = g), + (g = v(l, n)), + (l = h), + (h = k), + (k = d), + (d = v(n, q)); + b[0] = v(d, b[0]); + b[1] = v(k, b[1]); + b[2] = v(h, b[2]); + b[3] = v(l, b[3]); + b[4] = v(g, b[4]); + b[5] = v(m, b[5]); + b[6] = v(p, b[6]); + b[7] = v(f, b[7]); + return b; + } + function D(e, b) { + var d, + c, + h, + l, + g = [], + m = []; + if (null !== e) + for (c = 0; c < e.length; c += 2) + b[(c >>> 1) % 5][((c >>> 1) / 5) | 0] = B( + b[(c >>> 1) % 5][((c >>> 1) / 5) | 0], + new a(e[c + 1], e[c]) + ); + for (d = 0; 24 > d; d += 1) { + l = A('SHA3-'); + for (c = 0; 5 > c; c += 1) { + h = b[c][0]; + var p = b[c][1], + f = b[c][2], + n = b[c][3], + q = b[c][4]; + g[c] = new a(h.a ^ p.a ^ f.a ^ n.a ^ q.a, h.b ^ p.b ^ f.b ^ n.b ^ q.b); + } + for (c = 0; 5 > c; c += 1) m[c] = B(g[(c + 4) % 5], U(g[(c + 1) % 5], 1)); + for (c = 0; 5 > c; c += 1) + for (h = 0; 5 > h; h += 1) b[c][h] = B(b[c][h], m[c]); + for (c = 0; 5 > c; c += 1) + for (h = 0; 5 > h; h += 1) + l[h][(2 * c + 3 * h) % 5] = U(b[c][h], Y[c][h]); + for (c = 0; 5 > c; c += 1) + for (h = 0; 5 > h; h += 1) + b[c][h] = B( + l[c][h], + new a( + ~l[(c + 1) % 5][h].a & l[(c + 2) % 5][h].a, + ~l[(c + 1) % 5][h].b & l[(c + 2) % 5][h].b + ) + ); + b[0][0] = B(b[0][0], Z[d]); + } + return b; + } + var c, X, Y, Z; + c = [ + 1116352408, 1899447441, 3049323471, 3921009573, 961987163, 1508970993, + 2453635748, 2870763221, 3624381080, 310598401, 607225278, 1426881987, + 1925078388, 2162078206, 2614888103, 3248222580, 3835390401, 4022224774, + 264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986, + 2554220882, 2821834349, 2952996808, 3210313671, 3336571891, 3584528711, + 113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291, + 1695183700, 1986661051, 2177026350, 2456956037, 2730485921, 2820302411, + 3259730800, 3345764771, 3516065817, 3600352804, 4094571909, 275423344, + 430227734, 506948616, 659060556, 883997877, 958139571, 1322822218, + 1537002063, 1747873779, 1955562222, 2024104815, 2227730452, 2361852424, + 2428436474, 2756734187, 3204031479, 3329325298, + ]; + X = [ + new a(c[0], 3609767458), + new a(c[1], 602891725), + new a(c[2], 3964484399), + new a(c[3], 2173295548), + new a(c[4], 4081628472), + new a(c[5], 3053834265), + new a(c[6], 2937671579), + new a(c[7], 3664609560), + new a(c[8], 2734883394), + new a(c[9], 1164996542), + new a(c[10], 1323610764), + new a(c[11], 3590304994), + new a(c[12], 4068182383), + new a(c[13], 991336113), + new a(c[14], 633803317), + new a(c[15], 3479774868), + new a(c[16], 2666613458), + new a(c[17], 944711139), + new a(c[18], 2341262773), + new a(c[19], 2007800933), + new a(c[20], 1495990901), + new a(c[21], 1856431235), + new a(c[22], 3175218132), + new a(c[23], 2198950837), + new a(c[24], 3999719339), + new a(c[25], 766784016), + new a(c[26], 2566594879), + new a(c[27], 3203337956), + new a(c[28], 1034457026), + new a(c[29], 2466948901), + new a(c[30], 3758326383), + new a(c[31], 168717936), + new a(c[32], 1188179964), + new a(c[33], 1546045734), + new a(c[34], 1522805485), + new a(c[35], 2643833823), + new a(c[36], 2343527390), + new a(c[37], 1014477480), + new a(c[38], 1206759142), + new a(c[39], 344077627), + new a(c[40], 1290863460), + new a(c[41], 3158454273), + new a(c[42], 3505952657), + new a(c[43], 106217008), + new a(c[44], 3606008344), + new a(c[45], 1432725776), + new a(c[46], 1467031594), + new a(c[47], 851169720), + new a(c[48], 3100823752), + new a(c[49], 1363258195), + new a(c[50], 3750685593), + new a(c[51], 3785050280), + new a(c[52], 3318307427), + new a(c[53], 3812723403), + new a(c[54], 2003034995), + new a(c[55], 3602036899), + new a(c[56], 1575990012), + new a(c[57], 1125592928), + new a(c[58], 2716904306), + new a(c[59], 442776044), + new a(c[60], 593698344), + new a(c[61], 3733110249), + new a(c[62], 2999351573), + new a(c[63], 3815920427), + new a(3391569614, 3928383900), + new a(3515267271, 566280711), + new a(3940187606, 3454069534), + new a(4118630271, 4000239992), + new a(116418474, 1914138554), + new a(174292421, 2731055270), + new a(289380356, 3203993006), + new a(460393269, 320620315), + new a(685471733, 587496836), + new a(852142971, 1086792851), + new a(1017036298, 365543100), + new a(1126000580, 2618297676), + new a(1288033470, 3409855158), + new a(1501505948, 4234509866), + new a(1607167915, 987167468), + new a(1816402316, 1246189591), + ]; + Z = [ + new a(0, 1), + new a(0, 32898), + new a(2147483648, 32906), + new a(2147483648, 2147516416), + new a(0, 32907), + new a(0, 2147483649), + new a(2147483648, 2147516545), + new a(2147483648, 32777), + new a(0, 138), + new a(0, 136), + new a(0, 2147516425), + new a(0, 2147483658), + new a(0, 2147516555), + new a(2147483648, 139), + new a(2147483648, 32905), + new a(2147483648, 32771), + new a(2147483648, 32770), + new a(2147483648, 128), + new a(0, 32778), + new a(2147483648, 2147483658), + new a(2147483648, 2147516545), + new a(2147483648, 32896), + new a(0, 2147483649), + new a(2147483648, 2147516424), + ]; + Y = [ + [0, 36, 3, 41, 18], + [1, 44, 10, 45, 2], + [62, 6, 43, 15, 61], + [28, 55, 25, 21, 56], + [27, 20, 39, 8, 14], + ]; + 'function' === typeof define && define.amd + ? define(function () { + return C; + }) + : 'undefined' !== typeof exports + ? ('undefined' !== typeof module && module.exports && (module.exports = C), + (exports = C)) + : (aa.jsSHA = C); +})(this); diff --git a/src/lib/wapi/listeners/add-all-new-messages.js b/src/lib/wapi/listeners/add-all-new-messages.js new file mode 100644 index 000000000..6d69119c7 --- /dev/null +++ b/src/lib/wapi/listeners/add-all-new-messages.js @@ -0,0 +1,37 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export function allNewMessagesListener() { + window.WAPI.allNewMessagesListener = (callback) => + WPP.whatsapp.MsgStore.on('add', (newMessage) => { + if (newMessage && newMessage.isNewMsg) { + setTimeout( + () => { + let message = window.WAPI.processMessageObj( + newMessage, + true, + false + ); + if (message) { + callback(message); + } + }, + newMessage.body ? 0 : 2000 + ); + } + }); +} diff --git a/src/lib/wapi/listeners/add-new-messages.js b/src/lib/wapi/listeners/add-new-messages.js new file mode 100644 index 000000000..366436725 --- /dev/null +++ b/src/lib/wapi/listeners/add-new-messages.js @@ -0,0 +1,34 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export function addNewMessagesListener() { + window.WAPI.waitNewMessages = waitNewMessages; +} + +/** + * Registers a callback to be called when a new message arrives the WAPI. + * @param rmCallbackAfterUse - Boolean - Specify if the callback need to be executed only once + * @param done - function - Callback function to be called when a new message arrives. + * @returns {boolean} + */ +function waitNewMessages(rmCallbackAfterUse = true, done) { + window.WAPI._newMessagesCallbacks.push({ + callback: done, + rmAfterUse: rmCallbackAfterUse, + }); + return true; +} diff --git a/src/lib/wapi/listeners/add-on-added-to-group.js b/src/lib/wapi/listeners/add-on-added-to-group.js new file mode 100644 index 000000000..aa95e7b6e --- /dev/null +++ b/src/lib/wapi/listeners/add-on-added-to-group.js @@ -0,0 +1,49 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export function addOnAddedToGroup() { + /** + * Registers a callback that fires when your host phone is added to a group. + * @param callback - function - Callback function to be called when a message acknowledgement changes. The callback returns 3 variables + * @returns {boolean} + */ + window.WAPI.onAddedToGroup = function (callback) { + WPP.whatsapp.MsgStore.on('add', (message) => { + /** + * Mensagem precisa ser: + * - Nova + * - É uma notificação + * - Do tipo de eventos de grupo + * - Evento de adicionado no grupo + */ + if ( + message.isNewMsg && + message.isNotification && + message.type === 'gp2' && + message.subtype === 'add' + ) { + try { + const data = WAPI._serializeChatObj(message.chat); + callback(data); + } catch (error) { + console.error(error); + } + } + }); + return true; + }; +} diff --git a/src/lib/wapi/listeners/add-on-live-location.js b/src/lib/wapi/listeners/add-on-live-location.js new file mode 100644 index 000000000..098b0e76e --- /dev/null +++ b/src/lib/wapi/listeners/add-on-live-location.js @@ -0,0 +1,75 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export function addOnLiveLocation() { + const callbacks = []; + + /** + * Trigger the event + */ + function fireCallback(data) { + const location = Object.assign({}, data); + if (location.jid) { + location.id = location.jid.toString(); + } + + for (const callback of callbacks) { + try { + callback(location); + } catch (error) {} + } + } + + WPP.on('chat.live_location_start', (e) => { + fireCallback({ + type: 'enable', + id: e.id.toString(), + lat: e.lat, + lng: e.lng, + accuracy: e.accuracy, + speed: e.speed, + degrees: e.degrees, + shareDuration: e.shareDuration, + }); + }); + + WPP.on('chat.live_location_update', (e) => { + fireCallback({ + type: 'update', + id: e.id.toString(), + lat: e.lat, + lng: e.lng, + accuracy: e.accuracy, + speed: e.speed, + degrees: e.degrees, + elapsed: e.elapsed, + lastUpdated: e.lastUpdated, + }); + }); + + WPP.on('chat.live_location_end', (e) => { + fireCallback({ + type: 'disablle', + id: e.id.toString(), + chat: e.chat.toString(), + }); + }); + + window.WAPI.onLiveLocation = async function (callback) { + callbacks.push(callback); + }; +} diff --git a/src/lib/wapi/listeners/add-on-new-ack.js b/src/lib/wapi/listeners/add-on-new-ack.js new file mode 100644 index 000000000..37d6e23f8 --- /dev/null +++ b/src/lib/wapi/listeners/add-on-new-ack.js @@ -0,0 +1,23 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export function addOnNewAcks() { + window.WAPI.waitNewAcknowledgements = function (callback) { + WPP.whatsapp.MsgStore.on('change:ack', callback); + return true; + }; +} diff --git a/src/lib/wapi/listeners/add-on-notification-message.js b/src/lib/wapi/listeners/add-on-notification-message.js new file mode 100644 index 000000000..256e1f766 --- /dev/null +++ b/src/lib/wapi/listeners/add-on-notification-message.js @@ -0,0 +1,30 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export function addOnNotificationMessage() { + window.WAPI.onNotificationMessage = function (callback) { + WPP.whatsapp.MsgStore.on('add', (message) => { + if (!message.isNotification || !message.isNewMsg) { + return; + } + const data = WAPI._serializeMessageObj(message); + callback(data); + }); + + return true; + }; +} diff --git a/src/lib/wapi/listeners/add-on-participants-change.js b/src/lib/wapi/listeners/add-on-participants-change.js new file mode 100644 index 000000000..7ded6b9cc --- /dev/null +++ b/src/lib/wapi/listeners/add-on-participants-change.js @@ -0,0 +1,98 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +let groupParticpiantsEvents = {}; + +/** + * Registers on participants change listener + */ +export function addOnParticipantsChange() { + /** + * Registers a callback to participant changes on a certain, specific group + * @param groupId - string - The id of the group that you want to attach the callback to. + * @param callback - function - Callback function to be called when a message acknowledgement changes. The callback returns 3 variables + * @returns {boolean} + */ + window.WAPI.onParticipantsChanged = async function (groupId, callback) { + const subtypeEvents = [ + 'invite', + 'add', + 'remove', + 'leave', + 'promote', + 'demote', + ]; + const chat = WPP.whatsapp.ChatStore.get(groupId); + //attach all group Participants to the events object as 'add' + const metadata = WPP.whatsapp.GroupMetadataStore.get(groupId); + if (!groupParticpiantsEvents[groupId]) { + groupParticpiantsEvents[groupId] = {}; + metadata.participants.forEach((participant) => { + groupParticpiantsEvents[groupId][participant.id.toString()] = { + subtype: 'add', + from: metadata.owner, + }; + }); + } + let i = 0; + chat.on('change:groupMetadata.participants', (_) => + chat.on('all', (x, y) => { + const { isGroup, previewMessage } = y; + if ( + isGroup && + x === 'change' && + previewMessage && + previewMessage.type === 'gp2' && + subtypeEvents.includes(previewMessage.subtype) + ) { + const { subtype, from, recipients } = previewMessage; + const rec = recipients[0].toString(); + if ( + groupParticpiantsEvents[groupId][rec] && + groupParticpiantsEvents[groupId][recipients[0]].subtype == subtype + ) { + //ignore, this is a duplicate entry + // console.log('duplicate event') + } else { + //ignore the first message + if (i == 0) { + //ignore it, plus 1, + i++; + } else { + groupParticpiantsEvents[groupId][rec] = { + subtype, + from, + }; + //fire the callback + // // previewMessage.from.toString() + // x removed y + // x added y + callback({ + by: from.toString(), + action: subtype, + who: recipients, + }); + chat.off('all', this); + i = 0; + } + } + } + }) + ); + return true; + }; +} diff --git a/src/lib/wapi/listeners/add-on-presence-changed.js b/src/lib/wapi/listeners/add-on-presence-changed.js new file mode 100644 index 000000000..320d454d6 --- /dev/null +++ b/src/lib/wapi/listeners/add-on-presence-changed.js @@ -0,0 +1,74 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export function addOnPresenceChanged() { + window.WAPI.onPresenceChanged = function (callback) { + setTimeout(() => { + WPP.whatsapp.ChatStore.map((c) => c.presence.subscribe()); + }, 1000); + + WPP.whatsapp.PresenceStore.on('change:chatstate.type', (chatstate) => { + try { + // Search precense model from chatstate + const presence = WPP.whatsapp.PresenceStore.getModelsArray().find( + (m) => m.chatstate === chatstate + ); + + // Ignore not initialized presences + if (!presence || !presence.hasData || !presence.chatstate.type) { + return; + } + + const contact = WPP.whatsapp.ContactStore.get(presence.id); + + const data = { + id: presence.id, + isOnline: presence.isOnline, + isGroup: presence.isGroup, + isUser: presence.isUser, + shortName: contact ? contact.formattedShortName : '', + state: presence.chatstate.type, + t: Date.now(), + }; + + if (presence.isUser) { + data.isContact = !presence.chatstate.deny; + } + + if (presence.isGroup) { + data.participants = presence.chatstates + .getModelsArray() + .filter((c) => !!c.type) + .map((c) => { + const contact = WPP.whatsapp.ContactStore.get(c.id); + + return { + id: c.id.toString(), + state: c.type, + shortName: contact ? contact.formattedShortName : '', + }; + }); + } + + callback(data); + } catch (error) { + console.log(error); + } + }); + return true; + }; +} diff --git a/src/lib/wapi/listeners/add-on-state-change.js b/src/lib/wapi/listeners/add-on-state-change.js new file mode 100644 index 000000000..b28be437b --- /dev/null +++ b/src/lib/wapi/listeners/add-on-state-change.js @@ -0,0 +1,47 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export function addOnStateChange() { + let initialized = false; + let getData = () => { + return WPP.whatsapp.Socket.state; + }; + + window.WAPI.onStateChange = function (callback) { + WPP.whatsapp.Socket.on('change:state', () => callback(getData())); + if (!initialized) { + initialized = true; + callback(getData()); + } + return true; + }; +} + +export function addOnStreamChange() { + let initialized = false; + let getData = () => { + return WPP.whatsapp.Socket.stream; + }; + window.WAPI.onStreamChange = function (callback) { + WPP.whatsapp.Socket.on('change:stream', () => callback(getData())); + if (!initialized) { + initialized = true; + callback(getData()); + } + return true; + }; +} diff --git a/src/lib/wapi/listeners/index.js b/src/lib/wapi/listeners/index.js new file mode 100644 index 000000000..2eaaeb699 --- /dev/null +++ b/src/lib/wapi/listeners/index.js @@ -0,0 +1,27 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export { initNewMessagesListener } from './init-listeners'; +export { addNewMessagesListener } from './add-new-messages'; +export { allNewMessagesListener } from './add-all-new-messages'; +export { addOnStateChange, addOnStreamChange } from './add-on-state-change'; +export { addOnNewAcks } from './add-on-new-ack'; +export { addOnLiveLocation } from './add-on-live-location'; +export { addOnParticipantsChange } from './add-on-participants-change'; +export { addOnPresenceChanged } from './add-on-presence-changed'; +export { addOnAddedToGroup } from './add-on-added-to-group'; +export { addOnNotificationMessage } from './add-on-notification-message'; diff --git a/src/lib/wapi/listeners/init-listeners.js b/src/lib/wapi/listeners/init-listeners.js new file mode 100644 index 000000000..bc6106a6c --- /dev/null +++ b/src/lib/wapi/listeners/init-listeners.js @@ -0,0 +1,102 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export function initNewMessagesListener() { + window.WAPI._newMessagesListener = WPP.whatsapp.MsgStore.on( + 'add', + (newMessage) => { + if ( + newMessage && + newMessage.isNewMsg && + !newMessage.isSentByMe && + !newMessage.isStatusV3 + ) { + setTimeout( + () => { + let message = window.WAPI.processMessageObj( + newMessage, + false, + false + ); + if (message) { + window.WAPI._newMessagesQueue.push(message); + window.WAPI._newMessagesBuffer.push(message); + } + + // Starts debouncer time to don't call a callback for each message if more than one message arrives + // in the same second + if ( + !window.WAPI._newMessagesDebouncer && + window.WAPI._newMessagesQueue.length > 0 + ) { + window.WAPI._newMessagesDebouncer = setTimeout(() => { + let queuedMessages = window.WAPI._newMessagesQueue; + + window.WAPI._newMessagesDebouncer = null; + window.WAPI._newMessagesQueue = []; + + let removeCallbacks = []; + + window.WAPI._newMessagesCallbacks.forEach(function ( + callbackObj + ) { + if (callbackObj.callback !== undefined) { + callbackObj.callback(queuedMessages); + } + if (callbackObj.rmAfterUse === true) { + removeCallbacks.push(callbackObj); + } + }); + + // Remove removable callbacks. + removeCallbacks.forEach(function (rmCallbackObj) { + let callbackIndex = + window.WAPI._newMessagesCallbacks.indexOf(rmCallbackObj); + window.WAPI._newMessagesCallbacks.splice(callbackIndex, 1); + }); + }, 1000); + } + }, + newMessage.body ? 0 : 2000 + ); + } + } + ); + + window.WAPI._unloadInform = (event) => { + // Save in the buffer the ungot unreaded messages + window.WAPI._newMessagesBuffer.forEach((message) => { + Object.keys(message).forEach((key) => + message[key] === undefined ? delete message[key] : '' + ); + }); + sessionStorage.setItem( + 'saved_msgs', + JSON.stringify(window.WAPI._newMessagesBuffer) + ); + + // Inform callbacks that the page will be reloaded. + window.WAPI._newMessagesCallbacks.forEach(function (callbackObj) { + if (callbackObj.callback !== undefined) { + callbackObj.callback({ + status: -1, + message: 'page will be reloaded, wait and register callback again.', + }); + } + }); + }; +} diff --git a/src/lib/wapi/serializers/index.js b/src/lib/wapi/serializers/index.js new file mode 100644 index 000000000..9c2b4c2fe --- /dev/null +++ b/src/lib/wapi/serializers/index.js @@ -0,0 +1,24 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export { _serializeChatObj } from './serialize-chat'; +export { _serializeRawObj } from './serialize-raw'; +export { _serializeMessageObj } from './serialize-message'; +export { _serializeContactObj } from './serialize-contact'; +export { _serializeNumberStatusObj } from './serialize-number-status'; +export { _serializeProfilePicThumb } from './serialize-profile-pic-thumb'; +export { _profilePicfunc } from './serialize-profilePic'; diff --git a/src/lib/wapi/serializers/serialize-chat.js b/src/lib/wapi/serializers/serialize-chat.js new file mode 100644 index 000000000..33fbed8ef --- /dev/null +++ b/src/lib/wapi/serializers/serialize-chat.js @@ -0,0 +1,46 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +import { _serializeRawObj } from './serialize-raw'; + +/** + * Serializes a chat object + * + * @param rawChat Chat object + * @returns {Chat} + */ +export const _serializeChatObj = (obj) => { + if (obj == undefined) { + return null; + } + return Object.assign(window.WAPI._serializeRawObj(obj), { + kind: obj.kind, + isBroadcast: obj.isBroadcast, + isGroup: obj.isGroup, + isUser: obj.isUser, + contact: obj['contact'] + ? window.WAPI._serializeContactObj(obj['contact']) + : null, + groupMetadata: obj['groupMetadata'] + ? window.WAPI._serializeRawObj(obj['groupMetadata']) + : null, + presence: obj['presence'] + ? window.WAPI._serializeRawObj(obj['presence']) + : null, + msgs: null, + }); +}; diff --git a/src/lib/wapi/serializers/serialize-contact.js b/src/lib/wapi/serializers/serialize-contact.js new file mode 100644 index 000000000..86383fff9 --- /dev/null +++ b/src/lib/wapi/serializers/serialize-contact.js @@ -0,0 +1,43 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export const _serializeContactObj = (obj) => { + if (obj == undefined) { + return null; + } + + let profile = null; + + if (!obj.profilePicThumb && obj.id && WPP.whatsapp.ProfilePicThumbStore) { + let thumb = WPP.whatsapp.ProfilePicThumbStore.get(obj.id); + profile = thumb ? WAPI._serializeProfilePicThumb(thumb) : {}; + } + + return Object.assign(window.WAPI._serializeRawObj(obj), { + formattedName: obj.formattedName, + isHighLevelVerified: obj.isHighLevelVerified, + isMe: obj.isMe, + isMyContact: obj.isMyContact, + isPSA: obj.isPSA, + isUser: obj.isUser, + isVerified: obj.isVerified, + isWAContact: obj.isWAContact, + profilePicThumbObj: profile, + statusMute: obj.statusMute, + msgs: null, + }); +}; diff --git a/src/lib/wapi/serializers/serialize-message.js b/src/lib/wapi/serializers/serialize-message.js new file mode 100644 index 000000000..888e68d84 --- /dev/null +++ b/src/lib/wapi/serializers/serialize-message.js @@ -0,0 +1,46 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export const _serializeMessageObj = (obj) => { + if (obj == undefined) { + return null; + } + if (obj.quotedMsg && obj.quotedMsgObj) obj.quotedMsgObj(); + return Object.assign(window.WAPI._serializeRawObj(obj), { + id: obj.id._serialized, + from: obj.from._serialized, + quotedParticipant: obj?.quotedParticipant?._serialized, + author: obj?.author?._serialized, + chatId: obj?.id?.remote || obj?.chatId?._serialized, + to: obj?.to?._serialized, + fromMe: obj?.id?.fromMe, + sender: obj['senderObj'] + ? WAPI._serializeContactObj(obj['senderObj']) + : null, + timestamp: obj['t'], + content: obj['body'], + isGroupMsg: obj.isGroupMsg, + isLink: obj.isLink, + isMMS: obj.isMMS, + isMedia: obj.isMedia, + isNotification: obj.isNotification, + isPSA: obj.isPSA, + type: obj.type, + quotedMsgId: obj?._quotedMsgObj?.id?._serialized, + mediaData: window.WAPI._serializeRawObj(obj['mediaData']), + }); +}; diff --git a/src/lib/wapi/serializers/serialize-number-status.js b/src/lib/wapi/serializers/serialize-number-status.js new file mode 100644 index 000000000..6600810ae --- /dev/null +++ b/src/lib/wapi/serializers/serialize-number-status.js @@ -0,0 +1,32 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export const _serializeNumberStatusObj = (obj) => { + if (obj == undefined) { + return null; + } + + return Object.assign( + {}, + { + id: obj.jid, + status: obj.status, + isBusiness: obj.biz === true, + canReceiveMessage: obj.status === 200, + } + ); +}; diff --git a/src/lib/wapi/serializers/serialize-profile-pic-thumb.js b/src/lib/wapi/serializers/serialize-profile-pic-thumb.js new file mode 100644 index 000000000..171b83052 --- /dev/null +++ b/src/lib/wapi/serializers/serialize-profile-pic-thumb.js @@ -0,0 +1,34 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export const _serializeProfilePicThumb = (obj) => { + if (obj == undefined) { + return null; + } + + return Object.assign( + {}, + { + eurl: obj.eurl, + id: obj.id, + img: obj.img, + imgFull: obj.imgFull, + raw: obj.raw, + tag: obj.tag, + } + ); +}; diff --git a/src/lib/wapi/serializers/serialize-profilePic.js b/src/lib/wapi/serializers/serialize-profilePic.js new file mode 100644 index 000000000..aab59cd19 --- /dev/null +++ b/src/lib/wapi/serializers/serialize-profilePic.js @@ -0,0 +1,31 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export const _profilePicfunc = async (id) => { + const wid = WPP.whatsapp.WidFactory.createWid(id); + let pic = WPP.whatsapp.ProfilePicThumbStore.get(wid); + + if (!pic) { + pic = await WPP.whatsapp.ProfilePicThumbStore.find(wid); + } + + if (pic) { + return WAPI._serializeProfilePicThumb(pic); + } + + return null; +}; diff --git a/src/lib/wapi/serializers/serialize-raw.js b/src/lib/wapi/serializers/serialize-raw.js new file mode 100644 index 000000000..15cbc100e --- /dev/null +++ b/src/lib/wapi/serializers/serialize-raw.js @@ -0,0 +1,23 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export const _serializeRawObj = (obj) => { + if (obj && obj.toJSON) { + return obj.toJSON(); + } + return {}; +}; diff --git a/src/lib/wapi/store/store-objects.js b/src/lib/wapi/store/store-objects.js new file mode 100644 index 000000000..9f33df3f6 --- /dev/null +++ b/src/lib/wapi/store/store-objects.js @@ -0,0 +1,99 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export const storeObjects = [ + { + id: 'Store', + conditions: (module) => + module.default && module.default.Chat && module.default.Msg + ? module.default + : null, + }, + { + id: 'MediaCollection', + conditions: (module) => + module.default && + module.default.prototype && + module.default.prototype.processAttachments !== undefined + ? module.default + : null, + }, + { + id: 'GroupInvite', + conditions: (module) => (module.sendQueryGroupInviteCode ? module : null), + }, + { + id: 'Archive', + conditions: (module) => (module.setArchive ? module : null), + }, + { + id: 'pinChat', + conditions: (module) => + module.setPin.toString().includes('.unproxy') ? module : null, + }, + { + id: 'Perfil', + conditions: (module) => module.setPushname && !module.getComposeContents, + }, + { + id: 'ChatStates', + conditions: (module) => + module.sendChatStatePaused && + module.sendChatStateRecording && + module.sendChatStateComposing + ? module + : null, + }, + { + id: 'MediaObject', + conditions: (module) => + module.getOrCreateMediaObject && module.disassociateMediaFromStickerPack + ? module + : null, + }, + { + id: 'UploadUtils', + conditions: (module) => + module.default && module.default.encryptAndUpload ? module.default : null, + }, + { + id: 'Theme', + conditions: (module) => + module.getTheme && module.setTheme ? module : null, + }, + { + id: 'SendMute', + conditions: (module) => (module.sendConversationMute ? module : null), + }, + { + id: 'Validators', + conditions: (module) => (module.findLinks ? module : null), + }, + { + id: 'changeEphemeralDuration', + conditions: (module) => module.changeEphemeralDuration, + }, + { + id: 'sendCreateGroup', + conditions: (module) => module.sendCreateGroup, + }, + { + id: 'sendQueryGroupInvite', + conditions: (module) => + module.sendQueryGroupInvite ? module.sendQueryGroupInvite : null, + }, +]; diff --git a/src/lib/wapi/wapi.js b/src/lib/wapi/wapi.js new file mode 100644 index 000000000..554fc68b5 --- /dev/null +++ b/src/lib/wapi/wapi.js @@ -0,0 +1,542 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +import { + _getGroupParticipants, + areAllMessagesLoaded, + asyncLoadAllEarlierMessages, + downloadFile, + encryptAndUploadFile, + forwardMessages, + getAllChatIds, + getAllChats, + getAllChatsWithMessages, + getAllChatsWithNewMessages, + getAllContacts, + getAllGroupMetadata, + getAllGroups, + getAllMessagesInChat, + getAllNewMessages, + getAllUnreadMessages, + getBatteryLevel, + getChat, + getChatById, + getChatByName, + getCommonGroups, + getContact, + getGroupMetadata, + getGroupParticipantIDs, + getHost, + getWid, + getMe, + getMessageById, + getMyContacts, + getNewId, + getNumberProfile, + getUnreadMessages, + getUnreadMessagesInChat, + hasUndreadMessages, + isConnected, + isLoggedIn, + loadAllEarlierMessages, + loadAndGetAllMessagesInChat, + loadChatEarlierMessages, + loadEarlierMessagesTillDate, + processFiles, + processMessageObj, + sendMessageOptions, + sendChatstate, + sendFile, + sendPtt, + sendImage, + sendImageWithProduct, + createProduct, + sendLocation, + sendMessage, + sendMessage2, + sendMessageWithTags, + sendMessageWithThumb, + sendVideoAsGif, + setMyName, + getTheme, + setTheme, + sendLinkPreview, + scope, + getchatId, + sendExist, + setProfilePic, + pinChat, + getSessionTokenBrowser, + sendMute, + getListMute, + interfaceMute, + startPhoneWatchdog, + stopPhoneWatchdog, + setTemporaryMessages, + starMessages, + subscribePresence, + unsubscribePresence, + getMessages, + setOnlinePresence, +} from './functions'; +import { + base64ToFile, + generateMediaKey, + getFileHash, + arrayBufferToBase64, +} from './helper'; +import { + addNewMessagesListener, + addOnAddedToGroup, + addOnLiveLocation, + addOnNewAcks, + addOnNotificationMessage, + addOnParticipantsChange, + addOnPresenceChanged, + addOnStateChange, + addOnStreamChange, + allNewMessagesListener, + initNewMessagesListener, +} from './listeners'; +import { + _serializeChatObj, + _serializeContactObj, + _serializeMessageObj, + _serializeNumberStatusObj, + _serializeProfilePicThumb, + _serializeRawObj, + _profilePicfunc, +} from './serializers'; +import { getBusinessProfilesProducts, getOrderbyMsg } from './business'; +import { storeObjects } from './store/store-objects'; + +const readyPromise = new Promise((resolve) => { + if (WPP.isReady) { + resolve(); + return; + } + WPP.webpack.onReady(resolve); +}); + +if (typeof window.Store === 'undefined') { + window.Store = {}; + window.Store.promises = {}; + + readyPromise.then(() => { + for (const store of storeObjects) { + window.Store.promises[store.id] = Promise.resolve( + WPP.webpack.search(store.conditions) + ) + .then((m) => { + if (!m) { + console.error(`Store Object '${store.id}' was not found`); + } + return m; + }) + .then(store.conditions) + .then((m) => { + if (store.id === 'Store') { + window.Store = Object.assign({}, window.Store, m); + } else { + window.Store[store.id] = m; + } + }); + } + }); +} + +if (typeof window.WAPI === 'undefined') { + window.WAPI = { + lastRead: {}, + }; + //others + window.WAPI.interfaceMute = interfaceMute; + //Profile + window.WAPI.setProfilePic = setProfilePic; + window.WAPI.getSessionTokenBrowser = getSessionTokenBrowser; + + // Chat Functions + window.WAPI.scope = scope; + window.WAPI.getchatId = getchatId; + window.WAPI.sendExist = sendExist; + window.WAPI.pinChat = pinChat; + window.WAPI.setTemporaryMessages = setTemporaryMessages; + + // Layout Functions + window.WAPI.setTheme = setTheme; + window.WAPI.getTheme = getTheme; + + // Serializers assignations + window.WAPI._serializeRawObj = _serializeRawObj; + window.WAPI._serializeChatObj = _serializeChatObj; + window.WAPI._serializeContactObj = _serializeContactObj; + window.WAPI._serializeMessageObj = _serializeMessageObj; + window.WAPI._serializeNumberStatusObj = _serializeNumberStatusObj; + window.WAPI._serializeProfilePicThumb = _serializeProfilePicThumb; + window.WAPI._profilePicfunc = _profilePicfunc; + + // Chatting functions + window.WAPI.sendChatstate = sendChatstate; + window.WAPI.sendMessageWithThumb = sendMessageWithThumb; + window.WAPI.processMessageObj = processMessageObj; + window.WAPI.sendMessageWithTags = sendMessageWithTags; + window.WAPI.sendMessage = sendMessage; + window.WAPI.sendMessage2 = sendMessage2; + window.WAPI.sendImage = sendImage; + window.WAPI.sendPtt = sendPtt; + window.WAPI.sendFile = sendFile; + window.WAPI.setMyName = setMyName; + window.WAPI.sendVideoAsGif = sendVideoAsGif; + window.WAPI.processFiles = processFiles; + window.WAPI.sendImageWithProduct = sendImageWithProduct; + window.WAPI.createProduct = createProduct; + window.WAPI.forwardMessages = forwardMessages; + window.WAPI.encryptAndUploadFile = encryptAndUploadFile; + window.WAPI.setOnlinePresence = setOnlinePresence; + window.WAPI.sendLocation = sendLocation; + window.WAPI.sendLinkPreview = sendLinkPreview; + window.WAPI.sendMessageOptions = sendMessageOptions; + window.WAPI.starMessages = starMessages; + + // Retrieving functions + window.WAPI.getAllContacts = getAllContacts; + window.WAPI.getMyContacts = getMyContacts; + window.WAPI.getContact = getContact; + window.WAPI.getAllChats = getAllChats; + window.WAPI.haveNewMsg = hasUndreadMessages; + window.WAPI.getAllChatsWithNewMsg = getAllChatsWithNewMessages; + window.WAPI.getAllChatIds = getAllChatIds; + window.WAPI.getAllNewMessages = getAllNewMessages; + window.WAPI.getAllUnreadMessages = getAllUnreadMessages; + window.WAPI.getAllChatsWithMessages = getAllChatsWithMessages; + window.WAPI.getAllGroups = getAllGroups; + window.WAPI.getChat = getChat; + window.WAPI.getChatByName = getChatByName; + window.WAPI.getNewId = getNewId; + window.WAPI.getChatById = getChatById; + window.WAPI.getUnreadMessagesInChat = getUnreadMessagesInChat; + window.WAPI.loadEarlierMessages = loadChatEarlierMessages; + window.WAPI.loadAllEarlierMessages = loadAllEarlierMessages; + window.WAPI.asyncLoadAllEarlierMessages = asyncLoadAllEarlierMessages; + window.WAPI.areAllMessagesLoaded = areAllMessagesLoaded; + window.WAPI.loadEarlierMessagesTillDate = loadEarlierMessagesTillDate; + window.WAPI.getAllGroupMetadata = getAllGroupMetadata; + window.WAPI.getGroupMetadata = getGroupMetadata; + window.WAPI._getGroupParticipants = _getGroupParticipants; + window.WAPI.getGroupParticipantIDs = getGroupParticipantIDs; + window.WAPI.getAllMessagesInChat = getAllMessagesInChat; + window.WAPI.loadAndGetAllMessagesInChat = loadAndGetAllMessagesInChat; + window.WAPI.getUnreadMessages = getUnreadMessages; + window.WAPI.getCommonGroups = getCommonGroups; + window.WAPI.downloadFile = downloadFile; + window.WAPI.getNumberProfile = getNumberProfile; + window.WAPI.getMessageById = getMessageById; + window.WAPI.getMessages = getMessages; + window.WAPI.getFileHash = getFileHash; + window.WAPI.generateMediaKey = generateMediaKey; + window.WAPI.arrayBufferToBase64 = arrayBufferToBase64; + window.WAPI.getListMute = getListMute; + + // Device functions + window.WAPI.getHost = getHost; + window.WAPI.getWid = getWid; + window.WAPI.getMe = getMe; + window.WAPI.isConnected = isConnected; + window.WAPI.isLoggedIn = isLoggedIn; + window.WAPI.getBatteryLevel = getBatteryLevel; + window.WAPI.base64ImageToFile = base64ToFile; + window.WAPI.base64ToFile = base64ToFile; + window.WAPI.sendMute = sendMute; + window.WAPI.startPhoneWatchdog = startPhoneWatchdog; + window.WAPI.stopPhoneWatchdog = stopPhoneWatchdog; + window.WAPI.subscribePresence = subscribePresence; + window.WAPI.unsubscribePresence = unsubscribePresence; + + // business functions + window.WAPI.getBusinessProfilesProducts = getBusinessProfilesProducts; + window.WAPI.getOrderbyMsg = getOrderbyMsg; + + // Listeners initialization + window.WAPI._newMessagesQueue = []; + window.WAPI._newMessagesBuffer = + sessionStorage.getItem('saved_msgs') != null + ? JSON.parse(sessionStorage.getItem('saved_msgs')) + : []; + window.WAPI._newMessagesDebouncer = null; + window.WAPI._newMessagesCallbacks = []; + + // Listeners + window.addEventListener('unload', window.WAPI._unloadInform, false); + window.addEventListener('beforeunload', window.WAPI._unloadInform, false); + window.addEventListener('pageunload', window.WAPI._unloadInform, false); + // On-work below: + + window.WAPI.getProfilePicSmallFromId = async function (id) { + return await WPP.whatsapp.ProfilePicThumbStore.find(id).then( + async function (d) { + if (d.img !== undefined) { + return await window.WAPI.downloadFileWithCredentials(d.img); + } else { + return false; + } + }, + function (e) { + return false; + } + ); + }; + + window.WAPI.getProfilePicFromId = async function (id) { + return await WPP.whatsapp.ProfilePicThumbStore.find(id).then( + async function (d) { + if (d.imgFull !== undefined) { + return await window.WAPI.downloadFileWithCredentials(d.imgFull); + } else { + return false; + } + }, + function (e) { + return false; + } + ); + }; + + window.WAPI.downloadFileWithCredentials = async function (url) { + if (!axios || !url) return false; + const ab = ( + await axios.get(url, { + responseType: 'arraybuffer', + }) + ).data; + return btoa( + new Uint8Array(ab).reduce( + (data, byte) => data + String.fromCharCode(byte), + '' + ) + ); + }; + + window.WAPI._serializeNumberStatusObj = (obj) => { + if (obj == undefined) { + return null; + } + + return Object.assign( + {}, + { + id: obj.jid, + status: obj.status, + isBusiness: obj.biz === true, + canReceiveMessage: obj.status === 200, + } + ); + }; + + window.WAPI.checkNumberStatus = async function (id) { + const result = await WPP.contact.queryExists(id); + + if (!result) { + return { + id: id, + isBusiness: false, + canReceiveMessage: false, + numberExists: false, + status: 404, + }; + } + + return { + id: result.wid, + isBusiness: result.biz, + canReceiveMessage: true, + numberExists: true, + status: 200, + }; + }; + + window.WAPI.getChatIsOnline = async function (chatId) { + const chat = WPP.whatsapp.ChatStore.get(chatId); + if (!chat) { + return false; + } + await chat.presence.subscribe(); + return chat.presence.attributes.isOnline; + }; + + window.WAPI.getLastSeen = async function (chatId) { + const chat = WPP.whatsapp.ChatStore.get(chatId); + if (!chat) { + return false; + } + if (!chat.presence.hasData) { + await chat.presence.subscribe(); + await new Promise((resolve) => setTimeout(resolve, 100)); + } + return chat.presence.chatstate.t || false; + }; + + window.WAPI.getWAVersion = function () { + return window.Debug.VERSION; + }; + + /** + * @param NumberChatsDelete Number of chats that will be deleted + */ + //Add Marcelo 21/10/2023 + window.WAPI.deleteOldChats = async function (NumberChatsDelete) { + const options = { + onlyWithUnreadMessage: false, + onlyUsers: true, + }; + + try { + const chats = await window.WAPI.chat.list(options); + chats.reverse(); + const numChatsToDelete = Math.min(NumberChatsDelete, chats.length); + + for (let i = 0; i < numChatsToDelete; i++) { + await window.WAPI.chat + .delete(chats[i].id._serialized) + .then((_) => true) + .catch((_) => false); + } + } catch (e) { + console.error('Erro:', e); + return e; + } + }; + + /** + * @param id The id of the conversation + * @param archive boolean true => archive, false => unarchive + * @return boolean true: worked, false: didnt work (probably already in desired state) + */ + window.WAPI.archiveChat = async function (id, archive) { + const promise = Store.Archive.setArchive( + WPP.whatsapp.ChatStore.get(id), + archive + ) + .then((_) => true) + .catch((_) => false); + + return await Promise.resolve(promise); + }; + + /** + * @param content Status Message Text + * @param options {backgroundColor: '#0275d8', font: 2} + */ + window.WAPI.sendTextStatus = async function (content, options) { + try { + const result = await WPP.status.sendTextStatus(content, options); + return result; + } catch (err) { + console.log(err); + return err; + } + }; + + /** + * @param base64 data:image/jpeg;base64, + * @param options {backgroundColor: '#0275d8', font: 2} + */ + window.WAPI.sendImageStatus = async function (base64, options) { + try { + const result = await WPP.status.sendImageStatus(base64, options); + return result; + } catch (err) { + console.log(err); + return err; + } + }; + + /** + * @param base64 data:video/mp4;base64, + * @param options {backgroundColor: '#0275d8', font: 2} + */ + window.WAPI.sendVideoStatus = async function (base64, options) { + try { + const result = await WPP.status.sendVideoStatus(base64, options); + return result; + } catch (err) { + console.log(err); + return err; + } + }; + + window.WAPI.takeOver = async function () { + await WPP.whatsapp.Socket.takeover(); + return true; + }; + + /** + * Registers a callback to be called when your phone receives a new call request. + * @param callback - function - Callback function to be called upon a new call. returns a call object. + * @returns {boolean} + */ + window.WAPI.onIncomingCall = function (callback) { + WPP.whatsapp.CallStore.on('add', callback); + return true; + }; + + /** + * Registers a callback to be called when the interface change + * @param callback - function - Callback function to be called upon interface change. returns a call object. + * @returns {boolean} + */ + window.WAPI.onInterfaceChange = function (callback) { + const getData = () => ({ + displayInfo: WPP.whatsapp.Stream.displayInfo, + mode: WPP.whatsapp.Stream.mode, + info: WPP.whatsapp.Stream.info, + }); + callback(getData()); + WPP.whatsapp.Stream.on('change:info change:displayInfo change:mode', () => { + callback(getData()); + }); + return true; + }; + + window.WAPI.setMessagesAdminsOnly = async function (chatId, option) { + await WPP.group.setProperty(chatId, 'announcement', option); + return true; + }; + + window.WAPI.logout = async function () { + return await WPP.conn.logout(); + }; + + /** + * @todo Temporary fix while is not implemented on WA-JS + */ + window.WAPI.isRegistered = function () { + const m = WPP.webpack.search((m) => m.isRegistered); + return m.isRegistered(); + }; + + readyPromise.then(addOnStreamChange); + readyPromise.then(addOnStateChange); + readyPromise.then(initNewMessagesListener); + readyPromise.then(addNewMessagesListener); + readyPromise.then(allNewMessagesListener); + readyPromise.then(addOnNewAcks); + readyPromise.then(addOnAddedToGroup); + readyPromise.then(addOnLiveLocation); + readyPromise.then(addOnParticipantsChange); + readyPromise.then(addOnNotificationMessage); + readyPromise.then(addOnPresenceChanged); +} diff --git a/src/lib/wapi/webpack.config.js b/src/lib/wapi/webpack.config.js new file mode 100644 index 000000000..295bdffa4 --- /dev/null +++ b/src/lib/wapi/webpack.config.js @@ -0,0 +1,39 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +const path = require('path'); + +module.exports = { + entry: ['regenerator-runtime/runtime.js', './wapi.js'], + mode: 'production', + // devtool: 'source-map', + module: { + rules: [ + { + test: /\.m?js$/, + exclude: /(node_modules|bower_components)/, + use: { + loader: 'babel-loader', + }, + }, + ], + }, + output: { + path: path.resolve(__dirname, '../../../dist/lib/wapi'), + filename: 'wapi.js', + }, +}; diff --git a/src/tests/01.qrcode.test.ts b/src/tests/01.qrcode.test.ts new file mode 100644 index 000000000..d8309a33e --- /dev/null +++ b/src/tests/01.qrcode.test.ts @@ -0,0 +1,80 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ +import * as wppconnect from '../index'; +import * as assert from 'assert'; +import { sleep } from '../utils/sleep'; + +describe('QRCode test', function () { + let client: wppconnect.Whatsapp = null; + + this.timeout(20000); + + before(async function () { + if (process.env.SKIP_QR_CODE) { + this.skip(); + } + + wppconnect.defaultLogger.level = 'none'; + + client = await wppconnect.create({ + session: 'qrcode-reader', + waitForLogin: false, + autoClose: 0, + }); + + await client.waitForPageLoad(); + }); + + after(async function () { + if (client) { + await client.close(); + } + }); + + it('Get QRCode', async function () { + const result = await client.getQrCode(); + assert.ok(result); + assert.ok(result.urlCode); + assert.ok(result.base64Image); + }); + + it('Await QRCode change', async function () { + this.timeout(60000); + + const first = await client.getQrCode(); + await sleep(25000); + const second = await client.getQrCode(); + + assert.ok(second); + assert.ok(second.urlCode !== first.urlCode); + assert.ok(second.base64Image !== first.base64Image); + }); + + it('Await QRCode reload button', async function () { + this.timeout(8 * 20000 + 20000); + + const result = await new Promise((resolve) => { + client.waitForQrCodeScan((q, a, attempt) => { + if (attempt > 6) { + resolve(true); + } + }); + }); + + assert.ok(result); + }); +}); diff --git a/src/tests/02.basic.test.ts b/src/tests/02.basic.test.ts new file mode 100644 index 000000000..816f8cacb --- /dev/null +++ b/src/tests/02.basic.test.ts @@ -0,0 +1,156 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ +import * as assert from 'assert'; +import { describeAuthenticatedTest, testUserId } from './common'; + +describeAuthenticatedTest('Basic functions', function (getClient) { + it('getAllChats', function (done) { + getClient() + .getAllChats() + .then((result) => { + assert.ok(result); + done(); + }); + }); + + it('getAllGroups', function (done) { + getClient() + .getAllGroups() + .then((result) => { + assert.ok(result); + done(); + }); + }); + + it('getNumberProfile', async function () { + const result = await getClient().getNumberProfile(testUserId); + assert.ok(result); + }); + + it('getAllUnreadMessages', async function () { + const result = await getClient().getAllUnreadMessages(); + assert.ok(result); + }); + + it('getAllContacts', async function () { + const result = await getClient().getAllContacts(); + assert.ok(result); + }); + + it('getAllChatsWithMessages', async function () { + const result = await getClient().getAllChatsWithMessages(); + assert.ok(result); + }); + + it('getAllMessagesInChat', async function () { + const result = await getClient().getAllMessagesInChat( + testUserId, + true, + false + ); + assert.ok(result); + }); + + it('getAllUnreadMessages', async function () { + const result = await getClient().getAllUnreadMessages(); + assert.ok(result); + }); + + it('getBatteryLevel', async function () { + const result = await getClient().getBatteryLevel(); + assert.ok(result); + }); + + it('getBlockList', async function () { + const result = await getClient().getBlockList(); + assert.ok(result); + }); + + it('getChatById', async function () { + const result = await getClient().getChatById(testUserId); + assert.ok(result); + }); + + it('getChatIsOnline', async function () { + const result = await getClient().getChatIsOnline(testUserId); + assert.ok(typeof result === 'boolean'); + }); + + it('getConnectionState', async function () { + const result = await getClient().getConnectionState(); + assert.ok(result); + }); + + it('getContact', async function () { + const result = await getClient().getContact(testUserId); + assert.ok(result); + }); + + it('getHostDevice', async function () { + const result = await getClient().getHostDevice(); + assert.ok(result); + }); + + it('getLastSeen', async function () { + const result = await getClient().getLastSeen(testUserId); + assert.ok(result); + }); + + it('getListMutes', async function () { + const result = await getClient().getListMutes(); + assert.ok(result); + }); + + // it('getMessageById', async function () { + // const result = await getClient().getMessageById(); + // assert.ok(result); + // }); + + it('getProfilePicFromServer', async function () { + const result = await getClient().getProfilePicFromServer(testUserId); + assert.ok(result); + }); + + it('getStatus', async function () { + const result = await getClient().getStatus(testUserId); + assert.ok(result); + }); + + it('getTheme', async function () { + const result = await getClient().getTheme(); + assert.ok(result); + }); + + it('getWAVersion', async function () { + const result = await getClient().getWAVersion(); + assert.ok(result); + }); + + it('loadAndGetAllMessagesInChat', async function () { + const result = await getClient().loadAndGetAllMessagesInChat( + testUserId, + true, + true + ); + assert.ok(result); + }); + + it('sendText', async function () { + const result = await getClient().sendText(testUserId, 'Send Text'); + assert.ok(result); + }); +}); diff --git a/src/tests/03.group.test.ts b/src/tests/03.group.test.ts new file mode 100644 index 000000000..c0ae756ae --- /dev/null +++ b/src/tests/03.group.test.ts @@ -0,0 +1,56 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ +import * as assert from 'assert'; +import { describeAuthenticatedTest, testGroupID } from './common'; + +describeAuthenticatedTest('Group functions', function (getClient) { + before(function () { + if (!testGroupID) { + this.skip(); + } + }); + + it('getGroupAdmins', async function () { + const result = await getClient().getGroupAdmins(testGroupID); + assert.ok(result); + }); + + it('getGroupInfoFromInviteLink', async function () { + const result = await getClient().getGroupInfoFromInviteLink(testGroupID); + assert.ok(result); + }); + + it('getGroupInviteLink', async function () { + const result = await getClient().getGroupInviteLink(testGroupID); + assert.ok(result); + }); + + it('getGroupMembers', async function () { + const result = await getClient().getGroupMembers(testGroupID); + assert.ok(result); + }); + + it('getGroupMembersIds', async function () { + const result = await getClient().getGroupMembersIds(testGroupID); + assert.ok(result); + }); + + // it('joinGroup', async function () { + // const result = await getClient().joinGroup(); + // assert.ok(result); + // }); +}); diff --git a/src/tests/04.chat.test.ts b/src/tests/04.chat.test.ts new file mode 100644 index 000000000..36a5ed340 --- /dev/null +++ b/src/tests/04.chat.test.ts @@ -0,0 +1,187 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ +import * as assert from 'assert'; +import { sleep } from '../utils/sleep'; +import { describeAuthenticatedTest, testUserId } from './common'; + +describeAuthenticatedTest('Chat functions', function (getClient) { + it('star message', async function () { + const client = getClient(); + + await client.sendText(testUserId, 'Message 1'); + const msg2 = await client.sendText(testUserId, 'Message 2'); + await client.sendText(testUserId, 'Message 3'); + + let msg = await client.getMessageById(msg2.id); + assert.strictEqual(msg.star, false); + + let result = await client.starMessage(msg2.id, true); + assert.strictEqual(result, 1); + + // Star a starred message + result = await client.starMessage(msg2.id, true); + assert.strictEqual(result, 0); + + msg = await client.getMessageById(msg2.id); + assert.strictEqual(msg.star, true); + + result = await client.starMessage(msg2.id, false); + assert.strictEqual(result, 1); + + // Unstar a unstarred message + result = await client.starMessage(msg2.id, false); + assert.strictEqual(result, 0); + + msg = await client.getMessageById(msg2.id); + assert.strictEqual(msg.star, false); + }); + + it('clear chat', async function () { + const client = getClient(); + + const host = await client.getHostDevice(); + + const chatId = host.wid._serialized; + + const msgs1 = await client.getAllMessagesInChat(chatId, true, false); + + await client.sendText(chatId, 'Message 1'); + const msg2 = await client.sendText(chatId, 'Message 2'); + await client.sendText(chatId, 'Message 3'); + + await sleep(2000); + + await client.starMessage(msg2.id, true); + + await sleep(2000); + + const msgs2 = await client.getAllMessagesInChat(chatId, true, false); + + assert.ok(msgs2.length > msgs1.length); + + await sleep(2000); + + await client.clearChat(chatId, true); + + await sleep(2000); + + const msgs3 = await client.getAllMessagesInChat(chatId, true, false); + assert.strictEqual(msgs3.length, 1); + + await client.clearChat(chatId, false); + + await sleep(2000); + + const msgs4 = await client.getAllMessagesInChat(chatId, true, false); + assert.strictEqual(msgs4.length, 0); + }); + + it('forward a single message', async function () { + const client = getClient(); + + const host = await client.getHostDevice(); + + assert.ok(host); + + const msg = await client.sendText( + host.wid._serialized, + 'Message to forward' + ); + + const r = await client.forwardMessages(testUserId, msg.id, false); + + assert.strictEqual(r.length, 1); + + const fmsg = await client.getMessageById(r[0]); + + assert.strictEqual(fmsg.body, 'Message to forward'); + }); + + it('forward multiple messages', async function () { + const client = getClient(); + + const host = await client.getHostDevice(); + + assert.ok(host); + + const msg1 = await client.sendText( + host.wid._serialized, + 'Message 1 to forward' + ); + const msg2 = await client.sendText( + host.wid._serialized, + 'Message 2 to forward' + ); + + const r = await client.forwardMessages( + testUserId, + [msg1.id, msg2.id], + false + ); + + assert.strictEqual(r.length, 2); + + const fmsg1 = await client.getMessageById(r[0]); + const fmsg2 = await client.getMessageById(r[1]); + + assert.strictEqual(fmsg1.body, 'Message 1 to forward'); + assert.strictEqual(fmsg2.body, 'Message 2 to forward'); + }); + + it('archive chat', async function () { + const client = getClient(); + + // Ensure chat is not archived + await client.sendText(testUserId, 'unarchive chat'); + + await sleep(1000); + let chat = await client.getChatById(testUserId); + + assert.strictEqual(chat.archive, false); + + // ensure the first archive is OK + let result = await client.archiveChat(testUserId, true); + + assert.strictEqual(result, true); + + await sleep(1000); + // ensure the second archive is not OK + result = await client.archiveChat(testUserId, true); + + assert.strictEqual(result, false); + + await sleep(1000); + chat = await client.getChatById(testUserId); + + assert.strictEqual(chat.archive, true); + + // ensure the first unarchive is OK + result = await client.archiveChat(testUserId, false); + + assert.strictEqual(result, true); + + await sleep(1000); + chat = await client.getChatById(testUserId); + + assert.strictEqual(chat.archive, false); + + // ensure the second unarchive is not OK + result = await client.archiveChat(testUserId, false); + + assert.strictEqual(result, false); + }); +}); diff --git a/src/tests/common.ts b/src/tests/common.ts new file mode 100644 index 000000000..2a02761cd --- /dev/null +++ b/src/tests/common.ts @@ -0,0 +1,66 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ +import { Suite } from 'mocha'; +import * as wppconnect from '../'; + +export const testUserId = process.env.TEST_USER_ID; +export const testGroupID = process.env.TEST_GROUP_ID; + +export function describeAuthenticatedTest( + title: string, + fn: (this: Suite, getClient: () => wppconnect.Whatsapp) => void +) { + describe(title, async function () { + let client: wppconnect.Whatsapp; + + if (testUserId) { + this.timeout(60000); + } + + before(async function () { + if (!testUserId) { + console.warn( + 'Please, set environment variable TEST_USER_ID to run authenticated tests' + ); + return this.skip(); + } + wppconnect.defaultLogger.level = 'none'; + client = await wppconnect.create({ + session: 'test-authenticated', + updatesLog: false, + disableWelcome: true, + waitForLogin: false, + }); + const authenticated = await client.waitForLogin().catch(() => false); + + if (!authenticated) { + console.warn( + 'Please, set create a authenticated session for "test-authenticated".' + ); + return this.skip(); + } + }); + + after(async function () { + if (client) { + await client.close().catch(() => null); + } + }); + + fn.call(this, () => client); + }); +} diff --git a/src/token-store/fileTokenStore.ts b/src/token-store/fileTokenStore.ts new file mode 100644 index 000000000..e579e2f69 --- /dev/null +++ b/src/token-store/fileTokenStore.ts @@ -0,0 +1,203 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ +/// +import * as fs from 'fs'; +import * as path from 'path'; +import sanitize from 'sanitize-filename'; +import { defaultLogger } from '../utils/logger'; +import { isValidSessionToken } from './isValidSessionToken'; +import { SessionToken, TokenStore } from './types'; + +export interface FileTokenStoreOptions { + /** + * Decode function to parse token file (Default `JSON.parse`) {@link defaultFileTokenStoreOptions} + * @default `JSON.parse` + */ + decodeFunction: (text: string) => any; + + /** + * Encode function to save tokens (Default `JSON.stringify`) + * @default `JSON.stringify` + */ + encodeFunction: (data: any) => string; + + /** + * Encoding used to read and save files + * @default 'utf8' + */ + encoding: BufferEncoding; + + /** + * @default '.data.json' + */ + fileExtension: string; + + /** + * Folder path to store tokens + * @default './tokens' + */ + path: string; +} + +export const defaultFileTokenStoreOptions: FileTokenStoreOptions = { + decodeFunction: JSON.parse, + encodeFunction: JSON.stringify, + encoding: 'utf8', + fileExtension: '.data.json', + path: './tokens', +}; + +/** + * Token Store using file + * + * ```typescript + * // Example of typescript with FileTokenStore + * import * as wppconnect from '@wppconnect-team/wppconnect'; + * + * const myTokenStore = new wppconnect.tokenStore.FileTokenStore({ + * // decodeFunction: JSON.parse, + * // encodeFunction: JSON.stringify, + * // encoding: 'utf8', + * // fileExtension: '.my.ext', + * // path: './a_custom_path', + * }); + * + * wppconnect.create({ + * session: 'mySession', + * tokenStore: myTokenStore, + * }); + * + * wppconnect.create({ + * session: 'otherSession', + * tokenStore: myTokenStore, + * }); + * ``` + */ +export class FileTokenStore implements TokenStore { + protected options: FileTokenStoreOptions; + + constructor(options: Partial = {}) { + this.options = Object.assign( + {}, + defaultFileTokenStoreOptions, + options + ) as FileTokenStoreOptions; + } + + /** + * Resolve the path of file + * @param sessionName Name of session + * @returns Full path of token file + */ + protected resolverPath(sessionName: string): string { + const filename = sanitize(sessionName) + this.options.fileExtension; + return path.resolve(process.cwd(), path.join(this.options.path, filename)); + } + + public async getToken( + sessionName: string + ): Promise { + const filePath = this.resolverPath(sessionName); + + if (!fs.existsSync(filePath)) { + return undefined; + } + + const text = await fs.promises + .readFile(filePath, { + encoding: this.options.encoding, + }) + .catch(() => null); + + if (!text) { + return undefined; + } + + try { + return this.options.decodeFunction(text); + } catch (error) { + defaultLogger.debug(error); + return undefined; + } + } + + public async setToken( + sessionName: string, + tokenData: SessionToken | null + ): Promise { + if (!tokenData || !isValidSessionToken(tokenData)) { + return false; + } + + if (!fs.existsSync(this.options.path)) { + await fs.promises.mkdir(this.options.path, { recursive: true }); + } + + const filePath = this.resolverPath(sessionName); + + try { + const text = this.options.encodeFunction(tokenData); + + await fs.promises.writeFile(filePath, text, { + encoding: this.options.encoding, + }); + return true; + } catch (error) { + defaultLogger.debug(error); + return false; + } + } + + public async removeToken(sessionName: string): Promise { + const filePath = this.resolverPath(sessionName); + + if (!fs.existsSync(filePath)) { + return false; + } + + try { + await fs.promises.unlink(filePath); + return true; + } catch (error) { + defaultLogger.debug(error); + return false; + } + } + + public async listTokens(): Promise { + if (!fs.existsSync(this.options.path)) { + return []; + } + + try { + let files = await fs.promises.readdir(this.options.path); + + // Only sessions with same fileExtension + files = files.filter((file) => file.endsWith(this.options.fileExtension)); + + // Return name only + files = files.map((file) => + path.basename(file, this.options.fileExtension) + ); + + return files; + } catch (error) { + defaultLogger.debug(error); + return []; + } + } +} diff --git a/src/token-store/index.ts b/src/token-store/index.ts new file mode 100644 index 000000000..2972f7cb4 --- /dev/null +++ b/src/token-store/index.ts @@ -0,0 +1,21 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ +export * from './fileTokenStore'; +export * from './isValidSessionToken'; +export * from './isValidTokenStore'; +export * from './memoryTokenStore'; +export * from './types'; diff --git a/src/token-store/isValidSessionToken.ts b/src/token-store/isValidSessionToken.ts new file mode 100644 index 000000000..faedb0a8f --- /dev/null +++ b/src/token-store/isValidSessionToken.ts @@ -0,0 +1,38 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ +import { SessionToken } from './types'; + +/** + * Validate the object to check is a valid token + * @param token Token to validate + * @returns Token is valid + */ +export function isValidSessionToken(token: any): token is SessionToken { + const requiredAttribbutes = [ + 'WABrowserId', + 'WASecretBundle', + 'WAToken1', + 'WAToken2', + ]; + + return ( + token && + requiredAttribbutes.every( + (attr) => typeof token[attr] === 'string' && token[attr].length > 0 + ) + ); +} diff --git a/src/token-store/isValidTokenStore.ts b/src/token-store/isValidTokenStore.ts new file mode 100644 index 000000000..49566c2ee --- /dev/null +++ b/src/token-store/isValidTokenStore.ts @@ -0,0 +1,28 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ +import { TokenStore } from './types'; + +const keys = ['getToken', 'setToken', 'removeToken', 'listTokens']; + +/** + * Check and validate if the object implements the TokenStore interface + * @param object Object to check that implements the TokenStore interface + * @returns true if the object is a valid else false + */ +export function isValidTokenStore(object: any): object is TokenStore { + return keys.every((k) => k in object && typeof object[k] === 'function'); +} diff --git a/src/token-store/memoryTokenStore.ts b/src/token-store/memoryTokenStore.ts new file mode 100644 index 000000000..d385de91c --- /dev/null +++ b/src/token-store/memoryTokenStore.ts @@ -0,0 +1,66 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ +import { SessionToken, TokenStore } from './types'; + +/** + * Token Store using im memory + * + * ```typescript + * // Example of typescript with MemoryTokenStore + * import * as wppconnect from '@wppconnect-team/wppconnect'; + * + * const myTokenStore = new wppconnect.tokenStore.MemoryTokenStore(); + * + * wppconnect.create({ + * session: 'mySession', + * tokenStore: myTokenStore, + * }); + * + * wppconnect.create({ + * session: 'otherSession', + * tokenStore: myTokenStore, + * }); + * ``` + */ +export class MemoryTokenStore implements TokenStore { + protected tokens: { + [key: string]: any; + } = {}; + + public getToken(sessionName: string): SessionToken | undefined { + return this.tokens[sessionName]; + } + public setToken( + sessionName: string, + tokenData: SessionToken | null + ): boolean { + if (!tokenData) { + return false; + } + this.tokens[sessionName] = tokenData; + + return true; + } + public removeToken(sessionName: string): boolean { + delete this.tokens[sessionName]; + return true; + } + + public listTokens(): string[] { + return Object.keys(this.tokens); + } +} diff --git a/src/token-store/types.ts b/src/token-store/types.ts new file mode 100644 index 000000000..242951ef3 --- /dev/null +++ b/src/token-store/types.ts @@ -0,0 +1,136 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +/** + * Session token of WhatsApp to authenticate the web interface + * ```typescript + * // Example of SessionToken + * { + * WABrowserId: '"UnXjH....."', + * WASecretBundle: '{"key":"+i/nRgWJ....","encKey":"kGdMR5t....","macKey":"+i/nRgW...."}', + * WAToken1: '"0i8...."', + * WAToken2: '"1@lPpzwC...."', + * } + * ``` + */ +export interface SessionToken { + WABrowserId: string; + WAToken1: string; + WAToken2: string; + WASecretBundle: string; +} + +/** + * Standard interface to manage tokens + * + * ```typescript + * // Example of typescript with TokenStore and redis + * import * as wppconnect from '@wppconnect-team/wppconnect'; + * import * as redis from 'redis'; + * + * const redisClient = redis.createClient(6379, '127.0.0.1'); + * + * // Base of interface: + * const myTokenStore: wppconnect.tokenStore.TokenStore = { + * getToken: (sessionName: string) => { + * // Your logic here + * }), + * setToken: (sessionName: string, tokenData: wppconnect.tokenStore.SessionToken) => { + * // Your logic here + * }), + * removeToken: (sessionName: string) => { + * // Your logic here + * }), + * listTokens: () => { + * // Your logic here + * }), + * }; + * + * // Example with redis + * const myTokenStore: wppconnect.tokenStore.TokenStore = { + * getToken: (sessionName: string) => + * new Promise((resolve, reject) => { + * redisClient.get(sessionName, (err, reply) => { + * if (err) { + * return reject(err); + * } + * resolve(JSON.parse(reply)); + * }); + * }), + * setToken: (sessionName: string, tokenData: wppconnect.tokenStore.SessionToken) => + * new Promise((resolve) => { + * redisClient.set(sessionName, JSON.stringify(tokenData), (err, reply) => { + * return resolve(err ? false : true); + * }); + * }), + * removeToken: (sessionName: string) => + * new Promise((resolve) => { + * redisClient.del(sessionName, (err) => { + * return resolve(err ? false : true); + * }); + * }), + * listTokens: () => + * new Promise((resolve) => { + * redisClient.keys('*', (err, keys) => { + * if (err) { + * return resolve([]); + * } + * return resolve(keys); + * }); + * }), + * }; + * + * wppconnect.create({ + * session: 'mySession', + * tokenStore: myTokenStore, + * }); + * + * wppconnect.create({ + * session: 'otherSession', + * tokenStore: myTokenStore, + * }); + * ``` + */ +export interface TokenStore { + /** + * Return the session data if exists + * @param sessionName Name of session + */ + getToken(sessionName: string): Promise | T | undefined; + + /** + * Store the session token data + * @param sessionName Name of session + * @param tokenData Session token data + */ + setToken( + sessionName: string, + tokenData: T | null + ): Promise | boolean; + + /** + * Remove the session + * @param sessionName Name of session + * @returns Token was removed + */ + removeToken(sessionName: string): Promise | boolean; + + /** + * A liste of avaliable sessions + */ + listTokens(): Promise | string[]; +} diff --git a/src/types/Evaluate.d.ts b/src/types/Evaluate.d.ts new file mode 100644 index 000000000..3b63d4a23 --- /dev/null +++ b/src/types/Evaluate.d.ts @@ -0,0 +1,28 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export declare type EvaluateFn = + | string + | ((arg1: T, ...args: U[]) => V); + +export declare type EvaluateFnReturnType = T extends ( + ...args: any[] +) => infer R + ? R + : any; + +export declare type SerializableOrJSHandle = Serializable | JSHandle; diff --git a/src/types/WAPI.d.ts b/src/types/WAPI.d.ts new file mode 100644 index 000000000..66708a841 --- /dev/null +++ b/src/types/WAPI.d.ts @@ -0,0 +1,207 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +import { + Chat, + Contact, + ContactStatus, + GetMessagesParam, + GroupCreation, + HostDevice, + Id, + Message, + PartialMessage, + PresenceEvent, + ProfilePicThumbObj, + SendFileResult, + SendLinkResult, + SendPttResult, + SendStickerResult, + WhatsappProfile, +} from '../api/model'; +import { SessionToken } from '../token-store'; + +interface WAPI { + allNewMessagesListener: (callback: Function) => void; + archiveChat: (chatId: string, option: boolean) => boolean; + arrayBufferToBase64: (buffer: ArrayBuffer) => string; + checkNumberStatus: (contactId: string) => Promise; + downloadFile: (data: string) => Promise; + forwardMessage: ( + toChatId: string | Wid, + msgId: string | MsgKey, + options?: { + displayCaptionText?: boolean; + multicast?: boolean; + } + ) => boolean; + getAllChats: () => Chat[]; + getAllChatsWithMessages: (withNewMessageOnly?: boolean) => Chat[]; + getAllChatsWithNewMsg: () => Chat[]; + getAllContacts: () => Contact[]; + getAllMessagesInChat: ( + chatId: string, + includeMe: boolean, + includeNotifications: boolean + ) => Message[]; + getAllNewMessages: () => Message[]; + getAllUnreadMessages: () => PartialMessage[]; + getBatteryLevel: () => number; + getBusinessProfilesProducts: (to: string) => any; + getOrderbyMsg: (messageId: string) => any; + getChat: (contactId: string) => Chat; + getChatById: (contactId: string) => Chat; + getChatIsOnline: (chatId: string) => Promise; + getLastSeen: (chatId: string) => Promise; + getContact: (contactId: string) => Contact; + getGroupParticipantIDs: (groupId: string) => Id[]; + getHost: () => HostDevice; + getWid: () => string; + getListMute: (type?: string) => object; + getMessageById: (messageId: string) => Promise; + getMessages: (chatId: string, params: GetMessagesParam) => Promise; + getNumberProfile: (contactId: string) => WhatsappProfile; + getSessionTokenBrowser: (removePath?: boolean) => SessionToken; + getTheme: () => string; + getUnreadMessages: ( + includeMe: boolean, + includeNotifications: boolean, + useUnreadCount: boolean + ) => any; + getWAVersion: () => string; + isConnected: () => boolean; + isLoggedIn: () => boolean; + isRegistered: () => boolean; + joinGroup: (groupId: string) => Promise; + leaveGroup: (groupId: string) => any; + loadAndGetAllMessagesInChat: ( + chatId: string, + includeMe: boolean, + includeNotifications: boolean + ) => Message[]; + loadEarlierMessages: (contactId: string) => Message[]; + logout: () => Promise; + onAddedToGroup: (callback: Function) => any; + onIncomingCall: (callback: Function) => any; + onInterfaceChange: (callback: Function) => void; + onLiveLocation: (callback: Function) => any; + onNotificationMessage: (callback: (message: Message) => void) => any; + onParticipantsChanged: (groupId: string, callback: Function) => any; + onStateChange: (callback: Function) => void; + onStreamChange: (callback: Function) => void; + onPresenceChanged: (callback: (presence: PresenceEvent) => void) => void; + pinChat: ( + chatId: string, + option: boolean, + nonExistent?: boolean + ) => Promise; + sendChatstate: (chatState: string, chatId: string) => void; + sendFile: ( + base64: string, + to: string, + filename: string, + caption: string, + type?: string, + quotedMessageId?: string, + isViewOnce?: boolean + ) => Promise; + sendImage: ( + imgBase64: string, + to: string, + filename: string, + caption?: string, + quotedMessageId?: string, + isViewOnce?: boolean + ) => Promise; + sendImageWithProduct: ( + base64: string, + to: string, + caption: string, + bizNumber: string, + productId: string + ) => any; + sendLinkPreview: ( + chatId: string, + url: string, + title: string + ) => Promise; + sendLocation: ( + to: string, + latitude: string, + longitude: string, + title: string + ) => Promise; + sendMessage: (to: string, content: string) => Promise; + sendMessageOptions: ( + chat: any, + content: any, + options?: any + ) => Promise; + sendMessageWithThumb: ( + thumb: string, + url: string, + title: string, + description: string, + chatId: string + ) => void; + sendMute: (id: string, time: number, type: string) => Promise; + sendPtt: ( + base64: string, + to: string, + filename: string, + caption: string, + done: () => void, + quotedMessageId?: string + ) => Promise; + sendVideoAsGif: ( + base64: string, + to: string, + filename: string, + caption: string + ) => void; + setMessagesAdminsOnly: (chatId: string, option: boolean) => boolean; + setMyName: (name: string) => void; + setOnlinePresence: (online: boolean) => void; + setProfilePic: (path: string, to?: string) => Promise; + setTemporaryMessages: (chatId: string, value: string) => Promise; + setTheme: (theme?: string) => boolean; + starMessages: ( + messagesId: string[] | string, + star: boolean + ) => Promise; + startPhoneWatchdog: (interval: number) => void; + stopPhoneWatchdog: () => void; + subscribePresence: (id: string | string[]) => Promise; + takeOver: () => boolean; + unsubscribePresence: (id: string | string[]) => Promise; + waitNewAcknowledgements: (callback: Function) => void; + waitNewMessages: (rmCallback: boolean, callback: Function) => void; + _profilePicfunc: (contactId: string) => Promise; + _serializeChatObj: (chat: any) => any; + processMessageObj: ( + messageObj: any, + includeMe: boolean, + includeNotifications: boolean + ) => any; +} + +declare global { + interface Window { + WAPI: WAPI; + } + const WAPI: WAPI; +} diff --git a/src/utils/ffmpeg.ts b/src/utils/ffmpeg.ts new file mode 100644 index 000000000..21b505464 --- /dev/null +++ b/src/utils/ffmpeg.ts @@ -0,0 +1,123 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ +import execa from 'execa'; +import * as fs from 'fs'; +import * as path from 'path'; +import rimraf from 'rimraf'; +import * as tmp from 'tmp'; +import { lookpath } from 'lookpath'; + +const tmpDir = tmp.dirSync({}); + +let i = 0; + +process.on('exit', () => { + // Remove only on exit signal + try { + // Use rimraf because it is synchronous + rimraf.sync(tmpDir.name); + } catch (error) {} +}); + +export async function getFfmpegPath() { + let ffmpegPath = process.env['FFMPEG_PATH']; + + if (ffmpegPath) { + const isExecutable = await fs.promises + .access(ffmpegPath, fs.constants.X_OK) + .then(() => true) + .catch(() => false); + + if (isExecutable) { + return ffmpegPath; + } + } + + ffmpegPath = await lookpath('ffmpeg', { + include: [ + 'C:\\FFmpeg\\bin', + 'C:\\FFmpeg\\FFmpeg\\bin', + 'C:\\Program Files\\ffmpeg\\bin', + 'C:\\Program Files (x86)\\ffmpeg\\bin', + ], + }); + + if (!ffmpegPath) { + try { + ffmpegPath = require('ffmpeg-static'); + } catch (error) {} + } + + if (!ffmpegPath) { + throw new Error( + 'Error: FFMPEG not found. Please install ffmpeg or define the env FFMPEG_PATH or install ffmpeg-static' + ); + } + + return ffmpegPath; +} + +/** + * Convert a file to a compatible MP4-GIF for WhatsApp + * @param inputBase64 Gif in base64 format + * @returns base64 of a MP4-GIF for WhatsApp + */ +export async function convertToMP4GIF(inputBase64: string): Promise { + const inputPath = path.join(tmpDir.name, `${i++}`); + const outputPath = path.join(tmpDir.name, `${i++}.mp4`); + + if (inputBase64.includes(',')) { + inputBase64 = inputBase64.split(',')[1]; + } + + fs.writeFileSync(inputPath, Buffer.from(inputBase64, 'base64')); + + /** + * fluent-ffmpeg is a good alternative, + * but to work with MP4 you must use fisical file or ffmpeg will not work + * Because of that, I made the choice to use temporary file + */ + const ffmpegPath = await getFfmpegPath(); + + try { + const out = await execa(ffmpegPath, [ + '-i', + inputPath, + '-movflags', + 'faststart', + '-pix_fmt', + 'yuv420p', + '-vf', + 'scale=trunc(iw/2)*2:trunc(ih/2)*2', + '-f', + 'mp4', + outputPath, + ]); + + if (out.exitCode === 0) { + const outputBase64 = fs.readFileSync(outputPath); + return 'data:video/mp4;base64,' + outputBase64.toString('base64'); + } + + throw out.stderr; + } finally { + rimraf(inputPath, () => null); + rimraf(outputPath, () => null); + } + + return ''; +} diff --git a/src/utils/logger.ts b/src/utils/logger.ts new file mode 100644 index 000000000..fbda03650 --- /dev/null +++ b/src/utils/logger.ts @@ -0,0 +1,67 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ +import { config, createLogger, format, transports } from 'winston'; +import { FormatWrap, TransformableInfo } from 'logform'; + +export type LogLevel = + | 'error' + | 'warn' + | 'info' + | 'http' + | 'verbose' + | 'debug' + | 'silly'; + +export interface MetaInfo { + session?: string; + type?: string; +} + +export interface SessionInfo extends TransformableInfo, MetaInfo {} + +export const formatLabelSession: FormatWrap = format( + (info: SessionInfo, opts?: any) => { + const parts = []; + if (info.session) { + parts.push(info.session); + delete info.session; + } + if (info.type) { + parts.push(info.type); + delete info.type; + } + + if (parts.length) { + let prefix = parts.join(':'); + info.message = `[${prefix}] ${info.message}`; + } + return info; + } +); + +export const defaultLogger = createLogger({ + level: 'silly', + levels: config.npm.levels, + format: format.combine( + formatLabelSession(), + format.colorize(), + format.padLevels(), + format.simple() + ), + // defaultMeta: { service: 'venon-bot' }, + transports: [new transports.Console()], +}); diff --git a/src/utils/semver.ts b/src/utils/semver.ts new file mode 100644 index 000000000..e3f40b2f9 --- /dev/null +++ b/src/utils/semver.ts @@ -0,0 +1,45 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +const VPAT = /^\d+(\.\d+){0,2}$/; + +/** + * Compares two versions + * @return true if local is up to date, false otherwise + * @param local + * @param remote + */ +export function upToDate(local: string, remote: string) { + if (!local || !remote || local.length === 0 || remote.length === 0) + return false; + if (local == remote) return true; + if (VPAT.test(local) && VPAT.test(remote)) { + const lparts = local.split('.'); + while (lparts.length < 3) lparts.push('0'); + const rparts = remote.split('.'); + while (rparts.length < 3) rparts.push('0'); + for (let i = 0; i < 3; i++) { + const l = parseInt(lparts[i], 10); + const r = parseInt(rparts[i], 10); + if (l === r) continue; + return l > r; + } + return true; + } else { + return local >= remote; + } +} diff --git a/src/utils/sleep.ts b/src/utils/sleep.ts new file mode 100644 index 000000000..d19a17b03 --- /dev/null +++ b/src/utils/sleep.ts @@ -0,0 +1,20 @@ +/* + * This file is part of WPPConnect. + * + * WPPConnect is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WPPConnect is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with WPPConnect. If not, see . + */ + +export function sleep(time: number): Promise { + return new Promise((resolve: TimerHandler) => setTimeout(resolve, time)); +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 000000000..cfecd74d3 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,66 @@ +{ + "compilerOptions": { + /* Basic Options */ + "target": "es5" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */, + "resolveJsonModule": true, + "module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */, + // "lib": [], /* Specify library files to be included in the compilation. */ + // "allowJs": true, /* Allow javascript files to be compiled. */ + // "checkJs": true, /* Report errors in .js files. */ + // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ + "declaration": true /* Generates corresponding '.d.ts' file. */, + // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ + "sourceMap": false /* Generates corresponding '.map' file. */, + // "outFile": "./", /* Concatenate and emit output to single file. */ + "outDir": "./dist" /* Redirect output structure to the directory. */, + // "rootDir": "./src/", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ + // "composite": true, /* Enable project compilation */ + "removeComments": false /* Do not emit comments to output. */, + // "noEmit": true, /* Do not emit outputs. */ + // "importHelpers": true, /* Import emit helpers from 'tslib'. */ + // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ + // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ + + /* Strict Type-Checking Options */ + // "strict": true, /* Enable all strict type-checking options. */ + // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* Enable strict null checks. */ + // "strictFunctionTypes": true, /* Enable strict checking of function types. */ + // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ + // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ + // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ + + /* Additional Checks */ + // "noUnusedLocals": true, /* Report errors on unused locals. */ + // "noUnusedParameters": true, /* Report errors on unused parameters. */ + // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ + // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ + + /* Module Resolution Options */ + // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ + // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ + // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ + // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ + // "typeRoots": [], /* List of folders to include type definitions from. */ + "types": [ + "./src/types/WAPI", + "@types/mocha" + ] /* Type declaration files to be included in compilation. */, + // "allowSyntheticDefaultImports": true /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */, + "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */, + // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ + "skipLibCheck": true, + + /* Source Map Options */ + // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ + // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ + + /* Experimental Options */ + "experimentalDecorators": true /* Enables experimental support for ES7 decorators. */, + "emitDecoratorMetadata": true /* Enables experimental support for emitting type metadata for decorators. */ + }, + "include": ["src/**/*"], + "exclude": ["img/*", "src/tests/**/*"] +} diff --git a/typedoc.json b/typedoc.json new file mode 100644 index 000000000..811de49e8 --- /dev/null +++ b/typedoc.json @@ -0,0 +1,14 @@ +{ + "$schema": "https://typedoc.org/schema.json", + "disableSources": false, + "entryPoints": ["src/index.ts"], + "excludeExternals": false, + "excludePrivate": true, + "excludeProtected": true, + "includeVersion": true, + "out": "api-docs", + "gaID": "G-LTZL26963K", + "visibilityFilters": { + "external": false + } +} From 89d9b25a1d87442ff3488e329faa00ac71bf5545 Mon Sep 17 00:00:00 2001 From: gekkedev <17025257+gekkedev@users.noreply.github.com> Date: Wed, 12 Jun 2024 14:11:19 +0000 Subject: [PATCH 08/12] Revert "Create incoming-call.ts" This reverts commit 815b90afa89001c2e29113459fefd6de8c07a8e2. --- src/api/model/incoming-call.ts | 34 ---------------------------------- 1 file changed, 34 deletions(-) delete mode 100644 src/api/model/incoming-call.ts diff --git a/src/api/model/incoming-call.ts b/src/api/model/incoming-call.ts deleted file mode 100644 index e24061c2b..000000000 --- a/src/api/model/incoming-call.ts +++ /dev/null @@ -1,34 +0,0 @@ -/* - * This file is part of WPPConnect. - * - * WPPConnect is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * WPPConnect is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with WPPConnect. If not, see . - */ - -export interface IncomingCall { - /** alphanumeric ID of the call, can e.g. usable for hanging up */ - id: string, - /** ID of the caller, can be used to message them directly */ - peerJid: string, - /** Epoch timestamp (seconds) */ - offerTime: number, - isVideo: boolean, - isGroup: boolean, - groupJid: string | null, - canHandleLocally: boolean, - outgoing: boolean, - isSilenced: boolean, - offerReceivedWhileOffline: boolean, - webClientShouldHandle: boolean, - participants: any[] -} From 48063621b6a144dee90d54c66d13c446316fa1e0 Mon Sep 17 00:00:00 2001 From: gekkedev <17025257+gekkedev@users.noreply.github.com> Date: Wed, 12 Jun 2024 14:11:40 +0000 Subject: [PATCH 09/12] Revert "Update listener.layer.ts" This reverts commit d701108c94f50ceb4fcd05148d5bc1cc62b5d858. --- src/api/layers/listener.layer.ts | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/api/layers/listener.layer.ts b/src/api/layers/listener.layer.ts index 51e0898c7..bf661851b 100644 --- a/src/api/layers/listener.layer.ts +++ b/src/api/layers/listener.layer.ts @@ -28,7 +28,6 @@ import { ParticipantEvent, PresenceEvent, Wid, - IncomingCall, } from '../model'; import { MessageType, SocketState, SocketStream } from '../model/enum'; import { InterfaceMode } from '../model/enum/interface-mode'; @@ -502,16 +501,18 @@ export class ListenerLayer extends ProfileLayer { } /** - * @event Listen for incoming calls, whether audio or video (pending a reaction). - * To reject the call, simply call `rejectCall` {@link rejectCall} - * @returns Disposable object to stop listening + * @event Escuta por ligações recebidas, seja de áudio ou vídeo. + * + * Para recusar a ligação, basta chamar o `rejectCall` {@link rejectCall} + * + * @returns Objeto descartável para parar de ouvir */ - public onIncomingCall(callback: (call: IncomingCall) => any) { + public onIncomingCall(callback: (call: any) => any) { return this.registerEvent('onIncomingCall', callback); } /** - * Listens to presence changed, by default, it will be triggered for active chats only or contacts subscribed (see {@link subscribePresence}) + * Listens to presence changed, by default, it will triggered for active chats only or contacts subscribed (see {@link subscribePresence}) * @event Listens to presence changed * @param callback Callback of on presence changed * @returns Disposable object to stop the listening From 78f9f1854d5060a4f4cdc8d20d6fe30c7e46b255 Mon Sep 17 00:00:00 2001 From: gekkedev <17025257+gekkedev@users.noreply.github.com> Date: Wed, 12 Jun 2024 14:12:02 +0000 Subject: [PATCH 10/12] Revert "Update index.ts" This reverts commit 1743ac8af8915ca3190cf6baa5f694805de25642. --- src/api/model/index.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/api/model/index.ts b/src/api/model/index.ts index 4a7cff578..e952bfe15 100644 --- a/src/api/model/index.ts +++ b/src/api/model/index.ts @@ -28,7 +28,6 @@ export { LiveLocation } from './live-location'; export { ContactStatus } from './contact-status'; export { GroupCreation } from './group-creation'; export { WhatsappProfile } from './whatsapp-profile'; -export { IncomingCall } from './incoming-call'; export * from './result'; export * from './get-messages-param'; export * from './initializer'; From 9029c720f04c7f7fc79c0b76b5e7d6a68fd70fd3 Mon Sep 17 00:00:00 2001 From: gekkedev <17025257+gekkedev@users.noreply.github.com> Date: Wed, 12 Jun 2024 14:15:57 +0000 Subject: [PATCH 11/12] corrected an enum typo --- src/api/model/enum/group-notification-type.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/api/model/enum/group-notification-type.ts b/src/api/model/enum/group-notification-type.ts index 54cd1da0b..5c42528b3 100644 --- a/src/api/model/enum/group-notification-type.ts +++ b/src/api/model/enum/group-notification-type.ts @@ -17,7 +17,7 @@ export enum GroupNotificationType { Add = 'add', - Inivite = 'invite', + Invite = 'invite', Remove = 'remove', Leave = 'leave', Subject = 'subject', From 8d51f779af4c93698c5703a01c21752babaab614 Mon Sep 17 00:00:00 2001 From: gekkedev <17025257+gekkedev@users.noreply.github.com> Date: Thu, 17 Oct 2024 12:44:26 +0200 Subject: [PATCH 12/12] fix: desconnectedMobile spelling --- docs/getting-started/creating-client.md | 6 +++--- examples/rest/index.js | 2 +- src/api/model/enum/status-find.ts | 4 ++-- src/api/whatsapp.ts | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/getting-started/creating-client.md b/docs/getting-started/creating-client.md index 733af456e..35537d932 100644 --- a/docs/getting-started/creating-client.md +++ b/docs/getting-started/creating-client.md @@ -42,7 +42,7 @@ wppconnect.create({ console.log('urlCode (data-ref): ', urlCode); }, statusFind: (statusSession, session) => { - console.log('Status Session: ', statusSession); //return isLogged || notLogged || browserClose || qrReadSuccess || qrReadFail || autocloseCalled || desconnectedMobile || deleteToken + console.log('Status Session: ', statusSession); //return isLogged || notLogged || browserClose || qrReadSuccess || qrReadFail || autocloseCalled || disconnectedMobile || deleteToken //Create session wss return "serverClose" case server for close console.log('Session name: ', session); }, @@ -87,7 +87,7 @@ More details in {@link StatusFind} | `qrReadSuccess` | If the user is not logged in, the QR code is passed on the terminal a callback is returned. After the correct reading by cell phone this parameter is returned | | `qrReadFail` | If the browser stops when the QR code scan is in progress, this parameter is returned | | `autocloseCalled` | The browser was closed using the autoClose command | -| `desconnectedMobile` | Client has disconnected in to mobile | +| `disconnectedMobile` | Client has disconnected to the mobile device | | `serverClose` | Client has disconnected in to wss | | `deleteToken` | If you pass true within the function `client.getSessionTokenBrowser(true)` | @@ -97,7 +97,7 @@ wppconnect .create({ session: 'sessionName', statusFind: (statusSession, session) => { - // return: isLogged || notLogged || browserClose || qrReadSuccess || qrReadFail || autocloseCalled || desconnectedMobile || deleteToken + // return: isLogged || notLogged || browserClose || qrReadSuccess || qrReadFail || autocloseCalled || disconnectedMobile || deleteToken console.log('Status Session: ', statusSession); // create session wss return "serverClose" case server for close console.log('Session name: ', session); diff --git a/examples/rest/index.js b/examples/rest/index.js index fdef4bbba..5747b2748 100644 --- a/examples/rest/index.js +++ b/examples/rest/index.js @@ -96,7 +96,7 @@ async function startWPP (){ catchQR: (base64Qr, asciiQR, attempts, urlCode) => { }, statusFind: (statusSession, session) => { - console.log('Status Session: ', statusSession); //return isLogged || notLogged || browserClose || qrReadSuccess || qrReadFail || autocloseCalled || desconnectedMobile || deleteToken + console.log('Status Session: ', statusSession); //return isLogged || notLogged || browserClose || qrReadSuccess || qrReadFail || autocloseCalled || disconnectedMobile || deleteToken //Create session wss return "serverClose" case server for close console.log('Session name: ', session); }, diff --git a/src/api/model/enum/status-find.ts b/src/api/model/enum/status-find.ts index 251dab918..050a9352b 100644 --- a/src/api/model/enum/status-find.ts +++ b/src/api/model/enum/status-find.ts @@ -28,9 +28,9 @@ export enum StatusFind { */ browserClose = 'browserClose', /** - * Client has disconnected in to mobile. + * Client has disconnected to the mobile device. */ - desconnectedMobile = 'desconnectedMobile', + disconnectedMobile = 'disconnectedMobile', /** * Client is ready to send and receive messages. */ diff --git a/src/api/whatsapp.ts b/src/api/whatsapp.ts index 78428a05d..70011c5ff 100644 --- a/src/api/whatsapp.ts +++ b/src/api/whatsapp.ts @@ -54,7 +54,7 @@ export class Whatsapp extends BusinessLayer { setTimeout(async () => { if (this.statusFind) { try { - this.statusFind('desconnectedMobile', session); + this.statusFind('disconnectedMobile', session); } catch (error) {} } }, 1000);