diff --git a/packages/next-whatsapp/.gitignore b/packages/next-whatsapp/.gitignore new file mode 100644 index 00000000..54752e51 --- /dev/null +++ b/packages/next-whatsapp/.gitignore @@ -0,0 +1,70 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output +/coverage.lcov + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# TypeScript v1 declaration files +typings/ + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env + +# next.js build output +.next + +dist/ + +*/package-lock.json + +# IDE +.vscode +.idea diff --git a/packages/next-whatsapp/README.md b/packages/next-whatsapp/README.md new file mode 100644 index 00000000..986aa976 --- /dev/null +++ b/packages/next-whatsapp/README.md @@ -0,0 +1,80 @@ +# @opensourceframework/next-whatsapp + +WhatsApp integration for Next.js applications using whatsapp-web.js. + +This package is extracted from the [itsalive](https://github.com/riceharvest/itsalive) project. + +## Installation + +```bash +pnpm add @opensourceframework/next-whatsapp +``` + +## Usage + +### Basic Connection + +```typescript +import { WhatsAppService } from '@opensourceframework/next-whatsapp'; + +// Connect and get QR code +const qrCode = await WhatsAppService.connect(); +// Display QR code to user for scanning + +// Check status +const status = WhatsAppService.getStatus(); +console.log(`Connected: ${status.connected}, Tracking: ${status.tracking}`); +``` + +### Tracking Mode + +Send periodic messages to track sleep patterns or for automated check-ins: + +```typescript +// Start tracking with a list of contacts +await WhatsAppService.startTracking(['+1234567890', '+0987654321'], 15); // every 15 minutes + +// Stop tracking +WhatsAppService.stopTracking(); +``` + +### Low-Level Control + +For more control, use the individual functions: + +```typescript +import { getClient, initializeClient, startTracking, stopTracking, getStatus } from '@opensourceframework/next-whatsapp'; + +// Initialize the client +await initializeClient(); + +// Get the raw client for event listeners +const client = getClient(); + +client.on('message', (msg) => { + console.log('Received message:', msg.body); +}); + +// Start tracking with custom contacts +await startTracking(['+1234567890'], 15); +``` + +## Development + +```bash +# Install dependencies +pnpm install + +# Build +pnpm build + +# Run tests +pnpm test + +# Watch mode +pnpm dev +``` + +## License + +MIT diff --git a/packages/next-whatsapp/llms.txt b/packages/next-whatsapp/llms.txt new file mode 100644 index 00000000..8ea304a5 --- /dev/null +++ b/packages/next-whatsapp/llms.txt @@ -0,0 +1,23 @@ +# @opensourceframework/next-whatsapp - AI Summary + +WhatsApp integration for Next.js applications using whatsapp-web.js. This package provides a simple API to connect to WhatsApp, send automated messages, and track delivery status. Extracted and maintained from the itsalive project in the OpenSource Framework monorepo. + +## Maintainer Intent + +- Provide a stable, well-maintained wrapper around whatsapp-web.js. +- Keep the API simple and intuitive for Next.js developers. +- Handle reconnection logic and rate limiting automatically. +- Allow flexible event handling for custom use cases. + +## Installation + +```bash +npm install @opensourceframework/next-whatsapp +# or +pnpm add @opensourceframework/next-whatsapp +``` + +## Links + +- Documentation: https://github.com/riceharvest/opensourceframework/tree/main/packages/next-whatsapp#readme +- npm: https://www.npmjs.com/package/@opensourceframework/next-whatsapp diff --git a/packages/next-whatsapp/package.json b/packages/next-whatsapp/package.json new file mode 100644 index 00000000..20a8659a --- /dev/null +++ b/packages/next-whatsapp/package.json @@ -0,0 +1,65 @@ +{ + "type": "module", + "name": "@opensourceframework/next-whatsapp", + "version": "0.1.0", + "description": "WhatsApp integration for Next.js applications using whatsapp-web.js", + "keywords": [ + "nextjs", + "whatsapp", + "whatsapp-web", + "messaging" + ], + "main": "./dist/index.cjs", + "module": "./dist/index.js", + "types": "./dist/index.d.ts", + "exports": { + ".": { + "import": "./dist/index.js", + "require": "./dist/index.cjs" + } + }, + "files": [ + "dist", + "llms.txt" + ], + "sideEffects": false, + "scripts": { + "build": "tsup", + "dev": "tsup --watch", + "lint": "eslint . --ignore-pattern examples", + "typecheck": "tsc --noEmit", + "test": "vitest run --passWithNoTests", + "test:watch": "vitest", + "test:coverage": "vitest run --coverage" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/riceharvest/opensourceframework.git", + "directory": "packages/next-whatsapp" + }, + "author": "OpenSource Framework Contributors", + "license": "MIT", + "bugs": { + "url": "https://github.com/riceharvest/opensourceframework/issues?q=is%3Aissue+is%3Aopen+next-whatsapp" + }, + "homepage": "https://github.com/riceharvest/opensourceframework/tree/main/packages/next-whatsapp#readme", + "devDependencies": { + "@types/node": "^25.4.0", + "@types/qrcode": "^1.5.6", + "eslint": "^10.0.3", + "tsup": "^8.5.1", + "typescript": "^5.9.3", + "vitest": "^2.1.9", + "@vitest/coverage-v8": "^2.1.9" + }, + "dependencies": { + "qrcode": "^1.5.3", + "whatsapp-web.js": "^1.23.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/packages/next-whatsapp/src/client.ts b/packages/next-whatsapp/src/client.ts new file mode 100644 index 00000000..aa9a330d --- /dev/null +++ b/packages/next-whatsapp/src/client.ts @@ -0,0 +1,133 @@ +import { Client, LocalAuth, MessageAck } from 'whatsapp-web.js'; + +let client: Client | null = null; +let isTracking = false; +let trackingInterval: NodeJS.Timeout | null = null; +let reconnectAttempts = 0; +const maxReconnectAttempts = 5; +const reconnectDelay = 5000; // 5 seconds + +export const getClient = (): Client => { + if (!client) { + client = new Client({ + authStrategy: new LocalAuth(), + puppeteer: { + headless: true, + args: ['--no-sandbox', '--disable-setuid-sandbox'] + } + }); + + client.on('ready', () => { + console.log('WhatsApp client is ready!'); + reconnectAttempts = 0; // Reset on successful connection + }); + + client.on('disconnected', (reason) => { + console.warn('WhatsApp client disconnected:', reason); + if (reconnectAttempts < maxReconnectAttempts) { + reconnectAttempts++; + console.info(`Attempting to reconnect (${reconnectAttempts}/${maxReconnectAttempts})...`); + setTimeout(() => { + initializeClient().catch((error) => { + console.error('Reconnection failed:', error); + }); + }, reconnectDelay); + } else { + console.error('Max reconnection attempts reached. Please reconnect manually.'); + } + }); + } + return client; +} + +export async function initializeClient(): Promise { + const whatsappClient = getClient(); + await whatsappClient.initialize(); + return whatsappClient; +} + +async function sendMessageWithRetry( + clientInstance: Client, + chatId: string, + retryCount = 0, + maxRetries = 3 +): Promise { + if (!clientInstance.info) { + throw new Error('WhatsApp client not ready'); + } + + try { + // Send a zero-width space character as a ping + await clientInstance.sendMessage(chatId, '\u200B'); + } catch (error: any) { + console.error('Error sending message:', error); + if ( + error.message?.includes('rate limit') || + error.message?.includes('too many requests') + ) { + if (retryCount < maxRetries) { + const delay = Math.pow(2, retryCount) * 1000; + console.warn(`Rate limited, retrying in ${delay}ms...`); + await new Promise((resolve) => setTimeout(resolve, delay)); + return sendMessageWithRetry(clientInstance, chatId, retryCount + 1, maxRetries); + } else { + throw new Error('Max retries exceeded due to rate limiting', { cause: error }); + } + } else { + // Ignore other errors (like invalid contact) to keep loop running + console.warn(`Failed to send to ${chatId}: ${error.message}`); + } + } +} + +export async function startTracking(contacts: string[], intervalMinutes: number = 15): Promise { + if (isTracking) return; + + const whatsappClient = getClient(); + if (!whatsappClient.info) { + throw new Error('WhatsApp client not ready'); + } + + isTracking = true; + + // Initial run + await runTrackingCycle(whatsappClient, contacts); + + trackingInterval = setInterval(async () => { + await runTrackingCycle(whatsappClient, contacts); + }, intervalMinutes * 60 * 1000); +} + +async function runTrackingCycle(whatsappClient: Client, contacts: string[]): Promise { + try { + console.info(`Starting tracking cycle for ${contacts.length} contacts`); + for (const contact of contacts) { + const chatId = `${contact}@c.us`; + await sendMessageWithRetry(whatsappClient, chatId); + await new Promise((r) => setTimeout(r, 2000)); // Delay to be polite + } + } catch (error) { + console.error('Failed tracking cycle:', error); + } +} + +export function stopTracking(): void { + if (trackingInterval) { + clearInterval(trackingInterval); + trackingInterval = null; + } + isTracking = false; +} + +export function getStatus(): { connected: boolean; tracking: boolean } { + return { + connected: client?.info ? true : false, + tracking: isTracking, + }; +} + +// Optional: expose client events for advanced usage +export function onMessageAck(callback: (message: any, ack: MessageAck) => void): void { + const clientInstance = getClient(); + clientInstance.on('message_ack', callback); +} diff --git a/packages/next-whatsapp/src/index.ts b/packages/next-whatsapp/src/index.ts new file mode 100644 index 00000000..208053fe --- /dev/null +++ b/packages/next-whatsapp/src/index.ts @@ -0,0 +1,15 @@ +// Main service class for easy static access +export { WhatsAppService } from './service'; + +// Individual functions for more granular control +export { + getClient, + initializeClient, + startTracking, + stopTracking, + getStatus, + onMessageAck, +} from './client'; + +// Re-export types if needed +export type { Client } from 'whatsapp-web.js'; diff --git a/packages/next-whatsapp/src/service.test.ts b/packages/next-whatsapp/src/service.test.ts new file mode 100644 index 00000000..8ee438f9 --- /dev/null +++ b/packages/next-whatsapp/src/service.test.ts @@ -0,0 +1,157 @@ +import { describe, it, expect, beforeEach, vi } from 'vitest'; +import { WhatsAppService } from './service'; +import { + getClient, + initializeClient, + startTracking, + stopTracking, + getStatus, +} from './client'; +import qrcode from 'qrcode'; + +// Mock the client functions +vi.mock('./client', () => ({ + getClient: vi.fn(), + initializeClient: vi.fn(), + startTracking: vi.fn(), + stopTracking: vi.fn(), + getStatus: vi.fn(), +})); + +// Mock qrcode - it's a CommonJS module with default export +vi.mock('qrcode', () => ({ + default: { + toDataURL: vi.fn(), + }, + toDataURL: vi.fn(), +})); + +import qrcode from 'qrcode'; + +const mockGetClient = getClient as any; +const mockInitializeClient = initializeClient as any; +const mockStartTracking = startTracking as any; +const mockStopTracking = stopTracking as any; +const mockGetStatus = getStatus as any; +const mockQrToDataURL = qrcode.toDataURL as any; + +describe('WhatsAppService', () => { + beforeEach(() => { + vi.clearAllMocks(); + }); + + describe('connect', () => { + it('should resolve with QR code data URL on qr event', async () => { + const mockClient = { + on: vi.fn(), + }; + mockGetClient.mockReturnValue(mockClient); + mockInitializeClient.mockResolvedValue(mockClient); + mockQrToDataURL.mockResolvedValue('data:image/png;base64,...'); + + const promise = WhatsAppService.connect(); + + // Simulate qr event + const qrCallback = mockClient.on.mock.calls.find((call: any) => call[0] === 'qr')[1]; + qrCallback('qr-code-data'); + + const result = await promise; + expect(result).toBe('data:image/png;base64,...'); + expect(mockQrToDataURL).toHaveBeenCalledWith('qr-code-data'); + }); + + it('should resolve with null on ready event', async () => { + const mockClient = { + on: vi.fn(), + }; + mockGetClient.mockReturnValue(mockClient); + mockInitializeClient.mockResolvedValue(mockClient); + + const promise = WhatsAppService.connect(); + + // Simulate ready event + const readyCallback = mockClient.on.mock.calls.find((call: any) => call[0] === 'ready')[1]; + readyCallback(); + + const result = await promise; + expect(result).toBeNull(); + }); + + it('should reject on auth_failure event', async () => { + const mockClient = { + on: vi.fn(), + }; + mockGetClient.mockReturnValue(mockClient); + mockInitializeClient.mockResolvedValue(mockClient); + + const promise = WhatsAppService.connect(); + + // Simulate auth_failure event + const authFailureCallback = mockClient.on.mock.calls.find((call: any) => call[0] === 'auth_failure')[1]; + authFailureCallback('Auth failed'); + + await expect(promise).rejects.toThrow('Authentication failed: Auth failed'); + }); + + it('should reject on initializeClient error', async () => { + const mockClient = { + on: vi.fn(), + }; + mockGetClient.mockReturnValue(mockClient); + mockInitializeClient.mockRejectedValue(new Error('Init failed')); + + await expect(WhatsAppService.connect()).rejects.toThrow('Init failed'); + }); + + it('should reject on qrcode error', async () => { + const mockClient = { + on: vi.fn(), + }; + mockGetClient.mockReturnValue(mockClient); + mockInitializeClient.mockResolvedValue(mockClient); + mockQrToDataURL.mockRejectedValue(new Error('QR failed')); + + const promise = WhatsAppService.connect(); + + // Simulate qr event + const qrCallback = mockClient.on.mock.calls.find((call: any) => call[0] === 'qr')[1]; + qrCallback('qr-code-data'); + + await expect(promise).rejects.toThrow('QR failed'); + }); + }); + + describe('startTracking', () => { + it('should call startTracking with default interval', async () => { + await WhatsAppService.startTracking(['+1234567890']); + + expect(mockStartTracking).toHaveBeenCalledWith(['+1234567890'], 15); + }); + + it('should call startTracking with custom interval', async () => { + await WhatsAppService.startTracking(['+1234567890'], 30); + + expect(mockStartTracking).toHaveBeenCalledWith(['+1234567890'], 30); + }); + }); + + describe('stopTracking', () => { + it('should call stopTracking', () => { + WhatsAppService.stopTracking(); + + expect(mockStopTracking).toHaveBeenCalled(); + }); + }); + + describe('getStatus', () => { + it('should return the status from client', () => { + const mockStatus = { connected: true, tracking: false }; + mockGetStatus.mockReturnValue(mockStatus); + + const result = WhatsAppService.getStatus(); + + expect(result).toEqual(mockStatus); + expect(mockGetStatus).toHaveBeenCalled(); + }); + }); +}); diff --git a/packages/next-whatsapp/src/service.ts b/packages/next-whatsapp/src/service.ts new file mode 100644 index 00000000..84ad6d76 --- /dev/null +++ b/packages/next-whatsapp/src/service.ts @@ -0,0 +1,57 @@ +import { getClient, initializeClient, startTracking, stopTracking, getStatus } from './client'; +import qrcode from 'qrcode'; + +export class WhatsAppService { + /** + * Connect to WhatsApp and get the QR code or null if already connected + * @returns Promise resolving to QR code data URL or null if already connected + */ + static async connect(): Promise { + const client = getClient(); + + return new Promise((resolve, reject) => { + client.on('qr', async (qr) => { + try { + const qrCodeDataURL = await qrcode.toDataURL(qr); + resolve(qrCodeDataURL); + } catch (error) { + reject(error); + } + }); + + client.on('ready', () => { + resolve(null); // Already connected + }); + + client.on('auth_failure', (msg) => { + reject(new Error(`Authentication failed: ${msg}`)); + }); + + initializeClient().catch(reject); + }); + } + + /** + * Start periodic tracking by sending messages to the specified contacts + * @param contacts - Array of phone numbers (without @c.us suffix) + * @param intervalMinutes - How often to send tracking messages (default 15 minutes) + */ + static async startTracking(contacts: string[], intervalMinutes: number = 15): Promise { + await startTracking(contacts, intervalMinutes); + } + + /** + * Stop the tracking loop + */ + static stopTracking(): void { + stopTracking(); + } + + /** + * Get the current connection and tracking status + * @returns Object with connected and tracking boolean properties + */ + static getStatus(): { connected: boolean; tracking: boolean } { + return getStatus(); + } +} diff --git a/packages/next-whatsapp/tsconfig.json b/packages/next-whatsapp/tsconfig.json new file mode 100644 index 00000000..8b411f14 --- /dev/null +++ b/packages/next-whatsapp/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "./dist", + "rootDir": "./src" + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist", "**/*.test.ts"] +} diff --git a/packages/next-whatsapp/tsup.config.ts b/packages/next-whatsapp/tsup.config.ts new file mode 100644 index 00000000..64dc6541 --- /dev/null +++ b/packages/next-whatsapp/tsup.config.ts @@ -0,0 +1,24 @@ +import { defineConfig } from 'tsup'; + +export default defineConfig({ + entry: ['src/index.ts'], + format: ['cjs', 'esm'], + dts: true, + splitting: false, + sourcemap: true, + clean: true, + minify: false, + treeshake: true, + external: ['whatsapp-web.js', 'qrcode'], + esbuildOptions(options) { + options.banner = { + js: `/** + * @opensourceframework/next-whatsapp + * WhatsApp integration for Next.js applications using whatsapp-web.js + * + * Extracted from the itsalive project + * @license MIT + */`, + }; + }, +}); diff --git a/packages/next-whatsapp/vitest.config.ts b/packages/next-whatsapp/vitest.config.ts new file mode 100644 index 00000000..a463d9e4 --- /dev/null +++ b/packages/next-whatsapp/vitest.config.ts @@ -0,0 +1,20 @@ +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + globals: true, + environment: 'node', + include: ['src/**/*.test.ts'], + coverage: { + provider: 'v8', + reporter: ['text', 'json', 'html'], + exclude: [ + 'node_modules/', + 'dist/', + '**/*.d.ts', + '**/*.test.ts', + '**/*.config.ts', + ], + }, + }, +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2b0f07cb..fe5f68e6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -225,7 +225,7 @@ importers: version: 29.7.0(@babel/core@7.29.0) jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@22.19.15)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) + version: 29.7.0(@types/node@25.4.0)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) packages/next-auth: dependencies: @@ -1034,6 +1034,37 @@ importers: specifier: ^5.88.2 version: 5.105.2(@swc/core@1.15.13) + packages/next-whatsapp: + dependencies: + qrcode: + specifier: ^1.5.3 + version: 1.5.4 + whatsapp-web.js: + specifier: ^1.23.0 + version: 1.34.6(encoding@0.1.13)(typescript@5.9.3) + devDependencies: + '@types/node': + specifier: ^25.4.0 + version: 25.4.0 + '@types/qrcode': + specifier: ^1.5.6 + version: 1.5.6 + '@vitest/coverage-v8': + specifier: ^2.1.9 + version: 2.1.9(vitest@2.1.9(@types/node@25.4.0)(happy-dom@20.8.3)(jsdom@25.0.1)(lightningcss@1.32.0)(msw@2.12.10(@types/node@25.4.0)(typescript@5.9.3))(terser@5.46.0)) + eslint: + specifier: ^10.0.3 + version: 10.0.3(jiti@2.6.1) + tsup: + specifier: ^8.5.1 + version: 8.5.1(@swc/core@1.15.13)(jiti@2.6.1)(postcss@8.5.8)(tsx@4.19.3)(typescript@5.9.3)(yaml@2.8.2) + typescript: + specifier: ^5.9.3 + version: 5.9.3 + vitest: + specifier: ^2.1.9 + version: 2.1.9(@types/node@25.4.0)(happy-dom@20.8.3)(jsdom@25.0.1)(lightningcss@1.32.0)(msw@2.12.10(@types/node@25.4.0)(typescript@5.9.3))(terser@5.46.0) + packages/react-a11y-utils: devDependencies: '@axe-core/react': @@ -3328,6 +3359,9 @@ packages: resolution: {integrity: sha512-UdkG3mLEqXgnlKsWanWcgb6dOjUzJ+XC5f+aWw30qrtjxeNUSfKX1cd5FBzOaXQumoe9nIqeZUvrRJS03HCCtw==} engines: {node: '>=10.13.0'} + '@pedroslopez/moduleraid@5.0.2': + resolution: {integrity: sha512-wtnBAETBVYZ9GvcbgdswRVSLkFkYAGv1KzwBBTeRXvGT9sb9cPllOgFFWXCn9PyARQ0H+Ijz6mmoRrGateUDxQ==} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -3358,6 +3392,11 @@ packages: typescript: optional: true + '@puppeteer/browsers@2.13.0': + resolution: {integrity: sha512-46BZJYJjc/WwmKjsvDFykHtXrtomsCIrwYQPOP7VfMJoZY2bsDF9oROBABR3paDjDcmkUye1Pb1BqdcdiipaWA==} + engines: {node: '>=18'} + hasBin: true + '@react-aria/focus@3.21.5': resolution: {integrity: sha512-V18fwCyf8zqgJdpLQeDU5ZRNd9TeOfBbhLgmX77Zr5ae9XwaoJ1R3SFJG1wCJX60t34AW+aLZSEEK+saQElf3Q==} peerDependencies: @@ -3649,8 +3688,8 @@ packages: '@sinclair/typebox@0.27.10': resolution: {integrity: sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==} - '@sinclair/typebox@0.34.49': - resolution: {integrity: sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==} + '@sinclair/typebox@0.34.48': + resolution: {integrity: sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA==} '@sindresorhus/is@4.6.0': resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} @@ -4159,6 +4198,9 @@ packages: '@types/puppeteer@5.4.7': resolution: {integrity: sha512-JdGWZZYL0vKapXF4oQTC5hLVNfOgdPrqeZ1BiQnGk5cB7HeE91EWUiTdVSdQPobRN8rIcdffjiOgCYJ/S8QrnQ==} + '@types/qrcode@1.5.6': + resolution: {integrity: sha512-te7NQcV2BOvdj2b1hCAHzAoMNuj65kNBMz0KBaxM6c3VGBOhU0dURQKOtH8CFNI/dsKkwlv32p26qYQTWoB5bw==} + '@types/react-dom@19.2.3': resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} peerDependencies: @@ -4843,6 +4885,18 @@ packages: resolution: {integrity: sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA==} engines: {node: '>= 6.0.0'} + archiver-utils@2.1.0: + resolution: {integrity: sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==} + engines: {node: '>= 6'} + + archiver-utils@3.0.4: + resolution: {integrity: sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==} + engines: {node: '>= 10'} + + archiver@5.3.2: + resolution: {integrity: sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==} + engines: {node: '>= 10'} + arg@5.0.2: resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} @@ -4935,6 +4989,9 @@ packages: resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} engines: {node: '>= 0.4'} + async@0.2.10: + resolution: {integrity: sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ==} + async@3.2.6: resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} @@ -5147,6 +5204,10 @@ packages: peerDependencies: react: '>=16.8' + big-integer@1.6.52: + resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} + engines: {node: '>=0.6'} + big.js@5.2.2: resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} @@ -5154,6 +5215,15 @@ packages: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} + binary@0.3.0: + resolution: {integrity: sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + bluebird@3.4.7: + resolution: {integrity: sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==} + boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} @@ -5196,12 +5266,20 @@ packages: buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + buffer-indexof-polyfill@1.0.2: + resolution: {integrity: sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==} + engines: {node: '>=0.10'} + buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + buffers@0.1.1: + resolution: {integrity: sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==} + engines: {node: '>=0.2.0'} + builtin-modules@3.3.0: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} @@ -5275,6 +5353,9 @@ packages: resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} engines: {node: '>=18'} + chainsaw@0.1.0: + resolution: {integrity: sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==} + chalk@1.1.3: resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} engines: {node: '>=0.10.0'} @@ -5352,6 +5433,11 @@ packages: peerDependencies: devtools-protocol: '*' + chromium-bidi@14.0.0: + resolution: {integrity: sha512-9gYlLtS6tStdRWzrtXaTMnqcM4dudNegMXJxkR0I/CXObHalYeYcAMPrL19eroNZHtJ8DQmu1E+ZNOYu/IXMXw==} + peerDependencies: + devtools-protocol: '*' + ci-info@3.9.0: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} @@ -5391,6 +5477,9 @@ packages: resolution: {integrity: sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==} engines: {node: '>=18'} + cliui@6.0.0: + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + cliui@7.0.4: resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} @@ -5502,6 +5591,10 @@ packages: compare-func@2.0.0: resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + compress-commons@4.1.2: + resolution: {integrity: sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==} + engines: {node: '>= 10'} + compute-scroll-into-view@3.1.1: resolution: {integrity: sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==} @@ -5556,6 +5649,9 @@ packages: core-js-compat@3.48.0: resolution: {integrity: sha512-OM4cAF3D6VtH/WkLtWvyNC56EZVXsZdU3iqaMG2B4WvYrlqU831pc4UtG5yp0sE9z8Y02wVN7PjW5Zf9Gt0f1Q==} + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + cose-base@1.0.3: resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} @@ -5579,6 +5675,24 @@ packages: typescript: optional: true + cosmiconfig@9.0.1: + resolution: {integrity: sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + + crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + + crc32-stream@4.0.3: + resolution: {integrity: sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==} + engines: {node: '>= 10'} + create-jest@29.7.0: resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -6020,6 +6134,9 @@ packages: devtools-protocol@0.0.1147663: resolution: {integrity: sha512-hyWmRrexdhbZ1tcJUGpO95ivbRhWXz++F4Ko+n21AY5PNln2ovoJw+8ZMNDTtip+CNFQfrtLVh/w4009dXO/eQ==} + devtools-protocol@0.0.1581282: + resolution: {integrity: sha512-nv7iKtNZQshSW2hKzYNr46nM/Cfh5SEvE2oV0/SEGgc9XupIY5ggf84Cz8eJIkBce7S3bmTAauFD6aysMpnqsQ==} + didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} @@ -6031,6 +6148,9 @@ packages: resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dijkstrajs@1.0.3: + resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} + dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -6097,6 +6217,9 @@ packages: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} + duplexer2@0.1.4: + resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==} + duplexer@0.1.1: resolution: {integrity: sha512-sxNZ+ljy+RA1maXoUReeqBBpBC6RLKmg5ewzV+x+mSETmWNoKdZN6vcQjpFROemza23hGFskJtFNoUWUaQ+R4Q==} @@ -6174,6 +6297,10 @@ packages: resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} engines: {node: '>=0.12'} + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + environment@1.1.0: resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} engines: {node: '>=18'} @@ -6775,6 +6902,11 @@ packages: resolution: {integrity: sha512-4Ws+q7nNQZRIpVGGlNTqkQCs3E3aXLnWWWvxo4WGRZTCXzZAq3ucZeckZ8h+c4hM3z+vtpJkzFyGGEMUqun1Zw==} engines: {node: '>=0.4.0'} + fluent-ffmpeg@2.1.3: + resolution: {integrity: sha512-Be3narBNt2s6bsaqP6Jzq91heDgOEaDCJAXcE3qcma/EJBSy5FB4cvO31XBInuAuKBx8Kptf8dkhjK0IOru39Q==} + engines: {node: '>=18'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + follow-redirects@1.15.11: resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} engines: {node: '>=4.0'} @@ -6803,6 +6935,9 @@ packages: fraction.js@5.3.4: resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==} + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + fs-exists-sync@0.1.0: resolution: {integrity: sha512-cR/vflFyPZtrN6b38ZyWxpWdhlXrzZEBawlpBQMq7033xVY7/kg0GDMBK5jg8lDYQckdJ5x/YC88lM3C7VMsLg==} engines: {node: '>=0.10.0'} @@ -6843,6 +6978,11 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] + fstream@1.0.12: + resolution: {integrity: sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==} + engines: {node: '>=0.6'} + deprecated: This package is no longer supported. + function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} @@ -7553,6 +7693,9 @@ packages: resolution: {integrity: sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw==} engines: {node: '>=18'} + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} @@ -8090,6 +8233,10 @@ packages: layout-base@2.0.1: resolution: {integrity: sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==} + lazystream@1.0.1: + resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} + engines: {node: '>= 0.6.3'} + lefthook-darwin-arm64@1.13.6: resolution: {integrity: sha512-m6Lb77VGc84/Qo21Lhq576pEvcgFCnvloEiP02HbAHcIXD0RTLy9u2yAInrixqZeaz13HYtdDaI7OBYAAdVt8A==} cpu: [arm64] @@ -8246,6 +8393,9 @@ packages: engines: {node: '>=20.17'} hasBin: true + listenercount@1.0.1: + resolution: {integrity: sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==} + listr2@9.0.5: resolution: {integrity: sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==} engines: {node: '>=20.0.0'} @@ -8291,6 +8441,15 @@ packages: lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + lodash.defaults@4.2.0: + resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} + + lodash.difference@4.5.0: + resolution: {integrity: sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==} + + lodash.flatten@4.4.0: + resolution: {integrity: sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==} + lodash.includes@4.3.0: resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} @@ -8327,6 +8486,9 @@ packages: lodash.truncate@4.4.2: resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} + lodash.union@4.6.0: + resolution: {integrity: sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==} + lodash.uniq@4.5.0: resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} @@ -8680,6 +8842,11 @@ packages: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} + mime@3.0.0: + resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} + engines: {node: '>=10.0.0'} + hasBin: true + mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} @@ -8703,6 +8870,10 @@ packages: minimatch@3.1.5: resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} + minimatch@5.1.9: + resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==} + engines: {node: '>=10'} + minimatch@9.0.3: resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} engines: {node: '>=16 || 14 >=14.17'} @@ -8725,9 +8896,16 @@ packages: mitt@3.0.0: resolution: {integrity: sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==} + mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + mj-context-menu@0.6.1: resolution: {integrity: sha512-7NO5s6n10TIV96d4g2uDpG7ZDpIhMh0QNfGdJw/W47JswFcosz457wqz/b5sAKvl12sxINGFCn80NZHKwxQEXA==} + mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + mkdirp@1.0.4: resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} engines: {node: '>=10'} @@ -8891,6 +9069,9 @@ packages: node-releases@2.0.27: resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} + node-webpmux@3.1.7: + resolution: {integrity: sha512-ySkL4lBCto86OyQ0blAGzylWSECcn5I0lM3bYEhe75T8Zxt/BFUMHa8ktUguR7zwXNdS/Hms31VfSsYKN1383g==} + nodemailer@8.0.2: resolution: {integrity: sha512-zbj002pZAIkWQFxyAaqoxvn+zoIwRnS40hgjqTXudKOOJkiFFgBeNqjgD3/YCR12sZnrghWYBY+yP1ZucdDRpw==} engines: {node: '>=6.0.0'} @@ -9261,6 +9442,10 @@ packages: engines: {node: '>=18'} hasBin: true + pngjs@5.0.0: + resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} + engines: {node: '>=10.13.0'} + points-on-curve@0.2.0: resolution: {integrity: sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==} @@ -9817,6 +10002,9 @@ packages: peerDependencies: prettier: ^2.0.0 + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + process-warning@4.0.1: resolution: {integrity: sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==} @@ -9842,6 +10030,10 @@ packages: resolution: {integrity: sha512-0LdR757eTj/JfuU7TL2YCuAZnxWXu3tkJbg4Oq3geW/qFNT/32T0sp2HnZ9O0lMR4q3vwAt0+xCA8SR0WAD0og==} engines: {node: '>= 14'} + proxy-agent@6.5.0: + resolution: {integrity: sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==} + engines: {node: '>= 14'} + proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} @@ -9869,11 +10061,20 @@ packages: typescript: optional: true + puppeteer-core@24.40.0: + resolution: {integrity: sha512-MWL3XbUCfVgGR0gRsidzT6oKJT2QydPLhMITU6HoVWiiv4gkb6gJi3pcdAa8q4HwjBTbqISOWVP4aJiiyUJvag==} + engines: {node: '>=18'} + puppeteer@20.9.0: resolution: {integrity: sha512-kAglT4VZ9fWEGg3oLc4/de+JcONuEJhlh3J6f5R1TLkrY/EHHIHxWXDOzXvaxQCtedmyVXBwg8M+P8YCO/wZjw==} engines: {node: '>=16.3.0'} deprecated: < 24.15.0 is no longer supported + puppeteer@24.40.0: + resolution: {integrity: sha512-IxQbDq93XHVVLWHrAkFP7F7iHvb9o0mgfsSIMlhHb+JM+JjM1V4v4MNSQfcRWJopx9dsNOr9adYv0U5fm9BJBQ==} + engines: {node: '>=18'} + hasBin: true + pure-rand@6.1.0: resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} @@ -9885,6 +10086,11 @@ packages: (For a CapTP with native promises, see @endo/eventual-send and @endo/captp) + qrcode@1.5.4: + resolution: {integrity: sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==} + engines: {node: '>=10.13.0'} + hasBin: true + quansync@0.2.11: resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} @@ -9995,6 +10201,16 @@ packages: resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} engines: {node: '>=6'} + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdir-glob@1.1.3: + resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} + readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} @@ -10144,6 +10360,9 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} + require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} @@ -10311,6 +10530,9 @@ packages: resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} engines: {node: '>=0.4'} + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} @@ -10384,6 +10606,9 @@ packages: server-only@0.0.1: resolution: {integrity: sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==} + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + set-cookie-parser@2.7.2: resolution: {integrity: sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==} @@ -10399,6 +10624,9 @@ packages: resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} engines: {node: '>= 0.4'} + setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + sha.js@2.4.12: resolution: {integrity: sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==} engines: {node: '>= 0.10'} @@ -10609,9 +10837,6 @@ packages: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} engines: {node: '>= 0.4'} - streamx@2.23.0: - resolution: {integrity: sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==} - streamx@2.25.0: resolution: {integrity: sha512-0nQuG6jf1w+wddNEEXCF4nTg3LtufWINB5eFEN+5TNZW7KWJp6x87+JFL43vaAUPyCfH1wID+mNVyW6OHtFamg==} @@ -10675,6 +10900,12 @@ packages: resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} engines: {node: '>= 0.4'} + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + stringify-entities@4.0.4: resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} @@ -10880,6 +11111,10 @@ packages: tar-fs@3.1.2: resolution: {integrity: sha512-QGxxTxxyleAdyM3kpFs14ymbYmNFrfY+pHj7Z8FgtbZ7w2//VAgLMac7sT6nRpIHjppXO2AwwEOg0bPFVRcmXw==} + tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + tar-stream@3.1.7: resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} @@ -11053,6 +11288,9 @@ packages: resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} engines: {node: '>=18'} + traverse@0.3.9: + resolution: {integrity: sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==} + tree-kill@1.2.2: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true @@ -11337,6 +11575,9 @@ packages: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} + typed-query-selector@2.12.1: + resolution: {integrity: sha512-uzR+FzI8qrUEIu96oaeBJmd9E7CFEiQ3goA5qCVgc4s5llSubcfGHq9yUstZx/k4s9dXHVKsE35YWoFyvEqEHA==} + typeorm@0.3.28: resolution: {integrity: sha512-6GH7wXhtfq2D33ZuRXYwIsl/qM5685WZcODZb7noOOcRMteM9KF2x2ap3H0EBjnSV0VO4gNAfJT5Ukp0PkOlvg==} engines: {node: '>=16.13.0'} @@ -11546,6 +11787,9 @@ packages: until-async@3.0.2: resolution: {integrity: sha512-IiSk4HlzAMqTUseHHe3VhIGyuFmN90zMTpD3Z3y8jeQbzLIq500MVM7Jq2vUAnTKAFPJrqwkzr6PoTcPhGcOiw==} + unzipper@0.10.14: + resolution: {integrity: sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==} + upath@1.2.0: resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} engines: {node: '>=4'} @@ -11827,6 +12071,9 @@ packages: web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + webdriver-bidi-protocol@0.4.1: + resolution: {integrity: sha512-ARrjNjtWRRs2w4Tk7nqrf2gBI0QXWuOmMCx2hU+1jUt6d00MjMxURrhxhGbrsoiZKJrhTSTzbIrc554iKI10qw==} + webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} @@ -11864,6 +12111,10 @@ packages: webpack-cli: optional: true + whatsapp-web.js@1.34.6: + resolution: {integrity: sha512-+zgLBqARcVfuCG7b80c7Gkt+4Yh8w+oDWx7lL2gTA6nlaykHBne7NwJ5yGe2r7O9IYraIzs6HiCzNGKfu9AUBg==} + engines: {node: '>=18.0.0'} + whatwg-encoding@3.1.1: resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} engines: {node: '>=18'} @@ -11902,6 +12153,9 @@ packages: resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} engines: {node: '>= 0.4'} + which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + which-typed-array@1.1.20: resolution: {integrity: sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==} engines: {node: '>= 0.4'} @@ -12030,6 +12284,9 @@ packages: xmlchars@2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -12049,6 +12306,10 @@ packages: engines: {node: '>= 14.6'} hasBin: true + yargs-parser@18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} + yargs-parser@20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} @@ -12057,6 +12318,10 @@ packages: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} + yargs@15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} + yargs@16.2.0: resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} engines: {node: '>=10'} @@ -12080,6 +12345,13 @@ packages: resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} engines: {node: '>=18'} + zip-stream@4.1.1: + resolution: {integrity: sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==} + engines: {node: '>= 10'} + + zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + zod@4.3.6: resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} @@ -14350,7 +14622,7 @@ snapshots: '@jest/schemas@30.0.5': dependencies: - '@sinclair/typebox': 0.34.49 + '@sinclair/typebox': 0.34.48 '@jest/source-map@28.1.2': dependencies: @@ -14708,6 +14980,8 @@ snapshots: '@panva/asn1.js@1.0.0': {} + '@pedroslopez/moduleraid@5.0.2': {} + '@pkgjs/parseargs@0.11.0': optional: true @@ -14739,6 +15013,21 @@ snapshots: - react-native-b4a - supports-color + '@puppeteer/browsers@2.13.0': + dependencies: + debug: 4.4.3 + extract-zip: 2.0.1 + progress: 2.0.3 + proxy-agent: 6.5.0 + semver: 7.7.4 + tar-fs: 3.1.2 + yargs: 17.7.2 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - react-native-b4a + - supports-color + '@react-aria/focus@3.21.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@react-aria/interactions': 3.27.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -15011,7 +15300,7 @@ snapshots: '@sinclair/typebox@0.27.10': {} - '@sinclair/typebox@0.34.49': {} + '@sinclair/typebox@0.34.48': {} '@sindresorhus/is@4.6.0': {} @@ -15549,6 +15838,10 @@ snapshots: dependencies: '@types/node': 22.19.15 + '@types/qrcode@1.5.6': + dependencies: + '@types/node': 22.19.15 + '@types/react-dom@19.2.3(@types/react@19.2.14)': dependencies: '@types/react': 19.2.14 @@ -15787,7 +16080,7 @@ snapshots: '@typescript-eslint/project-service@8.56.1(typescript@5.9.3)': dependencies: '@typescript-eslint/tsconfig-utils': 8.56.1(typescript@5.9.3) - '@typescript-eslint/types': 8.56.1 + '@typescript-eslint/types': 8.57.0 debug: 4.4.3 typescript: 5.9.3 transitivePeerDependencies: @@ -16630,6 +16923,45 @@ snapshots: app-root-path@3.1.0: {} + archiver-utils@2.1.0: + dependencies: + glob: 7.2.3 + graceful-fs: 4.2.11 + lazystream: 1.0.1 + lodash.defaults: 4.2.0 + lodash.difference: 4.5.0 + lodash.flatten: 4.4.0 + lodash.isplainobject: 4.0.6 + lodash.union: 4.6.0 + normalize-path: 3.0.0 + readable-stream: 2.3.8 + optional: true + + archiver-utils@3.0.4: + dependencies: + glob: 7.2.3 + graceful-fs: 4.2.11 + lazystream: 1.0.1 + lodash.defaults: 4.2.0 + lodash.difference: 4.5.0 + lodash.flatten: 4.4.0 + lodash.isplainobject: 4.0.6 + lodash.union: 4.6.0 + normalize-path: 3.0.0 + readable-stream: 3.6.2 + optional: true + + archiver@5.3.2: + dependencies: + archiver-utils: 2.1.0 + async: 3.2.6 + buffer-crc32: 0.2.13 + readable-stream: 3.6.2 + readdir-glob: 1.1.3 + tar-stream: 2.2.0 + zip-stream: 4.1.1 + optional: true + arg@5.0.2: {} argparse@1.0.10: @@ -16743,6 +17075,8 @@ snapshots: async-function@1.0.0: {} + async@0.2.10: {} + async@3.2.6: {} asynckit@0.4.0: {} @@ -17011,10 +17345,29 @@ snapshots: mathjax-full: 3.2.2 react: 18.3.1 + big-integer@1.6.52: + optional: true + big.js@5.2.2: {} binary-extensions@2.3.0: {} + binary@0.3.0: + dependencies: + buffers: 0.1.1 + chainsaw: 0.1.0 + optional: true + + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + optional: true + + bluebird@3.4.7: + optional: true + boolbase@1.0.0: {} brace-expansion@1.1.12: @@ -17060,6 +17413,9 @@ snapshots: buffer-from@1.1.2: {} + buffer-indexof-polyfill@1.0.2: + optional: true + buffer@5.7.1: dependencies: base64-js: 1.5.1 @@ -17070,6 +17426,9 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 + buffers@0.1.1: + optional: true + builtin-modules@3.3.0: {} bundle-require@5.1.0(esbuild@0.25.12): @@ -17145,6 +17504,11 @@ snapshots: chai@6.2.2: {} + chainsaw@0.1.0: + dependencies: + traverse: 0.3.9 + optional: true + chalk@1.1.3: dependencies: ansi-styles: 2.2.1 @@ -17228,6 +17592,12 @@ snapshots: devtools-protocol: 0.0.1147663 mitt: 3.0.0 + chromium-bidi@14.0.0(devtools-protocol@0.0.1581282): + dependencies: + devtools-protocol: 0.0.1581282 + mitt: 3.0.1 + zod: 3.25.76 + ci-info@3.9.0: {} ci-info@4.4.0: {} @@ -17268,6 +17638,12 @@ snapshots: is-wsl: 3.1.1 is64bit: 2.0.0 + cliui@6.0.0: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + cliui@7.0.4: dependencies: string-width: 4.2.3 @@ -17351,6 +17727,14 @@ snapshots: array-ify: 1.0.0 dot-prop: 5.3.0 + compress-commons@4.1.2: + dependencies: + buffer-crc32: 0.2.13 + crc32-stream: 4.0.3 + normalize-path: 3.0.0 + readable-stream: 3.6.2 + optional: true + compute-scroll-into-view@3.1.1: {} concat-map@0.0.1: {} @@ -17408,6 +17792,9 @@ snapshots: dependencies: browserslist: 4.28.1 + core-util-is@1.0.3: + optional: true + cose-base@1.0.3: dependencies: layout-base: 1.0.2 @@ -17440,6 +17827,24 @@ snapshots: optionalDependencies: typescript: 5.9.3 + cosmiconfig@9.0.1(typescript@5.9.3): + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.1 + js-yaml: 4.1.1 + parse-json: 5.2.0 + optionalDependencies: + typescript: 5.9.3 + + crc-32@1.2.2: + optional: true + + crc32-stream@4.0.3: + dependencies: + crc-32: 1.2.2 + readable-stream: 3.6.2 + optional: true + create-jest@29.7.0(@types/node@20.17.24): dependencies: '@jest/types': 29.6.3 @@ -17487,13 +17892,13 @@ snapshots: - supports-color - ts-node - create-jest@29.7.0(@types/node@22.19.15)(babel-plugin-macros@3.1.0): + create-jest@29.7.0(@types/node@24.10.13): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@22.19.15)(babel-plugin-macros@3.1.0) + jest-config: 29.7.0(@types/node@24.10.13) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -17501,14 +17906,15 @@ snapshots: - babel-plugin-macros - supports-color - ts-node + optional: true - create-jest@29.7.0(@types/node@24.10.13): + create-jest@29.7.0(@types/node@25.4.0): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@24.10.13) + jest-config: 29.7.0(@types/node@25.4.0) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -17518,13 +17924,13 @@ snapshots: - ts-node optional: true - create-jest@29.7.0(@types/node@25.4.0): + create-jest@29.7.0(@types/node@25.4.0)(babel-plugin-macros@3.1.0): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@25.4.0) + jest-config: 29.7.0(@types/node@25.4.0)(babel-plugin-macros@3.1.0) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -17532,7 +17938,6 @@ snapshots: - babel-plugin-macros - supports-color - ts-node - optional: true cross-fetch@4.0.0(encoding@0.1.13): dependencies: @@ -18042,12 +18447,16 @@ snapshots: devtools-protocol@0.0.1147663: {} + devtools-protocol@0.0.1581282: {} + didyoumean@1.2.2: {} diff-sequences@28.1.1: {} diff-sequences@29.6.3: {} + dijkstrajs@1.0.3: {} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -18123,6 +18532,11 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 + duplexer2@0.1.4: + dependencies: + readable-stream: 2.3.8 + optional: true + duplexer@0.1.1: {} duplexer@0.1.2: {} @@ -18185,6 +18599,8 @@ snapshots: entities@7.0.1: {} + env-paths@2.2.1: {} + environment@1.1.0: {} error-ex@1.3.4: @@ -19219,6 +19635,11 @@ snapshots: flow-parser@0.305.0: {} + fluent-ffmpeg@2.1.3: + dependencies: + async: 0.2.10 + which: 1.3.1 + follow-redirects@1.15.11: {} for-each@0.3.5: @@ -19242,6 +19663,9 @@ snapshots: fraction.js@5.3.4: {} + fs-constants@1.0.0: + optional: true + fs-exists-sync@0.1.0: {} fs-extra@10.1.0: @@ -19285,6 +19709,14 @@ snapshots: fsevents@2.3.3: optional: true + fstream@1.0.12: + dependencies: + graceful-fs: 4.2.11 + inherits: 2.0.4 + mkdirp: 0.5.6 + rimraf: 2.6.3 + optional: true + function-bind@1.1.2: {} function.prototype.name@1.1.8: @@ -20039,6 +20471,9 @@ snapshots: dependencies: system-architecture: 0.1.0 + isarray@1.0.0: + optional: true + isarray@2.0.5: {} isexe@2.0.0: {} @@ -20268,37 +20703,36 @@ snapshots: - supports-color - ts-node - jest-cli@29.7.0(@types/node@22.19.15)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2): + jest-cli@29.7.0(@types/node@24.10.13): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) + '@jest/core': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@22.19.15)(babel-plugin-macros@3.1.0) + create-jest: 29.7.0(@types/node@24.10.13) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@22.19.15)(babel-plugin-macros@3.1.0) + jest-config: 29.7.0(@types/node@24.10.13) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 - optionalDependencies: - node-notifier: 8.0.2 transitivePeerDependencies: - '@types/node' - babel-plugin-macros - supports-color - ts-node + optional: true - jest-cli@29.7.0(@types/node@24.10.13): + jest-cli@29.7.0(@types/node@25.4.0): dependencies: '@jest/core': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@24.10.13) + create-jest: 29.7.0(@types/node@25.4.0) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@24.10.13) + jest-config: 29.7.0(@types/node@25.4.0) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -20309,25 +20743,26 @@ snapshots: - ts-node optional: true - jest-cli@29.7.0(@types/node@25.4.0): + jest-cli@29.7.0(@types/node@25.4.0)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2): dependencies: - '@jest/core': 29.7.0 + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@25.4.0) + create-jest: 29.7.0(@types/node@25.4.0)(babel-plugin-macros@3.1.0) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@25.4.0) + jest-config: 29.7.0(@types/node@25.4.0)(babel-plugin-macros@3.1.0) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 + optionalDependencies: + node-notifier: 8.0.2 transitivePeerDependencies: - '@types/node' - babel-plugin-macros - supports-color - ts-node - optional: true jest-config@28.1.3(@types/node@22.19.15): dependencies: @@ -20573,6 +21008,36 @@ snapshots: - supports-color optional: true + jest-config@29.7.0(@types/node@25.4.0)(babel-plugin-macros@3.1.0): + dependencies: + '@babel/core': 7.29.0 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.29.0) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0(babel-plugin-macros@3.1.0) + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.8 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 25.4.0 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + jest-dev-server@9.0.2: dependencies: chalk: 4.1.2 @@ -21186,26 +21651,25 @@ snapshots: - supports-color - ts-node - jest@29.7.0(@types/node@22.19.15)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2): + jest@29.7.0(@types/node@24.10.13): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) + '@jest/core': 29.7.0 '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@22.19.15)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) - optionalDependencies: - node-notifier: 8.0.2 + jest-cli: 29.7.0(@types/node@24.10.13) transitivePeerDependencies: - '@types/node' - babel-plugin-macros - supports-color - ts-node + optional: true - jest@29.7.0(@types/node@24.10.13): + jest@29.7.0(@types/node@25.4.0): dependencies: '@jest/core': 29.7.0 '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@24.10.13) + jest-cli: 29.7.0(@types/node@25.4.0) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -21213,18 +21677,19 @@ snapshots: - ts-node optional: true - jest@29.7.0(@types/node@25.4.0): + jest@29.7.0(@types/node@25.4.0)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2): dependencies: - '@jest/core': 29.7.0 + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@25.4.0) + jest-cli: 29.7.0(@types/node@25.4.0)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) + optionalDependencies: + node-notifier: 8.0.2 transitivePeerDependencies: - '@types/node' - babel-plugin-macros - supports-color - ts-node - optional: true jiti@1.21.7: {} @@ -21443,6 +21908,11 @@ snapshots: layout-base@2.0.1: {} + lazystream@1.0.1: + dependencies: + readable-stream: 2.3.8 + optional: true + lefthook-darwin-arm64@1.13.6: optional: true @@ -21573,6 +22043,9 @@ snapshots: tinyexec: 1.0.2 yaml: 2.8.2 + listenercount@1.0.1: + optional: true + listr2@9.0.5: dependencies: cli-truncate: 5.1.1 @@ -21620,6 +22093,15 @@ snapshots: lodash.debounce@4.0.8: {} + lodash.defaults@4.2.0: + optional: true + + lodash.difference@4.5.0: + optional: true + + lodash.flatten@4.4.0: + optional: true + lodash.includes@4.3.0: {} lodash.isboolean@3.0.3: {} @@ -21644,6 +22126,9 @@ snapshots: lodash.truncate@4.4.2: {} + lodash.union@4.6.0: + optional: true + lodash.uniq@4.5.0: {} lodash@4.17.23: {} @@ -22381,6 +22866,8 @@ snapshots: dependencies: mime-db: 1.52.0 + mime@3.0.0: {} + mimic-fn@2.1.0: {} mimic-fn@4.0.0: {} @@ -22397,6 +22884,11 @@ snapshots: dependencies: brace-expansion: 1.1.12 + minimatch@5.1.9: + dependencies: + brace-expansion: 2.0.2 + optional: true + minimatch@9.0.3: dependencies: brace-expansion: 2.0.2 @@ -22417,8 +22909,15 @@ snapshots: mitt@3.0.0: {} + mitt@3.0.1: {} + mj-context-menu@0.6.1: {} + mkdirp@0.5.6: + dependencies: + minimist: 1.2.8 + optional: true + mkdirp@1.0.4: {} mlly@1.8.0: @@ -22774,6 +23273,8 @@ snapshots: node-releases@2.0.27: {} + node-webpmux@3.1.7: {} + nodemailer@8.0.2: {} normalize-package-data@2.5.0: @@ -23143,6 +23644,8 @@ snapshots: optionalDependencies: fsevents: 2.3.2 + pngjs@5.0.0: {} + points-on-curve@0.2.0: {} points-on-path@0.2.1: @@ -23681,6 +24184,9 @@ snapshots: prettier: 2.8.8 tslib: 2.8.1 + process-nextick-args@2.0.1: + optional: true + process-warning@4.0.1: {} progress@2.0.3: {} @@ -23713,6 +24219,19 @@ snapshots: transitivePeerDependencies: - supports-color + proxy-agent@6.5.0: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + lru-cache: 7.18.3 + pac-proxy-agent: 7.2.0 + proxy-from-env: 1.1.0 + socks-proxy-agent: 8.0.5 + transitivePeerDependencies: + - supports-color + proxy-from-env@1.1.0: {} psl@1.15.0: @@ -23752,6 +24271,23 @@ snapshots: - supports-color - utf-8-validate + puppeteer-core@24.40.0: + dependencies: + '@puppeteer/browsers': 2.13.0 + chromium-bidi: 14.0.0(devtools-protocol@0.0.1581282) + debug: 4.4.3 + devtools-protocol: 0.0.1581282 + typed-query-selector: 2.12.1 + webdriver-bidi-protocol: 0.4.1 + ws: 8.19.0 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - bufferutil + - react-native-b4a + - supports-color + - utf-8-validate + puppeteer@20.9.0(encoding@0.1.13)(typescript@5.9.3): dependencies: '@puppeteer/browsers': 1.4.6(typescript@5.9.3) @@ -23767,10 +24303,33 @@ snapshots: - typescript - utf-8-validate + puppeteer@24.40.0(typescript@5.9.3): + dependencies: + '@puppeteer/browsers': 2.13.0 + chromium-bidi: 14.0.0(devtools-protocol@0.0.1581282) + cosmiconfig: 9.0.1(typescript@5.9.3) + devtools-protocol: 0.0.1581282 + puppeteer-core: 24.40.0 + typed-query-selector: 2.12.1 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - bufferutil + - react-native-b4a + - supports-color + - typescript + - utf-8-validate + pure-rand@6.1.0: {} q@1.5.1: {} + qrcode@1.5.4: + dependencies: + dijkstrajs: 1.0.3 + pngjs: 5.0.0 + yargs: 15.4.1 + quansync@0.2.11: {} querystringify@2.2.0: {} @@ -23886,6 +24445,29 @@ snapshots: pify: 4.0.1 strip-bom: 3.0.0 + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + optional: true + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + optional: true + + readdir-glob@1.1.3: + dependencies: + minimatch: 5.1.9 + optional: true + readdirp@3.6.0: dependencies: picomatch: 2.3.1 @@ -24132,6 +24714,8 @@ snapshots: require-from-string@2.0.2: {} + require-main-filename@2.0.0: {} + requires-port@1.0.0: {} resolve-cwd@3.0.0: @@ -24354,6 +24938,9 @@ snapshots: has-symbols: 1.1.0 isarray: 2.0.5 + safe-buffer@5.1.2: + optional: true + safe-buffer@5.2.1: {} safe-identifier@0.4.2: {} @@ -24426,6 +25013,8 @@ snapshots: server-only@0.0.1: {} + set-blocking@2.0.0: {} + set-cookie-parser@2.7.2: {} set-function-length@1.2.2: @@ -24450,6 +25039,9 @@ snapshots: es-errors: 1.3.0 es-object-atoms: 1.1.1 + setimmediate@1.0.5: + optional: true + sha.js@2.4.12: dependencies: inherits: 2.0.4 @@ -24695,15 +25287,6 @@ snapshots: es-errors: 1.3.0 internal-slot: 1.1.0 - streamx@2.23.0: - dependencies: - events-universal: 1.0.1 - fast-fifo: 1.3.2 - text-decoder: 1.2.7 - transitivePeerDependencies: - - bare-abort-controller - - react-native-b4a - streamx@2.25.0: dependencies: events-universal: 1.0.1 @@ -24712,7 +25295,6 @@ snapshots: transitivePeerDependencies: - bare-abort-controller - react-native-b4a - optional: true strict-event-emitter@0.5.1: {} @@ -24807,6 +25389,16 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.1.1 + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + optional: true + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + optional: true + stringify-entities@4.0.4: dependencies: character-entities-html4: 2.1.0 @@ -25080,11 +25672,20 @@ snapshots: - bare-buffer - react-native-b4a + tar-stream@2.2.0: + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.5 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + optional: true + tar-stream@3.1.7: dependencies: b4a: 1.8.0 fast-fifo: 1.3.2 - streamx: 2.23.0 + streamx: 2.25.0 transitivePeerDependencies: - bare-abort-controller - react-native-b4a @@ -25264,6 +25865,9 @@ snapshots: dependencies: punycode: 2.3.1 + traverse@0.3.9: + optional: true + tree-kill@1.2.2: {} trim-lines@3.0.1: {} @@ -25568,6 +26172,8 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 + typed-query-selector@2.12.1: {} + typeorm@0.3.28(babel-plugin-macros@3.1.0): dependencies: '@sqltools/formatter': 1.2.5 @@ -25799,6 +26405,20 @@ snapshots: until-async@3.0.2: {} + unzipper@0.10.14: + dependencies: + big-integer: 1.6.52 + binary: 0.3.0 + bluebird: 3.4.7 + buffer-indexof-polyfill: 1.0.2 + duplexer2: 0.1.4 + fstream: 1.0.12 + graceful-fs: 4.2.11 + listenercount: 1.0.1 + readable-stream: 2.3.8 + setimmediate: 1.0.5 + optional: true + upath@1.2.0: {} update-browserslist-db@1.2.3(browserslist@4.28.1): @@ -26352,6 +26972,8 @@ snapshots: web-namespaces@2.0.1: {} + webdriver-bidi-protocol@0.4.1: {} + webidl-conversions@3.0.1: {} webidl-conversions@4.0.2: {} @@ -26429,6 +27051,28 @@ snapshots: - esbuild - uglify-js + whatsapp-web.js@1.34.6(encoding@0.1.13)(typescript@5.9.3): + dependencies: + '@pedroslopez/moduleraid': 5.0.2 + fluent-ffmpeg: 2.1.3 + mime: 3.0.0 + node-fetch: 2.7.0(encoding@0.1.13) + node-webpmux: 3.1.7 + puppeteer: 24.40.0(typescript@5.9.3) + optionalDependencies: + archiver: 5.3.2 + fs-extra: 10.1.0 + unzipper: 0.10.14 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - bufferutil + - encoding + - react-native-b4a + - supports-color + - typescript + - utf-8-validate + whatwg-encoding@3.1.1: dependencies: iconv-lite: 0.6.3 @@ -26486,6 +27130,8 @@ snapshots: is-weakmap: 2.0.2 is-weakset: 2.0.4 + which-module@2.0.1: {} + which-typed-array@1.1.20: dependencies: available-typed-arrays: 1.0.7 @@ -26683,6 +27329,8 @@ snapshots: xmlchars@2.2.0: {} + y18n@4.0.3: {} + y18n@5.0.8: {} yallist@3.1.1: {} @@ -26693,10 +27341,29 @@ snapshots: yaml@2.8.2: {} + yargs-parser@18.1.3: + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + yargs-parser@20.2.9: {} yargs-parser@21.1.1: {} + yargs@15.4.1: + dependencies: + cliui: 6.0.0 + decamelize: 1.2.0 + find-up: 4.1.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 4.2.3 + which-module: 2.0.1 + y18n: 4.0.3 + yargs-parser: 18.1.3 + yargs@16.2.0: dependencies: cliui: 7.0.4 @@ -26736,6 +27403,15 @@ snapshots: yoctocolors-cjs@2.1.3: {} + zip-stream@4.1.1: + dependencies: + archiver-utils: 3.0.4 + compress-commons: 4.1.2 + readable-stream: 3.6.2 + optional: true + + zod@3.25.76: {} + zod@4.3.6: {} zustand@5.0.11(@types/react@19.2.14)(react@18.3.1)(use-sync-external-store@1.6.0(react@18.3.1)): diff --git a/pospos2-rewrite/apps/agent/src/services/scale-reader.ts b/pospos2-rewrite/apps/agent/src/services/scale-reader.ts index 6783fd2e..4d70d4ea 100644 --- a/pospos2-rewrite/apps/agent/src/services/scale-reader.ts +++ b/pospos2-rewrite/apps/agent/src/services/scale-reader.ts @@ -46,10 +46,24 @@ class SerialScaleReader implements ScaleReader { this.port = new SerialPort({ path: this.portPath, baudRate: 9600 }); this.parser = this.port.pipe(new ReadlineParser({ delimiter: '\n' })); this.parser.on('data', (line) => { - const grams = parseInt(line.trim(), 10); - if (!isNaN(grams)) { - this.currentWeight = grams; - this.stable = true; + const trimmed = line.trim(); + // Try A&D style format: "ST,+00004.05 g" or "US, 000.00 kg" + const match = trimmed.match(/^([A-Z0-9]{2}),\s*([+-]?\d+\.?\d*)\s*([a-zA-Z]*)$/); + if (match) { + const status = match[1]; + const weightStr = match[2]; + const weight = parseFloat(weightStr); + if (!isNaN(weight)) { + this.currentWeight = weight; + this.stable = (status === 'ST'); + } + } else { + // Fallback: raw numeric value (e.g., "123.45") + const grams = parseFloat(trimmed); + if (!isNaN(grams)) { + this.currentWeight = grams; + this.stable = true; + } } }); console.log(`Scale '${this.scaleId}' connected on ${this.portPath}`);