@livefolio/sdk 0.2.12 → 0.3.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.
Files changed (110) hide show
  1. package/README.md +277 -84
  2. package/dist/index.d.ts +397 -23
  3. package/dist/index.js +1375 -51
  4. package/dist/index.js.map +1 -1
  5. package/package.json +36 -35
  6. package/dist/auth/client.d.ts +0 -4
  7. package/dist/auth/client.d.ts.map +0 -1
  8. package/dist/auth/client.js +0 -37
  9. package/dist/auth/client.js.map +0 -1
  10. package/dist/auth/index.d.ts +0 -3
  11. package/dist/auth/index.d.ts.map +0 -1
  12. package/dist/auth/index.js +0 -6
  13. package/dist/auth/index.js.map +0 -1
  14. package/dist/auth/types.d.ts +0 -9
  15. package/dist/auth/types.d.ts.map +0 -1
  16. package/dist/auth/types.js +0 -3
  17. package/dist/auth/types.js.map +0 -1
  18. package/dist/index.d.ts.map +0 -1
  19. package/dist/market/client.d.ts +0 -4
  20. package/dist/market/client.d.ts.map +0 -1
  21. package/dist/market/client.js +0 -137
  22. package/dist/market/client.js.map +0 -1
  23. package/dist/market/index.d.ts +0 -5
  24. package/dist/market/index.d.ts.map +0 -1
  25. package/dist/market/index.js +0 -9
  26. package/dist/market/index.js.map +0 -1
  27. package/dist/market/trackedTickers.d.ts +0 -4
  28. package/dist/market/trackedTickers.d.ts.map +0 -1
  29. package/dist/market/trackedTickers.js +0 -256
  30. package/dist/market/trackedTickers.js.map +0 -1
  31. package/dist/market/types.d.ts +0 -29
  32. package/dist/market/types.d.ts.map +0 -1
  33. package/dist/market/types.js +0 -3
  34. package/dist/market/types.js.map +0 -1
  35. package/dist/portfolio/client.d.ts +0 -4
  36. package/dist/portfolio/client.d.ts.map +0 -1
  37. package/dist/portfolio/client.js +0 -13
  38. package/dist/portfolio/client.js.map +0 -1
  39. package/dist/portfolio/index.d.ts +0 -5
  40. package/dist/portfolio/index.d.ts.map +0 -1
  41. package/dist/portfolio/index.js +0 -26
  42. package/dist/portfolio/index.js.map +0 -1
  43. package/dist/portfolio/rebalance.d.ts +0 -62
  44. package/dist/portfolio/rebalance.d.ts.map +0 -1
  45. package/dist/portfolio/rebalance.js +0 -205
  46. package/dist/portfolio/rebalance.js.map +0 -1
  47. package/dist/portfolio/symbols.d.ts +0 -13
  48. package/dist/portfolio/symbols.d.ts.map +0 -1
  49. package/dist/portfolio/symbols.js +0 -112
  50. package/dist/portfolio/symbols.js.map +0 -1
  51. package/dist/portfolio/types.d.ts +0 -13
  52. package/dist/portfolio/types.d.ts.map +0 -1
  53. package/dist/portfolio/types.js +0 -3
  54. package/dist/portfolio/types.js.map +0 -1
  55. package/dist/strategy/backtest.d.ts +0 -6
  56. package/dist/strategy/backtest.d.ts.map +0 -1
  57. package/dist/strategy/backtest.js +0 -698
  58. package/dist/strategy/backtest.js.map +0 -1
  59. package/dist/strategy/cache.d.ts +0 -8
  60. package/dist/strategy/cache.d.ts.map +0 -1
  61. package/dist/strategy/cache.js +0 -314
  62. package/dist/strategy/cache.js.map +0 -1
  63. package/dist/strategy/client.d.ts +0 -4
  64. package/dist/strategy/client.d.ts.map +0 -1
  65. package/dist/strategy/client.js +0 -29
  66. package/dist/strategy/client.js.map +0 -1
  67. package/dist/strategy/evaluate.d.ts +0 -10
  68. package/dist/strategy/evaluate.d.ts.map +0 -1
  69. package/dist/strategy/evaluate.js +0 -528
  70. package/dist/strategy/evaluate.js.map +0 -1
  71. package/dist/strategy/get.d.ts +0 -5
  72. package/dist/strategy/get.d.ts.map +0 -1
  73. package/dist/strategy/get.js +0 -25
  74. package/dist/strategy/get.js.map +0 -1
  75. package/dist/strategy/index.d.ts +0 -14
  76. package/dist/strategy/index.d.ts.map +0 -1
  77. package/dist/strategy/index.js +0 -42
  78. package/dist/strategy/index.js.map +0 -1
  79. package/dist/strategy/livefolio.d.ts +0 -25
  80. package/dist/strategy/livefolio.d.ts.map +0 -1
  81. package/dist/strategy/livefolio.js +0 -67
  82. package/dist/strategy/livefolio.js.map +0 -1
  83. package/dist/strategy/performance.d.ts +0 -17
  84. package/dist/strategy/performance.d.ts.map +0 -1
  85. package/dist/strategy/performance.js +0 -57
  86. package/dist/strategy/performance.js.map +0 -1
  87. package/dist/strategy/rules.d.ts +0 -3
  88. package/dist/strategy/rules.d.ts.map +0 -1
  89. package/dist/strategy/rules.js +0 -95
  90. package/dist/strategy/rules.js.map +0 -1
  91. package/dist/strategy/stream.d.ts +0 -5
  92. package/dist/strategy/stream.d.ts.map +0 -1
  93. package/dist/strategy/stream.js +0 -58
  94. package/dist/strategy/stream.js.map +0 -1
  95. package/dist/strategy/symbols.d.ts +0 -4
  96. package/dist/strategy/symbols.d.ts.map +0 -1
  97. package/dist/strategy/symbols.js +0 -41
  98. package/dist/strategy/symbols.js.map +0 -1
  99. package/dist/strategy/time.d.ts +0 -9
  100. package/dist/strategy/time.d.ts.map +0 -1
  101. package/dist/strategy/time.js +0 -28
  102. package/dist/strategy/time.js.map +0 -1
  103. package/dist/strategy/types.d.ts +0 -200
  104. package/dist/strategy/types.d.ts.map +0 -1
  105. package/dist/strategy/types.js +0 -3
  106. package/dist/strategy/types.js.map +0 -1
  107. package/dist/types.d.ts +0 -4
  108. package/dist/types.d.ts.map +0 -1
  109. package/dist/types.js +0 -3
  110. package/dist/types.js.map +0 -1
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BA,sDAQC;AArCD,+CAA+B;AAC/B,mDAAmC;AACnC,uDAAuC;AACvC,yDAAyC;AAazC,iCAAoC;AACpC,qCAAwC;AACxC,yCAA4C;AAC5C,2CAA8C;AAU9C,SAAgB,qBAAqB,CAAC,QAA6B;IACjE,OAAO;QACL,QAAQ;QACR,IAAI,EAAE,IAAA,iBAAU,EAAC,QAAQ,CAAC;QAC1B,MAAM,EAAE,IAAA,qBAAY,EAAC,QAAQ,CAAC;QAC9B,QAAQ,EAAE,IAAA,yBAAc,EAAC,QAAQ,CAAC;QAClC,SAAS,EAAE,IAAA,2BAAe,EAAC,QAAQ,CAAC;KACrC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"sources":["../src/handles/ticker.ts","../src/providers/mappings.ts","../src/computations/sma.ts","../src/computations/ema.ts","../src/computations/rsi.ts","../src/computations/returns.ts","../src/computations/volatility.ts","../src/computations/drawdown.ts","../src/computations/calendar.ts","../src/computations/index.ts","../src/handles/indicator.ts","../src/computations/signal.ts","../src/handles/signal.ts","../src/handles/allocation.ts","../src/handles/strategy.ts","../src/computations/strategy.ts","../src/handles/portfolio.ts","../src/backtest/simulate.ts","../src/backtest/types.ts","../src/client.ts"],"sourcesContent":["import type { StorageProvider } from '../providers/storage';\n\nexport class TickerHandle {\n readonly symbol: string;\n readonly leverage: number;\n\n private _storage: StorageProvider;\n private _resolvedId: number | null = null;\n private _resolving: Promise<{ id: number }> | null = null;\n\n constructor(storage: StorageProvider, symbol: string, leverage: number = 1) {\n this._storage = storage;\n this.symbol = symbol.toUpperCase();\n this.leverage = leverage;\n }\n\n get id(): number {\n if (this._resolvedId == null)\n throw new Error('TickerHandle not yet resolved. Call resolve(), or access via an async method.');\n return this._resolvedId;\n }\n\n async resolve(): Promise<{ id: number }> {\n if (this._resolvedId != null) return { id: this._resolvedId };\n if (!this._resolving) this._resolving = this._doResolve();\n return this._resolving;\n }\n\n static fromResolved(storage: StorageProvider, id: number, symbol: string, leverage: number): TickerHandle {\n const handle = new TickerHandle(storage, symbol, leverage);\n handle._resolvedId = id;\n return handle;\n }\n\n private async _doResolve(): Promise<{ id: number }> {\n const result = await this._storage.tickers.findOrCreate(this.symbol, this.leverage);\n this._resolvedId = result.id;\n return result;\n }\n}\n","import type { IndicatorType } from './types';\n\nexport type ProviderInfo =\n | { provider: 'yahoo'; symbol: string }\n | { provider: 'fred'; seriesId: string }\n | { provider: 'computed'; dependsOn: 'Price'; symbol: string }\n | { provider: 'calendar' }\n | { provider: 'none' };\n\nconst FRED_SERIES: Record<string, string> = {\n T3M: 'DGS3MO',\n T6M: 'DGS6MO',\n T1Y: 'DGS1',\n T2Y: 'DGS2',\n T3Y: 'DGS3',\n T5Y: 'DGS5',\n T7Y: 'DGS7',\n T10Y: 'DGS10',\n T20Y: 'DGS20',\n T30Y: 'DGS30',\n};\n\nconst COMPUTED_TYPES = new Set<string>(['SMA', 'EMA', 'RSI', 'Return', 'Volatility', 'Drawdown']);\nconst CALENDAR_TYPES = new Set<string>(['Month', 'Day of Week', 'Day of Month', 'Day of Year']);\n\nexport function getProviderInfo(type: IndicatorType, tickerSymbol: string | null): ProviderInfo {\n if (type === 'Price') return { provider: 'yahoo', symbol: tickerSymbol! };\n if (type === 'VIX') return { provider: 'yahoo', symbol: '^VIX' };\n if (type === 'VIX3M') return { provider: 'yahoo', symbol: '^VIX3M' };\n\n if (type in FRED_SERIES) return { provider: 'fred', seriesId: FRED_SERIES[type] };\n\n if (COMPUTED_TYPES.has(type)) return { provider: 'computed', dependsOn: 'Price', symbol: tickerSymbol! };\n\n if (CALENDAR_TYPES.has(type)) return { provider: 'calendar' };\n\n return { provider: 'none' };\n}\n","import type { DailyBar } from '../handles/indicator';\n\nexport function computeSma(bars: DailyBar[], lookback: number): DailyBar[] {\n if (bars.length < lookback) return [];\n const result: DailyBar[] = [];\n let sum = 0;\n for (let i = 0; i < lookback; i++) sum += bars[i].value;\n result.push({ date: bars[lookback - 1].date, value: sum / lookback });\n for (let i = lookback; i < bars.length; i++) {\n sum += bars[i].value - bars[i - lookback].value;\n result.push({ date: bars[i].date, value: sum / lookback });\n }\n return result;\n}\n","import type { DailyBar } from '../handles/indicator';\n\nexport function computeEma(bars: DailyBar[], lookback: number): DailyBar[] {\n if (bars.length < lookback) return [];\n const multiplier = 2 / (lookback + 1);\n const result: DailyBar[] = [];\n let sum = 0;\n for (let i = 0; i < lookback; i++) sum += bars[i].value;\n let ema = sum / lookback;\n result.push({ date: bars[lookback - 1].date, value: ema });\n for (let i = lookback; i < bars.length; i++) {\n ema = bars[i].value * multiplier + ema * (1 - multiplier);\n result.push({ date: bars[i].date, value: ema });\n }\n return result;\n}\n","import type { DailyBar } from '../handles/indicator';\n\nexport function computeRsi(bars: DailyBar[], lookback: number): DailyBar[] {\n if (bars.length < lookback + 1) return [];\n const changes: number[] = [];\n for (let i = 1; i < bars.length; i++) {\n changes.push(bars[i].value - bars[i - 1].value);\n }\n let avgGain = 0;\n let avgLoss = 0;\n for (let i = 0; i < lookback; i++) {\n if (changes[i] > 0) avgGain += changes[i];\n else avgLoss += Math.abs(changes[i]);\n }\n avgGain /= lookback;\n avgLoss /= lookback;\n const result: DailyBar[] = [];\n const rs = avgLoss === 0 ? 100 : avgGain / avgLoss;\n result.push({\n date: bars[lookback].date,\n value: avgLoss === 0 ? 100 : 100 - 100 / (1 + rs),\n });\n for (let i = lookback; i < changes.length; i++) {\n const gain = changes[i] > 0 ? changes[i] : 0;\n const loss = changes[i] < 0 ? Math.abs(changes[i]) : 0;\n avgGain = (avgGain * (lookback - 1) + gain) / lookback;\n avgLoss = (avgLoss * (lookback - 1) + loss) / lookback;\n const smoothRs = avgLoss === 0 ? 100 : avgGain / avgLoss;\n result.push({\n date: bars[i + 1].date,\n value: avgLoss === 0 ? 100 : 100 - 100 / (1 + smoothRs),\n });\n }\n return result;\n}\n","import type { DailyBar } from '../handles/indicator';\n\nexport function computeReturns(bars: DailyBar[], lookback: number): DailyBar[] {\n if (bars.length <= lookback) return [];\n const result: DailyBar[] = [];\n for (let i = lookback; i < bars.length; i++) {\n result.push({\n date: bars[i].date,\n value: (bars[i].value - bars[i - lookback].value) / bars[i - lookback].value,\n });\n }\n return result;\n}\n","import type { DailyBar } from '../handles/indicator';\n\nexport function computeVolatility(bars: DailyBar[], lookback: number): DailyBar[] {\n if (bars.length < lookback + 1) return [];\n const dailyReturns: { date: string; value: number }[] = [];\n for (let i = 1; i < bars.length; i++) {\n dailyReturns.push({\n date: bars[i].date,\n value: bars[i].value / bars[i - 1].value - 1,\n });\n }\n if (dailyReturns.length < lookback) return [];\n const result: DailyBar[] = [];\n for (let i = lookback - 1; i < dailyReturns.length; i++) {\n const window = dailyReturns.slice(i - lookback + 1, i + 1);\n const mean = window.reduce((s, r) => s + r.value, 0) / lookback;\n const variance = window.reduce((s, r) => s + (r.value - mean) ** 2, 0) / lookback;\n result.push({ date: dailyReturns[i].date, value: Math.sqrt(variance) });\n }\n return result;\n}\n","import type { DailyBar } from '../handles/indicator';\n\nexport function computeDrawdown(bars: DailyBar[], lookback: number): DailyBar[] {\n if (bars.length < lookback) return [];\n const result: DailyBar[] = [];\n for (let i = lookback - 1; i < bars.length; i++) {\n let max = -Infinity;\n for (let j = i - lookback + 1; j <= i; j++) {\n if (bars[j].value > max) max = bars[j].value;\n }\n result.push({ date: bars[i].date, value: (bars[i].value - max) / max });\n }\n return result;\n}\n","import type { DailyBar } from '../handles/indicator';\n\ntype CalendarPeriod = 'Month' | 'Day of Week' | 'Day of Month' | 'Day of Year';\n\nfunction dayOfYear(d: Date): number {\n const start = new Date(d.getFullYear(), 0, 0);\n const diff = d.getTime() - start.getTime();\n return Math.floor(diff / (1000 * 60 * 60 * 24));\n}\n\nexport function computeCalendar(bars: DailyBar[], period: CalendarPeriod): DailyBar[] {\n return bars.map((bar) => {\n const [y, m, d] = bar.date.split('-').map(Number);\n const date = new Date(y, m - 1, d);\n let value: number;\n switch (period) {\n case 'Month':\n value = date.getMonth() + 1;\n break;\n case 'Day of Week':\n value = date.getDay();\n break;\n case 'Day of Month':\n value = date.getDate();\n break;\n case 'Day of Year':\n value = dayOfYear(date);\n break;\n }\n return { date: bar.date, value };\n });\n}\n","import type { DailyBar } from '../handles/indicator';\nimport type { IndicatorType } from '../providers/types';\nimport { computeSma } from './sma';\nimport { computeEma } from './ema';\nimport { computeRsi } from './rsi';\nimport { computeReturns } from './returns';\nimport { computeVolatility } from './volatility';\nimport { computeDrawdown } from './drawdown';\n\nexport { computeSma } from './sma';\nexport { computeEma } from './ema';\nexport { computeRsi } from './rsi';\nexport { computeReturns } from './returns';\nexport { computeVolatility } from './volatility';\nexport { computeDrawdown } from './drawdown';\nexport { computeCalendar } from './calendar';\ntype ComputeFn = (bars: DailyBar[], lookback: number) => DailyBar[];\n\nconst COMPUTATIONS: Partial<Record<IndicatorType, ComputeFn>> = {\n SMA: computeSma,\n EMA: computeEma,\n RSI: computeRsi,\n Return: computeReturns,\n Volatility: computeVolatility,\n Drawdown: computeDrawdown,\n};\n\nexport function getComputation(type: IndicatorType): ComputeFn | null {\n return COMPUTATIONS[type] ?? null;\n}\n","import type { StorageProvider } from '../providers/storage';\nimport type { MarketProvider } from '../providers/market';\nimport type { IndicatorType, Unit } from '../providers/types';\nimport { TickerHandle } from './ticker';\nimport { getProviderInfo } from '../providers/mappings';\nimport { getComputation } from '../computations/index';\nimport { computeCalendar } from '../computations/calendar';\n\nexport interface DailyBar {\n date: string;\n value: number;\n}\n\nexport interface IndicatorIdentity {\n type: IndicatorType;\n ticker: TickerHandle | null;\n lookback: number;\n delay: number;\n unit: Unit | null;\n threshold: number | null;\n}\n\nexport interface DateRange {\n from?: string;\n to?: string;\n}\n\nexport class IndicatorHandle {\n readonly type: IndicatorType;\n readonly ticker: TickerHandle | null;\n readonly lookback: number;\n readonly delay: number;\n readonly unit: Unit | null;\n readonly threshold: number | null;\n\n private _storage: StorageProvider;\n private _market: MarketProvider;\n private _resolvedId: number | null = null;\n private _resolving: Promise<{ id: number }> | null = null;\n\n private _cachedSeries: DailyBar[] | null = null;\n private _cachedAsOf: string | null = null;\n private _syncing: Promise<void> | null = null;\n\n constructor(storage: StorageProvider, market: MarketProvider, identity: IndicatorIdentity) {\n this._storage = storage;\n this._market = market;\n this.type = identity.type;\n this.ticker = identity.ticker;\n this.lookback = identity.lookback;\n this.delay = identity.delay;\n this.unit = identity.unit;\n this.threshold = identity.threshold;\n }\n\n get id(): number {\n if (this._resolvedId == null)\n throw new Error('IndicatorHandle not yet resolved. Call resolve(), or access via an async method.');\n return this._resolvedId;\n }\n\n async resolve(): Promise<{ id: number }> {\n if (this._resolvedId != null) return { id: this._resolvedId };\n if (!this._resolving) this._resolving = this._doResolve();\n return this._resolving;\n }\n\n static fromResolved(\n storage: StorageProvider,\n market: MarketProvider,\n id: number,\n identity: IndicatorIdentity,\n ): IndicatorHandle {\n const handle = new IndicatorHandle(storage, market, identity);\n handle._resolvedId = id;\n return handle;\n }\n\n private async _doResolve(): Promise<{ id: number }> {\n const tickerId = this.ticker ? (await this.ticker.resolve()).id : null;\n const result = await this._storage.indicators.findOrCreate({\n type: this.type,\n tickerId,\n lookback: this.lookback,\n delay: this.delay,\n unit: this.unit,\n threshold: this.threshold,\n });\n this._resolvedId = result.id;\n return result;\n }\n\n // ── Freshness & Sync ───────────────────────────────────────────────\n\n private async _getLatestClosedTradingDay(): Promise<string> {\n const date = await this._storage.tradingDays.getLatestClosed();\n if (!date) throw new Error('No closed trading days found');\n return date;\n }\n\n private async _getLatestSeriesDate(indicatorId: number): Promise<string | null> {\n return this._storage.indicators.getLatestSeriesDate(indicatorId);\n }\n\n private async _ensureFresh(): Promise<void> {\n const { id } = await this.resolve();\n const latestClosed = await this._getLatestClosedTradingDay();\n\n // In-memory cache still valid\n if (this._cachedAsOf === latestClosed) return;\n\n const latestSeries = await this._getLatestSeriesDate(id);\n\n if (latestSeries === latestClosed) {\n // DB is fresh — invalidate in-memory cache so next read picks up DB data\n this._cachedSeries = null;\n this._cachedAsOf = latestClosed;\n return;\n }\n\n // Need to sync — deduplicate concurrent calls\n if (!this._syncing) {\n this._syncing = this._sync(latestSeries ?? undefined, latestClosed).finally(() => {\n this._syncing = null;\n });\n }\n await this._syncing;\n\n this._cachedSeries = null;\n this._cachedAsOf = latestClosed;\n }\n\n private async _sync(fromDate: string | undefined, latestClosed: string): Promise<void> {\n const tickerSymbol = this.ticker?.symbol ?? null;\n const info = getProviderInfo(this.type, tickerSymbol);\n\n let bars: DailyBar[];\n\n switch (info.provider) {\n case 'yahoo':\n bars = await this._market.fetchBars(info.symbol, fromDate);\n break;\n\n case 'fred':\n bars = await this._market.fetchBars(info.seriesId, fromDate);\n break;\n\n case 'computed': {\n // Create an internal Price handle for the same ticker\n const priceHandle = new IndicatorHandle(this._storage, this._market, {\n type: 'Price',\n ticker: this.ticker,\n lookback: 0,\n delay: 0,\n unit: null,\n threshold: null,\n });\n\n // Recursively ensure Price data is fresh\n await priceHandle._ensureFresh();\n\n // Read Price series from DB\n const priceBars = await priceHandle._querySeriesFromDb();\n\n const computeFn = getComputation(this.type);\n if (!computeFn) throw new Error(`No computation found for type \"${this.type}\"`);\n\n bars = computeFn(priceBars, this.lookback);\n\n // If incremental, filter to only new bars\n if (fromDate) {\n bars = bars.filter((b) => b.date > fromDate);\n }\n break;\n }\n\n case 'calendar': {\n // Fetch all trading days to compute calendar values\n const allDays = await this._storage.tradingDays.getRange();\n const dayBars: DailyBar[] = allDays.map((date) => ({ date, value: 0 }));\n bars = computeCalendar(dayBars, this.type as 'Month' | 'Day of Week' | 'Day of Month' | 'Day of Year');\n\n if (fromDate) {\n bars = bars.filter((b) => b.date > fromDate);\n }\n break;\n }\n\n case 'none':\n // Threshold indicators have no series to sync\n return;\n }\n\n // Apply leverage to daily returns only for fetched (non-computed) indicators.\n // Computed indicators (RSI, SMA, etc.) already read from the leveraged price series.\n const leverage = this.ticker?.leverage ?? 1;\n if (leverage !== 1 && info.provider !== 'computed' && bars.length > 0) {\n // For incremental syncs, anchor the leverage chain to the last stored\n // leveraged price so we continue from where we left off rather than\n // restarting from the raw Yahoo price.\n let anchor: number;\n if (fromDate) {\n const lastStored = await this._storage.indicators.getValue(this._resolvedId!, fromDate);\n anchor = lastStored ?? bars[0]!.value;\n } else {\n anchor = bars[0]!.value;\n }\n const leveraged: DailyBar[] = [{ date: bars[0]!.date, value: anchor }];\n for (let i = 1; i < bars.length; i++) {\n const dailyReturn = (bars[i]!.value - bars[i - 1]!.value) / bars[i - 1]!.value;\n const prev = leveraged[i - 1]!.value;\n leveraged.push({ date: bars[i]!.date, value: prev * (1 + leverage * dailyReturn) });\n }\n bars = leveraged;\n }\n\n // Filter bars up to latestClosed\n bars = bars.filter((b) => b.date <= latestClosed);\n\n if (bars.length > 0) {\n await this._upsertSeries(bars);\n }\n }\n\n private async _upsertSeries(bars: DailyBar[]): Promise<void> {\n const { id } = await this.resolve();\n await this._storage.indicators.writeSeries(id, bars);\n }\n\n private async _querySeriesFromDb(range?: DateRange): Promise<DailyBar[]> {\n const { id } = await this.resolve();\n return this._storage.indicators.getSeries(id, range);\n }\n\n // ── Public data access ─────────────────────────────────────────────\n\n async series(range?: DateRange): Promise<DailyBar[]> {\n if (this.type === 'Threshold') {\n return this._syntheticThresholdSeries(range);\n }\n await this._ensureFresh();\n if (this._cachedSeries && !range) return this._cachedSeries;\n const bars = await this._querySeriesFromDb(range);\n if (!range) this._cachedSeries = bars;\n return bars;\n }\n\n private async _syntheticThresholdSeries(range?: DateRange): Promise<DailyBar[]> {\n const v = this.threshold!;\n const dates = await this._storage.tradingDays.getRange(range);\n return dates.map((date) => ({ date, value: v }));\n }\n\n async value(date?: string): Promise<number | null> {\n await this._ensureFresh();\n const { id } = await this.resolve();\n return this._storage.indicators.getValue(id, date);\n }\n}\n","import type { DailyBar } from '../handles/indicator';\n\ntype Comparison = '>' | '<' | '=';\n\nfunction computeBuffers(v2: number, tolerance: number, absolute: boolean): { upper: number; lower: number } {\n if (tolerance === 0) return { upper: v2, lower: v2 };\n if (absolute) return { upper: v2 + tolerance, lower: v2 - tolerance };\n return { upper: v2 * (1 + tolerance / 100), lower: v2 * (1 - tolerance / 100) };\n}\n\nfunction rawCompare(v1: number, v2: number, comparison: Comparison): number {\n switch (comparison) {\n case '>':\n return v1 > v2 ? 1 : 0;\n case '<':\n return v1 < v2 ? 1 : 0;\n case '=':\n return v1 === v2 ? 1 : 0;\n }\n}\n\nexport function evaluateSignal(\n series1: DailyBar[],\n series2: DailyBar[],\n comparison: Comparison,\n tolerance: number,\n absolute: boolean,\n previousValue?: number,\n): DailyBar[] {\n const s2Map = new Map<string, number>();\n for (const bar of series2) {\n s2Map.set(bar.date, bar.value);\n }\n\n const result: DailyBar[] = [];\n let prev = previousValue;\n\n for (const bar1 of series1) {\n const v2 = s2Map.get(bar1.date);\n if (v2 === undefined) continue;\n\n const v1 = bar1.value;\n const { upper, lower } = computeBuffers(v2, tolerance, absolute);\n\n let value: number;\n\n if (tolerance === 0) {\n value = rawCompare(v1, v2, comparison);\n } else if (comparison === '=') {\n value = v1 >= lower && v1 <= upper ? 1 : 0;\n } else if (prev === undefined) {\n value = rawCompare(v1, v2, comparison);\n } else if (comparison === '>') {\n if (prev === 1) {\n value = v1 < lower ? 0 : 1;\n } else {\n value = v1 > upper ? 1 : 0;\n }\n } else {\n // comparison === '<'\n if (prev === 1) {\n value = v1 > upper ? 0 : 1;\n } else {\n value = v1 < lower ? 1 : 0;\n }\n }\n\n result.push({ date: bar1.date, value });\n prev = value;\n }\n\n return result;\n}\n","// src/handles/signal.ts\nimport type { StorageProvider } from '../providers/storage';\nimport type { MarketProvider } from '../providers/market';\nimport type { Comparison } from '../providers/types';\nimport type { IndicatorHandle, DailyBar, DateRange } from './indicator';\nimport { evaluateSignal } from '../computations/signal';\n\nconst ABSOLUTE_TOLERANCE_TYPES = new Set([\n 'Return',\n 'Volatility',\n 'Drawdown',\n 'VIX',\n 'VIX3M',\n 'T3M',\n 'T6M',\n 'T1Y',\n 'T2Y',\n 'T3Y',\n 'T5Y',\n 'T7Y',\n 'T10Y',\n 'T20Y',\n 'T30Y',\n]);\n\nexport interface SignalIdentity {\n indicator1: IndicatorHandle;\n indicator2: IndicatorHandle;\n comparison: Comparison;\n tolerance: number;\n}\n\nexport class SignalHandle {\n readonly indicator1: IndicatorHandle;\n readonly indicator2: IndicatorHandle;\n readonly comparison: Comparison;\n readonly tolerance: number;\n\n private _storage: StorageProvider;\n private _market: MarketProvider;\n private _resolvedId: number | null = null;\n private _resolving: Promise<{ id: number }> | null = null;\n\n private _cachedSeries: DailyBar[] | null = null;\n private _cachedAsOf: string | null = null;\n private _syncing: Promise<void> | null = null;\n\n constructor(storage: StorageProvider, market: MarketProvider, identity: SignalIdentity) {\n this._storage = storage;\n this._market = market;\n this.indicator1 = identity.indicator1;\n this.indicator2 = identity.indicator2;\n this.comparison = identity.comparison;\n this.tolerance = identity.tolerance;\n }\n\n get id(): number {\n if (this._resolvedId == null)\n throw new Error('SignalHandle not yet resolved. Call resolve(), or access via an async method.');\n return this._resolvedId;\n }\n\n async resolve(): Promise<{ id: number }> {\n if (this._resolvedId != null) return { id: this._resolvedId };\n if (!this._resolving) this._resolving = this._doResolve();\n return this._resolving;\n }\n\n static fromResolved(\n storage: StorageProvider,\n market: MarketProvider,\n id: number,\n identity: SignalIdentity,\n ): SignalHandle {\n const handle = new SignalHandle(storage, market, identity);\n handle._resolvedId = id;\n return handle;\n }\n\n private async _doResolve(): Promise<{ id: number }> {\n const [ind1, ind2] = await Promise.all([this.indicator1.resolve(), this.indicator2.resolve()]);\n const result = await this._storage.signals.findOrCreate({\n indicatorId1: ind1.id,\n indicatorId2: ind2.id,\n comparison: this.comparison,\n tolerance: this.tolerance,\n });\n this._resolvedId = result.id;\n return result;\n }\n\n // ── Freshness & Sync ───────────────────────────────────────────────\n\n private async _getLatestClosedTradingDay(): Promise<string> {\n const date = await this._storage.tradingDays.getLatestClosed();\n if (!date) throw new Error('No closed trading days found');\n return date;\n }\n\n private async _getLatestSignalSeriesDate(signalId: number): Promise<string | null> {\n return this._storage.signals.getLatestSeriesDate(signalId);\n }\n\n private async _getLastSignalValue(signalId: number): Promise<number | null> {\n return this._storage.signals.getLastValue(signalId);\n }\n\n private async _ensureFresh(): Promise<void> {\n const { id } = await this.resolve();\n const latestClosed = await this._getLatestClosedTradingDay();\n\n if (this._cachedAsOf === latestClosed) return;\n\n // Ensure both indicators are fresh first\n await Promise.all([this.indicator1.series(), this.indicator2.series()]);\n\n const latestSeries = await this._getLatestSignalSeriesDate(id);\n\n if (latestSeries === latestClosed) {\n this._cachedSeries = null;\n this._cachedAsOf = latestClosed;\n return;\n }\n\n if (!this._syncing) {\n this._syncing = this._sync(latestSeries ?? undefined, latestClosed).finally(() => {\n this._syncing = null;\n });\n }\n await this._syncing;\n\n this._cachedSeries = null;\n this._cachedAsOf = latestClosed;\n }\n\n private async _sync(fromDate: string | undefined, latestClosed: string): Promise<void> {\n const { id } = await this.resolve();\n\n const range = fromDate ? { from: fromDate } : undefined;\n const [series1, series2] = await Promise.all([this.indicator1.series(range), this.indicator2.series(range)]);\n\n const previousValue = fromDate ? ((await this._getLastSignalValue(id)) ?? undefined) : undefined;\n\n const absolute = ABSOLUTE_TOLERANCE_TYPES.has(this.indicator1.type);\n const signalBars = evaluateSignal(series1, series2, this.comparison, this.tolerance, absolute, previousValue);\n\n const bars = signalBars.filter((b) => b.date <= latestClosed);\n\n if (bars.length > 0) {\n await this._upsertSeries(bars);\n }\n }\n\n private async _upsertSeries(bars: DailyBar[]): Promise<void> {\n const { id } = await this.resolve();\n await this._storage.signals.writeSeries(id, bars);\n }\n\n private async _querySeriesFromDb(range?: DateRange): Promise<DailyBar[]> {\n const { id } = await this.resolve();\n return this._storage.signals.getSeries(id, range);\n }\n\n // ── Public data access ─────────────────────────────────────────────\n\n async series(range?: DateRange): Promise<DailyBar[]> {\n await this._ensureFresh();\n if (this._cachedSeries && !range) return this._cachedSeries;\n const bars = await this._querySeriesFromDb(range);\n if (!range) this._cachedSeries = bars;\n return bars;\n }\n\n async value(date?: string): Promise<number | null> {\n await this._ensureFresh();\n if (date) {\n const series = await this._querySeriesFromDb({ from: date, to: date });\n return series.length > 0 ? series[0]!.value : null;\n }\n const { id } = await this.resolve();\n return this._storage.signals.getLastValue(id);\n }\n}\n","import type { StorageProvider } from '../providers/storage';\nimport { TickerHandle } from './ticker';\n\nexport class AllocationHandle {\n readonly holdings: [TickerHandle, number][];\n\n private _storage: StorageProvider;\n private _resolvedId: number | null = null;\n private _resolving: Promise<{ id: number }> | null = null;\n\n constructor(storage: StorageProvider, holdings: [TickerHandle, number][]) {\n const total = holdings.reduce((sum, [, weight]) => sum + weight, 0);\n if (Math.abs(total - 1) > 1e-9) {\n throw new Error(`Allocation weights must sum to 1, got ${total}`);\n }\n this._storage = storage;\n this.holdings = holdings;\n }\n\n get id(): number {\n if (this._resolvedId == null)\n throw new Error('AllocationHandle not yet resolved. Call resolve(), or access via an async method.');\n return this._resolvedId;\n }\n\n async resolve(): Promise<{ id: number }> {\n if (this._resolvedId != null) return { id: this._resolvedId };\n if (!this._resolving) this._resolving = this._doResolve();\n return this._resolving;\n }\n\n static fromResolved(storage: StorageProvider, id: number, holdings: [TickerHandle, number][]): AllocationHandle {\n const handle = new AllocationHandle(storage, holdings);\n handle._resolvedId = id;\n return handle;\n }\n\n private async _doResolve(): Promise<{ id: number }> {\n await Promise.all(this.holdings.map(([ticker]) => ticker.resolve()));\n\n const holdingsJson: Record<string, number> = {};\n for (const [ticker, weight] of this.holdings) {\n const key = ticker.leverage !== 1 ? `${ticker.symbol}?L=${ticker.leverage}` : ticker.symbol;\n holdingsJson[key] = weight;\n }\n\n const result = await this._storage.allocations.findOrCreate(holdingsJson);\n this._resolvedId = result.id;\n return result;\n }\n}\n","import { customAlphabet } from 'nanoid';\nimport type { StorageProvider } from '../providers/storage';\nimport type { MarketProvider } from '../providers/market';\nimport type { TradingFreq, StrategySeriesEntry } from '../providers/types';\nimport { SignalHandle } from './signal';\nimport { AllocationHandle } from './allocation';\nimport { TickerHandle } from './ticker';\nimport { IndicatorHandle } from './indicator';\nimport type { DateRange } from './indicator';\nimport { evaluateStrategy, computeRebalanceDates } from '../computations/strategy';\nimport { runSimulation } from '../backtest/simulate';\nimport { SimulationHandle } from '../backtest/types';\nimport type { SimulateOptions, FinalState } from '../backtest/types';\n\nconst nanoid = customAlphabet('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', 21);\n\nexport interface StrategyRule {\n when?: SignalHandle[];\n hold: AllocationHandle;\n}\n\nexport interface StrategyBar {\n date: string;\n allocation: AllocationHandle;\n}\n\nexport interface StrategyOptions {\n name: string;\n freq?: TradingFreq;\n offset?: number;\n rules: StrategyRule[];\n}\n\nexport class StrategyHandle {\n private _linkId: string | null;\n private _name: string | null;\n private _freq: TradingFreq;\n private _offset: number;\n private _rules: StrategyRule[];\n\n private _storage: StorageProvider;\n private _market: MarketProvider;\n private _resolvedId: number | null = null;\n private _resolvedLinkId: string | null = null;\n private _resolving: Promise<{ id: number }> | null = null;\n private _allocationMap: Map<number, AllocationHandle> = new Map();\n\n private _cache: StrategyBar[] | null = null;\n private _cachedAsOf: string | null = null;\n private _syncing: Promise<void> | null = null;\n\n constructor(storage: StorageProvider, market: MarketProvider, optionsOrLinkId: StrategyOptions | string) {\n this._storage = storage;\n this._market = market;\n\n if (typeof optionsOrLinkId === 'string') {\n this._linkId = optionsOrLinkId;\n this._name = null;\n this._freq = 'Daily';\n this._offset = 0;\n this._rules = [];\n } else {\n const opts = optionsOrLinkId;\n if (opts.rules.length === 0) {\n throw new Error('Strategy must have at least one rule');\n }\n const lastRule = opts.rules[opts.rules.length - 1]!;\n if (lastRule.when && lastRule.when.length > 0) {\n throw new Error('Last rule must be a fallback (no when clause)');\n }\n for (let i = 0; i < opts.rules.length - 1; i++) {\n const rule = opts.rules[i]!;\n if (rule.when !== undefined && rule.when.length === 0) {\n throw new Error(\n `Rule ${i} has an empty when clause and will match unconditionally, making subsequent rules unreachable`,\n );\n }\n }\n this._linkId = null;\n this._name = opts.name;\n this._freq = opts.freq ?? 'Daily';\n this._offset = opts.offset ?? 0;\n this._rules = opts.rules;\n }\n }\n\n get id(): number {\n if (this._resolvedId == null) throw new Error('StrategyHandle not yet resolved. Call resolve() first.');\n return this._resolvedId;\n }\n\n get link(): string {\n if (this._resolvedLinkId == null) throw new Error('StrategyHandle not yet resolved. Call resolve() first.');\n return this._resolvedLinkId;\n }\n\n get name(): string | null {\n return this._name;\n }\n\n get freq(): TradingFreq {\n return this._freq;\n }\n\n get offset(): number {\n return this._offset;\n }\n\n get rules(): StrategyRule[] {\n return this._rules;\n }\n\n async resolve(): Promise<{ id: number }> {\n if (this._resolvedId != null) return { id: this._resolvedId };\n if (!this._resolving) {\n this._resolving =\n this._linkId !== null && this._name === null ? this._doResolveReference() : this._doResolveCreate();\n }\n return this._resolving;\n }\n\n private async _doResolveCreate(): Promise<{ id: number }> {\n const allSignals = new Set<SignalHandle>();\n const allAllocations = new Set<AllocationHandle>();\n for (const rule of this._rules) {\n if (rule.when) rule.when.forEach((s) => allSignals.add(s));\n allAllocations.add(rule.hold);\n }\n\n await Promise.all([\n ...Array.from(allSignals).map((s) => s.resolve()),\n ...Array.from(allAllocations).map((a) => a.resolve()),\n ]);\n\n const linkId = nanoid();\n const result = await this._storage.strategies.create({\n linkId,\n name: this._name!,\n freq: this._freq,\n offset: this._offset,\n rules: this._rules.map((rule) => ({\n signalIds: (rule.when ?? []).map((s) => s.id),\n allocationId: rule.hold.id,\n })),\n });\n\n this._resolvedId = result.id;\n this._resolvedLinkId = linkId;\n\n for (const rule of this._rules) {\n this._allocationMap.set(rule.hold.id, rule.hold);\n }\n\n return result;\n }\n\n private async _doResolveReference(): Promise<{ id: number }> {\n const ref = await this._storage.strategies.resolveReference(this._linkId!);\n this._resolvedId = ref.id;\n this._resolvedLinkId = this._linkId!;\n this._name = ref.name;\n this._freq = ref.freq;\n this._offset = ref.offset;\n\n // Build handles bottom-up from reference data\n const tickerMap = new Map<number, TickerHandle>();\n for (const t of ref.rules.tickers) {\n tickerMap.set(t.id, TickerHandle.fromResolved(this._storage, t.id, t.symbol, t.leverage));\n }\n\n const indicatorMap = new Map<number, IndicatorHandle>();\n for (const ind of ref.rules.indicators) {\n const ticker = ind.tickerId ? (tickerMap.get(ind.tickerId) ?? null) : null;\n indicatorMap.set(\n ind.id,\n IndicatorHandle.fromResolved(this._storage, this._market, ind.id, {\n type: ind.type,\n ticker,\n lookback: ind.lookback,\n delay: ind.delay,\n unit: ind.unit,\n threshold: ind.threshold,\n }),\n );\n }\n\n const signalMap = new Map<number, SignalHandle>();\n for (const sig of ref.rules.signals) {\n signalMap.set(\n sig.id,\n SignalHandle.fromResolved(this._storage, this._market, sig.id, {\n indicator1: indicatorMap.get(sig.indicatorId1)!,\n indicator2: indicatorMap.get(sig.indicatorId2)!,\n comparison: sig.comparison,\n tolerance: sig.tolerance,\n }),\n );\n }\n\n const allocationHandleMap = new Map<number, AllocationHandle>();\n for (const alloc of ref.rules.allocations) {\n const holdings: [TickerHandle, number][] = Object.entries(alloc.holdings).map(([key, weight]) => {\n const match = key.match(/^(.+)\\?L=(.+)$/);\n const symbol = match ? match[1]! : key;\n const leverage = match ? Number(match[2]) : 1;\n return [new TickerHandle(this._storage, symbol, leverage), weight];\n });\n const handle = AllocationHandle.fromResolved(this._storage, alloc.id, holdings);\n allocationHandleMap.set(alloc.id, handle);\n this._allocationMap.set(alloc.id, handle);\n }\n\n // Reconstruct rules\n this._rules = ref.rules.definition.map((rule) => ({\n when: rule.signalIds && rule.signalIds.length > 0 ? rule.signalIds.map((id) => signalMap.get(id)!) : undefined,\n hold: allocationHandleMap.get(rule.allocationId)!,\n }));\n\n return { id: ref.id };\n }\n\n private async _getLatestClosedTradingDay(): Promise<string> {\n const date = await this._storage.tradingDays.getLatestClosed();\n if (!date) throw new Error('No closed trading days found');\n return date;\n }\n\n private async _getLatestStrategySeriesDate(): Promise<string | null> {\n const { id } = await this.resolve();\n return this._storage.strategies.getLatestSeriesDate(id);\n }\n\n private async _ensureFresh(): Promise<void> {\n await this.resolve();\n const latestClosed = await this._getLatestClosedTradingDay();\n\n if (this._cachedAsOf === latestClosed) return;\n\n const latestSeries = await this._getLatestStrategySeriesDate();\n\n if (latestSeries === latestClosed) {\n this._cache = null;\n this._cachedAsOf = latestClosed;\n return;\n }\n\n if (!this._syncing) {\n this._syncing = this._sync(latestClosed).finally(() => {\n this._syncing = null;\n });\n }\n await this._syncing;\n\n this._cache = null;\n this._cachedAsOf = latestClosed;\n }\n\n private async _sync(latestClosed: string): Promise<void> {\n const { id } = await this.resolve();\n\n // Sync all signals and collect their series\n const signalSeries = new Map<number, Map<string, boolean>>();\n const allSignals = new Set<SignalHandle>();\n for (const rule of this._rules) {\n if (rule.when) rule.when.forEach((s) => allSignals.add(s));\n }\n\n await Promise.all(\n Array.from(allSignals).map(async (signal) => {\n const bars = await signal.series();\n const dateMap = new Map<string, boolean>();\n for (const bar of bars) dateMap.set(bar.date, bar.value === 1);\n signalSeries.set(signal.id, dateMap);\n }),\n );\n\n // Get all trading days\n const tradingDays = await this._storage.tradingDays.getRange();\n\n const rebalanceDates = computeRebalanceDates(tradingDays, this._freq, this._offset);\n\n // Build allocation index mapping\n const allocations: AllocationHandle[] = [];\n const allocIndexMap = new Map<number, number>();\n const rulesInput = this._rules.map((rule) => {\n let allocIdx = allocIndexMap.get(rule.hold.id);\n if (allocIdx === undefined) {\n allocIdx = allocations.length;\n allocations.push(rule.hold);\n allocIndexMap.set(rule.hold.id, allocIdx);\n }\n return {\n signalIds: (rule.when ?? []).map((s) => s.id),\n allocationIndex: allocIdx,\n };\n });\n\n // Evaluate\n const evalResult = evaluateStrategy(signalSeries, rulesInput, rebalanceDates, tradingDays);\n\n // Write strategy series\n const entries: StrategySeriesEntry[] = Array.from(evalResult.entries())\n .filter(([date]) => date <= latestClosed)\n .map(([date, allocIdx]) => ({\n date,\n allocationId: allocations[allocIdx]!.id,\n }));\n\n if (entries.length > 0) {\n await this._storage.strategies.writeSeries(id, entries);\n }\n }\n\n private async _querySeriesFromDb(range?: DateRange): Promise<StrategyBar[]> {\n const { id } = await this.resolve();\n const entries = await this._storage.strategies.getSeries(id, range);\n return entries.map((e) => ({\n date: e.date,\n allocation: this._allocationMap.get(e.allocationId)!,\n }));\n }\n\n async series(range?: DateRange): Promise<StrategyBar[]> {\n await this._ensureFresh();\n if (this._cache && !range) return this._cache;\n const bars = await this._querySeriesFromDb(range);\n if (!range) this._cache = bars;\n return bars;\n }\n\n async value(date?: string): Promise<AllocationHandle | null> {\n await this._ensureFresh();\n const bars = date ? await this._querySeriesFromDb({ from: date, to: date }) : await this._querySeriesFromDb();\n if (bars.length === 0) return null;\n return date ? bars[0]!.allocation : bars[bars.length - 1]!.allocation;\n }\n\n async simulate(options: SimulateOptions): Promise<SimulationHandle> {\n const bars = await this.series({ from: options.from, to: options.to });\n if (bars.length === 0) {\n return new SimulationHandle([], [], options.portfolio);\n }\n\n const prices = await this._fetchPricesForTickers(bars, options.from, options.to);\n const tradingDays = bars.map((b) => b.date);\n const rebalanceDates = computeRebalanceDates(tradingDays, this._freq, this._offset);\n\n // Force day 1 rebalance so existing positions align to strategy\n rebalanceDates.add(bars[0]!.date);\n\n const result = runSimulation(bars, prices, rebalanceDates, options.portfolio);\n\n // Build finalState for live push support\n const lastBar = bars[bars.length - 1]!;\n const lastDate = lastBar.date;\n const lastAllocation = lastBar.allocation;\n\n // leveragedPrices: keyed as \"symbol:leverage\", values are the leveraged prices from _fetchPricesForTickers\n const leveragedPrices: Record<string, number> = {};\n for (const [ticker, _weight] of lastAllocation.holdings) {\n if (ticker.symbol === 'CASHX') continue;\n const key = `${ticker.symbol}:${ticker.leverage}`;\n const price = prices[key]?.[lastDate];\n if (price != null) leveragedPrices[key] = price;\n }\n\n // closePrices: raw (unleveraged) close prices for computing real returns\n const closePrices: Record<string, number> = {};\n await this._fetchRawClosePrices(bars, lastDate, closePrices);\n\n const finalState: FinalState = {\n portfolio: result.finalPortfolio,\n allocation: lastAllocation,\n closePrices,\n leveragedPrices,\n };\n\n return new SimulationHandle(result.series, result.trades, options.portfolio, finalState);\n }\n\n private async _fetchPricesForTickers(\n bars: StrategyBar[],\n from: string,\n to: string,\n ): Promise<Record<string, Record<string, number>>> {\n const tickerMap = new Map<string, TickerHandle>();\n for (const bar of bars) {\n for (const [ticker] of bar.allocation.holdings) {\n const key = `${ticker.symbol}:${ticker.leverage}`;\n if (!tickerMap.has(key)) {\n tickerMap.set(key, ticker);\n }\n }\n }\n\n const entries = await Promise.all(\n Array.from(tickerMap.entries()).map(async ([key, ticker]) => {\n const priceIndicator = new IndicatorHandle(this._storage, this._market, {\n type: 'Price',\n ticker,\n lookback: 0,\n delay: 0,\n unit: null,\n threshold: null,\n });\n const priceBars = await priceIndicator.series({ from, to });\n const dateMap: Record<string, number> = {};\n for (const bar of priceBars) {\n dateMap[bar.date] = bar.value;\n }\n return [key, dateMap] as const;\n }),\n );\n\n return Object.fromEntries(entries);\n }\n\n private async _fetchRawClosePrices(\n bars: StrategyBar[],\n lastDate: string,\n closePrices: Record<string, number>,\n ): Promise<void> {\n const symbols = new Set<string>();\n for (const bar of bars) {\n for (const [ticker] of bar.allocation.holdings) {\n if (ticker.symbol !== 'CASHX') symbols.add(ticker.symbol);\n }\n }\n\n await Promise.all(\n Array.from(symbols).map(async (symbol) => {\n const rawTicker = new TickerHandle(this._storage, symbol, 1);\n const priceIndicator = new IndicatorHandle(this._storage, this._market, {\n type: 'Price',\n ticker: rawTicker,\n lookback: 0,\n delay: 0,\n unit: null,\n threshold: null,\n });\n const priceBars = await priceIndicator.series({ from: lastDate, to: lastDate });\n if (priceBars.length > 0) {\n closePrices[symbol] = priceBars[0]!.value;\n }\n }),\n );\n }\n}\n","import type { TradingFreq } from '../providers/types';\n\nfunction getPeriodKey(dateStr: string, freq: TradingFreq): string {\n const d = new Date(dateStr + 'T00:00:00Z');\n const y = d.getUTCFullYear();\n const m = d.getUTCMonth();\n\n switch (freq) {\n case 'Weekly': {\n const thu = new Date(d);\n thu.setUTCDate(thu.getUTCDate() + 3 - ((thu.getUTCDay() + 6) % 7));\n const yearStart = new Date(Date.UTC(thu.getUTCFullYear(), 0, 1));\n const weekNo = Math.ceil(((thu.getTime() - yearStart.getTime()) / 86400000 + 1) / 7);\n return `${thu.getUTCFullYear()}-W${weekNo}`;\n }\n case 'Monthly':\n return `${y}-${m}`;\n case 'Bi-monthly':\n return `${y}-${Math.floor(m / 2)}`;\n case 'Quarterly':\n return `${y}-Q${Math.floor(m / 3)}`;\n case 'Every 4 Months':\n return `${y}-${Math.floor(m / 4)}`;\n case 'Semiannually':\n return `${y}-H${Math.floor(m / 6)}`;\n case 'Yearly':\n return `${y}`;\n default:\n return `${y}-${m}`;\n }\n}\n\nexport function computeRebalanceDates(tradingDays: string[], freq: TradingFreq, offset: number): Set<string> {\n if (freq === 'Daily') return new Set(tradingDays);\n\n const groups = new Map<string, number[]>();\n for (let i = 0; i < tradingDays.length; i++) {\n const key = getPeriodKey(tradingDays[i], freq);\n if (!groups.has(key)) groups.set(key, []);\n groups.get(key)!.push(i);\n }\n\n const result = new Set<string>();\n for (const indices of groups.values()) {\n const lastIdx = indices[indices.length - 1];\n const targetIdx = lastIdx - offset;\n if (targetIdx >= 0 && targetIdx < tradingDays.length) {\n result.add(tradingDays[targetIdx]);\n }\n }\n\n return result;\n}\n\nexport interface StrategyRuleInput {\n signalIds: number[];\n allocationIndex: number;\n}\n\nexport function evaluateStrategy(\n signalSeries: Map<number, Map<string, boolean>>,\n rules: StrategyRuleInput[],\n rebalanceDates: Set<string>,\n tradingDays: string[],\n): Map<string, number> {\n const result = new Map<string, number>();\n let current: number | undefined;\n\n for (const date of tradingDays) {\n if (rebalanceDates.has(date)) {\n for (const rule of rules) {\n if (rule.signalIds.length === 0) {\n current = rule.allocationIndex;\n break;\n }\n const allTrue = rule.signalIds.every((id) => signalSeries.get(id)?.get(date) ?? false);\n if (allTrue) {\n current = rule.allocationIndex;\n break;\n }\n }\n }\n if (current !== undefined) {\n result.set(date, current);\n }\n }\n\n return result;\n}\n","import { TickerHandle } from './ticker';\nimport type { Trade } from '../backtest/types';\nimport { AllocationHandle } from './allocation';\n\nexport class PortfolioHandle {\n readonly holdings: [TickerHandle, number][];\n\n constructor(holdings: [TickerHandle, number][]) {\n // Check for duplicates\n const seen = new Set<string>();\n for (const [ticker, quantity] of holdings) {\n const key = `${ticker.symbol}:${ticker.leverage}`;\n if (seen.has(key)) {\n throw new Error(`Duplicate ticker: ${ticker.symbol}`);\n }\n seen.add(key);\n\n if (quantity < 0) {\n throw new Error(`Quantity for ${ticker.symbol} is negative: ${quantity}`);\n }\n }\n\n this.holdings = holdings;\n }\n\n private _priceMap(prices: [TickerHandle, number][]): Map<string, number> {\n const map = new Map<string, number>();\n for (const [ticker, price] of prices) {\n map.set(`${ticker.symbol}:${ticker.leverage}`, price);\n }\n return map;\n }\n\n private _priceFor(ticker: TickerHandle, priceMap: Map<string, number>): number {\n if (ticker.symbol === 'CASHX') return 1;\n const key = `${ticker.symbol}:${ticker.leverage}`;\n const price = priceMap.get(key);\n if (price == null) {\n throw new Error(`Missing price for ${ticker.symbol}`);\n }\n return price;\n }\n\n value(prices: [TickerHandle, number][]): number {\n const priceMap = this._priceMap(prices);\n let total = 0;\n for (const [ticker, quantity] of this.holdings) {\n total += quantity * this._priceFor(ticker, priceMap);\n }\n return total;\n }\n\n weights(prices: [TickerHandle, number][]): [TickerHandle, number][] {\n const total = this.value(prices);\n if (total === 0) return [];\n\n const priceMap = this._priceMap(prices);\n const result: [TickerHandle, number][] = [];\n for (const [ticker, quantity] of this.holdings) {\n const dollarValue = quantity * this._priceFor(ticker, priceMap);\n if (dollarValue === 0) continue;\n result.push([ticker, dollarValue / total]);\n }\n return result;\n }\n\n trades(target: AllocationHandle, prices: [TickerHandle, number][], date: string): Trade[] {\n const priceMap = this._priceMap(prices);\n const totalValue = this.value(prices);\n\n // Build current dollar amounts by symbol\n const currentDollars = new Map<string, number>();\n for (const [ticker, quantity] of this.holdings) {\n if (ticker.symbol === 'CASHX') continue;\n const price = this._priceFor(ticker, priceMap);\n currentDollars.set(ticker.symbol, quantity * price);\n }\n\n // Build target dollar amounts by symbol\n const targetDollars = new Map<string, number>();\n for (const [ticker, weight] of target.holdings) {\n if (ticker.symbol === 'CASHX') continue;\n targetDollars.set(ticker.symbol, totalValue * weight);\n }\n\n // Build a symbol → TickerHandle lookup for price resolution\n const tickerBySymbol = new Map<string, TickerHandle>();\n for (const [ticker] of this.holdings) {\n if (ticker.symbol !== 'CASHX') tickerBySymbol.set(ticker.symbol, ticker);\n }\n for (const [ticker] of target.holdings) {\n if (ticker.symbol === 'CASHX') continue;\n const existing = tickerBySymbol.get(ticker.symbol);\n if (existing && existing.leverage !== ticker.leverage) {\n throw new Error(`Conflicting leverage for ${ticker.symbol}`);\n }\n tickerBySymbol.set(ticker.symbol, ticker);\n }\n\n // Collect all non-CASHX symbols from both sides\n const allSymbols = new Set([...currentDollars.keys(), ...targetDollars.keys()]);\n\n const sells: Trade[] = [];\n const buys: Trade[] = [];\n\n for (const symbol of allSymbols) {\n const current = currentDollars.get(symbol) ?? 0;\n const target$ = targetDollars.get(symbol) ?? 0;\n const delta = target$ - current;\n\n const ticker = tickerBySymbol.get(symbol)!;\n const price = this._priceFor(ticker, priceMap);\n\n const quantity = Math.abs(delta) / price;\n if (quantity < 1e-10) continue;\n\n const trade: Trade = { date, symbol, quantity, price, action: delta > 0 ? 'buy' : 'sell' };\n\n if (trade.action === 'sell') {\n sells.push(trade);\n } else {\n buys.push(trade);\n }\n }\n\n return [...sells, ...buys];\n }\n}\n","import type { DailyBar } from '../handles/indicator';\nimport type { StrategyBar } from '../handles/strategy';\nimport type { TickerHandle } from '../handles/ticker';\nimport type { Trade } from './types';\nimport { PortfolioHandle } from '../handles/portfolio';\n\nconst EPSILON = 1e-8;\n\nfunction tkey(symbol: string, leverage: number): string {\n return `${symbol}:${leverage}`;\n}\n\nexport function runSimulation(\n bars: StrategyBar[],\n prices: Record<string, Record<string, number>>,\n rebalanceDates: Set<string>,\n portfolio: PortfolioHandle,\n): { series: DailyBar[]; trades: Trade[]; finalPortfolio: PortfolioHandle } {\n const positions: Record<string, number> = {};\n const lastPrice: Record<string, number> = {};\n let cash = 0;\n for (const [ticker, quantity] of portfolio.holdings) {\n if (ticker.symbol === 'CASHX') {\n cash = quantity;\n } else {\n positions[tkey(ticker.symbol, ticker.leverage)] = quantity;\n }\n }\n const series: DailyBar[] = [];\n const trades: Trade[] = [];\n\n // Carry forward the last known close when today's price is missing so\n // a held position isn't silently valued at $0 (e.g. mutual fund NAV that\n // posts after the trading-day cutoff).\n function valuationPrice(key: string, date: string): number | undefined {\n const live = prices[key]?.[date];\n if (live != null) {\n lastPrice[key] = live;\n return live;\n }\n return lastPrice[key];\n }\n\n for (const bar of bars) {\n const date = bar.date;\n\n if (rebalanceDates.has(date)) {\n // Compute current portfolio value before rebalancing\n let portfolioValue = cash;\n for (const [key, shares] of Object.entries(positions)) {\n const price = valuationPrice(key, date);\n if (price != null) portfolioValue += shares * price;\n }\n\n // Determine target holdings\n const targetWeights: Record<string, number> = {};\n for (const [ticker, weight] of bar.allocation.holdings) {\n targetWeights[tkey(ticker.symbol, ticker.leverage)] = weight;\n }\n\n // Compute target shares and execute trades\n const allKeys = new Set([...Object.keys(positions), ...Object.keys(targetWeights)]);\n for (const key of allKeys) {\n const price = prices[key]?.[date];\n if (price == null || price <= 0) continue;\n\n const currentShares = positions[key] ?? 0;\n const targetValue = portfolioValue * (targetWeights[key] ?? 0);\n const targetShares = targetValue / price;\n const delta = targetShares - currentShares;\n\n if (Math.abs(delta) <= EPSILON) continue;\n\n if (Math.abs(targetShares) <= EPSILON) {\n delete positions[key];\n } else {\n positions[key] = targetShares;\n }\n cash -= delta * price;\n\n trades.push({\n date,\n symbol: key.split(':')[0]!,\n quantity: Math.abs(delta),\n price,\n action: delta > 0 ? 'buy' : 'sell',\n });\n }\n\n if (Math.abs(cash) <= EPSILON) cash = 0;\n }\n\n // Compute end-of-day portfolio value\n let value = cash;\n for (const [key, shares] of Object.entries(positions)) {\n const price = valuationPrice(key, date);\n if (price != null) value += shares * price;\n }\n series.push({ date, value });\n }\n\n // Build finalPortfolio from ending positions + cash\n const finalHoldings: [TickerHandle, number][] = [];\n\n // Map ticker keys back to TickerHandles from allocations and starting portfolio\n const tickerByKey = new Map<string, TickerHandle>();\n for (const bar of bars) {\n for (const [ticker] of bar.allocation.holdings) {\n const key = tkey(ticker.symbol, ticker.leverage);\n if (!tickerByKey.has(key)) {\n tickerByKey.set(key, ticker);\n }\n }\n }\n for (const [ticker] of portfolio.holdings) {\n const key = tkey(ticker.symbol, ticker.leverage);\n if (!tickerByKey.has(key)) {\n tickerByKey.set(key, ticker);\n }\n }\n\n for (const [key, shares] of Object.entries(positions)) {\n const ticker = tickerByKey.get(key);\n if (ticker && Math.abs(shares) > EPSILON) {\n finalHoldings.push([ticker, shares]);\n }\n }\n\n // Add CASHX\n const cashKey = tkey('CASHX', 1);\n const cashTicker = tickerByKey.get(cashKey) ?? portfolio.holdings.find(([t]) => t.symbol === 'CASHX')?.[0];\n if (cashTicker && Math.abs(cash) > EPSILON) {\n finalHoldings.push([cashTicker, cash]);\n }\n\n const finalPortfolio = new PortfolioHandle(finalHoldings);\n\n return { series, trades, finalPortfolio };\n}\n","import type { DailyBar } from '../handles/indicator';\nimport type { AllocationHandle } from '../handles/allocation';\nimport { PortfolioHandle } from '../handles/portfolio';\nimport type { TickerHandle } from '../handles/ticker';\n\nexport interface SimulateOptions {\n from: string;\n to: string;\n portfolio: PortfolioHandle;\n}\n\nexport interface Trade {\n date: string;\n symbol: string;\n quantity: number;\n price: number;\n action: 'buy' | 'sell';\n}\n\nexport interface PortfolioSnapshot {\n value: number;\n holdings: [TickerHandle, number][];\n weights: [TickerHandle, number][];\n pendingTrades: Trade[];\n}\n\nexport interface FinalState {\n portfolio: PortfolioHandle;\n allocation: AllocationHandle;\n closePrices: Record<string, number>;\n leveragedPrices: Record<string, number>;\n}\n\nexport class SimulationHandle {\n readonly series: DailyBar[];\n readonly trades: Trade[];\n readonly startingPortfolio: PortfolioHandle;\n\n private _portfolio: PortfolioHandle | null;\n private _currentAllocation: AllocationHandle | null;\n private _lastClosePrices: Record<string, number>;\n private _lastLeveragedPrices: Map<string, number>;\n private _currentLeveragedPrices: Map<string, number>;\n private _lastDate: string;\n\n constructor(series: DailyBar[], trades: Trade[], startingPortfolio: PortfolioHandle, finalState?: FinalState) {\n this.series = series;\n this.trades = trades;\n this.startingPortfolio = startingPortfolio;\n\n if (finalState) {\n this._portfolio = finalState.portfolio;\n this._currentAllocation = finalState.allocation;\n this._lastClosePrices = finalState.closePrices;\n this._lastLeveragedPrices = new Map(Object.entries(finalState.leveragedPrices));\n this._currentLeveragedPrices = new Map(Object.entries(finalState.leveragedPrices));\n this._lastDate = series.at(-1)?.date ?? '';\n } else {\n this._portfolio = null;\n this._currentAllocation = null;\n this._lastClosePrices = {};\n this._lastLeveragedPrices = new Map();\n this._currentLeveragedPrices = new Map();\n this._lastDate = '';\n }\n }\n\n push(...prices: [TickerHandle, number][]): PortfolioSnapshot {\n if (!this._portfolio || !this._currentAllocation) {\n return { value: 0, holdings: [], weights: [], pendingTrades: [] };\n }\n\n // Update leveraged prices from raw market prices\n for (const [ticker, realPrice] of prices) {\n if (ticker.symbol === 'CASHX') continue;\n const lastClose = this._lastClosePrices[ticker.symbol];\n if (lastClose == null) continue;\n\n const realReturn = (realPrice - lastClose) / lastClose;\n\n // Apply leverage to all portfolio tickers sharing this symbol\n for (const [held] of this._portfolio.holdings) {\n if (held.symbol !== ticker.symbol) continue;\n if (held.symbol === 'CASHX') continue;\n const key = `${held.symbol}:${held.leverage}`;\n const baseLeveragedPrice = this._lastLeveragedPrices.get(key);\n if (baseLeveragedPrice == null) continue;\n const leveragedReturn = held.leverage * realReturn;\n this._currentLeveragedPrices.set(key, baseLeveragedPrice * (1 + leveragedReturn));\n }\n }\n\n // Build price array for PortfolioHandle methods\n const priceArray: [TickerHandle, number][] = [];\n for (const [held] of this._portfolio.holdings) {\n if (held.symbol === 'CASHX') continue;\n const key = `${held.symbol}:${held.leverage}`;\n const price = this._currentLeveragedPrices.get(key);\n if (price != null) priceArray.push([held, price]);\n }\n\n return {\n value: this._portfolio.value(priceArray),\n holdings: this._portfolio.holdings,\n weights: this._portfolio.weights(priceArray),\n pendingTrades: this._portfolio.trades(this._currentAllocation, priceArray, this._lastDate),\n };\n }\n}\n","import type { StorageProvider } from './providers/storage';\nimport type { MarketProvider } from './providers/market';\nimport type { IndicatorType, Unit } from './providers/types';\nimport { TickerHandle } from './handles/ticker';\nimport { IndicatorHandle } from './handles/indicator';\nimport { SignalHandle } from './handles/signal';\nimport { AllocationHandle } from './handles/allocation';\nimport { StrategyHandle } from './handles/strategy';\nimport { PortfolioHandle } from './handles/portfolio';\nimport type { StrategyOptions } from './handles/strategy';\n\ntype TreasuryTenor = Extract<\n IndicatorType,\n 'T3M' | 'T6M' | 'T1Y' | 'T2Y' | 'T3Y' | 'T5Y' | 'T7Y' | 'T10Y' | 'T20Y' | 'T30Y'\n>;\ntype CalendarPeriod = Extract<IndicatorType, 'Month' | 'Day of Week' | 'Day of Month' | 'Day of Year'>;\n\ninterface IndicatorOpts {\n delay?: number;\n}\n\nexport interface LivefolioClient {\n ticker(symbol: string, leverage?: number): TickerHandle;\n\n // Ticker-bound\n sma(ticker: TickerHandle, lookback: number, opts?: IndicatorOpts): IndicatorHandle;\n ema(ticker: TickerHandle, lookback: number, opts?: IndicatorOpts): IndicatorHandle;\n price(ticker: TickerHandle, opts?: IndicatorOpts): IndicatorHandle;\n returns(ticker: TickerHandle, lookback: number, opts?: IndicatorOpts): IndicatorHandle;\n volatility(ticker: TickerHandle, lookback: number, opts?: IndicatorOpts): IndicatorHandle;\n drawdown(ticker: TickerHandle, lookback: number, opts?: IndicatorOpts): IndicatorHandle;\n rsi(ticker: TickerHandle, lookback: number, opts?: IndicatorOpts): IndicatorHandle;\n\n // Standalone\n vix(opts?: IndicatorOpts): IndicatorHandle;\n vix3m(opts?: IndicatorOpts): IndicatorHandle;\n treasury(tenor: TreasuryTenor, opts?: IndicatorOpts): IndicatorHandle;\n calendar(period: CalendarPeriod, opts?: IndicatorOpts): IndicatorHandle;\n\n // Threshold\n threshold(value: number, unit?: Unit): IndicatorHandle;\n\n // Signals\n gt(ind1: IndicatorHandle, ind2: IndicatorHandle, tolerance?: number): SignalHandle;\n lt(ind1: IndicatorHandle, ind2: IndicatorHandle, tolerance?: number): SignalHandle;\n eq(ind1: IndicatorHandle, ind2: IndicatorHandle, tolerance?: number): SignalHandle;\n\n // Allocations\n allocation(...holdings: [TickerHandle, number][]): AllocationHandle;\n\n // Portfolios\n portfolio(...holdings: [TickerHandle, number][]): PortfolioHandle;\n\n // Strategies\n strategy(linkId: string): StrategyHandle;\n strategy(options: StrategyOptions): StrategyHandle;\n strategy(optionsOrLinkId: string | StrategyOptions): StrategyHandle;\n}\n\nexport interface LivefolioClientOptions {\n storage: StorageProvider;\n market: MarketProvider;\n}\n\nfunction tickerBound(\n storage: StorageProvider,\n market: MarketProvider,\n type: IndicatorType,\n ticker: TickerHandle,\n lookback: number,\n opts?: IndicatorOpts,\n): IndicatorHandle {\n return new IndicatorHandle(storage, market, {\n type,\n ticker,\n lookback,\n delay: opts?.delay ?? 0,\n unit: null,\n threshold: null,\n });\n}\n\nfunction standalone(\n storage: StorageProvider,\n market: MarketProvider,\n type: IndicatorType,\n opts?: IndicatorOpts,\n): IndicatorHandle {\n return new IndicatorHandle(storage, market, {\n type,\n ticker: null,\n lookback: 0,\n delay: opts?.delay ?? 0,\n unit: null,\n threshold: null,\n });\n}\n\nexport function createClient(options: LivefolioClientOptions): LivefolioClient {\n const { storage, market } = options;\n\n return {\n ticker: (symbol, leverage) => new TickerHandle(storage, symbol, leverage),\n\n sma: (ticker, lookback, opts?) => tickerBound(storage, market, 'SMA', ticker, lookback, opts),\n ema: (ticker, lookback, opts?) => tickerBound(storage, market, 'EMA', ticker, lookback, opts),\n price: (ticker, opts?) => tickerBound(storage, market, 'Price', ticker, 0, opts),\n returns: (ticker, lookback, opts?) => tickerBound(storage, market, 'Return', ticker, lookback, opts),\n volatility: (ticker, lookback, opts?) => tickerBound(storage, market, 'Volatility', ticker, lookback, opts),\n drawdown: (ticker, lookback, opts?) => tickerBound(storage, market, 'Drawdown', ticker, lookback, opts),\n rsi: (ticker, lookback, opts?) => tickerBound(storage, market, 'RSI', ticker, lookback, opts),\n\n vix: (opts?) => standalone(storage, market, 'VIX', opts),\n vix3m: (opts?) => standalone(storage, market, 'VIX3M', opts),\n treasury: (tenor, opts?) => standalone(storage, market, tenor, opts),\n calendar: (period, opts?) => standalone(storage, market, period, opts),\n\n threshold: (value, unit?) =>\n new IndicatorHandle(storage, market, {\n type: 'Threshold',\n ticker: null,\n lookback: 0,\n delay: 0,\n unit: unit ?? null,\n threshold: value,\n }),\n\n gt: (ind1, ind2, tolerance?) =>\n new SignalHandle(storage, market, {\n indicator1: ind1,\n indicator2: ind2,\n comparison: '>',\n tolerance: tolerance ?? 0,\n }),\n lt: (ind1, ind2, tolerance?) =>\n new SignalHandle(storage, market, {\n indicator1: ind1,\n indicator2: ind2,\n comparison: '<',\n tolerance: tolerance ?? 0,\n }),\n eq: (ind1, ind2, tolerance?) =>\n new SignalHandle(storage, market, {\n indicator1: ind1,\n indicator2: ind2,\n comparison: '=',\n tolerance: tolerance ?? 0,\n }),\n\n allocation: (...holdings) => new AllocationHandle(storage, holdings),\n\n portfolio: (...holdings) => new PortfolioHandle(holdings),\n\n strategy: (optionsOrLinkId: StrategyOptions | string) => new StrategyHandle(storage, market, optionsOrLinkId),\n };\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,51 +1,52 @@
1
1
  {
2
2
  "name": "@livefolio/sdk",
3
- "version": "0.2.12",
4
- "description": "Livefolio SDK — market data, strategy evaluation, and portfolio management",
5
- "main": "dist/index.js",
6
- "types": "dist/index.d.ts",
3
+ "version": "0.3.0",
4
+ "type": "module",
5
+ "main": "./dist/index.js",
6
+ "types": "./dist/index.d.ts",
7
+ "files": [
8
+ "dist"
9
+ ],
10
+ "engines": {
11
+ "node": ">=20"
12
+ },
7
13
  "exports": {
8
14
  ".": {
9
15
  "types": "./dist/index.d.ts",
10
- "default": "./dist/index.js"
11
- },
12
- "./market": {
13
- "types": "./dist/market/index.d.ts",
14
- "default": "./dist/market/index.js"
15
- },
16
- "./strategy": {
17
- "types": "./dist/strategy/index.d.ts",
18
- "default": "./dist/strategy/index.js"
19
- },
20
- "./portfolio": {
21
- "types": "./dist/portfolio/index.d.ts",
22
- "default": "./dist/portfolio/index.js"
23
- },
24
- "./auth": {
25
- "types": "./dist/auth/index.d.ts",
26
- "default": "./dist/auth/index.js"
16
+ "import": "./dist/index.js"
27
17
  }
28
18
  },
29
- "files": [
30
- "dist"
31
- ],
32
19
  "scripts": {
33
- "build": "tsc",
20
+ "build": "tsup",
34
21
  "clean": "rm -rf dist",
22
+ "lint": "eslint src/",
23
+ "lint:fix": "eslint src/ --fix",
24
+ "format": "prettier --write 'src/**/*.ts'",
25
+ "format:check": "prettier --check 'src/**/*.ts'",
35
26
  "test": "vitest run",
36
27
  "test:watch": "vitest",
37
- "ingest:init": "node scripts/ingest-price-observations.cjs --mode init",
38
- "ingest:daily": "node scripts/ingest-price-observations.cjs --mode daily",
39
- "backtest:smoke": "node scripts/backtest-smoke.cjs",
40
- "prepare": "npm run build"
28
+ "prepare": "husky"
41
29
  },
42
- "dependencies": {
43
- "@livefolio/db": "^0.1.9",
44
- "@supabase/supabase-js": "^2"
30
+ "lint-staged": {
31
+ "*.ts": [
32
+ "eslint --fix",
33
+ "prettier --write"
34
+ ]
45
35
  },
46
36
  "devDependencies": {
47
- "@vitest/coverage-v8": "^4.0.18",
48
- "typescript": "^5.5.3",
49
- "vitest": "^4.0.18"
37
+ "@eslint/js": "^10.0.1",
38
+ "eslint": "^10.1.0",
39
+ "eslint-config-prettier": "^10.1.8",
40
+ "eslint-plugin-prettier": "^5.5.5",
41
+ "husky": "^9.1.7",
42
+ "lint-staged": "^16.4.0",
43
+ "prettier": "3.8.1",
44
+ "tsup": "^8.5.1",
45
+ "typescript": "^5.8",
46
+ "typescript-eslint": "^8.58.0",
47
+ "vitest": "^3"
48
+ },
49
+ "dependencies": {
50
+ "nanoid": "^5.1.7"
50
51
  }
51
52
  }
@@ -1,4 +0,0 @@
1
- import type { TypedSupabaseClient } from '../types';
2
- import type { AuthModule } from './types';
3
- export declare function createAuth(client: TypedSupabaseClient): AuthModule;
4
- //# sourceMappingURL=client.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/auth/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C,wBAAgB,UAAU,CAAC,MAAM,EAAE,mBAAmB,GAAG,UAAU,CA+BlE"}
@@ -1,37 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createAuth = createAuth;
4
- function createAuth(client) {
5
- return {
6
- async getUser() {
7
- const { data, error } = await client.auth.getUser();
8
- if (error)
9
- throw error;
10
- return data.user;
11
- },
12
- async getSession() {
13
- const { data, error } = await client.auth.getSession();
14
- if (error)
15
- throw error;
16
- return data.session;
17
- },
18
- async requireUser() {
19
- const { data, error } = await client.auth.getUser();
20
- if (error)
21
- throw error;
22
- if (!data.user)
23
- throw new Error('Not authenticated');
24
- return data.user;
25
- },
26
- onAuthStateChange(callback) {
27
- const { data } = client.auth.onAuthStateChange(callback);
28
- return data.subscription;
29
- },
30
- async signOut() {
31
- const { error } = await client.auth.signOut();
32
- if (error)
33
- throw error;
34
- },
35
- };
36
- }
37
- //# sourceMappingURL=client.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/auth/client.ts"],"names":[],"mappings":";;AAGA,gCA+BC;AA/BD,SAAgB,UAAU,CAAC,MAA2B;IACpD,OAAO;QACL,KAAK,CAAC,OAAO;YACX,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACpD,IAAI,KAAK;gBAAE,MAAM,KAAK,CAAC;YACvB,OAAO,IAAI,CAAC,IAAI,CAAC;QACnB,CAAC;QAED,KAAK,CAAC,UAAU;YACd,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACvD,IAAI,KAAK;gBAAE,MAAM,KAAK,CAAC;YACvB,OAAO,IAAI,CAAC,OAAO,CAAC;QACtB,CAAC;QAED,KAAK,CAAC,WAAW;YACf,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACpD,IAAI,KAAK;gBAAE,MAAM,KAAK,CAAC;YACvB,IAAI,CAAC,IAAI,CAAC,IAAI;gBAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;YACrD,OAAO,IAAI,CAAC,IAAI,CAAC;QACnB,CAAC;QAED,iBAAiB,CAAC,QAAQ;YACxB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;YACzD,OAAO,IAAI,CAAC,YAAY,CAAC;QAC3B,CAAC;QAED,KAAK,CAAC,OAAO;YACX,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAC9C,IAAI,KAAK;gBAAE,MAAM,KAAK,CAAC;QACzB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -1,3 +0,0 @@
1
- export type { AuthModule } from './types';
2
- export { createAuth } from './client';
3
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC"}
@@ -1,6 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createAuth = void 0;
4
- var client_1 = require("./client");
5
- Object.defineProperty(exports, "createAuth", { enumerable: true, get: function () { return client_1.createAuth; } });
6
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":";;;AACA,mCAAsC;AAA7B,oGAAA,UAAU,OAAA"}
@@ -1,9 +0,0 @@
1
- import type { User, Session, AuthChangeEvent, Subscription } from '@supabase/supabase-js';
2
- export interface AuthModule {
3
- getUser(): Promise<User | null>;
4
- getSession(): Promise<Session | null>;
5
- requireUser(): Promise<User>;
6
- onAuthStateChange(callback: (event: AuthChangeEvent, session: Session | null) => void): Subscription;
7
- signOut(): Promise<void>;
8
- }
9
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/auth/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1F,MAAM,WAAW,UAAU;IACzB,OAAO,IAAI,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IAChC,UAAU,IAAI,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IACtC,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,iBAAiB,CACf,QAAQ,EAAE,CAAC,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,KAAK,IAAI,GAClE,YAAY,CAAC;IAChB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B"}
@@ -1,3 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/auth/types.ts"],"names":[],"mappings":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,QAAQ,CAAC;AAC/B,OAAO,KAAK,MAAM,MAAM,UAAU,CAAC;AACnC,OAAO,KAAK,QAAQ,MAAM,YAAY,CAAC;AACvC,OAAO,KAAK,SAAS,MAAM,aAAa,CAAC;AAEzC,YAAY,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AACnD,YAAY,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACzC,YAAY,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC7C,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACzC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAMnD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,CAAC;IACvC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,SAAS,EAAE,eAAe,CAAC;CACrC;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,mBAAmB,GAAG,eAAe,CAQpF"}
@@ -1,4 +0,0 @@
1
- import type { TypedSupabaseClient } from '../types';
2
- import type { MarketModule } from './types';
3
- export declare function createMarket(client: TypedSupabaseClient): MarketModule;
4
- //# sourceMappingURL=client.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/market/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,KAAK,EAAsC,YAAY,EAAE,MAAM,SAAS,CAAC;AAqBhF,wBAAgB,YAAY,CAAC,MAAM,EAAE,mBAAmB,GAAG,YAAY,CAqItE"}
@@ -1,137 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createMarket = createMarket;
4
- function requireTradingDayClose(tradingDayByDate, row) {
5
- const close = tradingDayByDate.get(row.date);
6
- if (typeof close !== 'string' || close.length === 0) {
7
- throw new Error(`Missing trading_days.post for ${row.symbol} on ${row.date}.`);
8
- }
9
- if (!Number.isFinite(new Date(close).getTime())) {
10
- throw new Error(`Invalid trading_days.post for ${row.symbol} on ${row.date}: ${close}`);
11
- }
12
- return close;
13
- }
14
- function createMarket(client) {
15
- return {
16
- async getBatchSeries(symbols) {
17
- const { data, error } = await client.functions.invoke('series', { body: { symbols } });
18
- if (error)
19
- throw error;
20
- return data;
21
- },
22
- async getSeries(symbol) {
23
- const result = await this.getBatchSeries([symbol]);
24
- return result[symbol];
25
- },
26
- async getBatchSeriesFromDb(symbols, startDate, endDate) {
27
- const out = Object.fromEntries(symbols.map((symbol) => [symbol, []]));
28
- if (symbols.length === 0)
29
- return out;
30
- const { data, error } = await client
31
- .from('price_observations')
32
- .select('symbol, date, price_400pm_et')
33
- .in('symbol', symbols)
34
- .gte('date', startDate)
35
- .lte('date', endDate)
36
- .order('date', { ascending: true });
37
- if (error)
38
- throw new Error(`Failed to fetch price observations: ${error.message}`);
39
- const { data: tradingDays, error: tradingDaysError } = await client
40
- .from('trading_days')
41
- .select('date, post')
42
- .gte('date', startDate)
43
- .lte('date', endDate)
44
- .order('date', { ascending: true });
45
- if (tradingDaysError)
46
- throw new Error(`Failed to fetch trading days: ${tradingDaysError.message}`);
47
- const tradingDayByDate = new Map((tradingDays ?? []).map((row) => [row.date, row.post]));
48
- for (const row of data ?? []) {
49
- const symbol = row.symbol;
50
- if (!out[symbol])
51
- out[symbol] = [];
52
- out[symbol].push({
53
- timestamp: requireTradingDayClose(tradingDayByDate, row),
54
- value: row.price_400pm_et,
55
- });
56
- }
57
- return out;
58
- },
59
- async getSeriesFromDb(symbol, startDate, endDate) {
60
- const result = await this.getBatchSeriesFromDb([symbol], startDate, endDate);
61
- return result[symbol];
62
- },
63
- async getBatchQuotes(symbols) {
64
- const { data, error } = await client.functions.invoke('quote', { body: { symbols } });
65
- if (error)
66
- throw error;
67
- return data;
68
- },
69
- async getQuote(symbol) {
70
- const result = await this.getBatchQuotes([symbol]);
71
- const quote = result[symbol];
72
- if (quote == null)
73
- throw new Error(`No quote available for ${symbol}`);
74
- return quote;
75
- },
76
- async getSignalAndExecutionPrices(symbol, date) {
77
- const result = await this.getBatchSignalAndExecutionPrices([symbol], date);
78
- return result[symbol] ?? null;
79
- },
80
- async getBatchSignalAndExecutionPrices(symbols, date) {
81
- if (symbols.length === 0)
82
- return {};
83
- const { data, error } = await client
84
- .from('price_observations')
85
- .select('symbol, price_330pm_et, price_400pm_et')
86
- .in('symbol', symbols)
87
- .eq('date', date);
88
- if (error)
89
- throw new Error(`Failed to fetch dual prices: ${error.message}`);
90
- const result = {};
91
- for (const row of data ?? []) {
92
- if (row.price_330pm_et == null || row.price_400pm_et == null)
93
- continue;
94
- result[row.symbol] = {
95
- signal: Number(row.price_330pm_et),
96
- execution: Number(row.price_400pm_et),
97
- };
98
- }
99
- return result;
100
- },
101
- async getTradingDays(startDate, endDate) {
102
- const { data, error } = await client
103
- .from('trading_days')
104
- .select('date, overnight, pre, regular, post, close')
105
- .gte('date', startDate)
106
- .lte('date', endDate)
107
- .order('date', { ascending: true });
108
- if (error)
109
- throw new Error(`Failed to fetch trading days: ${error.message}`);
110
- return (data ?? []).map((row) => ({
111
- date: row.date,
112
- open: row.regular,
113
- close: row.post,
114
- extended_open: row.overnight,
115
- extended_close: row.close,
116
- }));
117
- },
118
- async getTradingDay(date) {
119
- const { data: row, error } = await client
120
- .from('trading_days')
121
- .select('date, overnight, pre, regular, post, close')
122
- .eq('date', date)
123
- .limit(1)
124
- .maybeSingle();
125
- if (error || !row)
126
- return null;
127
- return {
128
- date: row.date,
129
- open: row.regular,
130
- close: row.post,
131
- extended_open: row.overnight,
132
- extended_close: row.close,
133
- };
134
- },
135
- };
136
- }
137
- //# sourceMappingURL=client.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/market/client.ts"],"names":[],"mappings":";;AAsBA,oCAqIC;AAxJD,SAAS,sBAAsB,CAC7B,gBAAqC,EACrC,GAGC;IAED,MAAM,KAAK,GAAG,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC7C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,KAAK,CAAC,iCAAiC,GAAG,CAAC,MAAM,OAAO,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC;IACjF,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,iCAAiC,GAAG,CAAC,MAAM,OAAO,GAAG,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC;IAC1F,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAgB,YAAY,CAAC,MAA2B;IACtD,OAAO;QACL,KAAK,CAAC,cAAc,CAAC,OAAiB;YACpC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;YACvF,IAAI,KAAK;gBAAE,MAAM,KAAK,CAAC;YACvB,OAAO,IAAqC,CAAC;QAC/C,CAAC;QAED,KAAK,CAAC,SAAS,CAAC,MAAc;YAC5B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;YACnD,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC;QACxB,CAAC;QAED,KAAK,CAAC,oBAAoB,CAAC,OAAiB,EAAE,SAAiB,EAAE,OAAe;YAC9E,MAAM,GAAG,GAAkC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;YACrG,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,GAAG,CAAC;YAErC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM;iBACjC,IAAI,CAAC,oBAAoB,CAAC;iBAC1B,MAAM,CAAC,8BAA8B,CAAC;iBACtC,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC;iBACrB,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC;iBACtB,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;iBACpB,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAEtC,IAAI,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAEnF,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM;iBAChE,IAAI,CAAC,cAAc,CAAC;iBACpB,MAAM,CAAC,YAAY,CAAC;iBACpB,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC;iBACtB,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;iBACpB,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAEtC,IAAI,gBAAgB;gBAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC;YAEnG,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAEzF,KAAK,MAAM,GAAG,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC;gBAC7B,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;gBAC1B,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;oBAAE,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;gBACnC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC;oBACf,SAAS,EAAE,sBAAsB,CAAC,gBAAgB,EAAE,GAAG,CAAC;oBACxD,KAAK,EAAE,GAAG,CAAC,cAAc;iBAC1B,CAAC,CAAC;YACL,CAAC;YAED,OAAO,GAAG,CAAC;QACb,CAAC;QAED,KAAK,CAAC,eAAe,CAAC,MAAc,EAAE,SAAiB,EAAE,OAAe;YACtE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;YAC7E,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC;QACxB,CAAC;QAED,KAAK,CAAC,cAAc,CAAC,OAAiB;YACpC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;YACtF,IAAI,KAAK;gBAAE,MAAM,KAAK,CAAC;YACvB,OAAO,IAAmC,CAAC;QAC7C,CAAC;QAED,KAAK,CAAC,QAAQ,CAAC,MAAc;YAC3B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;YACnD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;YAC7B,IAAI,KAAK,IAAI,IAAI;gBAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,MAAM,EAAE,CAAC,CAAC;YACvE,OAAO,KAAK,CAAC;QACf,CAAC;QAED,KAAK,CAAC,2BAA2B,CAAC,MAAc,EAAE,IAAY;YAC5D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,gCAAgC,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC;YAC3E,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC;QAChC,CAAC;QAED,KAAK,CAAC,gCAAgC,CAAC,OAAiB,EAAE,IAAY;YACpE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,EAAE,CAAC;YAEpC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM;iBACjC,IAAI,CAAC,oBAAoB,CAAC;iBAC1B,MAAM,CAAC,wCAAwC,CAAC;iBAChD,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC;iBACrB,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAEpB,IAAI,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAE5E,MAAM,MAAM,GAA8B,EAAE,CAAC;YAC7C,KAAK,MAAM,GAAG,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC;gBAC7B,IAAI,GAAG,CAAC,cAAc,IAAI,IAAI,IAAI,GAAG,CAAC,cAAc,IAAI,IAAI;oBAAE,SAAS;gBACvE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG;oBACnB,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC;oBAClC,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC;iBACtC,CAAC;YACJ,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,KAAK,CAAC,cAAc,CAAC,SAAiB,EAAE,OAAe;YACrD,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM;iBACjC,IAAI,CAAC,cAAc,CAAC;iBACpB,MAAM,CAAC,4CAA4C,CAAC;iBACpD,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC;iBACtB,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;iBACpB,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAEtC,IAAI,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAE7E,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBAChC,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,IAAI,EAAE,GAAG,CAAC,OAAO;gBACjB,KAAK,EAAE,GAAG,CAAC,IAAI;gBACf,aAAa,EAAE,GAAG,CAAC,SAAS;gBAC5B,cAAc,EAAE,GAAG,CAAC,KAAK;aAC1B,CAAC,CAAC,CAAC;QACN,CAAC;QAED,KAAK,CAAC,aAAa,CAAC,IAAY;YAC9B,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM;iBACtC,IAAI,CAAC,cAAc,CAAC;iBACpB,MAAM,CAAC,4CAA4C,CAAC;iBACpD,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC;iBAChB,KAAK,CAAC,CAAC,CAAC;iBACR,WAAW,EAAE,CAAC;YAEjB,IAAI,KAAK,IAAI,CAAC,GAAG;gBAAE,OAAO,IAAI,CAAC;YAE/B,OAAO;gBACL,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,IAAI,EAAE,GAAG,CAAC,OAAO;gBACjB,KAAK,EAAE,GAAG,CAAC,IAAI;gBACf,aAAa,EAAE,GAAG,CAAC,SAAS;gBAC5B,cAAc,EAAE,GAAG,CAAC,KAAK;aAC1B,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -1,5 +0,0 @@
1
- export type { Observation, DualPrice, TradingDay, MarketModule } from './types';
2
- export { createMarket } from './client';
3
- export { TRACKED_TICKERS_DESCRIPTION, TRACKED_TICKERS_YFINANCE } from './trackedTickers';
4
- export type { TrackedTicker } from './trackedTickers';
5
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/market/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,2BAA2B,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AACzF,YAAY,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC"}
@@ -1,9 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.TRACKED_TICKERS_YFINANCE = exports.TRACKED_TICKERS_DESCRIPTION = exports.createMarket = void 0;
4
- var client_1 = require("./client");
5
- Object.defineProperty(exports, "createMarket", { enumerable: true, get: function () { return client_1.createMarket; } });
6
- var trackedTickers_1 = require("./trackedTickers");
7
- Object.defineProperty(exports, "TRACKED_TICKERS_DESCRIPTION", { enumerable: true, get: function () { return trackedTickers_1.TRACKED_TICKERS_DESCRIPTION; } });
8
- Object.defineProperty(exports, "TRACKED_TICKERS_YFINANCE", { enumerable: true, get: function () { return trackedTickers_1.TRACKED_TICKERS_YFINANCE; } });
9
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/market/index.ts"],"names":[],"mappings":";;;AACA,mCAAwC;AAA/B,sGAAA,YAAY,OAAA;AACrB,mDAAyF;AAAhF,6HAAA,2BAA2B,OAAA;AAAE,0HAAA,wBAAwB,OAAA"}