diff --git a/packages/client-slack/src/providers/channelState.d.ts b/packages/client-slack/src/providers/channelState.d.ts deleted file mode 100644 index 0e85e56d591..00000000000 --- a/packages/client-slack/src/providers/channelState.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { Provider } from "@ai16z/eliza"; - -export const channelStateProvider: Provider; \ No newline at end of file diff --git a/packages/client-slack/src/tests/setup.ts b/packages/client-slack/src/tests/setup.ts index 537d71e165f..fdb2f0ab956 100644 --- a/packages/client-slack/src/tests/setup.ts +++ b/packages/client-slack/src/tests/setup.ts @@ -1,187 +1,203 @@ -import { describe, expect, test, jest, beforeEach } from '@jest/globals'; -import type { Mocked } from 'jest-mock'; -import { config } from 'dotenv'; -import { resolve } from 'path'; -import { WebClient } from '@slack/web-api'; -import type { - AuthTestResponse, - ChatPostMessageResponse, - ConversationsInfoResponse, - FilesUploadResponse -} from '@slack/web-api'; +import { jest } from "@jest/globals"; +import type { Mocked } from "jest-mock"; +import { config } from "dotenv"; +import { resolve } from "path"; +import { WebClient } from "@slack/web-api"; +import type { + AuthTestResponse, + ChatPostMessageResponse, + ConversationsInfoResponse, + FilesUploadResponse, +} from "@slack/web-api"; // Load test environment variables -const envPath = resolve(__dirname, '../../../../.env'); -console.log('Loading test environment from:', envPath); +const envPath = resolve(__dirname, "../../../../.env"); +console.log("Loading test environment from:", envPath); config({ path: envPath }); // Set up test environment variables if not present const testEnvVars = { - SLACK_APP_ID: 'test-app-id', - SLACK_CLIENT_ID: 'test-client-id', - SLACK_CLIENT_SECRET: 'test-client-secret', - SLACK_SIGNING_SECRET: 'test-signing-secret', - SLACK_VERIFICATION_TOKEN: 'test-verification-token', - SLACK_BOT_TOKEN: 'test-bot-token', - SLACK_CHANNEL_ID: 'test-channel-id', - SLACK_BOT_ID: 'test-bot-id' + SLACK_APP_ID: "test-app-id", + SLACK_CLIENT_ID: "test-client-id", + SLACK_CLIENT_SECRET: "test-client-secret", + SLACK_SIGNING_SECRET: "test-signing-secret", + SLACK_VERIFICATION_TOKEN: "test-verification-token", + SLACK_BOT_TOKEN: "test-bot-token", + SLACK_CHANNEL_ID: "test-channel-id", + SLACK_BOT_ID: "test-bot-id", }; Object.entries(testEnvVars).forEach(([key, value]) => { - if (!process.env[key]) { - process.env[key] = value; - } + if (!process.env[key]) { + process.env[key] = value; + } }); // Create base mock functions with proper return types -const mockAuthTest = jest.fn<() => Promise>().mockResolvedValue({ - ok: true, - url: 'https://test.slack.com', - team: 'test-team', - user: 'test-user', - team_id: 'T123456', - user_id: 'U123456' -}); - -const mockPostMessage = jest.fn<() => Promise>().mockResolvedValue({ - ok: true, - channel: 'C123456', - ts: '1234567890.123456', - message: { - text: 'test message', - ts: '1234567890.123456', - type: 'message' - } -}); - -const mockConversationsInfo = jest.fn<() => Promise>().mockResolvedValue({ - ok: true, - channel: { - id: 'C123456', - name: 'test-channel', - is_channel: true, - created: 12345678 - } -}); - -const mockFilesUpload = jest.fn<() => Promise>().mockResolvedValue({ - ok: true, - file: { - id: 'F123456', - name: 'test-file', - title: 'test-file', - mimetype: 'text/plain', - filetype: 'text', - pretty_type: 'Plain Text', - user: 'U123456', - size: 12345, - mode: 'hosted', - is_external: false, - external_type: '', - is_public: true, - public_url_shared: false, - display_as_bot: false, - username: '', - url_private: 'https://test.slack.com/files/test-file', - url_private_download: 'https://test.slack.com/files/test-file/download', - permalink: 'https://test.slack.com/files/test-file/permalink', - permalink_public: 'https://test.slack.com/files/test-file/public', - created: 12345678, - timestamp: 12345678, - channels: ['C123456'], - groups: [], - ims: [], - comments_count: 0 - } -}); - -const mockFilesUploadV2 = jest.fn<() => Promise>().mockResolvedValue({ - ok: true, - file: { - id: 'F123456', - created: 12345678, - timestamp: 12345678, - name: 'test-file', - title: 'test-file', - mimetype: 'text/plain', - filetype: 'text', - pretty_type: 'Plain Text', - user: 'U123456', - size: 12345, - mode: 'hosted', - is_external: false, - external_type: '', - is_public: true, - public_url_shared: false, - display_as_bot: false, - username: '', - url_private: 'https://test.slack.com/files/test-file', - url_private_download: 'https://test.slack.com/files/test-file/download', - permalink: 'https://test.slack.com/files/test-file/permalink', - permalink_public: 'https://test.slack.com/files/test-file/public', - channels: ['C123456'], - groups: [], - ims: [], - comments_count: 0 - } -}); +const mockAuthTest = jest + .fn<() => Promise>() + .mockResolvedValue({ + ok: true, + url: "https://test.slack.com", + team: "test-team", + user: "test-user", + team_id: "T123456", + user_id: "U123456", + }); + +const mockPostMessage = jest + .fn<() => Promise>() + .mockResolvedValue({ + ok: true, + channel: "C123456", + ts: "1234567890.123456", + message: { + text: "test message", + ts: "1234567890.123456", + type: "message", + }, + }); + +const mockConversationsInfo = jest + .fn<() => Promise>() + .mockResolvedValue({ + ok: true, + channel: { + id: "C123456", + name: "test-channel", + is_channel: true, + created: 12345678, + }, + }); + +const mockFilesUpload = jest + .fn<() => Promise>() + .mockResolvedValue({ + ok: true, + file: { + id: "F123456", + name: "test-file", + title: "test-file", + mimetype: "text/plain", + filetype: "text", + pretty_type: "Plain Text", + user: "U123456", + size: 12345, + mode: "hosted", + is_external: false, + external_type: "", + is_public: true, + public_url_shared: false, + display_as_bot: false, + username: "", + url_private: "https://test.slack.com/files/test-file", + url_private_download: + "https://test.slack.com/files/test-file/download", + permalink: "https://test.slack.com/files/test-file/permalink", + permalink_public: "https://test.slack.com/files/test-file/public", + created: 12345678, + timestamp: 12345678, + channels: ["C123456"], + groups: [], + ims: [], + comments_count: 0, + }, + }); + +const mockFilesUploadV2 = jest + .fn<() => Promise>() + .mockResolvedValue({ + ok: true, + file: { + id: "F123456", + created: 12345678, + timestamp: 12345678, + name: "test-file", + title: "test-file", + mimetype: "text/plain", + filetype: "text", + pretty_type: "Plain Text", + user: "U123456", + size: 12345, + mode: "hosted", + is_external: false, + external_type: "", + is_public: true, + public_url_shared: false, + display_as_bot: false, + username: "", + url_private: "https://test.slack.com/files/test-file", + url_private_download: + "https://test.slack.com/files/test-file/download", + permalink: "https://test.slack.com/files/test-file/permalink", + permalink_public: "https://test.slack.com/files/test-file/public", + channels: ["C123456"], + groups: [], + ims: [], + comments_count: 0, + }, + }); // Create mock WebClient const mockWebClient = { - slackApiUrl: 'https://slack.com/api/', - token: 'test-token', - apiCall: jest.fn(), - auth: { - test: mockAuthTest - }, - chat: { - postMessage: mockPostMessage - }, - conversations: { - info: mockConversationsInfo - }, - files: { - upload: mockFilesUpload, - uploadV2: mockFilesUploadV2 - } + slackApiUrl: "https://slack.com/api/", + token: "test-token", + apiCall: jest.fn(), + auth: { + test: mockAuthTest, + }, + chat: { + postMessage: mockPostMessage, + }, + conversations: { + info: mockConversationsInfo, + }, + files: { + upload: mockFilesUpload, + uploadV2: mockFilesUploadV2, + }, } as unknown as Mocked; // Mock the WebClient constructor -jest.mock('@slack/web-api', () => ({ - WebClient: jest.fn().mockImplementation(() => mockWebClient) +jest.mock("@slack/web-api", () => ({ + WebClient: jest.fn().mockImplementation(() => mockWebClient), })); // Helper function to get mock WebClient export function getMockWebClient(): Mocked { - return mockWebClient; + return mockWebClient; } // Helper function to create mock Slack API responses export function createMockSlackResponse(ok: boolean, data: any = {}) { - return { - ok, - ...data, - }; + return { + ok, + ...data, + }; } // Helper function to simulate rate limiting export function simulateRateLimit(client: Mocked) { - const mockPostMessage = client.chat.postMessage as Mocked; - mockPostMessage.mockRejectedValueOnce(new Error('rate_limited')); + const mockPostMessage = client.chat.postMessage as Mocked< + typeof client.chat.postMessage + >; + mockPostMessage.mockRejectedValueOnce(new Error("rate_limited")); } // Helper function to simulate network errors export function simulateNetworkError(client: Mocked) { - const mockPostMessage = client.chat.postMessage as Mocked; - mockPostMessage.mockRejectedValueOnce(new Error('network_error')); + const mockPostMessage = client.chat.postMessage as Mocked< + typeof client.chat.postMessage + >; + mockPostMessage.mockRejectedValueOnce(new Error("network_error")); } // Global test setup beforeAll(() => { - jest.clearAllMocks(); + jest.clearAllMocks(); }); // Reset mocks after each test afterEach(() => { - jest.clearAllMocks(); -}); \ No newline at end of file + jest.clearAllMocks(); +}); diff --git a/packages/client-slack/src/utils/slack-utils.ts b/packages/client-slack/src/utils/slack-utils.ts index 082eaa8e5c8..04afd2384b7 100644 --- a/packages/client-slack/src/utils/slack-utils.ts +++ b/packages/client-slack/src/utils/slack-utils.ts @@ -1,126 +1,142 @@ -import { WebClient } from '@slack/web-api'; +import { WebClient } from "@slack/web-api"; export interface RetryOptions { - maxRetries?: number; - initialDelay?: number; - maxDelay?: number; + maxRetries?: number; + initialDelay?: number; + maxDelay?: number; } export interface MessageOptions extends RetryOptions { - threadTs?: string; + threadTs?: string; } const DEFAULT_RETRY_OPTIONS: Required = { - maxRetries: 3, - initialDelay: 1000, - maxDelay: 5000, + maxRetries: 3, + initialDelay: 1000, + maxDelay: 5000, }; export class SlackUtils { - /** - * Sends a message to a Slack channel with retry mechanism - */ - static async sendMessageWithRetry( - client: WebClient, - channel: string, - text: string, - options: MessageOptions = {} - ) { - const { threadTs, ...retryOpts } = options; - const finalRetryOpts = { ...DEFAULT_RETRY_OPTIONS, ...retryOpts }; - let lastError: Error | null = null; - - for (let attempt = 0; attempt < finalRetryOpts.maxRetries; attempt++) { - try { - const result = await client.chat.postMessage({ - channel, - text, - thread_ts: threadTs - }); - return result; - } catch (error) { - lastError = error as Error; - if (attempt < finalRetryOpts.maxRetries - 1) { - const delay = Math.min( - finalRetryOpts.initialDelay * Math.pow(2, attempt), - finalRetryOpts.maxDelay - ); - await new Promise(resolve => setTimeout(resolve, delay)); + /** + * Sends a message to a Slack channel with retry mechanism + */ + static async sendMessageWithRetry( + client: WebClient, + channel: string, + text: string, + options: MessageOptions = {} + ) { + const { threadTs, ...retryOpts } = options; + const finalRetryOpts = { ...DEFAULT_RETRY_OPTIONS, ...retryOpts }; + let lastError: Error | null = null; + + for (let attempt = 0; attempt < finalRetryOpts.maxRetries; attempt++) { + try { + const result = await client.chat.postMessage({ + channel, + text, + thread_ts: threadTs, + }); + return result; + } catch (error) { + lastError = error as Error; + if (attempt < finalRetryOpts.maxRetries - 1) { + const delay = Math.min( + finalRetryOpts.initialDelay * Math.pow(2, attempt), + finalRetryOpts.maxDelay + ); + await new Promise((resolve) => setTimeout(resolve, delay)); + } + } } - } + + throw new Error( + `Failed to send message after ${finalRetryOpts.maxRetries} attempts: ${lastError?.message}` + ); } - - throw new Error(`Failed to send message after ${finalRetryOpts.maxRetries} attempts: ${lastError?.message}`); - } - /** - * Validates if a channel exists and is accessible - */ - static async validateChannel(client: WebClient, channelId: string): Promise { - try { - const result = await client.conversations.info({ channel: channelId }); - return result.ok === true; - } catch (error) { - return false; + /** + * Validates if a channel exists and is accessible + */ + static async validateChannel( + client: WebClient, + channelId: string + ): Promise { + try { + const result = await client.conversations.info({ + channel: channelId, + }); + return result.ok === true; + } catch (error) { + console.error(error); + return false; + } } - } - /** - * Formats a message for Slack with optional blocks - */ - static formatMessage(text: string, options?: { - blocks?: any[]; - attachments?: any[]; - }) { - return { - text, - ...options, - }; - } + /** + * Formats a message for Slack with optional blocks + */ + static formatMessage( + text: string, + options?: { + blocks?: any[]; + attachments?: any[]; + } + ) { + return { + text, + ...options, + }; + } - /** - * Creates a thread reply - */ - static async replyInThread( - client: WebClient, - channel: string, - threadTs: string, - text: string, - options: RetryOptions = {} - ) { - return this.sendMessageWithRetry(client, channel, text, { - ...options, - threadTs, - }); - } + /** + * Creates a thread reply + */ + static async replyInThread( + client: WebClient, + channel: string, + threadTs: string, + text: string, + options: RetryOptions = {} + ) { + return this.sendMessageWithRetry(client, channel, text, { + ...options, + threadTs, + }); + } - /** - * Handles rate limiting by implementing exponential backoff - */ - static async withRateLimit( - fn: () => Promise, - options: RetryOptions = {} - ): Promise { - const retryOpts = { ...DEFAULT_RETRY_OPTIONS, ...options }; - let lastError: Error | null = null; + /** + * Handles rate limiting by implementing exponential backoff + */ + static async withRateLimit( + fn: () => Promise, + options: RetryOptions = {} + ): Promise { + const retryOpts = { ...DEFAULT_RETRY_OPTIONS, ...options }; + let lastError: Error | null = null; - for (let attempt = 0; attempt < retryOpts.maxRetries; attempt++) { - try { - return await fn(); - } catch (error) { - lastError = error as Error; - if (error instanceof Error && error.message.includes('rate_limited')) { - const delay = Math.min( - retryOpts.initialDelay * Math.pow(2, attempt), - retryOpts.maxDelay - ); - await new Promise(resolve => setTimeout(resolve, delay)); - continue; + for (let attempt = 0; attempt < retryOpts.maxRetries; attempt++) { + try { + return await fn(); + } catch (error) { + lastError = error as Error; + if ( + error instanceof Error && + error.message.includes("rate_limited") + ) { + const delay = Math.min( + retryOpts.initialDelay * Math.pow(2, attempt), + retryOpts.maxDelay + ); + await new Promise((resolve) => setTimeout(resolve, delay)); + continue; + } + throw error; + } } - throw error; - } + + throw new Error( + `Operation failed after ${retryOpts.maxRetries} attempts: ${lastError?.message}` + ); } - - throw new Error(`Operation failed after ${retryOpts.maxRetries} attempts: ${lastError?.message}`); - } -} \ No newline at end of file +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2e76e12b237..ccb31a98011 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -622,15 +622,6 @@ importers: '@types/node': specifier: ^18.15.11 version: 18.19.68 - '@typescript-eslint/eslint-plugin': - specifier: ^5.59.0 - version: 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.1)(typescript@5.6.3) - '@typescript-eslint/parser': - specifier: ^5.59.0 - version: 5.62.0(eslint@8.57.1)(typescript@5.6.3) - eslint: - specifier: ^8.38.0 - version: 8.57.1 jest: specifier: ^29.5.0 version: 29.7.0(@types/node@18.19.68)(ts-node@10.9.2) @@ -998,7 +989,7 @@ importers: version: 8.3.5(postcss@8.4.49)(typescript@5.6.3) viem: specifier: 2.21.53 - version: 2.21.53(typescript@5.6.3) + version: 2.21.53(typescript@5.6.3)(zod@3.23.8) whatwg-url: specifier: 7.1.0 version: 7.1.0 @@ -1077,7 +1068,7 @@ importers: version: 8.3.5(postcss@8.4.49)(typescript@5.6.3) viem: specifier: 2.21.53 - version: 2.21.53(typescript@5.6.3) + version: 2.21.53(typescript@5.6.3)(zod@3.23.8) whatwg-url: specifier: 7.1.0 version: 7.1.0 @@ -1490,7 +1481,7 @@ importers: version: 8.3.5(postcss@8.4.49)(typescript@5.6.3) viem: specifier: 2.21.53 - version: 2.21.53(typescript@5.6.3) + version: 2.21.53(typescript@5.6.3)(zod@3.23.8) whatwg-url: specifier: 7.1.0 version: 7.1.0 @@ -4451,7 +4442,7 @@ packages: bech32: 2.0.0 bitcoinjs-lib: 7.0.0-rc.0(typescript@5.6.3) bs58: 6.0.0 - viem: 2.21.53(typescript@5.6.3) + viem: 2.21.53(typescript@5.6.3)(zod@3.23.8) dev: false /@braintree/sanitize-url@7.1.0: @@ -4542,7 +4533,7 @@ packages: ethers: 6.13.4 node-jose: 2.2.0 secp256k1: 5.0.1 - viem: 2.21.53(typescript@5.6.3) + viem: 2.21.53(typescript@5.6.3)(zod@3.23.8) transitivePeerDependencies: - bufferutil - debug @@ -7121,6 +7112,7 @@ packages: dependencies: eslint: 8.57.1 eslint-visitor-keys: 3.4.3 + dev: false /@eslint-community/eslint-utils@4.4.1(eslint@9.16.0): resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} @@ -7166,6 +7158,7 @@ packages: strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color + dev: false /@eslint/eslintrc@3.2.0: resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} @@ -7186,6 +7179,7 @@ packages: /@eslint/js@8.57.1: resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: false /@eslint/js@9.16.0: resolution: {integrity: sha512-tw2HxzQkrbeuvyj1tG2Yqq+0H9wGoI2IMk4EOsQeX+vmd75FtJAzf+gTA69WF+baUKRYQ3x2kbLE08js5OsTVg==} @@ -7513,7 +7507,7 @@ packages: viem: 2.21.49 dependencies: '@goat-sdk/core': 0.3.8(typescript@5.6.3) - viem: 2.21.53(typescript@5.6.3) + viem: 2.21.53(typescript@5.6.3)(zod@3.23.8) zod: 3.23.8 dev: false @@ -7525,7 +7519,7 @@ packages: viem: ^2.21.49 dependencies: '@goat-sdk/core': 0.3.8(typescript@5.6.3) - viem: 2.21.53(typescript@5.6.3) + viem: 2.21.53(typescript@5.6.3)(zod@3.23.8) zod: 3.23.8 dev: false @@ -7537,7 +7531,7 @@ packages: viem: ^2.21.49 dependencies: '@goat-sdk/core': 0.3.8(typescript@5.6.3) - viem: 2.21.53(typescript@5.6.3) + viem: 2.21.53(typescript@5.6.3)(zod@3.23.8) dev: false /@google-cloud/vertexai@1.9.2: @@ -7598,6 +7592,7 @@ packages: minimatch: 3.1.2 transitivePeerDependencies: - supports-color + dev: false /@humanwhocodes/module-importer@1.0.1: resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} @@ -7606,6 +7601,7 @@ packages: /@humanwhocodes/object-schema@2.0.3: resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} deprecated: Use @eslint/object-schema instead + dev: false /@humanwhocodes/retry@0.3.1: resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} @@ -8297,7 +8293,7 @@ packages: bech32: 2.0.0 bitcoinjs-lib: 7.0.0-rc.0(typescript@5.6.3) bs58: 6.0.0 - viem: 2.21.53(typescript@5.6.3) + viem: 2.21.53(typescript@5.6.3)(zod@3.23.8) transitivePeerDependencies: - typescript dev: false @@ -8714,7 +8710,7 @@ packages: dependencies: '@openapitools/openapi-generator-cli': 2.15.3 semver: 7.6.3 - viem: 2.21.53(typescript@5.6.3) + viem: 2.21.53(typescript@5.6.3)(zod@3.23.8) transitivePeerDependencies: - '@nestjs/microservices' - '@nestjs/platform-express' @@ -10333,7 +10329,7 @@ packages: resolution: {integrity: sha512-/JNlCDvgQmqAs+3N9qbRjqQdm4UCd1iYmkjH7cE7ejwWcoF4b4bSikiQdMK+fQ3be8T7FJupjWw52ysHWsnwmQ==} engines: {node: '>=18.0.0'} optionalDependencies: - viem: 2.21.53(typescript@5.6.3) + viem: 2.21.53(typescript@5.6.3)(zod@3.23.8) transitivePeerDependencies: - bufferutil - typescript @@ -13881,10 +13877,6 @@ packages: '@types/node': 20.17.9 dev: false - /@types/semver@7.5.8: - resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} - dev: true - /@types/send@0.17.4: resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} dependencies: @@ -13989,34 +13981,6 @@ packages: dev: false optional: true - /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.1)(typescript@5.6.3): - resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - '@typescript-eslint/parser': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.6.3) - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.1)(typescript@5.6.3) - '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.6.3) - debug: 4.4.0(supports-color@8.1.1) - eslint: 8.57.1 - graphemer: 1.4.0 - ignore: 5.3.2 - natural-compare-lite: 1.4.0 - semver: 7.6.3 - tsutils: 3.21.0(typescript@5.6.3) - typescript: 5.6.3 - transitivePeerDependencies: - - supports-color - dev: true - /@typescript-eslint/eslint-plugin@8.11.0(@typescript-eslint/parser@8.11.0)(eslint@9.16.0)(typescript@5.6.3): resolution: {integrity: sha512-KhGn2LjW1PJT2A/GfDpiyOfS4a8xHQv2myUagTM5+zsormOmBlYsnQ6pobJ8XxJmh6hnHwa2Mbe3fPrDJoDhbA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -14071,26 +14035,6 @@ packages: - supports-color dev: true - /@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.6.3): - resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.6.3) - debug: 4.4.0(supports-color@8.1.1) - eslint: 8.57.1 - typescript: 5.6.3 - transitivePeerDependencies: - - supports-color - dev: true - /@typescript-eslint/parser@8.11.0(eslint@9.16.0)(typescript@5.6.3): resolution: {integrity: sha512-lmt73NeHdy1Q/2ul295Qy3uninSqi6wQI18XwSpm8w0ZbQXUpjCAWP1Vlv/obudoBiIjJVjlztjQ+d/Md98Yxg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -14133,14 +14077,6 @@ packages: - supports-color dev: true - /@typescript-eslint/scope-manager@5.62.0: - resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 - dev: true - /@typescript-eslint/scope-manager@8.11.0: resolution: {integrity: sha512-Uholz7tWhXmA4r6epo+vaeV7yjdKy5QFCERMjs1kMVsLRKIrSdM6o21W2He9ftp5PP6aWOVpD5zvrvuHZC0bMQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -14157,26 +14093,6 @@ packages: '@typescript-eslint/visitor-keys': 8.16.0 dev: true - /@typescript-eslint/type-utils@5.62.0(eslint@8.57.1)(typescript@5.6.3): - resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: '*' - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.6.3) - '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.6.3) - debug: 4.4.0(supports-color@8.1.1) - eslint: 8.57.1 - tsutils: 3.21.0(typescript@5.6.3) - typescript: 5.6.3 - transitivePeerDependencies: - - supports-color - dev: true - /@typescript-eslint/type-utils@8.11.0(eslint@9.16.0)(typescript@5.6.3): resolution: {integrity: sha512-ItiMfJS6pQU0NIKAaybBKkuVzo6IdnAhPFZA/2Mba/uBjuPQPet/8+zh5GtLHwmuFRShZx+8lhIs7/QeDHflOg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -14216,11 +14132,6 @@ packages: - supports-color dev: true - /@typescript-eslint/types@5.62.0: - resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - /@typescript-eslint/types@8.11.0: resolution: {integrity: sha512-tn6sNMHf6EBAYMvmPUaKaVeYvhUsrE6x+bXQTxjQRp360h1giATU0WvgeEys1spbvb5R+VpNOZ+XJmjD8wOUHw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -14231,27 +14142,6 @@ packages: engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} dev: true - /@typescript-eslint/typescript-estree@5.62.0(typescript@5.6.3): - resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.4.0(supports-color@8.1.1) - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.6.3 - tsutils: 3.21.0(typescript@5.6.3) - typescript: 5.6.3 - transitivePeerDependencies: - - supports-color - dev: true - /@typescript-eslint/typescript-estree@8.11.0(typescript@5.6.3): resolution: {integrity: sha512-yHC3s1z1RCHoCz5t06gf7jH24rr3vns08XXhfEqzYpd6Hll3z/3g23JRi0jM8A47UFKNc3u/y5KIMx8Ynbjohg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -14296,26 +14186,6 @@ packages: - supports-color dev: true - /@typescript-eslint/utils@5.62.0(eslint@8.57.1)(typescript@5.6.3): - resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) - '@types/json-schema': 7.0.15 - '@types/semver': 7.5.8 - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.6.3) - eslint: 8.57.1 - eslint-scope: 5.1.1 - semver: 7.6.3 - transitivePeerDependencies: - - supports-color - - typescript - dev: true - /@typescript-eslint/utils@8.11.0(eslint@9.16.0)(typescript@5.6.3): resolution: {integrity: sha512-CYiX6WZcbXNJV7UNB4PLDIBtSdRmRI/nb0FMyqHPTQD1rMjA0foPLaPUV39C/MxkTd/QKSeX+Gb34PPsDVC35g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -14352,14 +14222,6 @@ packages: - supports-color dev: true - /@typescript-eslint/visitor-keys@5.62.0: - resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.62.0 - eslint-visitor-keys: 3.4.3 - dev: true - /@typescript-eslint/visitor-keys@8.11.0: resolution: {integrity: sha512-EaewX6lxSjRJnc+99+dqzTeoDZUfyrA52d2/HRrkI830kgovWsmIiTfmr0NZorzqic7ga+1bS60lRBUgR3n/Bw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -19278,6 +19140,7 @@ packages: engines: {node: '>=6.0.0'} dependencies: esutils: 2.0.3 + dev: false /docusaurus-lunr-search@3.5.0(@docusaurus/core@3.6.3)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-k3zN4jYMi/prWInJILGKOxE+BVcgYinwj9+gcECsYm52tS+4ZKzXQzbPnVJAEXmvKOfFMcDFvS3MSmm6cEaxIQ==} @@ -20011,6 +19874,7 @@ packages: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 + dev: false /eslint-scope@8.2.0: resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==} @@ -20073,6 +19937,7 @@ packages: text-table: 0.2.0 transitivePeerDependencies: - supports-color + dev: false /eslint@9.16.0: resolution: {integrity: sha512-whp8mSQI4C8VXd+fLgSM0lh3UlmcFtVwUQjyKCFfsp+2ItAIYhlq/hqGahGqHE6cv9unM41VlqKk2VtKYR2TaA==} @@ -20171,6 +20036,7 @@ packages: acorn: 8.14.0 acorn-jsx: 5.3.2(acorn@8.14.0) eslint-visitor-keys: 3.4.3 + dev: false /esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} @@ -20748,6 +20614,7 @@ packages: engines: {node: ^10.12.0 || >=12.0.0} dependencies: flat-cache: 3.2.0 + dev: false /file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} @@ -20877,6 +20744,7 @@ packages: flatted: 3.3.2 keyv: 4.5.4 rimraf: 3.0.2 + dev: false /flat-cache@4.0.1: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} @@ -21563,6 +21431,7 @@ packages: engines: {node: '>=8'} dependencies: type-fest: 0.20.2 + dev: false /globals@14.0.0: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} @@ -22960,6 +22829,7 @@ packages: /is-path-inside@3.0.3: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} + dev: false /is-plain-obj@1.1.0: resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} @@ -26392,10 +26262,6 @@ packages: resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} dev: false - /natural-compare-lite@1.4.0: - resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} - dev: true - /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -27304,7 +27170,7 @@ packages: '@noble/hashes': 1.5.0 dev: false - /ox@0.1.2(typescript@5.6.3): + /ox@0.1.2(typescript@5.6.3)(zod@3.23.8): resolution: {integrity: sha512-ak/8K0Rtphg9vnRJlbOdaX9R7cmxD2MiSthjWGaQdMk3D7hrAlDoM+6Lxn7hN52Za3vrXfZ7enfke/5WjolDww==} peerDependencies: typescript: '>=5.4.0' @@ -27324,26 +27190,6 @@ packages: - zod dev: false - /ox@0.1.2(typescript@5.6.3)(zod@3.23.8): - resolution: {integrity: sha512-ak/8K0Rtphg9vnRJlbOdaX9R7cmxD2MiSthjWGaQdMk3D7hrAlDoM+6Lxn7hN52Za3vrXfZ7enfke/5WjolDww==} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@adraffy/ens-normalize': 1.11.0 - '@noble/curves': 1.7.0 - '@noble/hashes': 1.6.1 - '@scure/bip32': 1.6.0 - '@scure/bip39': 1.5.0 - abitype: 1.0.6(typescript@5.6.3)(zod@3.23.8) - eventemitter3: 5.0.1 - typescript: 5.6.3 - transitivePeerDependencies: - - zod - dev: false - /p-cancelable@2.1.1: resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} engines: {node: '>=8'} @@ -32590,6 +32436,7 @@ packages: /text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: false /thenby@1.3.4: resolution: {integrity: sha512-89Gi5raiWA3QZ4b2ePcEwswC3me9JIg+ToSgtE0JWeCynLnLxNr/f9G+xfo9K+Oj4AFdom8YNJjibIARTJmapQ==} @@ -33078,6 +32925,7 @@ packages: /tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + dev: false /tslib@1.9.3: resolution: {integrity: sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==} @@ -33150,16 +32998,6 @@ packages: - tsx - yaml - /tsutils@3.21.0(typescript@5.6.3): - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} - engines: {node: '>= 6'} - peerDependencies: - typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' - dependencies: - tslib: 1.14.1 - typescript: 5.6.3 - dev: true - /tty-browserify@0.0.1: resolution: {integrity: sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==} dev: false @@ -33287,6 +33125,7 @@ packages: /type-fest@0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} + dev: false /type-fest@0.21.3: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} @@ -34112,30 +33951,6 @@ packages: '@types/unist': 3.0.3 vfile-message: 4.0.2 - /viem@2.21.53(typescript@5.6.3): - resolution: {integrity: sha512-0pY8clBacAwzc59iV1vY4a6U4xvRlA5tAuhClJCKvqA6rXJzmNMMvxQ0EG79lkHr7WtBEruXz8nAmONXwnq4EQ==} - peerDependencies: - typescript: '>=5.0.4' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@noble/curves': 1.6.0 - '@noble/hashes': 1.5.0 - '@scure/bip32': 1.5.0 - '@scure/bip39': 1.4.0 - abitype: 1.0.6(typescript@5.6.3)(zod@3.23.8) - isows: 1.0.6(ws@8.18.0) - ox: 0.1.2(typescript@5.6.3) - typescript: 5.6.3 - webauthn-p256: 0.0.10 - ws: 8.18.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - zod - dev: false - /viem@2.21.53(typescript@5.6.3)(zod@3.23.8): resolution: {integrity: sha512-0pY8clBacAwzc59iV1vY4a6U4xvRlA5tAuhClJCKvqA6rXJzmNMMvxQ0EG79lkHr7WtBEruXz8nAmONXwnq4EQ==} peerDependencies: