@fin.cx/opendata 3.3.0 → 3.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,33 +1,40 @@
1
1
  import * as plugins from '../../plugins.js';
2
2
  /**
3
- * Marketstack API v2 Provider - Enhanced
3
+ * Marketstack API v2 Provider - Professional Plan with Intelligent Intraday Support
4
4
  * Documentation: https://docs.apilayer.com/marketstack/docs/marketstack-api-v2-v-2-0-0
5
5
  *
6
6
  * Features:
7
+ * - Intelligent endpoint selection based on market hours
8
+ * - Real-time intraday pricing with multiple intervals (1min, 5min, 10min, 15min, 30min, 1hour)
7
9
  * - End-of-Day (EOD) stock prices with historical data
8
- * - Intraday pricing with multiple intervals (1min, 5min, 15min, 30min, 1hour)
10
+ * - Market state detection (PRE, REGULAR, POST, CLOSED)
9
11
  * - Exchange filtering via MIC codes (XNAS, XNYS, XLON, etc.)
10
12
  * - Supports 500,000+ tickers across 72+ exchanges worldwide
11
13
  * - OHLCV data (Open, High, Low, Close, Volume)
12
14
  * - Pagination for large datasets
15
+ * - Automatic fallback from intraday to EOD on errors
13
16
  * - Requires API key authentication
14
17
  *
18
+ * Intelligent Endpoint Selection:
19
+ * - During market hours (PRE/REGULAR/POST): Uses intraday endpoints for fresh data
20
+ * - After market close (CLOSED): Uses EOD endpoints to save API credits
21
+ * - Automatic fallback to EOD if intraday fails (rate limits, plan restrictions, etc.)
22
+ *
15
23
  * Rate Limits:
16
24
  * - Free Plan: 100 requests/month (EOD only)
17
- * - Basic Plan: 10,000 requests/month
18
- * - Professional Plan: 100,000 requests/month (intraday access)
25
+ * - Basic Plan: 10,000 requests/month (EOD only)
26
+ * - Professional Plan: 100,000 requests/month (intraday + EOD)
19
27
  *
20
- * Phase 1 Enhancements:
21
- * - Historical data retrieval with date ranges
22
- * - Exchange filtering
23
- * - OHLCV data support
24
- * - Pagination handling
28
+ * Intraday Access:
29
+ * - Intervals below 15min (1min, 5min, 10min) require Professional Plan or higher
30
+ * - Real-time data from IEX Exchange for US tickers
31
+ * - Symbol formatting: Periods replaced with hyphens for intraday (BRK.B → BRK-B)
25
32
  */
