fix(stocks): Fix Yahoo provider request handling and bump dependency versions

This commit is contained in:
2025-09-24 07:56:53 +00:00
parent 1b1324d0f9
commit e94a6f8d5b
6 changed files with 2091 additions and 1588 deletions

View File

@@ -1,5 +1,14 @@
# Changelog # Changelog
## 2025-09-24 - 1.6.1 - fix(stocks)
Fix Yahoo provider request handling and bump dependency versions
- Refactored Yahoo Finance provider to use SmartRequest.create() builder and await response.json() for HTTP responses (replaces direct getJson usage).
- Improved batch and single-price fetching to use the SmartRequest API, keeping User-Agent header and timeouts.
- Added a compile-time type-check alias to ensure IStockPrice matches tsclass.finance.IStockPrice.
- Bumped development and runtime dependency versions (notable bumps include @git.zone/tsbuild, @git.zone/tstest, @push.rocks/qenv, @push.rocks/smartarchive, @push.rocks/smartdata, @push.rocks/smartfile, @push.rocks/smartlog, @push.rocks/smartpath, @push.rocks/smartrequest, @tsclass/tsclass).
- Added .claude/settings.local.json to grant local CI permissions for a few Bash commands.
## 2025-07-12 - 1.6.0 - feat(readme) ## 2025-07-12 - 1.6.0 - feat(readme)
Revamp documentation and package description for enhanced clarity Revamp documentation and package description for enhanced clarity

View File

@@ -14,29 +14,29 @@
"buildDocs": "(tsdoc)" "buildDocs": "(tsdoc)"
}, },
"devDependencies": { "devDependencies": {
"@git.zone/tsbuild": "^2.6.4", "@git.zone/tsbuild": "^2.6.8",
"@git.zone/tsbundle": "^2.5.1", "@git.zone/tsbundle": "^2.5.1",
"@git.zone/tsrun": "^1.3.3", "@git.zone/tsrun": "^1.3.3",
"@git.zone/tstest": "^2.3.1", "@git.zone/tstest": "^2.3.8",
"@types/node": "^22.14.0" "@types/node": "^22.14.0"
}, },
"dependencies": { "dependencies": {
"@push.rocks/lik": "^6.2.2", "@push.rocks/lik": "^6.2.2",
"@push.rocks/qenv": "^6.1.0", "@push.rocks/qenv": "^6.1.3",
"@push.rocks/smartarchive": "^4.0.39", "@push.rocks/smartarchive": "^4.2.2",
"@push.rocks/smartarray": "^1.1.0", "@push.rocks/smartarray": "^1.1.0",
"@push.rocks/smartbrowser": "^2.0.8", "@push.rocks/smartbrowser": "^2.0.8",
"@push.rocks/smartdata": "^5.15.1", "@push.rocks/smartdata": "^5.16.4",
"@push.rocks/smartdelay": "^3.0.5", "@push.rocks/smartdelay": "^3.0.5",
"@push.rocks/smartfile": "^11.2.5", "@push.rocks/smartfile": "^11.2.7",
"@push.rocks/smartlog": "^3.1.8", "@push.rocks/smartlog": "^3.1.10",
"@push.rocks/smartpath": "^5.0.18", "@push.rocks/smartpath": "^6.0.0",
"@push.rocks/smartpromise": "^4.2.3", "@push.rocks/smartpromise": "^4.2.3",
"@push.rocks/smartrequest": "^2.1.0", "@push.rocks/smartrequest": "^4.3.1",
"@push.rocks/smartstream": "^3.2.5", "@push.rocks/smartstream": "^3.2.5",
"@push.rocks/smartunique": "^3.0.9", "@push.rocks/smartunique": "^3.0.9",
"@push.rocks/smartxml": "^1.1.1", "@push.rocks/smartxml": "^1.1.1",
"@tsclass/tsclass": "^9.2.0" "@tsclass/tsclass": "^9.3.0"
}, },
"repository": { "repository": {
"type": "git", "type": "git",

3614
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@@ -3,6 +3,6 @@
*/ */
export const commitinfo = { export const commitinfo = {
name: '@fin.cx/opendata', name: '@fin.cx/opendata',
version: '1.6.0', version: '1.6.1',
description: 'A comprehensive TypeScript library for accessing business data and real-time financial information. Features include German company data management with MongoDB integration, JSONL bulk processing, automated Handelsregister interactions, and real-time stock market data from multiple providers.' description: 'A comprehensive TypeScript library for accessing business data and real-time financial information. Features include German company data management with MongoDB integration, JSONL bulk processing, automated Handelsregister interactions, and real-time stock market data from multiple providers.'
} }

View File

@@ -1,3 +1,5 @@
import * as plugins from '../../plugins.js';
export interface IStockPrice { export interface IStockPrice {
ticker: string; ticker: string;
price: number; price: number;
@@ -11,6 +13,10 @@ export interface IStockPrice {
exchange?: string; exchange?: string;
exchangeName?: string; exchangeName?: string;
} }
type CheckStockPrice = plugins.tsclass.typeFest.IsEqual<
IStockPrice,
plugins.tsclass.finance.IStockPrice
>;
export interface IStockPriceError { export interface IStockPriceError {
ticker: string; ticker: string;
@@ -27,4 +33,4 @@ export interface IStockQuoteRequest {
export interface IStockBatchQuoteRequest { export interface IStockBatchQuoteRequest {
tickers: string[]; tickers: string[];
includeExtendedHours?: boolean; includeExtendedHours?: boolean;
} }

View File

@@ -20,14 +20,15 @@ export class YahooFinanceProvider implements IStockProvider {
public async fetchPrice(request: IStockQuoteRequest): Promise<IStockPrice> { public async fetchPrice(request: IStockQuoteRequest): Promise<IStockPrice> {
try { try {
const url = `${this.baseUrl}/v8/finance/chart/${request.ticker}`; const url = `${this.baseUrl}/v8/finance/chart/${request.ticker}`;
const response = await plugins.smartrequest.getJson(url, { const response = await plugins.smartrequest.SmartRequest.create()
headers: { .url(url)
.headers({
'User-Agent': this.userAgent 'User-Agent': this.userAgent
}, })
timeout: this.config?.timeout || 10000 .timeout(this.config?.timeout || 10000)
}); .get();
const responseData = response.body as any; const responseData = await response.json() as any;
if (!responseData?.chart?.result?.[0]) { if (!responseData?.chart?.result?.[0]) {
throw new Error(`No data found for ticker ${request.ticker}`); throw new Error(`No data found for ticker ${request.ticker}`);
@@ -66,14 +67,15 @@ export class YahooFinanceProvider implements IStockProvider {
const symbols = request.tickers.join(','); const symbols = request.tickers.join(',');
const url = `${this.baseUrl}/v8/finance/spark?symbols=${symbols}&range=1d&interval=5m`; const url = `${this.baseUrl}/v8/finance/spark?symbols=${symbols}&range=1d&interval=5m`;
const response = await plugins.smartrequest.getJson(url, { const response = await plugins.smartrequest.SmartRequest.create()
headers: { .url(url)
.headers({
'User-Agent': this.userAgent 'User-Agent': this.userAgent
}, })
timeout: this.config?.timeout || 15000 .timeout(this.config?.timeout || 15000)
}); .get();
const responseData = response.body as any; const responseData = await response.json() as any;
const prices: IStockPrice[] = []; const prices: IStockPrice[] = [];
for (const [ticker, data] of Object.entries(responseData)) { for (const [ticker, data] of Object.entries(responseData)) {