diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..f3f3b15 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,81 @@ +# Dependencies +node_modules/ +**/node_modules/ + +# Build outputs +dist/ +build/ +**/dist/ +**/build/ +.next/ +**/.next/ + +# Cache directories +.turbo/ +**/.turbo/ +.cache/ +**/.cache/ + +# Environment files +.env +.env.local +.env.production +.env.staging +**/.env* + +# Lock files +package-lock.json +yarn.lock +bun.lockb +pnpm-lock.yaml + +# Logs +*.log +logs/ +**/logs/ + +# Database files +*.db +*.sqlite +*.sqlite3 + +# Temporary files +*.tmp +*.temp +.DS_Store +Thumbs.db + +# Generated files +*.d.ts +**/*.d.ts + +# JavaScript files (we're focusing on TypeScript) +*.js +*.mjs +!.eslintrc.js +!eslint.config.js + +# Scripts and config directories +scripts/ +monitoring/ +database/ +docker-compose*.yml +Dockerfile* + +# Documentation +*.md +docs/ + +# Test coverage +coverage/ +**/coverage/ + +# IDE/Editor files +.vscode/ +.idea/ +*.swp +*.swo + +# Angular specific +**/.angular/ +**/src/polyfills.ts diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..9169ce5 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1 @@ +// This file is deprecated in ESLint v9. Use eslint.config.js instead. diff --git a/.vscode/settings.json b/.vscode/settings.json index 1fe5010..59d0399 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -26,13 +26,31 @@ "editor.formatOnPaste": true, "editor.codeActionsOnSave": { "source.fixAll": "explicit", + "source.fixAll.eslint": "explicit", "source.organizeImports": "explicit" }, + "eslint.enable": true, + "eslint.validate": [ + "typescript", + "javascript" + ], + "eslint.run": "onType", + "eslint.workingDirectories": [ + { + "mode": "auto" + } + ], "[typescript]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.codeActionsOnSave": { + "source.fixAll.eslint": "explicit" + } }, "[javascript]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.codeActionsOnSave": { + "source.fixAll.eslint": "explicit" + } }, "[json]": { "editor.defaultFormatter": "esbenp.prettier-vscode" diff --git a/apps/dashboard/.postcssrc.json b/apps/dashboard/.postcssrc.json index 9ca94b5..e092dc7 100644 --- a/apps/dashboard/.postcssrc.json +++ b/apps/dashboard/.postcssrc.json @@ -1,5 +1,5 @@ -{ - "plugins": { - "@tailwindcss/postcss": {} - } -} \ No newline at end of file +{ + "plugins": { + "@tailwindcss/postcss": {} + } +} diff --git a/apps/dashboard/.vscode/extensions.json b/apps/dashboard/.vscode/extensions.json index feccd00..77b3745 100644 --- a/apps/dashboard/.vscode/extensions.json +++ b/apps/dashboard/.vscode/extensions.json @@ -1,4 +1,4 @@ -{ - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=827846 - "recommendations": ["angular.ng-template"] -} +{ + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=827846 + "recommendations": ["angular.ng-template"] +} diff --git a/apps/dashboard/.vscode/launch.json b/apps/dashboard/.vscode/launch.json index 278bd60..925af83 100644 --- a/apps/dashboard/.vscode/launch.json +++ b/apps/dashboard/.vscode/launch.json @@ -1,20 +1,20 @@ -{ - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "name": "ng serve", - "type": "chrome", - "request": "launch", - "preLaunchTask": "npm: start", - "url": "http://localhost:4200/" - }, - { - "name": "ng test", - "type": "chrome", - "request": "launch", - "preLaunchTask": "npm: test", - "url": "http://localhost:9876/debug.html" - } - ] -} +{ + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "ng serve", + "type": "chrome", + "request": "launch", + "preLaunchTask": "npm: start", + "url": "http://localhost:4200/" + }, + { + "name": "ng test", + "type": "chrome", + "request": "launch", + "preLaunchTask": "npm: test", + "url": "http://localhost:9876/debug.html" + } + ] +} diff --git a/apps/dashboard/.vscode/tasks.json b/apps/dashboard/.vscode/tasks.json index e4f8cf0..a298b5b 100644 --- a/apps/dashboard/.vscode/tasks.json +++ b/apps/dashboard/.vscode/tasks.json @@ -1,42 +1,42 @@ -{ - // For more information, visit: https://go.microsoft.com/fwlink/?LinkId=733558 - "version": "2.0.0", - "tasks": [ - { - "type": "npm", - "script": "start", - "isBackground": true, - "problemMatcher": { - "owner": "typescript", - "pattern": "$tsc", - "background": { - "activeOnStart": true, - "beginsPattern": { - "regexp": "(.*?)" - }, - "endsPattern": { - "regexp": "bundle generation complete" - } - } - } - }, - { - "type": "npm", - "script": "test", - "isBackground": true, - "problemMatcher": { - "owner": "typescript", - "pattern": "$tsc", - "background": { - "activeOnStart": true, - "beginsPattern": { - "regexp": "(.*?)" - }, - "endsPattern": { - "regexp": "bundle generation complete" - } - } - } - } - ] -} +{ + // For more information, visit: https://go.microsoft.com/fwlink/?LinkId=733558 + "version": "2.0.0", + "tasks": [ + { + "type": "npm", + "script": "start", + "isBackground": true, + "problemMatcher": { + "owner": "typescript", + "pattern": "$tsc", + "background": { + "activeOnStart": true, + "beginsPattern": { + "regexp": "(.*?)" + }, + "endsPattern": { + "regexp": "bundle generation complete" + } + } + } + }, + { + "type": "npm", + "script": "test", + "isBackground": true, + "problemMatcher": { + "owner": "typescript", + "pattern": "$tsc", + "background": { + "activeOnStart": true, + "beginsPattern": { + "regexp": "(.*?)" + }, + "endsPattern": { + "regexp": "bundle generation complete" + } + } + } + } + ] +} diff --git a/apps/dashboard/package.json b/apps/dashboard/package.json index 50e70d0..e620e45 100644 --- a/apps/dashboard/package.json +++ b/apps/dashboard/package.json @@ -1,44 +1,44 @@ -{ - "name": "trading-dashboard", - "version": "0.0.0", - "scripts": { - "ng": "ng", - "start": "ng serve", - "devvvv": "ng serve --port 5173 --host 0.0.0.0", - "build": "ng build", - "watch": "ng build --watch --configuration development", - "test": "ng test" - }, - "private": true, - "dependencies": { - "@angular/animations": "^20.0.0", - "@angular/cdk": "^20.0.1", - "@angular/common": "^20.0.0", - "@angular/compiler": "^20.0.0", - "@angular/core": "^20.0.0", - "@angular/forms": "^20.0.0", - "@angular/material": "^20.0.1", - "@angular/platform-browser": "^20.0.0", - "@angular/router": "^20.0.0", - "rxjs": "~7.8.2", - "tslib": "^2.8.1", - "zone.js": "~0.15.1" - }, - "devDependencies": { - "@angular/build": "^20.0.0", - "@angular/cli": "^20.0.0", - "@angular/compiler-cli": "^20.0.0", - "@tailwindcss/postcss": "^4.1.8", - "@types/jasmine": "~5.1.8", - "autoprefixer": "^10.4.21", - "jasmine-core": "~5.7.1", - "karma": "~6.4.4", - "karma-chrome-launcher": "~3.2.0", - "karma-coverage": "~2.2.1", - "karma-jasmine": "~5.1.0", - "karma-jasmine-html-reporter": "~2.1.0", - "postcss": "^8.5.4", - "tailwindcss": "^4.1.8", - "typescript": "~5.8.3" - } -} +{ + "name": "trading-dashboard", + "version": "0.0.0", + "scripts": { + "ng": "ng", + "start": "ng serve", + "devvvv": "ng serve --port 5173 --host 0.0.0.0", + "build": "ng build", + "watch": "ng build --watch --configuration development", + "test": "ng test" + }, + "private": true, + "dependencies": { + "@angular/animations": "^20.0.0", + "@angular/cdk": "^20.0.1", + "@angular/common": "^20.0.0", + "@angular/compiler": "^20.0.0", + "@angular/core": "^20.0.0", + "@angular/forms": "^20.0.0", + "@angular/material": "^20.0.1", + "@angular/platform-browser": "^20.0.0", + "@angular/router": "^20.0.0", + "rxjs": "~7.8.2", + "tslib": "^2.8.1", + "zone.js": "~0.15.1" + }, + "devDependencies": { + "@angular/build": "^20.0.0", + "@angular/cli": "^20.0.0", + "@angular/compiler-cli": "^20.0.0", + "@tailwindcss/postcss": "^4.1.8", + "@types/jasmine": "~5.1.8", + "autoprefixer": "^10.4.21", + "jasmine-core": "~5.7.1", + "karma": "~6.4.4", + "karma-chrome-launcher": "~3.2.0", + "karma-coverage": "~2.2.1", + "karma-jasmine": "~5.1.0", + "karma-jasmine-html-reporter": "~2.1.0", + "postcss": "^8.5.4", + "tailwindcss": "^4.1.8", + "typescript": "~5.8.3" + } +} diff --git a/apps/dashboard/src/app/components/notifications/notifications.ts b/apps/dashboard/src/app/components/notifications/notifications.ts index 63211c4..f2a70fb 100644 --- a/apps/dashboard/src/app/components/notifications/notifications.ts +++ b/apps/dashboard/src/app/components/notifications/notifications.ts @@ -82,11 +82,11 @@ export class NotificationsComponent { const diff = now.getTime() - timestamp.getTime(); const minutes = Math.floor(diff / 60000); - if (minutes < 1) return 'Just now'; - if (minutes < 60) return `${minutes}m ago`; + if (minutes < 1) {return 'Just now';} + if (minutes < 60) {return `${minutes}m ago`;} const hours = Math.floor(minutes / 60); - if (hours < 24) return `${hours}h ago`; + if (hours < 24) {return `${hours}h ago`;} const days = Math.floor(hours / 24); return `${days}d ago`; diff --git a/apps/dashboard/src/app/pages/portfolio/portfolio.component.ts b/apps/dashboard/src/app/pages/portfolio/portfolio.component.ts index 953f9c0..507870c 100644 --- a/apps/dashboard/src/app/pages/portfolio/portfolio.component.ts +++ b/apps/dashboard/src/app/pages/portfolio/portfolio.component.ts @@ -161,8 +161,8 @@ export class PortfolioComponent implements OnInit, OnDestroy { } getPnLColor(value: number): string { - if (value > 0) return 'text-green-600'; - if (value < 0) return 'text-red-600'; + if (value > 0) {return 'text-green-600';} + if (value < 0) {return 'text-red-600';} return 'text-gray-600'; } } diff --git a/apps/dashboard/src/app/pages/strategies/components/drawdown-chart.component.ts b/apps/dashboard/src/app/pages/strategies/components/drawdown-chart.component.ts index 0897793..88df548 100644 --- a/apps/dashboard/src/app/pages/strategies/components/drawdown-chart.component.ts +++ b/apps/dashboard/src/app/pages/strategies/components/drawdown-chart.component.ts @@ -40,7 +40,7 @@ export class DrawdownChartComponent implements OnChanges { } private renderChart(): void { - if (!this.chartElement || !this.backtestResult) return; + if (!this.chartElement || !this.backtestResult) {return;} // Clean up previous chart if it exists if (this.chart) { diff --git a/apps/dashboard/src/app/pages/strategies/components/equity-chart.component.ts b/apps/dashboard/src/app/pages/strategies/components/equity-chart.component.ts index 60ffb59..48ada6b 100644 --- a/apps/dashboard/src/app/pages/strategies/components/equity-chart.component.ts +++ b/apps/dashboard/src/app/pages/strategies/components/equity-chart.component.ts @@ -40,7 +40,7 @@ export class EquityChartComponent implements OnChanges { } private renderChart(): void { - if (!this.chartElement || !this.backtestResult) return; + if (!this.chartElement || !this.backtestResult) {return;} // Clean up previous chart if it exists if (this.chart) { diff --git a/apps/dashboard/src/app/pages/strategies/components/performance-metrics.component.ts b/apps/dashboard/src/app/pages/strategies/components/performance-metrics.component.ts index dac6194..52a33eb 100644 --- a/apps/dashboard/src/app/pages/strategies/components/performance-metrics.component.ts +++ b/apps/dashboard/src/app/pages/strategies/components/performance-metrics.component.ts @@ -278,27 +278,27 @@ export class PerformanceMetricsComponent { // Conditional classes getReturnClass(value: number): string { - if (value > 0) return 'positive'; - if (value < 0) return 'negative'; + if (value > 0) {return 'positive';} + if (value < 0) {return 'negative';} return ''; } getRatioClass(value: number): string { - if (value >= 1.5) return 'positive'; - if (value >= 1) return 'neutral'; - if (value < 0) return 'negative'; + if (value >= 1.5) {return 'positive';} + if (value >= 1) {return 'neutral';} + if (value < 0) {return 'negative';} return ''; } getWinRateClass(value: number): string { - if (value >= 0.55) return 'positive'; - if (value >= 0.45) return 'neutral'; + if (value >= 0.55) {return 'positive';} + if (value >= 0.45) {return 'neutral';} return 'negative'; } getProfitFactorClass(value: number): string { - if (value >= 1.5) return 'positive'; - if (value >= 1) return 'neutral'; + if (value >= 1.5) {return 'positive';} + if (value >= 1) {return 'neutral';} return 'negative'; } } diff --git a/apps/dashboard/src/app/pages/strategies/dialogs/backtest-dialog.component.ts b/apps/dashboard/src/app/pages/strategies/dialogs/backtest-dialog.component.ts index 4f85906..359e988 100644 --- a/apps/dashboard/src/app/pages/strategies/dialogs/backtest-dialog.component.ts +++ b/apps/dashboard/src/app/pages/strategies/dialogs/backtest-dialog.component.ts @@ -139,7 +139,7 @@ export class BacktestDialogComponent implements OnInit { } addSymbol(symbol: string): void { - if (!symbol || this.selectedSymbols.includes(symbol)) return; + if (!symbol || this.selectedSymbols.includes(symbol)) {return;} this.selectedSymbols.push(symbol); } diff --git a/apps/dashboard/src/app/pages/strategies/dialogs/strategy-dialog.component.ts b/apps/dashboard/src/app/pages/strategies/dialogs/strategy-dialog.component.ts index a5d29f7..b19fae6 100644 --- a/apps/dashboard/src/app/pages/strategies/dialogs/strategy-dialog.component.ts +++ b/apps/dashboard/src/app/pages/strategies/dialogs/strategy-dialog.component.ts @@ -126,7 +126,7 @@ export class StrategyDialogComponent implements OnInit { } addSymbol(symbol: string): void { - if (!symbol || this.selectedSymbols.includes(symbol)) return; + if (!symbol || this.selectedSymbols.includes(symbol)) {return;} this.selectedSymbols.push(symbol); } diff --git a/apps/dashboard/src/app/pages/strategies/strategy-details/strategy-details.component.ts b/apps/dashboard/src/app/pages/strategies/strategy-details/strategy-details.component.ts index d5ff850..b700d9e 100644 --- a/apps/dashboard/src/app/pages/strategies/strategy-details/strategy-details.component.ts +++ b/apps/dashboard/src/app/pages/strategies/strategy-details/strategy-details.component.ts @@ -67,7 +67,9 @@ export class StrategyDetailsComponent implements OnChanges { } loadStrategyData(): void { - if (!this.strategy) return; + if (!this.strategy) { + return; + } // In a real implementation, these would call API methods to fetch the data this.loadSignals(); @@ -75,7 +77,9 @@ export class StrategyDetailsComponent implements OnChanges { this.loadPerformance(); } loadSignals(): void { - if (!this.strategy) return; + if (!this.strategy) { + return; + } this.isLoadingSignals = true; @@ -100,7 +104,9 @@ export class StrategyDetailsComponent implements OnChanges { } loadTrades(): void { - if (!this.strategy) return; + if (!this.strategy) { + return; + } this.isLoadingTrades = true; @@ -140,7 +146,9 @@ export class StrategyDetailsComponent implements OnChanges { }; } listenForUpdates(): void { - if (!this.strategy) return; + if (!this.strategy) { + return; + } // Subscribe to strategy signals this.webSocketService.getStrategySignals(this.strategy.id).subscribe((signal: any) => { @@ -186,7 +194,9 @@ export class StrategyDetailsComponent implements OnChanges { * Update performance metrics when new trades come in */ private updatePerformanceMetrics(): void { - if (!this.strategy || this.trades.length === 0) return; + if (!this.strategy || this.trades.length === 0) { + return; + } // Calculate basic metrics const winningTrades = this.trades.filter(t => t.pnl > 0); @@ -201,6 +211,8 @@ export class StrategyDetailsComponent implements OnChanges { ...currentPerformance, totalTrades: this.trades.length, winRate: winRate, + winningTrades, + losingTrades, totalReturn: (currentPerformance.totalReturn || 0) + totalPnl / 10000, // Approximate }; @@ -242,7 +254,9 @@ export class StrategyDetailsComponent implements OnChanges { * Open the backtest dialog to run a backtest for this strategy */ openBacktestDialog(): void { - if (!this.strategy) return; + if (!this.strategy) { + return; + } const dialogRef = this.dialog.open(BacktestDialogComponent, { width: '800px', @@ -261,7 +275,9 @@ export class StrategyDetailsComponent implements OnChanges { * Open the strategy edit dialog */ openEditDialog(): void { - if (!this.strategy) return; + if (!this.strategy) { + return; + } const dialogRef = this.dialog.open(StrategyDialogComponent, { width: '600px', @@ -280,7 +296,9 @@ export class StrategyDetailsComponent implements OnChanges { * Start the strategy */ activateStrategy(): void { - if (!this.strategy) return; + if (!this.strategy) { + return; + } this.strategyService.startStrategy(this.strategy.id).subscribe({ next: response => { @@ -298,7 +316,9 @@ export class StrategyDetailsComponent implements OnChanges { * Pause the strategy */ pauseStrategy(): void { - if (!this.strategy) return; + if (!this.strategy) { + return; + } this.strategyService.pauseStrategy(this.strategy.id).subscribe({ next: response => { @@ -316,7 +336,9 @@ export class StrategyDetailsComponent implements OnChanges { * Stop the strategy */ stopStrategy(): void { - if (!this.strategy) return; + if (!this.strategy) { + return; + } this.strategyService.stopStrategy(this.strategy.id).subscribe({ next: response => { @@ -332,7 +354,9 @@ export class StrategyDetailsComponent implements OnChanges { // Methods to generate mock data private generateMockSignals(): any[] { - if (!this.strategy) return []; + if (!this.strategy) { + return []; + } const signals = []; const actions = ['BUY', 'SELL', 'HOLD']; @@ -358,7 +382,9 @@ export class StrategyDetailsComponent implements OnChanges { } private generateMockTrades(): any[] { - if (!this.strategy) return []; + if (!this.strategy) { + return []; + } const trades = []; const now = new Date(); diff --git a/apps/dashboard/src/app/services/websocket.service.ts b/apps/dashboard/src/app/services/websocket.service.ts index d32402d..00a0cc3 100644 --- a/apps/dashboard/src/app/services/websocket.service.ts +++ b/apps/dashboard/src/app/services/websocket.service.ts @@ -1,5 +1,5 @@ import { Injectable, signal } from '@angular/core'; -import { BehaviorSubject, Observable, Subject } from 'rxjs'; +import { Observable, Subject } from 'rxjs'; import { filter, map } from 'rxjs/operators'; export interface WebSocketMessage { @@ -204,7 +204,7 @@ export class WebSocketService { // Cleanup disconnect() { - this.connections.forEach((ws, serviceName) => { + this.connections.forEach((ws, _serviceName) => { if (ws.readyState === WebSocket.OPEN) { ws.close(); } diff --git a/apps/dashboard/tsconfig.app.json b/apps/dashboard/tsconfig.app.json index 254a59d..a0dcc37 100644 --- a/apps/dashboard/tsconfig.app.json +++ b/apps/dashboard/tsconfig.app.json @@ -1,15 +1,11 @@ -/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ -/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "outDir": "./out-tsc/app", - "types": [] - }, - "include": [ - "src/**/*.ts" - ], - "exclude": [ - "src/**/*.spec.ts" - ] -} +/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ +/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/app", + "types": [] + }, + "include": ["src/**/*.ts"], + "exclude": ["src/**/*.spec.ts"] +} diff --git a/apps/dashboard/tsconfig.json b/apps/dashboard/tsconfig.json index a8239ce..fc4b18f 100644 --- a/apps/dashboard/tsconfig.json +++ b/apps/dashboard/tsconfig.json @@ -1,32 +1,32 @@ -/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ -/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ -{ - "extends": "../../tsconfig.json", - "compileOnSave": false, - "compilerOptions": { - "noImplicitOverride": true, - "noPropertyAccessFromIndexSignature": true, - "noImplicitReturns": true, - "noFallthroughCasesInSwitch": true, - "isolatedModules": true, - "experimentalDecorators": true, - "importHelpers": true, - "module": "preserve" - }, - "angularCompilerOptions": { - "enableI18nLegacyMessageIdFormat": false, - "strictInjectionParameters": true, - "strictInputAccessModifiers": true, - "typeCheckHostBindings": true, - "strictTemplates": true - }, - "files": [], - "references": [ - { - "path": "./tsconfig.app.json" - }, - { - "path": "./tsconfig.spec.json" - } - ] -} +/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ +/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ +{ + "extends": "../../tsconfig.json", + "compileOnSave": false, + "compilerOptions": { + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "isolatedModules": true, + "experimentalDecorators": true, + "importHelpers": true, + "module": "preserve" + }, + "angularCompilerOptions": { + "enableI18nLegacyMessageIdFormat": false, + "strictInjectionParameters": true, + "strictInputAccessModifiers": true, + "typeCheckHostBindings": true, + "strictTemplates": true + }, + "files": [], + "references": [ + { + "path": "./tsconfig.app.json" + }, + { + "path": "./tsconfig.spec.json" + } + ] +} diff --git a/apps/dashboard/tsconfig.spec.json b/apps/dashboard/tsconfig.spec.json index f936da6..e977321 100644 --- a/apps/dashboard/tsconfig.spec.json +++ b/apps/dashboard/tsconfig.spec.json @@ -1,14 +1,10 @@ -/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ -/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "outDir": "./out-tsc/spec", - "types": [ - "jasmine" - ] - }, - "include": [ - "src/**/*.ts" - ] -} +/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ +/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/spec", + "types": ["jasmine"] + }, + "include": ["src/**/*.ts"] +} diff --git a/apps/data-service/src/providers/proxy.provider.ts b/apps/data-service/src/providers/proxy.provider.ts index 67bdaeb..168f697 100644 --- a/apps/data-service/src/providers/proxy.provider.ts +++ b/apps/data-service/src/providers/proxy.provider.ts @@ -16,7 +16,7 @@ const getEvery24HourCron = (): string => { export const proxyProvider: ProviderConfig = { name: 'proxy-provider', operations: { - 'fetch-and-check': async (payload: { sources?: string[] }) => { + 'fetch-and-check': async (_payload: { sources?: string[] }) => { const { proxyService } = await import('./proxy.tasks'); const { queueManager } = await import('../services/queue.service'); const { processItems } = await import('../utils/batch-helpers'); diff --git a/apps/data-service/src/providers/proxy.tasks.ts b/apps/data-service/src/providers/proxy.tasks.ts index bc3ecb7..eb39262 100644 --- a/apps/data-service/src/providers/proxy.tasks.ts +++ b/apps/data-service/src/providers/proxy.tasks.ts @@ -172,8 +172,8 @@ let proxyStats: ProxySource[] = PROXY_CONFIG.PROXY_SOURCES.map(source => ({ async function updateProxyStats(sourceId: string, success: boolean) { const source = proxyStats.find(s => s.id === sourceId); if (source !== undefined) { - if (typeof source.working !== 'number') source.working = 0; - if (typeof source.total !== 'number') source.total = 0; + if (typeof source.working !== 'number') {source.working = 0;} + if (typeof source.total !== 'number') {source.total = 0;} source.total += 1; if (success) { source.working += 1; @@ -400,7 +400,7 @@ export async function fetchProxiesFromSource(source: ProxySource): Promise { const allJobs: Array<{ provider: string; job: ScheduledJob }> = []; - for (const [key, config] of providers) { + for (const [, config] of providers) { if (config.scheduledJobs) { for (const job of config.scheduledJobs) { allJobs.push({ diff --git a/apps/data-service/tsconfig.json b/apps/data-service/tsconfig.json index 7cf025e..1a3f5ab 100644 --- a/apps/data-service/tsconfig.json +++ b/apps/data-service/tsconfig.json @@ -1,20 +1,28 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "./dist", - "rootDir": "./src" - }, - "include": ["src/**/*"], - "exclude": ["node_modules", "dist", "**/*.test.ts", "**/*.spec.ts", "**/test/**", "**/tests/**", "**/__tests__/**"], - "references": [ - { "path": "../../libs/types" }, - { "path": "../../libs/config" }, - { "path": "../../libs/logger" }, - { "path": "../../libs/http" }, - { "path": "../../libs/cache" }, - { "path": "../../libs/questdb-client" }, - { "path": "../../libs/mongodb-client" }, - { "path": "../../libs/event-bus" }, - { "path": "../../libs/shutdown" } - ] -} +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "./dist", + "rootDir": "./src" + }, + "include": ["src/**/*"], + "exclude": [ + "node_modules", + "dist", + "**/*.test.ts", + "**/*.spec.ts", + "**/test/**", + "**/tests/**", + "**/__tests__/**" + ], + "references": [ + { "path": "../../libs/types" }, + { "path": "../../libs/config" }, + { "path": "../../libs/logger" }, + { "path": "../../libs/http" }, + { "path": "../../libs/cache" }, + { "path": "../../libs/questdb-client" }, + { "path": "../../libs/mongodb-client" }, + { "path": "../../libs/event-bus" }, + { "path": "../../libs/shutdown" } + ] +} diff --git a/apps/execution-service/package.json b/apps/execution-service/package.json index 1a4e5f8..efdf413 100644 --- a/apps/execution-service/package.json +++ b/apps/execution-service/package.json @@ -1,37 +1,37 @@ -{ - "name": "@stock-bot/execution-service", - "version": "1.0.0", - "description": "Execution service for stock trading bot - handles order execution and broker integration", - "main": "dist/index.js", - "type": "module", - "scripts": { - "build": "tsc", - "devvvvv": "bun --watch src/index.ts", - "start": "bun src/index.ts", - "test": "bun test", - "lint": "eslint src --ext .ts", - "type-check": "tsc --noEmit" - }, - "dependencies": { - "@hono/node-server": "^1.12.0", - "hono": "^4.6.1", - "@stock-bot/config": "*", - "@stock-bot/logger": "*", - "@stock-bot/types": "*", - "@stock-bot/event-bus": "*", - "@stock-bot/utils": "*" - }, - "devDependencies": { - "@types/node": "^22.5.0", - "typescript": "^5.5.4" - }, - "keywords": [ - "trading", - "execution", - "broker", - "orders", - "stock-bot" - ], - "author": "Stock Bot Team", - "license": "MIT" -} +{ + "name": "@stock-bot/execution-service", + "version": "1.0.0", + "description": "Execution service for stock trading bot - handles order execution and broker integration", + "main": "dist/index.js", + "type": "module", + "scripts": { + "build": "tsc", + "devvvvv": "bun --watch src/index.ts", + "start": "bun src/index.ts", + "test": "bun test", + "lint": "eslint src --ext .ts", + "type-check": "tsc --noEmit" + }, + "dependencies": { + "@hono/node-server": "^1.12.0", + "hono": "^4.6.1", + "@stock-bot/config": "*", + "@stock-bot/logger": "*", + "@stock-bot/types": "*", + "@stock-bot/event-bus": "*", + "@stock-bot/utils": "*" + }, + "devDependencies": { + "@types/node": "^22.5.0", + "typescript": "^5.5.4" + }, + "keywords": [ + "trading", + "execution", + "broker", + "orders", + "stock-bot" + ], + "author": "Stock Bot Team", + "license": "MIT" +} diff --git a/apps/execution-service/tsconfig.json b/apps/execution-service/tsconfig.json index 5aafdff..b94f8f9 100644 --- a/apps/execution-service/tsconfig.json +++ b/apps/execution-service/tsconfig.json @@ -1,17 +1,25 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "./dist", - "rootDir": "./src" - }, - "include": ["src/**/*"], - "exclude": ["node_modules", "dist", "**/*.test.ts", "**/*.spec.ts", "**/test/**", "**/tests/**", "**/__tests__/**"], - "references": [ - { "path": "../../libs/types" }, - { "path": "../../libs/config" }, - { "path": "../../libs/logger" }, - { "path": "../../libs/utils" }, - { "path": "../../libs/event-bus" }, - { "path": "../../libs/shutdown" } - ] -} +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "./dist", + "rootDir": "./src" + }, + "include": ["src/**/*"], + "exclude": [ + "node_modules", + "dist", + "**/*.test.ts", + "**/*.spec.ts", + "**/test/**", + "**/tests/**", + "**/__tests__/**" + ], + "references": [ + { "path": "../../libs/types" }, + { "path": "../../libs/config" }, + { "path": "../../libs/logger" }, + { "path": "../../libs/utils" }, + { "path": "../../libs/event-bus" }, + { "path": "../../libs/shutdown" } + ] +} diff --git a/apps/portfolio-service/package.json b/apps/portfolio-service/package.json index de01cbd..6e838da 100644 --- a/apps/portfolio-service/package.json +++ b/apps/portfolio-service/package.json @@ -1,38 +1,38 @@ -{ - "name": "@stock-bot/portfolio-service", - "version": "1.0.0", - "description": "Portfolio service for stock trading bot - handles portfolio tracking and performance analytics", - "main": "dist/index.js", - "type": "module", - "scripts": { - "build": "tsc", - "devvvvv": "bun --watch src/index.ts", - "start": "bun src/index.ts", - "test": "bun test", - "lint": "eslint src --ext .ts", - "type-check": "tsc --noEmit" - }, - "dependencies": { - "@hono/node-server": "^1.12.0", - "hono": "^4.6.1", - "@stock-bot/config": "*", - "@stock-bot/logger": "*", - "@stock-bot/types": "*", - "@stock-bot/questdb-client": "*", - "@stock-bot/utils": "*", - "@stock-bot/data-frame": "*" - }, - "devDependencies": { - "@types/node": "^22.5.0", - "typescript": "^5.5.4" - }, - "keywords": [ - "trading", - "portfolio", - "performance", - "analytics", - "stock-bot" - ], - "author": "Stock Bot Team", - "license": "MIT" -} +{ + "name": "@stock-bot/portfolio-service", + "version": "1.0.0", + "description": "Portfolio service for stock trading bot - handles portfolio tracking and performance analytics", + "main": "dist/index.js", + "type": "module", + "scripts": { + "build": "tsc", + "devvvvv": "bun --watch src/index.ts", + "start": "bun src/index.ts", + "test": "bun test", + "lint": "eslint src --ext .ts", + "type-check": "tsc --noEmit" + }, + "dependencies": { + "@hono/node-server": "^1.12.0", + "hono": "^4.6.1", + "@stock-bot/config": "*", + "@stock-bot/logger": "*", + "@stock-bot/types": "*", + "@stock-bot/questdb-client": "*", + "@stock-bot/utils": "*", + "@stock-bot/data-frame": "*" + }, + "devDependencies": { + "@types/node": "^22.5.0", + "typescript": "^5.5.4" + }, + "keywords": [ + "trading", + "portfolio", + "performance", + "analytics", + "stock-bot" + ], + "author": "Stock Bot Team", + "license": "MIT" +} diff --git a/apps/portfolio-service/src/analytics/performance-analyzer.ts b/apps/portfolio-service/src/analytics/performance-analyzer.ts index 6a9af0a..6710b3f 100644 --- a/apps/portfolio-service/src/analytics/performance-analyzer.ts +++ b/apps/portfolio-service/src/analytics/performance-analyzer.ts @@ -1,4 +1,4 @@ -import { PortfolioSnapshot, Trade } from '../portfolio/portfolio-manager.ts'; +import { PortfolioSnapshot } from '../portfolio/portfolio-manager'; export interface PerformanceMetrics { totalReturn: number; @@ -67,8 +67,8 @@ export class PerformanceAnalyzer { }; } - private calculateReturns(period: 'daily' | 'weekly' | 'monthly'): number[] { - if (this.snapshots.length < 2) return []; + private calculateReturns(_period: 'daily' | 'weekly' | 'monthly'): number[] { + if (this.snapshots.length < 2) {return [];} const returns: number[] = []; @@ -83,7 +83,7 @@ export class PerformanceAnalyzer { } private calculateTotalReturn(): number { - if (this.snapshots.length < 2) return 0; + if (this.snapshots.length < 2) {return 0;} const firstValue = this.snapshots[0].totalValue; const lastValue = this.snapshots[this.snapshots.length - 1].totalValue; @@ -92,14 +92,14 @@ export class PerformanceAnalyzer { } private calculateAnnualizedReturn(returns: number[]): number { - if (returns.length === 0) return 0; + if (returns.length === 0) {return 0;} const avgReturn = returns.reduce((sum, ret) => sum + ret, 0) / returns.length; return Math.pow(1 + avgReturn, 252) - 1; // 252 trading days per year } private calculateVolatility(returns: number[]): number { - if (returns.length === 0) return 0; + if (returns.length === 0) {return 0;} const avgReturn = returns.reduce((sum, ret) => sum + ret, 0) / returns.length; const variance = @@ -109,19 +109,19 @@ export class PerformanceAnalyzer { } private calculateSharpeRatio(returns: number[], riskFreeRate: number): number { - if (returns.length === 0) return 0; + if (returns.length === 0) {return 0;} const avgReturn = returns.reduce((sum, ret) => sum + ret, 0) / returns.length; const annualizedReturn = Math.pow(1 + avgReturn, 252) - 1; const volatility = this.calculateVolatility(returns); - if (volatility === 0) return 0; + if (volatility === 0) {return 0;} return (annualizedReturn - riskFreeRate) / volatility; } private calculateMaxDrawdown(): number { - if (this.snapshots.length === 0) return 0; + if (this.snapshots.length === 0) {return 0;} let maxDrawdown = 0; let peak = this.snapshots[0].totalValue; @@ -139,7 +139,7 @@ export class PerformanceAnalyzer { } private calculateBeta(returns: number[]): number { - if (returns.length === 0 || this.benchmarkReturns.length === 0) return 1.0; + if (returns.length === 0 || this.benchmarkReturns.length === 0) {return 1.0;} // Simple beta calculation - would need actual benchmark data return 1.0; // Placeholder @@ -157,7 +157,7 @@ export class PerformanceAnalyzer { const annualizedReturn = this.calculateAnnualizedReturn(returns); const maxDrawdown = this.calculateMaxDrawdown(); - if (maxDrawdown === 0) return 0; + if (maxDrawdown === 0) {return 0;} return annualizedReturn / maxDrawdown; } @@ -166,16 +166,16 @@ export class PerformanceAnalyzer { const annualizedReturn = this.calculateAnnualizedReturn(returns); const downsideDeviation = this.calculateDownsideDeviation(returns); - if (downsideDeviation === 0) return 0; + if (downsideDeviation === 0) {return 0;} return (annualizedReturn - riskFreeRate) / downsideDeviation; } private calculateDownsideDeviation(returns: number[]): number { - if (returns.length === 0) return 0; + if (returns.length === 0) {return 0;} const negativeReturns = returns.filter(ret => ret < 0); - if (negativeReturns.length === 0) return 0; + if (negativeReturns.length === 0) {return 0;} const avgNegativeReturn = negativeReturns.reduce((sum, ret) => sum + ret, 0) / negativeReturns.length; @@ -187,7 +187,7 @@ export class PerformanceAnalyzer { } private calculateVaR(returns: number[], confidence: number): number { - if (returns.length === 0) return 0; + if (returns.length === 0) {return 0;} const sortedReturns = returns.slice().sort((a, b) => a - b); const index = Math.floor((1 - confidence) * sortedReturns.length); @@ -196,13 +196,13 @@ export class PerformanceAnalyzer { } private calculateCVaR(returns: number[], confidence: number): number { - if (returns.length === 0) return 0; + if (returns.length === 0) {return 0;} const sortedReturns = returns.slice().sort((a, b) => a - b); const cutoffIndex = Math.floor((1 - confidence) * sortedReturns.length); const tailReturns = sortedReturns.slice(0, cutoffIndex + 1); - if (tailReturns.length === 0) return 0; + if (tailReturns.length === 0) {return 0;} const avgTailReturn = tailReturns.reduce((sum, ret) => sum + ret, 0) / tailReturns.length; return -avgTailReturn; // Return as positive value diff --git a/apps/portfolio-service/src/index.ts b/apps/portfolio-service/src/index.ts index 53857a2..f5485e5 100644 --- a/apps/portfolio-service/src/index.ts +++ b/apps/portfolio-service/src/index.ts @@ -2,8 +2,6 @@ import { serve } from '@hono/node-server'; import { Hono } from 'hono'; import { config } from '@stock-bot/config'; import { getLogger } from '@stock-bot/logger'; -import { PerformanceAnalyzer } from './analytics/performance-analyzer.ts'; -import { PortfolioManager } from './portfolio/portfolio-manager.ts'; const app = new Hono(); const logger = getLogger('portfolio-service'); diff --git a/apps/portfolio-service/tsconfig.json b/apps/portfolio-service/tsconfig.json index e88254b..712651c 100644 --- a/apps/portfolio-service/tsconfig.json +++ b/apps/portfolio-service/tsconfig.json @@ -1,18 +1,26 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "./dist", - "rootDir": "./src" - }, - "include": ["src/**/*"], - "exclude": ["node_modules", "dist", "**/*.test.ts", "**/*.spec.ts", "**/test/**", "**/tests/**", "**/__tests__/**"], - "references": [ - { "path": "../../libs/types" }, - { "path": "../../libs/config" }, - { "path": "../../libs/logger" }, - { "path": "../../libs/utils" }, - { "path": "../../libs/postgres-client" }, - { "path": "../../libs/event-bus" }, - { "path": "../../libs/shutdown" } - ] -} +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "./dist", + "rootDir": "./src" + }, + "include": ["src/**/*"], + "exclude": [ + "node_modules", + "dist", + "**/*.test.ts", + "**/*.spec.ts", + "**/test/**", + "**/tests/**", + "**/__tests__/**" + ], + "references": [ + { "path": "../../libs/types" }, + { "path": "../../libs/config" }, + { "path": "../../libs/logger" }, + { "path": "../../libs/utils" }, + { "path": "../../libs/postgres-client" }, + { "path": "../../libs/event-bus" }, + { "path": "../../libs/shutdown" } + ] +} diff --git a/apps/processing-service/package.json b/apps/processing-service/package.json index 66196a8..1bfe342 100644 --- a/apps/processing-service/package.json +++ b/apps/processing-service/package.json @@ -1,26 +1,26 @@ -{ - "name": "@stock-bot/processing-service", - "version": "1.0.0", - "description": "Combined data processing and technical indicators service", - "main": "dist/index.js", - "type": "module", - "scripts": { - "devvvvv": "bun --watch src/index.ts", - "build": "bun build src/index.ts --outdir dist --target node", - "start": "bun dist/index.js", - "test": "bun test", - "clean": "rm -rf dist" - }, - "dependencies": { - "@stock-bot/config": "*", - "@stock-bot/logger": "*", - "@stock-bot/types": "*", - "@stock-bot/utils": "*", - "@stock-bot/event-bus": "*", - "@stock-bot/vector-engine": "*", - "hono": "^4.0.0" - }, - "devDependencies": { - "typescript": "^5.0.0" - } -} +{ + "name": "@stock-bot/processing-service", + "version": "1.0.0", + "description": "Combined data processing and technical indicators service", + "main": "dist/index.js", + "type": "module", + "scripts": { + "devvvvv": "bun --watch src/index.ts", + "build": "bun build src/index.ts --outdir dist --target node", + "start": "bun dist/index.js", + "test": "bun test", + "clean": "rm -rf dist" + }, + "dependencies": { + "@stock-bot/config": "*", + "@stock-bot/logger": "*", + "@stock-bot/types": "*", + "@stock-bot/utils": "*", + "@stock-bot/event-bus": "*", + "@stock-bot/vector-engine": "*", + "hono": "^4.0.0" + }, + "devDependencies": { + "typescript": "^5.0.0" + } +} diff --git a/apps/processing-service/src/indicators/indicators.ts b/apps/processing-service/src/indicators/indicators.ts index 86d23bb..60b05c1 100644 --- a/apps/processing-service/src/indicators/indicators.ts +++ b/apps/processing-service/src/indicators/indicators.ts @@ -33,27 +33,31 @@ export class IndicatorsService { for (const indicator of request.indicators) { try { switch (indicator.toLowerCase()) { - case 'sma': + case 'sma': { const smaPeriod = request.parameters?.smaPeriod || 20; results.sma = sma(request.data, smaPeriod); break; + } - case 'ema': + case 'ema': { const emaPeriod = request.parameters?.emaPeriod || 20; results.ema = ema(request.data, emaPeriod); break; + } - case 'rsi': + case 'rsi': { const rsiPeriod = request.parameters?.rsiPeriod || 14; results.rsi = rsi(request.data, rsiPeriod); break; + } - case 'macd': + case 'macd': { const fast = request.parameters?.macdFast || 12; const slow = request.parameters?.macdSlow || 26; const signal = request.parameters?.macdSignal || 9; results.macd = macd(request.data, fast, slow, signal).macd; break; + } case 'stochastic': // TODO: Implement stochastic oscillator diff --git a/apps/processing-service/tsconfig.json b/apps/processing-service/tsconfig.json index 0b48f03..028d54a 100644 --- a/apps/processing-service/tsconfig.json +++ b/apps/processing-service/tsconfig.json @@ -1,20 +1,28 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "./dist", - "rootDir": "./src" - }, - "include": ["src/**/*"], - "exclude": ["node_modules", "dist", "**/*.test.ts", "**/*.spec.ts", "**/test/**", "**/tests/**", "**/__tests__/**"], - "references": [ - { "path": "../../libs/types" }, - { "path": "../../libs/config" }, - { "path": "../../libs/logger" }, - { "path": "../../libs/utils" }, - { "path": "../../libs/data-frame" }, - { "path": "../../libs/vector-engine" }, - { "path": "../../libs/mongodb-client" }, - { "path": "../../libs/event-bus" }, - { "path": "../../libs/shutdown" } - ] -} +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "./dist", + "rootDir": "./src" + }, + "include": ["src/**/*"], + "exclude": [ + "node_modules", + "dist", + "**/*.test.ts", + "**/*.spec.ts", + "**/test/**", + "**/tests/**", + "**/__tests__/**" + ], + "references": [ + { "path": "../../libs/types" }, + { "path": "../../libs/config" }, + { "path": "../../libs/logger" }, + { "path": "../../libs/utils" }, + { "path": "../../libs/data-frame" }, + { "path": "../../libs/vector-engine" }, + { "path": "../../libs/mongodb-client" }, + { "path": "../../libs/event-bus" }, + { "path": "../../libs/shutdown" } + ] +} diff --git a/apps/strategy-service/package.json b/apps/strategy-service/package.json index 2695f62..5e76503 100644 --- a/apps/strategy-service/package.json +++ b/apps/strategy-service/package.json @@ -1,33 +1,34 @@ -{ - "name": "@stock-bot/strategy-service", - "version": "1.0.0", - "description": "Combined strategy execution and multi-mode backtesting service", - "main": "dist/index.js", - "type": "module", - "scripts": { - "devvvvv": "bun --watch src/index.ts", - "build": "bun build src/index.ts --outdir dist --target node", - "start": "bun dist/index.js", - "test": "bun test", "clean": "rm -rf dist", - "backtest": "bun src/cli/index.ts", - "optimize": "bun src/cli/index.ts optimize", - "cli": "bun src/cli/index.ts" - }, - "dependencies": { - "@stock-bot/config": "*", - "@stock-bot/logger": "*", - "@stock-bot/types": "*", - "@stock-bot/utils": "*", - "@stock-bot/event-bus": "*", - "@stock-bot/strategy-engine": "*", - "@stock-bot/vector-engine": "*", - "@stock-bot/data-frame": "*", - "@stock-bot/questdb-client": "*", - "hono": "^4.0.0", - "commander": "^11.0.0" - }, - "devDependencies": { - "@types/node": "^20.0.0", - "typescript": "^5.0.0" - } -} +{ + "name": "@stock-bot/strategy-service", + "version": "1.0.0", + "description": "Combined strategy execution and multi-mode backtesting service", + "main": "dist/index.js", + "type": "module", + "scripts": { + "devvvvv": "bun --watch src/index.ts", + "build": "bun build src/index.ts --outdir dist --target node", + "start": "bun dist/index.js", + "test": "bun test", + "clean": "rm -rf dist", + "backtest": "bun src/cli/index.ts", + "optimize": "bun src/cli/index.ts optimize", + "cli": "bun src/cli/index.ts" + }, + "dependencies": { + "@stock-bot/config": "*", + "@stock-bot/logger": "*", + "@stock-bot/types": "*", + "@stock-bot/utils": "*", + "@stock-bot/event-bus": "*", + "@stock-bot/strategy-engine": "*", + "@stock-bot/vector-engine": "*", + "@stock-bot/data-frame": "*", + "@stock-bot/questdb-client": "*", + "hono": "^4.0.0", + "commander": "^11.0.0" + }, + "devDependencies": { + "@types/node": "^20.0.0", + "typescript": "^5.0.0" + } +} diff --git a/apps/strategy-service/src/backtesting/modes/hybrid-mode.ts b/apps/strategy-service/src/backtesting/modes/hybrid-mode.ts index 50cb95f..2f4f4fc 100644 --- a/apps/strategy-service/src/backtesting/modes/hybrid-mode.ts +++ b/apps/strategy-service/src/backtesting/modes/hybrid-mode.ts @@ -1,4 +1,3 @@ -import { create } from 'domain'; import { DataFrame } from '@stock-bot/data-frame'; import { EventBus } from '@stock-bot/event-bus'; import { getLogger } from '@stock-bot/logger'; @@ -198,7 +197,7 @@ export class HybridMode extends ExecutionMode { private overrideIndicatorCalculations(eventMode: EventMode): void { // Override the event mode's indicator calculations to use pre-computed values // This is a simplified approach - in production you'd want a more sophisticated interface - const originalCalculateIndicators = (eventMode as any).calculateIndicators; + const _originalCalculateIndicators = (eventMode as any).calculateIndicators; (eventMode as any).calculateIndicators = (symbol: string, index: number) => { const indicators: Record = {}; diff --git a/apps/strategy-service/src/backtesting/modes/live-mode.ts b/apps/strategy-service/src/backtesting/modes/live-mode.ts index ae395cb..9beee49 100644 --- a/apps/strategy-service/src/backtesting/modes/live-mode.ts +++ b/apps/strategy-service/src/backtesting/modes/live-mode.ts @@ -19,7 +19,7 @@ export class LiveMode extends ExecutionMode { return new Date(); // Real time } - async getMarketData(symbol: string): Promise { + async getMarketData(_symbol: string): Promise { // TODO: Get live market data throw new Error('Live market data fetching not implemented yet'); } diff --git a/apps/strategy-service/src/cli/index.ts b/apps/strategy-service/src/cli/index.ts index a12d85f..f9b8b0f 100644 --- a/apps/strategy-service/src/cli/index.ts +++ b/apps/strategy-service/src/cli/index.ts @@ -82,7 +82,7 @@ async function runBacktest(options: CLIBacktestConfig): Promise { // Subscribe to progress updates eventBus.subscribe('backtest.update', message => { - const { backtestId, progress, ...data } = message.data; + const { backtestId: _backtestId, progress, ...data } = message.data; console.log(`Progress: ${progress}%`, data); }); @@ -172,7 +172,7 @@ async function saveResults(result: any, outputPath: string): Promise { } function convertTradesToCSV(trades: any[]): string { - if (trades.length === 0) return 'No trades executed\n'; + if (trades.length === 0) {return 'No trades executed\n';} const headers = Object.keys(trades[0]).join(','); const rows = trades.map(trade => @@ -259,7 +259,7 @@ program const strategies = options.strategies.split(',').map((s: string) => s.trim()); console.log(`Comparing strategies: ${strategies.join(', ')}`); - const results: any[] = []; + const _results: any[] = []; for (const strategy of strategies) { console.log(`\nRunning ${strategy}...`); diff --git a/apps/strategy-service/src/framework/execution-mode.ts b/apps/strategy-service/src/framework/execution-mode.ts index 6608596..290c6bb 100644 --- a/apps/strategy-service/src/framework/execution-mode.ts +++ b/apps/strategy-service/src/framework/execution-mode.ts @@ -4,7 +4,7 @@ */ import { getLogger } from '@stock-bot/logger'; -const logger = getLogger('execution-mode'); +const _logger = getLogger('execution-mode'); export interface Order { id: string; @@ -55,7 +55,7 @@ export enum BacktestMode { } export class ModeFactory { - static create(mode: BacktestMode, config?: any): ExecutionMode { + static create(mode: BacktestMode, _config?: any): ExecutionMode { switch (mode) { case BacktestMode.LIVE: // TODO: Import and create LiveMode diff --git a/apps/strategy-service/tsconfig.json b/apps/strategy-service/tsconfig.json index c491766..6c8062d 100644 --- a/apps/strategy-service/tsconfig.json +++ b/apps/strategy-service/tsconfig.json @@ -1,18 +1,26 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "./dist", - "rootDir": "./src" - }, - "include": ["src/**/*"], - "exclude": ["node_modules", "dist", "**/*.test.ts", "**/*.spec.ts", "**/test/**", "**/tests/**", "**/__tests__/**"], - "references": [ - { "path": "../../libs/types" }, - { "path": "../../libs/config" }, - { "path": "../../libs/logger" }, - { "path": "../../libs/utils" }, - { "path": "../../libs/strategy-engine" }, - { "path": "../../libs/event-bus" }, - { "path": "../../libs/shutdown" } - ] -} +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "./dist", + "rootDir": "./src" + }, + "include": ["src/**/*"], + "exclude": [ + "node_modules", + "dist", + "**/*.test.ts", + "**/*.spec.ts", + "**/test/**", + "**/tests/**", + "**/__tests__/**" + ], + "references": [ + { "path": "../../libs/types" }, + { "path": "../../libs/config" }, + { "path": "../../libs/logger" }, + { "path": "../../libs/utils" }, + { "path": "../../libs/strategy-engine" }, + { "path": "../../libs/event-bus" }, + { "path": "../../libs/shutdown" } + ] +} diff --git a/bun.lock b/bun.lock index 699fa07..a6ca4e3 100644 --- a/bun.lock +++ b/bun.lock @@ -8,6 +8,7 @@ "ioredis": "^5.6.1", }, "devDependencies": { + "@eslint/js": "^9.28.0", "@ianvs/prettier-plugin-sort-imports": "^4.4.2", "@testcontainers/mongodb": "^10.7.2", "@testcontainers/postgresql": "^10.7.2", @@ -15,7 +16,13 @@ "@types/node": "^22.15.30", "@types/supertest": "^6.0.2", "@types/yup": "^0.32.0", + "@typescript-eslint/eslint-plugin": "^8.34.0", + "@typescript-eslint/parser": "^8.34.0", "bun-types": "^1.2.15", + "eslint": "^9.28.0", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-promise": "^7.2.1", "mongodb-memory-server": "^9.1.6", "pg-mem": "^2.8.1", "prettier": "^3.5.3", @@ -517,9 +524,19 @@ "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.1", "", {}, "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ=="], - "@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=="], + "@eslint/config-array": ["@eslint/config-array@0.20.0", "", { "dependencies": { "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ=="], - "@eslint/js": ["@eslint/js@8.57.1", "", {}, "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q=="], + "@eslint/config-helpers": ["@eslint/config-helpers@0.2.2", "", {}, "sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg=="], + + "@eslint/core": ["@eslint/core@0.14.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg=="], + + "@eslint/eslintrc": ["@eslint/eslintrc@3.3.1", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.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-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ=="], + + "@eslint/js": ["@eslint/js@9.28.0", "", {}, "sha512-fnqSjGWd/CoIp4EXIxWVK/sHA6DOHN4+8Ix2cX5ycOY7LG0UY8nHCU5pIp2eaE1Mc7Qd8kHspYNzYXT2ojPLzg=="], + + "@eslint/object-schema": ["@eslint/object-schema@2.1.6", "", {}, "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA=="], + + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.3.1", "", { "dependencies": { "@eslint/core": "^0.14.0", "levn": "^0.4.1" } }, "sha512-0J+zgWxHN+xXONWIyPWKFMgVuJoZuGiIFu8yxk7RJjxkzpGmyja5wRFqZIVtjDVOQpV+Rw0iOAjYPE2eQyjr0w=="], "@fastify/busboy": ["@fastify/busboy@2.1.1", "", {}, "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA=="], @@ -529,12 +546,18 @@ "@hono/node-server": ["@hono/node-server@1.14.4", "", { "peerDependencies": { "hono": "^4" } }, "sha512-DnxpshhYewr2q9ZN8ez/M5mmc3sucr8CT1sIgIy1bkeUXut9XWDkqHoFHRhWIQgkYnKpVRxunyhK7WzpJeJ6qQ=="], + "@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="], + + "@humanfs/node": ["@humanfs/node@0.16.6", "", { "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.3.0" } }, "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw=="], + "@humanwhocodes/config-array": ["@humanwhocodes/config-array@0.13.0", "", { "dependencies": { "@humanwhocodes/object-schema": "^2.0.3", "debug": "^4.3.1", "minimatch": "^3.0.5" } }, "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw=="], "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="], "@humanwhocodes/object-schema": ["@humanwhocodes/object-schema@2.0.3", "", {}, "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA=="], + "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="], + "@ianvs/prettier-plugin-sort-imports": ["@ianvs/prettier-plugin-sort-imports@4.4.2", "", { "dependencies": { "@babel/generator": "^7.26.2", "@babel/parser": "^7.26.2", "@babel/traverse": "^7.25.9", "@babel/types": "^7.26.0", "semver": "^7.5.2" }, "peerDependencies": { "@vue/compiler-sfc": "2.7.x || 3.x", "prettier": "2 || 3 || ^4.0.0-0" }, "optionalPeers": ["@vue/compiler-sfc"] }, "sha512-KkVFy3TLh0OFzimbZglMmORi+vL/i2OFhEs5M07R9w0IwWAGpsNNyE4CY/2u0YoMF5bawKC2+8/fUH60nnNtjw=="], "@inquirer/checkbox": ["@inquirer/checkbox@4.1.8", "", { "dependencies": { "@inquirer/core": "^10.1.13", "@inquirer/figures": "^1.0.12", "@inquirer/type": "^3.0.7", "ansi-escapes": "^4.3.2", "yoctocolors-cjs": "^2.1.2" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-d/QAsnwuHX2OPolxvYcgSj7A9DO9H6gVOy2DvBTx+P2LH2iRTo/RSGV3iwCzW024nP9hw98KIuDmdyhZQj1UQg=="], @@ -767,6 +790,8 @@ "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.40.2", "", { "os": "win32", "cpu": "x64" }, "sha512-bwspbWB04XJpeElvsp+DCylKfF4trJDa2Y9Go8O6A7YLX2LIKGcNK/CYImJN6ZP4DcuOHB4Utl3iCbnR62DudA=="], + "@rtsao/scc": ["@rtsao/scc@1.1.0", "", {}, "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g=="], + "@schematics/angular": ["@schematics/angular@20.0.1", "", { "dependencies": { "@angular-devkit/core": "20.0.1", "@angular-devkit/schematics": "20.0.1", "jsonc-parser": "3.3.1" } }, "sha512-29T9vUAjZnbXM+vImIQcdqG/ibdcfj5+pybo5cbiMSwVPVyerXgnD0HKC4dyZ34V2RFZa8cmyCLe/5bYoPQ+0g=="], "@sec-ant/readable-stream": ["@sec-ant/readable-stream@0.4.1", "", {}, "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg=="], @@ -885,6 +910,8 @@ "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], + "@types/json5": ["@types/json5@0.0.29", "", {}, "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ=="], + "@types/methods": ["@types/methods@1.1.4", "", {}, "sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ=="], "@types/mongodb": ["@types/mongodb@4.0.7", "", { "dependencies": { "mongodb": "*" } }, "sha512-lPUYPpzA43baXqnd36cZ9xxorprybxXDzteVKCPAdp14ppHtFJHnXYvNpmBvtMUTb5fKXVv6sVbzo1LHkWhJlw=="], @@ -911,21 +938,25 @@ "@types/yup": ["@types/yup@0.32.0", "", { "dependencies": { "yup": "*" } }, "sha512-Gr2lllWTDxGVYHgWfL8szjdedERpNgm44L9BDL2cmcHG7Bfd6taEpiW3ayMFLaYvlJr/6bFXDJdh6L406AGlFg=="], - "@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=="], + "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.34.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.34.0", "@typescript-eslint/type-utils": "8.34.0", "@typescript-eslint/utils": "8.34.0", "@typescript-eslint/visitor-keys": "8.34.0", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.34.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-QXwAlHlbcAwNlEEMKQS2RCgJsgXrTJdjXT08xEgbPFa2yYQgVjBymxP5DrfrE7X7iodSzd9qBUHUycdyVJTW1w=="], - "@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=="], + "@typescript-eslint/parser": ["@typescript-eslint/parser@8.34.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.34.0", "@typescript-eslint/types": "8.34.0", "@typescript-eslint/typescript-estree": "8.34.0", "@typescript-eslint/visitor-keys": "8.34.0", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-vxXJV1hVFx3IXz/oy2sICsJukaBrtDEQSBiV48/YIV5KWjX1dO+bcIr/kCPrW6weKXvsaGKFNlwH0v2eYdRRbA=="], - "@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=="], + "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.34.0", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.34.0", "@typescript-eslint/types": "^8.34.0", "debug": "^4.3.4" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-iEgDALRf970/B2YExmtPMPF54NenZUf4xpL3wsCRx/lgjz6ul/l13R81ozP/ZNuXfnLCS+oPmG7JIxfdNYKELw=="], - "@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=="], + "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.34.0", "", { "dependencies": { "@typescript-eslint/types": "8.34.0", "@typescript-eslint/visitor-keys": "8.34.0" } }, "sha512-9Ac0X8WiLykl0aj1oYQNcLZjHgBojT6cW68yAgZ19letYu+Hxd0rE0veI1XznSSst1X5lwnxhPbVdwjDRIomRw=="], - "@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="], + "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.34.0", "", { "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-+W9VYHKFIzA5cBeooqQxqNriAP0QeQ7xTiDuIOr71hzgffm3EL2hxwWBIIj4GuofIbKxGNarpKqIq6Q6YrShOA=="], - "@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=="], + "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.34.0", "", { "dependencies": { "@typescript-eslint/typescript-estree": "8.34.0", "@typescript-eslint/utils": "8.34.0", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-n7zSmOcUVhcRYC75W2pnPpbO1iwhJY3NLoHEtbJwJSNlVAZuwqu05zY3f3s2SDWWDSo9FdN5szqc73DCtDObAg=="], - "@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=="], + "@typescript-eslint/types": ["@typescript-eslint/types@8.34.0", "", {}, "sha512-9V24k/paICYPniajHfJ4cuAWETnt7Ssy+R0Rbcqo5sSFr3QEZ/8TSoUi9XeXVBGXCaLtwTOKSLGcInCAvyZeMA=="], - "@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=="], + "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.34.0", "", { "dependencies": { "@typescript-eslint/project-service": "8.34.0", "@typescript-eslint/tsconfig-utils": "8.34.0", "@typescript-eslint/types": "8.34.0", "@typescript-eslint/visitor-keys": "8.34.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-rOi4KZxI7E0+BMqG7emPSK1bB4RICCpF7QD3KCLXn9ZvWoESsOMlHyZPAHyG04ujVplPaHbmEvs34m+wjgtVtg=="], + + "@typescript-eslint/utils": ["@typescript-eslint/utils@8.34.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.34.0", "@typescript-eslint/types": "8.34.0", "@typescript-eslint/typescript-estree": "8.34.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-8L4tWatGchV9A1cKbjaavS6mwYwp39jql8xUmIIKJdm+qiaeHy5KMKlBrf30akXAWBzn2SqKsNOtSENWUwg7XQ=="], + + "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.34.0", "", { "dependencies": { "@typescript-eslint/types": "8.34.0", "eslint-visitor-keys": "^4.2.0" } }, "sha512-qHV7pW7E85A0x6qyrFn+O+q1k1p3tQCsqIZ1KZ5ESLXY57aTvUd3/a4rdPTeXisvhXn2VQG0VSKUqs8KHF2zcA=="], "@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="], @@ -963,14 +994,28 @@ "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + "array-buffer-byte-length": ["array-buffer-byte-length@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "is-array-buffer": "^3.0.5" } }, "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw=="], + + "array-includes": ["array-includes@3.1.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-abstract": "^1.24.0", "es-object-atoms": "^1.1.1", "get-intrinsic": "^1.3.0", "is-string": "^1.1.1", "math-intrinsics": "^1.1.0" } }, "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ=="], + "array-union": ["array-union@2.1.0", "", {}, "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="], + "array.prototype.findlastindex": ["array.prototype.findlastindex@1.2.6", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-abstract": "^1.23.9", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "es-shim-unscopables": "^1.1.0" } }, "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ=="], + + "array.prototype.flat": ["array.prototype.flat@1.3.3", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-shim-unscopables": "^1.0.2" } }, "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg=="], + + "array.prototype.flatmap": ["array.prototype.flatmap@1.3.3", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-shim-unscopables": "^1.0.2" } }, "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg=="], + + "arraybuffer.prototype.slice": ["arraybuffer.prototype.slice@1.0.4", "", { "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "is-array-buffer": "^3.0.4" } }, "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ=="], + "asap": ["asap@2.0.6", "", {}, "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA=="], "asn1": ["asn1@0.2.6", "", { "dependencies": { "safer-buffer": "~2.1.0" } }, "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ=="], "async": ["async@3.2.6", "", {}, "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA=="], + "async-function": ["async-function@1.0.0", "", {}, "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA=="], + "async-lock": ["async-lock@1.4.1", "", {}, "sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ=="], "async-mutex": ["async-mutex@0.4.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-WfoBo4E/TbCX1G95XTjbWTE3X2XLG0m1Xbv2cwOtuPdyH9CZvnaA5nCt1ucjaKEgW2A5IF71hxrRhr83Je5xjA=="], @@ -981,6 +1026,8 @@ "autoprefixer": ["autoprefixer@10.4.21", "", { "dependencies": { "browserslist": "^4.24.4", "caniuse-lite": "^1.0.30001702", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.1.0" }, "bin": { "autoprefixer": "bin/autoprefixer" } }, "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ=="], + "available-typed-arrays": ["available-typed-arrays@1.0.7", "", { "dependencies": { "possible-typed-array-names": "^1.0.0" } }, "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ=="], + "axios": ["axios@1.9.0", "", { "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } }, "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg=="], "b4a": ["b4a@1.6.7", "", {}, "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg=="], @@ -1123,6 +1170,12 @@ "custom-event": ["custom-event@1.0.1", "", {}, "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg=="], + "data-view-buffer": ["data-view-buffer@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" } }, "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ=="], + + "data-view-byte-length": ["data-view-byte-length@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" } }, "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ=="], + + "data-view-byte-offset": ["data-view-byte-offset@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-data-view": "^1.0.1" } }, "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ=="], + "date-fns": ["date-fns@2.30.0", "", { "dependencies": { "@babel/runtime": "^7.21.0" } }, "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw=="], "date-format": ["date-format@4.0.14", "", {}, "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg=="], @@ -1139,6 +1192,8 @@ "define-data-property": ["define-data-property@1.1.4", "", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" } }, "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A=="], + "define-properties": ["define-properties@1.2.1", "", { "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } }, "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg=="], + "delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="], "denque": ["denque@2.1.0", "", {}, "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw=="], @@ -1163,7 +1218,7 @@ "dockerode": ["dockerode@4.0.7", "", { "dependencies": { "@balena/dockerignore": "^1.0.2", "@grpc/grpc-js": "^1.11.1", "@grpc/proto-loader": "^0.7.13", "docker-modem": "^5.0.6", "protobufjs": "^7.3.2", "tar-fs": "~2.1.2", "uuid": "^10.0.0" } }, "sha512-R+rgrSRTRdU5mH14PZTCPZtW/zw3HDWNTS/1ZAQpL/5Upe/ye5K9WQkIysu4wBoiMwKynsz0a8qWuGsHgEvSAA=="], - "doctrine": ["doctrine@3.0.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w=="], + "doctrine": ["doctrine@2.1.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw=="], "dom-serialize": ["dom-serialize@2.2.1", "", { "dependencies": { "custom-event": "~1.0.0", "ent": "~2.2.0", "extend": "^3.0.0", "void-elements": "^2.0.0" } }, "sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ=="], @@ -1209,6 +1264,8 @@ "err-code": ["err-code@2.0.3", "", {}, "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA=="], + "es-abstract": ["es-abstract@1.24.0", "", { "dependencies": { "array-buffer-byte-length": "^1.0.2", "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "data-view-buffer": "^1.0.2", "data-view-byte-length": "^1.0.2", "data-view-byte-offset": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "es-set-tostringtag": "^2.1.0", "es-to-primitive": "^1.3.0", "function.prototype.name": "^1.1.8", "get-intrinsic": "^1.3.0", "get-proto": "^1.0.1", "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "internal-slot": "^1.1.0", "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", "is-data-view": "^1.0.2", "is-negative-zero": "^2.0.3", "is-regex": "^1.2.1", "is-set": "^2.0.3", "is-shared-array-buffer": "^1.0.4", "is-string": "^1.1.1", "is-typed-array": "^1.1.15", "is-weakref": "^1.1.1", "math-intrinsics": "^1.1.0", "object-inspect": "^1.13.4", "object-keys": "^1.1.1", "object.assign": "^4.1.7", "own-keys": "^1.0.1", "regexp.prototype.flags": "^1.5.4", "safe-array-concat": "^1.1.3", "safe-push-apply": "^1.0.0", "safe-regex-test": "^1.1.0", "set-proto": "^1.0.0", "stop-iteration-iterator": "^1.1.0", "string.prototype.trim": "^1.2.10", "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", "typed-array-buffer": "^1.0.3", "typed-array-byte-length": "^1.0.3", "typed-array-byte-offset": "^1.0.4", "typed-array-length": "^1.0.7", "unbox-primitive": "^1.1.0", "which-typed-array": "^1.1.19" } }, "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg=="], + "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], @@ -1217,6 +1274,10 @@ "es-set-tostringtag": ["es-set-tostringtag@2.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="], + "es-shim-unscopables": ["es-shim-unscopables@1.1.0", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw=="], + + "es-to-primitive": ["es-to-primitive@1.3.0", "", { "dependencies": { "is-callable": "^1.2.7", "is-date-object": "^1.0.5", "is-symbol": "^1.0.4" } }, "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g=="], + "esbuild": ["esbuild@0.25.5", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.5", "@esbuild/android-arm": "0.25.5", "@esbuild/android-arm64": "0.25.5", "@esbuild/android-x64": "0.25.5", "@esbuild/darwin-arm64": "0.25.5", "@esbuild/darwin-x64": "0.25.5", "@esbuild/freebsd-arm64": "0.25.5", "@esbuild/freebsd-x64": "0.25.5", "@esbuild/linux-arm": "0.25.5", "@esbuild/linux-arm64": "0.25.5", "@esbuild/linux-ia32": "0.25.5", "@esbuild/linux-loong64": "0.25.5", "@esbuild/linux-mips64el": "0.25.5", "@esbuild/linux-ppc64": "0.25.5", "@esbuild/linux-riscv64": "0.25.5", "@esbuild/linux-s390x": "0.25.5", "@esbuild/linux-x64": "0.25.5", "@esbuild/netbsd-arm64": "0.25.5", "@esbuild/netbsd-x64": "0.25.5", "@esbuild/openbsd-arm64": "0.25.5", "@esbuild/openbsd-x64": "0.25.5", "@esbuild/sunos-x64": "0.25.5", "@esbuild/win32-arm64": "0.25.5", "@esbuild/win32-ia32": "0.25.5", "@esbuild/win32-x64": "0.25.5" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ=="], "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], @@ -1225,13 +1286,27 @@ "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - "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=="], + "eslint": ["eslint@9.28.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.20.0", "@eslint/config-helpers": "^0.2.1", "@eslint/core": "^0.14.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.28.0", "@eslint/plugin-kit": "^0.3.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.3.0", "eslint-visitor-keys": "^4.2.0", "espree": "^10.3.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-ocgh41VhRlf9+fVpe7QKzwLj9c92fDiqOj8Y3Sd4/ZmVA4Btx4PlUYPq4pp9JDyupkf1upbEXecxL2mwNV7jPQ=="], - "eslint-scope": ["eslint-scope@7.2.2", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg=="], + "eslint-import-resolver-node": ["eslint-import-resolver-node@0.3.9", "", { "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.13.0", "resolve": "^1.22.4" } }, "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g=="], - "eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], + "eslint-module-utils": ["eslint-module-utils@2.12.0", "", { "dependencies": { "debug": "^3.2.7" } }, "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg=="], - "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=="], + "eslint-plugin-es": ["eslint-plugin-es@3.0.1", "", { "dependencies": { "eslint-utils": "^2.0.0", "regexpp": "^3.0.0" }, "peerDependencies": { "eslint": ">=4.19.1" } }, "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ=="], + + "eslint-plugin-import": ["eslint-plugin-import@2.31.0", "", { "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.8", "array.prototype.findlastindex": "^1.2.5", "array.prototype.flat": "^1.3.2", "array.prototype.flatmap": "^1.3.2", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", "eslint-module-utils": "^2.12.0", "hasown": "^2.0.2", "is-core-module": "^2.15.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", "object.fromentries": "^2.0.8", "object.groupby": "^1.0.3", "object.values": "^1.2.0", "semver": "^6.3.1", "string.prototype.trimend": "^1.0.8", "tsconfig-paths": "^3.15.0" }, "peerDependencies": { "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A=="], + + "eslint-plugin-node": ["eslint-plugin-node@11.1.0", "", { "dependencies": { "eslint-plugin-es": "^3.0.0", "eslint-utils": "^2.0.0", "ignore": "^5.1.1", "minimatch": "^3.0.4", "resolve": "^1.10.1", "semver": "^6.1.0" }, "peerDependencies": { "eslint": ">=5.16.0" } }, "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g=="], + + "eslint-plugin-promise": ["eslint-plugin-promise@7.2.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" } }, "sha512-SWKjd+EuvWkYaS+uN2csvj0KoP43YTu7+phKQ5v+xw6+A0gutVX2yqCeCkC3uLCJFiPfR2dD8Es5L7yUsmvEaA=="], + + "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], + + "eslint-utils": ["eslint-utils@2.1.0", "", { "dependencies": { "eslint-visitor-keys": "^1.1.0" } }, "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg=="], + + "eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], + + "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], "esquery": ["esquery@1.6.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg=="], @@ -1275,7 +1350,7 @@ "fdir": ["fdir@6.4.6", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w=="], - "file-entry-cache": ["file-entry-cache@6.0.1", "", { "dependencies": { "flat-cache": "^3.0.4" } }, "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg=="], + "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="], "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], @@ -1285,12 +1360,14 @@ "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="], - "flat-cache": ["flat-cache@3.2.0", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", "rimraf": "^3.0.2" } }, "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw=="], + "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="], "flatted": ["flatted@3.3.3", "", {}, "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg=="], "follow-redirects": ["follow-redirects@1.15.9", "", {}, "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ=="], + "for-each": ["for-each@0.3.5", "", { "dependencies": { "is-callable": "^1.2.7" } }, "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg=="], + "foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="], "form-data": ["form-data@4.0.3", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA=="], @@ -1313,8 +1390,12 @@ "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], + "function.prototype.name": ["function.prototype.name@1.1.8", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "functions-have-names": "^1.2.3", "hasown": "^2.0.2", "is-callable": "^1.2.7" } }, "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q=="], + "functional-red-black-tree": ["functional-red-black-tree@1.0.1", "", {}, "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g=="], + "functions-have-names": ["functions-have-names@1.2.3", "", {}, "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ=="], + "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], @@ -1329,6 +1410,8 @@ "get-stream": ["get-stream@9.0.1", "", { "dependencies": { "@sec-ant/readable-stream": "^0.4.1", "is-stream": "^4.0.1" } }, "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA=="], + "get-symbol-description": ["get-symbol-description@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6" } }, "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg=="], + "glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], @@ -1337,6 +1420,8 @@ "globals": ["globals@13.24.0", "", { "dependencies": { "type-fest": "^0.20.2" } }, "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ=="], + "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], + "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], @@ -1347,10 +1432,14 @@ "graphemer": ["graphemer@1.4.0", "", {}, "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="], + "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="], + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], + "has-proto": ["has-proto@1.2.0", "", { "dependencies": { "dunder-proto": "^1.0.0" } }, "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ=="], + "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], "has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="], @@ -1383,7 +1472,7 @@ "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], - "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + "ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], "ignore-walk": ["ignore-walk@7.0.0", "", { "dependencies": { "minimatch": "^9.0.0" } }, "sha512-T4gbf83A4NH95zvhVYZc+qWocBBGlpzUXLPGurJggw/WIOwicfXJChLDP/iBZnN5WqROSu5Bm3hhle4z8a8YGQ=="], @@ -1399,32 +1488,74 @@ "ini": ["ini@5.0.0", "", {}, "sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw=="], + "internal-slot": ["internal-slot@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.2", "side-channel": "^1.1.0" } }, "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw=="], + "ioredis": ["ioredis@5.6.1", "", { "dependencies": { "@ioredis/commands": "^1.1.1", "cluster-key-slot": "^1.1.0", "debug": "^4.3.4", "denque": "^2.1.0", "lodash.defaults": "^4.2.0", "lodash.isarguments": "^3.1.0", "redis-errors": "^1.2.0", "redis-parser": "^3.0.0", "standard-as-callback": "^2.1.0" } }, "sha512-UxC0Yv1Y4WRJiGQxQkP0hfdL0/5/6YvdfOOClRgJ0qppSarkhneSa6UvkMkms0AkdGimSH3Ikqm+6mkMmX7vGA=="], "ip-address": ["ip-address@9.0.5", "", { "dependencies": { "jsbn": "1.1.0", "sprintf-js": "^1.1.3" } }, "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g=="], + "is-array-buffer": ["is-array-buffer@3.0.5", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A=="], + + "is-async-function": ["is-async-function@2.1.1", "", { "dependencies": { "async-function": "^1.0.0", "call-bound": "^1.0.3", "get-proto": "^1.0.1", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ=="], + + "is-bigint": ["is-bigint@1.1.0", "", { "dependencies": { "has-bigints": "^1.0.2" } }, "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ=="], + "is-binary-path": ["is-binary-path@2.1.0", "", { "dependencies": { "binary-extensions": "^2.0.0" } }, "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="], + "is-boolean-object": ["is-boolean-object@1.2.2", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A=="], + + "is-callable": ["is-callable@1.2.7", "", {}, "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA=="], + "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="], + "is-data-view": ["is-data-view@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "is-typed-array": "^1.1.13" } }, "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw=="], + + "is-date-object": ["is-date-object@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" } }, "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg=="], + "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], + "is-finalizationregistry": ["is-finalizationregistry@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg=="], + "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + "is-generator-function": ["is-generator-function@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "get-proto": "^1.0.0", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ=="], + "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], "is-interactive": ["is-interactive@2.0.0", "", {}, "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ=="], + "is-map": ["is-map@2.0.3", "", {}, "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw=="], + + "is-negative-zero": ["is-negative-zero@2.0.3", "", {}, "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw=="], + "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], + "is-number-object": ["is-number-object@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw=="], + "is-path-inside": ["is-path-inside@3.0.3", "", {}, "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ=="], "is-regex": ["is-regex@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g=="], + "is-set": ["is-set@2.0.3", "", {}, "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg=="], + + "is-shared-array-buffer": ["is-shared-array-buffer@1.0.4", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A=="], + "is-stream": ["is-stream@4.0.1", "", {}, "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A=="], + "is-string": ["is-string@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA=="], + + "is-symbol": ["is-symbol@1.1.1", "", { "dependencies": { "call-bound": "^1.0.2", "has-symbols": "^1.1.0", "safe-regex-test": "^1.1.0" } }, "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w=="], + + "is-typed-array": ["is-typed-array@1.1.15", "", { "dependencies": { "which-typed-array": "^1.1.16" } }, "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ=="], + "is-unicode-supported": ["is-unicode-supported@2.1.0", "", {}, "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ=="], + "is-weakmap": ["is-weakmap@2.0.2", "", {}, "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w=="], + + "is-weakref": ["is-weakref@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew=="], + + "is-weakset": ["is-weakset@2.0.4", "", { "dependencies": { "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ=="], + "isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="], "isbinaryfile": ["isbinaryfile@4.0.10", "", {}, "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw=="], @@ -1467,7 +1598,7 @@ "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="], - "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], + "json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="], "jsonc-parser": ["jsonc-parser@3.3.1", "", {}, "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ=="], @@ -1671,6 +1802,14 @@ "object-keys": ["object-keys@1.1.1", "", {}, "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="], + "object.assign": ["object.assign@4.1.7", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0", "has-symbols": "^1.1.0", "object-keys": "^1.1.1" } }, "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw=="], + + "object.fromentries": ["object.fromentries@2.0.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-object-atoms": "^1.0.0" } }, "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ=="], + + "object.groupby": ["object.groupby@1.0.3", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2" } }, "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ=="], + + "object.values": ["object.values@1.2.1", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA=="], + "on-exit-leak-free": ["on-exit-leak-free@2.1.2", "", {}, "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA=="], "on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="], @@ -1687,6 +1826,8 @@ "os-tmpdir": ["os-tmpdir@1.0.2", "", {}, "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g=="], + "own-keys": ["own-keys@1.0.1", "", { "dependencies": { "get-intrinsic": "^1.2.6", "object-keys": "^1.1.1", "safe-push-apply": "^1.0.0" } }, "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg=="], + "p-cancelable": ["p-cancelable@4.0.1", "", {}, "sha512-wBowNApzd45EIKdO1LaU+LrMBwAcjfPaYtVzV3lmfM3gf8Z4CHZsiIqlM8TZZ8okYvh5A1cP6gTfCRQtwUpaUg=="], "p-limit": ["p-limit@6.2.0", "", { "dependencies": { "yocto-queue": "^1.1.1" } }, "sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA=="], @@ -1763,6 +1904,8 @@ "pkg-dir": ["pkg-dir@4.2.0", "", { "dependencies": { "find-up": "^4.0.0" } }, "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ=="], + "possible-typed-array-names": ["possible-typed-array-names@1.1.0", "", {}, "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg=="], + "postcss": ["postcss@8.5.4", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-QSa9EBe+uwlGTFmHsPKokv3B/oEMQZxfqW0QqNCyhpa6mB1afzulwn8hihglqAb2pOw+BJgNlmXQ8la2VeHB7w=="], "postcss-media-query-parser": ["postcss-media-query-parser@0.2.3", "", {}, "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig=="], @@ -1837,6 +1980,12 @@ "reflect-metadata": ["reflect-metadata@0.2.2", "", {}, "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q=="], + "reflect.getprototypeof": ["reflect.getprototypeof@1.0.10", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.9", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.7", "get-proto": "^1.0.1", "which-builtin-type": "^1.2.1" } }, "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw=="], + + "regexp.prototype.flags": ["regexp.prototype.flags@1.5.4", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-errors": "^1.3.0", "get-proto": "^1.0.1", "gopd": "^1.2.0", "set-function-name": "^2.0.2" } }, "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA=="], + + "regexpp": ["regexpp@3.2.0", "", {}, "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg=="], + "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="], @@ -1869,8 +2018,12 @@ "rxjs": ["rxjs@7.8.2", "", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA=="], + "safe-array-concat": ["safe-array-concat@1.1.3", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "has-symbols": "^1.1.0", "isarray": "^2.0.5" } }, "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q=="], + "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + "safe-push-apply": ["safe-push-apply@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "isarray": "^2.0.5" } }, "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA=="], + "safe-regex-test": ["safe-regex-test@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-regex": "^1.2.1" } }, "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw=="], "safe-stable-stringify": ["safe-stable-stringify@2.5.0", "", {}, "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA=="], @@ -1885,6 +2038,10 @@ "set-function-length": ["set-function-length@1.2.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2" } }, "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg=="], + "set-function-name": ["set-function-name@2.0.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", "has-property-descriptors": "^1.0.2" } }, "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ=="], + + "set-proto": ["set-proto@1.0.0", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0" } }, "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw=="], + "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="], "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], @@ -1955,6 +2112,8 @@ "stdin-discarder": ["stdin-discarder@0.2.2", "", {}, "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ=="], + "stop-iteration-iterator": ["stop-iteration-iterator@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "internal-slot": "^1.1.0" } }, "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ=="], + "streamroller": ["streamroller@3.1.5", "", { "dependencies": { "date-format": "^4.0.14", "debug": "^4.3.4", "fs-extra": "^8.1.0" } }, "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw=="], "streamx": ["streamx@2.22.1", "", { "dependencies": { "fast-fifo": "^1.3.2", "text-decoder": "^1.1.0" }, "optionalDependencies": { "bare-events": "^2.2.0" } }, "sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA=="], @@ -1963,12 +2122,20 @@ "string-width-cjs": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + "string.prototype.trim": ["string.prototype.trim@1.2.10", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-data-property": "^1.1.4", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-object-atoms": "^1.0.0", "has-property-descriptors": "^1.0.2" } }, "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA=="], + + "string.prototype.trimend": ["string.prototype.trimend@1.0.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ=="], + + "string.prototype.trimstart": ["string.prototype.trimstart@1.0.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg=="], + "string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], "strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "strip-bom": ["strip-bom@3.0.0", "", {}, "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA=="], + "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], "superagent": ["superagent@8.1.2", "", { "dependencies": { "component-emitter": "^1.3.0", "cookiejar": "^2.1.4", "debug": "^4.3.4", "fast-safe-stringify": "^2.1.1", "form-data": "^4.0.0", "formidable": "^2.1.2", "methods": "^1.1.2", "mime": "2.6.0", "qs": "^6.11.0", "semver": "^7.3.8" } }, "sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA=="], @@ -2013,7 +2180,9 @@ "trading-dashboard": ["trading-dashboard@workspace:apps/dashboard"], - "ts-api-utils": ["ts-api-utils@1.4.3", "", { "peerDependencies": { "typescript": ">=4.2.0" } }, "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw=="], + "ts-api-utils": ["ts-api-utils@2.1.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ=="], + + "tsconfig-paths": ["tsconfig-paths@3.15.0", "", { "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg=="], "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], @@ -2041,10 +2210,20 @@ "type-is": ["type-is@1.6.18", "", { "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" } }, "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g=="], + "typed-array-buffer": ["typed-array-buffer@1.0.3", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-typed-array": "^1.1.14" } }, "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw=="], + + "typed-array-byte-length": ["typed-array-byte-length@1.0.3", "", { "dependencies": { "call-bind": "^1.0.8", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-proto": "^1.2.0", "is-typed-array": "^1.1.14" } }, "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg=="], + + "typed-array-byte-offset": ["typed-array-byte-offset@1.0.4", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-proto": "^1.2.0", "is-typed-array": "^1.1.15", "reflect.getprototypeof": "^1.0.9" } }, "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ=="], + + "typed-array-length": ["typed-array-length@1.0.7", "", { "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", "is-typed-array": "^1.1.13", "possible-typed-array-names": "^1.0.0", "reflect.getprototypeof": "^1.0.6" } }, "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg=="], + "typescript": ["typescript@5.8.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="], "ua-parser-js": ["ua-parser-js@0.7.40", "", { "bin": { "ua-parser-js": "script/cli.js" } }, "sha512-us1E3K+3jJppDBa3Tl0L3MOJiGhe1C6P0+nIvQAFYbxlMAx0h81eOwLmU57xgqToduDDPx3y5QsdjPfDu+FgOQ=="], + "unbox-primitive": ["unbox-primitive@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "has-bigints": "^1.0.2", "has-symbols": "^1.1.0", "which-boxed-primitive": "^1.1.1" } }, "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw=="], + "undici": ["undici@5.29.0", "", { "dependencies": { "@fastify/busboy": "^2.0.0" } }, "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg=="], "undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], @@ -2087,6 +2266,14 @@ "which": ["which@1.3.1", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "which": "./bin/which" } }, "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ=="], + "which-boxed-primitive": ["which-boxed-primitive@1.1.1", "", { "dependencies": { "is-bigint": "^1.1.0", "is-boolean-object": "^1.2.1", "is-number-object": "^1.1.1", "is-string": "^1.1.1", "is-symbol": "^1.1.1" } }, "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA=="], + + "which-builtin-type": ["which-builtin-type@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "function.prototype.name": "^1.1.6", "has-tostringtag": "^1.0.2", "is-async-function": "^2.0.0", "is-date-object": "^1.1.0", "is-finalizationregistry": "^1.1.0", "is-generator-function": "^1.0.10", "is-regex": "^1.2.1", "is-weakref": "^1.0.2", "isarray": "^2.0.5", "which-boxed-primitive": "^1.1.0", "which-collection": "^1.0.2", "which-typed-array": "^1.1.16" } }, "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q=="], + + "which-collection": ["which-collection@1.0.2", "", { "dependencies": { "is-map": "^2.0.3", "is-set": "^2.0.3", "is-weakmap": "^2.0.2", "is-weakset": "^2.0.3" } }, "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw=="], + + "which-typed-array": ["which-typed-array@1.1.19", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" } }, "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw=="], + "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], "wrap-ansi": ["wrap-ansi@9.0.0", "", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q=="], @@ -2131,6 +2318,8 @@ "@babel/core/convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], + "@babel/core/json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], + "@babel/core/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], "@babel/helper-compilation-targets/lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], @@ -2139,6 +2328,14 @@ "@babel/traverse/globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="], + "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], + + "@eslint/eslintrc/globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], + + "@eslint/eslintrc/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + + "@humanfs/node/@humanwhocodes/retry": ["@humanwhocodes/retry@0.3.1", "", {}, "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA=="], + "@inquirer/core/signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], "@inquirer/core/wrap-ansi": ["wrap-ansi@6.2.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA=="], @@ -2173,20 +2370,50 @@ "@stock-bot/config/@types/node": ["@types/node@20.19.0", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-hfrc+1tud1xcdVTABC2JiomZJEklMcXYNTVtZLAeqTVWD+qL5jkHKT+1lOtqDdGxt+mB53DTtiz673vfjU8D1Q=="], + "@stock-bot/config/@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/config/@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/config/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/data-frame/@types/node": ["@types/node@20.19.0", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-hfrc+1tud1xcdVTABC2JiomZJEklMcXYNTVtZLAeqTVWD+qL5jkHKT+1lOtqDdGxt+mB53DTtiz673vfjU8D1Q=="], "@stock-bot/event-bus/@types/node": ["@types/node@20.19.0", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-hfrc+1tud1xcdVTABC2JiomZJEklMcXYNTVtZLAeqTVWD+qL5jkHKT+1lOtqDdGxt+mB53DTtiz673vfjU8D1Q=="], "@stock-bot/http/@types/node": ["@types/node@20.19.0", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-hfrc+1tud1xcdVTABC2JiomZJEklMcXYNTVtZLAeqTVWD+qL5jkHKT+1lOtqDdGxt+mB53DTtiz673vfjU8D1Q=="], + "@stock-bot/http/@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/http/@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/http/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/logger/@types/node": ["@types/node@20.19.0", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-hfrc+1tud1xcdVTABC2JiomZJEklMcXYNTVtZLAeqTVWD+qL5jkHKT+1lOtqDdGxt+mB53DTtiz673vfjU8D1Q=="], "@stock-bot/mongodb-client/@types/node": ["@types/node@20.19.0", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-hfrc+1tud1xcdVTABC2JiomZJEklMcXYNTVtZLAeqTVWD+qL5jkHKT+1lOtqDdGxt+mB53DTtiz673vfjU8D1Q=="], + "@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-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-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-client/@types/node": ["@types/node@20.19.0", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-hfrc+1tud1xcdVTABC2JiomZJEklMcXYNTVtZLAeqTVWD+qL5jkHKT+1lOtqDdGxt+mB53DTtiz673vfjU8D1Q=="], + "@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-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-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-client/@types/node": ["@types/node@20.19.0", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-hfrc+1tud1xcdVTABC2JiomZJEklMcXYNTVtZLAeqTVWD+qL5jkHKT+1lOtqDdGxt+mB53DTtiz673vfjU8D1Q=="], + "@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-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-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/shutdown/@types/node": ["@types/node@20.19.0", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-hfrc+1tud1xcdVTABC2JiomZJEklMcXYNTVtZLAeqTVWD+qL5jkHKT+1lOtqDdGxt+mB53DTtiz673vfjU8D1Q=="], "@stock-bot/strategy-engine/@types/node": ["@types/node@20.19.0", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-hfrc+1tud1xcdVTABC2JiomZJEklMcXYNTVtZLAeqTVWD+qL5jkHKT+1lOtqDdGxt+mB53DTtiz673vfjU8D1Q=="], @@ -2217,7 +2444,7 @@ "@tufjs/models/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], - "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.3", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg=="], + "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], "ajv-formats/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], @@ -2269,6 +2496,22 @@ "ent/punycode": ["punycode@1.4.1", "", {}, "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ=="], + "eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + + "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], + + "eslint-module-utils/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], + + "eslint-plugin-import/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], + + "eslint-plugin-import/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "eslint-plugin-node/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + + "eslint-plugin-node/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@1.3.0", "", {}, "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ=="], + "external-editor/tmp": ["tmp@0.0.33", "", { "dependencies": { "os-tmpdir": "~1.0.2" } }, "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw=="], "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], @@ -2285,6 +2528,8 @@ "globals/type-fest": ["type-fest@0.20.2", "", {}, "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ=="], + "globby/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + "got/type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="], "hosted-git-info/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], @@ -2385,6 +2630,8 @@ "@angular/compiler-cli/@babel/core/convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], + "@angular/compiler-cli/@babel/core/json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], + "@angular/compiler-cli/@babel/core/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], "@angular/compiler-cli/yargs/cliui": ["cliui@9.0.1", "", { "dependencies": { "string-width": "^7.2.0", "strip-ansi": "^7.1.0", "wrap-ansi": "^9.0.0" } }, "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w=="], @@ -2411,6 +2658,186 @@ "@npmcli/run-script/which/isexe": ["isexe@3.1.1", "", {}, "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ=="], + "@stock-bot/config/@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/config/@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/config/@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/config/@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/config/@typescript-eslint/eslint-plugin/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + + "@stock-bot/config/@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/config/@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/config/@typescript-eslint/parser/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="], + + "@stock-bot/config/@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/config/@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/config/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/config/eslint/@eslint/js": ["@eslint/js@8.57.1", "", {}, "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q=="], + + "@stock-bot/config/eslint/doctrine": ["doctrine@3.0.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w=="], + + "@stock-bot/config/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/config/eslint/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], + + "@stock-bot/config/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/config/eslint/file-entry-cache": ["file-entry-cache@6.0.1", "", { "dependencies": { "flat-cache": "^3.0.4" } }, "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg=="], + + "@stock-bot/config/eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + + "@stock-bot/http/@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/http/@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/http/@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/http/@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/http/@typescript-eslint/eslint-plugin/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + + "@stock-bot/http/@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/http/@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/http/@typescript-eslint/parser/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="], + + "@stock-bot/http/@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/http/@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/http/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/http/eslint/@eslint/js": ["@eslint/js@8.57.1", "", {}, "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q=="], + + "@stock-bot/http/eslint/doctrine": ["doctrine@3.0.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w=="], + + "@stock-bot/http/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/http/eslint/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], + + "@stock-bot/http/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/http/eslint/file-entry-cache": ["file-entry-cache@6.0.1", "", { "dependencies": { "flat-cache": "^3.0.4" } }, "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg=="], + + "@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-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-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-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-client/@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-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-client/@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-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-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-client/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-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-client/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-client/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/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-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-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-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-client/@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-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-client/@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-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-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-client/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-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-client/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-client/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/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-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-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-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-client/@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-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-client/@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-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-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-client/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-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-client/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-client/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=="], + "@tailwindcss/oxide/tar/chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="], "@tailwindcss/oxide/tar/mkdirp": ["mkdirp@3.0.1", "", { "bin": { "mkdirp": "dist/cjs/src/bin.js" } }, "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg=="], @@ -2453,6 +2880,8 @@ "istanbul-lib-instrument/@babel/core/convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], + "istanbul-lib-instrument/@babel/core/json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], + "istanbul-lib-instrument/@babel/core/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], "karma-coverage/istanbul-lib-instrument/@babel/core": ["@babel/core@7.27.4", "", { "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.27.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.27.3", "@babel/helpers": "^7.27.4", "@babel/parser": "^7.27.4", "@babel/template": "^7.27.2", "@babel/traverse": "^7.27.4", "@babel/types": "^7.27.3", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g=="], @@ -2517,6 +2946,106 @@ "@npmcli/package-json/glob/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + "@stock-bot/config/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="], + + "@stock-bot/config/@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/config/@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="], + + "@stock-bot/config/@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/config/@typescript-eslint/eslint-plugin/@typescript-eslint/visitor-keys/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="], + + "@stock-bot/config/@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/config/@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.3", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg=="], + + "@stock-bot/config/@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/config/@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/config/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/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="], + + "@stock-bot/http/@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/http/@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="], + + "@stock-bot/http/@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/http/@typescript-eslint/eslint-plugin/@typescript-eslint/visitor-keys/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="], + + "@stock-bot/http/@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/http/@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.3", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg=="], + + "@stock-bot/http/@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/http/@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/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-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-client/@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-client/@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-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-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-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-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-client/@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-client/@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-client/@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-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-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-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-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-client/@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-client/@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-client/@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-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-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-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-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=="], + "archiver-utils/glob/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], "cacache/glob/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], @@ -2527,6 +3056,8 @@ "karma-coverage/istanbul-lib-instrument/@babel/core/convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], + "karma-coverage/istanbul-lib-instrument/@babel/core/json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], + "karma/chokidar/readdirp/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], "karma/yargs/cliui/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], @@ -2541,8 +3072,68 @@ "@angular/compiler-cli/yargs/string-width/strip-ansi/ansi-regex": ["ansi-regex@6.1.0", "", {}, "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="], + "@stock-bot/config/@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/config/@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/config/@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/config/@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + + "@stock-bot/http/@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/http/@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/http/@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/http/@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + + "@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-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-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-client/@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + + "@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-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-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-client/@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + + "@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-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-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-client/@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + "mongodb-memory-server-core/mongodb/mongodb-connection-string-url/whatwg-url/tr46": ["tr46@3.0.0", "", { "dependencies": { "punycode": "^2.1.1" } }, "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA=="], "pkg-dir/find-up/locate-path/p-locate/p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], + + "@stock-bot/config/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + + "@stock-bot/config/@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + + "@stock-bot/http/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + + "@stock-bot/http/@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + + "@stock-bot/mongodb-client/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + + "@stock-bot/mongodb-client/@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + + "@stock-bot/postgres-client/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + + "@stock-bot/postgres-client/@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + + "@stock-bot/questdb-client/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + + "@stock-bot/questdb-client/@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], } } diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..2644048 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,77 @@ +import js from '@eslint/js'; +import tseslint from '@typescript-eslint/eslint-plugin'; +import tsparser from '@typescript-eslint/parser'; + +export default [ + // Global ignores first + { + ignores: [ + 'dist/**', + 'build/**', + 'node_modules/**', + '**/*.js', + '**/*.mjs', + '**/*.d.ts', + '.turbo/**', + 'coverage/**', + 'scripts/**', + 'monitoring/**', + 'database/**', + '**/.angular/**', + '**/src/polyfills.ts', + ], + }, + + // Base JavaScript configuration + js.configs.recommended, + + // TypeScript configuration + { + files: ['**/*.{ts,tsx}'], + languageOptions: { + parser: tsparser, + parserOptions: { + ecmaVersion: 2022, + sourceType: 'module', + }, + }, + plugins: { + '@typescript-eslint': tseslint, + }, + rules: { + // Disable base rules that are covered by TypeScript equivalents + 'no-unused-vars': 'off', + 'no-undef': 'off', + + // TypeScript specific rules + '@typescript-eslint/no-unused-vars': [ + 'error', + { + argsIgnorePattern: '^_', + varsIgnorePattern: '^_', + destructuredArrayIgnorePattern: '^_', + }, + ], + '@typescript-eslint/no-explicit-any': 'warn', + '@typescript-eslint/no-non-null-assertion': 'warn', + + // General rules + 'no-console': 'warn', + 'no-debugger': 'error', + 'no-var': 'error', + 'prefer-const': 'error', + eqeqeq: ['error', 'always'], + curly: ['error', 'all'], + }, + }, + + // Test files configuration + { + files: ['**/*.test.ts', '**/*.spec.ts', '**/test/**/*', '**/tests/**/*'], + rules: { + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/no-non-null-assertion': 'off', + 'no-console': 'off', + }, + }, +]; diff --git a/libs/cache/package.json b/libs/cache/package.json index 99a4db4..681819e 100644 --- a/libs/cache/package.json +++ b/libs/cache/package.json @@ -1,32 +1,32 @@ -{ - "name": "@stock-bot/cache", - "version": "1.0.0", - "description": "Caching library for Redis and in-memory providers", - "main": "dist/index.js", - "types": "dist/index.d.ts", - "type": "module", - "scripts": { - "build": "tsc", - "clean": "rimraf dist", - "test": "bun test" - }, - "dependencies": { - "ioredis": "^5.3.2" - }, - "devDependencies": { - "@types/node": "^20.11.0", - "typescript": "^5.3.0", - "bun-types": "^1.2.15" - }, - "exports": { - ".": { - "import": "./dist/index.js", - "require": "./dist/index.js", - "types": "./dist/index.d.ts" - } - }, - "files": [ - "dist", - "README.md" - ] -} +{ + "name": "@stock-bot/cache", + "version": "1.0.0", + "description": "Caching library for Redis and in-memory providers", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "type": "module", + "scripts": { + "build": "tsc", + "clean": "rimraf dist", + "test": "bun test" + }, + "dependencies": { + "ioredis": "^5.3.2" + }, + "devDependencies": { + "@types/node": "^20.11.0", + "typescript": "^5.3.0", + "bun-types": "^1.2.15" + }, + "exports": { + ".": { + "import": "./dist/index.js", + "require": "./dist/index.js", + "types": "./dist/index.d.ts" + } + }, + "files": [ + "dist", + "README.md" + ] +} diff --git a/libs/cache/src/connection-manager.ts b/libs/cache/src/connection-manager.ts index d5e0809..a3856ad 100644 --- a/libs/cache/src/connection-manager.ts +++ b/libs/cache/src/connection-manager.ts @@ -173,7 +173,7 @@ export class RedisConnectionManager { try { await connection.ping(); details[`shared:${name}`] = true; - } catch (error) { + } catch (_error) { details[`shared:${name}`] = false; allHealthy = false; } @@ -184,7 +184,7 @@ export class RedisConnectionManager { try { await connection.ping(); details[`unique:${name}`] = true; - } catch (error) { + } catch (_error) { details[`unique:${name}`] = false; allHealthy = false; } diff --git a/libs/cache/src/redis-cache.ts b/libs/cache/src/redis-cache.ts index e324e1e..970648d 100644 --- a/libs/cache/src/redis-cache.ts +++ b/libs/cache/src/redis-cache.ts @@ -87,7 +87,7 @@ export class RedisCache implements CacheProvider { } private updateStats(hit: boolean, error = false): void { - if (!this.enableMetrics) return; + if (!this.enableMetrics) {return;} if (error) { this.stats.errors++; diff --git a/libs/cache/tsconfig.json b/libs/cache/tsconfig.json index 98e70e8..a382ed1 100644 --- a/libs/cache/tsconfig.json +++ b/libs/cache/tsconfig.json @@ -1,13 +1,9 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "./dist", - "rootDir": "./src" - }, - "include": ["src/**/*"], - "references": [ - { "path": "../types" }, - { "path": "../config" }, - { "path": "../logger" } - ] -} \ No newline at end of file +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "./dist", + "rootDir": "./src" + }, + "include": ["src/**/*"], + "references": [{ "path": "../types" }, { "path": "../config" }, { "path": "../logger" }] +} diff --git a/libs/config/package.json b/libs/config/package.json index 96c5e4b..29f4fc6 100644 --- a/libs/config/package.json +++ b/libs/config/package.json @@ -1,44 +1,44 @@ -{ - "name": "@stock-bot/config", - "version": "1.0.0", - "description": "Configuration management library for Stock Bot platform", - "main": "dist/index.js", - "types": "dist/index.d.ts", - "type": "module", - "scripts": { - "build": "tsc", - "test": "bun test", - "lint": "eslint src/**/*.ts", - "type-check": "tsc --noEmit", - "clean": "rimraf dist" - }, - "dependencies": { - "dotenv": "^16.5.0", - "yup": "^1.6.1" - }, - "devDependencies": { - "@types/node": "^20.11.0", - "typescript": "^5.3.0", - "eslint": "^8.56.0", - "@typescript-eslint/eslint-plugin": "^6.19.0", - "@typescript-eslint/parser": "^6.19.0", - "bun-types": "^1.2.15" - }, - "keywords": [ - "configuration", - "settings", - "env", - "stock-bot" - ], - "exports": { - ".": { - "import": "./dist/index.js", - "require": "./dist/index.js", - "types": "./dist/index.d.ts" - } - }, - "files": [ - "dist", - "README.md" - ] -} +{ + "name": "@stock-bot/config", + "version": "1.0.0", + "description": "Configuration management library for Stock Bot platform", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "type": "module", + "scripts": { + "build": "tsc", + "test": "bun test", + "lint": "eslint src/**/*.ts", + "type-check": "tsc --noEmit", + "clean": "rimraf dist" + }, + "dependencies": { + "dotenv": "^16.5.0", + "yup": "^1.6.1" + }, + "devDependencies": { + "@types/node": "^20.11.0", + "typescript": "^5.3.0", + "eslint": "^8.56.0", + "@typescript-eslint/eslint-plugin": "^6.19.0", + "@typescript-eslint/parser": "^6.19.0", + "bun-types": "^1.2.15" + }, + "keywords": [ + "configuration", + "settings", + "env", + "stock-bot" + ], + "exports": { + ".": { + "import": "./dist/index.js", + "require": "./dist/index.js", + "types": "./dist/index.d.ts" + } + }, + "files": [ + "dist", + "README.md" + ] +} diff --git a/libs/config/tsconfig.json b/libs/config/tsconfig.json index 1732a93..768e89d 100644 --- a/libs/config/tsconfig.json +++ b/libs/config/tsconfig.json @@ -1,12 +1,17 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "./dist", - "rootDir": "./src" - }, - "include": ["src/**/*"], - "exclude": ["node_modules", "dist", "**/*.test.ts", "**/*.spec.ts", "**/test/**/*", "**/tests/**/*"], - "references": [ - { "path": "../types" } - ] -} +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "./dist", + "rootDir": "./src" + }, + "include": ["src/**/*"], + "exclude": [ + "node_modules", + "dist", + "**/*.test.ts", + "**/*.spec.ts", + "**/test/**/*", + "**/tests/**/*" + ], + "references": [{ "path": "../types" }] +} diff --git a/libs/data-adjustments/package.json b/libs/data-adjustments/package.json index 486114e..a41bdd9 100644 --- a/libs/data-adjustments/package.json +++ b/libs/data-adjustments/package.json @@ -1,24 +1,24 @@ -{ - "name": "@stock-bot/data-adjustments", - "version": "1.0.0", - "description": "Stock split and dividend adjustment utilities for market data", - "type": "module", - "main": "dist/index.js", - "types": "dist/index.d.ts", - "scripts": { - "build": "tsc", - "test": "bun test", - "test:watch": "bun test --watch" - }, - "dependencies": { - "@stock-bot/types": "*", - "@stock-bot/logger": "*" - }, - "devDependencies": { - "typescript": "^5.4.5", - "bun-types": "^1.1.12" - }, - "peerDependencies": { - "typescript": "^5.0.0" - } -} +{ + "name": "@stock-bot/data-adjustments", + "version": "1.0.0", + "description": "Stock split and dividend adjustment utilities for market data", + "type": "module", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "scripts": { + "build": "tsc", + "test": "bun test", + "test:watch": "bun test --watch" + }, + "dependencies": { + "@stock-bot/types": "*", + "@stock-bot/logger": "*" + }, + "devDependencies": { + "typescript": "^5.4.5", + "bun-types": "^1.1.12" + }, + "peerDependencies": { + "typescript": "^5.0.0" + } +} diff --git a/libs/data-frame/package.json b/libs/data-frame/package.json index 4adafeb..3048a03 100644 --- a/libs/data-frame/package.json +++ b/libs/data-frame/package.json @@ -1,33 +1,33 @@ -{ - "name": "@stock-bot/data-frame", - "version": "1.0.0", - "description": "DataFrame library for time series data manipulation", - "main": "dist/index.js", - "types": "dist/index.d.ts", - "type": "module", - "scripts": { - "build": "tsc", - "test": "bun test", - "clean": "rimraf dist" - }, - "dependencies": { - "@stock-bot/logger": "*", - "@stock-bot/utils": "*" - }, - "devDependencies": { - "@types/node": "^20.11.0", - "typescript": "^5.3.0", - "bun-types": "^1.2.15" - }, - "exports": { - ".": { - "import": "./dist/index.js", - "require": "./dist/index.js", - "types": "./dist/index.d.ts" - } - }, - "files": [ - "dist", - "README.md" - ] -} +{ + "name": "@stock-bot/data-frame", + "version": "1.0.0", + "description": "DataFrame library for time series data manipulation", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "type": "module", + "scripts": { + "build": "tsc", + "test": "bun test", + "clean": "rimraf dist" + }, + "dependencies": { + "@stock-bot/logger": "*", + "@stock-bot/utils": "*" + }, + "devDependencies": { + "@types/node": "^20.11.0", + "typescript": "^5.3.0", + "bun-types": "^1.2.15" + }, + "exports": { + ".": { + "import": "./dist/index.js", + "require": "./dist/index.js", + "types": "./dist/index.d.ts" + } + }, + "files": [ + "dist", + "README.md" + ] +} diff --git a/libs/data-frame/src/index.ts b/libs/data-frame/src/index.ts index 9c52196..056ba88 100644 --- a/libs/data-frame/src/index.ts +++ b/libs/data-frame/src/index.ts @@ -35,7 +35,7 @@ export class DataFrame { } private inferColumns(): string[] { - if (this.data.length === 0) return []; + if (this.data.length === 0) {return [];} const columns = new Set(); for (const row of this.data) { @@ -46,7 +46,7 @@ export class DataFrame { } private validateAndCleanData(): void { - if (this.data.length === 0) return; + if (this.data.length === 0) {return;} // Ensure all rows have the same columns for (let i = 0; i < this.data.length; i++) { @@ -224,7 +224,7 @@ export class DataFrame { const aVal = a[column]; const bVal = b[column]; - if (aVal === bVal) return 0; + if (aVal === bVal) {return 0;} const comparison = aVal > bVal ? 1 : -1; return ascending ? comparison : -comparison; diff --git a/libs/data-frame/tsconfig.json b/libs/data-frame/tsconfig.json index cbda440..e57c0ef 100644 --- a/libs/data-frame/tsconfig.json +++ b/libs/data-frame/tsconfig.json @@ -1,13 +1,9 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "./dist", - "rootDir": "./src" - }, - "include": ["src/**/*"], - "references": [ - { "path": "../types" }, - { "path": "../logger" }, - { "path": "../utils" } - ] -} +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "./dist", + "rootDir": "./src" + }, + "include": ["src/**/*"], + "references": [{ "path": "../types" }, { "path": "../logger" }, { "path": "../utils" }] +} diff --git a/libs/event-bus/package.json b/libs/event-bus/package.json index 582538e..9aeb808 100644 --- a/libs/event-bus/package.json +++ b/libs/event-bus/package.json @@ -1,35 +1,35 @@ -{ - "name": "@stock-bot/event-bus", - "version": "1.0.0", - "description": "Event bus library for inter-service communication", - "main": "dist/index.js", - "types": "dist/index.d.ts", - "type": "module", - "scripts": { - "build": "tsc", - "test": "bun test", - "clean": "rimraf dist" - }, - "dependencies": { - "@stock-bot/logger": "*", - "@stock-bot/config": "*", - "ioredis": "^5.3.2", - "eventemitter3": "^5.0.1" - }, - "devDependencies": { - "@types/node": "^20.11.0", - "typescript": "^5.3.0", - "bun-types": "^1.2.15" - }, - "exports": { - ".": { - "import": "./dist/index.js", - "require": "./dist/index.js", - "types": "./dist/index.d.ts" - } - }, - "files": [ - "dist", - "README.md" - ] -} +{ + "name": "@stock-bot/event-bus", + "version": "1.0.0", + "description": "Event bus library for inter-service communication", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "type": "module", + "scripts": { + "build": "tsc", + "test": "bun test", + "clean": "rimraf dist" + }, + "dependencies": { + "@stock-bot/logger": "*", + "@stock-bot/config": "*", + "ioredis": "^5.3.2", + "eventemitter3": "^5.0.1" + }, + "devDependencies": { + "@types/node": "^20.11.0", + "typescript": "^5.3.0", + "bun-types": "^1.2.15" + }, + "exports": { + ".": { + "import": "./dist/index.js", + "require": "./dist/index.js", + "types": "./dist/index.d.ts" + } + }, + "files": [ + "dist", + "README.md" + ] +} diff --git a/libs/event-bus/tsconfig.json b/libs/event-bus/tsconfig.json index e8f78e0..a382ed1 100644 --- a/libs/event-bus/tsconfig.json +++ b/libs/event-bus/tsconfig.json @@ -1,13 +1,9 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "./dist", - "rootDir": "./src" - }, - "include": ["src/**/*"], - "references": [ - { "path": "../types" }, - { "path": "../config" }, - { "path": "../logger" } - ] -} +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "./dist", + "rootDir": "./src" + }, + "include": ["src/**/*"], + "references": [{ "path": "../types" }, { "path": "../config" }, { "path": "../logger" }] +} diff --git a/libs/http/package.json b/libs/http/package.json index 3ebc824..0e32950 100644 --- a/libs/http/package.json +++ b/libs/http/package.json @@ -1,44 +1,44 @@ -{ - "name": "@stock-bot/http", - "version": "1.0.0", - "description": "HTTP client library with proxy support, rate limiting, and timeout for Stock Bot platform", - "main": "dist/index.js", - "types": "dist/index.d.ts", - "type": "module", - "scripts": { - "build": "tsc", - "test": "bun test", - "test:watch": "bun test --watch", - "test:coverage": "bun test --coverage", - "lint": "eslint src/**/*.ts", - "type-check": "tsc --noEmit", - "clean": "rimraf dist" - }, - "dependencies": { - "@stock-bot/logger": "*", - "@stock-bot/types": "*", - "axios": "^1.9.0", - "http-proxy-agent": "^7.0.2", - "https-proxy-agent": "^7.0.6", - "socks-proxy-agent": "^8.0.5" - }, - "devDependencies": { - "@types/node": "^20.11.0", - "typescript": "^5.3.0", - "eslint": "^8.56.0", - "@typescript-eslint/eslint-plugin": "^6.19.0", - "@typescript-eslint/parser": "^6.19.0", - "bun-types": "^1.2.15" - }, - "exports": { - ".": { - "import": "./dist/index.js", - "require": "./dist/index.js", - "types": "./dist/index.d.ts" - } - }, - "files": [ - "dist", - "README.md" - ] -} \ No newline at end of file +{ + "name": "@stock-bot/http", + "version": "1.0.0", + "description": "HTTP client library with proxy support, rate limiting, and timeout for Stock Bot platform", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "type": "module", + "scripts": { + "build": "tsc", + "test": "bun test", + "test:watch": "bun test --watch", + "test:coverage": "bun test --coverage", + "lint": "eslint src/**/*.ts", + "type-check": "tsc --noEmit", + "clean": "rimraf dist" + }, + "dependencies": { + "@stock-bot/logger": "*", + "@stock-bot/types": "*", + "axios": "^1.9.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.6", + "socks-proxy-agent": "^8.0.5" + }, + "devDependencies": { + "@types/node": "^20.11.0", + "typescript": "^5.3.0", + "eslint": "^8.56.0", + "@typescript-eslint/eslint-plugin": "^6.19.0", + "@typescript-eslint/parser": "^6.19.0", + "bun-types": "^1.2.15" + }, + "exports": { + ".": { + "import": "./dist/index.js", + "require": "./dist/index.js", + "types": "./dist/index.d.ts" + } + }, + "files": [ + "dist", + "README.md" + ] +} diff --git a/libs/http/src/client.ts b/libs/http/src/client.ts index 32bd501..5302f28 100644 --- a/libs/http/src/client.ts +++ b/libs/http/src/client.ts @@ -1,6 +1,5 @@ import type { Logger } from '@stock-bot/logger'; import { AdapterFactory } from './adapters/index'; -import { ProxyManager } from './proxy-manager'; import type { HttpClientConfig, HttpResponse, RequestConfig } from './types'; import { HttpError } from './types'; @@ -144,7 +143,7 @@ export class HttpClient { const elapsed = Date.now() - startTime; this.logger?.debug('Adapter failed successful', { url: config.url, - elapsedMs: Date.now() - startTime, + elapsedMs: elapsed, }); clearTimeout(timeoutId); diff --git a/libs/http/src/proxy-manager.ts b/libs/http/src/proxy-manager.ts index 4bbe940..62cb061 100644 --- a/libs/http/src/proxy-manager.ts +++ b/libs/http/src/proxy-manager.ts @@ -1,4 +1,4 @@ -import axios, { AxiosRequestConfig, type AxiosInstance } from 'axios'; +import { AxiosRequestConfig } from 'axios'; import { HttpProxyAgent } from 'http-proxy-agent'; import { HttpsProxyAgent } from 'https-proxy-agent'; import { SocksProxyAgent } from 'socks-proxy-agent'; diff --git a/libs/http/tsconfig.json b/libs/http/tsconfig.json index 01f4bc5..06793a4 100644 --- a/libs/http/tsconfig.json +++ b/libs/http/tsconfig.json @@ -1,13 +1,17 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "./dist", - "rootDir": "./src" - }, - "include": ["src/**/*"], - "exclude": ["node_modules", "dist", "**/*.test.ts", "**/*.spec.ts", "**/test/**/*", "**/tests/**/*"], - "references": [ - { "path": "../types" }, - { "path": "../logger" } - ] -} +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "./dist", + "rootDir": "./src" + }, + "include": ["src/**/*"], + "exclude": [ + "node_modules", + "dist", + "**/*.test.ts", + "**/*.spec.ts", + "**/test/**/*", + "**/tests/**/*" + ], + "references": [{ "path": "../types" }, { "path": "../logger" }] +} diff --git a/libs/logger/tsconfig.json b/libs/logger/tsconfig.json index 3bf8063..67f214c 100644 --- a/libs/logger/tsconfig.json +++ b/libs/logger/tsconfig.json @@ -1,12 +1,9 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "./dist", - "rootDir": "./src" - }, - "include": ["src/**/*"], - "references": [ - { "path": "../types" }, - { "path": "../config" } - ] -} +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "./dist", + "rootDir": "./src" + }, + "include": ["src/**/*"], + "references": [{ "path": "../types" }, { "path": "../config" }] +} diff --git a/libs/mongodb-client/package.json b/libs/mongodb-client/package.json index a0ad076..473a66a 100644 --- a/libs/mongodb-client/package.json +++ b/libs/mongodb-client/package.json @@ -1,51 +1,54 @@ -{ - "name": "@stock-bot/mongodb-client", - "version": "1.0.0", - "description": "MongoDB client library for Stock Bot platform", - "main": "dist/index.js", - "types": "dist/index.d.ts", - "type": "module", - "scripts": { - "build": "tsc", - "test": "bun test", - "lint": "eslint src/**/*.ts", - "type-check": "tsc --noEmit", - "clean": "rimraf dist" - }, - "dependencies": { - "@stock-bot/config": "*", - "@stock-bot/logger": "*", - "@stock-bot/types": "*", - "@types/mongodb": "^4.0.7", - "mongodb": "^6.17.0", - "yup": "^1.6.1" - }, - "devDependencies": { - "@types/node": "^20.11.0", - "typescript": "^5.3.0", - "eslint": "^8.56.0", - "@typescript-eslint/eslint-plugin": "^6.19.0", - "@typescript-eslint/parser": "^6.19.0", - "bun-types": "^1.2.15" - }, - "keywords": [ - "mongodb", - "database", - "client", - "stock-bot" - ], - "exports": { - ".": { - "import": "./dist/index.js", - "require": "./dist/index.js", - "types": "./dist/index.d.ts" - } - }, - "files": [ - "dist", - "README.md" - ], - "paths": { - "*": ["node_modules/*", "../../node_modules/*"] - } -} +{ + "name": "@stock-bot/mongodb-client", + "version": "1.0.0", + "description": "MongoDB client library for Stock Bot platform", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "type": "module", + "scripts": { + "build": "tsc", + "test": "bun test", + "lint": "eslint src/**/*.ts", + "type-check": "tsc --noEmit", + "clean": "rimraf dist" + }, + "dependencies": { + "@stock-bot/config": "*", + "@stock-bot/logger": "*", + "@stock-bot/types": "*", + "@types/mongodb": "^4.0.7", + "mongodb": "^6.17.0", + "yup": "^1.6.1" + }, + "devDependencies": { + "@types/node": "^20.11.0", + "typescript": "^5.3.0", + "eslint": "^8.56.0", + "@typescript-eslint/eslint-plugin": "^6.19.0", + "@typescript-eslint/parser": "^6.19.0", + "bun-types": "^1.2.15" + }, + "keywords": [ + "mongodb", + "database", + "client", + "stock-bot" + ], + "exports": { + ".": { + "import": "./dist/index.js", + "require": "./dist/index.js", + "types": "./dist/index.d.ts" + } + }, + "files": [ + "dist", + "README.md" + ], + "paths": { + "*": [ + "node_modules/*", + "../../node_modules/*" + ] + } +} diff --git a/libs/mongodb-client/src/aggregation.ts b/libs/mongodb-client/src/aggregation.ts index 9c1681a..2a28964 100644 --- a/libs/mongodb-client/src/aggregation.ts +++ b/libs/mongodb-client/src/aggregation.ts @@ -141,7 +141,7 @@ export class MongoDBAggregationBuilder { this.from('sentiment_data'); const matchConditions: any = {}; - if (symbol) matchConditions.symbol = symbol; + if (symbol) {matchConditions.symbol = symbol;} if (timeframe) { matchConditions.timestamp = { $gte: timeframe.start, diff --git a/libs/mongodb-client/tsconfig.json b/libs/mongodb-client/tsconfig.json index e8f78e0..a382ed1 100644 --- a/libs/mongodb-client/tsconfig.json +++ b/libs/mongodb-client/tsconfig.json @@ -1,13 +1,9 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "./dist", - "rootDir": "./src" - }, - "include": ["src/**/*"], - "references": [ - { "path": "../types" }, - { "path": "../config" }, - { "path": "../logger" } - ] -} +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "./dist", + "rootDir": "./src" + }, + "include": ["src/**/*"], + "references": [{ "path": "../types" }, { "path": "../config" }, { "path": "../logger" }] +} diff --git a/libs/postgres-client/package.json b/libs/postgres-client/package.json index ef5261d..80517e1 100644 --- a/libs/postgres-client/package.json +++ b/libs/postgres-client/package.json @@ -1,47 +1,48 @@ -{ - "name": "@stock-bot/postgres-client", - "version": "1.0.0", - "description": "PostgreSQL client library for Stock Bot platform", - "main": "dist/index.js", - "types": "dist/index.d.ts", - "type": "module", - "scripts": { - "build": "tsc", - "test": "bun test", - "lint": "eslint src/**/*.ts", - "type-check": "tsc --noEmit", - "clean": "rimraf dist" - }, - "dependencies": { "@stock-bot/config": "*", - "@stock-bot/logger": "*", - "@stock-bot/types": "*", - "pg": "^8.11.3", - "yup": "^1.6.1" - }, - "devDependencies": { - "@types/node": "^20.11.0", - "@types/pg": "^8.10.7", - "typescript": "^5.3.0", - "eslint": "^8.56.0", - "@typescript-eslint/eslint-plugin": "^6.19.0", - "@typescript-eslint/parser": "^6.19.0", - "bun-types": "^1.2.15" - }, - "keywords": [ - "postgresql", - "database", - "client", - "stock-bot" - ], - "exports": { - ".": { - "import": "./dist/index.js", - "require": "./dist/index.js", - "types": "./dist/index.d.ts" - } - }, - "files": [ - "dist", - "README.md" - ] -} +{ + "name": "@stock-bot/postgres-client", + "version": "1.0.0", + "description": "PostgreSQL client library for Stock Bot platform", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "type": "module", + "scripts": { + "build": "tsc", + "test": "bun test", + "lint": "eslint src/**/*.ts", + "type-check": "tsc --noEmit", + "clean": "rimraf dist" + }, + "dependencies": { + "@stock-bot/config": "*", + "@stock-bot/logger": "*", + "@stock-bot/types": "*", + "pg": "^8.11.3", + "yup": "^1.6.1" + }, + "devDependencies": { + "@types/node": "^20.11.0", + "@types/pg": "^8.10.7", + "typescript": "^5.3.0", + "eslint": "^8.56.0", + "@typescript-eslint/eslint-plugin": "^6.19.0", + "@typescript-eslint/parser": "^6.19.0", + "bun-types": "^1.2.15" + }, + "keywords": [ + "postgresql", + "database", + "client", + "stock-bot" + ], + "exports": { + ".": { + "import": "./dist/index.js", + "require": "./dist/index.js", + "types": "./dist/index.d.ts" + } + }, + "files": [ + "dist", + "README.md" + ] +} diff --git a/libs/postgres-client/src/client.ts b/libs/postgres-client/src/client.ts index af7126c..9a5baab 100644 --- a/libs/postgres-client/src/client.ts +++ b/libs/postgres-client/src/client.ts @@ -327,7 +327,7 @@ export class PostgreSQLClient { } private setupErrorHandlers(): void { - if (!this.pool) return; + if (!this.pool) {return;} this.pool.on('error', error => { this.logger.error('PostgreSQL pool error:', error); diff --git a/libs/postgres-client/tsconfig.json b/libs/postgres-client/tsconfig.json index e8f78e0..a382ed1 100644 --- a/libs/postgres-client/tsconfig.json +++ b/libs/postgres-client/tsconfig.json @@ -1,13 +1,9 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "./dist", - "rootDir": "./src" - }, - "include": ["src/**/*"], - "references": [ - { "path": "../types" }, - { "path": "../config" }, - { "path": "../logger" } - ] -} +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "./dist", + "rootDir": "./src" + }, + "include": ["src/**/*"], + "references": [{ "path": "../types" }, { "path": "../config" }, { "path": "../logger" }] +} diff --git a/libs/questdb-client/package.json b/libs/questdb-client/package.json index 62d9d0e..8c5c3b6 100644 --- a/libs/questdb-client/package.json +++ b/libs/questdb-client/package.json @@ -1,45 +1,45 @@ -{ - "name": "@stock-bot/questdb-client", - "version": "1.0.0", - "description": "QuestDB client library for Stock Bot platform", - "main": "dist/index.js", - "types": "dist/index.d.ts", - "type": "module", - "scripts": { - "build": "tsc", - "test": "bun test", - "lint": "eslint src/**/*.ts", - "type-check": "tsc --noEmit", - "clean": "rimraf dist" - }, - "dependencies": { - "@stock-bot/config": "*", - "@stock-bot/logger": "*", - "@stock-bot/types": "*" - }, - "devDependencies": { - "@types/node": "^20.11.0", - "typescript": "^5.3.0", - "eslint": "^8.56.0", - "@typescript-eslint/eslint-plugin": "^6.19.0", - "@typescript-eslint/parser": "^6.19.0", - "bun-types": "^1.2.15" - }, - "keywords": [ - "questdb", - "database", - "client", - "stock-bot" - ], - "exports": { - ".": { - "import": "./dist/index.js", - "require": "./dist/index.js", - "types": "./dist/index.d.ts" - } - }, - "files": [ - "dist", - "README.md" - ] -} +{ + "name": "@stock-bot/questdb-client", + "version": "1.0.0", + "description": "QuestDB client library for Stock Bot platform", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "type": "module", + "scripts": { + "build": "tsc", + "test": "bun test", + "lint": "eslint src/**/*.ts", + "type-check": "tsc --noEmit", + "clean": "rimraf dist" + }, + "dependencies": { + "@stock-bot/config": "*", + "@stock-bot/logger": "*", + "@stock-bot/types": "*" + }, + "devDependencies": { + "@types/node": "^20.11.0", + "typescript": "^5.3.0", + "eslint": "^8.56.0", + "@typescript-eslint/eslint-plugin": "^6.19.0", + "@typescript-eslint/parser": "^6.19.0", + "bun-types": "^1.2.15" + }, + "keywords": [ + "questdb", + "database", + "client", + "stock-bot" + ], + "exports": { + ".": { + "import": "./dist/index.js", + "require": "./dist/index.js", + "types": "./dist/index.d.ts" + } + }, + "files": [ + "dist", + "README.md" + ] +} diff --git a/libs/questdb-client/tsconfig.json b/libs/questdb-client/tsconfig.json index e8f78e0..a382ed1 100644 --- a/libs/questdb-client/tsconfig.json +++ b/libs/questdb-client/tsconfig.json @@ -1,13 +1,9 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "./dist", - "rootDir": "./src" - }, - "include": ["src/**/*"], - "references": [ - { "path": "../types" }, - { "path": "../config" }, - { "path": "../logger" } - ] -} +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "./dist", + "rootDir": "./src" + }, + "include": ["src/**/*"], + "references": [{ "path": "../types" }, { "path": "../config" }, { "path": "../logger" }] +} diff --git a/libs/shutdown/package.json b/libs/shutdown/package.json index 7218a62..b53779a 100644 --- a/libs/shutdown/package.json +++ b/libs/shutdown/package.json @@ -1,26 +1,27 @@ -{ - "name": "@stock-bot/shutdown", - "version": "1.0.0", - "description": "Graceful shutdown management for Stock Bot platform", - "type": "module", - "main": "dist/index.js", - "types": "dist/index.d.ts", "scripts": { - "build": "tsc", - "clean": "rm -rf dist", - "test": "bun test" - }, - "dependencies": {}, - "devDependencies": { - "typescript": "^5.0.0", - "@types/node": "^20.0.0" - }, - "exports": { - ".": { - "import": "./dist/index.js", - "types": "./dist/index.d.ts" - } - }, - "files": [ - "dist" - ] -} +{ + "name": "@stock-bot/shutdown", + "version": "1.0.0", + "description": "Graceful shutdown management for Stock Bot platform", + "type": "module", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "scripts": { + "build": "tsc", + "clean": "rm -rf dist", + "test": "bun test" + }, + "dependencies": {}, + "devDependencies": { + "typescript": "^5.0.0", + "@types/node": "^20.0.0" + }, + "exports": { + ".": { + "import": "./dist/index.js", + "types": "./dist/index.d.ts" + } + }, + "files": [ + "dist" + ] +} diff --git a/libs/shutdown/tsconfig.json b/libs/shutdown/tsconfig.json index e8f78e0..a382ed1 100644 --- a/libs/shutdown/tsconfig.json +++ b/libs/shutdown/tsconfig.json @@ -1,13 +1,9 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "./dist", - "rootDir": "./src" - }, - "include": ["src/**/*"], - "references": [ - { "path": "../types" }, - { "path": "../config" }, - { "path": "../logger" } - ] -} +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "./dist", + "rootDir": "./src" + }, + "include": ["src/**/*"], + "references": [{ "path": "../types" }, { "path": "../config" }, { "path": "../logger" }] +} diff --git a/libs/strategy-engine/tsconfig.json b/libs/strategy-engine/tsconfig.json index b6d6746..33af615 100644 --- a/libs/strategy-engine/tsconfig.json +++ b/libs/strategy-engine/tsconfig.json @@ -1,15 +1,16 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "./dist", - "rootDir": "./src" - }, - "include": ["src/**/*"], "references": [ - { "path": "../types" }, - { "path": "../logger" }, - { "path": "../utils" }, - { "path": "../event-bus" }, - { "path": "../data-frame" }, - { "path": "../vector-engine" } - ] -} +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "./dist", + "rootDir": "./src" + }, + "include": ["src/**/*"], + "references": [ + { "path": "../types" }, + { "path": "../logger" }, + { "path": "../utils" }, + { "path": "../event-bus" }, + { "path": "../data-frame" }, + { "path": "../vector-engine" } + ] +} diff --git a/libs/types/package.json b/libs/types/package.json index 717f169..3d438fb 100644 --- a/libs/types/package.json +++ b/libs/types/package.json @@ -1,35 +1,35 @@ -{ - "name": "@stock-bot/types", - "version": "1.0.0", - "description": "Shared type definitions for Stock Bot platform", - "main": "dist/index.js", - "types": "dist/index.d.ts", - "type": "module", - "scripts": { - "build": "tsc", - "type-check": "tsc --noEmit", - "clean": "rimraf dist", - "test": "bun test" - }, - "devDependencies": { - "@types/node": "^20.11.0", - "typescript": "^5.3.0", - "bun-types": "^1.2.15" - }, - "keywords": [ - "types", - "typescript", - "stock-bot" - ], - "exports": { - ".": { - "import": "./dist/index.js", - "require": "./dist/index.js", - "types": "./dist/index.d.ts" - } - }, - "files": [ - "dist", - "README.md" - ] -} +{ + "name": "@stock-bot/types", + "version": "1.0.0", + "description": "Shared type definitions for Stock Bot platform", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "type": "module", + "scripts": { + "build": "tsc", + "type-check": "tsc --noEmit", + "clean": "rimraf dist", + "test": "bun test" + }, + "devDependencies": { + "@types/node": "^20.11.0", + "typescript": "^5.3.0", + "bun-types": "^1.2.15" + }, + "keywords": [ + "types", + "typescript", + "stock-bot" + ], + "exports": { + ".": { + "import": "./dist/index.js", + "require": "./dist/index.js", + "types": "./dist/index.d.ts" + } + }, + "files": [ + "dist", + "README.md" + ] +} diff --git a/libs/types/tsconfig.json b/libs/types/tsconfig.json index 1c8366f..442d0da 100644 --- a/libs/types/tsconfig.json +++ b/libs/types/tsconfig.json @@ -1,9 +1,9 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "./dist", - "rootDir": "./src" - }, - "include": ["src/**/*"], - "references": [] -} +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "./dist", + "rootDir": "./src" + }, + "include": ["src/**/*"], + "references": [] +} diff --git a/libs/utils/package.json b/libs/utils/package.json index 67d8e56..2cf648b 100644 --- a/libs/utils/package.json +++ b/libs/utils/package.json @@ -1,33 +1,33 @@ -{ - "name": "@stock-bot/utils", - "version": "1.0.0", - "description": "Common utility functions for stock-bot services", - "main": "dist/index.js", - "types": "dist/index.d.ts", - "type": "module", - "scripts": { - "build": "tsc", - "clean": "rimraf dist", - "test": "bun test" - }, - "dependencies": { - "@stock-bot/types": "*", - "date-fns": "^2.30.0" - }, - "devDependencies": { - "@types/node": "^20.11.0", - "typescript": "^5.3.0", - "bun-types": "^1.2.15" - }, - "exports": { - ".": { - "import": "./dist/index.js", - "require": "./dist/index.js", - "types": "./dist/index.d.ts" - } - }, - "files": [ - "dist", - "README.md" - ] -} +{ + "name": "@stock-bot/utils", + "version": "1.0.0", + "description": "Common utility functions for stock-bot services", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "type": "module", + "scripts": { + "build": "tsc", + "clean": "rimraf dist", + "test": "bun test" + }, + "dependencies": { + "@stock-bot/types": "*", + "date-fns": "^2.30.0" + }, + "devDependencies": { + "@types/node": "^20.11.0", + "typescript": "^5.3.0", + "bun-types": "^1.2.15" + }, + "exports": { + ".": { + "import": "./dist/index.js", + "require": "./dist/index.js", + "types": "./dist/index.d.ts" + } + }, + "files": [ + "dist", + "README.md" + ] +} diff --git a/libs/utils/src/calculations/basic-calculations.ts b/libs/utils/src/calculations/basic-calculations.ts index 6c93da3..b8a5dac 100644 --- a/libs/utils/src/calculations/basic-calculations.ts +++ b/libs/utils/src/calculations/basic-calculations.ts @@ -7,7 +7,7 @@ * Calculate percentage change between two values */ export function percentageChange(oldValue: number, newValue: number): number { - if (oldValue === 0) return 0; + if (oldValue === 0) {return 0;} return ((newValue - oldValue) / oldValue) * 100; } @@ -15,7 +15,7 @@ export function percentageChange(oldValue: number, newValue: number): number { * Calculate simple return */ export function simpleReturn(initialPrice: number, finalPrice: number): number { - if (initialPrice === 0) return 0; + if (initialPrice === 0) {return 0;} return (finalPrice - initialPrice) / initialPrice; } @@ -23,7 +23,7 @@ export function simpleReturn(initialPrice: number, finalPrice: number): number { * Calculate logarithmic return */ export function logReturn(initialPrice: number, finalPrice: number): number { - if (initialPrice <= 0 || finalPrice <= 0) return 0; + if (initialPrice <= 0 || finalPrice <= 0) {return 0;} return Math.log(finalPrice / initialPrice); } @@ -31,7 +31,7 @@ export function logReturn(initialPrice: number, finalPrice: number): number { * Calculate compound annual growth rate (CAGR) */ export function cagr(startValue: number, endValue: number, years: number): number { - if (years <= 0 || startValue <= 0 || endValue <= 0) return 0; + if (years <= 0 || startValue <= 0 || endValue <= 0) {return 0;} return Math.pow(endValue / startValue, 1 / years) - 1; } @@ -91,8 +91,8 @@ export function internalRateOfReturn( dnpv += (-j * cashFlows[j]) / Math.pow(1 + rate, j + 1); } - if (Math.abs(npv) < 1e-10) break; - if (Math.abs(dnpv) < 1e-10) break; + if (Math.abs(npv) < 1e-10) {break;} + if (Math.abs(dnpv) < 1e-10) {break;} rate = rate - npv / dnpv; } @@ -186,7 +186,7 @@ export function bondYield( ); const diff = calculatedPrice - price; - if (Math.abs(diff) < tolerance) break; + if (Math.abs(diff) < tolerance) {break;} // Numerical derivative const delta = 0.0001; @@ -199,7 +199,7 @@ export function bondYield( ); const derivative = (priceUp - calculatedPrice) / delta; - if (Math.abs(derivative) < tolerance) break; + if (Math.abs(derivative) < tolerance) {break;} yield_ = yield_ - diff / derivative; } @@ -358,7 +358,7 @@ export function dividendDiscountModel( growthRate: number, discountRate: number ): number { - if (discountRate <= growthRate) return NaN; // Indeterminate + if (discountRate <= growthRate) {return NaN;} // Indeterminate return (currentDividend * (1 + growthRate)) / (discountRate - growthRate); } diff --git a/libs/utils/src/calculations/correlation-analysis.ts b/libs/utils/src/calculations/correlation-analysis.ts index 261a829..bfbc77f 100644 --- a/libs/utils/src/calculations/correlation-analysis.ts +++ b/libs/utils/src/calculations/correlation-analysis.ts @@ -488,7 +488,7 @@ export function dccModel( const T = data[0].length; // Initialize parameters [alpha, beta] - let params = [0.01, 0.95]; + const params = [0.01, 0.95]; // Standardize data (assume unit variance for simplicity) const standardizedData = data.map(series => { @@ -918,7 +918,7 @@ function shuffleArray(array: T[]): T[] { * Helper function to calculate the average of an array of numbers */ function average(arr: number[]): number { - if (arr.length === 0) return 0; + if (arr.length === 0) {return 0;} return arr.reduce((a, b) => a + b, 0) / arr.length; } @@ -963,8 +963,8 @@ function erf(x: number): number { function betaIncomplete(a: number, b: number, x: number): number { // Better approximation of incomplete beta function - if (x === 0) return 0; - if (x === 1) return 1; + if (x === 0) {return 0;} + if (x === 1) {return 1;} // Use continued fraction approximation (Lentz's algorithm) const fpmin = 1e-30; @@ -984,7 +984,7 @@ function betaIncomplete(a: number, b: number, x: number): number { function betaContinuedFraction(a: number, b: number, x: number): number { let c = 1; let d = 1 - ((a + b) * x) / (a + 1); - if (Math.abs(d) < fpmin) d = fpmin; + if (Math.abs(d) < fpmin) {d = fpmin;} d = 1 / d; let h = d; @@ -992,22 +992,22 @@ function betaIncomplete(a: number, b: number, x: number): number { const m2 = 2 * m; const aa = (m * (b - m) * x) / ((a + m2 - 1) * (a + m2)); d = 1 + aa * d; - if (Math.abs(d) < fpmin) d = fpmin; + if (Math.abs(d) < fpmin) {d = fpmin;} c = 1 + aa / c; - if (Math.abs(c) < fpmin) c = fpmin; + if (Math.abs(c) < fpmin) {c = fpmin;} d = 1 / d; h *= d * c; const bb = (-(a + m) * (a + b + m) * x) / ((a + m2) * (a + m2 + 1)); d = 1 + bb * d; - if (Math.abs(d) < fpmin) d = fpmin; + if (Math.abs(d) < fpmin) {d = fpmin;} c = 1 + bb / c; - if (Math.abs(c) < fpmin) c = fpmin; + if (Math.abs(c) < fpmin) {c = fpmin;} d = 1 / d; const del = d * c; h *= del; - if (Math.abs(del - 1) < eps) break; + if (Math.abs(del - 1) < eps) {break;} } return h; @@ -1055,11 +1055,11 @@ function eigenDecomposition(matrix: number[][]): { const newLambda = Av.reduce((sum, val, i) => sum + val * v[i], 0); const norm = Math.sqrt(Av.reduce((sum, val) => sum + val * val, 0)); - if (norm === 0) break; + if (norm === 0) {break;} v = Av.map(val => val / norm); - if (Math.abs(newLambda - lambda) < 1e-10) break; + if (Math.abs(newLambda - lambda) < 1e-10) {break;} lambda = newLambda; } @@ -1215,8 +1215,8 @@ function arModel(y: number[], lag: number): { rss: number } { function fCDF(f: number, df1: number, df2: number): number { // Approximation for F distribution CDF - if (f <= 0) return 0; - if (f === Infinity) return 1; + if (f <= 0) {return 0;} + if (f === Infinity) {return 1;} const x = df2 / (df2 + df1 * f); return 1 - betaIncomplete(df2 / 2, df1 / 2, x); diff --git a/libs/utils/src/calculations/market-statistics.ts b/libs/utils/src/calculations/market-statistics.ts index 2582509..84f9fd6 100644 --- a/libs/utils/src/calculations/market-statistics.ts +++ b/libs/utils/src/calculations/market-statistics.ts @@ -55,7 +55,7 @@ export interface MarketRegime { * Volume Weighted Average Price (VWAP) */ export function VWAP(ohlcv: OHLCVData[]): number[] { - if (ohlcv.length === 0) return []; + if (ohlcv.length === 0) {return [];} const vwap: number[] = []; let cumulativeVolumePrice = 0; @@ -76,7 +76,7 @@ export function VWAP(ohlcv: OHLCVData[]): number[] { * Time Weighted Average Price (TWAP) */ export function TWAP(prices: number[], timeWeights?: number[]): number { - if (prices.length === 0) return 0; + if (prices.length === 0) {return 0;} if (!timeWeights) { return prices.reduce((sum, price) => sum + price, 0) / prices.length; @@ -227,9 +227,9 @@ export function identifyMarketRegime( // Determine volatility level let volatilityLevel: 'low' | 'medium' | 'high'; - if (volatility < 0.01) volatilityLevel = 'low'; - else if (volatility < 0.03) volatilityLevel = 'medium'; - else volatilityLevel = 'high'; + if (volatility < 0.01) {volatilityLevel = 'low';} + else if (volatility < 0.03) {volatilityLevel = 'medium';} + else {volatilityLevel = 'high';} // Determine regime let regime: 'trending' | 'ranging' | 'volatile' | 'quiet'; @@ -281,7 +281,7 @@ export function OrderBookImbalance( const totalVolume = totalBidVolume + totalAskVolume; - if (totalVolume === 0) return 0; + if (totalVolume === 0) {return 0;} return (totalBidVolume - totalAskVolume) / totalVolume; } @@ -452,10 +452,10 @@ export function MarketStress( const overallStress = volatilityStress * 0.4 + liquidityStress * 0.3 + correlationStress * 0.3; let stressLevel: 'low' | 'medium' | 'high' | 'extreme'; - if (overallStress < 0.25) stressLevel = 'low'; - else if (overallStress < 0.5) stressLevel = 'medium'; - else if (overallStress < 0.75) stressLevel = 'high'; - else stressLevel = 'extreme'; + if (overallStress < 0.25) {stressLevel = 'low';} + else if (overallStress < 0.5) {stressLevel = 'medium';} + else if (overallStress < 0.75) {stressLevel = 'high';} + else {stressLevel = 'extreme';} return { stressLevel, @@ -474,7 +474,7 @@ export function RealizedSpread( midPrices: number[], timeWindow: number = 5 // minutes ): number { - if (trades.length === 0 || midPrices.length === 0) return 0; + if (trades.length === 0 || midPrices.length === 0) {return 0;} let totalSpread = 0; let count = 0; @@ -541,7 +541,7 @@ export function ImplementationShortfall( * Amihud Illiquidity Measure (price impact per unit of volume) */ export function amihudIlliquidity(ohlcv: OHLCVData[], lookbackPeriod: number = 252): number { - if (ohlcv.length < lookbackPeriod) return 0; + if (ohlcv.length < lookbackPeriod) {return 0;} const recentData = ohlcv.slice(-lookbackPeriod); let illiquiditySum = 0; @@ -566,7 +566,7 @@ export function amihudIlliquidity(ohlcv: OHLCVData[], lookbackPeriod: number = 2 * Roll's Spread Estimator (effective spread from serial covariance) */ export function rollSpreadEstimator(prices: number[]): number { - if (prices.length < 3) return 0; + if (prices.length < 3) {return 0;} // Calculate price changes const priceChanges: number[] = []; @@ -594,7 +594,7 @@ export function kyleLambda( priceChanges: number[], orderFlow: number[] // Signed order flow (positive for buys, negative for sells) ): number { - if (priceChanges.length !== orderFlow.length || priceChanges.length < 2) return 0; + if (priceChanges.length !== orderFlow.length || priceChanges.length < 2) {return 0;} // Calculate regression: priceChange = lambda * orderFlow + error const n = priceChanges.length; @@ -623,7 +623,7 @@ export function probabilityInformedTrading( sellVolumes: number[], period: number = 20 ): number { - if (buyVolumes.length !== sellVolumes.length || buyVolumes.length < period) return 0; + if (buyVolumes.length !== sellVolumes.length || buyVolumes.length < period) {return 0;} const recentBuys = buyVolumes.slice(-period); const recentSells = sellVolumes.slice(-period); @@ -647,11 +647,11 @@ export function probabilityInformedTrading( * Herfindahl-Hirschman Index for Volume Concentration */ export function volumeConcentrationHHI(exchanges: Array<{ name: string; volume: number }>): number { - if (exchanges.length === 0) return 0; + if (exchanges.length === 0) {return 0;} const totalVolume = exchanges.reduce((sum, exchange) => sum + exchange.volume, 0); - if (totalVolume === 0) return 0; + if (totalVolume === 0) {return 0;} let hhi = 0; for (const exchange of exchanges) { @@ -670,7 +670,7 @@ export function volumeProfile( ): { [price: number]: number } { const profile: { [price: number]: number } = {}; - if (ohlcv.length === 0) return profile; + if (ohlcv.length === 0) {return profile;} const minPrice = Math.min(...ohlcv.map(candle => candle.low)); const maxPrice = Math.max(...ohlcv.map(candle => candle.high)); @@ -814,11 +814,11 @@ export function garmanKlassVolatility( openPrices.length !== closePrices.length || openPrices.length < 2 ) - return 0; + {return 0;} let sumSquaredTerm1 = 0; let sumSquaredTerm2 = 0; - let sumSquaredTerm3 = 0; + const sumSquaredTerm3 = 0; for (let i = 0; i < openPrices.length; i++) { const logHO = Math.log(highPrices[i] / openPrices[i]); @@ -850,7 +850,7 @@ export function yangZhangVolatility( openPrices.length !== previousClosePrices.length || openPrices.length < 2 ) - return 0; + {return 0;} const k = 0.34 / (1.34 + (openPrices.length + 1) / (previousClosePrices.length - 1)); @@ -877,7 +877,7 @@ export function yangZhangVolatility( * Volume Order Imbalance (VOI) */ export function volumeOrderImbalance(buyVolumes: number[], sellVolumes: number[]): number[] { - if (buyVolumes.length !== sellVolumes.length) return []; + if (buyVolumes.length !== sellVolumes.length) {return [];} const voi: number[] = []; for (let i = 0; i < buyVolumes.length; i++) { @@ -890,7 +890,7 @@ export function volumeOrderImbalance(buyVolumes: number[], sellVolumes: number[] * Cumulative Volume Delta (CVD) */ export function cumulativeVolumeDelta(buyVolumes: number[], sellVolumes: number[]): number[] { - if (buyVolumes.length !== sellVolumes.length) return []; + if (buyVolumes.length !== sellVolumes.length) {return [];} const cvd: number[] = []; let cumulativeDelta = 0; @@ -905,7 +905,7 @@ export function cumulativeVolumeDelta(buyVolumes: number[], sellVolumes: number[ * Market Order Ratio */ export function marketOrderRatio(marketOrders: number[], limitOrders: number[]): number[] { - if (marketOrders.length !== limitOrders.length) return []; + if (marketOrders.length !== limitOrders.length) {return [];} const ratios: number[] = []; for (let i = 0; i < marketOrders.length; i++) { @@ -920,12 +920,12 @@ export function marketOrderRatio(marketOrders: number[], limitOrders: number[]): */ function average(arr: number[]): number { - if (arr.length === 0) return 0; + if (arr.length === 0) {return 0;} return arr.reduce((a, b) => a + b, 0) / arr.length; } function calculateVolatility(returns: number[]): number { - if (returns.length < 2) return 0; + if (returns.length < 2) {return 0;} const mean = returns.reduce((sum, ret) => sum + ret, 0) / returns.length; const variance = @@ -935,7 +935,7 @@ function calculateVolatility(returns: number[]): number { } function calculateCorrelation(x: number[], y: number[]): number { - if (x.length !== y.length || x.length < 2) return 0; + if (x.length !== y.length || x.length < 2) {return 0;} const n = x.length; const meanX = x.reduce((sum, val) => sum + val, 0) / n; @@ -960,14 +960,14 @@ function calculateCorrelation(x: number[], y: number[]): number { } function calculateVariance(values: number[]): number { - if (values.length < 2) return 0; + if (values.length < 2) {return 0;} const mean = values.reduce((sum, val) => sum + val, 0) / values.length; return values.reduce((sum, val) => sum + Math.pow(val - mean, 2), 0) / (values.length - 1); } function calculateCovariance(x: number[], y: number[]): number { - if (x.length !== y.length || x.length < 2) return 0; + if (x.length !== y.length || x.length < 2) {return 0;} const n = x.length; const meanX = x.reduce((sum, val) => sum + val, 0) / n; diff --git a/libs/utils/src/calculations/options-pricing.ts b/libs/utils/src/calculations/options-pricing.ts index e93cf89..755affd 100644 --- a/libs/utils/src/calculations/options-pricing.ts +++ b/libs/utils/src/calculations/options-pricing.ts @@ -605,7 +605,7 @@ function erf(x: number): number { */ function boxMullerTransform(): number { let u1 = Math.random(); - let u2 = Math.random(); + const u2 = Math.random(); // Ensure u1 is not zero while (u1 === 0) { diff --git a/libs/utils/src/calculations/performance-metrics.ts b/libs/utils/src/calculations/performance-metrics.ts index e8b7b5a..284c21c 100644 --- a/libs/utils/src/calculations/performance-metrics.ts +++ b/libs/utils/src/calculations/performance-metrics.ts @@ -153,7 +153,7 @@ export function analyzeDrawdowns( }> = []; let currentDrawdownStart: Date | null = null; - let drawdowns: number[] = []; + const drawdowns: number[] = []; for (let i = 1; i < equityCurve.length; i++) { const current = equityCurve[i]; @@ -297,7 +297,7 @@ export function calculateRollingMetrics( windowSize: number, metricType: 'sharpe' | 'volatility' | 'return' = 'sharpe' ): number[] { - if (returns.length < windowSize) return []; + if (returns.length < windowSize) {return [];} const rollingMetrics: number[] = []; @@ -377,7 +377,7 @@ export function strategyPerformanceAttribution( * Calculate Omega ratio */ export function omegaRatio(returns: number[], threshold: number = 0): number { - if (returns.length === 0) return 0; + if (returns.length === 0) {return 0;} const gains = returns .filter(ret => ret > threshold) @@ -393,7 +393,7 @@ export function omegaRatio(returns: number[], threshold: number = 0): number { * Calculate gain-to-pain ratio */ export function gainToPainRatio(returns: number[]): number { - if (returns.length === 0) return 0; + if (returns.length === 0) {return 0;} const totalGain = returns.reduce((sum, ret) => sum + ret, 0); const totalPain = returns.filter(ret => ret < 0).reduce((sum, ret) => sum + Math.abs(ret), 0); @@ -405,12 +405,12 @@ export function gainToPainRatio(returns: number[]): number { * Calculate Martin ratio (modified Sharpe with downside deviation) */ export function martinRatio(returns: number[], riskFreeRate: number = 0): number { - if (returns.length === 0) return 0; + if (returns.length === 0) {return 0;} const averageReturn = returns.reduce((sum, ret) => sum + ret, 0) / returns.length; const downsideReturns = returns.filter(ret => ret < riskFreeRate); - if (downsideReturns.length === 0) return Infinity; + if (downsideReturns.length === 0) {return Infinity;} const downsideDeviation = Math.sqrt( downsideReturns.reduce((sum, ret) => sum + Math.pow(ret - riskFreeRate, 2), 0) / returns.length @@ -610,7 +610,7 @@ export function tailRatio(returns: number[], tailPercent: number = 0.1): number const numReturns = returns.length; const tailSize = Math.floor(numReturns * tailPercent); - if (tailSize === 0) return 0; + if (tailSize === 0) {return 0;} const sortedReturns = [...returns].sort((a, b) => a - b); const worstTail = sortedReturns.slice(0, tailSize); @@ -631,7 +631,7 @@ export function calculateRollingBeta( windowSize: number ): number[] { if (portfolioReturns.length !== marketReturns.length || portfolioReturns.length < windowSize) - return []; + {return [];} const rollingBetas: number[] = []; @@ -668,7 +668,7 @@ export function calculateRollingAlpha( windowSize: number ): number[] { if (portfolioReturns.length !== marketReturns.length || portfolioReturns.length < windowSize) - return []; + {return [];} const rollingAlphas: number[] = []; @@ -728,7 +728,7 @@ export function moneyWeightedRateOfReturn( // Helper functions function calculateSharpeRatio(returns: number[], riskFreeRate: number = 0): number { - if (returns.length < 2) return 0; + if (returns.length < 2) {return 0;} const avgReturn = returns.reduce((sum, ret) => sum + ret, 0) / returns.length; const variance = @@ -739,7 +739,7 @@ function calculateSharpeRatio(returns: number[], riskFreeRate: number = 0): numb } function calculateVolatility(returns: number[]): number { - if (returns.length < 2) return 0; + if (returns.length < 2) {return 0;} const mean = returns.reduce((sum, ret) => sum + ret, 0) / returns.length; const variance = @@ -749,7 +749,7 @@ function calculateVolatility(returns: number[]): number { } function calculateBeta(portfolioReturns: number[], marketReturns: number[]): number { - if (portfolioReturns.length !== marketReturns.length || portfolioReturns.length < 2) return 0; + if (portfolioReturns.length !== marketReturns.length || portfolioReturns.length < 2) {return 0;} const portfolioMean = portfolioReturns.reduce((sum, ret) => sum + ret, 0) / portfolioReturns.length; @@ -786,13 +786,13 @@ function calculateAlpha( } function calculateSkewness(returns: number[]): number { - if (returns.length < 3) return 0; + if (returns.length < 3) {return 0;} const mean = returns.reduce((sum, ret) => sum + ret, 0) / returns.length; const variance = returns.reduce((sum, ret) => sum + Math.pow(ret - mean, 2), 0) / returns.length; const stdDev = Math.sqrt(variance); - if (stdDev === 0) return 0; + if (stdDev === 0) {return 0;} const skew = returns.reduce((sum, ret) => sum + Math.pow((ret - mean) / stdDev, 3), 0) / returns.length; @@ -801,13 +801,13 @@ function calculateSkewness(returns: number[]): number { } function calculateKurtosis(returns: number[]): number { - if (returns.length < 4) return 0; + if (returns.length < 4) {return 0;} const mean = returns.reduce((sum, ret) => sum + ret, 0) / returns.length; const variance = returns.reduce((sum, ret) => sum + Math.pow(ret - mean, 2), 0) / returns.length; const stdDev = Math.sqrt(variance); - if (stdDev === 0) return 0; + if (stdDev === 0) {return 0;} const kurt = returns.reduce((sum, ret) => sum + Math.pow((ret - mean) / stdDev, 4), 0) / returns.length; diff --git a/libs/utils/src/calculations/portfolio-analytics.ts b/libs/utils/src/calculations/portfolio-analytics.ts index 59f0592..606d8c6 100644 --- a/libs/utils/src/calculations/portfolio-analytics.ts +++ b/libs/utils/src/calculations/portfolio-analytics.ts @@ -209,7 +209,7 @@ export function riskParityOptimization(covarianceMatrix: number[][]): PortfolioO const sum = newWeights.reduce((s, w) => s + w, 0); weights = newWeights.map(w => w / sum); - if (converged) break; + if (converged) {break;} } const portfolioVariance = calculatePortfolioVariance(weights, covarianceMatrix); @@ -402,7 +402,7 @@ export function calculateEfficientFrontier( volatility: number; sharpeRatio: number; }> { - if (returns.length !== symbols.length || returns.length < 2) return []; + if (returns.length !== symbols.length || returns.length < 2) {return [];} const n = returns.length; const results: Array<{ @@ -456,7 +456,7 @@ export function findMinimumVariancePortfolio( returns: number[][], symbols: string[] ): PortfolioOptimizationResult | null { - if (returns.length !== symbols.length || returns.length < 2) return null; + if (returns.length !== symbols.length || returns.length < 2) {return null;} const covarianceMatrix = calculateCovarianceMatrix(returns); const n = returns.length; @@ -517,7 +517,7 @@ function calculateCovarianceMatrix(returns: number[][]): number[][] { } function calculateCovariance(x: number[], y: number[]): number { - if (x.length !== y.length || x.length < 2) return 0; + if (x.length !== y.length || x.length < 2) {return 0;} const n = x.length; const meanX = x.reduce((sum, val) => sum + val, 0) / n; @@ -559,7 +559,7 @@ function findMinimumVarianceWeights( const currentReturn = weights.reduce((sum, w, i) => sum + w * expectedReturns[i], 0); const returnDiff = targetReturn - currentReturn; - if (Math.abs(returnDiff) < 0.001) break; + if (Math.abs(returnDiff) < 0.001) {break;} // Adjust weights proportionally to expected returns const totalExpectedReturn = expectedReturns.reduce((sum, r) => sum + Math.abs(r), 0); diff --git a/libs/utils/src/calculations/position-sizing.ts b/libs/utils/src/calculations/position-sizing.ts index 96d7ac4..2f6dd8f 100644 --- a/libs/utils/src/calculations/position-sizing.ts +++ b/libs/utils/src/calculations/position-sizing.ts @@ -31,8 +31,8 @@ export function fixedRiskPositionSize(params: PositionSizeParams): number { const { accountSize, riskPercentage, entryPrice, stopLoss, leverage = 1 } = params; // Input validation - if (accountSize <= 0 || riskPercentage <= 0 || entryPrice <= 0 || leverage <= 0) return 0; - if (entryPrice === stopLoss) return 0; + if (accountSize <= 0 || riskPercentage <= 0 || entryPrice <= 0 || leverage <= 0) {return 0;} + if (entryPrice === stopLoss) {return 0;} const riskAmount = accountSize * (riskPercentage / 100); const riskPerShare = Math.abs(entryPrice - stopLoss); @@ -48,7 +48,7 @@ export function kellyPositionSize(params: KellyParams, accountSize: number): num const { winRate, averageWin, averageLoss } = params; // Validate inputs - if (averageLoss === 0 || winRate <= 0 || winRate >= 1 || averageWin <= 0) return 0; + if (averageLoss === 0 || winRate <= 0 || winRate >= 1 || averageWin <= 0) {return 0;} const lossRate = 1 - winRate; const winLossRatio = averageWin / Math.abs(averageLoss); @@ -72,7 +72,7 @@ export function fractionalKellyPositionSize( fraction: number = 0.25 ): number { // Input validation - if (fraction <= 0 || fraction > 1) return 0; + if (fraction <= 0 || fraction > 1) {return 0;} const fullKelly = kellyPositionSize(params, accountSize); return fullKelly * fraction; @@ -88,7 +88,7 @@ export function volatilityTargetPositionSize( const { price, volatility, targetVolatility } = params; // Input validation - if (volatility <= 0 || price <= 0 || targetVolatility <= 0 || accountSize <= 0) return 0; + if (volatility <= 0 || price <= 0 || targetVolatility <= 0 || accountSize <= 0) {return 0;} const volatilityRatio = targetVolatility / volatility; const basePositionValue = accountSize * Math.min(volatilityRatio, 2); // Cap at 2x leverage @@ -105,7 +105,7 @@ export function equalWeightPositionSize( price: number ): number { // Input validation - if (numberOfPositions <= 0 || price <= 0 || accountSize <= 0) return 0; + if (numberOfPositions <= 0 || price <= 0 || accountSize <= 0) {return 0;} const positionValue = accountSize / numberOfPositions; return Math.floor(positionValue / price); @@ -121,7 +121,7 @@ export function atrBasedPositionSize( atrMultiplier: number = 2, price: number ): number { - if (atrValue === 0 || price === 0) return 0; + if (atrValue === 0 || price === 0) {return 0;} const riskAmount = accountSize * (riskPercentage / 100); const stopDistance = atrValue * atrMultiplier; @@ -143,11 +143,11 @@ export function expectancyPositionSize( ): number { // Input validation if (accountSize <= 0 || winRate <= 0 || winRate >= 1 || averageWin <= 0 || averageLoss === 0) - return 0; + {return 0;} const expectancy = winRate * averageWin - (1 - winRate) * Math.abs(averageLoss); - if (expectancy <= 0) return 0; + if (expectancy <= 0) {return 0;} // Scale position size based on expectancy relative to average loss // Higher expectancy relative to risk allows for larger position @@ -167,7 +167,7 @@ export function monteCarloPositionSize( simulations: number = 1000, confidenceLevel: number = 0.95 ): number { - if (historicalReturns.length === 0) return 0; + if (historicalReturns.length === 0) {return 0;} const outcomes: number[] = []; const mean = historicalReturns.reduce((sum, ret) => sum + ret, 0) / historicalReturns.length; @@ -230,7 +230,7 @@ export function sharpeOptimizedPositionSize( ): number { // Input validation if (volatility <= 0 || accountSize <= 0 || expectedReturn <= riskFreeRate || maxLeverage <= 0) - return 0; + {return 0;} // Kelly criterion with Sharpe ratio optimization const excessReturn = expectedReturn - riskFreeRate; const kellyFraction = excessReturn / (volatility * volatility); @@ -251,7 +251,7 @@ export function fixedFractionalPositionSize( price: number ): number { // Input validation - if (stopLossPercentage <= 0 || price <= 0 || riskPercentage <= 0 || accountSize <= 0) return 0; + if (stopLossPercentage <= 0 || price <= 0 || riskPercentage <= 0 || accountSize <= 0) {return 0;} const riskAmount = accountSize * (riskPercentage / 100); const stopLossAmount = price * (stopLossPercentage / 100); @@ -269,7 +269,7 @@ export function volatilityAdjustedPositionSize( price: number ): number { // Input validation - if (assetVolatility <= 0 || price <= 0 || targetVolatility <= 0 || accountSize <= 0) return 0; + if (assetVolatility <= 0 || price <= 0 || targetVolatility <= 0 || accountSize <= 0) {return 0;} const volatilityRatio = targetVolatility / assetVolatility; const cappedRatio = Math.min(volatilityRatio, 3); // Cap at 3x leverage @@ -286,7 +286,7 @@ export function correlationAdjustedPositionSize( existingPositions: Array<{ size: number; correlation: number }>, maxCorrelationRisk: number = 0.3 ): number { - if (existingPositions.length === 0 || basePositionSize <= 0) return basePositionSize; + if (existingPositions.length === 0 || basePositionSize <= 0) {return basePositionSize;} // Calculate portfolio correlation risk // This should consider the correlation between the new position and existing ones @@ -310,7 +310,7 @@ export function calculatePortfolioHeat( accountSize: number ): number { // Input validation - if (accountSize <= 0 || positions.length === 0) return 0; + if (accountSize <= 0 || positions.length === 0) {return 0;} const totalRisk = positions.reduce((sum, position) => { // Ensure risk values are positive @@ -331,8 +331,8 @@ export function dynamicPositionSize( maxDrawdownThreshold: number = 0.1 ): number { // Input validation - if (basePositionSize <= 0 || marketVolatility <= 0 || normalVolatility <= 0) return 0; - if (drawdownLevel < 0 || maxDrawdownThreshold <= 0) return basePositionSize; + if (basePositionSize <= 0 || marketVolatility <= 0 || normalVolatility <= 0) {return 0;} + if (drawdownLevel < 0 || maxDrawdownThreshold <= 0) {return basePositionSize;} // Volatility adjustment - reduce size when volatility is high const volatilityAdjustment = Math.min(normalVolatility / marketVolatility, 2); // Cap at 2x @@ -354,7 +354,7 @@ export function liquidityConstrainedPositionSize( maxVolumePercentage: number = 0.05, price: number ): number { - if (averageDailyVolume === 0 || price === 0) return 0; + if (averageDailyVolume === 0 || price === 0) {return 0;} const maxShares = averageDailyVolume * maxVolumePercentage; @@ -372,7 +372,7 @@ export function multiTimeframePositionSize( baseRiskPercentage: number = 1 ): number { // Input validation - if (accountSize <= 0 || baseRiskPercentage <= 0) return 0; + if (accountSize <= 0 || baseRiskPercentage <= 0) {return 0;} // Clamp signals to valid range const clampedShort = Math.max(-1, Math.min(1, shortTermSignal)); @@ -396,18 +396,18 @@ export function riskParityPositionSize( targetRisk: number, accountSize: number ): number[] { - if (assets.length === 0) return []; + if (assets.length === 0) {return [];} // Calculate inverse volatility weights const totalInverseVol = assets.reduce((sum, asset) => { - if (asset.volatility === 0) return sum; + if (asset.volatility === 0) {return sum;} return sum + 1 / asset.volatility; }, 0); - if (totalInverseVol === 0) return assets.map(() => 0); + if (totalInverseVol === 0) {return assets.map(() => 0);} return assets.map(asset => { - if (asset.volatility === 0 || asset.price === 0) return 0; + if (asset.volatility === 0 || asset.price === 0) {return 0;} // Calculate weight based on inverse volatility const weight = 1 / asset.volatility / totalInverseVol; @@ -468,7 +468,7 @@ export function optimalFPositionSize( historicalReturns: number[], maxIterations: number = 100 ): number { - if (historicalReturns.length === 0 || accountSize <= 0) return 0; + if (historicalReturns.length === 0 || accountSize <= 0) {return 0;} // Convert returns to P&L per unit const pnlValues = historicalReturns.map(ret => ret * 1000); // Assuming $1000 per unit @@ -512,7 +512,7 @@ export function secureFPositionSize( historicalReturns: number[], confidenceLevel: number = 0.95 ): number { - if (historicalReturns.length === 0 || accountSize <= 0) return 0; + if (historicalReturns.length === 0 || accountSize <= 0) {return 0;} // Sort returns to find worst-case scenarios const sortedReturns = [...historicalReturns].sort((a, b) => a - b); @@ -523,7 +523,7 @@ export function secureFPositionSize( const maxLoss = Math.abs(worstCaseReturn); const maxRiskPercentage = 0.02; // Never risk more than 2% on worst case - if (maxLoss === 0) return accountSize * 0.1; // Default to 10% if no historical losses + if (maxLoss === 0) {return accountSize * 0.1;} // Default to 10% if no historical losses const secureF = Math.min(maxRiskPercentage / maxLoss, 0.25); // Cap at 25% diff --git a/libs/utils/src/calculations/risk-metrics.ts b/libs/utils/src/calculations/risk-metrics.ts index c7d1669..f0d4c45 100644 --- a/libs/utils/src/calculations/risk-metrics.ts +++ b/libs/utils/src/calculations/risk-metrics.ts @@ -9,7 +9,7 @@ import { RiskMetrics, treynorRatio } from './index'; * Calculate Value at Risk (VaR) using historical simulation */ export function valueAtRisk(returns: number[], confidenceLevel: number = 0.95): number { - if (returns.length === 0) return 0; + if (returns.length === 0) {return 0;} const sortedReturns = [...returns].sort((a, b) => a - b); const index = Math.floor((1 - confidenceLevel) * sortedReturns.length); @@ -21,12 +21,12 @@ export function valueAtRisk(returns: number[], confidenceLevel: number = 0.95): * Calculate Conditional Value at Risk (CVaR/Expected Shortfall) */ export function conditionalValueAtRisk(returns: number[], confidenceLevel: number = 0.95): number { - if (returns.length === 0) return 0; + if (returns.length === 0) {return 0;} const sortedReturns = [...returns].sort((a, b) => a - b); const cutoffIndex = Math.floor((1 - confidenceLevel) * sortedReturns.length); - if (cutoffIndex === 0) return sortedReturns[0]; + if (cutoffIndex === 0) {return sortedReturns[0];} const tailReturns = sortedReturns.slice(0, cutoffIndex); return tailReturns.reduce((sum, ret) => sum + ret, 0) / tailReturns.length; @@ -40,7 +40,7 @@ export function parametricVaR( confidenceLevel: number = 0.95, portfolioValue: number = 1 ): number { - if (returns.length === 0) return 0; + if (returns.length === 0) {return 0;} const mean = returns.reduce((sum, ret) => sum + ret, 0) / returns.length; const variance = @@ -57,7 +57,7 @@ export function parametricVaR( * Calculate maximum drawdown */ export function maxDrawdown(equityCurve: number[]): number { - if (equityCurve.length < 2) return 0; + if (equityCurve.length < 2) {return 0;} let maxDD = 0; let peak = equityCurve[0]; @@ -78,11 +78,11 @@ export function maxDrawdown(equityCurve: number[]): number { * Calculate downside deviation */ export function downsideDeviation(returns: number[], targetReturn: number = 0): number { - if (returns.length === 0) return 0; + if (returns.length === 0) {return 0;} const downsideReturns = returns.filter(ret => ret < targetReturn); - if (downsideReturns.length === 0) return 0; + if (downsideReturns.length === 0) {return 0;} const sumSquaredDownside = downsideReturns.reduce( (sum, ret) => sum + Math.pow(ret - targetReturn, 2), @@ -96,14 +96,14 @@ export function downsideDeviation(returns: number[], targetReturn: number = 0): * Calculate Sharpe ratio */ export function sharpeRatio(returns: number[], riskFreeRate: number = 0): number { - if (returns.length < 2) return 0; + if (returns.length < 2) {return 0;} const mean = returns.reduce((sum, ret) => sum + ret, 0) / returns.length; const variance = returns.reduce((sum, ret) => sum + Math.pow(ret - mean, 2), 0) / (returns.length - 1); const stdDev = Math.sqrt(variance); - if (stdDev === 0) return 0; + if (stdDev === 0) {return 0;} return (mean - riskFreeRate) / stdDev; } @@ -172,7 +172,7 @@ export function trackingError(portfolioReturns: number[], benchmarkReturns: numb * Calculate volatility (standard deviation of returns) */ export function volatility(returns: number[]): number { - if (returns.length < 2) return 0; + if (returns.length < 2) {return 0;} const mean = returns.reduce((sum, ret) => sum + ret, 0) / returns.length; const variance = @@ -192,13 +192,13 @@ export function annualizedVolatility(returns: number[], periodsPerYear: number = * Calculate skewness (measure of asymmetry) */ export function skewness(returns: number[]): number { - if (returns.length < 3) return 0; + if (returns.length < 3) {return 0;} const mean = returns.reduce((sum, ret) => sum + ret, 0) / returns.length; const variance = returns.reduce((sum, ret) => sum + Math.pow(ret - mean, 2), 0) / returns.length; const stdDev = Math.sqrt(variance); - if (stdDev === 0) return 0; + if (stdDev === 0) {return 0;} const skew = returns.reduce((sum, ret) => sum + Math.pow((ret - mean) / stdDev, 3), 0) / returns.length; @@ -210,13 +210,13 @@ export function skewness(returns: number[]): number { * Calculate kurtosis (measure of tail heaviness) */ export function kurtosis(returns: number[]): number { - if (returns.length < 4) return 0; + if (returns.length < 4) {return 0;} const mean = returns.reduce((sum, ret) => sum + ret, 0) / returns.length; const variance = returns.reduce((sum, ret) => sum + Math.pow(ret - mean, 2), 0) / returns.length; const stdDev = Math.sqrt(variance); - if (stdDev === 0) return 0; + if (stdDev === 0) {return 0;} const kurt = returns.reduce((sum, ret) => sum + Math.pow((ret - mean) / stdDev, 4), 0) / returns.length; @@ -317,12 +317,12 @@ function getZScore(confidenceLevel: number): number { }; const key = confidenceLevel.toString(); - if (zScores[key]) return zScores[key]; + if (zScores[key]) {return zScores[key];} // For arbitrary confidence levels, use approximation - if (confidenceLevel < 0.5) return -getZScore(1 - confidenceLevel); + if (confidenceLevel < 0.5) {return -getZScore(1 - confidenceLevel);} - if (confidenceLevel >= 0.999) return 3.09; // Cap at 99.9% for numerical stability + if (confidenceLevel >= 0.999) {return 3.09;} // Cap at 99.9% for numerical stability // Approximation of inverse normal CDF const y = Math.sqrt(-2.0 * Math.log(1.0 - confidenceLevel)); @@ -382,6 +382,6 @@ export function riskAdjustedReturn( portfolioRisk: number, riskFreeRate: number = 0 ): number { - if (portfolioRisk === 0) return 0; + if (portfolioRisk === 0) {return 0;} return (portfolioReturn - riskFreeRate) / portfolioRisk; } diff --git a/libs/utils/src/calculations/technical-indicators.ts b/libs/utils/src/calculations/technical-indicators.ts index 4fbbfa1..8860849 100644 --- a/libs/utils/src/calculations/technical-indicators.ts +++ b/libs/utils/src/calculations/technical-indicators.ts @@ -9,7 +9,7 @@ import { OHLCVData } from './index'; * Simple Moving Average */ export function sma(values: number[], period: number): number[] { - if (period > values.length) return []; + if (period > values.length) {return [];} const result: number[] = []; @@ -25,7 +25,7 @@ export function sma(values: number[], period: number): number[] { * Exponential Moving Average */ export function ema(values: number[], period: number): number[] { - if (period > values.length) return []; + if (period > values.length) {return [];} const result: number[] = []; const multiplier = 2 / (period + 1); @@ -46,7 +46,7 @@ export function ema(values: number[], period: number): number[] { * Relative Strength Index (RSI) */ export function rsi(prices: number[], period: number = 14): number[] { - if (period >= prices.length) return []; + if (period >= prices.length) {return [];} const gains: number[] = []; const losses: number[] = []; @@ -141,7 +141,7 @@ export function bollingerBands( * Average True Range (ATR) */ export function atr(ohlcv: OHLCVData[], period: number = 14): number[] { - if (period >= ohlcv.length) return []; + if (period >= ohlcv.length) {return [];} const trueRanges: number[] = []; @@ -166,7 +166,7 @@ export function stochastic( kPeriod: number = 14, dPeriod: number = 3 ): { k: number[]; d: number[] } { - if (kPeriod >= ohlcv.length) return { k: [], d: [] }; + if (kPeriod >= ohlcv.length) {return { k: [], d: [] };} const kValues: number[] = []; @@ -193,7 +193,7 @@ export function stochastic( * Williams %R */ export function williamsR(ohlcv: OHLCVData[], period: number = 14): number[] { - if (period >= ohlcv.length) return []; + if (period >= ohlcv.length) {return [];} const result: number[] = []; @@ -218,7 +218,7 @@ export function williamsR(ohlcv: OHLCVData[], period: number = 14): number[] { * Commodity Channel Index (CCI) */ export function cci(ohlcv: OHLCVData[], period: number = 20): number[] { - if (period >= ohlcv.length) return []; + if (period >= ohlcv.length) {return [];} const typicalPrices = ohlcv.map(d => (d.high + d.low + d.close) / 3); const smaTP = sma(typicalPrices, period); @@ -244,7 +244,7 @@ export function cci(ohlcv: OHLCVData[], period: number = 20): number[] { * Momentum */ export function momentum(prices: number[], period: number = 10): number[] { - if (period >= prices.length) return []; + if (period >= prices.length) {return [];} const result: number[] = []; @@ -260,7 +260,7 @@ export function momentum(prices: number[], period: number = 10): number[] { * Rate of Change (ROC) */ export function roc(prices: number[], period: number = 10): number[] { - if (period >= prices.length) return []; + if (period >= prices.length) {return [];} const result: number[] = []; @@ -280,7 +280,7 @@ export function roc(prices: number[], period: number = 10): number[] { * Money Flow Index (MFI) */ export function mfi(ohlcv: OHLCVData[], period: number = 14): number[] { - if (period >= ohlcv.length) return []; + if (period >= ohlcv.length) {return [];} const typicalPrices = ohlcv.map(d => (d.high + d.low + d.close) / 3); const moneyFlows = ohlcv.map((d, i) => typicalPrices[i] * d.volume); @@ -317,7 +317,7 @@ export function mfi(ohlcv: OHLCVData[], period: number = 14): number[] { * On-Balance Volume (OBV) */ export function obv(ohlcv: OHLCVData[]): number[] { - if (ohlcv.length === 0) return []; + if (ohlcv.length === 0) {return [];} const result: number[] = [ohlcv[0].volume]; @@ -341,7 +341,7 @@ export function obv(ohlcv: OHLCVData[]): number[] { * Accumulation/Distribution Line */ export function accumulationDistribution(ohlcv: OHLCVData[]): number[] { - if (ohlcv.length === 0) return []; + if (ohlcv.length === 0) {return [];} const result: number[] = []; let adLine = 0; @@ -367,7 +367,7 @@ export function accumulationDistribution(ohlcv: OHLCVData[]): number[] { * Chaikin Money Flow (CMF) */ export function chaikinMoneyFlow(ohlcv: OHLCVData[], period: number = 20): number[] { - if (period >= ohlcv.length) return []; + if (period >= ohlcv.length) {return [];} const adValues: number[] = []; @@ -406,7 +406,7 @@ export function parabolicSAR( step: number = 0.02, maxStep: number = 0.2 ): number[] { - if (ohlcv.length < 2) return []; + if (ohlcv.length < 2) {return [];} const result: number[] = []; let trend = 1; // 1 for uptrend, -1 for downtrend @@ -467,7 +467,7 @@ export function parabolicSAR( * Aroon Indicator */ export function aroon(ohlcv: OHLCVData[], period: number = 14): { up: number[]; down: number[] } { - if (period >= ohlcv.length) return { up: [], down: [] }; + if (period >= ohlcv.length) {return { up: [], down: [] };} const up: number[] = []; const down: number[] = []; @@ -505,7 +505,7 @@ export function adx( ohlcv: OHLCVData[], period: number = 14 ): { adx: number[]; plusDI: number[]; minusDI: number[] } { - if (period >= ohlcv.length) return { adx: [], plusDI: [], minusDI: [] }; + if (period >= ohlcv.length) {return { adx: [], plusDI: [], minusDI: [] };} const trueRanges: number[] = []; const plusDM: number[] = []; @@ -572,7 +572,7 @@ export function adx( * Volume Weighted Moving Average (VWMA) */ export function vwma(ohlcv: OHLCVData[], period: number = 20): number[] { - if (period >= ohlcv.length) return []; + if (period >= ohlcv.length) {return [];} const result: number[] = []; @@ -607,7 +607,7 @@ export function pivotPoints(ohlcv: OHLCVData[]): Array<{ support2: number; support3: number; }> { - if (ohlcv.length === 0) return []; + if (ohlcv.length === 0) {return [];} const result: Array<{ pivot: number; diff --git a/libs/utils/src/calculations/volatility-models.ts b/libs/utils/src/calculations/volatility-models.ts index 93d492c..6ed23a8 100644 --- a/libs/utils/src/calculations/volatility-models.ts +++ b/libs/utils/src/calculations/volatility-models.ts @@ -242,7 +242,7 @@ export function identifyVolatilityRegimes( // Classify returns into regimes const regimeSequence = absReturns.map(absRet => { for (let i = 0; i < thresholds.length; i++) { - if (absRet <= thresholds[i]) return i; + if (absRet <= thresholds[i]) {return i;} } return numRegimes - 1; }); @@ -537,7 +537,7 @@ export function calculateYangZhangVolatility( * Parkinson volatility estimator */ export function parkinsonVolatility(ohlcv: OHLCVData[], annualizationFactor: number = 252): number { - if (ohlcv.length < 2) return 0; + if (ohlcv.length < 2) {return 0;} const sum = ohlcv.slice(1).reduce((acc, curr) => { const range = Math.log(curr.high / curr.low); return acc + range * range; diff --git a/libs/utils/tsconfig.json b/libs/utils/tsconfig.json index e8f78e0..a382ed1 100644 --- a/libs/utils/tsconfig.json +++ b/libs/utils/tsconfig.json @@ -1,13 +1,9 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "./dist", - "rootDir": "./src" - }, - "include": ["src/**/*"], - "references": [ - { "path": "../types" }, - { "path": "../config" }, - { "path": "../logger" } - ] -} +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "./dist", + "rootDir": "./src" + }, + "include": ["src/**/*"], + "references": [{ "path": "../types" }, { "path": "../config" }, { "path": "../logger" }] +} diff --git a/libs/vector-engine/package.json b/libs/vector-engine/package.json index fdf422b..30d0dc4 100644 --- a/libs/vector-engine/package.json +++ b/libs/vector-engine/package.json @@ -1,34 +1,34 @@ -{ - "name": "@stock-bot/vector-engine", - "version": "1.0.0", - "description": "Vectorized computation engine for high-performance backtesting", - "main": "dist/index.js", - "types": "dist/index.d.ts", - "type": "module", - "scripts": { - "build": "tsc", - "test": "bun test", - "clean": "rimraf dist" - }, - "dependencies": { - "@stock-bot/logger": "*", - "@stock-bot/utils": "*", - "@stock-bot/data-frame": "*" - }, - "devDependencies": { - "@types/node": "^20.11.0", - "typescript": "^5.3.0", - "bun-types": "^1.2.15" - }, - "exports": { - ".": { - "import": "./dist/index.js", - "require": "./dist/index.js", - "types": "./dist/index.d.ts" - } - }, - "files": [ - "dist", - "README.md" - ] -} +{ + "name": "@stock-bot/vector-engine", + "version": "1.0.0", + "description": "Vectorized computation engine for high-performance backtesting", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "type": "module", + "scripts": { + "build": "tsc", + "test": "bun test", + "clean": "rimraf dist" + }, + "dependencies": { + "@stock-bot/logger": "*", + "@stock-bot/utils": "*", + "@stock-bot/data-frame": "*" + }, + "devDependencies": { + "@types/node": "^20.11.0", + "typescript": "^5.3.0", + "bun-types": "^1.2.15" + }, + "exports": { + ".": { + "import": "./dist/index.js", + "require": "./dist/index.js", + "types": "./dist/index.d.ts" + } + }, + "files": [ + "dist", + "README.md" + ] +} diff --git a/libs/vector-engine/src/index.ts b/libs/vector-engine/src/index.ts index cb30b7c..4815cc0 100644 --- a/libs/vector-engine/src/index.ts +++ b/libs/vector-engine/src/index.ts @@ -326,7 +326,7 @@ export class VectorEngine { let peak = equity[0]; for (const eq of equity) { - if (eq > peak) peak = eq; + if (eq > peak) {peak = eq;} drawdown.push((peak - eq) / peak); } diff --git a/libs/vector-engine/tsconfig.json b/libs/vector-engine/tsconfig.json index fb82068..e65065b 100644 --- a/libs/vector-engine/tsconfig.json +++ b/libs/vector-engine/tsconfig.json @@ -1,14 +1,14 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "./dist", - "rootDir": "./src" - }, - "include": ["src/**/*"], - "references": [ - { "path": "../types" }, - { "path": "../logger" }, - { "path": "../utils" }, - { "path": "../data-frame" } - ] -} +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "./dist", + "rootDir": "./src" + }, + "include": ["src/**/*"], + "references": [ + { "path": "../types" }, + { "path": "../logger" }, + { "path": "../utils" }, + { "path": "../data-frame" } + ] +} diff --git a/package.json b/package.json index 12a548a..b4af578 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,11 @@ "test:e2e": "bun test test/e2e", "test:libs": "turbo run test --filter='./libs/*'", "test:apps": "turbo run test --filter=./apps/*/*", - "lint": "turbo run lint", + "lint": "eslint apps libs --ext .ts,.tsx", + "lint:fix": "eslint apps libs --ext .ts,.tsx --fix", + "lint:check": "eslint apps libs --ext .ts,.tsx --max-warnings 0", + "lint:apps": "eslint apps --ext .ts,.tsx", + "lint:libs": "eslint libs --ext .ts,.tsx", "format": "./scripts/format.sh", "format:check": "prettier --check 'apps/**/*.{ts,json}' 'libs/**/*.{ts,json}' '*.json'", "format:ts": "prettier --write 'apps/**/*.ts' 'libs/**/*.ts'", @@ -53,6 +57,7 @@ "apps/*" ], "devDependencies": { + "@eslint/js": "^9.28.0", "@ianvs/prettier-plugin-sort-imports": "^4.4.2", "@testcontainers/mongodb": "^10.7.2", "@testcontainers/postgresql": "^10.7.2", @@ -60,7 +65,13 @@ "@types/node": "^22.15.30", "@types/supertest": "^6.0.2", "@types/yup": "^0.32.0", + "@typescript-eslint/eslint-plugin": "^8.34.0", + "@typescript-eslint/parser": "^8.34.0", "bun-types": "^1.2.15", + "eslint": "^9.28.0", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-promise": "^7.2.1", "mongodb-memory-server": "^9.1.6", "pg-mem": "^2.8.1", "prettier": "^3.5.3", diff --git a/tsconfig.app.json b/tsconfig.app.json index 047d2df..c4a9fd6 100644 --- a/tsconfig.app.json +++ b/tsconfig.app.json @@ -1,10 +1,10 @@ -{ - "extends": "../../../tsconfig.json", - "compilerOptions": { - "outDir": "./dist", - "rootDir": "./src", - "types": ["bun-types"] - }, - "include": ["src/**/*"], - "exclude": ["node_modules", "dist"] -} +{ + "extends": "../../../tsconfig.json", + "compilerOptions": { + "outDir": "./dist", + "rootDir": "./src", + "types": ["bun-types"] + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist"] +} diff --git a/tsconfig.json b/tsconfig.json index a0dc721..c9e384d 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,71 +1,68 @@ -{ - "$schema": "https://json.schemastore.org/tsconfig", - "compilerOptions": { - // JavaScript output target version - "target": "ES2022", - // Module configuration for different project types - "module": "ESNext", - "moduleResolution": "bundler", - "composite": true, - - // Type checking - "strict": true, - "noImplicitAny": true, - "strictNullChecks": true, - "noImplicitThis": true, - "alwaysStrict": true, - "declarationMap": true, - - // Module interoperability - "esModuleInterop": true, - "allowSyntheticDefaultImports": true, - - // Additional features - "skipLibCheck": true, - "forceConsistentCasingInFileNames": true, - "resolveJsonModule": true, - "sourceMap": false, - "declaration": true, - "disableReferencedProjectLoad": true, - "disableSourceOfProjectReferenceRedirect": false, - - // Paths and output - "baseUrl": ".", - "paths": { - "@stock-bot/*": ["libs/*/src"] - } - }, - "exclude": [ - "node_modules", - "dist" - ], - "references": [ - // Core libraries first - { "path": "./libs/types" }, - { "path": "./libs/config" }, - { "path": "./libs/logger" }, - { "path": "./libs/utils" }, - - // Database clients - { "path": "./libs/postgres-client" }, - { "path": "./libs/mongodb-client" }, - { "path": "./libs/questdb-client" }, - - // Service libraries - { "path": "./libs/cache" }, - { "path": "./libs/http" }, - { "path": "./libs/event-bus" }, - { "path": "./libs/shutdown" }, - // Engine libraries - { "path": "./libs/data-frame" }, - { "path": "./libs/vector-engine" }, - { "path": "./libs/strategy-engine" }, - - // Applications - { "path": "./apps/data-service" }, - { "path": "./apps/execution-service" }, - { "path": "./apps/portfolio-service" }, - { "path": "./apps/processing-service" }, - { "path": "./apps/strategy-service" } - ] -} \ No newline at end of file +{ + "$schema": "https://json.schemastore.org/tsconfig", + "compilerOptions": { + // JavaScript output target version + "target": "ES2022", + // Module configuration for different project types + "module": "ESNext", + "moduleResolution": "bundler", + "composite": true, + + // Type checking + "strict": true, + "noImplicitAny": true, + "strictNullChecks": true, + "noImplicitThis": true, + "alwaysStrict": true, + "declarationMap": true, + + // Module interoperability + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + + // Additional features + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "sourceMap": false, + "declaration": true, + "disableReferencedProjectLoad": true, + "disableSourceOfProjectReferenceRedirect": false, + + // Paths and output + "baseUrl": ".", + "paths": { + "@stock-bot/*": ["libs/*/src"] + } + }, + "exclude": ["node_modules", "dist"], + "references": [ + // Core libraries first + { "path": "./libs/types" }, + { "path": "./libs/config" }, + { "path": "./libs/logger" }, + { "path": "./libs/utils" }, + + // Database clients + { "path": "./libs/postgres-client" }, + { "path": "./libs/mongodb-client" }, + { "path": "./libs/questdb-client" }, + + // Service libraries + { "path": "./libs/cache" }, + { "path": "./libs/http" }, + { "path": "./libs/event-bus" }, + { "path": "./libs/shutdown" }, + // Engine libraries + { "path": "./libs/data-frame" }, + { "path": "./libs/vector-engine" }, + { "path": "./libs/strategy-engine" }, + + // Applications + { "path": "./apps/data-service" }, + { "path": "./apps/execution-service" }, + { "path": "./apps/portfolio-service" }, + { "path": "./apps/processing-service" }, + { "path": "./apps/strategy-service" } + ] +} diff --git a/tsconfig.lib.json b/tsconfig.lib.json index 15018aa..090238f 100644 --- a/tsconfig.lib.json +++ b/tsconfig.lib.json @@ -1,11 +1,11 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "outDir": "./dist", - "rootDir": "./src", - "declaration": true, - "composite": true - }, - "include": ["src/**/*"], - "exclude": ["node_modules", "dist", "**/*.test.ts", "**/*.spec.ts"] -} +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./dist", + "rootDir": "./src", + "declaration": true, + "composite": true + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist", "**/*.test.ts", "**/*.spec.ts"] +} diff --git a/turbo.json b/turbo.json index 15d7b50..405e280 100644 --- a/turbo.json +++ b/turbo.json @@ -22,7 +22,16 @@ "dependsOn": ["build"], "outputs": [] }, "lint": { - "dependsOn": ["^lint"] + "dependsOn": [], + "outputs": [] + }, + "lint:fix": { + "dependsOn": [], + "outputs": [] + }, + "lint:check": { + "dependsOn": [], + "outputs": [] }, "format": { "dependsOn": [],