26
33
  export class MarketstackProvider {
27
34
  constructor(apiKey, config) {
28
35
  this.config = config;
29
36
  this.name = 'Marketstack';
30
- this.priority = 80; // Lower than Yahoo (100) due to rate limits and EOD-only data
37
+ this.priority = 90; // Increased from 80 - now supports real-time intraday data during market hours
31
38
  this.requiresAuth = true;
32
39
  this.rateLimit = {
33
40
  requestsPerMinute: undefined, // No per-minute limit specified
@@ -58,35 +65,89 @@ export class MarketstackProvider {
58
65
  }
59
66
  }
60
67
  /**
61
- * Fetch current/latest EOD price for a single ticker (new API)
68
+ * Fetch current/latest price with intelligent endpoint selection
69
+ * Uses intraday during market hours (PRE, REGULAR, POST) for fresh data
70
+ * Uses EOD after market close (CLOSED) to save API credits
62
71
  */
63
72
  async fetchCurrentPrice(request) {
64
73
  try {
65
- let url = `${this.baseUrl}/tickers/${request.ticker}/eod/latest?access_key=${this.apiKey}`;
66
- // Add exchange filter if specified
67
- if (request.exchange) {
68
- url += `&exchange=${request.exchange}`;
74
+ // Determine current market state
75
+ const marketState = this.getUsMarketState();
76
+ const useIntraday = this.shouldUseIntradayEndpoint(marketState);
77
+ if (useIntraday) {
78
+ // Use intraday endpoint for fresh data during market hours
79
+ return await this.fetchCurrentPriceIntraday(request, marketState);
69
80
  }
70
- const response = await plugins.smartrequest.SmartRequest.create()
71
- .url(url)
72
- .timeout(this.config?.timeout || 10000)
73
- .get();
74
- const responseData = await response.json();
75
- // Check for API errors
76
- if (responseData.error) {
77
- throw new Error(`Marketstack API error: ${responseData.error.message || JSON.stringify(responseData.error)}`);
78
- }
79
- // For single ticker endpoint, response is direct object (not wrapped in data field)
80
- if (!responseData || !responseData.close) {
81
- throw new Error(`No data found for ticker ${request.ticker}`);
81
+ else {
82
+ // Use EOD endpoint for after-close data
83
+ return await this.fetchCurrentPriceEod(request);
82
84
  }
83
- return this.mapToStockPrice(responseData, 'eod');
84
85
  }
85
86
  catch (error) {
86
- this.logger.error(`Failed to fetch current price for ${request.ticker}:`, error);
87
- throw new Error(`Marketstack: Failed to fetch current price for ${request.ticker}: ${error.message}`);
87
+ // If intraday fails, fallback to EOD with warning
88
+ if (error.message?.includes('intraday') || error.message?.includes('Marketstack API error')) {
89
+ this.logger.warn(`Intraday endpoint failed for ${request.ticker}, falling back to EOD:`, error.message);
90
+ try {
91
+ return await this.fetchCurrentPriceEod(request);
92
+ }
93
+ catch (eodError) {
94
+ // Both failed, throw original error
95
+ throw error;
96
+ }
97
+ }
98
+ throw error;
88
99
  }
89
100
  }
101
+ /**
102
+ * Fetch current price using intraday endpoint (during market hours)
103
+ * Uses 1min interval for most recent data
104
+ */
105
+ async fetchCurrentPriceIntraday(request, marketState) {
106
+ const formattedSymbol = this.formatSymbolForIntraday(request.ticker);
107
+ let url = `${this.baseUrl}/tickers/${formattedSymbol}/intraday/latest?access_key=${this.apiKey}`;
108
+ url += `&interval=1min`; // Use 1min for most recent data
109
+ // Add exchange filter if specified
110
+ if (request.exchange) {
111
+ url += `&exchange=${request.exchange}`;
112
+ }
113
+ const response = await plugins.smartrequest.SmartRequest.create()
114
+ .url(url)
115
+ .timeout(this.config?.timeout || 10000)
116
+ .get();
117
+ const responseData = await response.json();
118
+ // Check for API errors
119
+ if (responseData.error) {
120
+ throw new Error(`Marketstack API error: ${responseData.error.message || JSON.stringify(responseData.error)}`);
121
+ }
122
+ if (!responseData || !responseData.close) {
123
+ throw new Error(`No intraday data found for ticker ${request.ticker}`);
124
+ }
125
+ return this.mapToStockPrice(responseData, 'intraday', marketState);
126
+ }
127
+ /**
128
+ * Fetch current price using EOD endpoint (after market close)
129
+ */
130
+ async fetchCurrentPriceEod(request) {
131
+ let url = `${this.baseUrl}/tickers/${request.ticker}/eod/latest?access_key=${this.apiKey}`;
132
+ // Add exchange filter if specified
133
+ if (request.exchange) {
134
+ url += `&exchange=${request.exchange}`;
135
+ }
136
+ const response = await plugins.smartrequest.SmartRequest.create()
137
+ .url(url)
138
+ .timeout(this.config?.timeout || 10000)
139
+ .get();
140
+ const responseData = await response.json();
141
+ // Check for API errors
142
+ if (responseData.error) {
143
+ throw new Error(`Marketstack API error: ${responseData.error.message || JSON.stringify(responseData.error)}`);
144
+ }
145
+ // For single ticker endpoint, response is direct object (not wrapped in data field)
146
+ if (!responseData || !responseData.close) {
147
+ throw new Error(`No data found for ticker ${request.ticker}`);
148
+ }
149
+ return this.mapToStockPrice(responseData, 'eod');
150
+ }
90
151
  /**
91
152
  * Fetch historical EOD prices for a ticker with date range
92
153
  */
@@ -95,7 +156,7 @@ export class MarketstackProvider {
95
156
  const allPrices = [];
96
157
  let offset = request.offset || 0;
97
158
  const limit = request.limit || 1000; // Max per page
98
- const maxRecords = 10000; // Safety limit
159
+ const maxRecords = this.config?.maxRecords || 10000; // Safety limit (configurable)
99
160
  while (true) {
100
161
  let url = `${this.baseUrl}/eod?access_key=${this.apiKey}`;
101
162
  url += `&symbols=${request.ticker}`;
@@ -147,52 +208,184 @@ export class MarketstackProvider {
147
208
  }
148
209
  }
149
210
  /**
150
- * Fetch intraday prices with specified interval (Phase 2 placeholder)
211
+ * Fetch intraday prices with specified interval
212
+ * Supports intervals: 1min, 5min, 10min, 15min, 30min, 1hour
213
+ * Note: Intervals below 15min require Professional Plan or higher
151
214
  */
152
215
  async fetchIntradayPrices(request) {
153
- throw new Error('Intraday data support coming in Phase 2. For now, use EOD data with type: "current" or "historical"');
216
+ try {
217
+ const allPrices = [];
218
+ let offset = 0;
219
+ const limit = 1000; // Max per page for intraday
220
+ const maxRecords = this.config?.maxRecords || 10000; // Safety limit (configurable)
221
+ // Apply default limit if user didn't specify one (performance optimization)
222
+ const effectiveLimit = request.limit || this.config?.defaultIntradayLimit || 1000;
223
+ // Warn if fetching large amount of data without explicit limit
224
+ if (!request.limit && effectiveLimit > 1000) {
225
+ this.logger.warn(`Intraday request for ${request.ticker} without explicit limit will fetch up to ${effectiveLimit} records. ` +
226
+ `Consider adding a limit to the request for better performance.`);
227
+ }
228
+ // Format symbol for intraday endpoint (replace . with -)
229
+ const formattedSymbol = this.formatSymbolForIntraday(request.ticker);
230
+ while (true) {
231
+ let url = `${this.baseUrl}/tickers/${formattedSymbol}/intraday?access_key=${this.apiKey}`;
232
+ url += `&interval=${request.interval}`;
233
+ url += `&limit=${limit}`;
234
+ url += `&offset=${offset}`;
235
+ // Add date filter if specified
236
+ if (request.date) {
237
+ url += `&date_from=${this.formatDate(request.date)}`;
238
+ url += `&date_to=${this.formatDate(request.date)}`;
239
+ }
240
+ // Add exchange filter if specified
241
+ if (request.exchange) {
242
+ url += `&exchange=${request.exchange}`;
243
+ }
244
+ const response = await plugins.smartrequest.SmartRequest.create()
245
+ .url(url)
246
+ .timeout(this.config?.timeout || 15000)
247
+ .get();
248
+ const responseData = await response.json();
249
+ // Check for API errors
250
+ if (responseData.error) {
251
+ throw new Error(`Marketstack API error: ${responseData.error.message || JSON.stringify(responseData.error)}`);
252
+ }
253
+ if (!responseData?.data || !Array.isArray(responseData.data)) {
254
+ throw new Error('Invalid response format from Marketstack API');
255
+ }
256
+ // Map data to stock prices
257
+ for (const data of responseData.data) {
258
+ try {
259
+ allPrices.push(this.mapToStockPrice(data, 'intraday'));
260
+ }
261
+ catch (error) {
262
+ this.logger.warn(`Failed to parse intraday data for ${data.symbol}:`, error);
263
+ }
264
+ }
265
+ // Check if we have more pages
266
+ const pagination = responseData.pagination;
267
+ const hasMore = pagination && offset + limit < pagination.total;
268
+ // Honor effective limit or safety maxRecords
269
+ if (!hasMore || allPrices.length >= effectiveLimit || allPrices.length >= maxRecords) {
270
+ break;
271
+ }
272
+ offset += limit;
273
+ }
274
+ // Apply effective limit
275
+ if (allPrices.length > effectiveLimit) {
276
+ return allPrices.slice(0, effectiveLimit);
277
+ }
278
+ return allPrices;
279
+ }
280
+ catch (error) {
281
+ this.logger.error(`Failed to fetch intraday prices for ${request.ticker}:`, error);
282
+ throw new Error(`Marketstack: Failed to fetch intraday prices for ${request.ticker}: ${error.message}`);
283
+ }
154
284
  }
155
285
  /**
156
- * Fetch current prices for multiple tickers (new API)
286
+ * Fetch current prices for multiple tickers with intelligent endpoint selection
287
+ * Uses intraday during market hours (PRE, REGULAR, POST) for fresh data
288
+ * Uses EOD after market close (CLOSED) to save API credits
157
289
  */
158
290
  async fetchBatchCurrentPrices(request) {
159
291
  try {
160
- const symbols = request.tickers.join(',');
161
- let url = `${this.baseUrl}/eod/latest?access_key=${this.apiKey}&symbols=${symbols}`;
162
- if (request.exchange) {
163
- url += `&exchange=${request.exchange}`;
164
- }
165
- const response = await plugins.smartrequest.SmartRequest.create()
166
- .url(url)
167
- .timeout(this.config?.timeout || 15000)
168
- .get();
169
- const responseData = await response.json();
170
- // Check for API errors
171
- if (responseData.error) {
172
- throw new Error(`Marketstack API error: ${responseData.error.message || JSON.stringify(responseData.error)}`);
292
+ // Determine current market state
293
+ const marketState = this.getUsMarketState();
294
+ const useIntraday = this.shouldUseIntradayEndpoint(marketState);
295
+ if (useIntraday) {
296
+ return await this.fetchBatchCurrentPricesIntraday(request, marketState);
173
297
  }
174
- if (!responseData?.data || !Array.isArray(responseData.data)) {
175
- throw new Error('Invalid response format from Marketstack API');
298
+ else {
299
+ return await this.fetchBatchCurrentPricesEod(request);
176
300
  }
177
- const prices = [];
178
- for (const data of responseData.data) {
301
+ }
302
+ catch (error) {
303
+ // Fallback to EOD if intraday fails
304
+ if (error.message?.includes('intraday') || error.message?.includes('Marketstack API error')) {
305
+ this.logger.warn(`Intraday batch endpoint failed, falling back to EOD:`, error.message);
179
306
  try {
180
- prices.push(this.mapToStockPrice(data, 'eod'));
307
+ return await this.fetchBatchCurrentPricesEod(request);
181
308
  }
182
- catch (error) {
183
- this.logger.warn(`Failed to parse data for ${data.symbol}:`, error);
184
- // Continue processing other tickers
309
+ catch (eodError) {
310
+ // Both failed, throw original error
311
+ throw error;
185
312
  }
186
313
  }
187
- if (prices.length === 0) {
188
- throw new Error('No valid price data received from batch request');
314
+ throw error;
315
+ }
316
+ }
317
+ /**
318
+ * Fetch batch current prices using intraday endpoint
319
+ */
320
+ async fetchBatchCurrentPricesIntraday(request, marketState) {
321
+ // Format symbols for intraday (replace . with -)
322
+ const formattedSymbols = request.tickers.map(t => this.formatSymbolForIntraday(t)).join(',');
323
+ let url = `${this.baseUrl}/intraday/latest?access_key=${this.apiKey}`;
324
+ url += `&symbols=${formattedSymbols}`;
325
+ url += `&interval=1min`; // Use 1min for most recent data
326
+ if (request.exchange) {
327
+ url += `&exchange=${request.exchange}`;
328
+ }
329
+ const response = await plugins.smartrequest.SmartRequest.create()
330
+ .url(url)
331
+ .timeout(this.config?.timeout || 15000)
332
+ .get();
333
+ const responseData = await response.json();
334
+ if (responseData.error) {
335
+ throw new Error(`Marketstack API error: ${responseData.error.message || JSON.stringify(responseData.error)}`);
336
+ }
337
+ if (!responseData?.data || !Array.isArray(responseData.data)) {
338
+ throw new Error('Invalid response format from Marketstack API');
339
+ }
340
+ const prices = [];
341
+ for (const data of responseData.data) {
342
+ try {
343
+ prices.push(this.mapToStockPrice(data, 'intraday', marketState));
344
+ }
345
+ catch (error) {
346
+ this.logger.warn(`Failed to parse intraday data for ${data.symbol}:`, error);
189
347
  }
190
- return prices;
191
348
  }
192
- catch (error) {
193
- this.logger.error(`Failed to fetch batch current prices:`, error);
194
- throw new Error(`Marketstack: Failed to fetch batch current prices: ${error.message}`);
349
+ if (prices.length === 0) {
350
+ throw new Error('No valid price data received from batch intraday request');
195
351
  }
352
+ return prices;
353
+ }
354
+ /**
355
+ * Fetch batch current prices using EOD endpoint
356
+ */
357
+ async fetchBatchCurrentPricesEod(request) {
358
+ const symbols = request.tickers.join(',');
359
+ let url = `${this.baseUrl}/eod/latest?access_key=${this.apiKey}&symbols=${symbols}`;
360
+ if (request.exchange) {
361
+ url += `&exchange=${request.exchange}`;
362
+ }
363
+ const response = await plugins.smartrequest.SmartRequest.create()
364
+ .url(url)
365
+ .timeout(this.config?.timeout || 15000)
366
+ .get();
367
+ const responseData = await response.json();
368
+ // Check for API errors
369
+ if (responseData.error) {
370
+ throw new Error(`Marketstack API error: ${responseData.error.message || JSON.stringify(responseData.error)}`);
371
+ }
372
+ if (!responseData?.data || !Array.isArray(responseData.data)) {
373
+ throw new Error('Invalid response format from Marketstack API');
374
+ }
375
+ const prices = [];
376
+ for (const data of responseData.data) {
377
+ try {
378
+ prices.push(this.mapToStockPrice(data, 'eod'));
379
+ }
380
+ catch (error) {
381
+ this.logger.warn(`Failed to parse data for ${data.symbol}:`, error);
382
+ // Continue processing other tickers
383
+ }
384
+ }
385
+ if (prices.length === 0) {
386
+ throw new Error('No valid price data received from batch request');
387
+ }
388
+ return prices;
196
389
  }
197
390
  /**
198
391
  * Check if the Marketstack API is available and accessible
@@ -237,8 +430,11 @@ export class MarketstackProvider {
237
430
  }
238
431
  /**
239
432
  * Map Marketstack API response to IStockPrice interface
433
+ * @param data - API response data
434
+ * @param dataType - Type of data (eod, intraday, live)
435
+ * @param explicitMarketState - Override market state (used for intraday data fetched during known market hours)
240
436
  */
241
- mapToStockPrice(data, dataType = 'eod') {
437
+ mapToStockPrice(data, dataType = 'eod', explicitMarketState) {
242
438
  if (!data.close) {
243
439
  throw new Error('Missing required price data');
244
440
  }
@@ -252,6 +448,24 @@ export class MarketstackProvider {
252
448
  // Parse timestamp
253
449
  const timestamp = data.date ? new Date(data.date) : new Date();
254
450
  const fetchedAt = new Date();
451
+ // Determine market state intelligently
452
+ let marketState;
453
+ if (explicitMarketState) {
454
+ // Use provided market state (for intraday data fetched during known market hours)
455
+ marketState = explicitMarketState;
456
+ }
457
+ else if (dataType === 'eod') {
458
+ // EOD data is always for closed markets
459
+ marketState = 'CLOSED';
460
+ }
461
+ else if (dataType === 'intraday') {
462
+ // For intraday data without explicit state, determine from timestamp
463
+ marketState = this.getUsMarketState(timestamp.getTime());
464
+ }
465
+ else {
466
+ // Default fallback
467
+ marketState = 'CLOSED';
468
+ }
255
469
  const stockPrice = {
256
470
  ticker: data.symbol.toUpperCase(),
257
471
  price: currentPrice,
@@ -261,7 +475,7 @@ export class MarketstackProvider {
261
475
  previousClose: previousClose,
262
476
  timestamp: timestamp,
263
477
  provider: this.name,
264
- marketState: 'CLOSED', // EOD data is always for closed markets
478
+ marketState: marketState, // Now dynamic based on data type, timestamp, and explicit state
265
479
  exchange: data.exchange,
266
480
  exchangeName: data.exchange_code || data.name,
267
481
  // Phase 1 enhancements: OHLCV data
@@ -314,5 +528,71 @@ export class MarketstackProvider {
314
528
  const day = String(date.getDate()).padStart(2, '0');
315
529
  return `${year}-${month}-${day}`;
316
530
  }
531
+ /**
532
+ * Get US market state based on Eastern Time
533
+ * Regular hours: 9:30 AM - 4:00 PM ET
534
+ * Pre-market: 4:00 AM - 9:30 AM ET
535
+ * After-hours: 4:00 PM - 8:00 PM ET
536
+ *
537
+ * @param timestampMs - Optional timestamp in milliseconds (defaults to current time)
538
+ * @returns Market state: PRE, REGULAR, POST, or CLOSED
539
+ */
540
+ getUsMarketState(timestampMs) {
541
+ const now = timestampMs ? new Date(timestampMs) : new Date();
542
+ // Convert to ET (UTC-5 or UTC-4 depending on DST)
543
+ // For simplicity, we'll use a rough approximation
544
+ // TODO: Add proper timezone library for production use
545
+ const etOffset = -5; // Standard time, adjust for DST if needed
546
+ const etTime = new Date(now.getTime() + (etOffset * 60 * 60 * 1000));
547
+ // Get day of week (0 = Sunday, 6 = Saturday)
548
+ const dayOfWeek = etTime.getUTCDay();
549
+ // Check if weekend
550
+ if (dayOfWeek === 0 || dayOfWeek === 6) {
551
+ return 'CLOSED';
552
+ }
553
+ // Get hour and minute in ET
554
+ const hours = etTime.getUTCHours();
555
+ const minutes = etTime.getUTCMinutes();
556
+ const timeInMinutes = hours * 60 + minutes;
557
+ // Define market hours in minutes
558
+ const preMarketStart = 4 * 60; // 4:00 AM
559
+ const regularMarketStart = 9 * 60 + 30; // 9:30 AM
560
+ const regularMarketEnd = 16 * 60; // 4:00 PM
561
+ const afterHoursEnd = 20 * 60; // 8:00 PM
562
+ if (timeInMinutes >= preMarketStart && timeInMinutes < regularMarketStart) {
563
+ return 'PRE';
564
+ }
565
+ else if (timeInMinutes >= regularMarketStart && timeInMinutes < regularMarketEnd) {
566
+ return 'REGULAR';
567
+ }
568
+ else if (timeInMinutes >= regularMarketEnd && timeInMinutes < afterHoursEnd) {
569
+ return 'POST';
570
+ }
571
+ else {
572
+ return 'CLOSED';
573
+ }
574
+ }
575
+ /**
576
+ * Determine if intraday endpoint should be used based on market state
577
+ * Uses intraday for PRE, REGULAR, and POST market states
578
+ * Uses EOD for CLOSED state to save API credits
579
+ *
580
+ * @param marketState - Current market state
581
+ * @returns true if intraday endpoint should be used
582
+ */
583
+ shouldUseIntradayEndpoint(marketState) {
584
+ return marketState !== 'CLOSED';
585
+ }
586
+ /**
587
+ * Format ticker symbol for intraday endpoints
588
+ * Marketstack intraday API requires periods to be replaced with hyphens
589
+ * Example: BRK.B → BRK-B
590
+ *
591
+ * @param symbol - Original ticker symbol
592
+ * @returns Formatted symbol for intraday endpoints
593
+ */
594
+ formatSymbolForIntraday(symbol) {
595
+ return symbol.replace(/\./g, '-');
596
+ }
317
597
  }
318
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXIubWFya2V0c3RhY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9zdG9ja3MvcHJvdmlkZXJzL3Byb3ZpZGVyLm1hcmtldHN0YWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFXNUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUJHO0FBQ0gsTUFBTSxPQUFPLG1CQUFtQjtJQWE5QixZQUFZLE1BQWMsRUFBVSxNQUF3QjtRQUF4QixXQUFNLEdBQU4sTUFBTSxDQUFrQjtRQVpyRCxTQUFJLEdBQUcsYUFBYSxDQUFDO1FBQ3JCLGFBQVEsR0FBRyxFQUFFLENBQUMsQ0FBQyw4REFBOEQ7UUFDcEUsaUJBQVksR0FBRyxJQUFJLENBQUM7UUFDcEIsY0FBUyxHQUFHO1lBQzFCLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxnQ0FBZ0M7WUFDOUQsY0FBYyxFQUFFLFNBQVMsQ0FBQyxpQkFBaUI7U0FDNUMsQ0FBQztRQUVNLFdBQU0sR0FBRyxPQUFPLENBQUM7UUFDakIsWUFBTyxHQUFHLGdDQUFnQyxDQUFDO1FBSWpELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLE1BQU0sSUFBSSxLQUFLLENBQUMsOENBQThDLENBQUMsQ0FBQztRQUNsRSxDQUFDO1FBRUQsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7SUFDdkIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUEwQjtRQUMvQyxRQUFRLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNyQixLQUFLLFNBQVM7Z0JBQ1osT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDekMsS0FBSyxZQUFZO2dCQUNmLE9BQU8sSUFBSSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzdDLEtBQUssVUFBVTtnQkFDYixPQUFP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
598
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXIubWFya2V0c3RhY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9zdG9ja3MvcHJvdmlkZXJzL3Byb3ZpZGVyLm1hcmtldHN0YWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFXNUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQThCRztBQUNILE1BQU0sT0FBTyxtQkFBbUI7SUFhOUIsWUFBWSxNQUFjLEVBQVUsTUFBd0I7UUFBeEIsV0FBTSxHQUFOLE1BQU0sQ0FBa0I7UUFackQsU0FBSSxHQUFHLGFBQWEsQ0FBQztRQUNyQixhQUFRLEdBQUcsRUFBRSxDQUFDLENBQUMsK0VBQStFO1FBQ3JGLGlCQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLGNBQVMsR0FBRztZQUMxQixpQkFBaUIsRUFBRSxTQUFTLEVBQUUsZ0NBQWdDO1lBQzlELGNBQWMsRUFBRSxTQUFTLENBQUMsaUJBQWlCO1NBQzVDLENBQUM7UUFFTSxXQUFNLEdBQUcsT0FBTyxDQUFDO1FBQ2pCLFlBQU8sR0FBRyxnQ0FBZ0MsQ0FBQztRQUlqRCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixNQUFNLElBQUksS0FBSyxDQUFDLDhDQUE4QyxDQUFDLENBQUM7UUFDbEUsQ0FBQztRQUVELElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxTQUFTLENBQUMsT0FBMEI7UUFDL0MsUUFBUSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDckIsS0FBSyxTQUFTO2dCQUNaLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3pDLEtBQUssWUFBWTtnQkFDZixPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM3QyxLQUFLLFVBQVU7Z0JB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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fin.cx/opendata",
3
- "version": "3.3.0",
3
+ "version": "3.5.0",
4
4
  "private": false,
5
5
  "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.",
6
6
  "main": "dist_ts/index.js",
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@fin.cx/opendata',
6
- version: '3.3.0',
6
+ version: '3.5.0',
7
7
  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.'
8
8
  }