@stackable-labs/sdk-extension-react 1.44.0 → 1.45.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -97,6 +97,21 @@ declare const useExtension: () => ExtensionContextValue;
97
97
  */
98
98
  declare const useAuthEvent: (eventType: AuthEventType, handler: (event: AuthEvent) => void) => void;
99
99
 
100
+ /**
101
+ * useIdentityExtend — register a handler for identity claim enrichment.
102
+ *
103
+ * When the host platform detects a customer login, it sends base claims
104
+ * (external_id, email, name) to extensions with the identity:extend permission.
105
+ * The handler returns additional claims to merge into the JWT before signing.
106
+ *
107
+ * @example
108
+ * useIdentityExtend((claims) => ({
109
+ * external_id: `shopify_${claims.external_id}`
110
+ * }))
111
+ */
112
+ type IdentityExtendHandler = (claims: Record<string, unknown>) => Record<string, unknown> | Promise<Record<string, unknown>>;
113
+ declare const useIdentityExtend: (handler: IdentityExtendHandler) => void;
114
+
100
115
  interface SurfaceProps {
101
116
  /** The extension point target ID (e.g., "slot.header") */
102
117
  id: string;
@@ -508,4 +523,4 @@ type UseContextDataResult = ContextData & {
508
523
  };
509
524
  declare const useContextData: () => UseContextDataResult;
510
525
 
511
- export { type Store, Surface, createExtension, createStore, ui, useAuthEvent, useCapabilities, useContextData, useExtension, useStore, useSurfaceContext };
526
+ export { type Store, Surface, createExtension, createStore, ui, useAuthEvent, useCapabilities, useContextData, useExtension, useIdentityExtend, useStore, useSurfaceContext };
package/dist/index.js CHANGED
@@ -20,6 +20,7 @@ var getWebCrypto = () => _webCrypto ??= new WebCrypto({ crypto: globalThis.crypt
20
20
  var requestCounter = 0;
21
21
  var registeredExtensionId = "unknown";
22
22
  var encryptionKey = null;
23
+ var identityExtendHandler = null;
23
24
  var pendingRequests = /* @__PURE__ */ new Map();
24
25
  var extensionEventHandlers = /* @__PURE__ */ new Set();
25
26
  var onExtensionEvent = (handler) => {
@@ -28,6 +29,12 @@ var onExtensionEvent = (handler) => {
28
29
  extensionEventHandlers.delete(handler);
29
30
  };
30
31
  };
32
+ var registerIdentityExtendHandler = (handler) => {
33
+ identityExtendHandler = handler;
34
+ return () => {
35
+ if (identityExtendHandler === handler) identityExtendHandler = null;
36
+ };
37
+ };
31
38
  var generateRequestId = () => `req_${++requestCounter}_${Date.now()}`;
32
39
  var setEncryptionKey = async (keyBase64) => {
33
40
  encryptionKey = await getWebCrypto().importRawKey("secret", base64ToBytes(keyBase64), { extractable: false });
@@ -50,6 +57,18 @@ var initRpcListener = (extensionId) => {
50
57
  }
51
58
  return;
52
59
  }
60
+ if (msg?.type === "identity-extend-request") {
61
+ if (identityExtendHandler) {
62
+ const { id, claims } = msg;
63
+ Promise.resolve(identityExtendHandler(claims)).then((additionalClaims) => {
64
+ window.parent.postMessage({ type: "identity-extend-response", id, additionalClaims }, "*");
65
+ }).catch((e) => {
66
+ console.error("[rpc-client] identity-extend handler error:", e);
67
+ window.parent.postMessage({ type: "identity-extend-response", id, additionalClaims: {} }, "*");
68
+ });
69
+ }
70
+ return;
71
+ }
53
72
  if (msg?.type === "capability-response") {
54
73
  const response = msg;
55
74
  const pending = pendingRequests.get(response.id);
@@ -186,6 +205,12 @@ var useAuthEvent = (eventType, handler) => {
186
205
  return unsubscribe;
187
206
  }, [eventType, handler]);
188
207
  };
208
+ var useIdentityExtend = (handler) => {
209
+ useEffect(() => {
210
+ const unregister = registerIdentityExtendHandler(handler);
211
+ return unregister;
212
+ }, [handler]);
213
+ };
189
214
  var useExtensionId = () => {
190
215
  const ctx = React.useContext(ExtensionContext);
191
216
  return ctx?.extensionId ?? "unknown";
@@ -425,4 +450,4 @@ var useContextData = () => {
425
450
  return { ...contextData, loading };
426
451
  };
427
452
 
428
- export { Surface, createExtension, createStore, ui_exports as ui, useAuthEvent, useCapabilities, useContextData, useExtension, useStore, useSurfaceContext };
453
+ export { Surface, createExtension, createStore, ui_exports as ui, useAuthEvent, useCapabilities, useContextData, useExtension, useIdentityExtend, useStore, useSurfaceContext };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stackable-labs/sdk-extension-react",
3
- "version": "1.44.0",
3
+ "version": "1.45.0",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -15,7 +15,7 @@
15
15
  "@agnostack/verifyd": "alpha",
16
16
  "@remote-dom/core": "1.x",
17
17
  "@remote-dom/react": "1.x",
18
- "@stackable-labs/sdk-extension-contracts": "1.44.0"
18
+ "@stackable-labs/sdk-extension-contracts": "1.45.0"
19
19
  },
20
20
  "peerDependencies": {
21
21
  "react": ">=18.0.0 <19.0.0",