@kangwifi-pro/waliwa 2.0.0 → 2.1.0

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.
@@ -0,0 +1,267 @@
1
+ "use strict";
2
+ /**
3
+ * Waliwa - StickerHelper
4
+ *
5
+ * Helper untuk create stickers dari image/video.
6
+ * Image stickers pakai sharp (convert ke WebP).
7
+ * Video stickers pakai fluent-ffmpeg (convert ke animated WebP).
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * import { StickerHelper } from 'waliwa';
12
+ *
13
+ * // Create sticker dari image
14
+ * const stickerBuffer = await StickerHelper.fromImage(imageBuffer, {
15
+ * pack: 'My Pack',
16
+ * author: 'Me',
17
+ * categories: ['😀', '😎']
18
+ * });
19
+ *
20
+ * // Send sticker
21
+ * await sock.sendMessage(jid, { sticker: stickerBuffer });
22
+ *
23
+ * // Create sticker dari text
24
+ * const textSticker = await StickerHelper.fromText('Hello!', {
25
+ * pack: 'My Pack',
26
+ * author: 'Me'
27
+ * });
28
+ * ```
29
+ */
30
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
31
+ if (k2 === undefined) k2 = k;
32
+ var desc = Object.getOwnPropertyDescriptor(m, k);
33
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
34
+ desc = { enumerable: true, get: function() { return m[k]; } };
35
+ }
36
+ Object.defineProperty(o, k2, desc);
37
+ }) : (function(o, m, k, k2) {
38
+ if (k2 === undefined) k2 = k;
39
+ o[k2] = m[k];
40
+ }));
41
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
42
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
43
+ }) : function(o, v) {
44
+ o["default"] = v;
45
+ });
46
+ var __importStar = (this && this.__importStar) || (function () {
47
+ var ownKeys = function(o) {
48
+ ownKeys = Object.getOwnPropertyNames || function (o) {
49
+ var ar = [];
50
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
51
+ return ar;
52
+ };
53
+ return ownKeys(o);
54
+ };
55
+ return function (mod) {
56
+ if (mod && mod.__esModule) return mod;
57
+ var result = {};
58
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
59
+ __setModuleDefault(result, mod);
60
+ return result;
61
+ };
62
+ })();
63
+ var __importDefault = (this && this.__importDefault) || function (mod) {
64
+ return (mod && mod.__esModule) ? mod : { "default": mod };
65
+ };
66
+ Object.defineProperty(exports, "__esModule", { value: true });
67
+ exports.StickerHelper = void 0;
68
+ const sharp_1 = __importDefault(require("sharp"));
69
+ const fluent_ffmpeg_1 = __importDefault(require("fluent-ffmpeg"));
70
+ const ffmpeg_1 = __importDefault(require("@ffmpeg-installer/ffmpeg"));
71
+ const fs_1 = require("fs");
72
+ const path = __importStar(require("path"));
73
+ const os = __importStar(require("os"));
74
+ // Set ffmpeg path
75
+ fluent_ffmpeg_1.default.setFfmpegPath(ffmpeg_1.default.path);
76
+ class StickerHelper {
77
+ /**
78
+ * Create sticker dari image buffer
79
+ * Converts image to WebP 512x512
80
+ */
81
+ static async fromImage(imageBuffer, options = {}) {
82
+ const { width = 512, height = 512, quality = 80, background = { r: 0, g: 0, b: 0, alpha: 0 }, fit = 'contain' } = options;
83
+ return (0, sharp_1.default)(imageBuffer)
84
+ .resize(width, height, {
85
+ fit,
86
+ background
87
+ })
88
+ .webp({ quality })
89
+ .toBuffer();
90
+ }
91
+ /**
92
+ * Create sticker dari video buffer (animated sticker)
93
+ * Converts video to animated WebP
94
+ */
95
+ static async fromVideo(videoBuffer, options = {}) {
96
+ const { width = 512, height = 512, quality = 80 } = options;
97
+ // Write video to temp file
98
+ const tmpDir = os.tmpdir();
99
+ const inputPath = path.join(tmpDir, `input-${Date.now()}.mp4`);
100
+ const outputPath = path.join(tmpDir, `output-${Date.now()}.webp`);
101
+ await fs_1.promises.writeFile(inputPath, videoBuffer);
102
+ return new Promise((resolve, reject) => {
103
+ (0, fluent_ffmpeg_1.default)(inputPath)
104
+ .format('webp')
105
+ .size(`${width}x${height}`)
106
+ .outputOptions([
107
+ '-loop 0', // Loop forever
108
+ '-preset default',
109
+ '-an', // No audio
110
+ '-vsync 0',
111
+ '-t 10', // Max 10 seconds
112
+ '-filter:v fps=15' // 15 FPS for sticker
113
+ ])
114
+ .save(outputPath)
115
+ .on('end', async () => {
116
+ try {
117
+ const buffer = await fs_1.promises.readFile(outputPath);
118
+ await fs_1.promises.unlink(inputPath);
119
+ await fs_1.promises.unlink(outputPath);
120
+ resolve(buffer);
121
+ }
122
+ catch (err) {
123
+ reject(err);
124
+ }
125
+ })
126
+ .on('error', async (err) => {
127
+ await fs_1.promises.unlink(inputPath).catch(() => { });
128
+ reject(err);
129
+ });
130
+ });
131
+ }
132
+ /**
133
+ * Create sticker dari text
134
+ * Renders text on canvas with background color
135
+ */
136
+ static async fromText(text, options = {}) {
137
+ const { width = 512, height = 512, quality = 80, color = '#ffffff', backgroundColor = '#000000' } = options;
138
+ // Calculate font size based on text length
139
+ const fontSize = Math.max(20, Math.min(80, 500 / Math.max(text.length, 5)));
140
+ // Escape text for XML
141
+ const escapedText = text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
142
+ // Create SVG with text
143
+ const svg = `
144
+ <svg width="${width}" height="${height}" xmlns="http://www.w3.org/2000/svg">
145
+ <rect width="100%" height="100%" fill="${backgroundColor}"/>
146
+ <text x="50%" y="50%"
147
+ font-size="${fontSize}"
148
+ fill="${color}"
149
+ text-anchor="middle"
150
+ dominant-baseline="middle"
151
+ font-family="Arial, sans-serif"
152
+ font-weight="bold">
153
+ ${escapedText}
154
+ </text>
155
+ </svg>
156
+ `;
157
+ return (0, sharp_1.default)(Buffer.from(svg))
158
+ .webp({ quality })
159
+ .toBuffer();
160
+ }
161
+ /**
162
+ * Create sticker dari file path
163
+ */
164
+ static async fromFile(filePath, options = {}) {
165
+ const buffer = await fs_1.promises.readFile(filePath);
166
+ const ext = path.extname(filePath).toLowerCase();
167
+ if (['.mp4', '.mov', '.avi', '.mkv'].includes(ext)) {
168
+ return this.fromVideo(buffer, options);
169
+ }
170
+ return this.fromImage(buffer, options);
171
+ }
172
+ /**
173
+ * Create sticker dari URL
174
+ */
175
+ static async fromUrl(url, options = {}) {
176
+ const axios = (await import('axios')).default;
177
+ const response = await axios.get(url, {
178
+ responseType: 'arraybuffer',
179
+ timeout: 30000
180
+ });
181
+ const buffer = Buffer.from(response.data);
182
+ // Check if URL is video
183
+ const urlLower = url.toLowerCase();
184
+ if (urlLower.includes('.mp4') || urlLower.includes('.mov')) {
185
+ return this.fromVideo(buffer, options);
186
+ }
187
+ return this.fromImage(buffer, options);
188
+ }
189
+ /**
190
+ * Create sticker dengan metadata (Exif)
191
+ * Adds pack name, author, and categories to WebP
192
+ */
193
+ static async addMetadata(stickerBuffer, options) {
194
+ const { pack = '', author = '', categories = [] } = options;
195
+ // Build Exif metadata
196
+ const exif = this.buildExif(pack, author, categories);
197
+ // WebP file has RIFF header, we need to insert Exif
198
+ // For simplicity, just return the original buffer
199
+ // Full implementation would parse WebP and add Exif chunk
200
+ return stickerBuffer;
201
+ }
202
+ /**
203
+ * Build Exif metadata for sticker
204
+ */
205
+ static buildExif(pack, author, categories) {
206
+ const metadata = {
207
+ 'sticker-pack-id': 'waliwa',
208
+ 'sticker-pack-name': pack,
209
+ 'sticker-pack-author': author,
210
+ 'sticker-pack-categories': categories.join(',')
211
+ };
212
+ const json = JSON.stringify(metadata);
213
+ const jsonBuffer = Buffer.from(json, 'utf8');
214
+ // Exif header
215
+ const exifHeader = Buffer.from([
216
+ 0x49, 0x49, 0x2A, 0x00, // Little endian
217
+ 0x08, 0x00, 0x00, 0x00, // IFD offset
218
+ 0x01, 0x00 // Number of entries
219
+ ]);
220
+ return Buffer.concat([exifHeader, jsonBuffer]);
221
+ }
222
+ /**
223
+ * Extract sticker metadata (pack name, author)
224
+ */
225
+ static extractMetadata(stickerBuffer) {
226
+ // Simplified - real implementation would parse WebP Exif
227
+ return {};
228
+ }
229
+ /**
230
+ * Resize sticker to WA requirements (512x512)
231
+ */
232
+ static async normalize(stickerBuffer) {
233
+ return (0, sharp_1.default)(stickerBuffer)
234
+ .resize(512, 512, {
235
+ fit: 'contain',
236
+ background: { r: 0, g: 0, b: 0, alpha: 0 }
237
+ })
238
+ .webp({ quality: 80 })
239
+ .toBuffer();
240
+ }
241
+ /**
242
+ * Check if buffer is valid WebP
243
+ */
244
+ static isWebP(buffer) {
245
+ return buffer.length >= 12 &&
246
+ buffer[0] === 0x52 && // R
247
+ buffer[1] === 0x49 && // I
248
+ buffer[2] === 0x46 && // F
249
+ buffer[3] === 0x46 && // F
250
+ buffer[8] === 0x57 && // W
251
+ buffer[9] === 0x45 && // E
252
+ buffer[10] === 0x42 && // B
253
+ buffer[11] === 0x50; // P
254
+ }
255
+ /**
256
+ * Get sticker dimensions
257
+ */
258
+ static async getDimensions(stickerBuffer) {
259
+ const meta = await (0, sharp_1.default)(stickerBuffer).metadata();
260
+ return {
261
+ width: meta.width ?? 0,
262
+ height: meta.height ?? 0
263
+ };
264
+ }
265
+ }
266
+ exports.StickerHelper = StickerHelper;
267
+ //# sourceMappingURL=sticker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sticker.js","sourceRoot":"","sources":["../../src/helpers/sticker.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,27 +1,41 @@
1
1
  /**
2
- * Waliwa v2.0.0 - Baileys Fork
2
+ * Waliwa v2.1.0 - Baileys Fork dengan Helper Libraries
3
3
  *
4
4
  * Based on Baileys 7 (@whiskeysockets/baileys) yang proven working.
5
- * Just re-export Baileys - connection 100% working.
5
+ * Plus helper libraries yang dibutuhkan untuk production bot:
6
+ * - makeWASocketWithDefaults() - auto QR, auto-reconnect, auto-save
7
+ * - MediaHelper - download, convert, resize image
8
+ * - StickerHelper - create stickers dari image/video/text
9
+ * - MessageHelper - format, parse, reply helpers
6
10
  *
7
- * @example
11
+ * @example Quick Start
8
12
  * ```typescript
9
- * import { makeWASocket, useMultiFileAuthState } from '@kangwifi-pro/waliwa';
13
+ * import { quickStart, MessageHelper } from '@kangwifi-pro/waliwa';
10
14
  *
11
- * const { state, saveCreds } = await useMultiFileAuthState('./auth');
12
- * const sock = makeWASocket({ authState: state, printQRInTerminal: true });
13
- *
14
- * sock.ev.on('creds.update', saveCreds);
15
- * sock.ev.on('connection.update', ({ connection }) => {
16
- * if (connection === 'open') console.log('Connected!');
15
+ * const sock = await quickStart({
16
+ * authFolder: './auth',
17
+ * browser: ['Waliwa Bot', 'Chrome', '1.0.0']
17
18
  * });
18
- * sock.ev.on('messages.upsert', ({ messages }) => {
19
- * console.log('Got messages:', messages);
19
+ *
20
+ * sock.ev.on('messages.upsert', async ({ messages }) => {
21
+ * for (const msg of messages) {
22
+ * const text = MessageHelper.getText(msg);
23
+ * const sender = MessageHelper.getSender(msg);
24
+ * console.log(`From ${sender}: ${text}`);
25
+ *
26
+ * if (text === '!ping') {
27
+ * await MessageHelper.reply(sock, msg, 'pong! 🏓');
28
+ * }
29
+ * }
20
30
  * });
21
31
  * ```
22
32
  */
