@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 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;
@@ -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 };
@@ -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
+ }