@orderly.network/plugin-core 3.0.0-beta.0 → 3.0.0-beta.2
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 +3 -2
- package/dist/index.d.ts +3 -2
- package/dist/index.js +14 -16
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +14 -16
- package/dist/index.mjs.map +1 -1
- package/package.json +5 -5
package/dist/index.d.mts
CHANGED
|
@@ -43,10 +43,11 @@ interface OrderlyPluginAPI {
|
|
|
43
43
|
}
|
|
44
44
|
/**
|
|
45
45
|
* Mapping from interceptor target path to component props type.
|
|
46
|
-
* Extend via module augmentation in UI packages
|
|
46
|
+
* Extend via module augmentation in UI packages (e.g. @orderly.network/trading)
|
|
47
|
+
* to enable typed props in createInterceptor(target, (Original, props, api) => ...).
|
|
48
|
+
* No index signature so that augmented entries keep their exact prop types.
|
|
47
49
|
*/
|
|
48
50
|
interface InterceptorTargetPropsMap {
|
|
49
|
-
[path: string]: Record<string, unknown>;
|
|
50
51
|
}
|
|
51
52
|
/** Union of known interceptor target paths (keys of InterceptorTargetPropsMap) */
|
|
52
53
|
type KnownInterceptorTarget = keyof InterceptorTargetPropsMap;
|
package/dist/index.d.ts
CHANGED
|
@@ -43,10 +43,11 @@ interface OrderlyPluginAPI {
|
|
|
43
43
|
}
|
|
44
44
|
/**
|
|
45
45
|
* Mapping from interceptor target path to component props type.
|
|
46
|
-
* Extend via module augmentation in UI packages
|
|
46
|
+
* Extend via module augmentation in UI packages (e.g. @orderly.network/trading)
|
|
47
|
+
* to enable typed props in createInterceptor(target, (Original, props, api) => ...).
|
|
48
|
+
* No index signature so that augmented entries keep their exact prop types.
|
|
47
49
|
*/
|
|
48
50
|
interface InterceptorTargetPropsMap {
|
|
49
|
-
[path: string]: Record<string, unknown>;
|
|
50
51
|
}
|
|
51
52
|
/** Union of known interceptor target paths (keys of InterceptorTargetPropsMap) */
|
|
52
53
|
type KnownInterceptorTarget = keyof InterceptorTargetPropsMap;
|
package/dist/index.js
CHANGED
|
@@ -362,30 +362,17 @@ var setExtensionBuilder = (position, builder) => {
|
|
|
362
362
|
registry.setBuilder(position, builder);
|
|
363
363
|
};
|
|
364
364
|
|
|
365
|
-
// src/notFound.tsx
|
|
366
|
-
var import_jsx_runtime3 = require("react/jsx-runtime");
|
|
367
|
-
var NotFound = (props) => {
|
|
368
|
-
const { position } = props;
|
|
369
|
-
return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { style: { color: "#ef4444" }, children: [
|
|
370
|
-
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("strong", { children: `[${position}] ` }),
|
|
371
|
-
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { children: "Not found!" })
|
|
372
|
-
] });
|
|
373
|
-
};
|
|
374
|
-
|
|
375
|
-
// src/useInjectedComponent.tsx
|
|
376
|
-
var import_react4 = require("react");
|
|
377
|
-
|
|
378
365
|
// src/PluginErrorBoundary.tsx
|
|
379
366
|
var import_react_error_boundary = require("react-error-boundary");
|
|
380
|
-
var
|
|
381
|
-
var DEFAULT_FALLBACK = (pluginId) => /* @__PURE__ */ (0,
|
|
367
|
+
var import_jsx_runtime3 = require("react/jsx-runtime");
|
|
368
|
+
var DEFAULT_FALLBACK = (pluginId) => /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { style: { color: "#ef4444", fontSize: "12px" }, children: [
|
|
382
369
|
"[Plugin ",
|
|
383
370
|
pluginId,
|
|
384
371
|
" error]"
|
|
385
372
|
] });
|
|
386
373
|
var PluginErrorBoundary = ({ children, fallback, pluginId, onError, onFallback }) => {
|
|
387
374
|
const resolvedFallback = fallback != null ? fallback : onFallback ? onFallback() : DEFAULT_FALLBACK(pluginId != null ? pluginId : "unknown");
|
|
388
|
-
return /* @__PURE__ */ (0,
|
|
375
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
389
376
|
import_react_error_boundary.ErrorBoundary,
|
|
390
377
|
{
|
|
391
378
|
fallback: resolvedFallback,
|
|
@@ -395,7 +382,18 @@ var PluginErrorBoundary = ({ children, fallback, pluginId, onError, onFallback }
|
|
|
395
382
|
);
|
|
396
383
|
};
|
|
397
384
|
|
|
385
|
+
// src/notFound.tsx
|
|
386
|
+
var import_jsx_runtime4 = require("react/jsx-runtime");
|
|
387
|
+
var NotFound = (props) => {
|
|
388
|
+
const { position } = props;
|
|
389
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { style: { color: "#ef4444" }, children: [
|
|
390
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("strong", { children: `[${position}] ` }),
|
|
391
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { children: "Not found!" })
|
|
392
|
+
] });
|
|
393
|
+
};
|
|
394
|
+
|
|
398
395
|
// src/useInjectedComponent.tsx
|
|
396
|
+
var import_react4 = require("react");
|
|
399
397
|
var import_jsx_runtime5 = require("react/jsx-runtime");
|
|
400
398
|
function useInjectedComponent(name, DefaultComponent) {
|
|
401
399
|
const { plugins, apiFacade } = useOrderlyPluginContext();
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../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/notFound.tsx","../src/useInjectedComponent.tsx","../src/PluginErrorBoundary.tsx","../src/slot.tsx","../src/injectable.tsx","../src/createInterceptor.ts"],"sourcesContent":["export {\n PluginScopeContext,\n PluginScopeProvider,\n usePluginScope,\n type PluginScopeValue,\n} from \"./pluginScopeContext\";\n\nexport {\n OrderlyPluginProvider,\n useOrderlyPluginContext,\n useInterceptorTargets,\n ExtensionProvider,\n useExtensionContext,\n type OrderlyPluginContextValue,\n} from \"./pluginContext\";\n\nexport {\n installExtension,\n setExtensionBuilder,\n type ExtensionOptions,\n} from \"./install\";\nexport { ExtensionSlot } from \"./slot\";\nexport { useInjectedComponent } from \"./useInjectedComponent\";\nexport { injectable } from \"./injectable\";\nexport { positionToPath } from \"./pathMap\";\nexport { OrderlyPluginRegistry, createOrderlySDK } from \"./pluginRegistry\";\nexport { createInterceptor } from \"./createInterceptor\";\nexport { OrderlyExtensionRegistry } from \"./registry\";\nexport { PluginErrorBoundary } from \"./PluginErrorBoundary\";\n\nexport {\n type ExtensionPosition,\n ExtensionPositionEnum,\n type OrderlyPlugin,\n type OrderlyPluginAPI,\n type OrderlySDK,\n type PluginRegistrationFn,\n type PluginInterceptor,\n type PluginInterceptorComponent,\n type InterceptorTargetDescriptor,\n type InterceptorTargetPropsMap,\n type KnownInterceptorTarget,\n type Extension,\n type ExtensionBuilder,\n} from \"./types\";\n\nexport { createEventsFacade, type PluginEventsAPI } from \"./apis/events\";\n","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,\n 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 \"@orderly.network/utils\";\nimport { createEventsFacade, NOOP_EVENTS } from \"./apis/events\";\nimport { getRegisteredInjectableTargets } from \"./injectableTargetRegistry\";\nimport { OrderlyPluginRegistry } from \"./pluginRegistry\";\nimport type {\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?: unknown;\n}\n\nexport const OrderlyPluginProvider: FC<OrderlyPluginProviderProps> = ({\n plugins,\n pluginState,\n children,\n}) => {\n const pluginsRef = useRef<OrderlyPlugin[]>([]);\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 @orderly.network/types.\n */\nimport { EventEmitter, SimpleDI } from \"@orderly.network/core\";\nimport type { TrackerEventName } from \"@orderly.network/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 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 to enable typed props inference.\n */\nexport interface InterceptorTargetPropsMap {\n [path: string]: Record<string, unknown>;\n}\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\n/** Plugin registration function: (SDK, state?) => void; calls SDK.registerPlugin internally */\nexport type PluginRegistrationFn<TState = unknown> = (\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 \"@orderly.network/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 { 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, { 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 React from \"react\";\nimport { NotFound } from \"./notFound\";\nimport { ExtensionPosition } from \"./types\";\nimport { positionToPath } from \"./pathMap\";\nimport { useInjectedComponent } from \"./useInjectedComponent\";\nimport { PluginErrorBoundary } from \"./PluginErrorBoundary\";\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 * Helper to create a typed interceptor. When UI packages augment InterceptorTargetPropsMap,\n * props in the component callback are inferred from the target path.\n * @param target - Interceptor path (e.g. 'Deposit.DepositForm')\n * @param component - (Original, props, api) => ReactNode; props typed from target\n * @returns PluginInterceptor suitable for use in OrderlyPlugin.interceptors\n */\nexport function createInterceptor<T extends KnownInterceptorTarget>(\n target: T,\n component: PluginInterceptorComponent<InterceptorTargetPropsMap[T]>,\n): PluginInterceptor<InterceptorTargetPropsMap[T]> {\n return { target: target as string, component };\n}\n"],"mappings":"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","names":["import_react","import_jsx_runtime","import_react","ExtensionPositionEnum","import_utils","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../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":["export {\n PluginScopeContext,\n PluginScopeProvider,\n usePluginScope,\n type PluginScopeValue,\n} from \"./pluginScopeContext\";\n\nexport {\n OrderlyPluginProvider,\n useOrderlyPluginContext,\n useInterceptorTargets,\n ExtensionProvider,\n useExtensionContext,\n type OrderlyPluginContextValue,\n} from \"./pluginContext\";\n\nexport {\n installExtension,\n setExtensionBuilder,\n type ExtensionOptions,\n} from \"./install\";\nexport { ExtensionSlot } from \"./slot\";\nexport { useInjectedComponent } from \"./useInjectedComponent\";\nexport { injectable } from \"./injectable\";\nexport { positionToPath } from \"./pathMap\";\nexport { OrderlyPluginRegistry, createOrderlySDK } from \"./pluginRegistry\";\nexport { createInterceptor } from \"./createInterceptor\";\nexport { OrderlyExtensionRegistry } from \"./registry\";\nexport { PluginErrorBoundary } from \"./PluginErrorBoundary\";\n\nexport {\n type ExtensionPosition,\n ExtensionPositionEnum,\n type OrderlyPlugin,\n type OrderlyPluginAPI,\n type OrderlySDK,\n type PluginRegistrationFn,\n type PluginInterceptor,\n type PluginInterceptorComponent,\n type InterceptorTargetDescriptor,\n type InterceptorTargetPropsMap,\n type KnownInterceptorTarget,\n type Extension,\n type ExtensionBuilder,\n} from \"./types\";\n\nexport { createEventsFacade, type PluginEventsAPI } from \"./apis/events\";\n","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 \"@orderly.network/utils\";\nimport { createEventsFacade, NOOP_EVENTS } from \"./apis/events\";\nimport { getRegisteredInjectableTargets } from \"./injectableTargetRegistry\";\nimport { OrderlyPluginRegistry } from \"./pluginRegistry\";\nimport type {\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?: unknown;\n}\n\nexport const OrderlyPluginProvider: FC<OrderlyPluginProviderProps> = ({\n plugins,\n pluginState,\n children,\n}) => {\n const pluginsRef = useRef<OrderlyPlugin[]>([]);\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 @orderly.network/types.\n */\nimport { EventEmitter, SimpleDI } from \"@orderly.network/core\";\nimport type { TrackerEventName } from \"@orderly.network/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 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\n/** Plugin registration function: (SDK, state?) => void; calls SDK.registerPlugin internally */\nexport type PluginRegistrationFn<TState = unknown> = (\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 \"@orderly.network/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 * Helper to create a typed interceptor. When UI packages augment InterceptorTargetPropsMap,\n * props in the component callback are inferred from the target path.\n * @param target - Interceptor path (e.g. 'Deposit.DepositForm')\n * @param component - (Original, props, api) => ReactNode; props typed from target\n * @returns PluginInterceptor suitable for use in OrderlyPlugin.interceptors\n */\nexport function createInterceptor<T extends KnownInterceptorTarget>(\n target: T,\n component: PluginInterceptorComponent<InterceptorTargetPropsMap[T]>,\n): PluginInterceptor<InterceptorTargetPropsMap[T]> {\n return { target: target as string, component };\n}\n"],"mappings":"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","names":["import_react","import_jsx_runtime","import_react","ExtensionPositionEnum","import_utils","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime"]}
|
package/dist/index.mjs
CHANGED
|
@@ -329,30 +329,17 @@ var setExtensionBuilder = (position, builder) => {
|
|
|
329
329
|
registry.setBuilder(position, builder);
|
|
330
330
|
};
|
|
331
331
|
|
|
332
|
-
// src/notFound.tsx
|
|
333
|
-
import { jsx as jsx3, jsxs } from "react/jsx-runtime";
|
|
334
|
-
var NotFound = (props) => {
|
|
335
|
-
const { position } = props;
|
|
336
|
-
return /* @__PURE__ */ jsxs("div", { style: { color: "#ef4444" }, children: [
|
|
337
|
-
/* @__PURE__ */ jsx3("strong", { children: `[${position}] ` }),
|
|
338
|
-
/* @__PURE__ */ jsx3("span", { children: "Not found!" })
|
|
339
|
-
] });
|
|
340
|
-
};
|
|
341
|
-
|
|
342
|
-
// src/useInjectedComponent.tsx
|
|
343
|
-
import { useMemo as useMemo3 } from "react";
|
|
344
|
-
|
|
345
332
|
// src/PluginErrorBoundary.tsx
|
|
346
333
|
import { ErrorBoundary } from "react-error-boundary";
|
|
347
|
-
import { jsx as
|
|
348
|
-
var DEFAULT_FALLBACK = (pluginId) => /* @__PURE__ */
|
|
334
|
+
import { jsx as jsx3, jsxs } from "react/jsx-runtime";
|
|
335
|
+
var DEFAULT_FALLBACK = (pluginId) => /* @__PURE__ */ jsxs("div", { style: { color: "#ef4444", fontSize: "12px" }, children: [
|
|
349
336
|
"[Plugin ",
|
|
350
337
|
pluginId,
|
|
351
338
|
" error]"
|
|
352
339
|
] });
|
|
353
340
|
var PluginErrorBoundary = ({ children, fallback, pluginId, onError, onFallback }) => {
|
|
354
341
|
const resolvedFallback = fallback != null ? fallback : onFallback ? onFallback() : DEFAULT_FALLBACK(pluginId != null ? pluginId : "unknown");
|
|
355
|
-
return /* @__PURE__ */
|
|
342
|
+
return /* @__PURE__ */ jsx3(
|
|
356
343
|
ErrorBoundary,
|
|
357
344
|
{
|
|
358
345
|
fallback: resolvedFallback,
|
|
@@ -362,7 +349,18 @@ var PluginErrorBoundary = ({ children, fallback, pluginId, onError, onFallback }
|
|
|
362
349
|
);
|
|
363
350
|
};
|
|
364
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
|
+
|
|
365
362
|
// src/useInjectedComponent.tsx
|
|
363
|
+
import { useMemo as useMemo3 } from "react";
|
|
366
364
|
import { jsx as jsx5 } from "react/jsx-runtime";
|
|
367
365
|
function useInjectedComponent(name, DefaultComponent) {
|
|
368
366
|
const { plugins, apiFacade } = useOrderlyPluginContext();
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +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/notFound.tsx","../src/useInjectedComponent.tsx","../src/PluginErrorBoundary.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,\n 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 \"@orderly.network/utils\";\nimport { createEventsFacade, NOOP_EVENTS } from \"./apis/events\";\nimport { getRegisteredInjectableTargets } from \"./injectableTargetRegistry\";\nimport { OrderlyPluginRegistry } from \"./pluginRegistry\";\nimport type {\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?: unknown;\n}\n\nexport const OrderlyPluginProvider: FC<OrderlyPluginProviderProps> = ({\n plugins,\n pluginState,\n children,\n}) => {\n const pluginsRef = useRef<OrderlyPlugin[]>([]);\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 @orderly.network/types.\n */\nimport { EventEmitter, SimpleDI } from \"@orderly.network/core\";\nimport type { TrackerEventName } from \"@orderly.network/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 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 to enable typed props inference.\n */\nexport interface InterceptorTargetPropsMap {\n [path: string]: Record<string, unknown>;\n}\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\n/** Plugin registration function: (SDK, state?) => void; calls SDK.registerPlugin internally */\nexport type PluginRegistrationFn<TState = unknown> = (\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 \"@orderly.network/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 { 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, { 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 React from \"react\";\nimport { NotFound } from \"./notFound\";\nimport { ExtensionPosition } from \"./types\";\nimport { positionToPath } from \"./pathMap\";\nimport { useInjectedComponent } from \"./useInjectedComponent\";\nimport { PluginErrorBoundary } from \"./PluginErrorBoundary\";\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 * Helper to create a typed interceptor. When UI packages augment InterceptorTargetPropsMap,\n * props in the component callback are inferred from the target path.\n * @param target - Interceptor path (e.g. 'Deposit.DepositForm')\n * @param component - (Original, props, api) => ReactNode; props typed from target\n * @returns PluginInterceptor suitable for use in OrderlyPlugin.interceptors\n */\nexport function createInterceptor<T extends KnownInterceptorTarget>(\n target: T,\n component: PluginInterceptorComponent<InterceptorTargetPropsMap[T]>,\n): PluginInterceptor<InterceptorTargetPropsMap[T]> {\n return { target: target as string, component };\n}\n"],"mappings":"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","names":["createContext","useContext","useMemo","jsx","createContext","useContext","useMemo","ExtensionPositionEnum","getGlobalObject","jsx","useMemo","jsx","jsxs","jsx","useMemo","jsx","jsx"]}
|
|
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 \"@orderly.network/utils\";\nimport { createEventsFacade, NOOP_EVENTS } from \"./apis/events\";\nimport { getRegisteredInjectableTargets } from \"./injectableTargetRegistry\";\nimport { OrderlyPluginRegistry } from \"./pluginRegistry\";\nimport type {\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?: unknown;\n}\n\nexport const OrderlyPluginProvider: FC<OrderlyPluginProviderProps> = ({\n plugins,\n pluginState,\n children,\n}) => {\n const pluginsRef = useRef<OrderlyPlugin[]>([]);\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 @orderly.network/types.\n */\nimport { EventEmitter, SimpleDI } from \"@orderly.network/core\";\nimport type { TrackerEventName } from \"@orderly.network/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 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\n/** Plugin registration function: (SDK, state?) => void; calls SDK.registerPlugin internally */\nexport type PluginRegistrationFn<TState = unknown> = (\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 \"@orderly.network/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 * Helper to create a typed interceptor. When UI packages augment InterceptorTargetPropsMap,\n * props in the component callback are inferred from the target path.\n * @param target - Interceptor path (e.g. 'Deposit.DepositForm')\n * @param component - (Original, props, api) => ReactNode; props typed from target\n * @returns PluginInterceptor suitable for use in OrderlyPlugin.interceptors\n */\nexport function createInterceptor<T extends KnownInterceptorTarget>(\n target: T,\n component: PluginInterceptorComponent<InterceptorTargetPropsMap[T]>,\n): PluginInterceptor<InterceptorTargetPropsMap[T]> {\n return { target: target as string, 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
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@orderly.network/plugin-core",
|
|
3
|
-
"version": "3.0.0-beta.
|
|
3
|
+
"version": "3.0.0-beta.2",
|
|
4
4
|
"description": "Orderly SDK plugin system - interceptors, registry, scope",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.mjs",
|
|
@@ -15,9 +15,9 @@
|
|
|
15
15
|
},
|
|
16
16
|
"dependencies": {
|
|
17
17
|
"react-error-boundary": "^4.0.13",
|
|
18
|
-
"@orderly.network/
|
|
19
|
-
"@orderly.network/
|
|
20
|
-
"@orderly.network/
|
|
18
|
+
"@orderly.network/types": "3.0.0-beta.2",
|
|
19
|
+
"@orderly.network/utils": "3.0.0-beta.2",
|
|
20
|
+
"@orderly.network/core": "3.0.0-beta.2"
|
|
21
21
|
},
|
|
22
22
|
"devDependencies": {
|
|
23
23
|
"@babel/preset-env": "^7.22.9",
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
"react-dom": "^18.2.0",
|
|
36
36
|
"tsup": "^8.5.1",
|
|
37
37
|
"typescript": "^5.1.6",
|
|
38
|
-
"tsconfig": "1.0.0-beta.
|
|
38
|
+
"tsconfig": "1.0.0-beta.2"
|
|
39
39
|
},
|
|
40
40
|
"publishConfig": {
|
|
41
41
|
"access": "public"
|