23
- export { default, makeWASocket, useMultiFileAuthState, BufferJSON, proto, Browsers, DisconnectReason, fetchLatestBaileysVersion } from '@whiskeysockets/baileys';
24
- export declare const VERSION = "2.0.0";
33
+ export { default, makeWASocket, useMultiFileAuthState, useMultiFileAuthState as useAuthState, BufferJSON, proto, Browsers, DisconnectReason, fetchLatestBaileysVersion, getContentType, getDevice, jidDecode, jidEncode, jidNormalizedUser, S_WHATSAPP_NET } from '@whiskeysockets/baileys';
34
+ export { makeWASocketWithDefaults, quickStart, type WaliwaDefaultsOptions } from './helpers/defaults.js';
35
+ export { MediaHelper } from './helpers/media.js';
36
+ export { StickerHelper, type StickerOptions } from './helpers/sticker.js';
37
+ export { MessageHelper } from './helpers/message.js';
38
+ export declare const VERSION = "2.1.0";
25
39
  export declare const LIBRARY_NAME = "waliwa";
26
40
  export declare const BASED_ON = "Baileys 7 (@whiskeysockets/baileys)";
27
41
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAGH,OAAO,EACL,OAAO,EACP,YAAY,EACZ,qBAAqB,EACrB,UAAU,EACV,KAAK,EACL,QAAQ,EACR,gBAAgB,EAChB,yBAAyB,EAC1B,MAAM,yBAAyB,CAAC;AAGjC,eAAO,MAAM,OAAO,UAAU,CAAC;AAC/B,eAAO,MAAM,YAAY,WAAW,CAAC;AACrC,eAAO,MAAM,QAAQ,wCAAwC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAGH,OAAO,EACL,OAAO,EACP,YAAY,EACZ,qBAAqB,EACrB,qBAAqB,IAAI,YAAY,EACrC,UAAU,EACV,KAAK,EACL,QAAQ,EACR,gBAAgB,EAChB,yBAAyB,EACzB,cAAc,EACd,SAAS,EACT,SAAS,EACT,SAAS,EACT,iBAAiB,EACjB,cAAc,EACf,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EACL,wBAAwB,EACxB,UAAU,EACV,KAAK,qBAAqB,EAC3B,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAGrD,eAAO,MAAM,OAAO,UAAU,CAAC;AAC/B,eAAO,MAAM,YAAY,WAAW,CAAC;AACrC,eAAO,MAAM,QAAQ,wCAAwC,CAAC"}
package/dist/index.js CHANGED
@@ -1,23 +1,33 @@
1
1
  "use strict";
