@livefolio/sdk 0.2.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 (70) hide show
  1. package/README.md +191 -0
  2. package/dist/auth/client.d.ts +4 -0
  3. package/dist/auth/client.d.ts.map +1 -0
  4. package/dist/auth/client.js +37 -0
  5. package/dist/auth/client.js.map +1 -0
  6. package/dist/auth/index.d.ts +3 -0
  7. package/dist/auth/index.d.ts.map +1 -0
  8. package/dist/auth/index.js +6 -0
  9. package/dist/auth/index.js.map +1 -0
  10. package/dist/auth/types.d.ts +9 -0
  11. package/dist/auth/types.d.ts.map +1 -0
  12. package/dist/auth/types.js +3 -0
  13. package/dist/auth/types.js.map +1 -0
  14. package/dist/index.d.ts +23 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +55 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/market/client.d.ts +4 -0
  19. package/dist/market/client.d.ts.map +1 -0
  20. package/dist/market/client.js +65 -0
  21. package/dist/market/client.js.map +1 -0
  22. package/dist/market/index.d.ts +3 -0
  23. package/dist/market/index.d.ts.map +1 -0
  24. package/dist/market/index.js +6 -0
  25. package/dist/market/index.js.map +1 -0
  26. package/dist/market/types.d.ts +20 -0
  27. package/dist/market/types.d.ts.map +1 -0
  28. package/dist/market/types.js +3 -0
  29. package/dist/market/types.js.map +1 -0
  30. package/dist/portfolio/client.d.ts +4 -0
  31. package/dist/portfolio/client.d.ts.map +1 -0
  32. package/dist/portfolio/client.js +7 -0
  33. package/dist/portfolio/client.js.map +1 -0
  34. package/dist/portfolio/index.d.ts +3 -0
  35. package/dist/portfolio/index.d.ts.map +1 -0
  36. package/dist/portfolio/index.js +6 -0
  37. package/dist/portfolio/index.js.map +1 -0
  38. package/dist/portfolio/types.d.ts +3 -0
  39. package/dist/portfolio/types.d.ts.map +1 -0
  40. package/dist/portfolio/types.js +3 -0
  41. package/dist/portfolio/types.js.map +1 -0
  42. package/dist/strategy/client.d.ts +4 -0
  43. package/dist/strategy/client.d.ts.map +1 -0
  44. package/dist/strategy/client.js +350 -0
  45. package/dist/strategy/client.js.map +1 -0
  46. package/dist/strategy/evaluate.d.ts +10 -0
  47. package/dist/strategy/evaluate.d.ts.map +1 -0
  48. package/dist/strategy/evaluate.js +498 -0
  49. package/dist/strategy/evaluate.js.map +1 -0
  50. package/dist/strategy/index.d.ts +6 -0
  51. package/dist/strategy/index.d.ts.map +1 -0
  52. package/dist/strategy/index.js +20 -0
  53. package/dist/strategy/index.js.map +1 -0
  54. package/dist/strategy/symbols.d.ts +4 -0
  55. package/dist/strategy/symbols.d.ts.map +1 -0
  56. package/dist/strategy/symbols.js +41 -0
  57. package/dist/strategy/symbols.js.map +1 -0
  58. package/dist/strategy/time.d.ts +9 -0
  59. package/dist/strategy/time.d.ts.map +1 -0
  60. package/dist/strategy/time.js +28 -0
  61. package/dist/strategy/time.js.map +1 -0
  62. package/dist/strategy/types.d.ts +107 -0
  63. package/dist/strategy/types.d.ts.map +1 -0
  64. package/dist/strategy/types.js +3 -0
  65. package/dist/strategy/types.js.map +1 -0
  66. package/dist/types.d.ts +4 -0
  67. package/dist/types.d.ts.map +1 -0
  68. package/dist/types.js +3 -0
  69. package/dist/types.js.map +1 -0
  70. package/package.json +47 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time.d.ts","sourceRoot":"","sources":["../../src/strategy/time.ts"],"names":[],"mappings":"AAUA,wBAAgB,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB,CASA;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,IAAI,GAAG,OAAO,CAGxD"}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.utcToET = utcToET;
4
+ exports.isAtMarketClose = isAtMarketClose;
5
+ const ET_FORMATTER = new Intl.DateTimeFormat('en-US', {
6
+ timeZone: 'America/New_York',
7
+ year: 'numeric',
8
+ month: 'numeric',
9
+ day: 'numeric',
10
+ hour: 'numeric',
11
+ minute: 'numeric',
12
+ hourCycle: 'h23',
13
+ });
14
+ function utcToET(date) {
15
+ const parts = ET_FORMATTER.formatToParts(date);
16
+ return {
17
+ year: parseInt(parts.find((p) => p.type === 'year')?.value || '0', 10),
18
+ month: parseInt(parts.find((p) => p.type === 'month')?.value || '0', 10),
19
+ day: parseInt(parts.find((p) => p.type === 'day')?.value || '0', 10),
20
+ hour: parseInt(parts.find((p) => p.type === 'hour')?.value || '0', 10),
21
+ minute: parseInt(parts.find((p) => p.type === 'minute')?.value || '0', 10),
22
+ };
23
+ }
24
+ function isAtMarketClose(timestamp) {
25
+ const et = utcToET(timestamp);
26
+ return (et.hour === 16 && et.minute === 0) || (et.hour === 13 && et.minute === 0);
27
+ }
28
+ //# sourceMappingURL=time.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time.js","sourceRoot":"","sources":["../../src/strategy/time.ts"],"names":[],"mappings":";;AAUA,0BAeC;AAED,0CAGC;AA9BD,MAAM,YAAY,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;IACpD,QAAQ,EAAE,kBAAkB;IAC5B,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,SAAS;IAChB,GAAG,EAAE,SAAS;IACd,IAAI,EAAE,SAAS;IACf,MAAM,EAAE,SAAS;IACjB,SAAS,EAAE,KAAK;CACjB,CAAC,CAAC;AAEH,SAAgB,OAAO,CAAC,IAAU;IAOhC,MAAM,KAAK,GAAG,YAAY,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAC/C,OAAO;QACL,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,CAAC;QACtE,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,CAAC;QACxE,GAAG,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,CAAC;QACpE,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,CAAC;QACtE,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,CAAC;KAC3E,CAAC;AACJ,CAAC;AAED,SAAgB,eAAe,CAAC,SAAe;IAC7C,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAC9B,OAAO,CAAC,EAAE,CAAC,IAAI,KAAK,EAAE,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,EAAE,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC;AACpF,CAAC"}
@@ -0,0 +1,107 @@
1
+ import type { Observation } from '../market/types';
2
+ export type Comparison = '>' | '<' | '=';
3
+ export type IndicatorType = 'SMA' | 'EMA' | 'Price' | 'Return' | 'Volatility' | 'Drawdown' | 'RSI' | 'VIX' | 'VIX3M' | 'T3M' | 'T6M' | 'T1Y' | 'T2Y' | 'T3Y' | 'T5Y' | 'T7Y' | 'T10Y' | 'T20Y' | 'T30Y' | 'Month' | 'Day of Week' | 'Day of Month' | 'Day of Year' | 'Threshold';
4
+ export type Frequency = 'Daily' | 'Weekly' | 'Monthly' | 'Bi-monthly' | 'Quarterly' | 'Every 4 Months' | 'Semiannually' | 'Yearly';
5
+ export type Unit = '%' | '$' | null;
6
+ export interface Ticker {
7
+ symbol: string;
8
+ leverage: number;
9
+ }
10
+ export interface Indicator {
11
+ type: IndicatorType;
12
+ ticker: Ticker;
13
+ lookback: number;
14
+ delay: number;
15
+ unit: Unit;
16
+ threshold: number | null;
17
+ }
18
+ export interface Signal {
19
+ left: Indicator;
20
+ comparison: Comparison;
21
+ right: Indicator;
22
+ tolerance: number;
23
+ }
24
+ export interface Holding {
25
+ ticker: Ticker;
26
+ weight: number;
27
+ }
28
+ export interface Allocation {
29
+ condition: Condition;
30
+ holdings: Holding[];
31
+ }
32
+ export interface SignalExpr {
33
+ kind: 'signal';
34
+ signal: Signal;
35
+ }
36
+ export interface NotExpr {
37
+ kind: 'not';
38
+ signal: Signal;
39
+ }
40
+ export type UnaryExpr = SignalExpr | NotExpr;
41
+ export interface AndExpr {
42
+ kind: 'and';
43
+ args: UnaryExpr[];
44
+ }
45
+ export interface OrExpr {
46
+ kind: 'or';
47
+ args: AndExpr[];
48
+ }
49
+ export type Condition = OrExpr | AndExpr | UnaryExpr;
50
+ export interface NamedSignal {
51
+ name: string;
52
+ signal: Signal;
53
+ }
54
+ export interface NamedAllocation {
55
+ name: string;
56
+ allocation: Allocation;
57
+ }
58
+ export interface Trading {
59
+ frequency: Frequency;
60
+ offset: number;
61
+ }
62
+ export interface Strategy {
63
+ linkId: string;
64
+ name: string;
65
+ trading: Trading;
66
+ allocations: NamedAllocation[];
67
+ signals: NamedSignal[];
68
+ }
69
+ export interface EvaluationOptions {
70
+ at: Date;
71
+ batchSeries: Record<string, Observation[]>;
72
+ previousSignalStates?: Record<string, boolean>;
73
+ previousIndicatorMetadata?: Record<string, unknown>;
74
+ }
75
+ export interface IndicatorEvaluation {
76
+ timestamp: string;
77
+ value: number;
78
+ metadata?: unknown;
79
+ }
80
+ export interface AllocationEvaluation {
81
+ name: string;
82
+ holdings: Holding[];
83
+ }
84
+ export interface StrategyEvaluation {
85
+ asOf: Date;
86
+ allocation: AllocationEvaluation;
87
+ signals: Record<string, boolean>;
88
+ indicators: Record<string, IndicatorEvaluation>;
89
+ }
90
+ export interface BacktestOptions {
91
+ startDate: string;
92
+ endDate: string;
93
+ }
94
+ export interface BacktestResult {
95
+ }
96
+ export interface StrategyModule {
97
+ get(linkId: string): Promise<Strategy | null>;
98
+ getMany(linkIds: string[]): Promise<Record<string, Strategy>>;
99
+ evaluate(strategy: Strategy, at: Date): Promise<StrategyEvaluation>;
100
+ evaluateIndicator(indicator: Indicator, options: EvaluationOptions): IndicatorEvaluation;
101
+ evaluateSignal(signal: Signal, options: EvaluationOptions): boolean;
102
+ evaluateAllocation(allocation: Allocation, options: EvaluationOptions): boolean;
103
+ getEvaluationDate(trading: Trading, options: EvaluationOptions): Date;
104
+ extractSymbols(strategy: Strategy): string[];
105
+ backtest(strategy: Strategy, options: BacktestOptions): Promise<BacktestResult>;
106
+ }
107
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/strategy/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/strategy/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ import type { SupabaseClient } from '@supabase/supabase-js';
2
+ import type { Database } from '@livefolio/db';
3
+ export type TypedSupabaseClient = SupabaseClient<Database>;
4
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C,MAAM,MAAM,mBAAmB,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC"}
package/dist/types.js ADDED
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,47 @@
1
+ {
2
+ "name": "@livefolio/sdk",
3
+ "version": "0.2.0",
4
+ "description": "Livefolio SDK — market data, strategy evaluation, and portfolio management",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "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"
27
+ }
28
+ },
29
+ "files": [
30
+ "dist"
31
+ ],
32
+ "scripts": {
33
+ "build": "tsc",
34
+ "clean": "rm -rf dist",
35
+ "test": "vitest run",
36
+ "test:watch": "vitest"
37
+ },
38
+ "dependencies": {
39
+ "@livefolio/db": "*",
40
+ "@supabase/supabase-js": "^2"
41
+ },
42
+ "devDependencies": {
43
+ "@vitest/coverage-v8": "^4.0.18",
44
+ "typescript": "^5.5.3",
45
+ "vitest": "^4.0.18"
46
+ }
47
+ }