@kodiak-finance/orderly-plugin-core 2.9.2-alpha.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/dist/index.d.mts +266 -0
- package/dist/index.d.ts +266 -0
- package/dist/index.js +503 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +469 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +47 -0
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,469 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __defProps = Object.defineProperties;
|
|
3
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
7
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
8
|
+
var __spreadValues = (a, b) => {
|
|
9
|
+
for (var prop in b || (b = {}))
|
|
10
|
+
if (__hasOwnProp.call(b, prop))
|
|
11
|
+
__defNormalProp(a, prop, b[prop]);
|
|
12
|
+
if (__getOwnPropSymbols)
|
|
13
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
14
|
+
if (__propIsEnum.call(b, prop))
|
|
15
|
+
__defNormalProp(a, prop, b[prop]);
|
|
16
|
+
}
|
|
17
|
+
return a;
|
|
18
|
+
};
|
|
19
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
20
|
+
var __objRest = (source, exclude) => {
|
|
21
|
+
var target = {};
|
|
22
|
+
for (var prop in source)
|
|
23
|
+
if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
|
|
24
|
+
target[prop] = source[prop];
|
|
25
|
+
if (source != null && __getOwnPropSymbols)
|
|
26
|
+
for (var prop of __getOwnPropSymbols(source)) {
|
|
27
|
+
if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
|
|
28
|
+
target[prop] = source[prop];
|
|
29
|
+
}
|
|
30
|
+
return target;
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
// src/pluginScopeContext.tsx
|
|
34
|
+
import {
|
|
35
|
+
createContext,
|
|
36
|
+
useContext,
|
|
37
|
+
useMemo
|
|
38
|
+
} from "react";
|
|
39
|
+
import { jsx } from "react/jsx-runtime";
|
|
40
|
+
var PluginScopeContext = createContext(null);
|
|
41
|
+
var usePluginScope = () => useContext(PluginScopeContext);
|
|
42
|
+
var PluginScopeProvider = ({
|
|
43
|
+
pluginId,
|
|
44
|
+
pluginName,
|
|
45
|
+
pluginVersion,
|
|
46
|
+
children
|
|
47
|
+
}) => {
|
|
48
|
+
const value = useMemo(
|
|
49
|
+
() => ({ pluginId, pluginName, pluginVersion }),
|
|
50
|
+
[pluginId, pluginName, pluginVersion]
|
|
51
|
+
);
|
|
52
|
+
return /* @__PURE__ */ jsx(PluginScopeContext.Provider, { value, children });
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
// src/pluginContext.tsx
|
|
56
|
+
import {
|
|
57
|
+
createContext as createContext2,
|
|
58
|
+
useContext as useContext2,
|
|
59
|
+
useMemo as useMemo2,
|
|
60
|
+
useEffect,
|
|
61
|
+
useRef
|
|
62
|
+
} from "react";
|
|
63
|
+
import { getGlobalObject } from "@kodiak-finance/orderly-utils";
|
|
64
|
+
|
|
65
|
+
// src/apis/events.ts
|
|
66
|
+
import { SimpleDI } from "@kodiak-finance/orderly-core";
|
|
67
|
+
var NOOP_EVENTS = {
|
|
68
|
+
on: () => {
|
|
69
|
+
},
|
|
70
|
+
off: () => {
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
function createEventsFacade() {
|
|
74
|
+
const ee = SimpleDI.get("EE");
|
|
75
|
+
if (!ee) return NOOP_EVENTS;
|
|
76
|
+
return {
|
|
77
|
+
on: ee.on.bind(ee),
|
|
78
|
+
off: ee.off.bind(ee)
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// src/injectableTargetRegistry.ts
|
|
83
|
+
var REGISTERED_PATHS = /* @__PURE__ */ new Set();
|
|
84
|
+
function registerInjectableTarget(path) {
|
|
85
|
+
REGISTERED_PATHS.add(path);
|
|
86
|
+
}
|
|
87
|
+
function getRegisteredInjectableTargets() {
|
|
88
|
+
return Array.from(REGISTERED_PATHS);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// src/pluginRegistry.ts
|
|
92
|
+
var PLUGINS = [];
|
|
93
|
+
var OrderlyPluginRegistry = {
|
|
94
|
+
register(descriptor) {
|
|
95
|
+
PLUGINS.push(descriptor);
|
|
96
|
+
},
|
|
97
|
+
getPlugins() {
|
|
98
|
+
return [...PLUGINS];
|
|
99
|
+
},
|
|
100
|
+
clear() {
|
|
101
|
+
PLUGINS.length = 0;
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
var createOrderlySDK = () => ({
|
|
105
|
+
registerPlugin: (descriptor) => OrderlyPluginRegistry.register(descriptor)
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
// src/pluginContext.tsx
|
|
109
|
+
import { jsx as jsx2 } from "react/jsx-runtime";
|
|
110
|
+
var ORDERLY_INTERCEPTOR_TARGETS_REGISTRY_KEY = "__ORDERLY_INTERCEPTOR_TARGETS_REGISTRY__";
|
|
111
|
+
function collectTargetsFromPlugins(plugins) {
|
|
112
|
+
var _a;
|
|
113
|
+
const seen = /* @__PURE__ */ new Set();
|
|
114
|
+
const list = [];
|
|
115
|
+
for (const p of plugins) {
|
|
116
|
+
for (const i of (_a = p.interceptors) != null ? _a : []) {
|
|
117
|
+
if (i.target && !seen.has(i.target)) {
|
|
118
|
+
seen.add(i.target);
|
|
119
|
+
list.push({ path: i.target });
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return list;
|
|
124
|
+
}
|
|
125
|
+
function mergeInterceptorTargets(fromPlugins) {
|
|
126
|
+
const byPath = /* @__PURE__ */ new Map();
|
|
127
|
+
for (const t of fromPlugins) {
|
|
128
|
+
byPath.set(t.path, t);
|
|
129
|
+
}
|
|
130
|
+
for (const path of getRegisteredInjectableTargets()) {
|
|
131
|
+
if (!byPath.has(path)) {
|
|
132
|
+
byPath.set(path, { path });
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return Array.from(byPath.values());
|
|
136
|
+
}
|
|
137
|
+
var ExtensionContext = createContext2({});
|
|
138
|
+
var useExtensionContext = () => useContext2(ExtensionContext);
|
|
139
|
+
var ExtensionProvider = ({
|
|
140
|
+
children
|
|
141
|
+
}) => {
|
|
142
|
+
const memoizedValue = useMemo2(() => ({}), []);
|
|
143
|
+
return /* @__PURE__ */ jsx2(ExtensionContext.Provider, { value: memoizedValue, children });
|
|
144
|
+
};
|
|
145
|
+
var DEFAULT_PLUGIN_CONTEXT = {
|
|
146
|
+
plugins: [],
|
|
147
|
+
apiFacade: { events: NOOP_EVENTS },
|
|
148
|
+
interceptorTargets: []
|
|
149
|
+
};
|
|
150
|
+
var OrderlyPluginContext = createContext2(null);
|
|
151
|
+
var useOrderlyPluginContext = () => {
|
|
152
|
+
const context = useContext2(OrderlyPluginContext);
|
|
153
|
+
return context != null ? context : DEFAULT_PLUGIN_CONTEXT;
|
|
154
|
+
};
|
|
155
|
+
var useInterceptorTargets = () => {
|
|
156
|
+
const { interceptorTargets } = useOrderlyPluginContext();
|
|
157
|
+
return interceptorTargets;
|
|
158
|
+
};
|
|
159
|
+
var OrderlyPluginProvider = ({
|
|
160
|
+
plugins,
|
|
161
|
+
pluginState,
|
|
162
|
+
children
|
|
163
|
+
}) => {
|
|
164
|
+
const pluginsRef = useRef([]);
|
|
165
|
+
const resolvedPlugins = useMemo2(() => {
|
|
166
|
+
const collected = [];
|
|
167
|
+
const sdk = {
|
|
168
|
+
registerPlugin: (descriptor) => collected.push(descriptor)
|
|
169
|
+
};
|
|
170
|
+
plugins.forEach((p) => {
|
|
171
|
+
if (typeof p === "function") {
|
|
172
|
+
p(sdk, pluginState);
|
|
173
|
+
} else {
|
|
174
|
+
collected.push(p);
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
return [...collected, ...OrderlyPluginRegistry.getPlugins()];
|
|
178
|
+
}, [plugins, pluginState]);
|
|
179
|
+
const apiFacade = useMemo2(
|
|
180
|
+
() => ({ events: createEventsFacade() }),
|
|
181
|
+
[]
|
|
182
|
+
);
|
|
183
|
+
useEffect(() => {
|
|
184
|
+
resolvedPlugins.forEach((plugin) => {
|
|
185
|
+
if (typeof plugin.setup === "function") {
|
|
186
|
+
try {
|
|
187
|
+
plugin.setup(apiFacade);
|
|
188
|
+
} catch (e) {
|
|
189
|
+
console.error(`[Plugin ${plugin.id}] setup failed:`, e);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
}, [resolvedPlugins, apiFacade]);
|
|
194
|
+
pluginsRef.current = resolvedPlugins;
|
|
195
|
+
useEffect(() => {
|
|
196
|
+
const g = getGlobalObject();
|
|
197
|
+
g[ORDERLY_INTERCEPTOR_TARGETS_REGISTRY_KEY] = () => {
|
|
198
|
+
const fromPlugins = collectTargetsFromPlugins(pluginsRef.current);
|
|
199
|
+
return mergeInterceptorTargets(fromPlugins);
|
|
200
|
+
};
|
|
201
|
+
return () => {
|
|
202
|
+
delete getGlobalObject()[ORDERLY_INTERCEPTOR_TARGETS_REGISTRY_KEY];
|
|
203
|
+
};
|
|
204
|
+
}, []);
|
|
205
|
+
const interceptorTargets = useMemo2(
|
|
206
|
+
() => mergeInterceptorTargets(collectTargetsFromPlugins(resolvedPlugins)),
|
|
207
|
+
[resolvedPlugins]
|
|
208
|
+
);
|
|
209
|
+
const value = useMemo2(
|
|
210
|
+
() => ({ plugins: resolvedPlugins, apiFacade, interceptorTargets }),
|
|
211
|
+
[resolvedPlugins, apiFacade, interceptorTargets]
|
|
212
|
+
);
|
|
213
|
+
return /* @__PURE__ */ jsx2(OrderlyPluginContext.Provider, { value, children });
|
|
214
|
+
};
|
|
215
|
+
|
|
216
|
+
// src/install.tsx
|
|
217
|
+
import { createElement } from "react";
|
|
218
|
+
|
|
219
|
+
// src/types.ts
|
|
220
|
+
var ExtensionPositionEnum = /* @__PURE__ */ ((ExtensionPositionEnum2) => {
|
|
221
|
+
ExtensionPositionEnum2["DepositForm"] = "depositForm";
|
|
222
|
+
ExtensionPositionEnum2["WithdrawForm"] = "withdrawForm";
|
|
223
|
+
ExtensionPositionEnum2["AccountMenu"] = "accountMenu";
|
|
224
|
+
ExtensionPositionEnum2["MobileAccountMenu"] = "mobileAccountMenu";
|
|
225
|
+
ExtensionPositionEnum2["MainMenus"] = "mainMenus";
|
|
226
|
+
ExtensionPositionEnum2["EmptyDataIdentifier"] = "emptyDataIdentifier";
|
|
227
|
+
ExtensionPositionEnum2["EmptyDataState"] = "emptyDataIdentifier";
|
|
228
|
+
return ExtensionPositionEnum2;
|
|
229
|
+
})(ExtensionPositionEnum || {});
|
|
230
|
+
|
|
231
|
+
// src/pathMap.ts
|
|
232
|
+
var POSITION_TO_PATH = {
|
|
233
|
+
["depositForm" /* DepositForm */]: "Deposit.DepositForm",
|
|
234
|
+
["withdrawForm" /* WithdrawForm */]: "Deposit.WithdrawForm",
|
|
235
|
+
["accountMenu" /* AccountMenu */]: "Account.AccountMenu",
|
|
236
|
+
["mobileAccountMenu" /* MobileAccountMenu */]: "Account.MobileAccountMenu",
|
|
237
|
+
["mainMenus" /* MainMenus */]: "Layout.MainMenus",
|
|
238
|
+
["emptyDataIdentifier" /* EmptyDataIdentifier */]: "Table.EmptyDataIdentifier"
|
|
239
|
+
// EmptyDataState is alias for EmptyDataIdentifier (same enum value)
|
|
240
|
+
};
|
|
241
|
+
function positionToPath(position) {
|
|
242
|
+
var _a;
|
|
243
|
+
if (typeof position === "string" && position.includes(".")) {
|
|
244
|
+
return position;
|
|
245
|
+
}
|
|
246
|
+
return (_a = POSITION_TO_PATH[position]) != null ? _a : String(position);
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
// src/registry.ts
|
|
250
|
+
import { getGlobalObject as getGlobalObject2 } from "@kodiak-finance/orderly-utils";
|
|
251
|
+
var OrderlyExtensionRegistry = class _OrderlyExtensionRegistry {
|
|
252
|
+
constructor() {
|
|
253
|
+
this.extensionMap = /* @__PURE__ */ new Map();
|
|
254
|
+
}
|
|
255
|
+
static getInstance() {
|
|
256
|
+
const globalObject = getGlobalObject2();
|
|
257
|
+
if (!globalObject.__ORDERLY_EXTENSION_REGISTRY__) {
|
|
258
|
+
globalObject.__ORDERLY_EXTENSION_REGISTRY__ = new _OrderlyExtensionRegistry();
|
|
259
|
+
}
|
|
260
|
+
return globalObject.__ORDERLY_EXTENSION_REGISTRY__;
|
|
261
|
+
}
|
|
262
|
+
register(plugin) {
|
|
263
|
+
var _a;
|
|
264
|
+
for (let index = 0; index < plugin.positions.length; index++) {
|
|
265
|
+
if (typeof plugin.builder !== "function") {
|
|
266
|
+
const builder = (_a = this.extensionMap.get(plugin.positions[index])) == null ? void 0 : _a.builder;
|
|
267
|
+
plugin.builder = typeof builder === "undefined" ? void 0 : builder;
|
|
268
|
+
}
|
|
269
|
+
const pos = plugin.positions[index];
|
|
270
|
+
this.registerToPosition(pos, plugin);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
registerToPosition(position, plugin) {
|
|
274
|
+
if (this.extensionMap.has(position)) {
|
|
275
|
+
const existingPlugin = this.extensionMap.get(position);
|
|
276
|
+
if (!(existingPlugin == null ? void 0 : existingPlugin.__isInternal)) {
|
|
277
|
+
if (!(existingPlugin == null ? void 0 : existingPlugin.builder) && plugin.__isInternal && plugin.builder) {
|
|
278
|
+
this.setBuilder(position, plugin.builder);
|
|
279
|
+
}
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
if (!plugin.builder) {
|
|
283
|
+
plugin.builder = existingPlugin.builder;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
this.extensionMap.set(position, plugin);
|
|
287
|
+
}
|
|
288
|
+
setBuilder(position, builder) {
|
|
289
|
+
const plugin = this.extensionMap.get(position);
|
|
290
|
+
if (plugin) {
|
|
291
|
+
plugin.builder = builder;
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
getPluginsByPosition(position) {
|
|
295
|
+
return this.extensionMap.get(position);
|
|
296
|
+
}
|
|
297
|
+
};
|
|
298
|
+
|
|
299
|
+
// src/install.tsx
|
|
300
|
+
var installExtension = (options) => {
|
|
301
|
+
return (component) => {
|
|
302
|
+
const registry = OrderlyExtensionRegistry.getInstance();
|
|
303
|
+
registry.register({
|
|
304
|
+
name: options.name,
|
|
305
|
+
positions: options.positions,
|
|
306
|
+
__isInternal: !!options.__isInternal,
|
|
307
|
+
builder: options.builder,
|
|
308
|
+
render: component
|
|
309
|
+
});
|
|
310
|
+
const builder = options.builder;
|
|
311
|
+
OrderlyPluginRegistry.register({
|
|
312
|
+
id: options.name,
|
|
313
|
+
name: options.name,
|
|
314
|
+
interceptors: options.positions.map((position) => ({
|
|
315
|
+
target: positionToPath(position),
|
|
316
|
+
component: (Original, props, api) => {
|
|
317
|
+
const transformed = builder ? builder(props) : props;
|
|
318
|
+
return createElement(
|
|
319
|
+
component,
|
|
320
|
+
transformed
|
|
321
|
+
);
|
|
322
|
+
}
|
|
323
|
+
}))
|
|
324
|
+
});
|
|
325
|
+
};
|
|
326
|
+
};
|
|
327
|
+
var setExtensionBuilder = (position, builder) => {
|
|
328
|
+
const registry = OrderlyExtensionRegistry.getInstance();
|
|
329
|
+
registry.setBuilder(position, builder);
|
|
330
|
+
};
|
|
331
|
+
|
|
332
|
+
// src/PluginErrorBoundary.tsx
|
|
333
|
+
import { ErrorBoundary } from "react-error-boundary";
|
|
334
|
+
import { jsx as jsx3, jsxs } from "react/jsx-runtime";
|
|
335
|
+
var DEFAULT_FALLBACK = (pluginId) => /* @__PURE__ */ jsxs("div", { style: { color: "#ef4444", fontSize: "12px" }, children: [
|
|
336
|
+
"[Plugin ",
|
|
337
|
+
pluginId,
|
|
338
|
+
" error]"
|
|
339
|
+
] });
|
|
340
|
+
var PluginErrorBoundary = ({ children, fallback, pluginId, onError, onFallback }) => {
|
|
341
|
+
const resolvedFallback = fallback != null ? fallback : onFallback ? onFallback() : DEFAULT_FALLBACK(pluginId != null ? pluginId : "unknown");
|
|
342
|
+
return /* @__PURE__ */ jsx3(
|
|
343
|
+
ErrorBoundary,
|
|
344
|
+
{
|
|
345
|
+
fallback: resolvedFallback,
|
|
346
|
+
onError: (error) => onError == null ? void 0 : onError(error),
|
|
347
|
+
children
|
|
348
|
+
}
|
|
349
|
+
);
|
|
350
|
+
};
|
|
351
|
+
|
|
352
|
+
// src/notFound.tsx
|
|
353
|
+
import { jsx as jsx4, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
354
|
+
var NotFound = (props) => {
|
|
355
|
+
const { position } = props;
|
|
356
|
+
return /* @__PURE__ */ jsxs2("div", { style: { color: "#ef4444" }, children: [
|
|
357
|
+
/* @__PURE__ */ jsx4("strong", { children: `[${position}] ` }),
|
|
358
|
+
/* @__PURE__ */ jsx4("span", { children: "Not found!" })
|
|
359
|
+
] });
|
|
360
|
+
};
|
|
361
|
+
|
|
362
|
+
// src/useInjectedComponent.tsx
|
|
363
|
+
import { useMemo as useMemo3 } from "react";
|
|
364
|
+
import { jsx as jsx5 } from "react/jsx-runtime";
|
|
365
|
+
function useInjectedComponent(name, DefaultComponent) {
|
|
366
|
+
const { plugins, apiFacade } = useOrderlyPluginContext();
|
|
367
|
+
return useMemo3(() => {
|
|
368
|
+
const interceptorsWithPlugin = plugins.flatMap(
|
|
369
|
+
(p) => {
|
|
370
|
+
var _a;
|
|
371
|
+
return ((_a = p.interceptors) != null ? _a : []).filter((i) => i.target === name).map((i) => __spreadProps(__spreadValues({}, i), {
|
|
372
|
+
pluginId: p.id,
|
|
373
|
+
pluginName: p.name,
|
|
374
|
+
pluginVersion: p.version,
|
|
375
|
+
onError: p.onError,
|
|
376
|
+
onFallback: p.onFallback
|
|
377
|
+
}));
|
|
378
|
+
}
|
|
379
|
+
);
|
|
380
|
+
if (interceptorsWithPlugin.length === 0) {
|
|
381
|
+
return DefaultComponent;
|
|
382
|
+
}
|
|
383
|
+
let CurrentRender = (props) => /* @__PURE__ */ jsx5(DefaultComponent, __spreadValues({}, props));
|
|
384
|
+
interceptorsWithPlugin.forEach((interceptor) => {
|
|
385
|
+
const {
|
|
386
|
+
pluginId,
|
|
387
|
+
pluginName,
|
|
388
|
+
pluginVersion,
|
|
389
|
+
component,
|
|
390
|
+
onError,
|
|
391
|
+
onFallback
|
|
392
|
+
} = interceptor;
|
|
393
|
+
const PreviousRender = CurrentRender;
|
|
394
|
+
CurrentRender = (props) => /* @__PURE__ */ jsx5(
|
|
395
|
+
PluginScopeProvider,
|
|
396
|
+
{
|
|
397
|
+
pluginId,
|
|
398
|
+
pluginName,
|
|
399
|
+
pluginVersion,
|
|
400
|
+
children: /* @__PURE__ */ jsx5(
|
|
401
|
+
PluginErrorBoundary,
|
|
402
|
+
{
|
|
403
|
+
pluginId,
|
|
404
|
+
onError,
|
|
405
|
+
onFallback,
|
|
406
|
+
children: component(
|
|
407
|
+
PreviousRender,
|
|
408
|
+
props,
|
|
409
|
+
apiFacade
|
|
410
|
+
)
|
|
411
|
+
}
|
|
412
|
+
)
|
|
413
|
+
}
|
|
414
|
+
);
|
|
415
|
+
});
|
|
416
|
+
return CurrentRender;
|
|
417
|
+
}, [plugins, apiFacade, name, DefaultComponent]);
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
// src/slot.tsx
|
|
421
|
+
import { jsx as jsx6 } from "react/jsx-runtime";
|
|
422
|
+
var ExtensionSlot = (props) => {
|
|
423
|
+
const _a = props, { position, defaultWidget: defaultValue } = _a, rest = __objRest(_a, ["position", "defaultWidget"]);
|
|
424
|
+
const path = positionToPath(position);
|
|
425
|
+
const DefaultComponent = defaultValue != null ? defaultValue : (() => /* @__PURE__ */ jsx6(NotFound, { position: String(position) }));
|
|
426
|
+
const Injected = useInjectedComponent(path, DefaultComponent);
|
|
427
|
+
return /* @__PURE__ */ jsx6(PluginErrorBoundary, { pluginId: path, children: /* @__PURE__ */ jsx6(Injected, __spreadValues({}, rest)) });
|
|
428
|
+
};
|
|
429
|
+
|
|
430
|
+
// src/injectable.tsx
|
|
431
|
+
import { jsx as jsx7 } from "react/jsx-runtime";
|
|
432
|
+
function injectable(Component, name) {
|
|
433
|
+
registerInjectableTarget(name);
|
|
434
|
+
const InjectableComponent = (props) => {
|
|
435
|
+
const Injected = useInjectedComponent(name, Component);
|
|
436
|
+
return /* @__PURE__ */ jsx7(Injected, __spreadValues({}, props));
|
|
437
|
+
};
|
|
438
|
+
InjectableComponent.displayName = `injectable(${name})`;
|
|
439
|
+
return InjectableComponent;
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
// src/createInterceptor.ts
|
|
443
|
+
function createInterceptor(target, component) {
|
|
444
|
+
return { target, component };
|
|
445
|
+
}
|
|
446
|
+
export {
|
|
447
|
+
ExtensionPositionEnum,
|
|
448
|
+
ExtensionProvider,
|
|
449
|
+
ExtensionSlot,
|
|
450
|
+
OrderlyExtensionRegistry,
|
|
451
|
+
OrderlyPluginProvider,
|
|
452
|
+
OrderlyPluginRegistry,
|
|
453
|
+
PluginErrorBoundary,
|
|
454
|
+
PluginScopeContext,
|
|
455
|
+
PluginScopeProvider,
|
|
456
|
+
createEventsFacade,
|
|
457
|
+
createInterceptor,
|
|
458
|
+
createOrderlySDK,
|
|
459
|
+
injectable,
|
|
460
|
+
installExtension,
|
|
461
|
+
positionToPath,
|
|
462
|
+
setExtensionBuilder,
|
|
463
|
+
useExtensionContext,
|
|
464
|
+
useInjectedComponent,
|
|
465
|
+
useInterceptorTargets,
|
|
466
|
+
useOrderlyPluginContext,
|
|
467
|
+
usePluginScope
|
|
468
|
+
};
|
|
469
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/pluginScopeContext.tsx","../src/pluginContext.tsx","../src/apis/events.ts","../src/injectableTargetRegistry.ts","../src/pluginRegistry.ts","../src/install.tsx","../src/types.ts","../src/pathMap.ts","../src/registry.ts","../src/PluginErrorBoundary.tsx","../src/notFound.tsx","../src/useInjectedComponent.tsx","../src/slot.tsx","../src/injectable.tsx","../src/createInterceptor.ts"],"sourcesContent":["import React, {\n createContext,\n useContext,\n useMemo,\n type FC,\n type PropsWithChildren,\n} from \"react\";\n\n/**\n * Plugin scope value: identifies the current plugin for API request attribution.\n * When useQuery etc. run inside PluginScopeProvider, they add X-Orderly-Plugin-Id header.\n */\nexport interface PluginScopeValue {\n pluginId: string;\n pluginName?: string;\n pluginVersion?: string;\n}\n\nexport const PluginScopeContext = createContext<PluginScopeValue | null>(null);\n\nexport const usePluginScope = (): PluginScopeValue | null =>\n useContext(PluginScopeContext);\n\nexport interface PluginScopeProviderProps\n extends PropsWithChildren, PluginScopeValue {}\n\n/**\n * Wraps plugin output so useQuery/useMutation etc. can inject X-Orderly-Plugin-Id header.\n */\nexport const PluginScopeProvider: FC<PluginScopeProviderProps> = ({\n pluginId,\n pluginName,\n pluginVersion,\n children,\n}) => {\n const value = useMemo<PluginScopeValue>(\n () => ({ pluginId, pluginName, pluginVersion }),\n [pluginId, pluginName, pluginVersion],\n );\n return (\n <PluginScopeContext.Provider value={value}>\n {children}\n </PluginScopeContext.Provider>\n );\n};\n","import React, {\n createContext,\n useContext,\n useMemo,\n useEffect,\n useRef,\n type FC,\n type PropsWithChildren,\n} from \"react\";\nimport { getGlobalObject } from \"@kodiak-finance/orderly-utils\";\nimport { createEventsFacade, NOOP_EVENTS } from \"./apis/events\";\nimport { getRegisteredInjectableTargets } from \"./injectableTargetRegistry\";\nimport { OrderlyPluginRegistry } from \"./pluginRegistry\";\nimport type {\n ApplicationState,\n InterceptorTargetDescriptor,\n OrderlyPlugin,\n OrderlyPluginAPI,\n PluginRegistrationFn,\n} from \"./types\";\n\n/** Global key for interceptor targets getter (same style as __ORDERLY_EXTENSION_REGISTRY__) */\nconst ORDERLY_INTERCEPTOR_TARGETS_REGISTRY_KEY =\n \"__ORDERLY_INTERCEPTOR_TARGETS_REGISTRY__\" as const;\n\n/** Collects unique interceptor targets from plugins (targets that have at least one interceptor). */\nfunction collectTargetsFromPlugins(\n plugins: OrderlyPlugin[],\n): InterceptorTargetDescriptor[] {\n const seen = new Set<string>();\n const list: InterceptorTargetDescriptor[] = [];\n for (const p of plugins) {\n for (const i of p.interceptors ?? []) {\n if (i.target && !seen.has(i.target)) {\n seen.add(i.target);\n list.push({ path: i.target });\n }\n }\n }\n return list;\n}\n\n/** Merges plugin interceptor targets with statically registered injectable paths (unique by path). */\nfunction mergeInterceptorTargets(\n fromPlugins: InterceptorTargetDescriptor[],\n): InterceptorTargetDescriptor[] {\n const byPath = new Map<string, InterceptorTargetDescriptor>();\n for (const t of fromPlugins) {\n byPath.set(t.path, t);\n }\n for (const path of getRegisteredInjectableTargets()) {\n if (!byPath.has(path)) {\n byPath.set(path, { path });\n }\n }\n return Array.from(byPath.values());\n}\n\nexport type ExtensionContextState = Record<string, never>;\n\nexport const ExtensionContext = createContext<ExtensionContextState>({});\n\nexport const useExtensionContext = () =>\n useContext<ExtensionContextState>(ExtensionContext);\n\nexport const ExtensionProvider: React.FC<React.PropsWithChildren> = ({\n children,\n}) => {\n const memoizedValue = useMemo<ExtensionContextState>(() => ({}), []);\n return (\n <ExtensionContext.Provider value={memoizedValue}>\n {children}\n </ExtensionContext.Provider>\n );\n};\n\nexport interface OrderlyPluginContextValue {\n plugins: OrderlyPlugin[];\n apiFacade: OrderlyPluginAPI;\n /** List of interceptable targets (when provided by host); used for window registry and optional useInterceptorTargets */\n interceptorTargets: InterceptorTargetDescriptor[];\n}\n\nconst DEFAULT_PLUGIN_CONTEXT: OrderlyPluginContextValue = {\n plugins: [],\n apiFacade: { events: NOOP_EVENTS },\n interceptorTargets: [],\n};\n\nexport const OrderlyPluginContext =\n createContext<OrderlyPluginContextValue | null>(null);\n\nexport const useOrderlyPluginContext = (): OrderlyPluginContextValue => {\n const context = useContext(OrderlyPluginContext);\n return context ?? DEFAULT_PLUGIN_CONTEXT;\n};\n\n/** Returns the list of interceptable targets when provided via OrderlyPluginProvider (e.g. for in-app dev panel). */\nexport const useInterceptorTargets = (): InterceptorTargetDescriptor[] => {\n const { interceptorTargets } = useOrderlyPluginContext();\n return interceptorTargets;\n};\n\nexport interface OrderlyPluginProviderProps extends PropsWithChildren {\n plugins: (OrderlyPlugin | PluginRegistrationFn)[];\n /** Optional state passed to plugin registration fns (e.g. AppState) */\n pluginState?: ApplicationState;\n}\n\nexport const OrderlyPluginProvider: FC<OrderlyPluginProviderProps> = ({\n plugins,\n pluginState,\n children,\n}) => {\n const pluginsRef = useRef<OrderlyPlugin[]>([]);\n\n const resolvedPlugins = useMemo(() => {\n const collected: OrderlyPlugin[] = [];\n const sdk = {\n registerPlugin: (descriptor: OrderlyPlugin) => collected.push(descriptor),\n };\n plugins.forEach((p) => {\n if (typeof p === \"function\") {\n p(sdk, pluginState);\n } else {\n collected.push(p);\n }\n });\n return [...collected, ...OrderlyPluginRegistry.getPlugins()];\n }, [plugins, pluginState]);\n\n const apiFacade = useMemo<OrderlyPluginAPI>(\n () => ({ events: createEventsFacade() }),\n [],\n );\n\n useEffect(() => {\n resolvedPlugins.forEach((plugin) => {\n if (typeof plugin.setup === \"function\") {\n try {\n plugin.setup(apiFacade);\n } catch (e) {\n console.error(`[Plugin ${plugin.id}] setup failed:`, e);\n }\n }\n });\n }, [resolvedPlugins, apiFacade]);\n\n pluginsRef.current = resolvedPlugins;\n\n // Lazy: only when user calls window.__ORDERLY_INTERCEPTOR_TARGETS_REGISTRY__() we collect targets from current plugins\n useEffect(() => {\n const g = getGlobalObject() as Record<string, unknown>;\n g[ORDERLY_INTERCEPTOR_TARGETS_REGISTRY_KEY] = () => {\n const fromPlugins = collectTargetsFromPlugins(pluginsRef.current);\n return mergeInterceptorTargets(fromPlugins);\n };\n return () => {\n delete (getGlobalObject() as Record<string, unknown>)[\n ORDERLY_INTERCEPTOR_TARGETS_REGISTRY_KEY\n ];\n };\n }, []);\n\n const interceptorTargets = useMemo(\n () => mergeInterceptorTargets(collectTargetsFromPlugins(resolvedPlugins)),\n [resolvedPlugins],\n );\n const value = useMemo<OrderlyPluginContextValue>(\n () => ({ plugins: resolvedPlugins, apiFacade, interceptorTargets }),\n [resolvedPlugins, apiFacade, interceptorTargets],\n );\n\n return (\n <OrderlyPluginContext.Provider value={value}>\n {children}\n </OrderlyPluginContext.Provider>\n );\n};\n","/**\n * Plugin events API - subscribable events from global EventEmitter (SimpleDI \"EE\").\n * Only supports TrackerEventName (track events) from @kodiak-finance/orderly-types.\n */\nimport { EventEmitter, SimpleDI } from \"@kodiak-finance/orderly-core\";\nimport type { TrackerEventName } from \"@kodiak-finance/orderly-types\";\n\n/**\n * Plugin events API interface.\n * Forwards to global EventEmitter (SimpleDI \"EE\") used by useTrack and useEventEmitter.\n */\nexport interface PluginEventsAPI {\n on(event: TrackerEventName, handler: (data: unknown) => void): void;\n off(event: TrackerEventName, handler: (data: unknown) => void): void;\n}\n\n/** Noop stub when EE is not yet available (e.g. before app bootstrap) */\nexport const NOOP_EVENTS: PluginEventsAPI = {\n on: () => {},\n off: () => {},\n};\n\n/**\n * Creates the events facade wired to the global EventEmitter (SimpleDI \"EE\").\n * Returns a noop stub if EE has not been initialized yet.\n */\nexport function createEventsFacade(): PluginEventsAPI {\n const ee = SimpleDI.get<EventEmitter>(\"EE\");\n if (!ee) return NOOP_EVENTS;\n return {\n on: ee.on.bind(ee),\n off: ee.off.bind(ee),\n };\n}\n","/**\n * Static registry of injectable target paths. Used so that __ORDERLY_INTERCEPTOR_TARGETS_REGISTRY__\n * and useInterceptorTargets can list all interceptable slots (injectables) as well as plugin interceptors.\n * Module-level Set only; no React, no subscriptions — zero performance impact.\n */\n\nconst REGISTERED_PATHS = new Set<string>();\n\n/**\n * Registers an injectable target path. Called from injectable() at component definition time (module load).\n * O(1); does not run in render path.\n */\nexport function registerInjectableTarget(path: string): void {\n REGISTERED_PATHS.add(path);\n}\n\n/**\n * Returns a snapshot of all paths registered via registerInjectableTarget.\n * Path count is typically small; no caching needed.\n */\nexport function getRegisteredInjectableTargets(): string[] {\n return Array.from(REGISTERED_PATHS);\n}\n","import type { OrderlyPlugin, OrderlySDK } from \"./types\";\n\n/**\n * Global plugin registry for installExtension adapter and SDK.registerPlugin.\n * OrderlyPluginProvider merges plugins from props with this registry.\n */\nconst PLUGINS: OrderlyPlugin[] = [];\n\nexport const OrderlyPluginRegistry = {\n register(descriptor: OrderlyPlugin): void {\n PLUGINS.push(descriptor);\n },\n getPlugins(): OrderlyPlugin[] {\n return [...PLUGINS];\n },\n clear(): void {\n PLUGINS.length = 0;\n },\n};\n\n/** SDK instance for plugin registration (used by registration fns) */\nexport const createOrderlySDK = (): OrderlySDK => ({\n registerPlugin: (descriptor) => OrderlyPluginRegistry.register(descriptor),\n});\n","import React, { ElementType, ReactElement, createElement } from \"react\";\nimport { positionToPath } from \"./pathMap\";\nimport { OrderlyPluginRegistry } from \"./pluginRegistry\";\nimport { OrderlyExtensionRegistry } from \"./registry\";\nimport { ExtensionPosition } from \"./types\";\n\n/** @deprecated Use OrderlyPlugin with interceptors instead */\nexport type ExtensionOptions<Props> = {\n name: string;\n scope?: string[];\n engines?: string;\n positions: ExtensionPosition[];\n builder?: (props: any) => Props;\n __isInternal?: boolean;\n entry?: string[];\n installed?: () => Promise<void>;\n onInit?: () => void;\n activate?: () => Promise<void>;\n deactivate?: () => Promise<void>;\n};\n\ntype ExtensionRenderComponentType<Props> =\n | ElementType<Props>\n | ((props: Props) => ReactElement);\n\n/**\n * Registers an extension. Registers to both legacy registry and new plugin registry.\n * @deprecated Prefer registerPlugin via OrderlyPluginProvider plugins prop\n */\nexport const installExtension = <Props extends object>(\n options: ExtensionOptions<Props>,\n): ((component: ExtensionRenderComponentType<Props>) => void) => {\n return (component) => {\n const registry = OrderlyExtensionRegistry.getInstance();\n registry.register<Props>({\n name: options.name,\n positions: options.positions,\n __isInternal: !!options.__isInternal,\n builder: options.builder,\n render: component,\n });\n\n const builder = options.builder;\n OrderlyPluginRegistry.register({\n id: options.name,\n name: options.name,\n interceptors: options.positions.map((position) => ({\n target: positionToPath(position),\n component: (Original, props, api) => {\n const transformed = builder ? builder(props) : props;\n return createElement(\n component as React.ComponentType<any>,\n transformed,\n );\n },\n })),\n });\n };\n};\n\n/**\n * @deprecated Prefer registerPlugin via OrderlyPluginProvider plugins prop\n */\nexport const setExtensionBuilder = <\n Props extends object = Record<string, unknown>,\n>(\n position: ExtensionPosition,\n builder: () => Props,\n) => {\n const registry = OrderlyExtensionRegistry.getInstance();\n registry.setBuilder(position, builder);\n};\n","import { ElementType, ReactElement, ReactNode } from \"react\";\nimport { NetworkId } from \"@kodiak-finance/orderly-types\";\nimport type { PluginEventsAPI } from \"./apis/events\";\n\n/* ========== New Plugin System (path-based interceptor) ========== */\n\n/** API Facade for plugins (placeholder, extend later) */\nexport interface OrderlyPluginAPI {\n data?: Record<string, unknown>;\n actions?: Record<string, unknown>;\n utils?: Record<string, unknown>;\n /** Event subscription - forwards to global EventEmitter (SimpleDI \"EE\") */\n events: PluginEventsAPI;\n}\n\n/**\n * Mapping from interceptor target path to component props type.\n * Extend via module augmentation in UI packages (e.g. @orderly.network/trading)\n * to enable typed props in createInterceptor(target, (Original, props, api) => ...).\n * No index signature so that augmented entries keep their exact prop types.\n */\nexport interface InterceptorTargetPropsMap {}\n\n/** Union of known interceptor target paths (keys of InterceptorTargetPropsMap) */\nexport type KnownInterceptorTarget = keyof InterceptorTargetPropsMap;\n\n/**\n * Descriptor for one interceptable target (path + optional props type name for docs).\n * Returned lazily by window.__ORDERLY_INTERCEPTOR_TARGETS_REGISTRY__() when called.\n */\nexport interface InterceptorTargetDescriptor {\n path: string;\n /** Props type name (e.g. 'DepositFormProps') for documentation / Inspector */\n propsType?: string;\n description?: string;\n}\n\ndeclare global {\n interface Window {\n /** Lazy getter: when called, collects supported targets from current plugins' interceptors. Set by OrderlyPluginProvider. Same style as __ORDERLY_EXTENSION_REGISTRY__. */\n __ORDERLY_INTERCEPTOR_TARGETS_REGISTRY__?: () => InterceptorTargetDescriptor[];\n }\n}\n\n/**\n * Interceptor component signature: (Original, props, api) => ReactNode.\n * Use generic TProps to get typed props when targeting a known path.\n */\nexport type PluginInterceptorComponent<\n TProps extends object = Record<string, unknown>,\n> = (\n Original: React.ComponentType<TProps>,\n props: TProps,\n api: OrderlyPluginAPI,\n) => ReactNode;\n\n/** Single interceptor targeting a component path. TProps defaults to Record<string, unknown> for backward compat. */\nexport interface PluginInterceptor<\n TProps extends object = Record<string, unknown>,\n> {\n target: string;\n component: PluginInterceptorComponent<TProps>;\n}\n\n/** Plugin descriptor (per GUIDE.md) */\nexport interface OrderlyPlugin {\n id: string;\n name?: string;\n version?: string;\n orderlyVersion?: string;\n /** Interceptors targeting component paths (e.g. Trading.OrderEntry.SubmitButton). Uses array of any to accept interceptors whose props are augmented (and may not have index signature required by Record<string, unknown>). */\n interceptors?: Array<PluginInterceptor<any>>;\n setup?: (api: OrderlyPluginAPI) => void;\n onInitialize?: () => void;\n onInstall?: () => void | Promise<void>;\n onError?: (error: Error) => void;\n onFallback?: () => ReactNode | ReactElement;\n}\n\n/** SDK instance passed to plugin registration fn */\nexport interface OrderlySDK {\n registerPlugin: (descriptor: OrderlyPlugin) => void;\n}\n\ntype Logo = {\n // the logo image url\n img?: string;\n // also can use React component\n component?: ReactNode;\n className?: string;\n};\n\nexport type AppLogos = Partial<{\n // logo for top navigation bar\n main: Logo;\n // logo for popover/dialog header\n secondary: Logo;\n}>;\n\nexport interface ApplicationState {\n config: {\n appIcons?: AppLogos;\n brokerName: string;\n dateFormatting?: string;\n };\n networkId: NetworkId;\n}\n\n/** Plugin registration function: (SDK, state?) => void; calls SDK.registerPlugin internally */\nexport type PluginRegistrationFn<TState = ApplicationState> = (\n SDK: OrderlySDK,\n state?: TState,\n) => void;\n\n/* ========== Legacy Extension System (position-based) ========== */\n\n/** @deprecated Use PluginInterceptor with path-based target instead */\nexport type ExtensionBuilder<Props = Record<string, unknown>> = (\n props?: Partial<Props> & Record<string, unknown>,\n) => Props;\n\n/** @deprecated Use path strings (e.g. 'Deposit.DepositForm') instead */\nexport type ExtensionPosition = ExtensionPositionEnum | string;\n\n/** @deprecated Use OrderlyPlugin with interceptors instead */\nexport interface Extension<Props extends object = object> {\n __isInternal: boolean;\n name: string;\n positions: ExtensionPosition[];\n initialize?: () => void;\n builder?: ExtensionBuilder<Props>;\n render: ElementType<Props> | ((props: Props) => ReactElement);\n}\n\n/** @deprecated Use path strings (e.g. 'Deposit.DepositForm') instead */\nexport enum ExtensionPositionEnum {\n DepositForm = \"depositForm\",\n WithdrawForm = \"withdrawForm\",\n AccountMenu = \"accountMenu\",\n MobileAccountMenu = \"mobileAccountMenu\",\n MainMenus = \"mainMenus\",\n EmptyDataIdentifier = \"emptyDataIdentifier\",\n /** @deprecated Use EmptyDataIdentifier - same value for backward compatibility */\n // eslint-disable-next-line @typescript-eslint/no-duplicate-enum-values -- intentional alias for backward compat\n EmptyDataState = \"emptyDataIdentifier\",\n}\n","import { ExtensionPosition, ExtensionPositionEnum } from \"./types\";\n\nconst POSITION_TO_PATH: Record<string, string> = {\n [ExtensionPositionEnum.DepositForm]: \"Deposit.DepositForm\",\n [ExtensionPositionEnum.WithdrawForm]: \"Deposit.WithdrawForm\",\n [ExtensionPositionEnum.AccountMenu]: \"Account.AccountMenu\",\n [ExtensionPositionEnum.MobileAccountMenu]: \"Account.MobileAccountMenu\",\n [ExtensionPositionEnum.MainMenus]: \"Layout.MainMenus\",\n [ExtensionPositionEnum.EmptyDataIdentifier]: \"Table.EmptyDataIdentifier\",\n // EmptyDataState is alias for EmptyDataIdentifier (same enum value)\n};\n\n/**\n * Converts ExtensionPosition to interceptor path.\n * @deprecated Use path strings directly (e.g. 'Deposit.DepositForm') instead of ExtensionPosition\n */\nexport function positionToPath(position: ExtensionPosition): string {\n if (typeof position === \"string\" && position.includes(\".\")) {\n return position;\n }\n return POSITION_TO_PATH[position] ?? String(position);\n}\n","import { getGlobalObject } from \"@kodiak-finance/orderly-utils\";\nimport { Extension, ExtensionBuilder, ExtensionPosition } from \"./types\";\n\n/**\n * Legacy extension registry (position-based, for installExtension backward compat).\n * @deprecated Use registerPlugin via OrderlyPluginProvider plugins prop instead\n */\nexport class OrderlyExtensionRegistry {\n static getInstance(): OrderlyExtensionRegistry {\n const globalObject = getGlobalObject();\n if (!(globalObject as any).__ORDERLY_EXTENSION_REGISTRY__) {\n (globalObject as any).__ORDERLY_EXTENSION_REGISTRY__ =\n new OrderlyExtensionRegistry();\n }\n return (globalObject as any).__ORDERLY_EXTENSION_REGISTRY__;\n }\n\n private extensionMap: Map<\n ExtensionPosition,\n Extension<Record<string, unknown>>\n > = new Map();\n\n register<Props extends object>(\n plugin: Omit<Extension<Props>, \"builder\"> & {\n builder?: (props: any) => Props;\n },\n ) {\n for (let index = 0; index < plugin.positions.length; index++) {\n if (typeof plugin.builder !== \"function\") {\n const builder = this.extensionMap.get(plugin.positions[index])?.builder;\n plugin.builder =\n typeof builder === \"undefined\"\n ? undefined\n : (builder as (props?: any) => Props);\n }\n const pos = plugin.positions[index];\n this.registerToPosition<Props>(pos, plugin as Extension<Props>);\n }\n }\n\n private registerToPosition<Props extends object>(\n position: ExtensionPosition,\n plugin: Extension<Props>,\n ) {\n if (this.extensionMap.has(position)) {\n const existingPlugin = this.extensionMap.get(position);\n if (!existingPlugin?.__isInternal) {\n if (!existingPlugin?.builder && plugin.__isInternal && plugin.builder) {\n this.setBuilder(position, plugin.builder);\n }\n return;\n }\n if (!plugin.builder) {\n plugin.builder = existingPlugin.builder as ExtensionBuilder<Props>;\n }\n }\n this.extensionMap.set(position, plugin as Extension<any>);\n }\n\n setBuilder<Props extends object>(\n position: ExtensionPosition,\n builder: ExtensionBuilder<Props>,\n ) {\n const plugin = this.extensionMap.get(position);\n if (plugin) {\n plugin.builder = builder as ExtensionBuilder<Record<string, unknown>>;\n }\n }\n\n getPluginsByPosition(position: ExtensionPosition) {\n return this.extensionMap.get(position);\n }\n}\n","import React, { type ReactNode } from \"react\";\nimport { ErrorBoundary } from \"react-error-boundary\";\n\n/** Default fallback when plugin has no onFallback */\nconst DEFAULT_FALLBACK = (pluginId: string) => (\n <div style={{ color: \"#ef4444\", fontSize: \"12px\" }}>\n [Plugin {pluginId} error]\n </div>\n);\n\n/**\n * Error boundary for plugin interceptors.\n * Prevents a single plugin crash from taking down the whole page.\n * Uses plugin's onError/onFallback when provided, else SDK defaults.\n */\nexport const PluginErrorBoundary: React.FC<{\n children: ReactNode;\n /** Override fallback (legacy); prefer onFallback from plugin */\n fallback?: ReactNode;\n pluginId?: string;\n /** Plugin's error handler; called when error is caught */\n onError?: (error: Error) => void;\n /** Plugin's fallback renderer; used when error is caught */\n onFallback?: () => ReactNode;\n}> = ({ children, fallback, pluginId, onError, onFallback }) => {\n const resolvedFallback =\n fallback ??\n (onFallback ? onFallback() : DEFAULT_FALLBACK(pluginId ?? \"unknown\"));\n\n return (\n <ErrorBoundary\n fallback={resolvedFallback}\n onError={(error) => onError?.(error)}\n >\n {children}\n </ErrorBoundary>\n );\n};\n","import { FC } from \"react\";\n\nexport const NotFound: FC<{ position: string }> = (props) => {\n const { position } = props;\n return (\n <div style={{ color: \"#ef4444\" }}>\n <strong>{`[${position}] `}</strong>\n <span>Not found!</span>\n </div>\n );\n};\n","import React, { useMemo, type ComponentType } from \"react\";\nimport { PluginErrorBoundary } from \"./PluginErrorBoundary\";\nimport { useOrderlyPluginContext } from \"./pluginContext\";\nimport { PluginScopeProvider } from \"./pluginScopeContext\";\n\n/**\n * Returns a component that chains all interceptors for the given path (onion model).\n * Each interceptor is wrapped in PluginErrorBoundary; plugin's onError/onFallback\n * are used when provided, else SDK defaults.\n */\nexport function useInjectedComponent<P extends object>(\n name: string,\n DefaultComponent: ComponentType<P>,\n): ComponentType<P> {\n const { plugins, apiFacade } = useOrderlyPluginContext();\n\n return useMemo(() => {\n const interceptorsWithPlugin = plugins.flatMap((p) =>\n (p.interceptors ?? [])\n .filter((i) => i.target === name)\n .map((i) => ({\n ...i,\n pluginId: p.id,\n pluginName: p.name,\n pluginVersion: p.version,\n onError: p.onError,\n onFallback: p.onFallback,\n })),\n );\n\n if (interceptorsWithPlugin.length === 0) {\n return DefaultComponent;\n }\n\n let CurrentRender: ComponentType<P> = (props: P) => (\n <DefaultComponent {...props} />\n );\n\n interceptorsWithPlugin.forEach((interceptor) => {\n const {\n pluginId,\n pluginName,\n pluginVersion,\n component,\n onError,\n onFallback,\n } = interceptor;\n const PreviousRender = CurrentRender;\n CurrentRender = (props: P) => (\n <PluginScopeProvider\n pluginId={pluginId}\n pluginName={pluginName}\n pluginVersion={pluginVersion}\n >\n <PluginErrorBoundary\n pluginId={pluginId}\n onError={onError}\n onFallback={onFallback}\n >\n {component(\n PreviousRender as React.ComponentType<Record<string, unknown>>,\n props as Record<string, unknown>,\n apiFacade,\n )}\n </PluginErrorBoundary>\n </PluginScopeProvider>\n );\n });\n\n return CurrentRender;\n }, [plugins, apiFacade, name, DefaultComponent]);\n}\n","import React from \"react\";\nimport { PluginErrorBoundary } from \"./PluginErrorBoundary\";\nimport { NotFound } from \"./notFound\";\nimport { positionToPath } from \"./pathMap\";\nimport { ExtensionPosition } from \"./types\";\nimport { useInjectedComponent } from \"./useInjectedComponent\";\n\ninterface SlotProps {\n position: ExtensionPosition;\n defaultWidget?: React.ComponentType<any>;\n scope?: string[];\n [key: string]: any;\n}\n\n/**\n * Renders the component for the given position, resolving interceptors via useInjectedComponent.\n * Requires OrderlyPluginProvider in the tree (can have plugins=[]).\n * @deprecated Prefer useInjectedComponent with path string directly (e.g. 'Deposit.DepositForm')\n */\nexport const ExtensionSlot: React.FC<SlotProps> = (props) => {\n const { position, defaultWidget: defaultValue, ...rest } = props;\n const path = positionToPath(position);\n const DefaultComponent =\n defaultValue ?? (() => <NotFound position={String(position)} />);\n const Injected = useInjectedComponent(path, DefaultComponent);\n\n return (\n <PluginErrorBoundary pluginId={path}>\n <Injected {...rest} />\n </PluginErrorBoundary>\n );\n};\n","import { type ComponentType } from \"react\";\nimport { registerInjectableTarget } from \"./injectableTargetRegistry\";\nimport { useInjectedComponent } from \"./useInjectedComponent\";\n\n/**\n * HOC: wraps a component to make it interceptable by plugins.\n * Registers the target path in a static registry so it appears in interceptor target lists.\n */\nexport function injectable<P extends object>(\n Component: ComponentType<P>,\n name: string,\n): ComponentType<P> {\n registerInjectableTarget(name);\n const InjectableComponent = (props: P) => {\n const Injected = useInjectedComponent(name, Component);\n return <Injected {...props} />;\n };\n InjectableComponent.displayName = `injectable(${name})`;\n return InjectableComponent;\n}\n","import type {\n InterceptorTargetPropsMap,\n KnownInterceptorTarget,\n PluginInterceptor,\n PluginInterceptorComponent,\n} from \"./types\";\n\n/**\n * String-target overload: use when `@orderly.network/plugin-core` is the only dependency and\n * `InterceptorTargetPropsMap` is empty (ambient augmentation from UI packages not loaded).\n * Avoids DTS failures where keyof an empty map is `never`.\n */\nexport function createInterceptor(\n target: string,\n component: PluginInterceptorComponent<Record<string, unknown>>,\n): PluginInterceptor<Record<string, unknown>>;\n/** Typed overload when workspace packages augment `InterceptorTargetPropsMap`. */\nexport function createInterceptor<T extends KnownInterceptorTarget>(\n target: T,\n component: PluginInterceptorComponent<InterceptorTargetPropsMap[T]>,\n): PluginInterceptor<InterceptorTargetPropsMap[T]>;\nexport function createInterceptor(\n target: string,\n component: PluginInterceptorComponent<Record<string, unknown>>,\n): PluginInterceptor<Record<string, unknown>> {\n return { target, component };\n}\n"],"mappings":"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","names":["createContext","useContext","useMemo","jsx","createContext","useContext","useMemo","ExtensionPositionEnum","getGlobalObject","jsx","jsx","jsxs","useMemo","jsx","useMemo","jsx","jsx"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@kodiak-finance/orderly-plugin-core",
|
|
3
|
+
"version": "2.9.2-alpha.0",
|
|
4
|
+
"description": "Orderly SDK plugin system - interceptors, registry, scope",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"module": "dist/index.mjs",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"keywords": [],
|
|
9
|
+
"files": [
|
|
10
|
+
"dist"
|
|
11
|
+
],
|
|
12
|
+
"peerDependencies": {
|
|
13
|
+
"react": ">=18",
|
|
14
|
+
"react-dom": ">=18"
|
|
15
|
+
},
|
|
16
|
+
"dependencies": {
|
|
17
|
+
"react-error-boundary": "^4.0.13",
|
|
18
|
+
"@kodiak-finance/orderly-core": "2.9.2-alpha.0",
|
|
19
|
+
"@kodiak-finance/orderly-types": "2.9.2-alpha.0",
|
|
20
|
+
"@kodiak-finance/orderly-utils": "2.9.2-alpha.0"
|
|
21
|
+
},
|
|
22
|
+
"devDependencies": {
|
|
23
|
+
"@babel/preset-env": "^7.22.9",
|
|
24
|
+
"@babel/preset-react": "^7.22.5",
|
|
25
|
+
"@babel/preset-typescript": "^7.22.5",
|
|
26
|
+
"@testing-library/jest-dom": "^6.6.4",
|
|
27
|
+
"@testing-library/react": "^14.2.1",
|
|
28
|
+
"@types/jest": "^29.5.14",
|
|
29
|
+
"@types/react": "^18.2.38",
|
|
30
|
+
"@types/react-dom": "^18.2.17",
|
|
31
|
+
"babel-jest": "^29.6.1",
|
|
32
|
+
"jest": "^29.6.1",
|
|
33
|
+
"jest-environment-jsdom": "^29.7.0",
|
|
34
|
+
"react": "^18.2.0",
|
|
35
|
+
"react-dom": "^18.2.0",
|
|
36
|
+
"tsup": "^8.5.1",
|
|
37
|
+
"typescript": "^5.1.6",
|
|
38
|
+
"tsconfig": "0.11.34-alpha.0"
|
|
39
|
+
},
|
|
40
|
+
"publishConfig": {
|
|
41
|
+
"access": "public"
|
|
42
|
+
},
|
|
43
|
+
"scripts": {
|
|
44
|
+
"build": "tsup",
|
|
45
|
+
"test": "jest"
|
|
46
|
+
}
|
|
47
|
+
}
|