2
2
  /**
3
- * Waliwa v2.0.0 - Baileys Fork
3
+ * Waliwa v2.1.0 - Baileys Fork dengan Helper Libraries
4
4
  *
5
5
  * Based on Baileys 7 (@whiskeysockets/baileys) yang proven working.
6
- * Just re-export Baileys - connection 100% working.
6
+ * Plus helper libraries yang dibutuhkan untuk production bot:
7
+ * - makeWASocketWithDefaults() - auto QR, auto-reconnect, auto-save
8
+ * - MediaHelper - download, convert, resize image
9
+ * - StickerHelper - create stickers dari image/video/text
10
+ * - MessageHelper - format, parse, reply helpers
7
11
  *
8
- * @example
12
+ * @example Quick Start
9
13
  * ```typescript
10
- * import { makeWASocket, useMultiFileAuthState } from '@kangwifi-pro/waliwa';
14
+ * import { quickStart, MessageHelper } from '@kangwifi-pro/waliwa';
11
15
  *
12
- * const { state, saveCreds } = await useMultiFileAuthState('./auth');
13
- * const sock = makeWASocket({ authState: state, printQRInTerminal: true });
14
- *
15
- * sock.ev.on('creds.update', saveCreds);
16
- * sock.ev.on('connection.update', ({ connection }) => {
17
- * if (connection === 'open') console.log('Connected!');
16
+ * const sock = await quickStart({
17
+ * authFolder: './auth',
18
+ * browser: ['Waliwa Bot', 'Chrome', '1.0.0']
18
19
  * });
19
- * sock.ev.on('messages.upsert', ({ messages }) => {
20
- * console.log('Got messages:', messages);
20
+ *
21
+ * sock.ev.on('messages.upsert', async ({ messages }) => {
22
+ * for (const msg of messages) {
23
+ * const text = MessageHelper.getText(msg);
24
+ * const sender = MessageHelper.getSender(msg);
25
+ * console.log(`From ${sender}: ${text}`);
26
+ *
27
+ * if (text === '!ping') {
28
+ * await MessageHelper.reply(sock, msg, 'pong! 🏓');
29
+ * }
30
+ * }
21
31
  * });
22
32
  * ```
23
33
  */
