moved folders around
This commit is contained in:
parent
4f89affc2b
commit
36cb84b343
202 changed files with 1160 additions and 660 deletions
|
|
@ -14,11 +14,11 @@
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@stock-bot/cache": "*",
|
"@stock-bot/cache": "*",
|
||||||
"@stock-bot/config": "*",
|
"@stock-bot/config": "*",
|
||||||
"@stock-bot/connection-factory": "*",
|
"@stock-bot/di": "*",
|
||||||
"@stock-bot/logger": "*",
|
"@stock-bot/logger": "*",
|
||||||
"@stock-bot/mongodb-client": "*",
|
"@stock-bot/mongodb": "*",
|
||||||
"@stock-bot/postgres-client": "*",
|
"@stock-bot/postgres": "*",
|
||||||
"@stock-bot/questdb-client": "*",
|
"@stock-bot/questdb": "*",
|
||||||
"@stock-bot/queue": "*",
|
"@stock-bot/queue": "*",
|
||||||
"@stock-bot/shutdown": "*",
|
"@stock-bot/shutdown": "*",
|
||||||
"@stock-bot/utils": "*",
|
"@stock-bot/utils": "*",
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
/**
|
/**
|
||||||
* IB Exchanges Operations - Fetching exchange data from IB API
|
* IB Exchanges Operations - Fetching exchange data from IB API
|
||||||
*/
|
*/
|
||||||
import { OperationContext } from '@stock-bot/utils';
|
import { OperationContext } from '@stock-bot/di';
|
||||||
import type { ServiceContainer } from '@stock-bot/connection-factory';
|
import type { ServiceContainer } from '@stock-bot/connection-factory';
|
||||||
|
|
||||||
import { IB_CONFIG } from '../shared/config';
|
import { IB_CONFIG } from '../shared/config';
|
||||||
|
|
|
||||||
|
|
@ -2,8 +2,8 @@
|
||||||
* IB Session Operations - Browser automation for session headers
|
* IB Session Operations - Browser automation for session headers
|
||||||
*/
|
*/
|
||||||
import { Browser } from '@stock-bot/browser';
|
import { Browser } from '@stock-bot/browser';
|
||||||
import { OperationContext } from '@stock-bot/utils';
|
import { OperationContext } from '@stock-bot/di';
|
||||||
import type { ServiceContainer } from '@stock-bot/connection-factory';
|
import type { ServiceContainer } from '@stock-bot/di';
|
||||||
|
|
||||||
import { IB_CONFIG } from '../shared/config';
|
import { IB_CONFIG } from '../shared/config';
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
/**
|
/**
|
||||||
* IB Symbols Operations - Fetching symbol data from IB API
|
* IB Symbols Operations - Fetching symbol data from IB API
|
||||||
*/
|
*/
|
||||||
import { OperationContext } from '@stock-bot/utils';
|
import { OperationContext } from '@stock-bot/di';
|
||||||
import type { ServiceContainer } from '@stock-bot/connection-factory';
|
import type { ServiceContainer } from '@stock-bot/connection-factory';
|
||||||
|
|
||||||
import { IB_CONFIG } from '../shared/config';
|
import { IB_CONFIG } from '../shared/config';
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
* Proxy Check Operations - Checking proxy functionality
|
* Proxy Check Operations - Checking proxy functionality
|
||||||
*/
|
*/
|
||||||
import { HttpClient, ProxyInfo } from '@stock-bot/http';
|
import { HttpClient, ProxyInfo } from '@stock-bot/http';
|
||||||
import { OperationContext } from '@stock-bot/utils';
|
import { OperationContext } from '@stock-bot/di';
|
||||||
|
|
||||||
import { PROXY_CONFIG } from '../shared/config';
|
import { PROXY_CONFIG } from '../shared/config';
|
||||||
import { ProxyStatsManager } from '../shared/proxy-manager';
|
import { ProxyStatsManager } from '../shared/proxy-manager';
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
* Proxy Fetch Operations - Fetching proxies from sources
|
* Proxy Fetch Operations - Fetching proxies from sources
|
||||||
*/
|
*/
|
||||||
import { HttpClient, ProxyInfo } from '@stock-bot/http';
|
import { HttpClient, ProxyInfo } from '@stock-bot/http';
|
||||||
import { OperationContext } from '@stock-bot/utils';
|
import { OperationContext } from '@stock-bot/di';
|
||||||
|
|
||||||
import { PROXY_CONFIG } from '../shared/config';
|
import { PROXY_CONFIG } from '../shared/config';
|
||||||
import { ProxyStatsManager } from '../shared/proxy-manager';
|
import { ProxyStatsManager } from '../shared/proxy-manager';
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
* Proxy Query Operations - Getting active proxies from cache
|
* Proxy Query Operations - Getting active proxies from cache
|
||||||
*/
|
*/
|
||||||
import { ProxyInfo } from '@stock-bot/http';
|
import { ProxyInfo } from '@stock-bot/http';
|
||||||
import { OperationContext } from '@stock-bot/utils';
|
import { OperationContext } from '@stock-bot/di';
|
||||||
|
|
||||||
import { PROXY_CONFIG } from '../shared/config';
|
import { PROXY_CONFIG } from '../shared/config';
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
*/
|
*/
|
||||||
import { ProxyInfo } from '@stock-bot/http';
|
import { ProxyInfo } from '@stock-bot/http';
|
||||||
import { QueueManager } from '@stock-bot/queue';
|
import { QueueManager } from '@stock-bot/queue';
|
||||||
import { OperationContext } from '@stock-bot/utils';
|
import { OperationContext } from '@stock-bot/di';
|
||||||
|
|
||||||
export async function queueProxyFetch(): Promise<string> {
|
export async function queueProxyFetch(): Promise<string> {
|
||||||
const ctx = OperationContext.create('proxy', 'queue-fetch');
|
const ctx = OperationContext.create('proxy', 'queue-fetch');
|
||||||
|
|
|
||||||
|
|
@ -1,56 +1,6 @@
|
||||||
/**
|
/**
|
||||||
* Proxy Stats Manager - Singleton for managing proxy statistics
|
* Proxy Manager - Simplified without stats tracking
|
||||||
*/
|
*/
|
||||||
import type { ProxySource } from './types';
|
|
||||||
import { PROXY_CONFIG } from './config';
|
|
||||||
|
|
||||||
export class ProxyStatsManager {
|
// This file is kept for compatibility but ProxyStatsManager has been removed
|
||||||
private static instance: ProxyStatsManager | null = null;
|
// All proxy management is now handled by the global ProxyManager in @stock-bot/utils
|
||||||
private proxyStats: ProxySource[] = [];
|
|
||||||
|
|
||||||
private constructor() {
|
|
||||||
this.resetStats();
|
|
||||||
}
|
|
||||||
|
|
||||||
static getInstance(): ProxyStatsManager {
|
|
||||||
if (!ProxyStatsManager.instance) {
|
|
||||||
ProxyStatsManager.instance = new ProxyStatsManager();
|
|
||||||
}
|
|
||||||
return ProxyStatsManager.instance;
|
|
||||||
}
|
|
||||||
|
|
||||||
resetStats(): void {
|
|
||||||
this.proxyStats = PROXY_CONFIG.PROXY_SOURCES.map(source => ({
|
|
||||||
id: source.id,
|
|
||||||
total: 0,
|
|
||||||
working: 0,
|
|
||||||
lastChecked: new Date(),
|
|
||||||
protocol: source.protocol,
|
|
||||||
url: source.url,
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
|
|
||||||
getStats(): ProxySource[] {
|
|
||||||
return [...this.proxyStats];
|
|
||||||
}
|
|
||||||
|
|
||||||
updateSourceStats(sourceId: string, success: boolean): ProxySource | undefined {
|
|
||||||
const source = this.proxyStats.find(s => s.id === sourceId);
|
|
||||||
if (source) {
|
|
||||||
if (typeof source.working !== 'number') {
|
|
||||||
source.working = 0;
|
|
||||||
}
|
|
||||||
if (typeof source.total !== 'number') {
|
|
||||||
source.total = 0;
|
|
||||||
}
|
|
||||||
source.total += 1;
|
|
||||||
if (success) {
|
|
||||||
source.working += 1;
|
|
||||||
}
|
|
||||||
source.percentWorking = (source.working / source.total) * 100;
|
|
||||||
source.lastChecked = new Date();
|
|
||||||
return source;
|
|
||||||
}
|
|
||||||
return undefined;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
* QM Exchanges Operations - Exchange fetching functionality
|
* QM Exchanges Operations - Exchange fetching functionality
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { OperationContext } from '@stock-bot/utils';
|
import { OperationContext } from '@stock-bot/di';
|
||||||
import type { ServiceContainer } from '@stock-bot/connection-factory';
|
import type { ServiceContainer } from '@stock-bot/connection-factory';
|
||||||
|
|
||||||
import { initializeQMResources } from './session.operations';
|
import { initializeQMResources } from './session.operations';
|
||||||
|
|
|
||||||
|
|
@ -2,9 +2,9 @@
|
||||||
* QM Session Operations - Session creation and management
|
* QM Session Operations - Session creation and management
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { OperationContext } from '@stock-bot/utils';
|
import { OperationContext } from '@stock-bot/di';
|
||||||
import { isShutdownSignalReceived } from '@stock-bot/shutdown';
|
import { isShutdownSignalReceived } from '@stock-bot/shutdown';
|
||||||
import { getRandomProxy } from '@stock-bot/utils';
|
import { getRandomProxy } from '@stock-bot/di';
|
||||||
import type { ServiceContainer } from '@stock-bot/connection-factory';
|
import type { ServiceContainer } from '@stock-bot/connection-factory';
|
||||||
|
|
||||||
import { QMSessionManager } from '../shared/session-manager';
|
import { QMSessionManager } from '../shared/session-manager';
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
* QM Spider Operations - Symbol spider search functionality
|
* QM Spider Operations - Symbol spider search functionality
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { OperationContext } from '@stock-bot/utils';
|
import { OperationContext } from '@stock-bot/di';
|
||||||
import { QueueManager } from '@stock-bot/queue';
|
import { QueueManager } from '@stock-bot/queue';
|
||||||
|
|
||||||
import { QMSessionManager } from '../shared/session-manager';
|
import { QMSessionManager } from '../shared/session-manager';
|
||||||
|
|
|
||||||
|
|
@ -2,9 +2,9 @@
|
||||||
* QM Symbols Operations - Symbol fetching and API interactions
|
* QM Symbols Operations - Symbol fetching and API interactions
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { OperationContext } from '@stock-bot/utils';
|
import { OperationContext } from '@stock-bot/di';
|
||||||
import { getRandomProxy } from '@stock-bot/utils';
|
import { getRandomProxy } from '@stock-bot/utils';
|
||||||
import type { ServiceContainer } from '@stock-bot/connection-factory';
|
import type { ServiceContainer } from '@stock-bot/di';
|
||||||
|
|
||||||
import { QMSessionManager } from '../shared/session-manager';
|
import { QMSessionManager } from '../shared/session-manager';
|
||||||
import { QM_SESSION_IDS, QM_CONFIG, SESSION_CONFIG } from '../shared/config';
|
import { QM_SESSION_IDS, QM_CONFIG, SESSION_CONFIG } from '../shared/config';
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
* WebShare Fetch Operations - API integration
|
* WebShare Fetch Operations - API integration
|
||||||
*/
|
*/
|
||||||
import { type ProxyInfo } from '@stock-bot/http';
|
import { type ProxyInfo } from '@stock-bot/http';
|
||||||
import { OperationContext } from '@stock-bot/utils';
|
import { OperationContext } from '@stock-bot/di';
|
||||||
|
|
||||||
import { WEBSHARE_CONFIG } from '../shared/config';
|
import { WEBSHARE_CONFIG } from '../shared/config';
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ import {
|
||||||
type HandlerConfigWithSchedule,
|
type HandlerConfigWithSchedule,
|
||||||
} from '@stock-bot/queue';
|
} from '@stock-bot/queue';
|
||||||
import { updateProxies } from '@stock-bot/utils';
|
import { updateProxies } from '@stock-bot/utils';
|
||||||
import type { ServiceContainer } from '@stock-bot/connection-factory';
|
import type { ServiceContainer } from '@stock-bot/di';
|
||||||
|
|
||||||
const logger = getLogger('webshare-provider');
|
const logger = getLogger('webshare-provider');
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,10 +4,10 @@ import { Hono } from 'hono';
|
||||||
import { cors } from 'hono/cors';
|
import { cors } from 'hono/cors';
|
||||||
// Library imports
|
// Library imports
|
||||||
import { getLogger, setLoggerConfig, shutdownLoggers } from '@stock-bot/logger';
|
import { getLogger, setLoggerConfig, shutdownLoggers } from '@stock-bot/logger';
|
||||||
import { QueueManager, type QueueManagerConfig } from '@stock-bot/queue';
|
import type { QueueManager } from '@stock-bot/queue';
|
||||||
import { Shutdown } from '@stock-bot/shutdown';
|
import { Shutdown } from '@stock-bot/shutdown';
|
||||||
import { ProxyManager } from '@stock-bot/utils';
|
import { ProxyManager } from '@stock-bot/di';
|
||||||
import type { ServiceContainer } from '@stock-bot/connection-factory';
|
import type { ServiceContainer } from '@stock-bot/di';
|
||||||
// Local imports
|
// Local imports
|
||||||
import { setupServiceContainer } from './setup/database-setup';
|
import { setupServiceContainer } from './setup/database-setup';
|
||||||
import { createRoutes } from './routes/create-routes';
|
import { createRoutes } from './routes/create-routes';
|
||||||
|
|
@ -68,35 +68,10 @@ async function initializeServices() {
|
||||||
const routes = createRoutes(serviceContainer);
|
const routes = createRoutes(serviceContainer);
|
||||||
app.route('/', routes);
|
app.route('/', routes);
|
||||||
|
|
||||||
// Initialize queue system (with delayed worker start)
|
// Get queue manager from service container
|
||||||
logger.debug('Initializing queue system...');
|
logger.debug('Getting queue manager from service container...');
|
||||||
const queueManagerConfig: QueueManagerConfig = {
|
queueManager = await serviceContainer.resolveAsync<QueueManager>('queue');
|
||||||
redis: queueConfig?.redis || {
|
logger.info('Queue system resolved from container');
|
||||||
host: 'localhost',
|
|
||||||
port: 6379,
|
|
||||||
db: 1,
|
|
||||||
},
|
|
||||||
defaultQueueOptions: {
|
|
||||||
defaultJobOptions: queueConfig?.defaultJobOptions || {
|
|
||||||
attempts: 3,
|
|
||||||
backoff: {
|
|
||||||
type: 'exponential',
|
|
||||||
delay: 1000,
|
|
||||||
},
|
|
||||||
removeOnComplete: 10,
|
|
||||||
removeOnFail: 5,
|
|
||||||
},
|
|
||||||
workers: 2,
|
|
||||||
concurrency: 1,
|
|
||||||
enableMetrics: true,
|
|
||||||
enableDLQ: true,
|
|
||||||
},
|
|
||||||
enableScheduledJobs: true,
|
|
||||||
delayWorkerStart: true, // Prevent workers from starting until all singletons are ready
|
|
||||||
};
|
|
||||||
|
|
||||||
queueManager = QueueManager.getOrInitialize(queueManagerConfig);
|
|
||||||
logger.info('Queue system initialized');
|
|
||||||
|
|
||||||
// Initialize proxy manager
|
// Initialize proxy manager
|
||||||
logger.debug('Initializing proxy manager...');
|
logger.debug('Initializing proxy manager...');
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,11 @@
|
||||||
import { getDatabaseConfig } from '@stock-bot/config';
|
import { getDatabaseConfig, getQueueConfig } from '@stock-bot/config';
|
||||||
import { getLogger } from '@stock-bot/logger';
|
import { getLogger } from '@stock-bot/logger';
|
||||||
import {
|
import {
|
||||||
ConnectionFactory,
|
ConnectionFactory,
|
||||||
ServiceContainer,
|
ServiceContainer,
|
||||||
PoolSizeCalculator
|
PoolSizeCalculator
|
||||||
} from '@stock-bot/connection-factory';
|
} from '@stock-bot/di';
|
||||||
import type { ConnectionFactoryConfig, DynamicPoolConfig } from '@stock-bot/mongodb-client';
|
import type { ConnectionFactoryConfig, DynamicPoolConfig } from '@stock-bot/mongodb';
|
||||||
|
|
||||||
const logger = getLogger('database-setup');
|
const logger = getLogger('database-setup');
|
||||||
|
|
||||||
|
|
@ -27,6 +27,9 @@ export function createConnectionFactory(): ConnectionFactory {
|
||||||
},
|
},
|
||||||
cache: {
|
cache: {
|
||||||
poolSize: 20,
|
poolSize: 20,
|
||||||
|
},
|
||||||
|
queue: {
|
||||||
|
poolSize: 1, // QueueManager is a singleton
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
@ -42,6 +45,7 @@ export async function setupServiceContainer(): Promise<ServiceContainer> {
|
||||||
|
|
||||||
const connectionFactory = createConnectionFactory();
|
const connectionFactory = createConnectionFactory();
|
||||||
const dbConfig = getDatabaseConfig();
|
const dbConfig = getDatabaseConfig();
|
||||||
|
const queueConfig = getQueueConfig();
|
||||||
|
|
||||||
// Create base container
|
// Create base container
|
||||||
const container = new ServiceContainer('data-ingestion');
|
const container = new ServiceContainer('data-ingestion');
|
||||||
|
|
@ -130,6 +134,45 @@ export async function setupServiceContainer(): Promise<ServiceContainer> {
|
||||||
singleton: true,
|
singleton: true,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Register QueueManager
|
||||||
|
container.register({
|
||||||
|
name: 'queue',
|
||||||
|
factory: () => {
|
||||||
|
const pool = connectionFactory.createQueue({
|
||||||
|
name: 'default',
|
||||||
|
config: {
|
||||||
|
redis: queueConfig?.redis || {
|
||||||
|
host: dbConfig.dragonfly.host,
|
||||||
|
port: dbConfig.dragonfly.port,
|
||||||
|
db: dbConfig.dragonfly.db || 1,
|
||||||
|
},
|
||||||
|
defaultQueueOptions: {
|
||||||
|
defaultJobOptions: queueConfig?.defaultJobOptions || {
|
||||||
|
attempts: 3,
|
||||||
|
backoff: {
|
||||||
|
type: 'exponential',
|
||||||
|
delay: 1000,
|
||||||
|
},
|
||||||
|
removeOnComplete: 10,
|
||||||
|
removeOnFail: 5,
|
||||||
|
},
|
||||||
|
workers: 2,
|
||||||
|
concurrency: 1,
|
||||||
|
enableMetrics: true,
|
||||||
|
enableDLQ: true,
|
||||||
|
},
|
||||||
|
enableScheduledJobs: true,
|
||||||
|
delayWorkerStart: true,
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return pool.client;
|
||||||
|
},
|
||||||
|
singleton: true,
|
||||||
|
dispose: async (queueManager) => {
|
||||||
|
await queueManager.shutdown();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// Register the connection factory itself for pool management
|
// Register the connection factory itself for pool management
|
||||||
container.register({
|
container.register({
|
||||||
name: 'connectionFactory',
|
name: 'connectionFactory',
|
||||||
|
|
|
||||||
|
|
@ -1,116 +0,0 @@
|
||||||
import { getDatabaseConfig } from '@stock-bot/config';
|
|
||||||
import { getLogger } from '@stock-bot/logger';
|
|
||||||
import { createMongoDBClient, createPostgreSQLClient } from '@stock-bot/connection-factory';
|
|
||||||
import type { DynamicPoolConfig } from '@stock-bot/mongodb-client';
|
|
||||||
|
|
||||||
const logger = getLogger('dynamic-pool-example');
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Example of setting up dynamic pool sizing for high-load scenarios
|
|
||||||
*/
|
|
||||||
export async function setupDynamicPools() {
|
|
||||||
const dbConfig = getDatabaseConfig();
|
|
||||||
|
|
||||||
// Dynamic pool configuration for batch processing
|
|
||||||
const dynamicConfig: DynamicPoolConfig = {
|
|
||||||
enabled: true,
|
|
||||||
minSize: 5,
|
|
||||||
maxSize: 100,
|
|
||||||
scaleUpThreshold: 70, // Scale up when 70% of connections are in use
|
|
||||||
scaleDownThreshold: 30, // Scale down when only 30% are in use
|
|
||||||
scaleUpIncrement: 10, // Add 10 connections at a time
|
|
||||||
scaleDownIncrement: 5, // Remove 5 connections at a time
|
|
||||||
evaluationInterval: 10000 // Check every 10 seconds
|
|
||||||
};
|
|
||||||
|
|
||||||
// Create MongoDB client with dynamic pooling
|
|
||||||
const mongoClient = createMongoDBClient({
|
|
||||||
uri: dbConfig.mongodb.uri,
|
|
||||||
database: dbConfig.mongodb.database,
|
|
||||||
poolSettings: {
|
|
||||||
minPoolSize: dynamicConfig.minSize,
|
|
||||||
maxPoolSize: dynamicConfig.maxSize,
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
onConnect: () => logger.info('MongoDB connected with dynamic pooling'),
|
|
||||||
onError: (error) => logger.error('MongoDB pool error', { error }),
|
|
||||||
});
|
|
||||||
|
|
||||||
await mongoClient.connect();
|
|
||||||
mongoClient.setDynamicPoolConfig(dynamicConfig);
|
|
||||||
|
|
||||||
// Create PostgreSQL client with dynamic pooling
|
|
||||||
const pgClient = createPostgreSQLClient({
|
|
||||||
host: dbConfig.postgresql.host,
|
|
||||||
port: dbConfig.postgresql.port,
|
|
||||||
database: dbConfig.postgresql.database,
|
|
||||||
username: dbConfig.postgresql.user,
|
|
||||||
password: dbConfig.postgresql.password,
|
|
||||||
poolSettings: {
|
|
||||||
min: dynamicConfig.minSize,
|
|
||||||
max: dynamicConfig.maxSize,
|
|
||||||
}
|
|
||||||
}, undefined, {
|
|
||||||
onConnect: () => logger.info('PostgreSQL connected with dynamic pooling'),
|
|
||||||
onError: (error) => logger.error('PostgreSQL pool error', { error }),
|
|
||||||
});
|
|
||||||
|
|
||||||
await pgClient.connect();
|
|
||||||
pgClient.setDynamicPoolConfig(dynamicConfig);
|
|
||||||
|
|
||||||
// Monitor pool metrics
|
|
||||||
setInterval(() => {
|
|
||||||
const mongoMetrics = mongoClient.getPoolMetrics();
|
|
||||||
const pgMetrics = pgClient.getPoolMetrics();
|
|
||||||
|
|
||||||
logger.info('Pool metrics', {
|
|
||||||
mongodb: {
|
|
||||||
total: mongoMetrics.totalConnections,
|
|
||||||
active: mongoMetrics.activeConnections,
|
|
||||||
idle: mongoMetrics.idleConnections,
|
|
||||||
waiting: mongoMetrics.waitingRequests,
|
|
||||||
},
|
|
||||||
postgresql: {
|
|
||||||
total: pgMetrics.totalConnections,
|
|
||||||
active: pgMetrics.activeConnections,
|
|
||||||
idle: pgMetrics.idleConnections,
|
|
||||||
waiting: pgMetrics.waitingRequests,
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}, 30000); // Log metrics every 30 seconds
|
|
||||||
|
|
||||||
return { mongoClient, pgClient };
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Example of adaptive pool sizing based on time of day
|
|
||||||
*/
|
|
||||||
export function getTimeBasedPoolConfig(): DynamicPoolConfig {
|
|
||||||
const hour = new Date().getHours();
|
|
||||||
|
|
||||||
// High load hours (9 AM - 5 PM)
|
|
||||||
if (hour >= 9 && hour <= 17) {
|
|
||||||
return {
|
|
||||||
enabled: true,
|
|
||||||
minSize: 10,
|
|
||||||
maxSize: 150,
|
|
||||||
scaleUpThreshold: 60,
|
|
||||||
scaleDownThreshold: 20,
|
|
||||||
scaleUpIncrement: 20,
|
|
||||||
scaleDownIncrement: 10,
|
|
||||||
evaluationInterval: 5000 // More frequent checks during peak
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
// Low load hours (night time)
|
|
||||||
return {
|
|
||||||
enabled: true,
|
|
||||||
minSize: 2,
|
|
||||||
maxSize: 50,
|
|
||||||
scaleUpThreshold: 80,
|
|
||||||
scaleDownThreshold: 40,
|
|
||||||
scaleUpIncrement: 5,
|
|
||||||
scaleDownIncrement: 2,
|
|
||||||
evaluationInterval: 30000 // Less frequent checks at night
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
import { getLogger } from '@stock-bot/logger';
|
import { getLogger } from '@stock-bot/logger';
|
||||||
import { sleep } from '@stock-bot/utils';
|
import { sleep } from '@stock-bot/di';
|
||||||
|
|
||||||
const logger = getLogger('symbol-search-util');
|
const logger = getLogger('symbol-search-util');
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,16 +1,16 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.app.json",
|
"extends": "../../tsconfig.app.json",
|
||||||
"references": [
|
"references": [
|
||||||
{ "path": "../../libs/types" },
|
{ "path": "../../libs/core/types" },
|
||||||
{ "path": "../../libs/config" },
|
{ "path": "../../libs/core/config" },
|
||||||
{ "path": "../../libs/logger" },
|
{ "path": "../../libs/core/logger" },
|
||||||
{ "path": "../../libs/cache" },
|
{ "path": "../../libs/core/di" },
|
||||||
{ "path": "../../libs/queue" },
|
{ "path": "../../libs/data/cache" },
|
||||||
{ "path": "../../libs/mongodb-client" },
|
{ "path": "../../libs/data/mongodb" },
|
||||||
{ "path": "../../libs/postgres-client" },
|
{ "path": "../../libs/data/postgres" },
|
||||||
{ "path": "../../libs/questdb-client" },
|
{ "path": "../../libs/data/questdb" },
|
||||||
{ "path": "../../libs/shutdown" },
|
{ "path": "../../libs/services/queue" },
|
||||||
{ "path": "../../libs/connection-factory" },
|
{ "path": "../../libs/services/shutdown" },
|
||||||
{ "path": "../../libs/utils" }
|
{ "path": "../../libs/utils" }
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -15,9 +15,9 @@
|
||||||
"@stock-bot/cache": "*",
|
"@stock-bot/cache": "*",
|
||||||
"@stock-bot/config": "*",
|
"@stock-bot/config": "*",
|
||||||
"@stock-bot/logger": "*",
|
"@stock-bot/logger": "*",
|
||||||
"@stock-bot/mongodb-client": "*",
|
"@stock-bot/mongodb": "*",
|
||||||
"@stock-bot/postgres-client": "*",
|
"@stock-bot/postgres": "*",
|
||||||
"@stock-bot/questdb-client": "*",
|
"@stock-bot/questdb": "*",
|
||||||
"@stock-bot/queue": "*",
|
"@stock-bot/queue": "*",
|
||||||
"@stock-bot/shutdown": "*",
|
"@stock-bot/shutdown": "*",
|
||||||
"hono": "^4.0.0"
|
"hono": "^4.0.0"
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,14 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.app.json",
|
"extends": "../../tsconfig.app.json",
|
||||||
"references": [
|
"references": [
|
||||||
{ "path": "../../libs/types" },
|
{ "path": "../../libs/core/types" },
|
||||||
{ "path": "../../libs/config" },
|
{ "path": "../../libs/core/config" },
|
||||||
{ "path": "../../libs/logger" },
|
{ "path": "../../libs/core/logger" },
|
||||||
{ "path": "../../libs/cache" },
|
{ "path": "../../libs/data/cache" },
|
||||||
{ "path": "../../libs/queue" },
|
{ "path": "../../libs/services/queue" },
|
||||||
{ "path": "../../libs/mongodb-client" },
|
{ "path": "../../libs/data/mongodb" },
|
||||||
{ "path": "../../libs/postgres-client" },
|
{ "path": "../../libs/data/postgres" },
|
||||||
{ "path": "../../libs/questdb-client" },
|
{ "path": "../../libs/data/questdb" },
|
||||||
{ "path": "../../libs/shutdown" }
|
{ "path": "../../libs/services/shutdown" }
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -14,8 +14,8 @@
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@stock-bot/config": "*",
|
"@stock-bot/config": "*",
|
||||||
"@stock-bot/logger": "*",
|
"@stock-bot/logger": "*",
|
||||||
"@stock-bot/mongodb-client": "*",
|
"@stock-bot/mongodb": "*",
|
||||||
"@stock-bot/postgres-client": "*",
|
"@stock-bot/postgres": "*",
|
||||||
"@stock-bot/shutdown": "*",
|
"@stock-bot/shutdown": "*",
|
||||||
"hono": "^4.0.0"
|
"hono": "^4.0.0"
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,14 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.app.json",
|
"extends": "../../tsconfig.app.json",
|
||||||
"references": [
|
"references": [
|
||||||
{ "path": "../../libs/types" },
|
{ "path": "../../libs/core/types" },
|
||||||
{ "path": "../../libs/config" },
|
{ "path": "../../libs/core/config" },
|
||||||
{ "path": "../../libs/logger" },
|
{ "path": "../../libs/core/logger" },
|
||||||
{ "path": "../../libs/cache" },
|
{ "path": "../../libs/data/cache" },
|
||||||
{ "path": "../../libs/queue" },
|
{ "path": "../../libs/services/queue" },
|
||||||
{ "path": "../../libs/mongodb-client" },
|
{ "path": "../../libs/data/mongodb" },
|
||||||
{ "path": "../../libs/postgres-client" },
|
{ "path": "../../libs/data/postgres" },
|
||||||
{ "path": "../../libs/questdb-client" },
|
{ "path": "../../libs/data/questdb" },
|
||||||
{ "path": "../../libs/shutdown" }
|
{ "path": "../../libs/services/shutdown" }
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
||||||
509
bun.lock
509
bun.lock
|
|
@ -47,11 +47,11 @@
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@stock-bot/cache": "*",
|
"@stock-bot/cache": "*",
|
||||||
"@stock-bot/config": "*",
|
"@stock-bot/config": "*",
|
||||||
"@stock-bot/connection-factory": "*",
|
"@stock-bot/di": "*",
|
||||||
"@stock-bot/logger": "*",
|
"@stock-bot/logger": "*",
|
||||||
"@stock-bot/mongodb-client": "*",
|
"@stock-bot/mongodb": "*",
|
||||||
"@stock-bot/postgres-client": "*",
|
"@stock-bot/postgres": "*",
|
||||||
"@stock-bot/questdb-client": "*",
|
"@stock-bot/questdb": "*",
|
||||||
"@stock-bot/queue": "*",
|
"@stock-bot/queue": "*",
|
||||||
"@stock-bot/shutdown": "*",
|
"@stock-bot/shutdown": "*",
|
||||||
"@stock-bot/utils": "*",
|
"@stock-bot/utils": "*",
|
||||||
|
|
@ -68,9 +68,9 @@
|
||||||
"@stock-bot/cache": "*",
|
"@stock-bot/cache": "*",
|
||||||
"@stock-bot/config": "*",
|
"@stock-bot/config": "*",
|
||||||
"@stock-bot/logger": "*",
|
"@stock-bot/logger": "*",
|
||||||
"@stock-bot/mongodb-client": "*",
|
"@stock-bot/mongodb": "*",
|
||||||
"@stock-bot/postgres-client": "*",
|
"@stock-bot/postgres": "*",
|
||||||
"@stock-bot/questdb-client": "*",
|
"@stock-bot/questdb": "*",
|
||||||
"@stock-bot/queue": "*",
|
"@stock-bot/queue": "*",
|
||||||
"@stock-bot/shutdown": "*",
|
"@stock-bot/shutdown": "*",
|
||||||
"hono": "^4.0.0",
|
"hono": "^4.0.0",
|
||||||
|
|
@ -85,8 +85,8 @@
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@stock-bot/config": "*",
|
"@stock-bot/config": "*",
|
||||||
"@stock-bot/logger": "*",
|
"@stock-bot/logger": "*",
|
||||||
"@stock-bot/mongodb-client": "*",
|
"@stock-bot/mongodb": "*",
|
||||||
"@stock-bot/postgres-client": "*",
|
"@stock-bot/postgres": "*",
|
||||||
"@stock-bot/shutdown": "*",
|
"@stock-bot/shutdown": "*",
|
||||||
"hono": "^4.0.0",
|
"hono": "^4.0.0",
|
||||||
},
|
},
|
||||||
|
|
@ -131,35 +131,7 @@
|
||||||
"vite": "^4.4.5",
|
"vite": "^4.4.5",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"libs/browser": {
|
"libs/core/config": {
|
||||||
"name": "@stock-bot/browser",
|
|
||||||
"version": "1.0.0",
|
|
||||||
"dependencies": {
|
|
||||||
"playwright": "^1.53.0",
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"@types/node": "^20.0.0",
|
|
||||||
"typescript": "^5.0.0",
|
|
||||||
},
|
|
||||||
"peerDependencies": {
|
|
||||||
"@stock-bot/http": "workspace:*",
|
|
||||||
"@stock-bot/logger": "workspace:*",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"libs/cache": {
|
|
||||||
"name": "@stock-bot/cache",
|
|
||||||
"version": "1.0.0",
|
|
||||||
"dependencies": {
|
|
||||||
"@stock-bot/logger": "*",
|
|
||||||
"ioredis": "^5.3.2",
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"@types/node": "^20.11.0",
|
|
||||||
"bun-types": "^1.2.15",
|
|
||||||
"typescript": "^5.3.0",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"libs/config": {
|
|
||||||
"name": "@stock-bot/config",
|
"name": "@stock-bot/config",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"bin": {
|
"bin": {
|
||||||
|
|
@ -174,15 +146,16 @@
|
||||||
"typescript": "^5.3.3",
|
"typescript": "^5.3.3",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"libs/connection-factory": {
|
"libs/core/di": {
|
||||||
"name": "@stock-bot/connection-factory",
|
"name": "@stock-bot/di",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@stock-bot/cache": "workspace:*",
|
"@stock-bot/cache": "workspace:*",
|
||||||
"@stock-bot/config": "workspace:*",
|
"@stock-bot/config": "workspace:*",
|
||||||
"@stock-bot/logger": "workspace:*",
|
"@stock-bot/logger": "workspace:*",
|
||||||
"@stock-bot/mongodb-client": "workspace:*",
|
"@stock-bot/mongodb": "workspace:*",
|
||||||
"@stock-bot/postgres-client": "workspace:*",
|
"@stock-bot/postgres": "workspace:*",
|
||||||
|
"@stock-bot/queue": "workspace:*",
|
||||||
"mongodb": "^6.3.0",
|
"mongodb": "^6.3.0",
|
||||||
"pg": "^8.11.3",
|
"pg": "^8.11.3",
|
||||||
},
|
},
|
||||||
|
|
@ -190,7 +163,112 @@
|
||||||
"@types/pg": "^8.10.7",
|
"@types/pg": "^8.10.7",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"libs/event-bus": {
|
"libs/core/logger": {
|
||||||
|
"name": "@stock-bot/logger",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"dependencies": {
|
||||||
|
"got": "^14.4.7",
|
||||||
|
"pino": "^9.7.0",
|
||||||
|
"pino-loki": "^2.6.0",
|
||||||
|
"pino-pretty": "^13.0.0",
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@types/node": "^20.11.0",
|
||||||
|
"bun-types": "^1.2.15",
|
||||||
|
"typescript": "^5.3.0",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"libs/core/types": {
|
||||||
|
"name": "@stock-bot/types",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"devDependencies": {
|
||||||
|
"@types/node": "^20.11.0",
|
||||||
|
"bun-types": "^1.2.15",
|
||||||
|
"typescript": "^5.3.0",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"libs/data/cache": {
|
||||||
|
"name": "@stock-bot/cache",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"dependencies": {
|
||||||
|
"@stock-bot/logger": "*",
|
||||||
|
"ioredis": "^5.3.2",
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@types/node": "^20.11.0",
|
||||||
|
"bun-types": "^1.2.15",
|
||||||
|
"typescript": "^5.3.0",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"libs/data/mongodb": {
|
||||||
|
"name": "@stock-bot/mongodb",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"dependencies": {
|
||||||
|
"@stock-bot/logger": "*",
|
||||||
|
"@stock-bot/types": "*",
|
||||||
|
"@types/mongodb": "^4.0.7",
|
||||||
|
"mongodb": "^6.17.0",
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@types/node": "^20.11.0",
|
||||||
|
"@typescript-eslint/eslint-plugin": "^6.19.0",
|
||||||
|
"@typescript-eslint/parser": "^6.19.0",
|
||||||
|
"bun-types": "^1.2.15",
|
||||||
|
"eslint": "^8.56.0",
|
||||||
|
"typescript": "^5.3.0",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"libs/data/postgres": {
|
||||||
|
"name": "@stock-bot/postgres",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"dependencies": {
|
||||||
|
"@stock-bot/logger": "*",
|
||||||
|
"@stock-bot/types": "*",
|
||||||
|
"pg": "^8.11.3",
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@types/node": "^20.11.0",
|
||||||
|
"@types/pg": "^8.10.7",
|
||||||
|
"@typescript-eslint/eslint-plugin": "^6.19.0",
|
||||||
|
"@typescript-eslint/parser": "^6.19.0",
|
||||||
|
"bun-types": "^1.2.15",
|
||||||
|
"eslint": "^8.56.0",
|
||||||
|
"typescript": "^5.3.0",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"libs/data/questdb": {
|
||||||
|
"name": "@stock-bot/questdb",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"dependencies": {
|
||||||
|
"@stock-bot/logger": "*",
|
||||||
|
"@stock-bot/types": "*",
|
||||||
|
"pg": "^8.11.3",
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@types/node": "^20.11.0",
|
||||||
|
"@typescript-eslint/eslint-plugin": "^6.19.0",
|
||||||
|
"@typescript-eslint/parser": "^6.19.0",
|
||||||
|
"bun-types": "^1.2.15",
|
||||||
|
"eslint": "^8.56.0",
|
||||||
|
"typescript": "^5.3.0",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"libs/services/browser": {
|
||||||
|
"name": "@stock-bot/browser",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"dependencies": {
|
||||||
|
"playwright": "^1.53.0",
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@types/node": "^20.0.0",
|
||||||
|
"typescript": "^5.0.0",
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@stock-bot/http": "workspace:*",
|
||||||
|
"@stock-bot/logger": "workspace:*",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"libs/services/event-bus": {
|
||||||
"name": "@stock-bot/event-bus",
|
"name": "@stock-bot/event-bus",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
|
@ -204,7 +282,7 @@
|
||||||
"typescript": "^5.3.0",
|
"typescript": "^5.3.0",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"libs/http": {
|
"libs/services/http": {
|
||||||
"name": "@stock-bot/http",
|
"name": "@stock-bot/http",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
|
@ -226,75 +304,7 @@
|
||||||
"typescript": "^5.3.0",
|
"typescript": "^5.3.0",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"libs/logger": {
|
"libs/services/queue": {
|
||||||
"name": "@stock-bot/logger",
|
|
||||||
"version": "1.0.0",
|
|
||||||
"dependencies": {
|
|
||||||
"got": "^14.4.7",
|
|
||||||
"pino": "^9.7.0",
|
|
||||||
"pino-loki": "^2.6.0",
|
|
||||||
"pino-pretty": "^13.0.0",
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"@types/node": "^20.11.0",
|
|
||||||
"bun-types": "^1.2.15",
|
|
||||||
"typescript": "^5.3.0",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"libs/mongodb-client": {
|
|
||||||
"name": "@stock-bot/mongodb-client",
|
|
||||||
"version": "1.0.0",
|
|
||||||
"dependencies": {
|
|
||||||
"@stock-bot/logger": "*",
|
|
||||||
"@stock-bot/types": "*",
|
|
||||||
"@types/mongodb": "^4.0.7",
|
|
||||||
"mongodb": "^6.17.0",
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"@types/node": "^20.11.0",
|
|
||||||
"@typescript-eslint/eslint-plugin": "^6.19.0",
|
|
||||||
"@typescript-eslint/parser": "^6.19.0",
|
|
||||||
"bun-types": "^1.2.15",
|
|
||||||
"eslint": "^8.56.0",
|
|
||||||
"typescript": "^5.3.0",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"libs/postgres-client": {
|
|
||||||
"name": "@stock-bot/postgres-client",
|
|
||||||
"version": "1.0.0",
|
|
||||||
"dependencies": {
|
|
||||||
"@stock-bot/logger": "*",
|
|
||||||
"@stock-bot/types": "*",
|
|
||||||
"pg": "^8.11.3",
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"@types/node": "^20.11.0",
|
|
||||||
"@types/pg": "^8.10.7",
|
|
||||||
"@typescript-eslint/eslint-plugin": "^6.19.0",
|
|
||||||
"@typescript-eslint/parser": "^6.19.0",
|
|
||||||
"bun-types": "^1.2.15",
|
|
||||||
"eslint": "^8.56.0",
|
|
||||||
"typescript": "^5.3.0",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"libs/questdb-client": {
|
|
||||||
"name": "@stock-bot/questdb-client",
|
|
||||||
"version": "1.0.0",
|
|
||||||
"dependencies": {
|
|
||||||
"@stock-bot/logger": "*",
|
|
||||||
"@stock-bot/types": "*",
|
|
||||||
"pg": "^8.11.3",
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"@types/node": "^20.11.0",
|
|
||||||
"@typescript-eslint/eslint-plugin": "^6.19.0",
|
|
||||||
"@typescript-eslint/parser": "^6.19.0",
|
|
||||||
"bun-types": "^1.2.15",
|
|
||||||
"eslint": "^8.56.0",
|
|
||||||
"typescript": "^5.3.0",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"libs/queue": {
|
|
||||||
"name": "@stock-bot/queue",
|
"name": "@stock-bot/queue",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
|
@ -311,7 +321,7 @@
|
||||||
"typescript": "^5.3.0",
|
"typescript": "^5.3.0",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"libs/shutdown": {
|
"libs/services/shutdown": {
|
||||||
"name": "@stock-bot/shutdown",
|
"name": "@stock-bot/shutdown",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
|
@ -319,26 +329,17 @@
|
||||||
"typescript": "^5.0.0",
|
"typescript": "^5.0.0",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"libs/types": {
|
|
||||||
"name": "@stock-bot/types",
|
|
||||||
"version": "1.0.0",
|
|
||||||
"devDependencies": {
|
|
||||||
"@types/node": "^20.11.0",
|
|
||||||
"bun-types": "^1.2.15",
|
|
||||||
"typescript": "^5.3.0",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"libs/utils": {
|
"libs/utils": {
|
||||||
"name": "@stock-bot/utils",
|
"name": "@stock-bot/utils",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@stock-bot/cache": "workspace:*",
|
"@stock-bot/cache": "workspace:*",
|
||||||
"@stock-bot/config": "workspace:*",
|
"@stock-bot/config": "workspace:*",
|
||||||
"@stock-bot/connection-factory": "workspace:*",
|
"@stock-bot/di": "workspace:*",
|
||||||
"@stock-bot/http": "workspace:*",
|
"@stock-bot/http": "workspace:*",
|
||||||
"@stock-bot/logger": "workspace:*",
|
"@stock-bot/logger": "workspace:*",
|
||||||
"@stock-bot/mongodb-client": "workspace:*",
|
"@stock-bot/mongodb": "workspace:*",
|
||||||
"@stock-bot/postgres-client": "workspace:*",
|
"@stock-bot/postgres": "workspace:*",
|
||||||
"@stock-bot/types": "workspace:*",
|
"@stock-bot/types": "workspace:*",
|
||||||
"axios": "^1.7.7",
|
"axios": "^1.7.7",
|
||||||
"axios-rate-limit": "^1.4.0",
|
"axios-rate-limit": "^1.4.0",
|
||||||
|
|
@ -758,35 +759,35 @@
|
||||||
|
|
||||||
"@smithy/util-utf8": ["@smithy/util-utf8@4.0.0", "", { "dependencies": { "@smithy/util-buffer-from": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow=="],
|
"@smithy/util-utf8": ["@smithy/util-utf8@4.0.0", "", { "dependencies": { "@smithy/util-buffer-from": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow=="],
|
||||||
|
|
||||||
"@stock-bot/browser": ["@stock-bot/browser@workspace:libs/browser"],
|
"@stock-bot/browser": ["@stock-bot/browser@workspace:libs/services/browser"],
|
||||||
|
|
||||||
"@stock-bot/cache": ["@stock-bot/cache@workspace:libs/cache"],
|
"@stock-bot/cache": ["@stock-bot/cache@workspace:libs/data/cache"],
|
||||||
|
|
||||||
"@stock-bot/config": ["@stock-bot/config@workspace:libs/config"],
|
"@stock-bot/config": ["@stock-bot/config@workspace:libs/core/config"],
|
||||||
|
|
||||||
"@stock-bot/connection-factory": ["@stock-bot/connection-factory@workspace:libs/connection-factory"],
|
|
||||||
|
|
||||||
"@stock-bot/data-ingestion": ["@stock-bot/data-ingestion@workspace:apps/data-ingestion"],
|
"@stock-bot/data-ingestion": ["@stock-bot/data-ingestion@workspace:apps/data-ingestion"],
|
||||||
|
|
||||||
"@stock-bot/data-pipeline": ["@stock-bot/data-pipeline@workspace:apps/data-pipeline"],
|
"@stock-bot/data-pipeline": ["@stock-bot/data-pipeline@workspace:apps/data-pipeline"],
|
||||||
|
|
||||||
"@stock-bot/event-bus": ["@stock-bot/event-bus@workspace:libs/event-bus"],
|
"@stock-bot/di": ["@stock-bot/di@workspace:libs/core/di"],
|
||||||
|
|
||||||
"@stock-bot/http": ["@stock-bot/http@workspace:libs/http"],
|
"@stock-bot/event-bus": ["@stock-bot/event-bus@workspace:libs/services/event-bus"],
|
||||||
|
|
||||||
"@stock-bot/logger": ["@stock-bot/logger@workspace:libs/logger"],
|
"@stock-bot/http": ["@stock-bot/http@workspace:libs/services/http"],
|
||||||
|
|
||||||
"@stock-bot/mongodb-client": ["@stock-bot/mongodb-client@workspace:libs/mongodb-client"],
|
"@stock-bot/logger": ["@stock-bot/logger@workspace:libs/core/logger"],
|
||||||
|
|
||||||
"@stock-bot/postgres-client": ["@stock-bot/postgres-client@workspace:libs/postgres-client"],
|
"@stock-bot/mongodb": ["@stock-bot/mongodb@workspace:libs/data/mongodb"],
|
||||||
|
|
||||||
"@stock-bot/questdb-client": ["@stock-bot/questdb-client@workspace:libs/questdb-client"],
|
"@stock-bot/postgres": ["@stock-bot/postgres@workspace:libs/data/postgres"],
|
||||||
|
|
||||||
"@stock-bot/queue": ["@stock-bot/queue@workspace:libs/queue"],
|
"@stock-bot/questdb": ["@stock-bot/questdb@workspace:libs/data/questdb"],
|
||||||
|
|
||||||
"@stock-bot/shutdown": ["@stock-bot/shutdown@workspace:libs/shutdown"],
|
"@stock-bot/queue": ["@stock-bot/queue@workspace:libs/services/queue"],
|
||||||
|
|
||||||
"@stock-bot/types": ["@stock-bot/types@workspace:libs/types"],
|
"@stock-bot/shutdown": ["@stock-bot/shutdown@workspace:libs/services/shutdown"],
|
||||||
|
|
||||||
|
"@stock-bot/types": ["@stock-bot/types@workspace:libs/core/types"],
|
||||||
|
|
||||||
"@stock-bot/utils": ["@stock-bot/utils@workspace:libs/utils"],
|
"@stock-bot/utils": ["@stock-bot/utils@workspace:libs/utils"],
|
||||||
|
|
||||||
|
|
@ -2356,29 +2357,29 @@
|
||||||
|
|
||||||
"@stock-bot/logger/@types/node": ["@types/node@20.19.1", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-jJD50LtlD2dodAEO653i3YF04NWak6jN3ky+Ri3Em3mGR39/glWiboM/IePaRbgwSfqM1TpGXfAg8ohn/4dTgA=="],
|
"@stock-bot/logger/@types/node": ["@types/node@20.19.1", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-jJD50LtlD2dodAEO653i3YF04NWak6jN3ky+Ri3Em3mGR39/glWiboM/IePaRbgwSfqM1TpGXfAg8ohn/4dTgA=="],
|
||||||
|
|
||||||
"@stock-bot/mongodb-client/@types/node": ["@types/node@20.19.1", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-jJD50LtlD2dodAEO653i3YF04NWak6jN3ky+Ri3Em3mGR39/glWiboM/IePaRbgwSfqM1TpGXfAg8ohn/4dTgA=="],
|
"@stock-bot/mongodb/@types/node": ["@types/node@20.19.1", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-jJD50LtlD2dodAEO653i3YF04NWak6jN3ky+Ri3Em3mGR39/glWiboM/IePaRbgwSfqM1TpGXfAg8ohn/4dTgA=="],
|
||||||
|
|
||||||
"@stock-bot/mongodb-client/@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@6.21.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.5.1", "@typescript-eslint/scope-manager": "6.21.0", "@typescript-eslint/type-utils": "6.21.0", "@typescript-eslint/utils": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", "natural-compare": "^1.4.0", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" }, "peerDependencies": { "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA=="],
|
"@stock-bot/mongodb/@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@6.21.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.5.1", "@typescript-eslint/scope-manager": "6.21.0", "@typescript-eslint/type-utils": "6.21.0", "@typescript-eslint/utils": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", "natural-compare": "^1.4.0", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" }, "peerDependencies": { "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA=="],
|
||||||
|
|
||||||
"@stock-bot/mongodb-client/@typescript-eslint/parser": ["@typescript-eslint/parser@6.21.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "6.21.0", "@typescript-eslint/types": "6.21.0", "@typescript-eslint/typescript-estree": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ=="],
|
"@stock-bot/mongodb/@typescript-eslint/parser": ["@typescript-eslint/parser@6.21.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "6.21.0", "@typescript-eslint/types": "6.21.0", "@typescript-eslint/typescript-estree": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ=="],
|
||||||
|
|
||||||
"@stock-bot/mongodb-client/eslint": ["eslint@8.57.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", "@eslint/js": "8.57.1", "@humanwhocodes/config-array": "^0.13.0", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.2.2", "eslint-visitor-keys": "^3.4.3", "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3", "strip-ansi": "^6.0.1", "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" } }, "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA=="],
|
"@stock-bot/mongodb/eslint": ["eslint@8.57.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", "@eslint/js": "8.57.1", "@humanwhocodes/config-array": "^0.13.0", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.2.2", "eslint-visitor-keys": "^3.4.3", "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3", "strip-ansi": "^6.0.1", "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" } }, "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA=="],
|
||||||
|
|
||||||
"@stock-bot/postgres-client/@types/node": ["@types/node@20.19.1", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-jJD50LtlD2dodAEO653i3YF04NWak6jN3ky+Ri3Em3mGR39/glWiboM/IePaRbgwSfqM1TpGXfAg8ohn/4dTgA=="],
|
"@stock-bot/postgres/@types/node": ["@types/node@20.19.1", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-jJD50LtlD2dodAEO653i3YF04NWak6jN3ky+Ri3Em3mGR39/glWiboM/IePaRbgwSfqM1TpGXfAg8ohn/4dTgA=="],
|
||||||
|
|
||||||
"@stock-bot/postgres-client/@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@6.21.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.5.1", "@typescript-eslint/scope-manager": "6.21.0", "@typescript-eslint/type-utils": "6.21.0", "@typescript-eslint/utils": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", "natural-compare": "^1.4.0", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" }, "peerDependencies": { "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA=="],
|
"@stock-bot/postgres/@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@6.21.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.5.1", "@typescript-eslint/scope-manager": "6.21.0", "@typescript-eslint/type-utils": "6.21.0", "@typescript-eslint/utils": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", "natural-compare": "^1.4.0", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" }, "peerDependencies": { "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA=="],
|
||||||
|
|
||||||
"@stock-bot/postgres-client/@typescript-eslint/parser": ["@typescript-eslint/parser@6.21.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "6.21.0", "@typescript-eslint/types": "6.21.0", "@typescript-eslint/typescript-estree": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ=="],
|
"@stock-bot/postgres/@typescript-eslint/parser": ["@typescript-eslint/parser@6.21.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "6.21.0", "@typescript-eslint/types": "6.21.0", "@typescript-eslint/typescript-estree": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ=="],
|
||||||
|
|
||||||
"@stock-bot/postgres-client/eslint": ["eslint@8.57.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", "@eslint/js": "8.57.1", "@humanwhocodes/config-array": "^0.13.0", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.2.2", "eslint-visitor-keys": "^3.4.3", "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3", "strip-ansi": "^6.0.1", "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" } }, "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA=="],
|
"@stock-bot/postgres/eslint": ["eslint@8.57.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", "@eslint/js": "8.57.1", "@humanwhocodes/config-array": "^0.13.0", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.2.2", "eslint-visitor-keys": "^3.4.3", "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3", "strip-ansi": "^6.0.1", "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" } }, "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA=="],
|
||||||
|
|
||||||
"@stock-bot/questdb-client/@types/node": ["@types/node@20.19.1", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-jJD50LtlD2dodAEO653i3YF04NWak6jN3ky+Ri3Em3mGR39/glWiboM/IePaRbgwSfqM1TpGXfAg8ohn/4dTgA=="],
|
"@stock-bot/questdb/@types/node": ["@types/node@20.19.1", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-jJD50LtlD2dodAEO653i3YF04NWak6jN3ky+Ri3Em3mGR39/glWiboM/IePaRbgwSfqM1TpGXfAg8ohn/4dTgA=="],
|
||||||
|
|
||||||
"@stock-bot/questdb-client/@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@6.21.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.5.1", "@typescript-eslint/scope-manager": "6.21.0", "@typescript-eslint/type-utils": "6.21.0", "@typescript-eslint/utils": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", "natural-compare": "^1.4.0", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" }, "peerDependencies": { "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA=="],
|
"@stock-bot/questdb/@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@6.21.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.5.1", "@typescript-eslint/scope-manager": "6.21.0", "@typescript-eslint/type-utils": "6.21.0", "@typescript-eslint/utils": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", "natural-compare": "^1.4.0", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" }, "peerDependencies": { "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA=="],
|
||||||
|
|
||||||
"@stock-bot/questdb-client/@typescript-eslint/parser": ["@typescript-eslint/parser@6.21.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "6.21.0", "@typescript-eslint/types": "6.21.0", "@typescript-eslint/typescript-estree": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ=="],
|
"@stock-bot/questdb/@typescript-eslint/parser": ["@typescript-eslint/parser@6.21.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "6.21.0", "@typescript-eslint/types": "6.21.0", "@typescript-eslint/typescript-estree": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ=="],
|
||||||
|
|
||||||
"@stock-bot/questdb-client/eslint": ["eslint@8.57.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", "@eslint/js": "8.57.1", "@humanwhocodes/config-array": "^0.13.0", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.2.2", "eslint-visitor-keys": "^3.4.3", "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3", "strip-ansi": "^6.0.1", "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" } }, "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA=="],
|
"@stock-bot/questdb/eslint": ["eslint@8.57.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", "@eslint/js": "8.57.1", "@humanwhocodes/config-array": "^0.13.0", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.2.2", "eslint-visitor-keys": "^3.4.3", "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3", "strip-ansi": "^6.0.1", "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" } }, "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA=="],
|
||||||
|
|
||||||
"@stock-bot/queue/@types/node": ["@types/node@20.19.1", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-jJD50LtlD2dodAEO653i3YF04NWak6jN3ky+Ri3Em3mGR39/glWiboM/IePaRbgwSfqM1TpGXfAg8ohn/4dTgA=="],
|
"@stock-bot/queue/@types/node": ["@types/node@20.19.1", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-jJD50LtlD2dodAEO653i3YF04NWak6jN3ky+Ri3Em3mGR39/glWiboM/IePaRbgwSfqM1TpGXfAg8ohn/4dTgA=="],
|
||||||
|
|
||||||
|
|
@ -2594,113 +2595,113 @@
|
||||||
|
|
||||||
"@stock-bot/http/eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="],
|
"@stock-bot/http/eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="],
|
||||||
|
|
||||||
"@stock-bot/mongodb-client/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0" } }, "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg=="],
|
"@stock-bot/mongodb/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0" } }, "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg=="],
|
||||||
|
|
||||||
"@stock-bot/mongodb-client/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@6.21.0", "", { "dependencies": { "@typescript-eslint/typescript-estree": "6.21.0", "@typescript-eslint/utils": "6.21.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag=="],
|
"@stock-bot/mongodb/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@6.21.0", "", { "dependencies": { "@typescript-eslint/typescript-estree": "6.21.0", "@typescript-eslint/utils": "6.21.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag=="],
|
||||||
|
|
||||||
"@stock-bot/mongodb-client/@typescript-eslint/eslint-plugin/@typescript-eslint/utils": ["@typescript-eslint/utils@6.21.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", "@typescript-eslint/scope-manager": "6.21.0", "@typescript-eslint/types": "6.21.0", "@typescript-eslint/typescript-estree": "6.21.0", "semver": "^7.5.4" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ=="],
|
"@stock-bot/mongodb/@typescript-eslint/eslint-plugin/@typescript-eslint/utils": ["@typescript-eslint/utils@6.21.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", "@typescript-eslint/scope-manager": "6.21.0", "@typescript-eslint/types": "6.21.0", "@typescript-eslint/typescript-estree": "6.21.0", "semver": "^7.5.4" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ=="],
|
||||||
|
|
||||||
"@stock-bot/mongodb-client/@typescript-eslint/eslint-plugin/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "eslint-visitor-keys": "^3.4.1" } }, "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A=="],
|
"@stock-bot/mongodb/@typescript-eslint/eslint-plugin/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "eslint-visitor-keys": "^3.4.1" } }, "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A=="],
|
||||||
|
|
||||||
"@stock-bot/mongodb-client/@typescript-eslint/eslint-plugin/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="],
|
"@stock-bot/mongodb/@typescript-eslint/eslint-plugin/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="],
|
||||||
|
|
||||||
"@stock-bot/mongodb-client/@typescript-eslint/eslint-plugin/ts-api-utils": ["ts-api-utils@1.4.3", "", { "peerDependencies": { "typescript": ">=4.2.0" } }, "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw=="],
|
"@stock-bot/mongodb/@typescript-eslint/eslint-plugin/ts-api-utils": ["ts-api-utils@1.4.3", "", { "peerDependencies": { "typescript": ">=4.2.0" } }, "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw=="],
|
||||||
|
|
||||||
"@stock-bot/mongodb-client/@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0" } }, "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg=="],
|
"@stock-bot/mongodb/@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0" } }, "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg=="],
|
||||||
|
|
||||||
"@stock-bot/mongodb-client/@typescript-eslint/parser/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="],
|
"@stock-bot/mongodb/@typescript-eslint/parser/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="],
|
||||||
|
|
||||||
"@stock-bot/mongodb-client/@typescript-eslint/parser/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "9.0.3", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" } }, "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ=="],
|
"@stock-bot/mongodb/@typescript-eslint/parser/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "9.0.3", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" } }, "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ=="],
|
||||||
|
|
||||||
"@stock-bot/mongodb-client/@typescript-eslint/parser/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "eslint-visitor-keys": "^3.4.1" } }, "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A=="],
|
"@stock-bot/mongodb/@typescript-eslint/parser/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "eslint-visitor-keys": "^3.4.1" } }, "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A=="],
|
||||||
|
|
||||||
"@stock-bot/mongodb-client/eslint/@eslint/eslintrc": ["@eslint/eslintrc@2.1.4", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ=="],
|
"@stock-bot/mongodb/eslint/@eslint/eslintrc": ["@eslint/eslintrc@2.1.4", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ=="],
|
||||||
|
|
||||||
"@stock-bot/mongodb-client/eslint/@eslint/js": ["@eslint/js@8.57.1", "", {}, "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q=="],
|
"@stock-bot/mongodb/eslint/@eslint/js": ["@eslint/js@8.57.1", "", {}, "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q=="],
|
||||||
|
|
||||||
"@stock-bot/mongodb-client/eslint/doctrine": ["doctrine@3.0.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w=="],
|
"@stock-bot/mongodb/eslint/doctrine": ["doctrine@3.0.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w=="],
|
||||||
|
|
||||||
"@stock-bot/mongodb-client/eslint/eslint-scope": ["eslint-scope@7.2.2", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg=="],
|
"@stock-bot/mongodb/eslint/eslint-scope": ["eslint-scope@7.2.2", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg=="],
|
||||||
|
|
||||||
"@stock-bot/mongodb-client/eslint/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="],
|
"@stock-bot/mongodb/eslint/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="],
|
||||||
|
|
||||||
"@stock-bot/mongodb-client/eslint/espree": ["espree@9.6.1", "", { "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.1" } }, "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ=="],
|
"@stock-bot/mongodb/eslint/espree": ["espree@9.6.1", "", { "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.1" } }, "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ=="],
|
||||||
|
|
||||||
"@stock-bot/mongodb-client/eslint/file-entry-cache": ["file-entry-cache@6.0.1", "", { "dependencies": { "flat-cache": "^3.0.4" } }, "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg=="],
|
"@stock-bot/mongodb/eslint/file-entry-cache": ["file-entry-cache@6.0.1", "", { "dependencies": { "flat-cache": "^3.0.4" } }, "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg=="],
|
||||||
|
|
||||||
"@stock-bot/mongodb-client/eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="],
|
"@stock-bot/mongodb/eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="],
|
||||||
|
|
||||||
"@stock-bot/postgres-client/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0" } }, "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg=="],
|
"@stock-bot/postgres/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0" } }, "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg=="],
|
||||||
|
|
||||||
"@stock-bot/postgres-client/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@6.21.0", "", { "dependencies": { "@typescript-eslint/typescript-estree": "6.21.0", "@typescript-eslint/utils": "6.21.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag=="],
|
"@stock-bot/postgres/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@6.21.0", "", { "dependencies": { "@typescript-eslint/typescript-estree": "6.21.0", "@typescript-eslint/utils": "6.21.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag=="],
|
||||||
|
|
||||||
"@stock-bot/postgres-client/@typescript-eslint/eslint-plugin/@typescript-eslint/utils": ["@typescript-eslint/utils@6.21.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", "@typescript-eslint/scope-manager": "6.21.0", "@typescript-eslint/types": "6.21.0", "@typescript-eslint/typescript-estree": "6.21.0", "semver": "^7.5.4" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ=="],
|
"@stock-bot/postgres/@typescript-eslint/eslint-plugin/@typescript-eslint/utils": ["@typescript-eslint/utils@6.21.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", "@typescript-eslint/scope-manager": "6.21.0", "@typescript-eslint/types": "6.21.0", "@typescript-eslint/typescript-estree": "6.21.0", "semver": "^7.5.4" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ=="],
|
||||||
|
|
||||||
"@stock-bot/postgres-client/@typescript-eslint/eslint-plugin/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "eslint-visitor-keys": "^3.4.1" } }, "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A=="],
|
"@stock-bot/postgres/@typescript-eslint/eslint-plugin/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "eslint-visitor-keys": "^3.4.1" } }, "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A=="],
|
||||||
|
|
||||||
"@stock-bot/postgres-client/@typescript-eslint/eslint-plugin/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="],
|
"@stock-bot/postgres/@typescript-eslint/eslint-plugin/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="],
|
||||||
|
|
||||||
"@stock-bot/postgres-client/@typescript-eslint/eslint-plugin/ts-api-utils": ["ts-api-utils@1.4.3", "", { "peerDependencies": { "typescript": ">=4.2.0" } }, "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw=="],
|
"@stock-bot/postgres/@typescript-eslint/eslint-plugin/ts-api-utils": ["ts-api-utils@1.4.3", "", { "peerDependencies": { "typescript": ">=4.2.0" } }, "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw=="],
|
||||||
|
|
||||||
"@stock-bot/postgres-client/@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0" } }, "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg=="],
|
"@stock-bot/postgres/@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0" } }, "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg=="],
|
||||||
|
|
||||||
"@stock-bot/postgres-client/@typescript-eslint/parser/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="],
|
"@stock-bot/postgres/@typescript-eslint/parser/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="],
|
||||||
|
|
||||||
"@stock-bot/postgres-client/@typescript-eslint/parser/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "9.0.3", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" } }, "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ=="],
|
"@stock-bot/postgres/@typescript-eslint/parser/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "9.0.3", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" } }, "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ=="],
|
||||||
|
|
||||||
"@stock-bot/postgres-client/@typescript-eslint/parser/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "eslint-visitor-keys": "^3.4.1" } }, "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A=="],
|
"@stock-bot/postgres/@typescript-eslint/parser/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "eslint-visitor-keys": "^3.4.1" } }, "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A=="],
|
||||||
|
|
||||||
"@stock-bot/postgres-client/eslint/@eslint/eslintrc": ["@eslint/eslintrc@2.1.4", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ=="],
|
"@stock-bot/postgres/eslint/@eslint/eslintrc": ["@eslint/eslintrc@2.1.4", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ=="],
|
||||||
|
|
||||||
"@stock-bot/postgres-client/eslint/@eslint/js": ["@eslint/js@8.57.1", "", {}, "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q=="],
|
"@stock-bot/postgres/eslint/@eslint/js": ["@eslint/js@8.57.1", "", {}, "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q=="],
|
||||||
|
|
||||||
"@stock-bot/postgres-client/eslint/doctrine": ["doctrine@3.0.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w=="],
|
"@stock-bot/postgres/eslint/doctrine": ["doctrine@3.0.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w=="],
|
||||||
|
|
||||||
"@stock-bot/postgres-client/eslint/eslint-scope": ["eslint-scope@7.2.2", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg=="],
|
"@stock-bot/postgres/eslint/eslint-scope": ["eslint-scope@7.2.2", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg=="],
|
||||||
|
|
||||||
"@stock-bot/postgres-client/eslint/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="],
|
"@stock-bot/postgres/eslint/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="],
|
||||||
|
|
||||||
"@stock-bot/postgres-client/eslint/espree": ["espree@9.6.1", "", { "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.1" } }, "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ=="],
|
"@stock-bot/postgres/eslint/espree": ["espree@9.6.1", "", { "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.1" } }, "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ=="],
|
||||||
|
|
||||||
"@stock-bot/postgres-client/eslint/file-entry-cache": ["file-entry-cache@6.0.1", "", { "dependencies": { "flat-cache": "^3.0.4" } }, "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg=="],
|
"@stock-bot/postgres/eslint/file-entry-cache": ["file-entry-cache@6.0.1", "", { "dependencies": { "flat-cache": "^3.0.4" } }, "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg=="],
|
||||||
|
|
||||||
"@stock-bot/postgres-client/eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="],
|
"@stock-bot/postgres/eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="],
|
||||||
|
|
||||||
"@stock-bot/questdb-client/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0" } }, "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg=="],
|
"@stock-bot/questdb/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0" } }, "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg=="],
|
||||||
|
|
||||||
"@stock-bot/questdb-client/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@6.21.0", "", { "dependencies": { "@typescript-eslint/typescript-estree": "6.21.0", "@typescript-eslint/utils": "6.21.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag=="],
|
"@stock-bot/questdb/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@6.21.0", "", { "dependencies": { "@typescript-eslint/typescript-estree": "6.21.0", "@typescript-eslint/utils": "6.21.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag=="],
|
||||||
|
|
||||||
"@stock-bot/questdb-client/@typescript-eslint/eslint-plugin/@typescript-eslint/utils": ["@typescript-eslint/utils@6.21.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", "@typescript-eslint/scope-manager": "6.21.0", "@typescript-eslint/types": "6.21.0", "@typescript-eslint/typescript-estree": "6.21.0", "semver": "^7.5.4" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ=="],
|
"@stock-bot/questdb/@typescript-eslint/eslint-plugin/@typescript-eslint/utils": ["@typescript-eslint/utils@6.21.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", "@typescript-eslint/scope-manager": "6.21.0", "@typescript-eslint/types": "6.21.0", "@typescript-eslint/typescript-estree": "6.21.0", "semver": "^7.5.4" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ=="],
|
||||||
|
|
||||||
"@stock-bot/questdb-client/@typescript-eslint/eslint-plugin/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "eslint-visitor-keys": "^3.4.1" } }, "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A=="],
|
"@stock-bot/questdb/@typescript-eslint/eslint-plugin/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "eslint-visitor-keys": "^3.4.1" } }, "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A=="],
|
||||||
|
|
||||||
"@stock-bot/questdb-client/@typescript-eslint/eslint-plugin/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="],
|
"@stock-bot/questdb/@typescript-eslint/eslint-plugin/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="],
|
||||||
|
|
||||||
"@stock-bot/questdb-client/@typescript-eslint/eslint-plugin/ts-api-utils": ["ts-api-utils@1.4.3", "", { "peerDependencies": { "typescript": ">=4.2.0" } }, "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw=="],
|
"@stock-bot/questdb/@typescript-eslint/eslint-plugin/ts-api-utils": ["ts-api-utils@1.4.3", "", { "peerDependencies": { "typescript": ">=4.2.0" } }, "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw=="],
|
||||||
|
|
||||||
"@stock-bot/questdb-client/@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0" } }, "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg=="],
|
"@stock-bot/questdb/@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0" } }, "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg=="],
|
||||||
|
|
||||||
"@stock-bot/questdb-client/@typescript-eslint/parser/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="],
|
"@stock-bot/questdb/@typescript-eslint/parser/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="],
|
||||||
|
|
||||||
"@stock-bot/questdb-client/@typescript-eslint/parser/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "9.0.3", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" } }, "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ=="],
|
"@stock-bot/questdb/@typescript-eslint/parser/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "9.0.3", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" } }, "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ=="],
|
||||||
|
|
||||||
"@stock-bot/questdb-client/@typescript-eslint/parser/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "eslint-visitor-keys": "^3.4.1" } }, "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A=="],
|
"@stock-bot/questdb/@typescript-eslint/parser/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "eslint-visitor-keys": "^3.4.1" } }, "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A=="],
|
||||||
|
|
||||||
"@stock-bot/questdb-client/eslint/@eslint/eslintrc": ["@eslint/eslintrc@2.1.4", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ=="],
|
"@stock-bot/questdb/eslint/@eslint/eslintrc": ["@eslint/eslintrc@2.1.4", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ=="],
|
||||||
|
|
||||||
"@stock-bot/questdb-client/eslint/@eslint/js": ["@eslint/js@8.57.1", "", {}, "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q=="],
|
"@stock-bot/questdb/eslint/@eslint/js": ["@eslint/js@8.57.1", "", {}, "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q=="],
|
||||||
|
|
||||||
"@stock-bot/questdb-client/eslint/doctrine": ["doctrine@3.0.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w=="],
|
"@stock-bot/questdb/eslint/doctrine": ["doctrine@3.0.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w=="],
|
||||||
|
|
||||||
"@stock-bot/questdb-client/eslint/eslint-scope": ["eslint-scope@7.2.2", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg=="],
|
"@stock-bot/questdb/eslint/eslint-scope": ["eslint-scope@7.2.2", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg=="],
|
||||||
|
|
||||||
"@stock-bot/questdb-client/eslint/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="],
|
"@stock-bot/questdb/eslint/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="],
|
||||||
|
|
||||||
"@stock-bot/questdb-client/eslint/espree": ["espree@9.6.1", "", { "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.1" } }, "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ=="],
|
"@stock-bot/questdb/eslint/espree": ["espree@9.6.1", "", { "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.1" } }, "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ=="],
|
||||||
|
|
||||||
"@stock-bot/questdb-client/eslint/file-entry-cache": ["file-entry-cache@6.0.1", "", { "dependencies": { "flat-cache": "^3.0.4" } }, "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg=="],
|
"@stock-bot/questdb/eslint/file-entry-cache": ["file-entry-cache@6.0.1", "", { "dependencies": { "flat-cache": "^3.0.4" } }, "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg=="],
|
||||||
|
|
||||||
"@stock-bot/questdb-client/eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="],
|
"@stock-bot/questdb/eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="],
|
||||||
|
|
||||||
"@stock-bot/web-app/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0" } }, "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg=="],
|
"@stock-bot/web-app/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0" } }, "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg=="],
|
||||||
|
|
||||||
|
|
@ -2824,65 +2825,65 @@
|
||||||
|
|
||||||
"@stock-bot/http/eslint/file-entry-cache/flat-cache": ["flat-cache@3.2.0", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", "rimraf": "^3.0.2" } }, "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw=="],
|
"@stock-bot/http/eslint/file-entry-cache/flat-cache": ["flat-cache@3.2.0", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", "rimraf": "^3.0.2" } }, "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw=="],
|
||||||
|
|
||||||
"@stock-bot/mongodb-client/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="],
|
"@stock-bot/mongodb/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="],
|
||||||
|
|
||||||
"@stock-bot/mongodb-client/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "9.0.3", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" } }, "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ=="],
|
"@stock-bot/mongodb/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "9.0.3", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" } }, "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ=="],
|
||||||
|
|
||||||
"@stock-bot/mongodb-client/@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="],
|
"@stock-bot/mongodb/@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="],
|
||||||
|
|
||||||
"@stock-bot/mongodb-client/@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "9.0.3", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" } }, "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ=="],
|
"@stock-bot/mongodb/@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "9.0.3", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" } }, "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ=="],
|
||||||
|
|
||||||
"@stock-bot/mongodb-client/@typescript-eslint/eslint-plugin/@typescript-eslint/visitor-keys/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="],
|
"@stock-bot/mongodb/@typescript-eslint/eslint-plugin/@typescript-eslint/visitor-keys/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="],
|
||||||
|
|
||||||
"@stock-bot/mongodb-client/@typescript-eslint/eslint-plugin/@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="],
|
"@stock-bot/mongodb/@typescript-eslint/eslint-plugin/@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="],
|
||||||
|
|
||||||
"@stock-bot/mongodb-client/@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.3", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg=="],
|
"@stock-bot/mongodb/@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.3", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg=="],
|
||||||
|
|
||||||
"@stock-bot/mongodb-client/@typescript-eslint/parser/@typescript-eslint/typescript-estree/ts-api-utils": ["ts-api-utils@1.4.3", "", { "peerDependencies": { "typescript": ">=4.2.0" } }, "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw=="],
|
"@stock-bot/mongodb/@typescript-eslint/parser/@typescript-eslint/typescript-estree/ts-api-utils": ["ts-api-utils@1.4.3", "", { "peerDependencies": { "typescript": ">=4.2.0" } }, "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw=="],
|
||||||
|
|
||||||
"@stock-bot/mongodb-client/@typescript-eslint/parser/@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="],
|
"@stock-bot/mongodb/@typescript-eslint/parser/@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="],
|
||||||
|
|
||||||
"@stock-bot/mongodb-client/eslint/file-entry-cache/flat-cache": ["flat-cache@3.2.0", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", "rimraf": "^3.0.2" } }, "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw=="],
|
"@stock-bot/mongodb/eslint/file-entry-cache/flat-cache": ["flat-cache@3.2.0", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", "rimraf": "^3.0.2" } }, "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw=="],
|
||||||
|
|
||||||
"@stock-bot/postgres-client/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="],
|
"@stock-bot/postgres/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="],
|
||||||
|
|
||||||
"@stock-bot/postgres-client/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "9.0.3", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" } }, "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ=="],
|
"@stock-bot/postgres/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "9.0.3", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" } }, "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ=="],
|
||||||
|
|
||||||
"@stock-bot/postgres-client/@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="],
|
"@stock-bot/postgres/@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="],
|
||||||
|
|
||||||
"@stock-bot/postgres-client/@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "9.0.3", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" } }, "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ=="],
|
"@stock-bot/postgres/@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "9.0.3", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" } }, "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ=="],
|
||||||
|
|
||||||
"@stock-bot/postgres-client/@typescript-eslint/eslint-plugin/@typescript-eslint/visitor-keys/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="],
|
"@stock-bot/postgres/@typescript-eslint/eslint-plugin/@typescript-eslint/visitor-keys/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="],
|
||||||
|
|
||||||
"@stock-bot/postgres-client/@typescript-eslint/eslint-plugin/@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="],
|
"@stock-bot/postgres/@typescript-eslint/eslint-plugin/@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="],
|
||||||
|
|
||||||
"@stock-bot/postgres-client/@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.3", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg=="],
|
"@stock-bot/postgres/@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.3", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg=="],
|
||||||
|
|
||||||
"@stock-bot/postgres-client/@typescript-eslint/parser/@typescript-eslint/typescript-estree/ts-api-utils": ["ts-api-utils@1.4.3", "", { "peerDependencies": { "typescript": ">=4.2.0" } }, "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw=="],
|
"@stock-bot/postgres/@typescript-eslint/parser/@typescript-eslint/typescript-estree/ts-api-utils": ["ts-api-utils@1.4.3", "", { "peerDependencies": { "typescript": ">=4.2.0" } }, "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw=="],
|
||||||
|
|
||||||
"@stock-bot/postgres-client/@typescript-eslint/parser/@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="],
|
"@stock-bot/postgres/@typescript-eslint/parser/@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="],
|
||||||
|
|
||||||
"@stock-bot/postgres-client/eslint/file-entry-cache/flat-cache": ["flat-cache@3.2.0", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", "rimraf": "^3.0.2" } }, "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw=="],
|
"@stock-bot/postgres/eslint/file-entry-cache/flat-cache": ["flat-cache@3.2.0", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", "rimraf": "^3.0.2" } }, "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw=="],
|
||||||
|
|
||||||
"@stock-bot/questdb-client/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="],
|
"@stock-bot/questdb/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="],
|
||||||
|
|
||||||
"@stock-bot/questdb-client/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "9.0.3", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" } }, "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ=="],
|
"@stock-bot/questdb/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "9.0.3", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" } }, "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ=="],
|
||||||
|
|
||||||
"@stock-bot/questdb-client/@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="],
|
"@stock-bot/questdb/@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="],
|
||||||
|
|
||||||
"@stock-bot/questdb-client/@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "9.0.3", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" } }, "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ=="],
|
"@stock-bot/questdb/@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "9.0.3", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" } }, "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ=="],
|
||||||
|
|
||||||
"@stock-bot/questdb-client/@typescript-eslint/eslint-plugin/@typescript-eslint/visitor-keys/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="],
|
"@stock-bot/questdb/@typescript-eslint/eslint-plugin/@typescript-eslint/visitor-keys/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="],
|
||||||
|
|
||||||
"@stock-bot/questdb-client/@typescript-eslint/eslint-plugin/@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="],
|
"@stock-bot/questdb/@typescript-eslint/eslint-plugin/@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="],
|
||||||
|
|
||||||
"@stock-bot/questdb-client/@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.3", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg=="],
|
"@stock-bot/questdb/@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.3", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg=="],
|
||||||
|
|
||||||
"@stock-bot/questdb-client/@typescript-eslint/parser/@typescript-eslint/typescript-estree/ts-api-utils": ["ts-api-utils@1.4.3", "", { "peerDependencies": { "typescript": ">=4.2.0" } }, "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw=="],
|
"@stock-bot/questdb/@typescript-eslint/parser/@typescript-eslint/typescript-estree/ts-api-utils": ["ts-api-utils@1.4.3", "", { "peerDependencies": { "typescript": ">=4.2.0" } }, "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw=="],
|
||||||
|
|
||||||
"@stock-bot/questdb-client/@typescript-eslint/parser/@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="],
|
"@stock-bot/questdb/@typescript-eslint/parser/@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="],
|
||||||
|
|
||||||
"@stock-bot/questdb-client/eslint/file-entry-cache/flat-cache": ["flat-cache@3.2.0", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", "rimraf": "^3.0.2" } }, "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw=="],
|
"@stock-bot/questdb/eslint/file-entry-cache/flat-cache": ["flat-cache@3.2.0", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", "rimraf": "^3.0.2" } }, "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw=="],
|
||||||
|
|
||||||
"@stock-bot/web-app/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="],
|
"@stock-bot/web-app/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="],
|
||||||
|
|
||||||
|
|
@ -2926,29 +2927,29 @@
|
||||||
|
|
||||||
"@stock-bot/http/@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
|
"@stock-bot/http/@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
|
||||||
|
|
||||||
"@stock-bot/mongodb-client/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="],
|
"@stock-bot/mongodb/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="],
|
||||||
|
|
||||||
"@stock-bot/mongodb-client/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.3", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg=="],
|
"@stock-bot/mongodb/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.3", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg=="],
|
||||||
|
|
||||||
"@stock-bot/mongodb-client/@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.3", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg=="],
|
"@stock-bot/mongodb/@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.3", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg=="],
|
||||||
|
|
||||||
"@stock-bot/mongodb-client/@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
|
"@stock-bot/mongodb/@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
|
||||||
|
|
||||||
"@stock-bot/postgres-client/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="],
|
"@stock-bot/postgres/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="],
|
||||||
|
|
||||||
"@stock-bot/postgres-client/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.3", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg=="],
|
"@stock-bot/postgres/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.3", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg=="],
|
||||||
|
|
||||||
"@stock-bot/postgres-client/@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.3", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg=="],
|
"@stock-bot/postgres/@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.3", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg=="],
|
||||||
|
|
||||||
"@stock-bot/postgres-client/@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
|
"@stock-bot/postgres/@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
|
||||||
|
|
||||||
"@stock-bot/questdb-client/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="],
|
"@stock-bot/questdb/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="],
|
||||||
|
|
||||||
"@stock-bot/questdb-client/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.3", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg=="],
|
"@stock-bot/questdb/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.3", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg=="],
|
||||||
|
|
||||||
"@stock-bot/questdb-client/@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.3", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg=="],
|
"@stock-bot/questdb/@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.3", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg=="],
|
||||||
|
|
||||||
"@stock-bot/questdb-client/@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
|
"@stock-bot/questdb/@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
|
||||||
|
|
||||||
"@stock-bot/web-app/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="],
|
"@stock-bot/web-app/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="],
|
||||||
|
|
||||||
|
|
@ -2968,17 +2969,17 @@
|
||||||
|
|
||||||
"@stock-bot/http/@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
|
"@stock-bot/http/@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
|
||||||
|
|
||||||
"@stock-bot/mongodb-client/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
|
"@stock-bot/mongodb/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
|
||||||
|
|
||||||
"@stock-bot/mongodb-client/@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
|
"@stock-bot/mongodb/@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
|
||||||
|
|
||||||
"@stock-bot/postgres-client/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
|
"@stock-bot/postgres/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
|
||||||
|
|
||||||
"@stock-bot/postgres-client/@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
|
"@stock-bot/postgres/@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
|
||||||
|
|
||||||
"@stock-bot/questdb-client/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
|
"@stock-bot/questdb/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
|
||||||
|
|
||||||
"@stock-bot/questdb-client/@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
|
"@stock-bot/questdb/@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
|
||||||
|
|
||||||
"@stock-bot/web-app/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
|
"@stock-bot/web-app/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,23 +0,0 @@
|
||||||
export { ConnectionFactory } from './connection-factory';
|
|
||||||
export { ServiceContainer, createServiceContainer } from './service-container';
|
|
||||||
export { PoolSizeCalculator } from './pool-size-calculator';
|
|
||||||
|
|
||||||
export type {
|
|
||||||
ConnectionPoolConfig,
|
|
||||||
MongoDBPoolConfig,
|
|
||||||
PostgreSQLPoolConfig,
|
|
||||||
CachePoolConfig,
|
|
||||||
ConnectionFactoryConfig,
|
|
||||||
ConnectionPool,
|
|
||||||
PoolMetrics,
|
|
||||||
ConnectionFactory as IConnectionFactory,
|
|
||||||
} from './types';
|
|
||||||
|
|
||||||
export type {
|
|
||||||
ServiceRegistration,
|
|
||||||
ServiceResolver,
|
|
||||||
} from './service-container';
|
|
||||||
|
|
||||||
export type {
|
|
||||||
PoolSizeRecommendation,
|
|
||||||
} from './pool-size-calculator';
|
|
||||||
|
|
@ -150,6 +150,10 @@ export function getProviderConfig(provider: string) {
|
||||||
return (providers as Record<string, unknown>)[provider];
|
return (providers as Record<string, unknown>)[provider];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function getQueueConfig() {
|
||||||
|
return getConfig().queue;
|
||||||
|
}
|
||||||
|
|
||||||
// Export environment helpers
|
// Export environment helpers
|
||||||
export function isDevelopment(): boolean {
|
export function isDevelopment(): boolean {
|
||||||
return getConfig().environment === 'development';
|
return getConfig().environment === 'development';
|
||||||
|
|
@ -1,8 +1,9 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.lib.json",
|
"extends": "../../../tsconfig.json",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"outDir": "./dist",
|
"outDir": "./dist",
|
||||||
"rootDir": "./src"
|
"rootDir": "./src",
|
||||||
|
"composite": true
|
||||||
},
|
},
|
||||||
"include": ["src/**/*"],
|
"include": ["src/**/*"],
|
||||||
"references": [
|
"references": [
|
||||||
|
|
@ -1,7 +1,8 @@
|
||||||
import { getLogger, type Logger } from '@stock-bot/logger';
|
import { getLogger, type Logger } from '@stock-bot/logger';
|
||||||
import { MongoDBClient, createMongoDBClient, type ConnectionEvents } from '@stock-bot/mongodb-client';
|
import { MongoDBClient, createMongoDBClient, type ConnectionEvents } from '@stock-bot/mongodb';
|
||||||
import { PostgreSQLClient, createPostgreSQLClient } from '@stock-bot/postgres-client';
|
import { PostgreSQLClient, createPostgreSQLClient } from '@stock-bot/postgres';
|
||||||
import { createCache, type CacheProvider } from '@stock-bot/cache';
|
import { createCache, type CacheProvider } from '@stock-bot/cache';
|
||||||
|
import { QueueManager } from '@stock-bot/queue';
|
||||||
import type {
|
import type {
|
||||||
ConnectionFactory as IConnectionFactory,
|
ConnectionFactory as IConnectionFactory,
|
||||||
ConnectionPool,
|
ConnectionPool,
|
||||||
|
|
@ -9,6 +10,7 @@ import type {
|
||||||
MongoDBPoolConfig,
|
MongoDBPoolConfig,
|
||||||
PostgreSQLPoolConfig,
|
PostgreSQLPoolConfig,
|
||||||
CachePoolConfig,
|
CachePoolConfig,
|
||||||
|
QueuePoolConfig,
|
||||||
PoolMetrics,
|
PoolMetrics,
|
||||||
} from './types';
|
} from './types';
|
||||||
|
|
||||||
|
|
@ -189,7 +191,51 @@ export class ConnectionFactory implements IConnectionFactory {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
getPool(type: 'mongodb' | 'postgres' | 'cache', name: string): ConnectionPool<any> | undefined {
|
createQueue(poolConfig: QueuePoolConfig): ConnectionPool<QueueManager> {
|
||||||
|
const key = `queue:${poolConfig.name}`;
|
||||||
|
|
||||||
|
if (this.pools.has(key)) {
|
||||||
|
this.logger.debug('Reusing existing queue manager', { name: poolConfig.name });
|
||||||
|
return this.pools.get(key)!;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.logger.info('Creating queue manager', {
|
||||||
|
name: poolConfig.name,
|
||||||
|
});
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Initialize or get existing QueueManager instance
|
||||||
|
const queueManager = QueueManager.getOrInitialize(poolConfig.config);
|
||||||
|
|
||||||
|
const pool: ConnectionPool<QueueManager> = {
|
||||||
|
name: poolConfig.name,
|
||||||
|
client: queueManager,
|
||||||
|
metrics: this.createInitialMetrics(),
|
||||||
|
health: async () => {
|
||||||
|
try {
|
||||||
|
// Check if QueueManager is initialized
|
||||||
|
queueManager.getQueueNames();
|
||||||
|
return true;
|
||||||
|
} catch {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
dispose: async () => {
|
||||||
|
// QueueManager handles its own shutdown
|
||||||
|
await queueManager.shutdown();
|
||||||
|
this.pools.delete(key);
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
this.pools.set(key, pool);
|
||||||
|
return pool;
|
||||||
|
} catch (error) {
|
||||||
|
this.logger.error('Failed to create queue manager', { name: poolConfig.name, error });
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
getPool(type: 'mongodb' | 'postgres' | 'cache' | 'queue', name: string): ConnectionPool<any> | undefined {
|
||||||
const key = `${type}:${name}`;
|
const key = `${type}:${name}`;
|
||||||
return this.pools.get(key);
|
return this.pools.get(key);
|
||||||
}
|
}
|
||||||
6
libs/core/di/index.ts
Normal file
6
libs/core/di/index.ts
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
// Export all dependency injection components
|
||||||
|
export * from './service-container';
|
||||||
|
export * from './connection-factory';
|
||||||
|
export * from './operation-context';
|
||||||
|
export * from './pool-size-calculator';
|
||||||
|
export * from './types';
|
||||||
|
|
@ -11,9 +11,9 @@
|
||||||
import { createCache, type CacheProvider } from '@stock-bot/cache';
|
import { createCache, type CacheProvider } from '@stock-bot/cache';
|
||||||
import { getLogger, type Logger } from '@stock-bot/logger';
|
import { getLogger, type Logger } from '@stock-bot/logger';
|
||||||
import { getDatabaseConfig } from '@stock-bot/config';
|
import { getDatabaseConfig } from '@stock-bot/config';
|
||||||
import type { ServiceResolver } from '@stock-bot/connection-factory';
|
import type { ServiceResolver } from './service-container';
|
||||||
import type { MongoDBClient } from '@stock-bot/mongodb-client';
|
import type { MongoDBClient } from '@stock-bot/mongodb';
|
||||||
import type { PostgreSQLClient } from '@stock-bot/postgres-client';
|
import type { PostgreSQLClient } from '@stock-bot/postgres';
|
||||||
|
|
||||||
export interface OperationContextOptions {
|
export interface OperationContextOptions {
|
||||||
handlerName: string;
|
handlerName: string;
|
||||||
|
|
@ -28,6 +28,7 @@ export class OperationContext {
|
||||||
private _mongodb?: MongoDBClient;
|
private _mongodb?: MongoDBClient;
|
||||||
private _postgres?: PostgreSQLClient;
|
private _postgres?: PostgreSQLClient;
|
||||||
private _cache?: CacheProvider;
|
private _cache?: CacheProvider;
|
||||||
|
private _queue?: any; // Type will be QueueManager but we avoid import for circular deps
|
||||||
|
|
||||||
private static sharedCache: CacheProvider | null = null;
|
private static sharedCache: CacheProvider | null = null;
|
||||||
private static parentLoggers = new Map<string, Logger>();
|
private static parentLoggers = new Map<string, Logger>();
|
||||||
|
|
@ -92,16 +93,45 @@ export class OperationContext {
|
||||||
return this._postgres!;
|
return this._postgres!;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Lazy load QueueManager
|
||||||
|
get queue(): any {
|
||||||
|
if (!this._queue) {
|
||||||
|
if (this.container) {
|
||||||
|
try {
|
||||||
|
this._queue = this.container.resolve('queue');
|
||||||
|
} catch (error) {
|
||||||
|
this.logger.warn('Failed to resolve QueueManager from container, falling back to singleton', { error });
|
||||||
|
this._queue = this.getLegacyQueueManager();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this._queue = this.getLegacyQueueManager();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return this._queue!;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Legacy method for QueueManager
|
||||||
|
private getLegacyQueueManager(): any {
|
||||||
|
try {
|
||||||
|
// Dynamic import to avoid TypeScript issues during build
|
||||||
|
const { QueueManager } = require('@stock-bot/queue');
|
||||||
|
return QueueManager.getInstance();
|
||||||
|
} catch (error) {
|
||||||
|
this.logger.warn('QueueManager not initialized, queue operations may fail', { error });
|
||||||
|
throw new Error('QueueManager not available');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Legacy method for backward compatibility
|
// Legacy method for backward compatibility
|
||||||
private getLegacyDatabaseClient(type: 'mongodb' | 'postgres'): any {
|
private getLegacyDatabaseClient(type: 'mongodb' | 'postgres'): any {
|
||||||
try {
|
try {
|
||||||
if (type === 'mongodb') {
|
if (type === 'mongodb') {
|
||||||
// Dynamic import to avoid TypeScript issues during build
|
// Dynamic import to avoid TypeScript issues during build
|
||||||
const { getMongoDBClient } = require('@stock-bot/mongodb-client');
|
const { getMongoDBClient } = require('@stock-bot/mongodb');
|
||||||
return getMongoDBClient();
|
return getMongoDBClient();
|
||||||
} else {
|
} else {
|
||||||
// Dynamic import to avoid TypeScript issues during build
|
// Dynamic import to avoid TypeScript issues during build
|
||||||
const { getPostgreSQLClient } = require('@stock-bot/postgres-client');
|
const { getPostgreSQLClient } = require('@stock-bot/postgres');
|
||||||
return getPostgreSQLClient();
|
return getPostgreSQLClient();
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|
@ -1,14 +1,19 @@
|
||||||
{
|
{
|
||||||
"name": "@stock-bot/connection-factory",
|
"name": "@stock-bot/di",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"main": "./src/index.ts",
|
"main": "./src/index.ts",
|
||||||
"types": "./src/index.ts",
|
"types": "./src/index.ts",
|
||||||
|
"scripts": {
|
||||||
|
"build": "tsc",
|
||||||
|
"clean": "rm -rf dist"
|
||||||
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@stock-bot/config": "workspace:*",
|
"@stock-bot/config": "workspace:*",
|
||||||
"@stock-bot/logger": "workspace:*",
|
"@stock-bot/logger": "workspace:*",
|
||||||
"@stock-bot/mongodb-client": "workspace:*",
|
"@stock-bot/mongodb": "workspace:*",
|
||||||
"@stock-bot/postgres-client": "workspace:*",
|
"@stock-bot/postgres": "workspace:*",
|
||||||
"@stock-bot/cache": "workspace:*",
|
"@stock-bot/cache": "workspace:*",
|
||||||
|
"@stock-bot/queue": "workspace:*",
|
||||||
"mongodb": "^6.3.0",
|
"mongodb": "^6.3.0",
|
||||||
"pg": "^8.11.3"
|
"pg": "^8.11.3"
|
||||||
},
|
},
|
||||||
|
|
@ -99,12 +99,22 @@ export class ServiceContainer implements ServiceResolver {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Helper to create pre-configured containers for services
|
// Enhanced service container factory with infrastructure services
|
||||||
export function createServiceContainer(
|
export function createServiceContainer(
|
||||||
serviceName: string,
|
serviceName: string,
|
||||||
connectionFactory: ConnectionFactory
|
connectionFactory: ConnectionFactory,
|
||||||
|
config?: any
|
||||||
): ServiceContainer {
|
): ServiceContainer {
|
||||||
const container = new ServiceContainer(serviceName);
|
const container = new ServiceContainer(serviceName);
|
||||||
|
|
||||||
|
// Register configuration if provided
|
||||||
|
if (config) {
|
||||||
|
container.register({
|
||||||
|
name: 'config',
|
||||||
|
factory: () => config,
|
||||||
|
singleton: true,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// Register connection factories
|
// Register connection factories
|
||||||
container.register({
|
container.register({
|
||||||
|
|
@ -143,5 +153,63 @@ export function createServiceContainer(
|
||||||
singleton: true,
|
singleton: true,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
container.register({
|
||||||
|
name: 'queue',
|
||||||
|
factory: () => {
|
||||||
|
const pool = connectionFactory.createQueue({
|
||||||
|
name: 'default',
|
||||||
|
config: {} as any, // Config injected by factory
|
||||||
|
});
|
||||||
|
return pool.client;
|
||||||
|
},
|
||||||
|
singleton: true,
|
||||||
|
});
|
||||||
|
|
||||||
|
// Register ProxyManager
|
||||||
|
container.register({
|
||||||
|
name: 'proxyManager',
|
||||||
|
factory: async () => {
|
||||||
|
const { ProxyManager } = await import('@stock-bot/utils');
|
||||||
|
await ProxyManager.initialize();
|
||||||
|
return ProxyManager.getInstance();
|
||||||
|
},
|
||||||
|
singleton: true,
|
||||||
|
dispose: async (proxyManager) => {
|
||||||
|
// ProxyManager handles its own cleanup
|
||||||
|
if (proxyManager && typeof proxyManager.shutdown === 'function') {
|
||||||
|
await proxyManager.shutdown();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Register Browser service
|
||||||
|
container.register({
|
||||||
|
name: 'browser',
|
||||||
|
factory: async () => {
|
||||||
|
const { Browser } = await import('@stock-bot/browser');
|
||||||
|
return Browser;
|
||||||
|
},
|
||||||
|
singleton: true,
|
||||||
|
dispose: async (browser) => {
|
||||||
|
if (browser && typeof browser.close === 'function') {
|
||||||
|
await browser.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Register HttpClient with default configuration
|
||||||
|
container.register({
|
||||||
|
name: 'httpClient',
|
||||||
|
factory: async () => {
|
||||||
|
const { createHttpClient } = await import('@stock-bot/http');
|
||||||
|
return createHttpClient({
|
||||||
|
timeout: 30000,
|
||||||
|
retries: 3,
|
||||||
|
userAgent: 'stock-bot/1.0',
|
||||||
|
});
|
||||||
|
},
|
||||||
|
singleton: true,
|
||||||
|
});
|
||||||
|
|
||||||
return container;
|
return container;
|
||||||
}
|
}
|
||||||
21
libs/core/di/tsconfig.json
Normal file
21
libs/core/di/tsconfig.json
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
{
|
||||||
|
"extends": "../../../tsconfig.json",
|
||||||
|
"compilerOptions": {
|
||||||
|
"rootDir": "./",
|
||||||
|
"outDir": "./dist",
|
||||||
|
"composite": true,
|
||||||
|
"declaration": true,
|
||||||
|
"declarationMap": true,
|
||||||
|
"types": ["node", "bun-types"]
|
||||||
|
},
|
||||||
|
"include": ["./**/*.ts"],
|
||||||
|
"exclude": ["node_modules", "dist"],
|
||||||
|
"references": [
|
||||||
|
{ "path": "../config" },
|
||||||
|
{ "path": "../logger" },
|
||||||
|
{ "path": "../../data/mongodb" },
|
||||||
|
{ "path": "../../data/postgres" },
|
||||||
|
{ "path": "../../data/cache" },
|
||||||
|
{ "path": "../../services/queue" }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
import type { MongoDBClientConfig } from '@stock-bot/mongodb-client';
|
import type { MongoDBClientConfig } from '@stock-bot/mongodb-client';
|
||||||
import type { PostgreSQLClientConfig } from '@stock-bot/postgres-client';
|
import type { PostgreSQLClientConfig } from '@stock-bot/postgres-client';
|
||||||
import type { CacheOptions } from '@stock-bot/cache';
|
import type { CacheOptions } from '@stock-bot/cache';
|
||||||
|
import type { QueueManagerConfig } from '@stock-bot/queue';
|
||||||
|
|
||||||
export interface ConnectionPoolConfig {
|
export interface ConnectionPoolConfig {
|
||||||
name: string;
|
name: string;
|
||||||
|
|
@ -24,6 +25,10 @@ export interface CachePoolConfig extends ConnectionPoolConfig {
|
||||||
config: CacheOptions;
|
config: CacheOptions;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface QueuePoolConfig extends ConnectionPoolConfig {
|
||||||
|
config: QueueManagerConfig;
|
||||||
|
}
|
||||||
|
|
||||||
export interface ConnectionFactoryConfig {
|
export interface ConnectionFactoryConfig {
|
||||||
service: string;
|
service: string;
|
||||||
environment: 'development' | 'production' | 'test';
|
environment: 'development' | 'production' | 'test';
|
||||||
|
|
@ -31,6 +36,7 @@ export interface ConnectionFactoryConfig {
|
||||||
mongodb?: Partial<MongoDBPoolConfig>;
|
mongodb?: Partial<MongoDBPoolConfig>;
|
||||||
postgres?: Partial<PostgreSQLPoolConfig>;
|
postgres?: Partial<PostgreSQLPoolConfig>;
|
||||||
cache?: Partial<CachePoolConfig>;
|
cache?: Partial<CachePoolConfig>;
|
||||||
|
queue?: Partial<QueuePoolConfig>;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -55,7 +61,8 @@ export interface ConnectionFactory {
|
||||||
createMongoDB(config: MongoDBPoolConfig): Promise<ConnectionPool<any>>;
|
createMongoDB(config: MongoDBPoolConfig): Promise<ConnectionPool<any>>;
|
||||||
createPostgreSQL(config: PostgreSQLPoolConfig): Promise<ConnectionPool<any>>;
|
createPostgreSQL(config: PostgreSQLPoolConfig): Promise<ConnectionPool<any>>;
|
||||||
createCache(config: CachePoolConfig): ConnectionPool<any>;
|
createCache(config: CachePoolConfig): ConnectionPool<any>;
|
||||||
getPool(type: 'mongodb' | 'postgres' | 'cache', name: string): ConnectionPool<any> | undefined;
|
createQueue(config: QueuePoolConfig): ConnectionPool<any>;
|
||||||
|
getPool(type: 'mongodb' | 'postgres' | 'cache' | 'queue', name: string): ConnectionPool<any> | undefined;
|
||||||
listPools(): Array<{ type: string; name: string; metrics: PoolMetrics }>;
|
listPools(): Array<{ type: string; name: string; metrics: PoolMetrics }>;
|
||||||
disposeAll(): Promise<void>;
|
disposeAll(): Promise<void>;
|
||||||
}
|
}
|
||||||
22
libs/core/handlers/package.json
Normal file
22
libs/core/handlers/package.json
Normal file
|
|
@ -0,0 +1,22 @@
|
||||||
|
{
|
||||||
|
"name": "@stock-bot/handlers",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "Universal handler system for queue and event-driven operations",
|
||||||
|
"main": "./src/index.ts",
|
||||||
|
"types": "./src/index.ts",
|
||||||
|
"scripts": {
|
||||||
|
"build": "tsc",
|
||||||
|
"clean": "rimraf dist",
|
||||||
|
"test": "bun test"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@stock-bot/config": "workspace:*",
|
||||||
|
"@stock-bot/logger": "workspace:*",
|
||||||
|
"@stock-bot/di": "workspace:*"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@types/node": "^20.11.0",
|
||||||
|
"typescript": "^5.3.0",
|
||||||
|
"bun-types": "^1.2.15"
|
||||||
|
}
|
||||||
|
}
|
||||||
69
libs/core/handlers/src/base/BaseHandler.ts
Normal file
69
libs/core/handlers/src/base/BaseHandler.ts
Normal file
|
|
@ -0,0 +1,69 @@
|
||||||
|
import type { ServiceContainer } from '@stock-bot/di';
|
||||||
|
import { getLogger } from '@stock-bot/logger';
|
||||||
|
import type { IHandler, ExecutionContext } from '../types/types';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Abstract base class for all handlers
|
||||||
|
* Provides common functionality and structure for queue/event operations
|
||||||
|
*/
|
||||||
|
export abstract class BaseHandler implements IHandler {
|
||||||
|
protected readonly logger;
|
||||||
|
|
||||||
|
constructor(protected readonly container: ServiceContainer) {
|
||||||
|
this.logger = getLogger(this.constructor.name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Main execution method - must be implemented by subclasses
|
||||||
|
* Works with queue (events commented for future)
|
||||||
|
*/
|
||||||
|
abstract execute(operation: string, input: unknown, context: ExecutionContext): Promise<unknown>;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Queue helper methods
|
||||||
|
*/
|
||||||
|
protected async scheduleOperation(operation: string, payload: unknown, delay?: number): Promise<void> {
|
||||||
|
const queue = await this.container.resolveAsync('queue');
|
||||||
|
await queue.add(operation, payload, { delay });
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a service from the container
|
||||||
|
*/
|
||||||
|
protected async getService<T>(serviceName: string): Promise<T> {
|
||||||
|
return await this.container.resolveAsync<T>(serviceName);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Event methods - commented for future
|
||||||
|
*/
|
||||||
|
// protected async publishEvent(eventName: string, payload: unknown): Promise<void> {
|
||||||
|
// const eventBus = await this.container.resolveAsync('eventBus');
|
||||||
|
// await eventBus.publish(eventName, payload);
|
||||||
|
// }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Lifecycle hooks - can be overridden by subclasses
|
||||||
|
*/
|
||||||
|
async onInit?(): Promise<void>;
|
||||||
|
async onStart?(): Promise<void>;
|
||||||
|
async onStop?(): Promise<void>;
|
||||||
|
async onDispose?(): Promise<void>;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Specialized handler for operations that have scheduled jobs
|
||||||
|
*/
|
||||||
|
export abstract class ScheduledHandler extends BaseHandler {
|
||||||
|
/**
|
||||||
|
* Get scheduled job configurations for this handler
|
||||||
|
* Override in subclasses to define schedules
|
||||||
|
*/
|
||||||
|
getScheduledJobs?(): Array<{
|
||||||
|
operation: string;
|
||||||
|
cronPattern: string;
|
||||||
|
priority?: number;
|
||||||
|
immediately?: boolean;
|
||||||
|
description?: string;
|
||||||
|
}>;
|
||||||
|
}
|
||||||
86
libs/core/handlers/src/decorators/decorators.ts
Normal file
86
libs/core/handlers/src/decorators/decorators.ts
Normal file
|
|
@ -0,0 +1,86 @@
|
||||||
|
// Simple decorators for handler registration
|
||||||
|
// These are placeholders for now - can be enhanced with reflection later
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handler decorator - marks a class as a handler
|
||||||
|
* @param name Handler name for registration
|
||||||
|
*/
|
||||||
|
export function Handler(name: string) {
|
||||||
|
return function <T extends { new (...args: any[]): {} }>(constructor: T) {
|
||||||
|
// Store handler name on the constructor for future use
|
||||||
|
(constructor as any).__handlerName = name;
|
||||||
|
return constructor;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Operation decorator - marks a method as an operation
|
||||||
|
* @param name Operation name
|
||||||
|
*/
|
||||||
|
export function Operation(name: string) {
|
||||||
|
return function (target: any, propertyName: string, descriptor: PropertyDescriptor) {
|
||||||
|
// Store operation metadata for future use
|
||||||
|
if (!target.constructor.__operations) {
|
||||||
|
target.constructor.__operations = [];
|
||||||
|
}
|
||||||
|
target.constructor.__operations.push({
|
||||||
|
name,
|
||||||
|
method: propertyName,
|
||||||
|
});
|
||||||
|
return descriptor;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Queue schedule decorator - marks an operation as scheduled
|
||||||
|
* @param cronPattern Cron pattern for scheduling
|
||||||
|
* @param options Additional scheduling options
|
||||||
|
*/
|
||||||
|
export function QueueSchedule(
|
||||||
|
cronPattern: string,
|
||||||
|
options?: {
|
||||||
|
priority?: number;
|
||||||
|
immediately?: boolean;
|
||||||
|
description?: string;
|
||||||
|
}
|
||||||
|
) {
|
||||||
|
return function (target: any, propertyName: string, descriptor: PropertyDescriptor) {
|
||||||
|
// Store schedule metadata for future use
|
||||||
|
if (!target.constructor.__schedules) {
|
||||||
|
target.constructor.__schedules = [];
|
||||||
|
}
|
||||||
|
target.constructor.__schedules.push({
|
||||||
|
operation: propertyName,
|
||||||
|
cronPattern,
|
||||||
|
...options,
|
||||||
|
});
|
||||||
|
return descriptor;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// Future event decorators - commented for now
|
||||||
|
// export function EventListener(eventName: string) {
|
||||||
|
// return function (target: any, propertyName: string, descriptor: PropertyDescriptor) {
|
||||||
|
// if (!target.constructor.__eventListeners) {
|
||||||
|
// target.constructor.__eventListeners = [];
|
||||||
|
// }
|
||||||
|
// target.constructor.__eventListeners.push({
|
||||||
|
// eventName,
|
||||||
|
// method: propertyName,
|
||||||
|
// });
|
||||||
|
// return descriptor;
|
||||||
|
// };
|
||||||
|
// }
|
||||||
|
|
||||||
|
// export function EventPublisher(eventName: string) {
|
||||||
|
// return function (target: any, propertyName: string, descriptor: PropertyDescriptor) {
|
||||||
|
// if (!target.constructor.__eventPublishers) {
|
||||||
|
// target.constructor.__eventPublishers = [];
|
||||||
|
// }
|
||||||
|
// target.constructor.__eventPublishers.push({
|
||||||
|
// eventName,
|
||||||
|
// method: propertyName,
|
||||||
|
// });
|
||||||
|
// return descriptor;
|
||||||
|
// };
|
||||||
|
// }
|
||||||
26
libs/core/handlers/src/index.ts
Normal file
26
libs/core/handlers/src/index.ts
Normal file
|
|
@ -0,0 +1,26 @@
|
||||||
|
// Base handler classes
|
||||||
|
export { BaseHandler, ScheduledHandler } from './base/BaseHandler';
|
||||||
|
|
||||||
|
// Handler registry
|
||||||
|
export { handlerRegistry } from './registry/HandlerRegistry';
|
||||||
|
|
||||||
|
// Types
|
||||||
|
export type {
|
||||||
|
ExecutionContext,
|
||||||
|
IHandler,
|
||||||
|
JobHandler,
|
||||||
|
ScheduledJob,
|
||||||
|
HandlerConfig,
|
||||||
|
HandlerConfigWithSchedule,
|
||||||
|
TypedJobHandler,
|
||||||
|
HandlerMetadata,
|
||||||
|
OperationMetadata,
|
||||||
|
} from './types/types';
|
||||||
|
|
||||||
|
export { createJobHandler } from './types/types';
|
||||||
|
|
||||||
|
// Decorators
|
||||||
|
export { Handler, Operation, QueueSchedule } from './decorators/decorators';
|
||||||
|
|
||||||
|
// Future exports - commented for now
|
||||||
|
// export { EventListener, EventPublisher } from './decorators/decorators';
|
||||||
191
libs/core/handlers/src/registry/HandlerRegistry.ts
Normal file
191
libs/core/handlers/src/registry/HandlerRegistry.ts
Normal file
|
|
@ -0,0 +1,191 @@
|
||||||
|
import { getLogger } from '@stock-bot/logger';
|
||||||
|
import type { JobHandler, HandlerConfig, HandlerConfigWithSchedule, ScheduledJob } from '../types/types';
|
||||||
|
|
||||||
|
const logger = getLogger('handler-registry');
|
||||||
|
|
||||||
|
class HandlerRegistry {
|
||||||
|
private handlers = new Map<string, HandlerConfig>();
|
||||||
|
private handlerSchedules = new Map<string, ScheduledJob[]>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register a handler with its operations (simple config)
|
||||||
|
*/
|
||||||
|
register(handlerName: string, config: HandlerConfig): void {
|
||||||
|
logger.info(`Registering handler: ${handlerName}`, {
|
||||||
|
operations: Object.keys(config),
|
||||||
|
});
|
||||||
|
|
||||||
|
this.handlers.set(handlerName, config);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register a handler with operations and scheduled jobs (full config)
|
||||||
|
*/
|
||||||
|
registerWithSchedule(config: HandlerConfigWithSchedule): void {
|
||||||
|
logger.info(`Registering handler with schedule: ${config.name}`, {
|
||||||
|
operations: Object.keys(config.operations),
|
||||||
|
scheduledJobs: config.scheduledJobs?.length || 0,
|
||||||
|
});
|
||||||
|
|
||||||
|
this.handlers.set(config.name, config.operations);
|
||||||
|
|
||||||
|
if (config.scheduledJobs && config.scheduledJobs.length > 0) {
|
||||||
|
this.handlerSchedules.set(config.name, config.scheduledJobs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a handler for a specific handler and operation
|
||||||
|
*/
|
||||||
|
getHandler(handler: string, operation: string): JobHandler | null {
|
||||||
|
const handlerConfig = this.handlers.get(handler);
|
||||||
|
if (!handlerConfig) {
|
||||||
|
logger.warn(`Handler not found: ${handler}`);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const jobHandler = handlerConfig[operation];
|
||||||
|
if (!jobHandler) {
|
||||||
|
logger.warn(`Operation not found: ${handler}:${operation}`, {
|
||||||
|
availableOperations: Object.keys(handlerConfig),
|
||||||
|
});
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return jobHandler;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all scheduled jobs from all handlers
|
||||||
|
*/
|
||||||
|
getAllScheduledJobs(): Array<{ handler: string; job: ScheduledJob }> {
|
||||||
|
const allJobs: Array<{ handler: string; job: ScheduledJob }> = [];
|
||||||
|
|
||||||
|
for (const [handlerName, jobs] of this.handlerSchedules) {
|
||||||
|
for (const job of jobs) {
|
||||||
|
allJobs.push({
|
||||||
|
handler: handlerName,
|
||||||
|
job,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return allJobs;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get scheduled jobs for a specific handler
|
||||||
|
*/
|
||||||
|
getScheduledJobs(handler: string): ScheduledJob[] {
|
||||||
|
return this.handlerSchedules.get(handler) || [];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if a handler has scheduled jobs
|
||||||
|
*/
|
||||||
|
hasScheduledJobs(handler: string): boolean {
|
||||||
|
return this.handlerSchedules.has(handler);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all registered handlers with their configurations
|
||||||
|
*/
|
||||||
|
getHandlerConfigs(): Array<{ name: string; operations: string[]; scheduledJobs: number }> {
|
||||||
|
return Array.from(this.handlers.keys()).map(name => ({
|
||||||
|
name,
|
||||||
|
operations: Object.keys(this.handlers.get(name) || {}),
|
||||||
|
scheduledJobs: this.handlerSchedules.get(name)?.length || 0,
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all handlers with their full configurations for queue manager registration
|
||||||
|
*/
|
||||||
|
getAllHandlers(): Map<string, { operations: HandlerConfig; scheduledJobs?: ScheduledJob[] }> {
|
||||||
|
const result = new Map<
|
||||||
|
string,
|
||||||
|
{ operations: HandlerConfig; scheduledJobs?: ScheduledJob[] }
|
||||||
|
>();
|
||||||
|
|
||||||
|
for (const [name, operations] of this.handlers) {
|
||||||
|
const scheduledJobs = this.handlerSchedules.get(name);
|
||||||
|
result.set(name, {
|
||||||
|
operations,
|
||||||
|
scheduledJobs,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all registered handlers
|
||||||
|
*/
|
||||||
|
getHandlers(): string[] {
|
||||||
|
return Array.from(this.handlers.keys());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get operations for a specific handler
|
||||||
|
*/
|
||||||
|
getOperations(handler: string): string[] {
|
||||||
|
const handlerConfig = this.handlers.get(handler);
|
||||||
|
return handlerConfig ? Object.keys(handlerConfig) : [];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if a handler exists
|
||||||
|
*/
|
||||||
|
hasHandler(handler: string): boolean {
|
||||||
|
return this.handlers.has(handler);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if a handler has a specific operation
|
||||||
|
*/
|
||||||
|
hasOperation(handler: string, operation: string): boolean {
|
||||||
|
const handlerConfig = this.handlers.get(handler);
|
||||||
|
return handlerConfig ? operation in handlerConfig : false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove a handler
|
||||||
|
*/
|
||||||
|
unregister(handler: string): boolean {
|
||||||
|
this.handlerSchedules.delete(handler);
|
||||||
|
return this.handlers.delete(handler);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clear all handlers
|
||||||
|
*/
|
||||||
|
clear(): void {
|
||||||
|
this.handlers.clear();
|
||||||
|
this.handlerSchedules.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get registry statistics
|
||||||
|
*/
|
||||||
|
getStats(): { handlers: number; totalOperations: number; totalScheduledJobs: number } {
|
||||||
|
let totalOperations = 0;
|
||||||
|
let totalScheduledJobs = 0;
|
||||||
|
|
||||||
|
for (const config of this.handlers.values()) {
|
||||||
|
totalOperations += Object.keys(config).length;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const jobs of this.handlerSchedules.values()) {
|
||||||
|
totalScheduledJobs += jobs.length;
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
handlers: this.handlers.size,
|
||||||
|
totalOperations,
|
||||||
|
totalScheduledJobs,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Export singleton instance
|
||||||
|
export const handlerRegistry = new HandlerRegistry();
|
||||||
73
libs/core/handlers/src/types/types.ts
Normal file
73
libs/core/handlers/src/types/types.ts
Normal file
|
|
@ -0,0 +1,73 @@
|
||||||
|
import type { ServiceContainer } from '@stock-bot/di';
|
||||||
|
|
||||||
|
// Simple execution context - mostly queue for now
|
||||||
|
export interface ExecutionContext {
|
||||||
|
type: 'queue'; // | 'event' - commented for future
|
||||||
|
serviceContainer: ServiceContainer;
|
||||||
|
metadata: {
|
||||||
|
source?: string;
|
||||||
|
jobId?: string;
|
||||||
|
attempts?: number;
|
||||||
|
timestamp: number;
|
||||||
|
[key: string]: unknown;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// Simple handler interface
|
||||||
|
export interface IHandler {
|
||||||
|
execute(operation: string, input: unknown, context: ExecutionContext): Promise<unknown>;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Job handler type for queue operations
|
||||||
|
export interface JobHandler<TPayload = unknown, TResult = unknown> {
|
||||||
|
(payload: TPayload): Promise<TResult>;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Scheduled job configuration
|
||||||
|
export interface ScheduledJob<T = unknown> {
|
||||||
|
type: string;
|
||||||
|
operation: string;
|
||||||
|
payload?: T;
|
||||||
|
cronPattern: string;
|
||||||
|
priority?: number;
|
||||||
|
description?: string;
|
||||||
|
immediately?: boolean;
|
||||||
|
delay?: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handler configuration
|
||||||
|
export interface HandlerConfig {
|
||||||
|
[operation: string]: JobHandler;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handler configuration with schedule
|
||||||
|
export interface HandlerConfigWithSchedule {
|
||||||
|
name: string;
|
||||||
|
operations: Record<string, JobHandler>;
|
||||||
|
scheduledJobs?: ScheduledJob[];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Type-safe wrapper for creating job handlers
|
||||||
|
export type TypedJobHandler<TPayload, TResult = unknown> = (payload: TPayload) => Promise<TResult>;
|
||||||
|
|
||||||
|
// Helper to create type-safe job handlers
|
||||||
|
export function createJobHandler<TPayload = unknown, TResult = unknown>(
|
||||||
|
handler: TypedJobHandler<TPayload, TResult>
|
||||||
|
): JobHandler<unknown, TResult> {
|
||||||
|
return async (payload: unknown): Promise<TResult> => {
|
||||||
|
return handler(payload as TPayload);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handler metadata for decorators (future)
|
||||||
|
export interface HandlerMetadata {
|
||||||
|
name: string;
|
||||||
|
operations: OperationMetadata[];
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface OperationMetadata {
|
||||||
|
name: string;
|
||||||
|
schedules?: string[];
|
||||||
|
// eventListeners?: string[]; // Future
|
||||||
|
// eventPublishers?: string[]; // Future
|
||||||
|
}
|
||||||
|
|
@ -1,16 +1,14 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.json",
|
"extends": "../../../tsconfig.json",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"rootDir": "./src",
|
|
||||||
"outDir": "./dist",
|
"outDir": "./dist",
|
||||||
|
"rootDir": "./src",
|
||||||
"composite": true
|
"composite": true
|
||||||
},
|
},
|
||||||
"include": ["src/**/*"],
|
"include": ["src/**/*"],
|
||||||
"references": [
|
"references": [
|
||||||
{ "path": "../config" },
|
{ "path": "../config" },
|
||||||
{ "path": "../logger" },
|
{ "path": "../logger" },
|
||||||
{ "path": "../mongodb-client" },
|
{ "path": "../di" }
|
||||||
{ "path": "../postgres-client" },
|
|
||||||
{ "path": "../cache" }
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
@ -1,8 +1,9 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.lib.json",
|
"extends": "../../../tsconfig.json",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"outDir": "./dist",
|
"outDir": "./dist",
|
||||||
"rootDir": "./src"
|
"rootDir": "./src",
|
||||||
|
"composite": true
|
||||||
},
|
},
|
||||||
"include": ["src/**/*"],
|
"include": ["src/**/*"],
|
||||||
"references": [
|
"references": [
|
||||||
|
|
@ -1,8 +1,9 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.lib.json",
|
"extends": "../../../tsconfig.json",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"outDir": "./dist",
|
"outDir": "./dist",
|
||||||
"rootDir": "./src"
|
"rootDir": "./src",
|
||||||
|
"composite": true
|
||||||
},
|
},
|
||||||
"include": ["src/**/*"],
|
"include": ["src/**/*"],
|
||||||
"references": [
|
"references": [
|
||||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue