@trade-it/core 0.1.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.
- package/README.md +30 -0
- package/dist/index.cjs +153 -0
- package/dist/index.d.cts +174 -0
- package/dist/index.d.ts +174 -0
- package/dist/index.js +140 -0
- package/package.json +32 -0
package/README.md
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# `@trade-it/core`
|
|
2
|
+
|
|
3
|
+
Framework-agnostic core utilities for Trade It embedded SDKs.
|
|
4
|
+
|
|
5
|
+
This package powers the Trade It SDK surface shared across framework wrappers, including:
|
|
6
|
+
|
|
7
|
+
- shared types
|
|
8
|
+
- trade URL resolution
|
|
9
|
+
- event parsing helpers
|
|
10
|
+
|
|
11
|
+
Most integrators should use [`@trade-it/react`](https://www.npmjs.com/package/@trade-it/react) directly.
|
|
12
|
+
|
|
13
|
+
## Install
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npm i @trade-it/core
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Documentation
|
|
20
|
+
|
|
21
|
+
Integration guides and reference docs:
|
|
22
|
+
|
|
23
|
+
- [React SDK Overview](https://docs.tradeit.app/sdk)
|
|
24
|
+
- [Place Trades](https://docs.tradeit.app/sdk/trades)
|
|
25
|
+
- [SDK Enums Reference](https://docs.tradeit.app/sdk/enums)
|
|
26
|
+
|
|
27
|
+
## Notes
|
|
28
|
+
|
|
29
|
+
- This package is intended for framework wrappers or advanced integrations.
|
|
30
|
+
- Trade It session URLs should still be requested from your server.
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
|
|
2
|
+
//#region ../../lib/types/src/enums/trading.enums.ts
|
|
3
|
+
let TradeAction = /* @__PURE__ */ function(TradeAction$1) {
|
|
4
|
+
TradeAction$1["Buy"] = "buy";
|
|
5
|
+
TradeAction$1["Sell"] = "sell";
|
|
6
|
+
return TradeAction$1;
|
|
7
|
+
}({});
|
|
8
|
+
let PositionEffect = /* @__PURE__ */ function(PositionEffect$1) {
|
|
9
|
+
PositionEffect$1["Open"] = "open";
|
|
10
|
+
PositionEffect$1["Close"] = "close";
|
|
11
|
+
return PositionEffect$1;
|
|
12
|
+
}({});
|
|
13
|
+
let OrderType = /* @__PURE__ */ function(OrderType$1) {
|
|
14
|
+
OrderType$1["Market"] = "market";
|
|
15
|
+
OrderType$1["Limit"] = "limit";
|
|
16
|
+
OrderType$1["Stop"] = "stop";
|
|
17
|
+
OrderType$1["StopLimit"] = "stop_limit";
|
|
18
|
+
return OrderType$1;
|
|
19
|
+
}({});
|
|
20
|
+
let OrderDirection = /* @__PURE__ */ function(OrderDirection$1) {
|
|
21
|
+
OrderDirection$1["Debit"] = "debit";
|
|
22
|
+
OrderDirection$1["Credit"] = "credit";
|
|
23
|
+
return OrderDirection$1;
|
|
24
|
+
}({});
|
|
25
|
+
let TimeInForce = /* @__PURE__ */ function(TimeInForce$1) {
|
|
26
|
+
TimeInForce$1["Day"] = "day";
|
|
27
|
+
TimeInForce$1["GoodTillCanceled"] = "gtc";
|
|
28
|
+
TimeInForce$1["ImmediateOrCancel"] = "ioc";
|
|
29
|
+
TimeInForce$1["FillOrKill"] = "fok";
|
|
30
|
+
return TimeInForce$1;
|
|
31
|
+
}({});
|
|
32
|
+
let TradeUnit = /* @__PURE__ */ function(TradeUnit$1) {
|
|
33
|
+
TradeUnit$1["Dollars"] = "dollars";
|
|
34
|
+
TradeUnit$1["Shares"] = "shares";
|
|
35
|
+
return TradeUnit$1;
|
|
36
|
+
}({});
|
|
37
|
+
let LegType = /* @__PURE__ */ function(LegType$1) {
|
|
38
|
+
LegType$1["Option"] = "option";
|
|
39
|
+
LegType$1["Equity"] = "equity";
|
|
40
|
+
return LegType$1;
|
|
41
|
+
}({});
|
|
42
|
+
let TradeType = /* @__PURE__ */ function(TradeType$1) {
|
|
43
|
+
TradeType$1[TradeType$1["Simple"] = 0] = "Simple";
|
|
44
|
+
TradeType$1[TradeType$1["MultiLeg"] = 1] = "MultiLeg";
|
|
45
|
+
return TradeType$1;
|
|
46
|
+
}({});
|
|
47
|
+
|
|
48
|
+
//#endregion
|
|
49
|
+
//#region ../../lib/types/src/types/trade-link.types.ts
|
|
50
|
+
/**
|
|
51
|
+
* Short query parameter keys for trade link URLs
|
|
52
|
+
*/
|
|
53
|
+
let TradeLinkParam = /* @__PURE__ */ function(TradeLinkParam$1) {
|
|
54
|
+
TradeLinkParam$1["TradeType"] = "tt";
|
|
55
|
+
TradeLinkParam$1["Action"] = "t";
|
|
56
|
+
TradeLinkParam$1["OrderType"] = "ot";
|
|
57
|
+
TradeLinkParam$1["Amount"] = "a";
|
|
58
|
+
TradeLinkParam$1["Unit"] = "u";
|
|
59
|
+
TradeLinkParam$1["LimitPrice"] = "lp";
|
|
60
|
+
TradeLinkParam$1["StopPrice"] = "sp";
|
|
61
|
+
TradeLinkParam$1["TimeInForce"] = "tif";
|
|
62
|
+
TradeLinkParam$1["UtmReferred"] = "ref";
|
|
63
|
+
TradeLinkParam$1["Legs"] = "legs";
|
|
64
|
+
return TradeLinkParam$1;
|
|
65
|
+
}({});
|
|
66
|
+
|
|
67
|
+
//#endregion
|
|
68
|
+
//#region src/events.ts
|
|
69
|
+
function isTradeItEvent(data) {
|
|
70
|
+
if (!data || typeof data !== "object") return false;
|
|
71
|
+
const message = data;
|
|
72
|
+
return message.source === "tradeit" && message.version === 1 && typeof message.type === "string" && message.type.startsWith("tradeit.");
|
|
73
|
+
}
|
|
74
|
+
function getTradeItErrorMessage(event) {
|
|
75
|
+
const message = event.payload?.message;
|
|
76
|
+
return typeof message === "string" ? message : "Trade It embedded experience returned an error event.";
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
//#endregion
|
|
80
|
+
//#region src/url.ts
|
|
81
|
+
function appendQueryParam(params, key, value) {
|
|
82
|
+
if (value == null) return;
|
|
83
|
+
params.set(key, String(value));
|
|
84
|
+
}
|
|
85
|
+
function isMultiLegTradeConfig(config) {
|
|
86
|
+
return config.tradeType === TradeType.MultiLeg || Array.isArray(config.legs);
|
|
87
|
+
}
|
|
88
|
+
function toShortLegConfig(leg) {
|
|
89
|
+
return {
|
|
90
|
+
type: leg.type,
|
|
91
|
+
t: leg.action,
|
|
92
|
+
pe: leg.positionEffect,
|
|
93
|
+
occ: leg.occ,
|
|
94
|
+
q: leg.quantity
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
function normalizeTradeConfig(config) {
|
|
98
|
+
const params = new URLSearchParams();
|
|
99
|
+
if (!config) return params;
|
|
100
|
+
const multiLeg = isMultiLegTradeConfig(config);
|
|
101
|
+
appendQueryParam(params, TradeLinkParam.TradeType, multiLeg ? TradeType.MultiLeg : TradeType.Simple);
|
|
102
|
+
appendQueryParam(params, TradeLinkParam.OrderType, config.orderType);
|
|
103
|
+
appendQueryParam(params, TradeLinkParam.LimitPrice, config.limitPrice);
|
|
104
|
+
appendQueryParam(params, TradeLinkParam.StopPrice, config.stopPrice);
|
|
105
|
+
appendQueryParam(params, TradeLinkParam.TimeInForce, config.timeInForce);
|
|
106
|
+
appendQueryParam(params, TradeLinkParam.UtmReferred, config.referral);
|
|
107
|
+
if (multiLeg) params.set(TradeLinkParam.Legs, JSON.stringify(config.legs.map(toShortLegConfig)));
|
|
108
|
+
else {
|
|
109
|
+
appendQueryParam(params, TradeLinkParam.Action, config.action);
|
|
110
|
+
appendQueryParam(params, TradeLinkParam.Amount, config.amount);
|
|
111
|
+
appendQueryParam(params, TradeLinkParam.Unit, config.unit);
|
|
112
|
+
}
|
|
113
|
+
return params;
|
|
114
|
+
}
|
|
115
|
+
function mergeSearchParams(url, extra) {
|
|
116
|
+
extra.forEach((value, key) => {
|
|
117
|
+
url.searchParams.set(key, value);
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
function resolveLaunchUrl(launch) {
|
|
121
|
+
if (launch.mode === "connect") return launch.url;
|
|
122
|
+
if (!launch.config) throw new Error("Trade launch must include a config object.");
|
|
123
|
+
if (!launch.url.includes("[ticker]")) throw new Error("Trade launch url must contain the \"[ticker]\" placeholder.");
|
|
124
|
+
const encodedTicker = encodeURIComponent(launch.config.ticker);
|
|
125
|
+
const rawUrl = launch.url.replace("[ticker]", encodedTicker);
|
|
126
|
+
const url = new URL(rawUrl, typeof window !== "undefined" ? window.location.href : "https://tradeit.app");
|
|
127
|
+
const configParams = normalizeTradeConfig(launch.config);
|
|
128
|
+
mergeSearchParams(url, configParams);
|
|
129
|
+
if (!url.searchParams.has("embedded")) url.searchParams.set("embedded", "1");
|
|
130
|
+
return url.toString();
|
|
131
|
+
}
|
|
132
|
+
function getUrlOrigin(url) {
|
|
133
|
+
try {
|
|
134
|
+
return new URL(url).origin;
|
|
135
|
+
} catch {
|
|
136
|
+
return null;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
//#endregion
|
|
141
|
+
exports.LegType = LegType;
|
|
142
|
+
exports.OrderDirection = OrderDirection;
|
|
143
|
+
exports.OrderType = OrderType;
|
|
144
|
+
exports.PositionEffect = PositionEffect;
|
|
145
|
+
exports.TimeInForce = TimeInForce;
|
|
146
|
+
exports.TradeAction = TradeAction;
|
|
147
|
+
exports.TradeLinkParam = TradeLinkParam;
|
|
148
|
+
exports.TradeType = TradeType;
|
|
149
|
+
exports.TradeUnit = TradeUnit;
|
|
150
|
+
exports.getTradeItErrorMessage = getTradeItErrorMessage;
|
|
151
|
+
exports.getUrlOrigin = getUrlOrigin;
|
|
152
|
+
exports.isTradeItEvent = isTradeItEvent;
|
|
153
|
+
exports.resolveLaunchUrl = resolveLaunchUrl;
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
//#region ../../lib/types/src/enums/trading.enums.d.ts
|
|
4
|
+
declare enum TradeAction {
|
|
5
|
+
Buy = "buy",
|
|
6
|
+
Sell = "sell",
|
|
7
|
+
}
|
|
8
|
+
declare enum PositionEffect {
|
|
9
|
+
Open = "open",
|
|
10
|
+
Close = "close",
|
|
11
|
+
}
|
|
12
|
+
declare enum OrderType {
|
|
13
|
+
Market = "market",
|
|
14
|
+
Limit = "limit",
|
|
15
|
+
Stop = "stop",
|
|
16
|
+
StopLimit = "stop_limit",
|
|
17
|
+
}
|
|
18
|
+
declare enum OrderDirection {
|
|
19
|
+
Debit = "debit",
|
|
20
|
+
Credit = "credit",
|
|
21
|
+
}
|
|
22
|
+
declare enum TimeInForce {
|
|
23
|
+
Day = "day",
|
|
24
|
+
GoodTillCanceled = "gtc",
|
|
25
|
+
ImmediateOrCancel = "ioc",
|
|
26
|
+
FillOrKill = "fok",
|
|
27
|
+
}
|
|
28
|
+
declare enum TradeUnit {
|
|
29
|
+
Dollars = "dollars",
|
|
30
|
+
Shares = "shares",
|
|
31
|
+
}
|
|
32
|
+
declare enum LegType {
|
|
33
|
+
Option = "option",
|
|
34
|
+
Equity = "equity",
|
|
35
|
+
}
|
|
36
|
+
declare enum TradeType {
|
|
37
|
+
Simple = 0,
|
|
38
|
+
MultiLeg = 1,
|
|
39
|
+
}
|
|
40
|
+
//#endregion
|
|
41
|
+
//#region ../../lib/types/src/schemas/trade-link.schemas.d.ts
|
|
42
|
+
/**
|
|
43
|
+
* Trade Link Leg Config - derived from TradeLeg without execution_price
|
|
44
|
+
*/
|
|
45
|
+
declare const zTradeLinkLegConfig: z.ZodObject<Omit<{
|
|
46
|
+
type: z.ZodNativeEnum<typeof LegType>;
|
|
47
|
+
action: z.ZodNativeEnum<typeof TradeAction>;
|
|
48
|
+
position_effect: z.ZodNullable<z.ZodNativeEnum<typeof PositionEffect>>;
|
|
49
|
+
occ: z.ZodNullable<z.ZodString>;
|
|
50
|
+
quantity: z.ZodNumber;
|
|
51
|
+
execution_price: z.ZodNullable<z.ZodObject<{
|
|
52
|
+
amount: z.ZodNumber;
|
|
53
|
+
currency: z.ZodString;
|
|
54
|
+
}, "strip", z.ZodTypeAny, {
|
|
55
|
+
amount: number;
|
|
56
|
+
currency: string;
|
|
57
|
+
}, {
|
|
58
|
+
amount: number;
|
|
59
|
+
currency: string;
|
|
60
|
+
}>>;
|
|
61
|
+
}, "execution_price">, "strip", z.ZodTypeAny, {
|
|
62
|
+
type: LegType;
|
|
63
|
+
action: TradeAction;
|
|
64
|
+
position_effect: PositionEffect | null;
|
|
65
|
+
occ: string | null;
|
|
66
|
+
quantity: number;
|
|
67
|
+
}, {
|
|
68
|
+
type: LegType;
|
|
69
|
+
action: TradeAction;
|
|
70
|
+
position_effect: PositionEffect | null;
|
|
71
|
+
occ: string | null;
|
|
72
|
+
quantity: number;
|
|
73
|
+
}>;
|
|
74
|
+
/**
|
|
75
|
+
* Full Trade Link Config - stored in database as JSONB
|
|
76
|
+
* Supports both simple trades and multi-leg options trades
|
|
77
|
+
*/
|
|
78
|
+
//#endregion
|
|
79
|
+
//#region ../../lib/types/src/types/misc.types.d.ts
|
|
80
|
+
type SnakeToCamelCase<S extends string> = S extends `${infer P1}_${infer P2}` ? `${P1}${Capitalize<SnakeToCamelCase<P2>>}` : S;
|
|
81
|
+
/** Converts a type's snake_case keys to camelCase keys */
|
|
82
|
+
type Camelize<T> = T extends object ? { [K in keyof T as K extends string ? SnakeToCamelCase<K> : K]: Camelize<T[K]> } : T;
|
|
83
|
+
//#endregion
|
|
84
|
+
//#region ../../lib/types/src/types/trade-link.types.d.ts
|
|
85
|
+
/** Configuration for a leg in a multi-leg trade link */
|
|
86
|
+
type TradeLinkLegConfig = z.infer<typeof zTradeLinkLegConfig>;
|
|
87
|
+
/** Full configuration stored in the trade link */
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Short query parameter keys for trade link URLs
|
|
91
|
+
*/
|
|
92
|
+
declare enum TradeLinkParam {
|
|
93
|
+
TradeType = "tt",
|
|
94
|
+
// s (simple), m (multi_leg)
|
|
95
|
+
Action = "t",
|
|
96
|
+
// b, s, bto, btc, sto, stc
|
|
97
|
+
OrderType = "ot",
|
|
98
|
+
// m, l, st, sl
|
|
99
|
+
Amount = "a",
|
|
100
|
+
// number
|
|
101
|
+
Unit = "u",
|
|
102
|
+
// d, s
|
|
103
|
+
LimitPrice = "lp",
|
|
104
|
+
// number
|
|
105
|
+
StopPrice = "sp",
|
|
106
|
+
// number
|
|
107
|
+
TimeInForce = "tif",
|
|
108
|
+
// d, gtc, ioc, fok
|
|
109
|
+
UtmReferred = "ref",
|
|
110
|
+
// string
|
|
111
|
+
Legs = "legs",
|
|
112
|
+
}
|
|
113
|
+
//#endregion
|
|
114
|
+
//#region src/types.d.ts
|
|
115
|
+
type TradeItEventType = 'tradeit.ready' | 'tradeit.close_requested' | 'tradeit.brokerage_connected' | 'tradeit.trade_submitted' | 'tradeit.trade_executed' | 'tradeit.error' | 'tradeit.login_required';
|
|
116
|
+
interface TradeItEvent<TPayload = Record<string, unknown>> {
|
|
117
|
+
source: 'tradeit';
|
|
118
|
+
version: 1;
|
|
119
|
+
type: TradeItEventType;
|
|
120
|
+
payload?: TPayload;
|
|
121
|
+
}
|
|
122
|
+
type TradeItQueryPrimitive = string | number | boolean | null | undefined;
|
|
123
|
+
type TradeItMode = 'connect' | 'trade';
|
|
124
|
+
type TradeItMultiLegTradeLegConfig = Partial<Camelize<TradeLinkLegConfig>>;
|
|
125
|
+
/**
|
|
126
|
+
* Query params accepted by Trade It's /t/[ticker] page.
|
|
127
|
+
* User-facing config uses descriptive keys; core converts them to the short-key
|
|
128
|
+
* query format used by the page parser (tt, t, ot, a, u, lp, sp, tif, ref, legs).
|
|
129
|
+
*/
|
|
130
|
+
interface TradeItTradeConfigBase {
|
|
131
|
+
ticker: string;
|
|
132
|
+
orderType?: OrderType;
|
|
133
|
+
limitPrice?: number;
|
|
134
|
+
stopPrice?: number;
|
|
135
|
+
timeInForce?: TimeInForce;
|
|
136
|
+
referral?: string;
|
|
137
|
+
}
|
|
138
|
+
interface TradeItSimpleTradeConfig extends TradeItTradeConfigBase {
|
|
139
|
+
tradeType?: TradeType.Simple;
|
|
140
|
+
action?: TradeAction;
|
|
141
|
+
amount?: number;
|
|
142
|
+
unit?: TradeUnit;
|
|
143
|
+
}
|
|
144
|
+
interface TradeItMultiLegTradeConfig extends TradeItTradeConfigBase {
|
|
145
|
+
tradeType: TradeType.MultiLeg;
|
|
146
|
+
direction?: OrderDirection;
|
|
147
|
+
legs: TradeItMultiLegTradeLegConfig[];
|
|
148
|
+
}
|
|
149
|
+
type TradeItTradeConfig = TradeItSimpleTradeConfig | TradeItMultiLegTradeConfig;
|
|
150
|
+
interface TradeItLaunchConfigMap {
|
|
151
|
+
connect: undefined;
|
|
152
|
+
trade: TradeItTradeConfig;
|
|
153
|
+
}
|
|
154
|
+
type TradeItLaunchShape<TMode extends TradeItMode> = {
|
|
155
|
+
mode: TMode;
|
|
156
|
+
url: string;
|
|
157
|
+
} & (TMode extends 'connect' ? {
|
|
158
|
+
config?: undefined;
|
|
159
|
+
} : {
|
|
160
|
+
config: TradeItLaunchConfigMap[TMode];
|
|
161
|
+
});
|
|
162
|
+
type TradeItLaunch<TMode extends TradeItMode = TradeItMode> = TMode extends TradeItMode ? TradeItLaunchShape<TMode> : never;
|
|
163
|
+
type TradeItConnectLaunch = TradeItLaunch<'connect'>;
|
|
164
|
+
type TradeItTradeLaunch = TradeItLaunch<'trade'>;
|
|
165
|
+
//#endregion
|
|
166
|
+
//#region src/events.d.ts
|
|
167
|
+
declare function isTradeItEvent(data: unknown): data is TradeItEvent;
|
|
168
|
+
declare function getTradeItErrorMessage(event: TradeItEvent): string;
|
|
169
|
+
//#endregion
|
|
170
|
+
//#region src/url.d.ts
|
|
171
|
+
declare function resolveLaunchUrl(launch: TradeItLaunch): string;
|
|
172
|
+
declare function getUrlOrigin(url: string): string | null;
|
|
173
|
+
//#endregion
|
|
174
|
+
export { LegType, OrderDirection, OrderType, PositionEffect, TimeInForce, TradeAction, type TradeItConnectLaunch, type TradeItEvent, type TradeItEventType, type TradeItLaunch, type TradeItLaunchConfigMap, type TradeItMode, type TradeItMultiLegTradeConfig, type TradeItMultiLegTradeLegConfig, type TradeItQueryPrimitive, type TradeItSimpleTradeConfig, type TradeItTradeConfig, type TradeItTradeLaunch, type TradeLinkLegConfig, TradeLinkParam, TradeType, TradeUnit, getTradeItErrorMessage, getUrlOrigin, isTradeItEvent, resolveLaunchUrl };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
//#region ../../lib/types/src/enums/trading.enums.d.ts
|
|
4
|
+
declare enum TradeAction {
|
|
5
|
+
Buy = "buy",
|
|
6
|
+
Sell = "sell",
|
|
7
|
+
}
|
|
8
|
+
declare enum PositionEffect {
|
|
9
|
+
Open = "open",
|
|
10
|
+
Close = "close",
|
|
11
|
+
}
|
|
12
|
+
declare enum OrderType {
|
|
13
|
+
Market = "market",
|
|
14
|
+
Limit = "limit",
|
|
15
|
+
Stop = "stop",
|
|
16
|
+
StopLimit = "stop_limit",
|
|
17
|
+
}
|
|
18
|
+
declare enum OrderDirection {
|
|
19
|
+
Debit = "debit",
|
|
20
|
+
Credit = "credit",
|
|
21
|
+
}
|
|
22
|
+
declare enum TimeInForce {
|
|
23
|
+
Day = "day",
|
|
24
|
+
GoodTillCanceled = "gtc",
|
|
25
|
+
ImmediateOrCancel = "ioc",
|
|
26
|
+
FillOrKill = "fok",
|
|
27
|
+
}
|
|
28
|
+
declare enum TradeUnit {
|
|
29
|
+
Dollars = "dollars",
|
|
30
|
+
Shares = "shares",
|
|
31
|
+
}
|
|
32
|
+
declare enum LegType {
|
|
33
|
+
Option = "option",
|
|
34
|
+
Equity = "equity",
|
|
35
|
+
}
|
|
36
|
+
declare enum TradeType {
|
|
37
|
+
Simple = 0,
|
|
38
|
+
MultiLeg = 1,
|
|
39
|
+
}
|
|
40
|
+
//#endregion
|
|
41
|
+
//#region ../../lib/types/src/schemas/trade-link.schemas.d.ts
|
|
42
|
+
/**
|
|
43
|
+
* Trade Link Leg Config - derived from TradeLeg without execution_price
|
|
44
|
+
*/
|
|
45
|
+
declare const zTradeLinkLegConfig: z.ZodObject<Omit<{
|
|
46
|
+
type: z.ZodNativeEnum<typeof LegType>;
|
|
47
|
+
action: z.ZodNativeEnum<typeof TradeAction>;
|
|
48
|
+
position_effect: z.ZodNullable<z.ZodNativeEnum<typeof PositionEffect>>;
|
|
49
|
+
occ: z.ZodNullable<z.ZodString>;
|
|
50
|
+
quantity: z.ZodNumber;
|
|
51
|
+
execution_price: z.ZodNullable<z.ZodObject<{
|
|
52
|
+
amount: z.ZodNumber;
|
|
53
|
+
currency: z.ZodString;
|
|
54
|
+
}, "strip", z.ZodTypeAny, {
|
|
55
|
+
amount: number;
|
|
56
|
+
currency: string;
|
|
57
|
+
}, {
|
|
58
|
+
amount: number;
|
|
59
|
+
currency: string;
|
|
60
|
+
}>>;
|
|
61
|
+
}, "execution_price">, "strip", z.ZodTypeAny, {
|
|
62
|
+
type: LegType;
|
|
63
|
+
action: TradeAction;
|
|
64
|
+
position_effect: PositionEffect | null;
|
|
65
|
+
occ: string | null;
|
|
66
|
+
quantity: number;
|
|
67
|
+
}, {
|
|
68
|
+
type: LegType;
|
|
69
|
+
action: TradeAction;
|
|
70
|
+
position_effect: PositionEffect | null;
|
|
71
|
+
occ: string | null;
|
|
72
|
+
quantity: number;
|
|
73
|
+
}>;
|
|
74
|
+
/**
|
|
75
|
+
* Full Trade Link Config - stored in database as JSONB
|
|
76
|
+
* Supports both simple trades and multi-leg options trades
|
|
77
|
+
*/
|
|
78
|
+
//#endregion
|
|
79
|
+
//#region ../../lib/types/src/types/misc.types.d.ts
|
|
80
|
+
type SnakeToCamelCase<S extends string> = S extends `${infer P1}_${infer P2}` ? `${P1}${Capitalize<SnakeToCamelCase<P2>>}` : S;
|
|
81
|
+
/** Converts a type's snake_case keys to camelCase keys */
|
|
82
|
+
type Camelize<T> = T extends object ? { [K in keyof T as K extends string ? SnakeToCamelCase<K> : K]: Camelize<T[K]> } : T;
|
|
83
|
+
//#endregion
|
|
84
|
+
//#region ../../lib/types/src/types/trade-link.types.d.ts
|
|
85
|
+
/** Configuration for a leg in a multi-leg trade link */
|
|
86
|
+
type TradeLinkLegConfig = z.infer<typeof zTradeLinkLegConfig>;
|
|
87
|
+
/** Full configuration stored in the trade link */
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Short query parameter keys for trade link URLs
|
|
91
|
+
*/
|
|
92
|
+
declare enum TradeLinkParam {
|
|
93
|
+
TradeType = "tt",
|
|
94
|
+
// s (simple), m (multi_leg)
|
|
95
|
+
Action = "t",
|
|
96
|
+
// b, s, bto, btc, sto, stc
|
|
97
|
+
OrderType = "ot",
|
|
98
|
+
// m, l, st, sl
|
|
99
|
+
Amount = "a",
|
|
100
|
+
// number
|
|
101
|
+
Unit = "u",
|
|
102
|
+
// d, s
|
|
103
|
+
LimitPrice = "lp",
|
|
104
|
+
// number
|
|
105
|
+
StopPrice = "sp",
|
|
106
|
+
// number
|
|
107
|
+
TimeInForce = "tif",
|
|
108
|
+
// d, gtc, ioc, fok
|
|
109
|
+
UtmReferred = "ref",
|
|
110
|
+
// string
|
|
111
|
+
Legs = "legs",
|
|
112
|
+
}
|
|
113
|
+
//#endregion
|
|
114
|
+
//#region src/types.d.ts
|
|
115
|
+
type TradeItEventType = 'tradeit.ready' | 'tradeit.close_requested' | 'tradeit.brokerage_connected' | 'tradeit.trade_submitted' | 'tradeit.trade_executed' | 'tradeit.error' | 'tradeit.login_required';
|
|
116
|
+
interface TradeItEvent<TPayload = Record<string, unknown>> {
|
|
117
|
+
source: 'tradeit';
|
|
118
|
+
version: 1;
|
|
119
|
+
type: TradeItEventType;
|
|
120
|
+
payload?: TPayload;
|
|
121
|
+
}
|
|
122
|
+
type TradeItQueryPrimitive = string | number | boolean | null | undefined;
|
|
123
|
+
type TradeItMode = 'connect' | 'trade';
|
|
124
|
+
type TradeItMultiLegTradeLegConfig = Partial<Camelize<TradeLinkLegConfig>>;
|
|
125
|
+
/**
|
|
126
|
+
* Query params accepted by Trade It's /t/[ticker] page.
|
|
127
|
+
* User-facing config uses descriptive keys; core converts them to the short-key
|
|
128
|
+
* query format used by the page parser (tt, t, ot, a, u, lp, sp, tif, ref, legs).
|
|
129
|
+
*/
|
|
130
|
+
interface TradeItTradeConfigBase {
|
|
131
|
+
ticker: string;
|
|
132
|
+
orderType?: OrderType;
|
|
133
|
+
limitPrice?: number;
|
|
134
|
+
stopPrice?: number;
|
|
135
|
+
timeInForce?: TimeInForce;
|
|
136
|
+
referral?: string;
|
|
137
|
+
}
|
|
138
|
+
interface TradeItSimpleTradeConfig extends TradeItTradeConfigBase {
|
|
139
|
+
tradeType?: TradeType.Simple;
|
|
140
|
+
action?: TradeAction;
|
|
141
|
+
amount?: number;
|
|
142
|
+
unit?: TradeUnit;
|
|
143
|
+
}
|
|
144
|
+
interface TradeItMultiLegTradeConfig extends TradeItTradeConfigBase {
|
|
145
|
+
tradeType: TradeType.MultiLeg;
|
|
146
|
+
direction?: OrderDirection;
|
|
147
|
+
legs: TradeItMultiLegTradeLegConfig[];
|
|
148
|
+
}
|
|
149
|
+
type TradeItTradeConfig = TradeItSimpleTradeConfig | TradeItMultiLegTradeConfig;
|
|
150
|
+
interface TradeItLaunchConfigMap {
|
|
151
|
+
connect: undefined;
|
|
152
|
+
trade: TradeItTradeConfig;
|
|
153
|
+
}
|
|
154
|
+
type TradeItLaunchShape<TMode extends TradeItMode> = {
|
|
155
|
+
mode: TMode;
|
|
156
|
+
url: string;
|
|
157
|
+
} & (TMode extends 'connect' ? {
|
|
158
|
+
config?: undefined;
|
|
159
|
+
} : {
|
|
160
|
+
config: TradeItLaunchConfigMap[TMode];
|
|
161
|
+
});
|
|
162
|
+
type TradeItLaunch<TMode extends TradeItMode = TradeItMode> = TMode extends TradeItMode ? TradeItLaunchShape<TMode> : never;
|
|
163
|
+
type TradeItConnectLaunch = TradeItLaunch<'connect'>;
|
|
164
|
+
type TradeItTradeLaunch = TradeItLaunch<'trade'>;
|
|
165
|
+
//#endregion
|
|
166
|
+
//#region src/events.d.ts
|
|
167
|
+
declare function isTradeItEvent(data: unknown): data is TradeItEvent;
|
|
168
|
+
declare function getTradeItErrorMessage(event: TradeItEvent): string;
|
|
169
|
+
//#endregion
|
|
170
|
+
//#region src/url.d.ts
|
|
171
|
+
declare function resolveLaunchUrl(launch: TradeItLaunch): string;
|
|
172
|
+
declare function getUrlOrigin(url: string): string | null;
|
|
173
|
+
//#endregion
|
|
174
|
+
export { LegType, OrderDirection, OrderType, PositionEffect, TimeInForce, TradeAction, type TradeItConnectLaunch, type TradeItEvent, type TradeItEventType, type TradeItLaunch, type TradeItLaunchConfigMap, type TradeItMode, type TradeItMultiLegTradeConfig, type TradeItMultiLegTradeLegConfig, type TradeItQueryPrimitive, type TradeItSimpleTradeConfig, type TradeItTradeConfig, type TradeItTradeLaunch, type TradeLinkLegConfig, TradeLinkParam, TradeType, TradeUnit, getTradeItErrorMessage, getUrlOrigin, isTradeItEvent, resolveLaunchUrl };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
//#region ../../lib/types/src/enums/trading.enums.ts
|
|
2
|
+
let TradeAction = /* @__PURE__ */ function(TradeAction$1) {
|
|
3
|
+
TradeAction$1["Buy"] = "buy";
|
|
4
|
+
TradeAction$1["Sell"] = "sell";
|
|
5
|
+
return TradeAction$1;
|
|
6
|
+
}({});
|
|
7
|
+
let PositionEffect = /* @__PURE__ */ function(PositionEffect$1) {
|
|
8
|
+
PositionEffect$1["Open"] = "open";
|
|
9
|
+
PositionEffect$1["Close"] = "close";
|
|
10
|
+
return PositionEffect$1;
|
|
11
|
+
}({});
|
|
12
|
+
let OrderType = /* @__PURE__ */ function(OrderType$1) {
|
|
13
|
+
OrderType$1["Market"] = "market";
|
|
14
|
+
OrderType$1["Limit"] = "limit";
|
|
15
|
+
OrderType$1["Stop"] = "stop";
|
|
16
|
+
OrderType$1["StopLimit"] = "stop_limit";
|
|
17
|
+
return OrderType$1;
|
|
18
|
+
}({});
|
|
19
|
+
let OrderDirection = /* @__PURE__ */ function(OrderDirection$1) {
|
|
20
|
+
OrderDirection$1["Debit"] = "debit";
|
|
21
|
+
OrderDirection$1["Credit"] = "credit";
|
|
22
|
+
return OrderDirection$1;
|
|
23
|
+
}({});
|
|
24
|
+
let TimeInForce = /* @__PURE__ */ function(TimeInForce$1) {
|
|
25
|
+
TimeInForce$1["Day"] = "day";
|
|
26
|
+
TimeInForce$1["GoodTillCanceled"] = "gtc";
|
|
27
|
+
TimeInForce$1["ImmediateOrCancel"] = "ioc";
|
|
28
|
+
TimeInForce$1["FillOrKill"] = "fok";
|
|
29
|
+
return TimeInForce$1;
|
|
30
|
+
}({});
|
|
31
|
+
let TradeUnit = /* @__PURE__ */ function(TradeUnit$1) {
|
|
32
|
+
TradeUnit$1["Dollars"] = "dollars";
|
|
33
|
+
TradeUnit$1["Shares"] = "shares";
|
|
34
|
+
return TradeUnit$1;
|
|
35
|
+
}({});
|
|
36
|
+
let LegType = /* @__PURE__ */ function(LegType$1) {
|
|
37
|
+
LegType$1["Option"] = "option";
|
|
38
|
+
LegType$1["Equity"] = "equity";
|
|
39
|
+
return LegType$1;
|
|
40
|
+
}({});
|
|
41
|
+
let TradeType = /* @__PURE__ */ function(TradeType$1) {
|
|
42
|
+
TradeType$1[TradeType$1["Simple"] = 0] = "Simple";
|
|
43
|
+
TradeType$1[TradeType$1["MultiLeg"] = 1] = "MultiLeg";
|
|
44
|
+
return TradeType$1;
|
|
45
|
+
}({});
|
|
46
|
+
|
|
47
|
+
//#endregion
|
|
48
|
+
//#region ../../lib/types/src/types/trade-link.types.ts
|
|
49
|
+
/**
|
|
50
|
+
* Short query parameter keys for trade link URLs
|
|
51
|
+
*/
|
|
52
|
+
let TradeLinkParam = /* @__PURE__ */ function(TradeLinkParam$1) {
|
|
53
|
+
TradeLinkParam$1["TradeType"] = "tt";
|
|
54
|
+
TradeLinkParam$1["Action"] = "t";
|
|
55
|
+
TradeLinkParam$1["OrderType"] = "ot";
|
|
56
|
+
TradeLinkParam$1["Amount"] = "a";
|
|
57
|
+
TradeLinkParam$1["Unit"] = "u";
|
|
58
|
+
TradeLinkParam$1["LimitPrice"] = "lp";
|
|
59
|
+
TradeLinkParam$1["StopPrice"] = "sp";
|
|
60
|
+
TradeLinkParam$1["TimeInForce"] = "tif";
|
|
61
|
+
TradeLinkParam$1["UtmReferred"] = "ref";
|
|
62
|
+
TradeLinkParam$1["Legs"] = "legs";
|
|
63
|
+
return TradeLinkParam$1;
|
|
64
|
+
}({});
|
|
65
|
+
|
|
66
|
+
//#endregion
|
|
67
|
+
//#region src/events.ts
|
|
68
|
+
function isTradeItEvent(data) {
|
|
69
|
+
if (!data || typeof data !== "object") return false;
|
|
70
|
+
const message = data;
|
|
71
|
+
return message.source === "tradeit" && message.version === 1 && typeof message.type === "string" && message.type.startsWith("tradeit.");
|
|
72
|
+
}
|
|
73
|
+
function getTradeItErrorMessage(event) {
|
|
74
|
+
const message = event.payload?.message;
|
|
75
|
+
return typeof message === "string" ? message : "Trade It embedded experience returned an error event.";
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
//#endregion
|
|
79
|
+
//#region src/url.ts
|
|
80
|
+
function appendQueryParam(params, key, value) {
|
|
81
|
+
if (value == null) return;
|
|
82
|
+
params.set(key, String(value));
|
|
83
|
+
}
|
|
84
|
+
function isMultiLegTradeConfig(config) {
|
|
85
|
+
return config.tradeType === TradeType.MultiLeg || Array.isArray(config.legs);
|
|
86
|
+
}
|
|
87
|
+
function toShortLegConfig(leg) {
|
|
88
|
+
return {
|
|
89
|
+
type: leg.type,
|
|
90
|
+
t: leg.action,
|
|
91
|
+
pe: leg.positionEffect,
|
|
92
|
+
occ: leg.occ,
|
|
93
|
+
q: leg.quantity
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
function normalizeTradeConfig(config) {
|
|
97
|
+
const params = new URLSearchParams();
|
|
98
|
+
if (!config) return params;
|
|
99
|
+
const multiLeg = isMultiLegTradeConfig(config);
|
|
100
|
+
appendQueryParam(params, TradeLinkParam.TradeType, multiLeg ? TradeType.MultiLeg : TradeType.Simple);
|
|
101
|
+
appendQueryParam(params, TradeLinkParam.OrderType, config.orderType);
|
|
102
|
+
appendQueryParam(params, TradeLinkParam.LimitPrice, config.limitPrice);
|
|
103
|
+
appendQueryParam(params, TradeLinkParam.StopPrice, config.stopPrice);
|
|
104
|
+
appendQueryParam(params, TradeLinkParam.TimeInForce, config.timeInForce);
|
|
105
|
+
appendQueryParam(params, TradeLinkParam.UtmReferred, config.referral);
|
|
106
|
+
if (multiLeg) params.set(TradeLinkParam.Legs, JSON.stringify(config.legs.map(toShortLegConfig)));
|
|
107
|
+
else {
|
|
108
|
+
appendQueryParam(params, TradeLinkParam.Action, config.action);
|
|
109
|
+
appendQueryParam(params, TradeLinkParam.Amount, config.amount);
|
|
110
|
+
appendQueryParam(params, TradeLinkParam.Unit, config.unit);
|
|
111
|
+
}
|
|
112
|
+
return params;
|
|
113
|
+
}
|
|
114
|
+
function mergeSearchParams(url, extra) {
|
|
115
|
+
extra.forEach((value, key) => {
|
|
116
|
+
url.searchParams.set(key, value);
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
function resolveLaunchUrl(launch) {
|
|
120
|
+
if (launch.mode === "connect") return launch.url;
|
|
121
|
+
if (!launch.config) throw new Error("Trade launch must include a config object.");
|
|
122
|
+
if (!launch.url.includes("[ticker]")) throw new Error("Trade launch url must contain the \"[ticker]\" placeholder.");
|
|
123
|
+
const encodedTicker = encodeURIComponent(launch.config.ticker);
|
|
124
|
+
const rawUrl = launch.url.replace("[ticker]", encodedTicker);
|
|
125
|
+
const url = new URL(rawUrl, typeof window !== "undefined" ? window.location.href : "https://tradeit.app");
|
|
126
|
+
const configParams = normalizeTradeConfig(launch.config);
|
|
127
|
+
mergeSearchParams(url, configParams);
|
|
128
|
+
if (!url.searchParams.has("embedded")) url.searchParams.set("embedded", "1");
|
|
129
|
+
return url.toString();
|
|
130
|
+
}
|
|
131
|
+
function getUrlOrigin(url) {
|
|
132
|
+
try {
|
|
133
|
+
return new URL(url).origin;
|
|
134
|
+
} catch {
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
//#endregion
|
|
140
|
+
export { LegType, OrderDirection, OrderType, PositionEffect, TimeInForce, TradeAction, TradeLinkParam, TradeType, TradeUnit, getTradeItErrorMessage, getUrlOrigin, isTradeItEvent, resolveLaunchUrl };
|
package/package.json
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@trade-it/core",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Framework-agnostic core for Trade It embedded SDKs.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"main": "./dist/index.cjs",
|
|
8
|
+
"module": "./dist/index.js",
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"exports": {
|
|
11
|
+
".": {
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"import": "./dist/index.js",
|
|
14
|
+
"require": "./dist/index.cjs"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
"dist"
|
|
19
|
+
],
|
|
20
|
+
"sideEffects": false,
|
|
21
|
+
"scripts": {
|
|
22
|
+
"build": "tsdown src/index.ts --format esm,cjs --dts --out-dir dist && node ../../scripts/fix-trade-it-sdk-dts.mjs dist/index.d.ts dist/index.d.cts",
|
|
23
|
+
"dev": "tsdown src/index.ts --format esm,cjs --dts --out-dir dist --watch"
|
|
24
|
+
},
|
|
25
|
+
"dependencies": {
|
|
26
|
+
"zod": "^3.25.67"
|
|
27
|
+
},
|
|
28
|
+
"devDependencies": {
|
|
29
|
+
"tsdown": "^0.11.0",
|
|
30
|
+
"typescript": "^5.7.2"
|
|
31
|
+
}
|
|
32
|
+
}
|