diff --git a/apps/stock/config/package.json b/apps/stock/config/package.json index 00abb97..bae8220 100644 --- a/apps/stock/config/package.json +++ b/apps/stock/config/package.json @@ -13,6 +13,7 @@ }, "dependencies": { "@stock-bot/config": "*", + "@stock-bot/logger": "*", "zod": "^3.22.4" }, "devDependencies": { diff --git a/apps/stock/data-ingestion/package.json b/apps/stock/data-ingestion/package.json index fd5e902..f229156 100644 --- a/apps/stock/data-ingestion/package.json +++ b/apps/stock/data-ingestion/package.json @@ -24,6 +24,8 @@ "@stock-bot/queue": "*", "@stock-bot/shutdown": "*", "@stock-bot/utils": "*", + "@stock-bot/browser": "*", + "@stock-bot/proxy": "*", "hono": "^4.0.0" }, "devDependencies": { diff --git a/apps/stock/data-ingestion/src/handlers/ib/ib.handler.ts b/apps/stock/data-ingestion/src/handlers/ib/ib.handler.ts index 0748dbb..ea26f20 100644 --- a/apps/stock/data-ingestion/src/handlers/ib/ib.handler.ts +++ b/apps/stock/data-ingestion/src/handlers/ib/ib.handler.ts @@ -8,7 +8,7 @@ import { import { fetchExchanges, fetchExchangesAndSymbols, fetchSession, fetchSymbols } from './actions'; @Handler('ib') -export class IbHandler extends BaseHandler { +class IbHandler extends BaseHandler { constructor(services: IServiceContainer) { super(services); } diff --git a/apps/stock/data-ingestion/src/handlers/index.ts b/apps/stock/data-ingestion/src/handlers/index.ts index e572141..c0b97be 100644 --- a/apps/stock/data-ingestion/src/handlers/index.ts +++ b/apps/stock/data-ingestion/src/handlers/index.ts @@ -9,7 +9,6 @@ import { getLogger } from '@stock-bot/logger'; // Import handlers for bundling (ensures they're included in the build) import './ceo/ceo.handler'; import './ib/ib.handler'; -import './proxy/proxy.handler'; import './qm/qm.handler'; import './webshare/webshare.handler'; diff --git a/apps/stock/data-ingestion/src/handlers/qm/qm.handler.ts b/apps/stock/data-ingestion/src/handlers/qm/qm.handler.ts index 6433566..b0bc5e3 100644 --- a/apps/stock/data-ingestion/src/handlers/qm/qm.handler.ts +++ b/apps/stock/data-ingestion/src/handlers/qm/qm.handler.ts @@ -1,7 +1,7 @@ import { BaseHandler, Handler, type IServiceContainer } from '@stock-bot/handlers'; @Handler('qm') -export class QMHandler extends BaseHandler { +class QMHandler extends BaseHandler { constructor(services: IServiceContainer) { super(services); // Handler name read from @Handler decorator } diff --git a/apps/stock/data-ingestion/src/handlers/webshare/webshare.handler.ts b/apps/stock/data-ingestion/src/handlers/webshare/webshare.handler.ts index 19cf5c0..bb7623a 100644 --- a/apps/stock/data-ingestion/src/handlers/webshare/webshare.handler.ts +++ b/apps/stock/data-ingestion/src/handlers/webshare/webshare.handler.ts @@ -8,7 +8,7 @@ import { } from '@stock-bot/handlers'; @Handler('webshare') -export class WebShareHandler extends BaseHandler { +class WebShareHandler extends BaseHandler { constructor(services: IServiceContainer) { super(services); } diff --git a/apps/stock/data-pipeline/package.json b/apps/stock/data-pipeline/package.json index c10b086..9bc15fc 100644 --- a/apps/stock/data-pipeline/package.json +++ b/apps/stock/data-pipeline/package.json @@ -21,6 +21,8 @@ "@stock-bot/questdb": "*", "@stock-bot/queue": "*", "@stock-bot/shutdown": "*", + "@stock-bot/handlers": "*", + "@stock-bot/di": "*", "hono": "^4.0.0" }, "devDependencies": { diff --git a/apps/stock/data-pipeline/src/handlers/exchanges/exchanges.handler.ts b/apps/stock/data-pipeline/src/handlers/exchanges/exchanges.handler.ts index c1f7800..ae645c5 100644 --- a/apps/stock/data-pipeline/src/handlers/exchanges/exchanges.handler.ts +++ b/apps/stock/data-pipeline/src/handlers/exchanges/exchanges.handler.ts @@ -15,7 +15,7 @@ import { syncIBExchanges } from './operations/sync-ib-exchanges.operations'; import { syncQMProviderMappings } from './operations/sync-qm-provider-mappings.operations'; @Handler('exchanges') -export class ExchangesHandler extends BaseHandler { +class ExchangesHandler extends BaseHandler { constructor(services: IServiceContainer) { super(services); } diff --git a/apps/stock/data-pipeline/src/handlers/symbols/symbols.handler.ts b/apps/stock/data-pipeline/src/handlers/symbols/symbols.handler.ts index 5ab6d0a..79083ca 100644 --- a/apps/stock/data-pipeline/src/handlers/symbols/symbols.handler.ts +++ b/apps/stock/data-pipeline/src/handlers/symbols/symbols.handler.ts @@ -10,7 +10,7 @@ import { syncSymbolsFromProvider } from './operations/sync-symbols-from-provider import { getSyncStatus } from './operations/sync-status.operations'; @Handler('symbols') -export class SymbolsHandler extends BaseHandler { +class SymbolsHandler extends BaseHandler { constructor(services: IServiceContainer) { super(services); } diff --git a/apps/stock/data-pipeline/src/types/job-payloads.ts b/apps/stock/data-pipeline/src/types/job-payloads.ts index 6c5f9de..2feaf98 100644 --- a/apps/stock/data-pipeline/src/types/job-payloads.ts +++ b/apps/stock/data-pipeline/src/types/job-payloads.ts @@ -17,11 +17,3 @@ export interface SyncStatus { lastSyncCount: number; syncErrors?: string; } - -export interface ExchangeMapping { - id: string; - code: string; - name: string; - country: string; - currency: string; -} diff --git a/apps/stock/web-api/package.json b/apps/stock/web-api/package.json index 28e3701..64a7bbc 100644 --- a/apps/stock/web-api/package.json +++ b/apps/stock/web-api/package.json @@ -18,6 +18,8 @@ "@stock-bot/mongodb": "*", "@stock-bot/postgres": "*", "@stock-bot/shutdown": "*", + "@stock-bot/handlers": "*", + "@stock-bot/di": "*", "hono": "^4.0.0" }, "devDependencies": { diff --git a/apps/stock/web-app/package.json b/apps/stock/web-app/package.json index 278192c..3a8b914 100644 --- a/apps/stock/web-app/package.json +++ b/apps/stock/web-app/package.json @@ -13,17 +13,11 @@ "@headlessui/react": "^1.7.17", "@heroicons/react": "^2.0.18", "@tanstack/react-table": "^8.21.3", - "@types/react-router-dom": "^5.3.3", - "@types/react-virtualized-auto-sizer": "^1.0.8", - "@types/react-window": "^1.8.8", "clsx": "^2.1.1", "react": "^18.2.0", "react-dom": "^18.2.0", "react-router-dom": "^7.6.2", - "react-virtualized-auto-sizer": "^1.0.26", "react-virtuoso": "^4.12.8", - "react-window": "^1.8.11", - "react-window-infinite-loader": "^1.0.10", "tailwind-merge": "^3.3.1" }, "devDependencies": { diff --git a/apps/stock/web-app/src/features/exchanges/types/index.ts b/apps/stock/web-app/src/features/exchanges/types/index.ts index ff687b3..ad05828 100644 --- a/apps/stock/web-app/src/features/exchanges/types/index.ts +++ b/apps/stock/web-app/src/features/exchanges/types/index.ts @@ -8,7 +8,7 @@ export interface ApiResponse { } // Base entity types -export interface BaseEntity { +interface BaseEntity { id: string; created_at: string; updated_at: string; @@ -126,29 +126,11 @@ export interface FormErrors { } // Dialog props interfaces -export interface BaseDialogProps { +interface BaseDialogProps { isOpen: boolean; onClose: () => void; } export interface AddExchangeDialogProps extends BaseDialogProps { onCreateExchange: (request: CreateExchangeRequest) => Promise; -} - -export interface AddProviderMappingDialogProps extends BaseDialogProps { - exchangeId: string; - exchangeName: string; - onCreateMapping: ( - request: CreateProviderMappingRequest - ) => Promise; -} - -export interface DeleteExchangeDialogProps extends BaseDialogProps { - exchangeId: string; - exchangeName: string; - providerMappingCount: number; - onConfirmDelete: (exchangeId: string) => Promise; -} - -// Legacy compatibility - can be removed later -export type ExchangesApiResponse = ApiResponse; \ No newline at end of file +} \ No newline at end of file diff --git a/apps/stock/web-app/src/features/pipeline/types/index.ts b/apps/stock/web-app/src/features/pipeline/types/index.ts index d22be10..edf1c0c 100644 --- a/apps/stock/web-app/src/features/pipeline/types/index.ts +++ b/apps/stock/web-app/src/features/pipeline/types/index.ts @@ -32,17 +32,6 @@ export interface ProviderMappingStats { coveragePercentage: number; } -export interface SyncStatus { - lastSync?: { - symbols?: string; - exchanges?: string; - providerMappings?: string; - }; - pendingJobs?: number; - activeJobs?: number; - completedJobs?: number; - failedJobs?: number; -} export type DataClearType = 'exchanges' | 'provider_mappings' | 'all'; diff --git a/bun.lock b/bun.lock index 2b981ce..201cb96 100644 --- a/bun.lock +++ b/bun.lock @@ -4,16 +4,9 @@ "": { "name": "stock-bot", "dependencies": { - "@primeng/themes": "^19.1.3", - "@tanstack/table-core": "^8.21.3", "@types/pg": "^8.15.4", "awilix": "^12.0.5", "bullmq": "^5.53.2", - "ioredis": "^5.6.1", - "pg": "^8.16.0", - "playwright": "^1.53.0", - "primeicons": "^7.0.0", - "primeng": "^19.1.3", }, "devDependencies": { "@eslint/js": "^9.28.0", @@ -58,6 +51,7 @@ "version": "1.0.0", "dependencies": { "@stock-bot/config": "*", + "@stock-bot/logger": "*", "zod": "^3.22.4", }, "devDependencies": { @@ -69,6 +63,7 @@ "name": "@stock-bot/data-ingestion", "version": "1.0.0", "dependencies": { + "@stock-bot/browser": "*", "@stock-bot/cache": "*", "@stock-bot/config": "*", "@stock-bot/di": "*", @@ -76,6 +71,7 @@ "@stock-bot/logger": "*", "@stock-bot/mongodb": "*", "@stock-bot/postgres": "*", + "@stock-bot/proxy": "*", "@stock-bot/questdb": "*", "@stock-bot/queue": "*", "@stock-bot/shutdown": "*", @@ -93,6 +89,8 @@ "dependencies": { "@stock-bot/cache": "*", "@stock-bot/config": "*", + "@stock-bot/di": "*", + "@stock-bot/handlers": "*", "@stock-bot/logger": "*", "@stock-bot/mongodb": "*", "@stock-bot/postgres": "*", @@ -111,6 +109,8 @@ "version": "1.0.0", "dependencies": { "@stock-bot/config": "*", + "@stock-bot/di": "*", + "@stock-bot/handlers": "*", "@stock-bot/logger": "*", "@stock-bot/mongodb": "*", "@stock-bot/postgres": "*", @@ -129,17 +129,11 @@ "@headlessui/react": "^1.7.17", "@heroicons/react": "^2.0.18", "@tanstack/react-table": "^8.21.3", - "@types/react-router-dom": "^5.3.3", - "@types/react-virtualized-auto-sizer": "^1.0.8", - "@types/react-window": "^1.8.8", "clsx": "^2.1.1", "react": "^18.2.0", "react-dom": "^18.2.0", "react-router-dom": "^7.6.2", - "react-virtualized-auto-sizer": "^1.0.26", "react-virtuoso": "^4.12.8", - "react-window": "^1.8.11", - "react-window-infinite-loader": "^1.0.10", "tailwind-merge": "^3.3.1", }, "devDependencies": { @@ -179,6 +173,7 @@ "config-cli": "./dist/cli.js", }, "dependencies": { + "@stock-bot/logger": "workspace:*", "zod": "^3.22.4", }, "devDependencies": { @@ -191,9 +186,21 @@ "name": "@stock-bot/di", "version": "1.0.0", "dependencies": { + "@stock-bot/browser": "workspace:*", + "@stock-bot/cache": "workspace:*", "@stock-bot/config": "workspace:*", + "@stock-bot/handlers": "workspace:*", "@stock-bot/logger": "workspace:*", + "@stock-bot/mongodb": "workspace:*", + "@stock-bot/postgres": "workspace:*", + "@stock-bot/proxy": "workspace:*", + "@stock-bot/questdb": "workspace:*", + "@stock-bot/queue": "workspace:*", + "@stock-bot/shutdown": "workspace:*", "@stock-bot/types": "workspace:*", + "awilix": "^12.0.5", + "hono": "^4.0.0", + "zod": "^3.23.8", }, "devDependencies": { "@types/pg": "^8.10.7", @@ -222,6 +229,7 @@ "@stock-bot/logger": "workspace:*", "@stock-bot/types": "workspace:*", "@stock-bot/utils": "workspace:*", + "mongodb": "^6.12.0", }, "devDependencies": { "@types/node": "^20.11.0", @@ -265,6 +273,9 @@ "libs/core/shutdown": { "name": "@stock-bot/shutdown", "version": "1.0.0", + "dependencies": { + "@stock-bot/logger": "workspace:*", + }, "devDependencies": { "@types/node": "^20.0.0", "typescript": "^5.0.0", @@ -383,20 +394,6 @@ "@ampproject/remapping": ["@ampproject/remapping@2.3.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="], - "@angular/animations": ["@angular/animations@19.2.14", "", { "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { "@angular/common": "19.2.14", "@angular/core": "19.2.14" } }, "sha512-xhl8fLto5HHJdVj8Nb6EoBEiTAcXuWDYn1q5uHcGxyVH3kiwENWy/2OQXgCr2CuWo2e6hNUGzSLf/cjbsMNqEA=="], - - "@angular/cdk": ["@angular/cdk@19.2.18", "", { "dependencies": { "parse5": "^7.1.2", "tslib": "^2.3.0" }, "peerDependencies": { "@angular/common": "^19.0.0 || ^20.0.0", "@angular/core": "^19.0.0 || ^20.0.0", "rxjs": "^6.5.3 || ^7.4.0" } }, "sha512-aGMHOYK/VV9PhxGTUDwiu/4ozoR/RKz8cimI+QjRxEBhzn4EPqjUDSganvlhmgS7cTN3+aqozdvF/GopMRJjLg=="], - - "@angular/common": ["@angular/common@19.2.14", "", { "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { "@angular/core": "19.2.14", "rxjs": "^6.5.3 || ^7.4.0" } }, "sha512-NcNklcuyqaTjOVGf7aru8APX9mjsnZ01gFZrn47BxHozhaR0EMRrotYQTdi8YdVjPkeYFYanVntSLfhyobq/jg=="], - - "@angular/core": ["@angular/core@19.2.14", "", { "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { "rxjs": "^6.5.3 || ^7.4.0", "zone.js": "~0.15.0" } }, "sha512-EVErpW9tGqJ/wNcAN3G/ErH8pHCJ8mM1E6bsJ8UJIpDTZkpqqYjBMtZS9YWH5n3KwUd1tAkAB2w8FK125AjDUQ=="], - - "@angular/forms": ["@angular/forms@19.2.14", "", { "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { "@angular/common": "19.2.14", "@angular/core": "19.2.14", "@angular/platform-browser": "19.2.14", "rxjs": "^6.5.3 || ^7.4.0" } }, "sha512-hWtDOj2B0AuRTf+nkMJeodnFpDpmEK9OIhIv1YxcRe73ooaxrIdjgugkElO8I9Tj0E4/7m117ezhWDUkbqm1zA=="], - - "@angular/platform-browser": ["@angular/platform-browser@19.2.14", "", { "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { "@angular/animations": "19.2.14", "@angular/common": "19.2.14", "@angular/core": "19.2.14" }, "optionalPeers": ["@angular/animations"] }, "sha512-hzkT5nmA64oVBQl6PRjdL4dIFT1n7lfM9rm5cAoS+6LUUKRgiE2d421Kpn/Hz3jaCJfo+calMIdtSMIfUJBmww=="], - - "@angular/router": ["@angular/router@19.2.14", "", { "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { "@angular/common": "19.2.14", "@angular/core": "19.2.14", "@angular/platform-browser": "19.2.14", "rxjs": "^6.5.3 || ^7.4.0" } }, "sha512-cBTWY9Jx7YhbmDYDb7Hqz4Q7UNIMlKTkdKToJd2pbhIXyoS+kHVQrySmyca+jgvYMjWnIjsAEa3dpje12D4mFw=="], - "@aws-crypto/sha256-browser": ["@aws-crypto/sha256-browser@5.2.0", "", { "dependencies": { "@aws-crypto/sha256-js": "^5.2.0", "@aws-crypto/supports-web-crypto": "^5.2.0", "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", "@aws-sdk/util-locate-window": "^3.0.0", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.6.2" } }, "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw=="], "@aws-crypto/sha256-js": ["@aws-crypto/sha256-js@5.2.0", "", { "dependencies": { "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", "tslib": "^2.6.2" } }, "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA=="], @@ -485,8 +482,6 @@ "@babel/plugin-transform-react-jsx-source": ["@babel/plugin-transform-react-jsx-source@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw=="], - "@babel/runtime": ["@babel/runtime@7.27.6", "", {}, "sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q=="], - "@babel/template": ["@babel/template@7.27.2", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/parser": "^7.27.2", "@babel/types": "^7.27.1" } }, "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw=="], "@babel/traverse": ["@babel/traverse@7.27.4", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.27.3", "@babel/parser": "^7.27.4", "@babel/template": "^7.27.2", "@babel/types": "^7.27.3", "debug": "^4.3.1", "globals": "^11.1.0" } }, "sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA=="], @@ -699,12 +694,6 @@ "@pm2/pm2-version-check": ["@pm2/pm2-version-check@1.0.4", "", { "dependencies": { "debug": "^4.3.1" } }, "sha512-SXsM27SGH3yTWKc2fKR4SYNxsmnvuBQ9dd6QHtEWmiZ/VqaOYPAIlS8+vMcn27YLtAEBGvNRSh3TPNvtjZgfqA=="], - "@primeng/themes": ["@primeng/themes@19.1.3", "", { "dependencies": { "@primeuix/styled": "^0.3.2" } }, "sha512-y4VryHHUTPWlmfR56NBANC0QPIxEngTUE/J3pGs4SJquq1n5EE/U16dxa1qW/wXqLF3jn3l/AO/4KZqGj5UuAA=="], - - "@primeuix/styled": ["@primeuix/styled@0.3.2", "", { "dependencies": { "@primeuix/utils": "^0.3.2" } }, "sha512-ColZes0+/WKqH4ob2x8DyNYf1NENpe5ZguOvx5yCLxaP8EIMVhLjWLO/3umJiDnQU4XXMLkn2mMHHw+fhTX/mw=="], - - "@primeuix/utils": ["@primeuix/utils@0.3.2", "", {}, "sha512-B+nphqTQeq+i6JuICLdVWnDMjONome2sNz0xI65qIOyeB4EF12CoKRiCsxuZ5uKAkHi/0d1LqlQ9mIWRSdkavw=="], - "@protobufjs/aspromise": ["@protobufjs/aspromise@1.1.2", "", {}, "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="], "@protobufjs/base64": ["@protobufjs/base64@1.1.2", "", {}, "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="], @@ -895,8 +884,6 @@ "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], - "@types/history": ["@types/history@4.7.11", "", {}, "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA=="], - "@types/http-cache-semantics": ["@types/http-cache-semantics@4.0.4", "", {}, "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA=="], "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], @@ -917,14 +904,6 @@ "@types/react-dom": ["@types/react-dom@18.3.7", "", { "peerDependencies": { "@types/react": "^18.0.0" } }, "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ=="], - "@types/react-router": ["@types/react-router@5.1.20", "", { "dependencies": { "@types/history": "^4.7.11", "@types/react": "*" } }, "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q=="], - - "@types/react-router-dom": ["@types/react-router-dom@5.3.3", "", { "dependencies": { "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router": "*" } }, "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw=="], - - "@types/react-virtualized-auto-sizer": ["@types/react-virtualized-auto-sizer@1.0.8", "", { "dependencies": { "react-virtualized-auto-sizer": "*" } }, "sha512-keJpNyhiwfl2+N12G1ocCVA5ZDBArbPLe/S90X3kt7fam9naeHdaYYWbpe2sHczp70JWJ+2QLhBE8kLvLuVNjA=="], - - "@types/react-window": ["@types/react-window@1.8.8", "", { "dependencies": { "@types/react": "*" } }, "sha512-8Ls660bHR1AUA2kuRvVG9D/4XpRC6wjAaPT9dil7Ckc76eP9TKWZwwmgfq8Q1LANX3QNDnoU4Zp48A3w+zK69Q=="], - "@types/semver": ["@types/semver@7.7.0", "", {}, "sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA=="], "@types/ssh2": ["@types/ssh2@0.5.52", "", { "dependencies": { "@types/node": "*", "@types/ssh2-streams": "*" } }, "sha512-lbLLlXxdCZOSJMCInKH2+9V/77ET2J6NPQHpFI0kda61Dd1KglJs+fPQBchizmzYSOJBgdTajhPqBO1xxLywvg=="], @@ -1281,8 +1260,6 @@ "enquirer": ["enquirer@2.3.6", "", { "dependencies": { "ansi-colors": "^4.1.1" } }, "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg=="], - "entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="], - "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=="], @@ -1709,8 +1686,6 @@ "media-typer": ["media-typer@1.1.0", "", {}, "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw=="], - "memoize-one": ["memoize-one@5.2.1", "", {}, "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q=="], - "memory-pager": ["memory-pager@1.5.0", "", {}, "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg=="], "merge-descriptors": ["merge-descriptors@2.0.0", "", {}, "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g=="], @@ -1891,8 +1866,6 @@ "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], - "parse5": ["parse5@7.3.0", "", { "dependencies": { "entities": "^6.0.0" } }, "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw=="], - "parseurl": ["parseurl@1.3.3", "", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="], "pascal-case": ["pascal-case@3.1.2", "", { "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g=="], @@ -2003,10 +1976,6 @@ "prettier": ["prettier@3.5.3", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw=="], - "primeicons": ["primeicons@7.0.0", "", {}, "sha512-jK3Et9UzwzTsd6tzl2RmwrVY/b8raJ3QZLzoDACj+oTJ0oX7L9Hy+XnVwgo4QVKlKpnP/Ur13SXV/pVh4LzaDw=="], - - "primeng": ["primeng@19.1.3", "", { "dependencies": { "@primeuix/styled": "^0.3.2", "@primeuix/utils": "^0.3.2", "tslib": "^2.3.0" }, "peerDependencies": { "@angular/animations": "^19.0.0", "@angular/cdk": "^19.0.0", "@angular/common": "^19.0.0", "@angular/core": "^19.0.0", "@angular/forms": "^19.0.0", "@angular/platform-browser": "^19.0.0", "@angular/router": "^19.0.0", "rxjs": "^6.0.0 || ^7.8.1" } }, "sha512-KsrvJFblKg28kA6d4npnnABjKClmJv0CgDT/kOxFq5onQNBy4547DJzRGMba4+CMLKjHWWkYWuC+XSkPMNFrZg=="], - "process": ["process@0.11.10", "", {}, "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A=="], "process-nextick-args": ["process-nextick-args@2.0.1", "", {}, "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="], @@ -2069,14 +2038,8 @@ "react-router-dom": ["react-router-dom@7.6.2", "", { "dependencies": { "react-router": "7.6.2" }, "peerDependencies": { "react": ">=18", "react-dom": ">=18" } }, "sha512-Q8zb6VlTbdYKK5JJBLQEN06oTUa/RAbG/oQS1auK1I0TbJOXktqm+QENEVJU6QvWynlXPRBXI3fiOQcSEA78rA=="], - "react-virtualized-auto-sizer": ["react-virtualized-auto-sizer@1.0.26", "", { "peerDependencies": { "react": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-CblNyiNVw2o+hsa5/49NH2ogGxZ+t+3aweRvNSq7TVjDIlwk7ir4lencEg5HxHeSzwNarSkNkiu0qJSOXtxm5A=="], - "react-virtuoso": ["react-virtuoso@4.13.0", "", { "peerDependencies": { "react": ">=16 || >=17 || >= 18 || >= 19", "react-dom": ">=16 || >=17 || >= 18 || >=19" } }, "sha512-XHv2Fglpx80yFPdjZkV9d1baACKghg/ucpDFEXwaix7z0AfVQj+mF6lM+YQR6UC/TwzXG2rJKydRMb3+7iV3PA=="], - "react-window": ["react-window@1.8.11", "", { "dependencies": { "@babel/runtime": "^7.0.0", "memoize-one": ">=3.1.1 <6" }, "peerDependencies": { "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-+SRbUVT2scadgFSWx+R1P754xHPEqvcfSfVX10QYg6POOz+WNgkN48pS+BtZNIMGiL1HYrSEiCkwsMS15QogEQ=="], - - "react-window-infinite-loader": ["react-window-infinite-loader@1.0.10", "", { "peerDependencies": { "react": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-NO/csdHlxjWqA2RJZfzQgagAjGHspbO2ik9GtWZb0BY1Nnapq0auG8ErI+OhGCzpjYJsCYerqUlK6hkq9dfAAA=="], - "read": ["read@1.0.7", "", { "dependencies": { "mute-stream": "~0.0.4" } }, "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ=="], "read-cache": ["read-cache@1.0.0", "", { "dependencies": { "pify": "^2.3.0" } }, "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA=="], @@ -2133,8 +2096,6 @@ "run-series": ["run-series@1.1.9", "", {}, "sha512-Arc4hUN896vjkqCYrUXquBFtRZdv1PfLbTYP71efP6butxyQ0kWpiNJyAgsxscmQg1cqvHY32/UCBzXedTpU2g=="], - "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=="], @@ -2437,8 +2398,6 @@ "zod-validation-error": ["zod-validation-error@3.5.2", "", { "peerDependencies": { "zod": "^3.25.0" } }, "sha512-mdi7YOLtram5dzJ5aDtm1AG9+mxRma1iaMrZdYIpFO7epdKBUwLHIxTF8CPDeCQ828zAXYtizrKlEJAtzgfgrw=="], - "zone.js": ["zone.js@0.15.1", "", {}, "sha512-XE96n56IQpJM7NAoXswY3XRLcWFW83xe0BiAOeMD7K5k5xecOeul3Qcpx6GqEeeHNkW5DWL5zOyTbEfB4eti8w=="], - "@aws-crypto/sha256-browser/@smithy/util-utf8": ["@smithy/util-utf8@2.3.0", "", { "dependencies": { "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A=="], "@aws-crypto/util/@smithy/util-utf8": ["@smithy/util-utf8@2.3.0", "", { "dependencies": { "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A=="], diff --git a/libs/core/config/package.json b/libs/core/config/package.json index fa51da6..d8a1009 100644 --- a/libs/core/config/package.json +++ b/libs/core/config/package.json @@ -23,6 +23,7 @@ "config-cli": "./dist/cli.js" }, "dependencies": { + "@stock-bot/logger": "workspace:*", "zod": "^3.22.4" }, "devDependencies": { diff --git a/libs/core/config/src/loaders/env.loader.ts b/libs/core/config/src/loaders/env.loader.ts index ac6a0ee..57664c5 100644 --- a/libs/core/config/src/loaders/env.loader.ts +++ b/libs/core/config/src/loaders/env.loader.ts @@ -2,7 +2,7 @@ import { readFileSync } from 'fs'; import { ConfigLoaderError } from '../errors'; import type { ConfigLoader } from '../types'; -export interface EnvLoaderOptions { +interface EnvLoaderOptions { convertCase?: boolean; parseJson?: boolean; parseValues?: boolean; diff --git a/libs/core/di/package.json b/libs/core/di/package.json index 0b65964..c070f8c 100644 --- a/libs/core/di/package.json +++ b/libs/core/di/package.json @@ -10,7 +10,19 @@ "dependencies": { "@stock-bot/config": "workspace:*", "@stock-bot/logger": "workspace:*", - "@stock-bot/types": "workspace:*" + "@stock-bot/types": "workspace:*", + "@stock-bot/browser": "workspace:*", + "@stock-bot/cache": "workspace:*", + "@stock-bot/mongodb": "workspace:*", + "@stock-bot/postgres": "workspace:*", + "@stock-bot/proxy": "workspace:*", + "@stock-bot/questdb": "workspace:*", + "@stock-bot/queue": "workspace:*", + "@stock-bot/shutdown": "workspace:*", + "@stock-bot/handlers": "workspace:*", + "zod": "^3.23.8", + "hono": "^4.0.0", + "awilix": "^12.0.5" }, "devDependencies": { "@types/pg": "^8.10.7" diff --git a/libs/core/handlers/package.json b/libs/core/handlers/package.json index 3314981..5ea2226 100644 --- a/libs/core/handlers/package.json +++ b/libs/core/handlers/package.json @@ -14,7 +14,8 @@ "@stock-bot/logger": "workspace:*", "@stock-bot/types": "workspace:*", "@stock-bot/cache": "workspace:*", - "@stock-bot/utils": "workspace:*" + "@stock-bot/utils": "workspace:*", + "mongodb": "^6.12.0" }, "devDependencies": { "@types/node": "^20.11.0", diff --git a/libs/core/queue/src/queue-metrics.ts b/libs/core/queue/src/queue-metrics.ts index e45477d..6ea6537 100644 --- a/libs/core/queue/src/queue-metrics.ts +++ b/libs/core/queue/src/queue-metrics.ts @@ -4,7 +4,7 @@ import { Queue, QueueEvents } from 'bullmq'; // const logger = getLogger('queue-metrics'); -export interface QueueMetrics { +interface QueueMetrics { // Job counts waiting: number; active: number; diff --git a/libs/core/shutdown/package.json b/libs/core/shutdown/package.json index b53779a..13cbfa6 100644 --- a/libs/core/shutdown/package.json +++ b/libs/core/shutdown/package.json @@ -10,7 +10,9 @@ "clean": "rm -rf dist", "test": "bun test" }, - "dependencies": {}, + "dependencies": { + "@stock-bot/logger": "workspace:*" + }, "devDependencies": { "typescript": "^5.0.0", "@types/node": "^20.0.0" diff --git a/libs/data/mongodb/src/types.ts b/libs/data/mongodb/src/types.ts index a66995d..96a128e 100644 --- a/libs/data/mongodb/src/types.ts +++ b/libs/data/mongodb/src/types.ts @@ -73,31 +73,6 @@ export interface DynamicPoolConfig { evaluationInterval: number; // ms between checks } -/** - * Health Status Types - */ -export type MongoDBHealthStatus = 'healthy' | 'degraded' | 'unhealthy'; - -export interface MongoDBHealthCheck { - status: MongoDBHealthStatus; - timestamp: Date; - latency: number; - connections: { - active: number; - available: number; - total: number; - }; - errors?: string[]; -} - -export interface MongoDBMetrics { - operationsPerSecond: number; - averageLatency: number; - errorRate: number; - connectionPoolUtilization: number; - documentsProcessed: number; -} - /** * Base Document Interface */ diff --git a/libs/data/questdb/src/types.ts b/libs/data/questdb/src/types.ts index 16cef12..5ec8a0e 100644 --- a/libs/data/questdb/src/types.ts +++ b/libs/data/questdb/src/types.ts @@ -39,17 +39,6 @@ export interface QuestDBConnectionOptions { */ export type QuestDBHealthStatus = 'healthy' | 'degraded' | 'unhealthy'; -export interface QuestDBHealthCheck { - status: QuestDBHealthStatus; - timestamp: Date; - latency: number; - protocols: { - http: boolean; - pg: boolean; - influx: boolean; - }; - errors?: string[]; -} export interface QuestDBMetrics { queriesPerSecond: number; @@ -77,7 +66,7 @@ export type TableNames = /** * Time-Series Data Types */ -export interface BaseTimeSeriesData { +interface BaseTimeSeriesData { timestamp: Date; symbol?: string; } @@ -160,7 +149,7 @@ export interface InsertResult { /** * Schema Definition Types */ -export interface ColumnDefinition { +interface ColumnDefinition { name: string; type: | 'SYMBOL' @@ -177,7 +166,7 @@ export interface ColumnDefinition { capacity?: number; // For SYMBOL type } -export interface TableDefinition { +interface TableDefinition { name: string; columns: ColumnDefinition[]; partitionBy?: 'NONE' | 'DAY' | 'MONTH' | 'YEAR'; @@ -224,7 +213,7 @@ export interface PerformanceMetrics { /** * Query Builder Types */ -export interface TimeSeriesQuery { +interface TimeSeriesQuery { table: TableNames | string; columns?: string[]; timeRange?: TimeRange; @@ -236,7 +225,7 @@ export interface TimeSeriesQuery { limit?: number; } -export interface AggregationQuery { +interface AggregationQuery { aggregations: Record; groupBy?: string[]; having?: string[]; @@ -278,7 +267,7 @@ export interface TableSchema { dedup?: boolean; } -export interface ColumnSchema { +interface ColumnSchema { name: string; type: | 'SYMBOL' @@ -297,7 +286,7 @@ export interface ColumnSchema { indexed?: boolean; } -export interface IndexDefinition { +interface IndexDefinition { columns: string[]; type: 'HASH' | 'BTREE'; unique?: boolean; diff --git a/libs/services/browser/src/types.ts b/libs/services/browser/src/types.ts index 84e41ee..37df90b 100644 --- a/libs/services/browser/src/types.ts +++ b/libs/services/browser/src/types.ts @@ -6,8 +6,6 @@ export interface BrowserOptions { enableNetworkLogging?: boolean; } -// Keep the old name for backward compatibility -export type FastBrowserOptions = BrowserOptions; export interface ScrapingResult { data: T; diff --git a/package.json b/package.json index b2412d9..c6b977f 100644 --- a/package.json +++ b/package.json @@ -99,16 +99,9 @@ "bun": ">=1.1.0" }, "dependencies": { - "@primeng/themes": "^19.1.3", - "@tanstack/table-core": "^8.21.3", "@types/pg": "^8.15.4", "awilix": "^12.0.5", - "bullmq": "^5.53.2", - "ioredis": "^5.6.1", - "pg": "^8.16.0", - "playwright": "^1.53.0", - "primeicons": "^7.0.0", - "primeng": "^19.1.3" + "bullmq": "^5.53.2" }, "trustedDependencies": [ "@tailwindcss/oxide",