@vanzxy/baileys 2.0.2 → 2.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -74,7 +74,7 @@
74
74
  - [💖 Support](#-support)
75
75
  - [👑 Maintainer](#-maintainer)
76
76
  - [⚠️ Disclaimer](#-disclaimer)
77
- - [📝 Patch Notes](#-v7-patch-notes)
77
+ - [📝 Patch Notes](#-v8-patch-notes)
78
78
 
79
79
  </details>
80
80
 
@@ -246,6 +246,8 @@ Audio status uses a more compatible implementation to avoid unsupported-version
246
246
  ### AIRich — the rich-response message builder
247
247
  A chainable builder (`AIRich`, also exported as `AIVanzxy` / `LeafRich` / `VanzxyAI` / `VanzxyRich`) with 40+ `add*()`/`set*()` methods covering headings, formatted text (hyperlinks/citations/LaTeX), code blocks, tables, image/video/product/post cards, task & progress cards, tip banners, and quick-reply suggestions — the kind of rich card layout you'd normally only see from an official AI/assistant-style bot. See [Usage Examples](#airich--rich-response-cards) below.
248
248
 
249
+ > **Experimental (V8):** `build()` now also populates the proto's `originalRecipientMetadata` field (previously left unset) with the same section payload as `unifiedResponse`. This is a fix for AI-response bubbles collapsing into WhatsApp's "Baca selengkapnya"/"Read more" fold earlier than expected while being built up live via `sendEdit()`. Pending live-traffic confirmation — report back if you still see early truncation.
250
+
249
251
  ### Native Flow Expansion
250
252
 
251
253
  <table>
@@ -530,8 +532,26 @@ Every message builder lives in its own file under `lib/Builders/`, so you can tr
530
532
  | `Album.js` | `Album` | Media-group/album builder — bundles 2+ images/videos. Thin wrapper: the actual cover + delayed-follow-up sending is already handled by the `content.album` shorthand in `Socket/messages-send.js`. |
531
533
  | `AIRich.js` | `AIRich` (+ aliases `ORich`, `AIVanzxy`, `LeafRich`, `VanzxyAI`, `VanzxyRich`, `RichVanzxy`) | The rich AI-assistant-style response builder described above — headings, formatted text, tables, media/product/post cards, task/progress cards, tip banners, quick-reply suggestions. |
532
534
  | `A2UI.js` | `A2UI`, `sendA2UIWidget` | Lower-level A2UI/Bloks widget builder. Builds the flat `components` tree (Column/Row → `children`, Card/Button → `child`, Modal → `trigger`/`content`) that Bloks widgets expect and sends it through the same `getBizBinaryNode()` path as `Button`/`ButtonV2`, so the wire-level node always matches the button names actually sent. |
533
- | `VanzxyBaileys.js` | `VanzxyBaileys` | A unified builder **hub**one object that wraps all the builders above behind short method names (`.button()`, `.buttonV2()`, `.buttonV3()`, `.carousel()`, `.poll()`, `.nativeFlow()`, `.location()`, `.contact()`, `.album()`, `.airich()`, `.a2ui()`), plus PascalCase aliases (`.Button()`, `.Carousel()`, `.Poll()`, `.NativeFlow()`, `.Location()`, `.Contact()`, `.Album()`, `.AIRich()`, `.A2UI()`) for developers who prefer that naming style. Nothing new is implemented here it's purely a single entry point over the individual classes. |
534
- | `index.js` | everything above, plus `MESSAGE_BUILDER_VERSION` | The barrel filere-exports every builder and its aliases so `import { Button, Poll, AIRich, VanzxyBaileys } from '@vanzxy/baileys'` works without reaching into individual files. `MESSAGE_BUILDER_VERSION` tracks the builder API surface's own version, independent of the package version (currently `5.0`). |
535
+ | `LinkPreview.js` | `bindLinkPreview` | Not a builder classa function that binds a `sendLinkPreview(jid, text, link, title, description, thumbnail, options)` method directly onto a Baileys socket instance. Builds the `linkPreview` context (matched text, title, description, optional thumbnail via `prepareWAMessageMedia`) and sends it through the socket's own `sendMessage`. Called automatically when you construct `VanzxyBaileys(sock)`; call it yourself (`bindLinkPreview(sock)`) if you're not using the hub. |
536
+ | `VanzxyBaileys.js` | `VanzxyBaileys` | A unified builder **hub** one object that wraps all the builders above behind short method names (`.button()`, `.buttonV2()`, `.buttonV3()`, `.carousel()`, `.poll()`, `.nativeFlow()`, `.location()`, `.contact()`, `.album()`, `.airich()`, `.a2ui()`), plus PascalCase aliases (`.Button()`, `.Carousel()`, `.Poll()`, `.NativeFlow()`, `.Location()`, `.Contact()`, `.Album()`, `.AIRich()`, `.A2UI()`) for developers who prefer that naming style. The constructor also runs `bindLinkPreview()` on the socket you pass in, so `vx.client.sendLinkPreview(...)` is available immediately. Nothing new is implemented here — it's purely a single entry point over the individual classes. |
537
+ | `index.js` | everything above, plus `MESSAGE_BUILDER_VERSION` | The barrel file — re-exports every builder and its aliases so `import { Button, Poll, AIRich, VanzxyBaileys, bindLinkPreview } from '@vanzxy/baileys'` works without reaching into individual files. `MESSAGE_BUILDER_VERSION` tracks the builder API surface's own version, independent of the package version (currently `5.0`). |
538
+
539
+ **Link preview example** — works on any socket, with or without the `VanzxyBaileys` hub:
540
+
541
+ ```js
542
+ import { bindLinkPreview } from '@vanzxy/baileys'
543
+
544
+ const sock = bindLinkPreview(makeWASocket({ /* ... */ }))
545
+
546
+ await sock.sendLinkPreview(
547
+ jid,
548
+ 'Cek repo ini deh',
549
+ 'https://github.com/vanzxysenpai/vanzxybaileys',
550
+ 'vanzxybaileys',
551
+ 'Extended interactive messages & native flow, built on WhiskeySockets/Baileys.',
552
+ { url: 'https://files.catbox.moe/l72xji.svg' } // optional thumbnail
553
+ )
554
+ ```
535
555
 
536
556
  **Unified hub example** — useful if you'd rather carry one object around than import each builder individually:
537
557
 
@@ -830,6 +850,14 @@ Use responsibly and follow WhatsApp Terms of Service.
830
850
 
831
851
  ---
832
852
 
853
+ ## 📝 V8 Patch Notes
854
+
855
+ - Added `LinkPreview.js` to `lib/Builders/`: `bindLinkPreview(sock)` attaches a `sendLinkPreview(jid, text, link, title, description, thumbnail, options)` method directly to a socket instance (matched-text/title/description + optional thumbnail via `prepareWAMessageMedia`). Wired into `index.js`'s exports and auto-applied inside the `VanzxyBaileys` constructor, so `new VanzxyBaileys(sock)` gives you `sendLinkPreview` for free. See the [Builders Folder Map](#-builders-folder-map-libbuilders) for the usage example.
856
+ - **Experimental AIRich fix:** `AIRich.build()` now populates the previously-unset `richResponseMessage.originalRecipientMetadata` proto field with the same section payload as `unifiedResponse`. Working hypothesis is that WhatsApp's client uses this field to decide full/expanded rendering for an AI-response bubble's original recipient, and its absence was causing live-built AIRich bubbles to collapse into "Baca selengkapnya" earlier than they should while still mid-`sendEdit()` build. Not yet confirmed against live traffic — flag it if the early collapse persists or if this introduces a regression.
857
+ - Corrected `package.json`'s `version` field from `2.0.6` back to `2.0.3`. `2.0.6` was never reached through this fork's own release process — it got bumped out of sequence, so the version number is reset to the correct next step.
858
+
859
+ ---
860
+
833
861
  ## 📝 V7 Patch Notes
834
862
 
835
863
  - Added four new builders to `lib/Builders/` (see the [📁 Builders Folder Map](#-builders-folder-map-libbuilders) for details), wired into both `index.js` and the `VanzxyBaileys` hub:
@@ -161,6 +161,11 @@ class AIRich extends BaseBuilder {
161
161
  });
162
162
  }
163
163
 
164
+ /** Alias — .d.ts documents this as "addHeading" (FOATextPrimitive), source only ever exposed addFOAText(). */
165
+ addHeading(text, options = {}) {
166
+ return this.addFOAText(text, options);
167
+ }
168
+
164
169
  addFOAText(text, { id, replace, insertAt } = {}) {
165
170
  if (typeof text !== 'string') {
166
171
  throw new TypeError('Text must be a string');
@@ -772,6 +777,277 @@ class AIRich extends BaseBuilder {
772
777
  });
773
778
  }
774
779
 
780
+ addQuotaUpsell(data, { id, replace, insertAt } = {}) {
781
+ if (!data || typeof data !== 'object' || Array.isArray(data)) {
782
+ throw new TypeError('Quota upsell must be an object');
783
+ }
784
+
785
+ if (typeof data.title !== 'string' || !data.title) {
786
+ throw new TypeError('addQuotaUpsell() requires a "title"');
787
+ }
788
+
789
+ const buttons = Array.isArray(data.buttons) ? data.buttons : [];
790
+
791
+ const primitive = {
792
+ __typename: 'GenAIMetaSubsQuotaUpsellPrimitive',
793
+ title: data.title,
794
+ body_line1: data.body_line1 ?? data.body ?? '',
795
+ body_line2: data.body_line2 ?? '',
796
+
797
+ buttons: buttons.map((btn) => ({
798
+ __typename: 'GenAIMetaSubsQuotaUpsellButton',
799
+ label: btn.label ?? '',
800
+ action: btn.action ?? 'OPEN_DEEPLINK',
801
+ deeplink: btn.deeplink ?? '',
802
+ })),
803
+ };
804
+
805
+ const section = AIRich.newLayout('Single', primitive);
806
+
807
+ const submessage = this.createAlert('GenAIMetaSubsQuotaUpsellPrimitive');
808
+
809
+ return this._addContent(section, submessage, {
810
+ id,
811
+ replace,
812
+ insertAt,
813
+ });
814
+ }
815
+
816
+ /** GenAIDividerPrimitive — plain horizontal line, no content. */
817
+ addDivider({ id, replace, insertAt } = {}) {
818
+ const section = AIRich.newLayout('Single', {
819
+ __typename: 'GenAIDividerPrimitive',
820
+ });
821
+
822
+ return this._addContent(section, undefined, {
823
+ id,
824
+ replace,
825
+ insertAt,
826
+ });
827
+ }
828
+
829
+ /** GenAISpacerPrimitive — blank vertical spacing. */
830
+ addSpacer(spacing, { id, replace, insertAt } = {}) {
831
+ const section = AIRich.newLayout('Single', {
832
+ spacing,
833
+ __typename: 'GenAISpacerPrimitive',
834
+ });
835
+
836
+ return this._addContent(section, undefined, {
837
+ id,
838
+ replace,
839
+ insertAt,
840
+ });
841
+ }
842
+
843
+ /**
844
+ * GenAILatexItem — corrected after cross-checking an older, actually-shipped build
845
+ * (MessageBuilder v4.7, pre-dates this primitive-card guess). LaTeX in this ecosystem
846
+ * is NOT a standalone card — the real, working mechanism is an inline entity inside
847
+ * addText()'s own extractIE() parser (`[expr|width|height|font_height|padding]<imageUrl>`
848
+ * syntax), and it requires a PRE-RENDERED image of the equation — WhatsApp does not
849
+ * render raw LaTeX text client-side. The previous addLatex() (standalone
850
+ * GenAILatexUXPrimitive card, text-only) was confirmed via eval to render blank because
851
+ * that primitive/approach never existed in the first place. This version is a thin
852
+ * wrapper around the real, already-working addText() inline syntax.
853
+ */
854
+ addLatex(expression, { url, width, height, font_height, padding, id, replace, insertAt } = {}) {
855
+ if (typeof expression !== 'string' || !expression) {
856
+ throw new TypeError('addLatex(expression) requires a non-empty string');
857
+ }
858
+
859
+ if (!url) {
860
+ throw new TypeError('addLatex() requires a pre-rendered equation image "url" — WhatsApp renders LaTeX as an inline image, not raw text');
861
+ }
862
+
863
+ const extras = [width, height, font_height, padding];
864
+
865
+ while (extras.length && extras[extras.length - 1] == null) {
866
+ extras.pop();
867
+ }
868
+
869
+ const raw = [expression, ...extras].join('|');
870
+
871
+ return this.addText(`[${raw}]<${url}>`, {
872
+ id,
873
+ replace,
874
+ insertAt,
875
+ });
876
+ }
877
+
878
+ /**
879
+ * GenAIInlineImageUXPrimitive — messageType 3 (INLINE_IMAGE) submessage, field layout
880
+ * ported from rich-message-utils.js toUnified() INLINE_IMAGE case (same image-url-object
881
+ * fix as addImage()/bug 40 round 2), not guessed from the .d.ts alone.
882
+ */
883
+ addInlineImage(imageUrl, { text = '', alignment = 'center', tapLinkUrl = '', resolveUrl = false, id, replace, insertAt } = {}) {
884
+ if (!(typeof imageUrl === 'string' || Buffer.isBuffer(imageUrl))) {
885
+ throw new TypeError('imageUrl must be string | buffer');
886
+ }
887
+
888
+ const url = Toolkit.resolveMedia(this.#client, imageUrl, 'image', { resolveUrl });
889
+
890
+ const ALIGNMENT_INDEX = { leading: 0, trailing: 1, center: 2 };
891
+ const ALIGNMENT_NAME = ['AI_RICH_RESPONSE_IMAGE_LAYOUT_LEADING_ALIGNED', 'AI_RICH_RESPONSE_IMAGE_LAYOUT_TRAILING_ALIGNED', 'AI_RICH_RESPONSE_IMAGE_LAYOUT_CENTER_ALIGNED'];
892
+ const alignmentIndex = ALIGNMENT_INDEX[String(alignment).toLowerCase()] ?? ALIGNMENT_INDEX.center;
893
+
894
+ const section = AIRich.newLayout('Single', {
895
+ image_url: {
896
+ image_preview_url: url,
897
+ image_high_res_url: url,
898
+ source_url: url,
899
+ },
900
+ image_text: text,
901
+ alignment: ALIGNMENT_NAME[alignmentIndex],
902
+ tap_link_url: tapLinkUrl,
903
+ __typename: 'GenAIInlineImageUXPrimitive',
904
+ });
905
+
906
+ const submessage = {
907
+ messageType: 3,
908
+ imageMetadata: {
909
+ imageUrl: { imagePreviewUrl: url, imageHighResUrl: url, sourceUrl: url },
910
+ imageText: text,
911
+ alignment: alignmentIndex,
912
+ tapLinkUrl,
913
+ },
914
+ };
915
+
916
+ return this._addContent(section, submessage, {
917
+ id,
918
+ replace,
919
+ insertAt,
920
+ });
921
+ }
922
+
923
+ /**
924
+ * GenAIContentItemsUXPrimitive — messageType 9 (CONTENT_ITEMS) submessage, ported from
925
+ * rich-message-utils.js toUnified() CONTENT_ITEMS case (bug 40: was returning {}).
926
+ */
927
+ addContentItems(items = [], { content_type = 1, id, replace, insertAt } = {}) {
928
+ if (!Array.isArray(items)) {
929
+ throw new TypeError('addContentItems() requires an array of items');
930
+ }
931
+
932
+ const section = AIRich.newLayout('Single', {
933
+ items,
934
+ content_type,
935
+ __typename: 'GenAIContentItemsUXPrimitive',
936
+ });
937
+
938
+ const submessage = {
939
+ messageType: 9,
940
+ contentItemsMetadata: {
941
+ itemsMetadata: items,
942
+ contentType: content_type,
943
+ },
944
+ };
945
+
946
+ return this._addContent(section, submessage, {
947
+ id,
948
+ replace,
949
+ insertAt,
950
+ });
951
+ }
952
+
953
+ /** GenAIBotProgressStatusPrimitive — one-shot "searching/working" status chip. */
954
+ addProgressStatus(title, { icon, is_in_progress = true, target_secondary_screen_id, target_secondary_screen_tab_id, id, replace, insertAt } = {}) {
955
+ if (typeof title !== 'string' || !title) {
956
+ throw new TypeError('addProgressStatus() requires a "title"');
957
+ }
958
+
959
+ const section = AIRich.newLayout('Single', {
960
+ title,
961
+ icon,
962
+ is_in_progress,
963
+ target_secondary_screen_id,
964
+ target_secondary_screen_tab_id,
965
+ __typename: 'GenAIBotProgressStatusPrimitive',
966
+ });
967
+
968
+ const submessage = this.createAlert('GenAIBotProgressStatusPrimitive');
969
+
970
+ return this._addContent(section, submessage, {
971
+ id,
972
+ replace,
973
+ insertAt,
974
+ });
975
+ }
976
+
977
+ /** GenAIBotThinkingStatusPrimitive — one-shot "thinking" status chip. */
978
+ addThinkingStatus(title, { icon, is_in_progress = true, target_secondary_screen_id, target_secondary_screen_tab_id, textFallback = true, id, replace, insertAt } = {}) {
979
+ if (typeof title !== 'string' || !title) {
980
+ throw new TypeError('addThinkingStatus() requires a "title"');
981
+ }
982
+
983
+ const section = AIRich.newLayout('Single', {
984
+ title,
985
+ icon,
986
+ is_in_progress,
987
+ target_secondary_screen_id,
988
+ target_secondary_screen_tab_id,
989
+ __typename: 'GenAIBotThinkingStatusPrimitive',
990
+ });
991
+
992
+ const submessage = textFallback ? this.createAlert('GenAIBotThinkingStatusPrimitive') : undefined;
993
+
994
+ return this._addContent(section, submessage, {
995
+ id,
996
+ replace,
997
+ insertAt,
998
+ });
999
+ }
1000
+
1001
+ /** FOABloksPrimitive — raw Bloks payload; most experimental primitive, fields passed through as-is. */
1002
+ addBloks(data, { id, replace, insertAt } = {}) {
1003
+ if (!data || typeof data !== 'object' || Array.isArray(data)) {
1004
+ throw new TypeError('Bloks payload must be an object');
1005
+ }
1006
+
1007
+ if (typeof data.type !== 'string' || !data.type) {
1008
+ throw new TypeError('addBloks() requires a "type"');
1009
+ }
1010
+
1011
+ const { textFallback = true, ...rest } = data;
1012
+
1013
+ const section = AIRich.newLayout('Single', {
1014
+ ...rest,
1015
+ __typename: 'FOABloksPrimitive',
1016
+ });
1017
+
1018
+ const submessage = textFallback ? this.createAlert('FOABloksPrimitive') : undefined;
1019
+
1020
+ return this._addContent(section, submessage, {
1021
+ id,
1022
+ replace,
1023
+ insertAt,
1024
+ });
1025
+ }
1026
+
1027
+ /**
1028
+ * GenAIImaginePrimitive with status GENERATING — pending-generation placeholder.
1029
+ * Mirrors addVideo()'s ANIMATE/GENERATING branch but with no media yet.
1030
+ */
1031
+ addGenerating({ imagine_type = 'IMAGE', estimated_completion_time, textFallback = true, id, replace, insertAt } = {}) {
1032
+ const section = AIRich.newLayout('Single', {
1033
+ imagine_type,
1034
+ status: {
1035
+ status: 'GENERATING',
1036
+ // Matches addVideo()'s convention: input is a ms-from-now duration, stored as a unix-seconds timestamp.
1037
+ estimated_completion_time: estimated_completion_time != null ? Math.floor((Date.now() + estimated_completion_time) / 1000) : undefined,
1038
+ },
1039
+ __typename: 'GenAIImaginePrimitive',
1040
+ });
1041
+
1042
+ const submessage = textFallback ? this.createAlert(`GenAIImaginePrimitive (${imagine_type === 'ANIMATE' ? 'ANIMATE' : 'IMAGE'} GENERATING)`) : undefined;
1043
+
1044
+ return this._addContent(section, submessage, {
1045
+ id,
1046
+ replace,
1047
+ insertAt,
1048
+ });
1049
+ }
1050
+
775
1051
  addSuggest(suggestion, { scroll = true, layout, id, replace, insertAt } = {}) {
776
1052
  if (!(typeof suggestion === 'string' || (Array.isArray(suggestion) && suggestion.every((v) => typeof v === 'string')))) {
777
1053
  throw new TypeError('Suggestion must be a string or array of strings');
@@ -875,6 +1151,9 @@ class AIRich extends BaseBuilder {
875
1151
  unifiedResponse: {
876
1152
  data: includesUnifiedResponse ? Buffer.from(Toolkit.stringifyEscaped({ response_id: this._responseId, sections })).toString('base64') : '',
877
1153
  },
1154
+ originalRecipientMetadata: {
1155
+ data: includesUnifiedResponse ? Buffer.from(Toolkit.stringifyEscaped({ response_id: this._responseId, sections })).toString('base64') : '',
1156
+ },
878
1157
  contextInfo: {
879
1158
  ...forward,
880
1159
  ...qObj,
@@ -0,0 +1,74 @@
1
+ import { prepareWAMessageMedia } from './shared.js';
2
+
3
+ /**
4
+ * Binds `sendLinkPreview` onto a Baileys socket instance.
5
+ *
6
+ * Ported from MessageBuilder.js's `bind()` helper (present upstream in
7
+ * MessageBuilderV4.7 / "mb"'s build, but missing from this fork).
8
+ *
9
+ * Usage:
10
+ * import { bindLinkPreview } from '@vanzxy/baileys';
11
+ * const sock = bindLinkPreview(makeWASocket({ ... }));
12
+ * await sock.sendLinkPreview(jid, 'check this out', 'https://example.com', 'Example Title');
13
+ */
14
+ function bindLinkPreview(client) {
15
+ if (!client) {
16
+ throw new Error('Socket is required');
17
+ }
18
+
19
+ return Object.defineProperties(client, {
20
+ sendLinkPreview: {
21
+ configurable: true,
22
+ writable: true,
23
+ async value(jid, text, link, title, description, thumbnail, options = {}) {
24
+ if (typeof jid !== 'string') {
25
+ throw new TypeError('jid is not string');
26
+ }
27
+ if (typeof text !== 'string') {
28
+ throw new TypeError('text is not string');
29
+ }
30
+ if (typeof link !== 'string') {
31
+ throw new TypeError('link is not string');
32
+ }
33
+ if (typeof title !== 'string') {
34
+ throw new TypeError('title is not string');
35
+ }
36
+ if (description && typeof description !== 'string') {
37
+ throw new TypeError('description is not string');
38
+ }
39
+ if (thumbnail && !Buffer.isBuffer(thumbnail) && typeof thumbnail.url !== 'string') {
40
+ throw new TypeError('thumbnail must be Buffer or object with url key');
41
+ }
42
+
43
+ const image = thumbnail
44
+ ? await prepareWAMessageMedia(
45
+ { image: thumbnail },
46
+ {
47
+ upload: client.waUploadToServer,
48
+ mediaTypeOverride: 'thumbnail-link',
49
+ }
50
+ ).then((v) => v.imageMessage)
51
+ : undefined;
52
+
53
+ text = text.includes(link) ? text : `${link}\n${text}`;
54
+
55
+ return await client.sendMessage(
56
+ jid,
57
+ {
58
+ text,
59
+ linkPreview: {
60
+ 'matched-text': link,
61
+ title,
62
+ description,
63
+ jpegThumbnail: image?.jpegThumbnail,
64
+ highQualityThumbnail: image,
65
+ },
66
+ },
67
+ options
68
+ );
69
+ },
70
+ },
71
+ });
72
+ }
73
+
74
+ export { bindLinkPreview };
@@ -9,6 +9,7 @@ import { NativeFlow } from './NativeFlow.js'
9
9
  import { Location } from './Location.js'
10
10
  import { Contact } from './Contact.js'
11
11
  import { Album } from './Album.js'
12
+ import { bindLinkPreview } from './LinkPreview.js'
12
13
 
13
14
  /**
14
15
  * VanzxyBaileys — unified builder hub.
@@ -24,7 +25,7 @@ class VanzxyBaileys {
24
25
  )
25
26
  }
26
27
 
27
- this.client = client
28
+ this.client = bindLinkPreview(client)
28
29
  }
29
30
 
30
31
  // ===== AIRICH =====
@@ -13,3 +13,4 @@ export { A2UI, sendA2UIWidget } from './A2UI.js';
13
13
  export { AIRich as AIVanzxy, AIRich as LeafRich, AIRich as VanzxyAI, AIRich as VanzxyRich, AIRich as RichVanzxy } from './AIRich.js';
14
14
  export const MESSAGE_BUILDER_VERSION = '5.0';
15
15
  export { VanzxyBaileys } from './VanzxyBaileys.js';
16
+ export { bindLinkPreview } from './LinkPreview.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vanzxy/baileys",
3
- "version": "2.0.2",
3
+ "version": "2.0.3",
4
4
  "description": "Enhanced Baileys fork by Vanzxy — based on @itsliaaa/baileys + @whiskeysockets/baileys with fixes for audio group status and clean media without newsletter button.",
5
5
  "type": "module",
6
6
  "main": "./lib/index.js",