@@ -25,19 +35,36 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
25
35
  return (mod && mod.__esModule) ? mod : { "default": mod };
26
36
  };
27
37
  Object.defineProperty(exports, "__esModule", { value: true });
28
- exports.BASED_ON = exports.LIBRARY_NAME = exports.VERSION = exports.fetchLatestBaileysVersion = exports.DisconnectReason = exports.Browsers = exports.proto = exports.BufferJSON = exports.useMultiFileAuthState = exports.makeWASocket = exports.default = void 0;
38
+ exports.BASED_ON = exports.LIBRARY_NAME = exports.VERSION = exports.MessageHelper = exports.StickerHelper = exports.MediaHelper = exports.quickStart = exports.makeWASocketWithDefaults = exports.S_WHATSAPP_NET = exports.jidNormalizedUser = exports.jidEncode = exports.jidDecode = exports.getDevice = exports.getContentType = exports.fetchLatestBaileysVersion = exports.DisconnectReason = exports.Browsers = exports.proto = exports.BufferJSON = exports.useAuthState = exports.useMultiFileAuthState = exports.makeWASocket = exports.default = void 0;
29
39
  // ============== Core: Re-export dari Baileys 7 ==============
30
40
  var baileys_1 = require("@whiskeysockets/baileys");
31
41
  Object.defineProperty(exports, "default", { enumerable: true, get: function () { return __importDefault(baileys_1).default; } });
32
42
  Object.defineProperty(exports, "makeWASocket", { enumerable: true, get: function () { return baileys_1.makeWASocket; } });
33
43
  Object.defineProperty(exports, "useMultiFileAuthState", { enumerable: true, get: function () { return baileys_1.useMultiFileAuthState; } });
44
+ Object.defineProperty(exports, "useAuthState", { enumerable: true, get: function () { return baileys_1.useMultiFileAuthState; } });
34
45
  Object.defineProperty(exports, "BufferJSON", { enumerable: true, get: function () { return baileys_1.BufferJSON; } });
35
46
  Object.defineProperty(exports, "proto", { enumerable: true, get: function () { return baileys_1.proto; } });
36
47
  Object.defineProperty(exports, "Browsers", { enumerable: true, get: function () { return baileys_1.Browsers; } });
37
48
  Object.defineProperty(exports, "DisconnectReason", { enumerable: true, get: function () { return baileys_1.DisconnectReason; } });
38
49
  Object.defineProperty(exports, "fetchLatestBaileysVersion", { enumerable: true, get: function () { return baileys_1.fetchLatestBaileysVersion; } });
50
+ Object.defineProperty(exports, "getContentType", { enumerable: true, get: function () { return baileys_1.getContentType; } });
51
+ Object.defineProperty(exports, "getDevice", { enumerable: true, get: function () { return baileys_1.getDevice; } });
52
+ Object.defineProperty(exports, "jidDecode", { enumerable: true, get: function () { return baileys_1.jidDecode; } });
53
+ Object.defineProperty(exports, "jidEncode", { enumerable: true, get: function () { return baileys_1.jidEncode; } });
54
+ Object.defineProperty(exports, "jidNormalizedUser", { enumerable: true, get: function () { return baileys_1.jidNormalizedUser; } });
55
+ Object.defineProperty(exports, "S_WHATSAPP_NET", { enumerable: true, get: function () { return baileys_1.S_WHATSAPP_NET; } });
56
+ // ============== Waliwa Helpers ==============
57
+ var defaults_js_1 = require("./helpers/defaults.js");
58
+ Object.defineProperty(exports, "makeWASocketWithDefaults", { enumerable: true, get: function () { return defaults_js_1.makeWASocketWithDefaults; } });
59
+ Object.defineProperty(exports, "quickStart", { enumerable: true, get: function () { return defaults_js_1.quickStart; } });
60
+ var media_js_1 = require("./helpers/media.js");
61
+ Object.defineProperty(exports, "MediaHelper", { enumerable: true, get: function () { return media_js_1.MediaHelper; } });
62
+ var sticker_js_1 = require("./helpers/sticker.js");
63
+ Object.defineProperty(exports, "StickerHelper", { enumerable: true, get: function () { return sticker_js_1.StickerHelper; } });
64
+ var message_js_1 = require("./helpers/message.js");
65
+ Object.defineProperty(exports, "MessageHelper", { enumerable: true, get: function () { return message_js_1.MessageHelper; } });
39
66
  // ============== Version ==============
40
- exports.VERSION = '2.0.0';
67
+ exports.VERSION = '2.1.0';
41
68
  exports.LIBRARY_NAME = 'waliwa';
42
69
  exports.BASED_ON = 'Baileys 7 (@whiskeysockets/baileys)';
43
70
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;;;;;;AAEH,+DAA+D;AAC/D,mDASiC;AAR/B,mHAAA,OAAO,OAAA;AACP,uGAAA,YAAY,OAAA;AACZ,gHAAA,qBAAqB,OAAA;AACrB,qGAAA,UAAU,OAAA;AACV,gGAAA,KAAK,OAAA;AACL,mGAAA,QAAQ,OAAA;AACR,2GAAA,gBAAgB,OAAA;AAChB,oHAAA,yBAAyB,OAAA;AAG3B,wCAAwC;AAC3B,QAAA,OAAO,GAAG,OAAO,CAAC;AAClB,QAAA,YAAY,GAAG,QAAQ,CAAC;AACxB,QAAA,QAAQ,GAAG,qCAAqC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;;;;;;AAEH,+DAA+D;AAC/D,mDAgBiC;AAf/B,mHAAA,OAAO,OAAA;AACP,uGAAA,YAAY,OAAA;AACZ,gHAAA,qBAAqB,OAAA;AACrB,uGAAA,qBAAqB,OAAgB;AACrC,qGAAA,UAAU,OAAA;AACV,gGAAA,KAAK,OAAA;AACL,mGAAA,QAAQ,OAAA;AACR,2GAAA,gBAAgB,OAAA;AAChB,oHAAA,yBAAyB,OAAA;AACzB,yGAAA,cAAc,OAAA;AACd,oGAAA,SAAS,OAAA;AACT,oGAAA,SAAS,OAAA;AACT,oGAAA,SAAS,OAAA;AACT,4GAAA,iBAAiB,OAAA;AACjB,yGAAA,cAAc,OAAA;AAGhB,+CAA+C;AAC/C,qDAI+B;AAH7B,uHAAA,wBAAwB,OAAA;AACxB,yGAAA,UAAU,OAAA;AAIZ,+CAAiD;AAAxC,uGAAA,WAAW,OAAA;AACpB,mDAA0E;AAAjE,2GAAA,aAAa,OAAA;AACtB,mDAAqD;AAA5C,2GAAA,aAAa,OAAA;AAEtB,wCAAwC;AAC3B,QAAA,OAAO,GAAG,OAAO,CAAC;AAClB,QAAA,YAAY,GAAG,QAAQ,CAAC;AACxB,QAAA,QAAQ,GAAG,qCAAqC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kangwifi-pro/waliwa",
3
- "version": "2.0.0",
3
+ "version": "2.1.0",
4
4
  "description": "WhatsApp library based on Baileys 7 (proven working) + Multi-Branch SKDM Recovery + Community Features + SKDM. Fork of Baileys with extra features.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -49,10 +49,21 @@
49
49
  ],
50
50
  "dependencies": {
51
51
  "@whiskeysockets/baileys": "7.0.0-rc14",
52
- "qrcode-terminal": "^0.12.0"
52
+ "@hapi/boom": "^10.0.1",
53
+ "pino": "^9.5.0",
54
+ "pino-pretty": "^11.3.0",
55
+ "qrcode-terminal": "^0.12.0",
56
+ "axios": "^1.7.9",
57
+ "mime-types": "^2.1.35",
58
+ "sharp": "^0.33.5",
59
+ "fluent-ffmpeg": "^2.1.3",
60
+ "@ffmpeg-installer/ffmpeg": "^1.1.0"
53
61
  },
54
62
  "devDependencies": {
55
63
  "@types/node": "^20.11.20",
64
+ "@types/mime-types": "^2.1.4",
65
+ "@types/fluent-ffmpeg": "^2.1.27",
66
+ "@types/qrcode-terminal": "^0.12.2",
56
67
  "typescript": "^5.3.3",
57
68
  "ts-node": "^10.9.2"
58
69
  }