@viu/emporix-sdk-react 2.10.0 → 2.12.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/storage.cjs CHANGED
@@ -6,6 +6,7 @@ function createMemoryStorage(opts = {}) {
6
6
  let cartId = null;
7
7
  let anon = null;
8
8
  let siteCode = null;
9
+ let language = null;
9
10
  let activeLegalEntityId = null;
10
11
  let refreshToken = null;
11
12
  const tokenListeners = /* @__PURE__ */ new Set();
@@ -36,6 +37,11 @@ function createMemoryStorage(opts = {}) {
36
37
  siteCode = code;
37
38
  all.notify("siteCode");
38
39
  },
40
+ getLanguage: () => language,
41
+ setLanguage: (l) => {
42
+ language = l;
43
+ all.notify("language");
44
+ },
39
45
  getActiveLegalEntityId: () => activeLegalEntityId,
40
46
  setActiveLegalEntityId: (id) => {
41
47
  activeLegalEntityId = id;
@@ -55,6 +61,7 @@ var DEFAULT_TOKEN_KEY = "emporix.customerToken";
55
61
  var CART_KEY = "emporix.cartId";
56
62
  var ANON_KEY = "emporix.anonymousSession";
57
63
  var SITE_KEY = "emporix.siteCode";
64
+ var LANGUAGE_KEY = "emporix.language";
58
65
  var ACTIVE_LE_KEY = "emporix.activeLegalEntityId";
59
66
  var REFRESH_KEY = "emporix.refreshToken";
60
67
  function createLocalStorageStorage(opts = {}) {
@@ -97,6 +104,12 @@ function createLocalStorageStorage(opts = {}) {
97
104
  else ls.setItem(SITE_KEY, code);
98
105
  all.notify("siteCode");
99
106
  },
107
+ getLanguage: () => ls.getItem(LANGUAGE_KEY),
108
+ setLanguage: (l) => {
109
+ if (l === null) ls.removeItem(LANGUAGE_KEY);
110
+ else ls.setItem(LANGUAGE_KEY, l);
111
+ all.notify("language");
112
+ },
100
113
  getActiveLegalEntityId: () => ls.getItem(ACTIVE_LE_KEY),
101
114
  setActiveLegalEntityId: (id) => {
102
115
  if (id === null) ls.removeItem(ACTIVE_LE_KEY);
@@ -118,6 +131,7 @@ var DEFAULT_TOKEN_NAME = "emporix.customerToken";
118
131
  var CART_NAME = "emporix.cartId";
119
132
  var ANON_NAME = "emporix.anonymousSession";
120
133
  var SITE_NAME = "emporix.siteCode";
134
+ var LANGUAGE_NAME = "emporix.language";
121
135
  var ACTIVE_LE_NAME = "emporix.activeLegalEntityId";
122
136
  var REFRESH_NAME = "emporix.refreshToken";
123
137
  function createCookieStorage(opts = {}) {
@@ -164,6 +178,11 @@ function createCookieStorage(opts = {}) {
164
178
  writeCookie(SITE_NAME, code);
165
179
  all.notify("siteCode");
166
180
  },
181
+ getLanguage: () => readCookie(LANGUAGE_NAME),
182
+ setLanguage: (l) => {
183
+ writeCookie(LANGUAGE_NAME, l);
184
+ all.notify("language");
185
+ },
167
186
  getActiveLegalEntityId: () => readCookie(ACTIVE_LE_NAME),
168
187
  setActiveLegalEntityId: (id) => {
169
188
  writeCookie(ACTIVE_LE_NAME, id);
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/storage/memory.ts","../src/storage/local-storage.ts","../src/storage/cookie.ts","../src/storage/index.ts"],"names":[],"mappings":"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","file":"storage.cjs","sourcesContent":["import {\n createListenerSet,\n type EmporixStorage,\n type EmporixStorageKey,\n type PersistedAnonymousSession,\n} from \"./index\";\n\n/** In-memory token store. Default, SSR-safe, no persistence. */\nexport function createMemoryStorage(opts: { initial?: string } = {}): EmporixStorage {\n let token: string | null = opts.initial ?? null;\n let cartId: string | null = null;\n let anon: PersistedAnonymousSession | null = null;\n let siteCode: string | null = null;\n let activeLegalEntityId: string | null = null;\n let refreshToken: string | null = null;\n const tokenListeners = new Set<(t: string | null) => void>();\n const all = createListenerSet<EmporixStorageKey>();\n return {\n getCustomerToken: () => token,\n setCustomerToken: (t) => {\n token = t;\n for (const l of tokenListeners) l(token);\n all.notify(\"customerToken\");\n },\n subscribe: (l) => {\n tokenListeners.add(l);\n return () => tokenListeners.delete(l);\n },\n getCartId: () => cartId,\n setCartId: (id) => {\n cartId = id;\n all.notify(\"cartId\");\n },\n getAnonymousSession: () => anon,\n setAnonymousSession: (s) => {\n anon = s;\n all.notify(\"anonymousSession\");\n },\n getSiteCode: () => siteCode,\n setSiteCode: (code) => {\n siteCode = code;\n all.notify(\"siteCode\");\n },\n getActiveLegalEntityId: () => activeLegalEntityId,\n setActiveLegalEntityId: (id) => {\n activeLegalEntityId = id;\n all.notify(\"activeLegalEntityId\");\n },\n getRefreshToken: () => refreshToken,\n setRefreshToken: (t) => {\n refreshToken = t;\n all.notify(\"refreshToken\");\n },\n subscribeAll: (l) => all.add(l),\n };\n}\n","import {\n createListenerSet,\n parseAnonymousSession,\n type EmporixStorage,\n type EmporixStorageKey,\n} from \"./index\";\nimport { createMemoryStorage } from \"./memory\";\n\nconst DEFAULT_TOKEN_KEY = \"emporix.customerToken\";\nconst CART_KEY = \"emporix.cartId\";\nconst ANON_KEY = \"emporix.anonymousSession\";\nconst SITE_KEY = \"emporix.siteCode\";\nconst ACTIVE_LE_KEY = \"emporix.activeLegalEntityId\";\nconst REFRESH_KEY = \"emporix.refreshToken\";\n\n/** Browser `localStorage`-backed store. Falls back to memory on the server. */\nexport function createLocalStorageStorage(opts: { key?: string } = {}): EmporixStorage {\n const tokenKey = opts.key ?? DEFAULT_TOKEN_KEY;\n const available =\n typeof globalThis !== \"undefined\" &&\n typeof (globalThis as { localStorage?: Storage }).localStorage !== \"undefined\";\n if (!available) {\n // eslint-disable-next-line no-console\n console.warn(\"[emporix] localStorage unavailable; falling back to in-memory storage\");\n return createMemoryStorage();\n }\n const ls = (globalThis as unknown as { localStorage: Storage }).localStorage;\n const tokenListeners = new Set<(t: string | null) => void>();\n const all = createListenerSet<EmporixStorageKey>();\n return {\n getCustomerToken: () => ls.getItem(tokenKey),\n setCustomerToken: (t) => {\n if (t === null) ls.removeItem(tokenKey);\n else ls.setItem(tokenKey, t);\n for (const l of tokenListeners) l(t);\n all.notify(\"customerToken\");\n },\n subscribe: (l) => {\n tokenListeners.add(l);\n return () => tokenListeners.delete(l);\n },\n getCartId: () => ls.getItem(CART_KEY),\n setCartId: (id) => {\n if (id === null) ls.removeItem(CART_KEY);\n else ls.setItem(CART_KEY, id);\n all.notify(\"cartId\");\n },\n getAnonymousSession: () => parseAnonymousSession(ls.getItem(ANON_KEY)),\n setAnonymousSession: (s) => {\n if (s === null) ls.removeItem(ANON_KEY);\n else ls.setItem(ANON_KEY, JSON.stringify({ refreshToken: s.refreshToken, sessionId: s.sessionId }));\n all.notify(\"anonymousSession\");\n },\n getSiteCode: () => ls.getItem(SITE_KEY),\n setSiteCode: (code) => {\n if (code === null) ls.removeItem(SITE_KEY);\n else ls.setItem(SITE_KEY, code);\n all.notify(\"siteCode\");\n },\n getActiveLegalEntityId: () => ls.getItem(ACTIVE_LE_KEY),\n setActiveLegalEntityId: (id) => {\n if (id === null) ls.removeItem(ACTIVE_LE_KEY);\n else ls.setItem(ACTIVE_LE_KEY, id);\n all.notify(\"activeLegalEntityId\");\n },\n getRefreshToken: () => ls.getItem(REFRESH_KEY),\n setRefreshToken: (t) => {\n if (t === null) ls.removeItem(REFRESH_KEY);\n else ls.setItem(REFRESH_KEY, t);\n all.notify(\"refreshToken\");\n },\n subscribeAll: (l) => all.add(l),\n };\n}\n","import {\n createListenerSet,\n parseAnonymousSession,\n type EmporixStorage,\n type EmporixStorageKey,\n} from \"./index\";\nimport { createMemoryStorage } from \"./memory\";\n\nconst DEFAULT_TOKEN_NAME = \"emporix.customerToken\";\nconst CART_NAME = \"emporix.cartId\";\nconst ANON_NAME = \"emporix.anonymousSession\";\nconst SITE_NAME = \"emporix.siteCode\";\nconst ACTIVE_LE_NAME = \"emporix.activeLegalEntityId\";\nconst REFRESH_NAME = \"emporix.refreshToken\";\n\n/** Cookie-backed store. Consumer must set SameSite/Secure for CSRF safety. */\nexport function createCookieStorage(\n opts: { name?: string; secure?: boolean; sameSite?: \"lax\" | \"strict\" | \"none\" } = {},\n): EmporixStorage {\n const tokenName = opts.name ?? DEFAULT_TOKEN_NAME;\n const sameSite = opts.sameSite ?? \"lax\";\n const secure = opts.secure ?? false;\n if (typeof document === \"undefined\") {\n // eslint-disable-next-line no-console\n console.warn(\"[emporix] document unavailable; cookie storage falling back to in-memory\");\n return createMemoryStorage();\n }\n const attrs = `path=/; SameSite=${sameSite}${secure ? \"; Secure\" : \"\"}`;\n const readCookie = (name: string): string | null => {\n for (const part of document.cookie.split(\"; \")) {\n const [k, ...v] = part.split(\"=\");\n if (k === name) return decodeURIComponent(v.join(\"=\")) || null;\n }\n return null;\n };\n const writeCookie = (name: string, value: string | null): void => {\n document.cookie =\n value === null\n ? `${name}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; ${attrs}`\n : `${name}=${encodeURIComponent(value)}; ${attrs}`;\n };\n const all = createListenerSet<EmporixStorageKey>();\n return {\n getCustomerToken: () => readCookie(tokenName),\n setCustomerToken: (t) => {\n writeCookie(tokenName, t);\n all.notify(\"customerToken\");\n },\n getCartId: () => readCookie(CART_NAME),\n setCartId: (id) => {\n writeCookie(CART_NAME, id);\n all.notify(\"cartId\");\n },\n getAnonymousSession: () => parseAnonymousSession(readCookie(ANON_NAME)),\n setAnonymousSession: (s) => {\n writeCookie(\n ANON_NAME,\n s === null\n ? null\n : JSON.stringify({ refreshToken: s.refreshToken, sessionId: s.sessionId }),\n );\n all.notify(\"anonymousSession\");\n },\n getSiteCode: () => readCookie(SITE_NAME),\n setSiteCode: (code) => {\n writeCookie(SITE_NAME, code);\n all.notify(\"siteCode\");\n },\n getActiveLegalEntityId: () => readCookie(ACTIVE_LE_NAME),\n setActiveLegalEntityId: (id) => {\n writeCookie(ACTIVE_LE_NAME, id);\n all.notify(\"activeLegalEntityId\");\n },\n getRefreshToken: () => readCookie(REFRESH_NAME),\n setRefreshToken: (t) => {\n writeCookie(REFRESH_NAME, t);\n all.notify(\"refreshToken\");\n },\n subscribeAll: (l) => all.add(l),\n };\n}\n","/** Pluggable persistence for SDK session state. SSR-safe by default (memory). */\nexport interface EmporixStorage {\n // Customer token (unchanged).\n getCustomerToken(): string | null;\n setCustomerToken(token: string | null): void;\n subscribe?(listener: (token: string | null) => void): () => void;\n\n // Active guest / customer cart id.\n getCartId(): string | null;\n setCartId(id: string | null): void;\n\n // Anonymous session — used by DefaultTokenProvider (via EmporixProvider\n // wiring) to preserve sessionId across page reloads.\n getAnonymousSession(): PersistedAnonymousSession | null;\n setAnonymousSession(session: PersistedAnonymousSession | null): void;\n\n // Active site code (MS-2). `null` = no site bound yet.\n getSiteCode(): string | null;\n setSiteCode(code: string | null): void;\n\n // Active legal entity id (B2B). `null` = B2C mode.\n getActiveLegalEntityId(): string | null;\n setActiveLegalEntityId(id: string | null): void;\n\n // Refresh token — optional persistence. When absent, B2B company-switch\n // falls back to a local-state-only update (no server-side token rescope).\n getRefreshToken(): string | null;\n setRefreshToken(token: string | null): void;\n\n /**\n * Subscribe to any storage write. The listener receives the key that\n * changed. Returns an unsubscribe function. Optional — backends may no-op.\n * Used by the telemetry layer to emit `storage.write` events.\n */\n subscribeAll?(\n listener: (key: EmporixStorageKey) => void,\n ): () => void;\n}\n\n/** Minimal subset of `AnonymousSession` that needs to outlive a page load. */\nexport interface PersistedAnonymousSession {\n refreshToken: string;\n sessionId: string;\n}\n\n/** Backward-compat alias. New code should prefer `EmporixStorage`. */\nexport type TokenStorage = EmporixStorage;\n\n/** Keys that participate in {@link EmporixStorage.subscribeAll}. */\nexport type EmporixStorageKey =\n | \"customerToken\"\n | \"cartId\"\n | \"siteCode\"\n | \"anonymousSession\"\n | \"activeLegalEntityId\"\n | \"refreshToken\";\n\n/**\n * Internal: create a swallow-on-throw listener set used by all three storage\n * backends for `subscribeAll`. Centralizes the try/catch wrapper so a buggy\n * telemetry handler never breaks a storage write.\n */\nexport function createListenerSet<T>(): {\n add(l: (value: T) => void): () => void;\n notify(value: T): void;\n} {\n const listeners = new Set<(v: T) => void>();\n return {\n add(l) {\n listeners.add(l);\n return () => listeners.delete(l);\n },\n notify(value) {\n for (const l of listeners) {\n try {\n l(value);\n } catch {\n // Swallow handler errors; telemetry must never break writes.\n }\n }\n },\n };\n}\n\n/**\n * Internal: parses a raw `anonymousSession` JSON payload (from localStorage\n * or a cookie) into a {@link PersistedAnonymousSession}. Returns `null` for\n * any malformed or missing input.\n */\nexport function parseAnonymousSession(raw: string | null): PersistedAnonymousSession | null {\n if (!raw) return null;\n try {\n const parsed = JSON.parse(raw) as Partial<PersistedAnonymousSession>;\n if (typeof parsed.refreshToken === \"string\" && typeof parsed.sessionId === \"string\") {\n return { refreshToken: parsed.refreshToken, sessionId: parsed.sessionId };\n }\n return null;\n } catch {\n return null;\n }\n}\n\nexport { createMemoryStorage } from \"./memory\";\nexport { createLocalStorageStorage } from \"./local-storage\";\nexport { createCookieStorage } from \"./cookie\";\n"]}
1
+ {"version":3,"sources":["../src/storage/memory.ts","../src/storage/local-storage.ts","../src/storage/cookie.ts","../src/storage/index.ts"],"names":[],"mappings":"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","file":"storage.cjs","sourcesContent":["import {\n createListenerSet,\n type EmporixStorage,\n type EmporixStorageKey,\n type PersistedAnonymousSession,\n} from \"./index\";\n\n/** In-memory token store. Default, SSR-safe, no persistence. */\nexport function createMemoryStorage(opts: { initial?: string } = {}): EmporixStorage {\n let token: string | null = opts.initial ?? null;\n let cartId: string | null = null;\n let anon: PersistedAnonymousSession | null = null;\n let siteCode: string | null = null;\n let language: string | null = null;\n let activeLegalEntityId: string | null = null;\n let refreshToken: string | null = null;\n const tokenListeners = new Set<(t: string | null) => void>();\n const all = createListenerSet<EmporixStorageKey>();\n return {\n getCustomerToken: () => token,\n setCustomerToken: (t) => {\n token = t;\n for (const l of tokenListeners) l(token);\n all.notify(\"customerToken\");\n },\n subscribe: (l) => {\n tokenListeners.add(l);\n return () => tokenListeners.delete(l);\n },\n getCartId: () => cartId,\n setCartId: (id) => {\n cartId = id;\n all.notify(\"cartId\");\n },\n getAnonymousSession: () => anon,\n setAnonymousSession: (s) => {\n anon = s;\n all.notify(\"anonymousSession\");\n },\n getSiteCode: () => siteCode,\n setSiteCode: (code) => {\n siteCode = code;\n all.notify(\"siteCode\");\n },\n getLanguage: () => language,\n setLanguage: (l) => {\n language = l;\n all.notify(\"language\");\n },\n getActiveLegalEntityId: () => activeLegalEntityId,\n setActiveLegalEntityId: (id) => {\n activeLegalEntityId = id;\n all.notify(\"activeLegalEntityId\");\n },\n getRefreshToken: () => refreshToken,\n setRefreshToken: (t) => {\n refreshToken = t;\n all.notify(\"refreshToken\");\n },\n subscribeAll: (l) => all.add(l),\n };\n}\n","import {\n createListenerSet,\n parseAnonymousSession,\n type EmporixStorage,\n type EmporixStorageKey,\n} from \"./index\";\nimport { createMemoryStorage } from \"./memory\";\n\nconst DEFAULT_TOKEN_KEY = \"emporix.customerToken\";\nconst CART_KEY = \"emporix.cartId\";\nconst ANON_KEY = \"emporix.anonymousSession\";\nconst SITE_KEY = \"emporix.siteCode\";\nconst LANGUAGE_KEY = \"emporix.language\";\nconst ACTIVE_LE_KEY = \"emporix.activeLegalEntityId\";\nconst REFRESH_KEY = \"emporix.refreshToken\";\n\n/** Browser `localStorage`-backed store. Falls back to memory on the server. */\nexport function createLocalStorageStorage(opts: { key?: string } = {}): EmporixStorage {\n const tokenKey = opts.key ?? DEFAULT_TOKEN_KEY;\n const available =\n typeof globalThis !== \"undefined\" &&\n typeof (globalThis as { localStorage?: Storage }).localStorage !== \"undefined\";\n if (!available) {\n // eslint-disable-next-line no-console\n console.warn(\"[emporix] localStorage unavailable; falling back to in-memory storage\");\n return createMemoryStorage();\n }\n const ls = (globalThis as unknown as { localStorage: Storage }).localStorage;\n const tokenListeners = new Set<(t: string | null) => void>();\n const all = createListenerSet<EmporixStorageKey>();\n return {\n getCustomerToken: () => ls.getItem(tokenKey),\n setCustomerToken: (t) => {\n if (t === null) ls.removeItem(tokenKey);\n else ls.setItem(tokenKey, t);\n for (const l of tokenListeners) l(t);\n all.notify(\"customerToken\");\n },\n subscribe: (l) => {\n tokenListeners.add(l);\n return () => tokenListeners.delete(l);\n },\n getCartId: () => ls.getItem(CART_KEY),\n setCartId: (id) => {\n if (id === null) ls.removeItem(CART_KEY);\n else ls.setItem(CART_KEY, id);\n all.notify(\"cartId\");\n },\n getAnonymousSession: () => parseAnonymousSession(ls.getItem(ANON_KEY)),\n setAnonymousSession: (s) => {\n if (s === null) ls.removeItem(ANON_KEY);\n else ls.setItem(ANON_KEY, JSON.stringify({ refreshToken: s.refreshToken, sessionId: s.sessionId }));\n all.notify(\"anonymousSession\");\n },\n getSiteCode: () => ls.getItem(SITE_KEY),\n setSiteCode: (code) => {\n if (code === null) ls.removeItem(SITE_KEY);\n else ls.setItem(SITE_KEY, code);\n all.notify(\"siteCode\");\n },\n getLanguage: () => ls.getItem(LANGUAGE_KEY),\n setLanguage: (l) => {\n if (l === null) ls.removeItem(LANGUAGE_KEY);\n else ls.setItem(LANGUAGE_KEY, l);\n all.notify(\"language\");\n },\n getActiveLegalEntityId: () => ls.getItem(ACTIVE_LE_KEY),\n setActiveLegalEntityId: (id) => {\n if (id === null) ls.removeItem(ACTIVE_LE_KEY);\n else ls.setItem(ACTIVE_LE_KEY, id);\n all.notify(\"activeLegalEntityId\");\n },\n getRefreshToken: () => ls.getItem(REFRESH_KEY),\n setRefreshToken: (t) => {\n if (t === null) ls.removeItem(REFRESH_KEY);\n else ls.setItem(REFRESH_KEY, t);\n all.notify(\"refreshToken\");\n },\n subscribeAll: (l) => all.add(l),\n };\n}\n","import {\n createListenerSet,\n parseAnonymousSession,\n type EmporixStorage,\n type EmporixStorageKey,\n} from \"./index\";\nimport { createMemoryStorage } from \"./memory\";\n\nconst DEFAULT_TOKEN_NAME = \"emporix.customerToken\";\nconst CART_NAME = \"emporix.cartId\";\nconst ANON_NAME = \"emporix.anonymousSession\";\nconst SITE_NAME = \"emporix.siteCode\";\nconst LANGUAGE_NAME = \"emporix.language\";\nconst ACTIVE_LE_NAME = \"emporix.activeLegalEntityId\";\nconst REFRESH_NAME = \"emporix.refreshToken\";\n\n/** Cookie-backed store. Consumer must set SameSite/Secure for CSRF safety. */\nexport function createCookieStorage(\n opts: { name?: string; secure?: boolean; sameSite?: \"lax\" | \"strict\" | \"none\" } = {},\n): EmporixStorage {\n const tokenName = opts.name ?? DEFAULT_TOKEN_NAME;\n const sameSite = opts.sameSite ?? \"lax\";\n const secure = opts.secure ?? false;\n if (typeof document === \"undefined\") {\n // eslint-disable-next-line no-console\n console.warn(\"[emporix] document unavailable; cookie storage falling back to in-memory\");\n return createMemoryStorage();\n }\n const attrs = `path=/; SameSite=${sameSite}${secure ? \"; Secure\" : \"\"}`;\n const readCookie = (name: string): string | null => {\n for (const part of document.cookie.split(\"; \")) {\n const [k, ...v] = part.split(\"=\");\n if (k === name) return decodeURIComponent(v.join(\"=\")) || null;\n }\n return null;\n };\n const writeCookie = (name: string, value: string | null): void => {\n document.cookie =\n value === null\n ? `${name}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; ${attrs}`\n : `${name}=${encodeURIComponent(value)}; ${attrs}`;\n };\n const all = createListenerSet<EmporixStorageKey>();\n return {\n getCustomerToken: () => readCookie(tokenName),\n setCustomerToken: (t) => {\n writeCookie(tokenName, t);\n all.notify(\"customerToken\");\n },\n getCartId: () => readCookie(CART_NAME),\n setCartId: (id) => {\n writeCookie(CART_NAME, id);\n all.notify(\"cartId\");\n },\n getAnonymousSession: () => parseAnonymousSession(readCookie(ANON_NAME)),\n setAnonymousSession: (s) => {\n writeCookie(\n ANON_NAME,\n s === null\n ? null\n : JSON.stringify({ refreshToken: s.refreshToken, sessionId: s.sessionId }),\n );\n all.notify(\"anonymousSession\");\n },\n getSiteCode: () => readCookie(SITE_NAME),\n setSiteCode: (code) => {\n writeCookie(SITE_NAME, code);\n all.notify(\"siteCode\");\n },\n getLanguage: () => readCookie(LANGUAGE_NAME),\n setLanguage: (l) => {\n writeCookie(LANGUAGE_NAME, l);\n all.notify(\"language\");\n },\n getActiveLegalEntityId: () => readCookie(ACTIVE_LE_NAME),\n setActiveLegalEntityId: (id) => {\n writeCookie(ACTIVE_LE_NAME, id);\n all.notify(\"activeLegalEntityId\");\n },\n getRefreshToken: () => readCookie(REFRESH_NAME),\n setRefreshToken: (t) => {\n writeCookie(REFRESH_NAME, t);\n all.notify(\"refreshToken\");\n },\n subscribeAll: (l) => all.add(l),\n };\n}\n","/** Pluggable persistence for SDK session state. SSR-safe by default (memory). */\nexport interface EmporixStorage {\n // Customer token (unchanged).\n getCustomerToken(): string | null;\n setCustomerToken(token: string | null): void;\n subscribe?(listener: (token: string | null) => void): () => void;\n\n // Active guest / customer cart id.\n getCartId(): string | null;\n setCartId(id: string | null): void;\n\n // Anonymous session — used by DefaultTokenProvider (via EmporixProvider\n // wiring) to preserve sessionId across page reloads.\n getAnonymousSession(): PersistedAnonymousSession | null;\n setAnonymousSession(session: PersistedAnonymousSession | null): void;\n\n // Active site code (MS-2). `null` = no site bound yet.\n getSiteCode(): string | null;\n setSiteCode(code: string | null): void;\n\n // Active language (Accept-Language). `null` = use the site/tenant default.\n getLanguage(): string | null;\n setLanguage(language: string | null): void;\n\n // Active legal entity id (B2B). `null` = B2C mode.\n getActiveLegalEntityId(): string | null;\n setActiveLegalEntityId(id: string | null): void;\n\n // Refresh token — optional persistence. When absent, B2B company-switch\n // falls back to a local-state-only update (no server-side token rescope).\n getRefreshToken(): string | null;\n setRefreshToken(token: string | null): void;\n\n /**\n * Subscribe to any storage write. The listener receives the key that\n * changed. Returns an unsubscribe function. Optional — backends may no-op.\n * Used by the telemetry layer to emit `storage.write` events.\n */\n subscribeAll?(\n listener: (key: EmporixStorageKey) => void,\n ): () => void;\n}\n\n/** Minimal subset of `AnonymousSession` that needs to outlive a page load. */\nexport interface PersistedAnonymousSession {\n refreshToken: string;\n sessionId: string;\n}\n\n/** Backward-compat alias. New code should prefer `EmporixStorage`. */\nexport type TokenStorage = EmporixStorage;\n\n/** Keys that participate in {@link EmporixStorage.subscribeAll}. */\nexport type EmporixStorageKey =\n | \"customerToken\"\n | \"cartId\"\n | \"siteCode\"\n | \"language\"\n | \"anonymousSession\"\n | \"activeLegalEntityId\"\n | \"refreshToken\";\n\n/**\n * Internal: create a swallow-on-throw listener set used by all three storage\n * backends for `subscribeAll`. Centralizes the try/catch wrapper so a buggy\n * telemetry handler never breaks a storage write.\n */\nexport function createListenerSet<T>(): {\n add(l: (value: T) => void): () => void;\n notify(value: T): void;\n} {\n const listeners = new Set<(v: T) => void>();\n return {\n add(l) {\n listeners.add(l);\n return () => listeners.delete(l);\n },\n notify(value) {\n for (const l of listeners) {\n try {\n l(value);\n } catch {\n // Swallow handler errors; telemetry must never break writes.\n }\n }\n },\n };\n}\n\n/**\n * Internal: parses a raw `anonymousSession` JSON payload (from localStorage\n * or a cookie) into a {@link PersistedAnonymousSession}. Returns `null` for\n * any malformed or missing input.\n */\nexport function parseAnonymousSession(raw: string | null): PersistedAnonymousSession | null {\n if (!raw) return null;\n try {\n const parsed = JSON.parse(raw) as Partial<PersistedAnonymousSession>;\n if (typeof parsed.refreshToken === \"string\" && typeof parsed.sessionId === \"string\") {\n return { refreshToken: parsed.refreshToken, sessionId: parsed.sessionId };\n }\n return null;\n } catch {\n return null;\n }\n}\n\nexport { createMemoryStorage } from \"./memory\";\nexport { createLocalStorageStorage } from \"./local-storage\";\nexport { createCookieStorage } from \"./cookie\";\n"]}
@@ -26,6 +26,8 @@ interface EmporixStorage {
26
26
  setAnonymousSession(session: PersistedAnonymousSession | null): void;
27
27
  getSiteCode(): string | null;
28
28
  setSiteCode(code: string | null): void;
29
+ getLanguage(): string | null;
30
+ setLanguage(language: string | null): void;
29
31
  getActiveLegalEntityId(): string | null;
30
32
  setActiveLegalEntityId(id: string | null): void;
31
33
  getRefreshToken(): string | null;
@@ -45,7 +47,7 @@ interface PersistedAnonymousSession {
45
47
  /** Backward-compat alias. New code should prefer `EmporixStorage`. */
46
48
  type TokenStorage = EmporixStorage;
47
49
  /** Keys that participate in {@link EmporixStorage.subscribeAll}. */
48
- type EmporixStorageKey = "customerToken" | "cartId" | "siteCode" | "anonymousSession" | "activeLegalEntityId" | "refreshToken";
50
+ type EmporixStorageKey = "customerToken" | "cartId" | "siteCode" | "language" | "anonymousSession" | "activeLegalEntityId" | "refreshToken";
49
51
  /**
50
52
  * Internal: create a swallow-on-throw listener set used by all three storage
51
53
  * backends for `subscribeAll`. Centralizes the try/catch wrapper so a buggy
package/dist/storage.d.ts CHANGED
@@ -26,6 +26,8 @@ interface EmporixStorage {
26
26
  setAnonymousSession(session: PersistedAnonymousSession | null): void;
27
27
  getSiteCode(): string | null;
28
28
  setSiteCode(code: string | null): void;
29
+ getLanguage(): string | null;
30
+ setLanguage(language: string | null): void;
29
31
  getActiveLegalEntityId(): string | null;
30
32
  setActiveLegalEntityId(id: string | null): void;
31
33
  getRefreshToken(): string | null;
@@ -45,7 +47,7 @@ interface PersistedAnonymousSession {
45
47
  /** Backward-compat alias. New code should prefer `EmporixStorage`. */
46
48
  type TokenStorage = EmporixStorage;
47
49
  /** Keys that participate in {@link EmporixStorage.subscribeAll}. */
48
- type EmporixStorageKey = "customerToken" | "cartId" | "siteCode" | "anonymousSession" | "activeLegalEntityId" | "refreshToken";
50
+ type EmporixStorageKey = "customerToken" | "cartId" | "siteCode" | "language" | "anonymousSession" | "activeLegalEntityId" | "refreshToken";
49
51
  /**
50
52
  * Internal: create a swallow-on-throw listener set used by all three storage
51
53
  * backends for `subscribeAll`. Centralizes the try/catch wrapper so a buggy
package/dist/storage.js CHANGED
@@ -1,3 +1,3 @@
1
- export { createCookieStorage, createListenerSet, createLocalStorageStorage, createMemoryStorage, parseAnonymousSession } from './chunk-FBQY2N7S.js';
1
+ export { createCookieStorage, createListenerSet, createLocalStorageStorage, createMemoryStorage, parseAnonymousSession } from './chunk-VMDBYVWG.js';
2
2
  //# sourceMappingURL=storage.js.map
3
3
  //# sourceMappingURL=storage.js.map
@@ -1,7 +1,7 @@
1
- import { Customer, AuthContext, Product, PaginatedItems, ShoppingListItem, ShoppingListDraft, ShoppingList, Category, Cart, CartItemInput, CartItemUpdate, CartAddress, CartCreated, CreateCartInput, CheckoutResult, CheckoutInput, QuoteCheckoutInput, PaymentMode, PriceMatchByContextInput, PriceMatch, Media, SegmentCategoryTree, SegmentItem, Segment, PasswordChangeInput, CustomerUpdateInput, Address, AddressCreateInput, AddressUpdateInput, PasswordResetRequestInput, PasswordResetConfirmInput, Site, LegalEntity, ContactAssignment, Location, IamGroup, IamGroupMemberAssignment, ContactAssignmentCreate, LegalEntityCreate, LocationCreate, LegalEntityUpdate, ContactAssignmentUpdate, LocationUpdate, OrderStatus, Order, SalesOrderPatch, Availability, RedemptionInput, RedemptionCreated, PointsSummary, RedeemOptionList, RedeemCouponResult, RedeemMyPointsInput, ReturnCreated, ReturnInput, ReturnList, Return } from '@viu/emporix-sdk';
1
+ import { Customer, AuthContext, Product, PaginatedItems, ShoppingListItem, ShoppingListDraft, ShoppingList, Category, Cart, CartItemInput, CartItemUpdate, CartAddress, CartCreated, CreateCartInput, CheckoutResult, CheckoutInput, QuoteCheckoutInput, PaymentMode, PriceMatchByContextInput, PriceMatch, Media, SegmentCategoryTree, SegmentItem, Segment, PasswordChangeInput, CustomerUpdateInput, Address, AddressCreateInput, AddressUpdateInput, PasswordResetRequestInput, PasswordResetConfirmInput, Site, LegalEntity, ContactAssignment, Location, IamGroup, IamGroupMemberAssignment, ContactAssignmentCreate, LegalEntityCreate, LocationCreate, LegalEntityUpdate, ContactAssignmentUpdate, LocationUpdate, InvokeCloudFunctionOptions, OrderStatus, Order, SalesOrderPatch, Availability, RedemptionInput, RedemptionCreated, PointsSummary, RedeemOptionList, RedeemCouponResult, RedeemMyPointsInput, ReturnCreated, ReturnInput, ReturnList, Return } from '@viu/emporix-sdk';
2
2
  import * as _tanstack_react_query from '@tanstack/react-query';
3
3
  import { UseQueryResult, UseInfiniteQueryResult, UseMutationResult } from '@tanstack/react-query';
4
- import { S as SiteContextValue } from './provider-CfgMAu8B.cjs';
4
+ import { S as SiteContextValue } from './provider-Bcb-tOpS.js';
5
5
 
6
6
  /** Customer authentication state and actions. */
7
7
  interface CustomerSessionApi {
@@ -531,6 +531,31 @@ interface CompanySwitcherApi {
531
531
  /** UI-friendly wrapper around useActiveCompany — exposes switch/clear pair. */
532
532
  declare function useCompanySwitcher(): CompanySwitcherApi;
533
533
 
534
+ /** Variables for {@link useInvokeCloudFunction}. */
535
+ interface InvokeCloudFunctionVars<TReq = unknown> extends InvokeCloudFunctionOptions<TReq> {
536
+ functionId: string;
537
+ /** Override the auto-resolved auth (customer-if-token-else-anonymous). */
538
+ auth?: AuthContext;
539
+ }
540
+ /**
541
+ * Imperatively invoke a cloud function (any method). Auth is resolved
542
+ * automatically (customer if a token is stored, else anonymous) unless an
543
+ * explicit `auth` is passed in the variables. Service auth is intentionally
544
+ * not exposed in React.
545
+ */
546
+ declare function useInvokeCloudFunction<TRes = unknown, TReq = unknown>(): UseMutationResult<TRes, unknown, InvokeCloudFunctionVars<TReq>>;
547
+ /**
548
+ * Query a (read-style) cloud function with React-Query caching. Defaults to
549
+ * GET. Disabled while `functionId` is `undefined`. Auth resolves like
550
+ * {@link useInvokeCloudFunction}; pass `options.auth` to override.
551
+ */
552
+ declare function useCloudFunction<TRes = unknown>(functionId: string | undefined, options?: InvokeCloudFunctionOptions & {
553
+ auth?: AuthContext;
554
+ }, queryOptions?: {
555
+ enabled?: boolean;
556
+ staleTime?: number;
557
+ }): UseQueryResult<TRes>;
558
+
534
559
  /** Options for `useMyOrders`. Passing `legalEntityId: null` disables the active-company auto-default. */
535
560
  interface UseMyOrdersOptions {
536
561
  pageNumber?: number;
@@ -673,4 +698,4 @@ declare function useReturn(returnId: string | undefined): UseQueryResult<Return>
673
698
  /** Create a return for the signed-in customer. Invalidates the returns list. */
674
699
  declare function useCreateReturn(): UseMutationResult<ReturnCreated, unknown, ReturnInput>;
675
700
 
676
- export { useMyOrders as $, type AddressMutationsApi as A, useCategory as B, type CartMutationsApi as C, useCategoryTree as D, useChangePassword as E, useCheckout as F, useCompany as G, useCompanyContacts as H, useCompanyGroups as I, useCompanyLocations as J, useCompanySwitcher as K, useCreateCart as L, useCreateCompany as M, useCreateLocation as N, useCreateReturn as O, type PasswordResetApi as P, useCreateShoppingList as Q, useCustomerAddresses as R, useCustomerSession as S, useDefaultSite as T, type UseAvailabilitiesOptions as U, useDeleteCompany as V, useDeleteLocation as W, useDeleteShoppingList as X, useMatchPrices as Y, useMatchPricesChunked as Z, useMyCompanies as _, type CheckoutApi as a, useMyOrdersInfinite as a0, useMyReturns as a1, useMyRewardPoints as a2, useMyRewardPointsSummary as a3, useMySegmentCategories as a4, useMySegmentCategoriesInfinite as a5, useMySegmentCategoryTree as a6, useMySegmentItems as a7, useMySegmentProducts as a8, useMySegmentProductsInfinite as a9, useSites as aA, useSubcategories as aB, useUnassignContact as aC, useUpdateCompany as aD, useUpdateContactAssignment as aE, useUpdateCustomer as aF, useUpdateLocation as aG, useUpdateSalesOrder as aH, useValidateCoupon as aI, useVariantChildren as aJ, useMySegments as aa, useOrder as ab, useOrderTransition as ac, usePasswordReset as ad, usePaymentModes as ae, useProduct as af, useProductByCode as ag, useProductMedia as ah, useProductNameSearch as ai, useProductSearch as aj, useProducts as ak, useProductsByCodes as al, useProductsInCategory as am, useProductsInCategoryInfinite as an, useProductsInfinite as ao, useRedeemCoupon as ap, useRedeemOptions as aq, useRedeemRewardPoints as ar, useRemoveFromShoppingList as as, useRemoveGroupMember as at, useReorder as au, useReturn as av, useSalesOrder as aw, useSetShoppingListItemQuantity as ax, useShoppingLists as ay, useSiteContext as az, type CompanySwitcherApi as b, type CouponActionVars as c, type CustomerSessionApi as d, type UseAvailabilityOptions as e, type UseCancelOrderVars as f, type UseMyOrdersInfiniteOptions as g, type UseMyOrdersOptions as h, type UseOrderOptions as i, type UseOrderTransitionVars as j, type UseReorderResult as k, type UseReorderVars as l, type UseUpdateSalesOrderVars as m, type UseVariantChildrenOptions as n, useAddGroupMember as o, useAddToShoppingList as p, useAddressMutations as q, useAssignContact as r, useAvailabilities as s, useAvailability as t, useActiveCart as u, useCancelOrder as v, useCart as w, useCartMutations as x, useCategories as y, useCategoriesInfinite as z };
701
+ export { useMatchPrices as $, type AddressMutationsApi as A, useCategory as B, type CartMutationsApi as C, useCategoryTree as D, useChangePassword as E, useCheckout as F, useCloudFunction as G, useCompany as H, type InvokeCloudFunctionVars as I, useCompanyContacts as J, useCompanyGroups as K, useCompanyLocations as L, useCompanySwitcher as M, useCreateCart as N, useCreateCompany as O, type PasswordResetApi as P, useCreateLocation as Q, useCreateReturn as R, useCreateShoppingList as S, useCustomerAddresses as T, type UseAvailabilitiesOptions as U, useCustomerSession as V, useDefaultSite as W, useDeleteCompany as X, useDeleteLocation as Y, useDeleteShoppingList as Z, useInvokeCloudFunction as _, type CheckoutApi as a, useMatchPricesChunked as a0, useMyCompanies as a1, useMyOrders as a2, useMyOrdersInfinite as a3, useMyReturns as a4, useMyRewardPoints as a5, useMyRewardPointsSummary as a6, useMySegmentCategories as a7, useMySegmentCategoriesInfinite as a8, useMySegmentCategoryTree as a9, useSetShoppingListItemQuantity as aA, useShoppingLists as aB, useSiteContext as aC, useSites as aD, useSubcategories as aE, useUnassignContact as aF, useUpdateCompany as aG, useUpdateContactAssignment as aH, useUpdateCustomer as aI, useUpdateLocation as aJ, useUpdateSalesOrder as aK, useValidateCoupon as aL, useVariantChildren as aM, useMySegmentItems as aa, useMySegmentProducts as ab, useMySegmentProductsInfinite as ac, useMySegments as ad, useOrder as ae, useOrderTransition as af, usePasswordReset as ag, usePaymentModes as ah, useProduct as ai, useProductByCode as aj, useProductMedia as ak, useProductNameSearch as al, useProductSearch as am, useProducts as an, useProductsByCodes as ao, useProductsInCategory as ap, useProductsInCategoryInfinite as aq, useProductsInfinite as ar, useRedeemCoupon as as, useRedeemOptions as at, useRedeemRewardPoints as au, useRemoveFromShoppingList as av, useRemoveGroupMember as aw, useReorder as ax, useReturn as ay, useSalesOrder as az, type CompanySwitcherApi as b, type CouponActionVars as c, type CustomerSessionApi as d, type UseAvailabilityOptions as e, type UseCancelOrderVars as f, type UseMyOrdersInfiniteOptions as g, type UseMyOrdersOptions as h, type UseOrderOptions as i, type UseOrderTransitionVars as j, type UseReorderResult as k, type UseReorderVars as l, type UseUpdateSalesOrderVars as m, type UseVariantChildrenOptions as n, useAddGroupMember as o, useAddToShoppingList as p, useAddressMutations as q, useAssignContact as r, useAvailabilities as s, useAvailability as t, useActiveCart as u, useCancelOrder as v, useCart as w, useCartMutations as x, useCategories as y, useCategoriesInfinite as z };
@@ -1,7 +1,7 @@
1
- import { Customer, AuthContext, Product, PaginatedItems, ShoppingListItem, ShoppingListDraft, ShoppingList, Category, Cart, CartItemInput, CartItemUpdate, CartAddress, CartCreated, CreateCartInput, CheckoutResult, CheckoutInput, QuoteCheckoutInput, PaymentMode, PriceMatchByContextInput, PriceMatch, Media, SegmentCategoryTree, SegmentItem, Segment, PasswordChangeInput, CustomerUpdateInput, Address, AddressCreateInput, AddressUpdateInput, PasswordResetRequestInput, PasswordResetConfirmInput, Site, LegalEntity, ContactAssignment, Location, IamGroup, IamGroupMemberAssignment, ContactAssignmentCreate, LegalEntityCreate, LocationCreate, LegalEntityUpdate, ContactAssignmentUpdate, LocationUpdate, OrderStatus, Order, SalesOrderPatch, Availability, RedemptionInput, RedemptionCreated, PointsSummary, RedeemOptionList, RedeemCouponResult, RedeemMyPointsInput, ReturnCreated, ReturnInput, ReturnList, Return } from '@viu/emporix-sdk';
1
+ import { Customer, AuthContext, Product, PaginatedItems, ShoppingListItem, ShoppingListDraft, ShoppingList, Category, Cart, CartItemInput, CartItemUpdate, CartAddress, CartCreated, CreateCartInput, CheckoutResult, CheckoutInput, QuoteCheckoutInput, PaymentMode, PriceMatchByContextInput, PriceMatch, Media, SegmentCategoryTree, SegmentItem, Segment, PasswordChangeInput, CustomerUpdateInput, Address, AddressCreateInput, AddressUpdateInput, PasswordResetRequestInput, PasswordResetConfirmInput, Site, LegalEntity, ContactAssignment, Location, IamGroup, IamGroupMemberAssignment, ContactAssignmentCreate, LegalEntityCreate, LocationCreate, LegalEntityUpdate, ContactAssignmentUpdate, LocationUpdate, InvokeCloudFunctionOptions, OrderStatus, Order, SalesOrderPatch, Availability, RedemptionInput, RedemptionCreated, PointsSummary, RedeemOptionList, RedeemCouponResult, RedeemMyPointsInput, ReturnCreated, ReturnInput, ReturnList, Return } from '@viu/emporix-sdk';
2
2
  import * as _tanstack_react_query from '@tanstack/react-query';
3
3
  import { UseQueryResult, UseInfiniteQueryResult, UseMutationResult } from '@tanstack/react-query';
4
- import { S as SiteContextValue } from './provider--y2yz3Jj.js';
4
+ import { S as SiteContextValue } from './provider-Ddo7aSOI.cjs';
5
5
 
6
6
  /** Customer authentication state and actions. */
7
7
  interface CustomerSessionApi {
@@ -531,6 +531,31 @@ interface CompanySwitcherApi {
531
531
  /** UI-friendly wrapper around useActiveCompany — exposes switch/clear pair. */
532
532
  declare function useCompanySwitcher(): CompanySwitcherApi;
533
533
 
534
+ /** Variables for {@link useInvokeCloudFunction}. */
535
+ interface InvokeCloudFunctionVars<TReq = unknown> extends InvokeCloudFunctionOptions<TReq> {
536
+ functionId: string;
537
+ /** Override the auto-resolved auth (customer-if-token-else-anonymous). */
538
+ auth?: AuthContext;
539
+ }
540
+ /**
541
+ * Imperatively invoke a cloud function (any method). Auth is resolved
542
+ * automatically (customer if a token is stored, else anonymous) unless an
543
+ * explicit `auth` is passed in the variables. Service auth is intentionally
544
+ * not exposed in React.
545
+ */
546
+ declare function useInvokeCloudFunction<TRes = unknown, TReq = unknown>(): UseMutationResult<TRes, unknown, InvokeCloudFunctionVars<TReq>>;
547
+ /**
548
+ * Query a (read-style) cloud function with React-Query caching. Defaults to
549
+ * GET. Disabled while `functionId` is `undefined`. Auth resolves like
550
+ * {@link useInvokeCloudFunction}; pass `options.auth` to override.
551
+ */
552
+ declare function useCloudFunction<TRes = unknown>(functionId: string | undefined, options?: InvokeCloudFunctionOptions & {
553
+ auth?: AuthContext;
554
+ }, queryOptions?: {
555
+ enabled?: boolean;
556
+ staleTime?: number;
557
+ }): UseQueryResult<TRes>;
558
+
534
559
  /** Options for `useMyOrders`. Passing `legalEntityId: null` disables the active-company auto-default. */
535
560
  interface UseMyOrdersOptions {
536
561
  pageNumber?: number;
@@ -673,4 +698,4 @@ declare function useReturn(returnId: string | undefined): UseQueryResult<Return>
673
698
  /** Create a return for the signed-in customer. Invalidates the returns list. */
674
699
  declare function useCreateReturn(): UseMutationResult<ReturnCreated, unknown, ReturnInput>;
675
700
 
676
- export { useMyOrders as $, type AddressMutationsApi as A, useCategory as B, type CartMutationsApi as C, useCategoryTree as D, useChangePassword as E, useCheckout as F, useCompany as G, useCompanyContacts as H, useCompanyGroups as I, useCompanyLocations as J, useCompanySwitcher as K, useCreateCart as L, useCreateCompany as M, useCreateLocation as N, useCreateReturn as O, type PasswordResetApi as P, useCreateShoppingList as Q, useCustomerAddresses as R, useCustomerSession as S, useDefaultSite as T, type UseAvailabilitiesOptions as U, useDeleteCompany as V, useDeleteLocation as W, useDeleteShoppingList as X, useMatchPrices as Y, useMatchPricesChunked as Z, useMyCompanies as _, type CheckoutApi as a, useMyOrdersInfinite as a0, useMyReturns as a1, useMyRewardPoints as a2, useMyRewardPointsSummary as a3, useMySegmentCategories as a4, useMySegmentCategoriesInfinite as a5, useMySegmentCategoryTree as a6, useMySegmentItems as a7, useMySegmentProducts as a8, useMySegmentProductsInfinite as a9, useSites as aA, useSubcategories as aB, useUnassignContact as aC, useUpdateCompany as aD, useUpdateContactAssignment as aE, useUpdateCustomer as aF, useUpdateLocation as aG, useUpdateSalesOrder as aH, useValidateCoupon as aI, useVariantChildren as aJ, useMySegments as aa, useOrder as ab, useOrderTransition as ac, usePasswordReset as ad, usePaymentModes as ae, useProduct as af, useProductByCode as ag, useProductMedia as ah, useProductNameSearch as ai, useProductSearch as aj, useProducts as ak, useProductsByCodes as al, useProductsInCategory as am, useProductsInCategoryInfinite as an, useProductsInfinite as ao, useRedeemCoupon as ap, useRedeemOptions as aq, useRedeemRewardPoints as ar, useRemoveFromShoppingList as as, useRemoveGroupMember as at, useReorder as au, useReturn as av, useSalesOrder as aw, useSetShoppingListItemQuantity as ax, useShoppingLists as ay, useSiteContext as az, type CompanySwitcherApi as b, type CouponActionVars as c, type CustomerSessionApi as d, type UseAvailabilityOptions as e, type UseCancelOrderVars as f, type UseMyOrdersInfiniteOptions as g, type UseMyOrdersOptions as h, type UseOrderOptions as i, type UseOrderTransitionVars as j, type UseReorderResult as k, type UseReorderVars as l, type UseUpdateSalesOrderVars as m, type UseVariantChildrenOptions as n, useAddGroupMember as o, useAddToShoppingList as p, useAddressMutations as q, useAssignContact as r, useAvailabilities as s, useAvailability as t, useActiveCart as u, useCancelOrder as v, useCart as w, useCartMutations as x, useCategories as y, useCategoriesInfinite as z };
701
+ export { useMatchPrices as $, type AddressMutationsApi as A, useCategory as B, type CartMutationsApi as C, useCategoryTree as D, useChangePassword as E, useCheckout as F, useCloudFunction as G, useCompany as H, type InvokeCloudFunctionVars as I, useCompanyContacts as J, useCompanyGroups as K, useCompanyLocations as L, useCompanySwitcher as M, useCreateCart as N, useCreateCompany as O, type PasswordResetApi as P, useCreateLocation as Q, useCreateReturn as R, useCreateShoppingList as S, useCustomerAddresses as T, type UseAvailabilitiesOptions as U, useCustomerSession as V, useDefaultSite as W, useDeleteCompany as X, useDeleteLocation as Y, useDeleteShoppingList as Z, useInvokeCloudFunction as _, type CheckoutApi as a, useMatchPricesChunked as a0, useMyCompanies as a1, useMyOrders as a2, useMyOrdersInfinite as a3, useMyReturns as a4, useMyRewardPoints as a5, useMyRewardPointsSummary as a6, useMySegmentCategories as a7, useMySegmentCategoriesInfinite as a8, useMySegmentCategoryTree as a9, useSetShoppingListItemQuantity as aA, useShoppingLists as aB, useSiteContext as aC, useSites as aD, useSubcategories as aE, useUnassignContact as aF, useUpdateCompany as aG, useUpdateContactAssignment as aH, useUpdateCustomer as aI, useUpdateLocation as aJ, useUpdateSalesOrder as aK, useValidateCoupon as aL, useVariantChildren as aM, useMySegmentItems as aa, useMySegmentProducts as ab, useMySegmentProductsInfinite as ac, useMySegments as ad, useOrder as ae, useOrderTransition as af, usePasswordReset as ag, usePaymentModes as ah, useProduct as ai, useProductByCode as aj, useProductMedia as ak, useProductNameSearch as al, useProductSearch as am, useProducts as an, useProductsByCodes as ao, useProductsInCategory as ap, useProductsInCategoryInfinite as aq, useProductsInfinite as ar, useRedeemCoupon as as, useRedeemOptions as at, useRedeemRewardPoints as au, useRemoveFromShoppingList as av, useRemoveGroupMember as aw, useReorder as ax, useReturn as ay, useSalesOrder as az, type CompanySwitcherApi as b, type CouponActionVars as c, type CustomerSessionApi as d, type UseAvailabilityOptions as e, type UseCancelOrderVars as f, type UseMyOrdersInfiniteOptions as g, type UseMyOrdersOptions as h, type UseOrderOptions as i, type UseOrderTransitionVars as j, type UseReorderResult as k, type UseReorderVars as l, type UseUpdateSalesOrderVars as m, type UseVariantChildrenOptions as n, useAddGroupMember as o, useAddToShoppingList as p, useAddressMutations as q, useAssignContact as r, useAvailabilities as s, useAvailability as t, useActiveCart as u, useCancelOrder as v, useCart as w, useCartMutations as x, useCategories as y, useCategoriesInfinite as z };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@viu/emporix-sdk-react",
3
- "version": "2.10.0",
3
+ "version": "2.12.0",
4
4
  "description": "React bindings for the Emporix SDK",
5
5
  "license": "MIT",
6
6
  "author": {
@@ -71,7 +71,7 @@
71
71
  "peerDependencies": {
72
72
  "@tanstack/react-query": "^5.51.0",
73
73
  "react": "^18.0.0 || ^19.0.0",
74
- "@viu/emporix-sdk": "^2.10.0"
74
+ "@viu/emporix-sdk": "^2.12.0"
75
75
  },
76
76
  "devDependencies": {
77
77
  "@tanstack/react-query": "^5.51.0",
@@ -93,7 +93,7 @@
93
93
  "typescript": "^5.6.0",
94
94
  "undici": "^6.19.0",
95
95
  "vitest": "^2.0.0",
96
- "@viu/emporix-sdk": "2.10.0"
96
+ "@viu/emporix-sdk": "2.12.0"
97
97
  },
98
98
  "scripts": {
99
99
  "build": "tsup",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/storage/memory.ts","../src/storage/local-storage.ts","../src/storage/cookie.ts","../src/storage/index.ts"],"names":[],"mappings":"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","file":"chunk-FBQY2N7S.js","sourcesContent":["import {\n createListenerSet,\n type EmporixStorage,\n type EmporixStorageKey,\n type PersistedAnonymousSession,\n} from \"./index\";\n\n/** In-memory token store. Default, SSR-safe, no persistence. */\nexport function createMemoryStorage(opts: { initial?: string } = {}): EmporixStorage {\n let token: string | null = opts.initial ?? null;\n let cartId: string | null = null;\n let anon: PersistedAnonymousSession | null = null;\n let siteCode: string | null = null;\n let activeLegalEntityId: string | null = null;\n let refreshToken: string | null = null;\n const tokenListeners = new Set<(t: string | null) => void>();\n const all = createListenerSet<EmporixStorageKey>();\n return {\n getCustomerToken: () => token,\n setCustomerToken: (t) => {\n token = t;\n for (const l of tokenListeners) l(token);\n all.notify(\"customerToken\");\n },\n subscribe: (l) => {\n tokenListeners.add(l);\n return () => tokenListeners.delete(l);\n },\n getCartId: () => cartId,\n setCartId: (id) => {\n cartId = id;\n all.notify(\"cartId\");\n },\n getAnonymousSession: () => anon,\n setAnonymousSession: (s) => {\n anon = s;\n all.notify(\"anonymousSession\");\n },\n getSiteCode: () => siteCode,\n setSiteCode: (code) => {\n siteCode = code;\n all.notify(\"siteCode\");\n },\n getActiveLegalEntityId: () => activeLegalEntityId,\n setActiveLegalEntityId: (id) => {\n activeLegalEntityId = id;\n all.notify(\"activeLegalEntityId\");\n },\n getRefreshToken: () => refreshToken,\n setRefreshToken: (t) => {\n refreshToken = t;\n all.notify(\"refreshToken\");\n },\n subscribeAll: (l) => all.add(l),\n };\n}\n","import {\n createListenerSet,\n parseAnonymousSession,\n type EmporixStorage,\n type EmporixStorageKey,\n} from \"./index\";\nimport { createMemoryStorage } from \"./memory\";\n\nconst DEFAULT_TOKEN_KEY = \"emporix.customerToken\";\nconst CART_KEY = \"emporix.cartId\";\nconst ANON_KEY = \"emporix.anonymousSession\";\nconst SITE_KEY = \"emporix.siteCode\";\nconst ACTIVE_LE_KEY = \"emporix.activeLegalEntityId\";\nconst REFRESH_KEY = \"emporix.refreshToken\";\n\n/** Browser `localStorage`-backed store. Falls back to memory on the server. */\nexport function createLocalStorageStorage(opts: { key?: string } = {}): EmporixStorage {\n const tokenKey = opts.key ?? DEFAULT_TOKEN_KEY;\n const available =\n typeof globalThis !== \"undefined\" &&\n typeof (globalThis as { localStorage?: Storage }).localStorage !== \"undefined\";\n if (!available) {\n // eslint-disable-next-line no-console\n console.warn(\"[emporix] localStorage unavailable; falling back to in-memory storage\");\n return createMemoryStorage();\n }\n const ls = (globalThis as unknown as { localStorage: Storage }).localStorage;\n const tokenListeners = new Set<(t: string | null) => void>();\n const all = createListenerSet<EmporixStorageKey>();\n return {\n getCustomerToken: () => ls.getItem(tokenKey),\n setCustomerToken: (t) => {\n if (t === null) ls.removeItem(tokenKey);\n else ls.setItem(tokenKey, t);\n for (const l of tokenListeners) l(t);\n all.notify(\"customerToken\");\n },\n subscribe: (l) => {\n tokenListeners.add(l);\n return () => tokenListeners.delete(l);\n },\n getCartId: () => ls.getItem(CART_KEY),\n setCartId: (id) => {\n if (id === null) ls.removeItem(CART_KEY);\n else ls.setItem(CART_KEY, id);\n all.notify(\"cartId\");\n },\n getAnonymousSession: () => parseAnonymousSession(ls.getItem(ANON_KEY)),\n setAnonymousSession: (s) => {\n if (s === null) ls.removeItem(ANON_KEY);\n else ls.setItem(ANON_KEY, JSON.stringify({ refreshToken: s.refreshToken, sessionId: s.sessionId }));\n all.notify(\"anonymousSession\");\n },\n getSiteCode: () => ls.getItem(SITE_KEY),\n setSiteCode: (code) => {\n if (code === null) ls.removeItem(SITE_KEY);\n else ls.setItem(SITE_KEY, code);\n all.notify(\"siteCode\");\n },\n getActiveLegalEntityId: () => ls.getItem(ACTIVE_LE_KEY),\n setActiveLegalEntityId: (id) => {\n if (id === null) ls.removeItem(ACTIVE_LE_KEY);\n else ls.setItem(ACTIVE_LE_KEY, id);\n all.notify(\"activeLegalEntityId\");\n },\n getRefreshToken: () => ls.getItem(REFRESH_KEY),\n setRefreshToken: (t) => {\n if (t === null) ls.removeItem(REFRESH_KEY);\n else ls.setItem(REFRESH_KEY, t);\n all.notify(\"refreshToken\");\n },\n subscribeAll: (l) => all.add(l),\n };\n}\n","import {\n createListenerSet,\n parseAnonymousSession,\n type EmporixStorage,\n type EmporixStorageKey,\n} from \"./index\";\nimport { createMemoryStorage } from \"./memory\";\n\nconst DEFAULT_TOKEN_NAME = \"emporix.customerToken\";\nconst CART_NAME = \"emporix.cartId\";\nconst ANON_NAME = \"emporix.anonymousSession\";\nconst SITE_NAME = \"emporix.siteCode\";\nconst ACTIVE_LE_NAME = \"emporix.activeLegalEntityId\";\nconst REFRESH_NAME = \"emporix.refreshToken\";\n\n/** Cookie-backed store. Consumer must set SameSite/Secure for CSRF safety. */\nexport function createCookieStorage(\n opts: { name?: string; secure?: boolean; sameSite?: \"lax\" | \"strict\" | \"none\" } = {},\n): EmporixStorage {\n const tokenName = opts.name ?? DEFAULT_TOKEN_NAME;\n const sameSite = opts.sameSite ?? \"lax\";\n const secure = opts.secure ?? false;\n if (typeof document === \"undefined\") {\n // eslint-disable-next-line no-console\n console.warn(\"[emporix] document unavailable; cookie storage falling back to in-memory\");\n return createMemoryStorage();\n }\n const attrs = `path=/; SameSite=${sameSite}${secure ? \"; Secure\" : \"\"}`;\n const readCookie = (name: string): string | null => {\n for (const part of document.cookie.split(\"; \")) {\n const [k, ...v] = part.split(\"=\");\n if (k === name) return decodeURIComponent(v.join(\"=\")) || null;\n }\n return null;\n };\n const writeCookie = (name: string, value: string | null): void => {\n document.cookie =\n value === null\n ? `${name}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; ${attrs}`\n : `${name}=${encodeURIComponent(value)}; ${attrs}`;\n };\n const all = createListenerSet<EmporixStorageKey>();\n return {\n getCustomerToken: () => readCookie(tokenName),\n setCustomerToken: (t) => {\n writeCookie(tokenName, t);\n all.notify(\"customerToken\");\n },\n getCartId: () => readCookie(CART_NAME),\n setCartId: (id) => {\n writeCookie(CART_NAME, id);\n all.notify(\"cartId\");\n },\n getAnonymousSession: () => parseAnonymousSession(readCookie(ANON_NAME)),\n setAnonymousSession: (s) => {\n writeCookie(\n ANON_NAME,\n s === null\n ? null\n : JSON.stringify({ refreshToken: s.refreshToken, sessionId: s.sessionId }),\n );\n all.notify(\"anonymousSession\");\n },\n getSiteCode: () => readCookie(SITE_NAME),\n setSiteCode: (code) => {\n writeCookie(SITE_NAME, code);\n all.notify(\"siteCode\");\n },\n getActiveLegalEntityId: () => readCookie(ACTIVE_LE_NAME),\n setActiveLegalEntityId: (id) => {\n writeCookie(ACTIVE_LE_NAME, id);\n all.notify(\"activeLegalEntityId\");\n },\n getRefreshToken: () => readCookie(REFRESH_NAME),\n setRefreshToken: (t) => {\n writeCookie(REFRESH_NAME, t);\n all.notify(\"refreshToken\");\n },\n subscribeAll: (l) => all.add(l),\n };\n}\n","/** Pluggable persistence for SDK session state. SSR-safe by default (memory). */\nexport interface EmporixStorage {\n // Customer token (unchanged).\n getCustomerToken(): string | null;\n setCustomerToken(token: string | null): void;\n subscribe?(listener: (token: string | null) => void): () => void;\n\n // Active guest / customer cart id.\n getCartId(): string | null;\n setCartId(id: string | null): void;\n\n // Anonymous session — used by DefaultTokenProvider (via EmporixProvider\n // wiring) to preserve sessionId across page reloads.\n getAnonymousSession(): PersistedAnonymousSession | null;\n setAnonymousSession(session: PersistedAnonymousSession | null): void;\n\n // Active site code (MS-2). `null` = no site bound yet.\n getSiteCode(): string | null;\n setSiteCode(code: string | null): void;\n\n // Active legal entity id (B2B). `null` = B2C mode.\n getActiveLegalEntityId(): string | null;\n setActiveLegalEntityId(id: string | null): void;\n\n // Refresh token — optional persistence. When absent, B2B company-switch\n // falls back to a local-state-only update (no server-side token rescope).\n getRefreshToken(): string | null;\n setRefreshToken(token: string | null): void;\n\n /**\n * Subscribe to any storage write. The listener receives the key that\n * changed. Returns an unsubscribe function. Optional — backends may no-op.\n * Used by the telemetry layer to emit `storage.write` events.\n */\n subscribeAll?(\n listener: (key: EmporixStorageKey) => void,\n ): () => void;\n}\n\n/** Minimal subset of `AnonymousSession` that needs to outlive a page load. */\nexport interface PersistedAnonymousSession {\n refreshToken: string;\n sessionId: string;\n}\n\n/** Backward-compat alias. New code should prefer `EmporixStorage`. */\nexport type TokenStorage = EmporixStorage;\n\n/** Keys that participate in {@link EmporixStorage.subscribeAll}. */\nexport type EmporixStorageKey =\n | \"customerToken\"\n | \"cartId\"\n | \"siteCode\"\n | \"anonymousSession\"\n | \"activeLegalEntityId\"\n | \"refreshToken\";\n\n/**\n * Internal: create a swallow-on-throw listener set used by all three storage\n * backends for `subscribeAll`. Centralizes the try/catch wrapper so a buggy\n * telemetry handler never breaks a storage write.\n */\nexport function createListenerSet<T>(): {\n add(l: (value: T) => void): () => void;\n notify(value: T): void;\n} {\n const listeners = new Set<(v: T) => void>();\n return {\n add(l) {\n listeners.add(l);\n return () => listeners.delete(l);\n },\n notify(value) {\n for (const l of listeners) {\n try {\n l(value);\n } catch {\n // Swallow handler errors; telemetry must never break writes.\n }\n }\n },\n };\n}\n\n/**\n * Internal: parses a raw `anonymousSession` JSON payload (from localStorage\n * or a cookie) into a {@link PersistedAnonymousSession}. Returns `null` for\n * any malformed or missing input.\n */\nexport function parseAnonymousSession(raw: string | null): PersistedAnonymousSession | null {\n if (!raw) return null;\n try {\n const parsed = JSON.parse(raw) as Partial<PersistedAnonymousSession>;\n if (typeof parsed.refreshToken === \"string\" && typeof parsed.sessionId === \"string\") {\n return { refreshToken: parsed.refreshToken, sessionId: parsed.sessionId };\n }\n return null;\n } catch {\n return null;\n }\n}\n\nexport { createMemoryStorage } from \"./memory\";\nexport { createLocalStorageStorage } from \"./local-storage\";\nexport { createCookieStorage } from \"./cookie\";\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/telemetry.ts","../src/company-context.tsx","../src/provider.tsx"],"names":["createContext","useContext","useMemo","useState","useCallback","useEffect","storage","jsx","useQueryClient","auth"],"mappings":";;;;;;AAqEO,IAAM,uBAAA,GAA0B,cAE7B,IAAI,CAAA;AASP,SAAS,mBAAA,GAEd;AACA,EAAA,MAAM,GAAA,GAAM,WAAW,uBAAuB,CAAA;AAC9C,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,MAAM,IAAI,MAAM,4DAA4D,CAAA;AAAA,EAC9E;AACA,EAAA,OAAO,GAAA;AACT;AC/CA,IAAM,QAAA,GAAgC;AAAA,EACpC,aAAA,EAAe,IAAA;AAAA,EACf,aAAa,EAAC;AAAA,EACd,IAAA,EAAM,KAAA;AAAA,EACN,MAAA,EAAQ,MAAA;AAAA,EACR,KAAA,EAAO,IAAA;AAAA,EACP,kBAAkB,YAAY;AAC5B,IAAA,MAAM,IAAI,MAAM,oCAAoC,CAAA;AAAA,EACtD,CAAA;AAAA,EACA,oBAAoB,YAAY;AAAA,EAAC;AACnC,CAAA;AAEO,IAAM,qBAAA,GAAwBA,cAAmC,QAAQ;AAGzE,SAAS,gBAAA,GAAwC;AACtD,EAAA,OAAOC,WAAW,qBAAqB,CAAA;AACzC;AASO,SAAS,sBAAA,CAAuB;AAAA,EACrC,MAAA;AAAA,EACA,OAAA;AAAA,EACA,0BAAA;AAAA,EACA;AACF,CAAA,EAAmD;AACjD,EAAA,MAAM,KAAK,cAAA,EAAe;AAC1B,EAAA,MAAM,EAAE,IAAA,EAAK,GAAI,mBAAA,EAAoB;AACrC,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,QAAA,CAAwB,EAAE,CAAA;AAChE,EAAA,MAAM,CAAC,aAAA,EAAe,SAAS,CAAA,GAAI,SAA6B,IAAI,CAAA;AACpE,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAwC,MAAM,CAAA;AAC1E,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAkB,IAAI,CAAA;AAEhD,EAAA,MAAM,SAAA,GAAY,OAA2B,IAAI,CAAA;AACjD,EAAA,SAAA,CAAU,OAAA,GAAU,aAAA;AAGpB,EAAA,MAAM,QAAA,GAAW,WAAA;AAAA,IACf,OAAO,MAAA,KAA+B;AACpC,MAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,EAAI;AACvB,MAAA,MAAM,IAAA,GAAO,SAAA,CAAU,OAAA,EAAS,EAAA,IAAM,IAAA;AACtC,MAAA,MAAM,YAAA,GAAe,QAAQ,eAAA,EAAgB;AAC7C,MAAA,MAAM,KAAA,GAAQ,QAAQ,gBAAA,EAAiB;AACvC,MAAA,IAAI,CAAC,YAAA,IAAgB,CAAC,KAAA,EAAO;AAE3B,QAAA,SAAA,CAAU,MAAM,CAAA;AAChB,QAAA,OAAA,CAAQ,sBAAA,CAAuB,MAAA,EAAQ,EAAA,IAAM,IAAI,CAAA;AAAA,MACnD,CAAA,MAAO;AACL,QAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,SAAA,CAAU,OAAA,CAAQ;AAAA,UAC1C,YAAA;AAAA,UACA,GAAI,MAAA,GAAS,EAAE,eAAe,MAAA,CAAO,EAAA,KAAO;AAAC,SAC9C,CAAA;AACD,QAAA,OAAA,CAAQ,gBAAA,CAAiB,KAAK,aAAa,CAAA;AAC3C,QAAA,IAAI,IAAA,CAAK,YAAA,EAAc,OAAA,CAAQ,eAAA,CAAgB,KAAK,YAAY,CAAA;AAChE,QAAA,OAAA,CAAQ,UAAU,IAAI,CAAA;AACtB,QAAA,OAAA,CAAQ,sBAAA,CAAuB,MAAA,EAAQ,EAAA,IAAM,IAAI,CAAA;AACjD,QAAA,SAAA,CAAU,MAAM,CAAA;AAChB,QAAA,EAAA,CAAG,iBAAA,CAAkB;AAAA,UACnB,SAAA,EAAW,CAAC,CAAA,KACV,KAAA,CAAM,QAAQ,CAAA,CAAE,QAAQ,CAAA,IACxB,CAAA,CAAE,QAAA,CAAS,IAAA;AAAA,YACT,CAAC,CAAA,KACC,CAAA,KAAM,MAAA,IACN,CAAA,KAAM,WAAA,IACN,CAAA,KAAM,UAAA,IACN,CAAA,KAAM,IAAA,IACL,MAAA,KAAW,IAAA,IAAQ,MAAM,MAAA,CAAO;AAAA;AACrC,SACH,CAAA;AAAA,MACH;AACA,MAAA,IAAA,CAAK;AAAA,QACH,IAAA,EAAM,kBAAA;AAAA,QACN,IAAA;AAAA,QACA,EAAA,EAAI,QAAQ,EAAA,IAAM,IAAA;AAAA,QAClB,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,OAC1B,CAAA;AAAA,IACH,CAAA;AAAA,IACA,CAAC,MAAA,EAAQ,OAAA,EAAS,EAAA,EAAI,IAAI;AAAA,GAC5B;AAEA,EAAA,MAAM,IAAA,GAAO,YAAY,YAAY;AACnC,IAAA,MAAM,KAAA,GAAQ,QAAQ,gBAAA,EAAiB;AACvC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,cAAA,CAAe,EAAE,CAAA;AACjB,MAAA,SAAA,CAAU,IAAI,CAAA;AACd,MAAA,SAAA,CAAU,MAAM,CAAA;AAChB,MAAA;AAAA,IACF;AACA,IAAA,SAAA,CAAU,SAAS,CAAA;AACnB,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,GAAY,MAAM,MAAA,CAAO,SAAA,CAAU,SAAS,IAAA,CAAK,QAAA,CAAS,KAAK,CAAC,CAAA;AACtE,MAAA,cAAA,CAAe,SAAS,CAAA;AACxB,MAAA,MAAM,SAAA,GAAY,0BAAA,IAA8B,OAAA,CAAQ,sBAAA,EAAuB;AAC/E,MAAA,MAAM,OAAA,GAAU,SAAA,GAAY,SAAA,CAAU,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,SAAS,CAAA,IAAK,IAAA,GAAO,IAAA;AAChF,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,SAAA,CAAU,OAAO,CAAA;AACjB,QAAA,IAAI,OAAA,CAAQ,sBAAA,EAAuB,KAAM,OAAA,CAAQ,EAAA,EAAI;AACnD,UAAA,OAAA,CAAQ,sBAAA,CAAuB,OAAA,CAAQ,EAAA,IAAM,IAAI,CAAA;AAAA,QACnD;AAAA,MACF,CAAA,MAAA,IAAW,SAAA,CAAU,MAAA,KAAW,CAAA,EAAG;AACjC,QAAA,MAAM,QAAA,CAAS,SAAA,CAAU,CAAC,CAAA,IAAK,IAAI,CAAA;AAAA,MACrC,CAAA,MAAO;AACL,QAAA,SAAA,CAAU,IAAI,CAAA;AACd,QAAA,IAAI,SAAA,IAAa,CAAC,OAAA,EAAS,OAAA,CAAQ,uBAAuB,IAAI,CAAA;AAAA,MAChE;AACA,MAAA,SAAA,CAAU,MAAM,CAAA;AAAA,IAClB,SAAS,CAAA,EAAG;AACV,MAAA,QAAA,CAAS,CAAC,CAAA;AACV,MAAA,SAAA,CAAU,OAAO,CAAA;AAAA,IACnB;AAAA,EACF,GAAG,CAAC,MAAA,EAAQ,OAAA,EAAS,0BAAA,EAA4B,QAAQ,CAAC,CAAA;AAE1D,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,KAAK,IAAA,EAAK;AAAA,EACZ,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAMT,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,IAAA,GAAO,QAAQ,gBAAA,EAAiB;AACpC,IAAA,OAAO,OAAA,CAAQ,SAAA,GAAY,CAAC,IAAA,KAAS;AACnC,MAAA,MAAM,UAAA,GAAa,CAAC,IAAA,IAAQ,IAAA;AAC5B,MAAA,MAAM,YAAA,GAAe,QAAQ,CAAC,IAAA;AAC9B,MAAA,IAAA,GAAO,IAAA;AACP,MAAA,IAAI,UAAA,IAAc,YAAA,EAAc,KAAK,IAAA,EAAK;AAAA,IAC5C,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,OAAA,EAAS,IAAI,CAAC,CAAA;AAElB,EAAA,MAAM,gBAAA,GAAmB,WAAA;AAAA,IACvB,OAAO,aAAA,KAAiC;AACtC,MAAA,SAAA,CAAU,WAAW,CAAA;AACrB,MAAA,IAAI;AACF,QAAA,IAAI,kBAAkB,IAAA,EAAM;AAC1B,UAAA,MAAM,SAAS,IAAI,CAAA;AAAA,QACrB,CAAA,MAAO;AACL,UAAA,MAAM,MAAA,GAAS,YAAY,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,aAAa,CAAA,IAAK,IAAA;AAClE,UAAA,IAAI,CAAC,MAAA,EAAQ,MAAM,IAAI,KAAA,CAAM,CAAA,wCAAA,EAA2C,aAAa,CAAA,CAAE,CAAA;AACvF,UAAA,MAAM,SAAS,MAAM,CAAA;AAAA,QACvB;AACA,QAAA,SAAA,CAAU,MAAM,CAAA;AAAA,MAClB,SAAS,CAAA,EAAG;AACV,QAAA,QAAA,CAAS,CAAC,CAAA;AACV,QAAA,SAAA,CAAU,OAAO,CAAA;AACjB,QAAA,MAAM,CAAA;AAAA,MACR;AAAA,IACF,CAAA;AAAA,IACA,CAAC,aAAa,QAAQ;AAAA,GACxB;AAEA,EAAA,MAAM,KAAA,GAAQ,QAA6B,MAAM;AAC/C,IAAA,MAAM,OAAoB,aAAA,GACtB,KAAA,GACA,WAAA,CAAY,MAAA,GAAS,IACnB,YAAA,GACA,KAAA;AACN,IAAA,OAAO;AAAA,MACL,aAAA;AAAA,MACA,WAAA;AAAA,MACA,IAAA;AAAA,MACA,MAAA;AAAA,MACA,KAAA;AAAA,MACA,gBAAA;AAAA,MACA,kBAAA,EAAoB;AAAA,KACtB;AAAA,EACF,CAAA,EAAG,CAAC,aAAA,EAAe,WAAA,EAAa,QAAQ,KAAA,EAAO,gBAAA,EAAkB,IAAI,CAAC,CAAA;AAEtE,EAAA,uBACE,GAAA,CAAC,qBAAA,CAAsB,QAAA,EAAtB,EAA+B,OAAe,QAAA,EAAS,CAAA;AAE5D;AChLA,IAAM,cAAA,GAAiBD,cAA0C,IAAI,CAAA;AAC9D,IAAM,kBAAA,GAAqBA,cAAuC,IAAI;AAO7E,IAAM,qBAAA,GAAwB;AAAA,EAC5B,SAAA,EAAW,GAAA;AAAA,EACX,oBAAA,EAAsB,KAAA;AAAA,EACtB,KAAA,EAAO;AACT,CAAA;AA2CO,SAAS,eAAA,CAAgB;AAAA,EAC9B,MAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA,oBAAA;AAAA,EACA,eAAA;AAAA,EACA,0BAAA;AAAA,EACA,WAAA;AAAA,EACA,wBAAA;AAAA,EACA,wBAAA;AAAA,EACA;AACF,CAAA,EAA4C;AAC1C,EAAA,MAAM,KAAA,GAAQE,QAA6B,MAAM;AAC/C,IAAA,MAAM,IACJ,OAAA,IACA,mBAAA;AAAA,MACE,yBAAyB,MAAA,GAAY,EAAE,OAAA,EAAS,oBAAA,KAAyB;AAAC,KAC5E;AACF,IAAA,IAAI,oBAAA,IAAwB,OAAA,IAAW,OAAA,CAAQ,gBAAA,OAAuB,IAAA,EAAM;AAC1E,MAAA,OAAA,CAAQ,iBAAiB,oBAAoB,CAAA;AAAA,IAC/C;AACA,IAAA,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,CAAA,EAAE;AAAA,EAE9B,CAAA,EAAG,CAAC,MAAA,EAAQ,OAAA,EAAS,oBAAoB,CAAC,CAAA;AAC1C,EAAA,MAAM,EAAA,GAAKA,OAAAA;AAAA,IACT,MACE,WAAA,IACA,IAAI,WAAA,CAAY,EAAE,gBAAgB,EAAE,OAAA,EAAS,qBAAA,EAAsB,EAAG,CAAA;AAAA,IACxE,CAAC,WAAW;AAAA,GACd;AAKA,EAAAC,SAAS,MAAM;AACb,IAAA,MAAA,CAAO,cAAc,oBAAA,GAAuB;AAAA,MAC1C,IAAA,EAAM,MAAM,KAAA,CAAM,OAAA,CAAQ,mBAAA,EAAoB;AAAA,MAC9C,OAAO,CAAC,CAAA,KAAM,KAAA,CAAM,OAAA,CAAQ,oBAAoB,CAAC;AAAA,KAClD,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT,CAAC,CAAA;AAID,EAAA,MAAM,QAAA,GAAWC,WAAAA;AAAA,IACf,CAAC,KAAA,KAAiC;AAChC,MAAA,IAAI,CAAC,WAAA,EAAa;AAClB,MAAA,IAAI;AACF,QAAA,WAAA,CAAY,KAAK,CAAA;AAAA,MACnB,SAAS,GAAA,EAAK;AAEZ,QAAA,OAAA,CAAQ,KAAA,CAAM,sCAAsC,GAAG,CAAA;AAAA,MACzD;AAAA,IACF,CAAA;AAAA,IACA,CAAC,WAAW;AAAA,GACd;AACA,EAAA,MAAM,cAAA,GAAiBF,QAAQ,OAAO,EAAE,MAAM,QAAA,EAAS,CAAA,EAAI,CAAC,QAAQ,CAAC,CAAA;AAIrE,EAAAG,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,WAAA,EAAa;AAClB,IAAA,MAAM,SAAA,uBAAgB,GAAA,EAAoB;AAE1C,IAAA,MAAM,aAAa,EAAA,CAAG,aAAA,EAAc,CAAE,SAAA,CAAU,CAAC,KAAA,KAAU;AACzD,MAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,QAAA;AACxB,MAAA,IAAI,CAAC,MAAM,OAAA,CAAQ,GAAG,KAAK,GAAA,CAAI,CAAC,MAAM,SAAA,EAAW;AACjD,MAAA,IAAI,KAAA,CAAM,SAAS,SAAA,EAAW;AAC5B,QAAA,MAAM,SAAS,KAAA,CAAM,MAAA;AACrB,QAAA,IAAI,MAAA,CAAO,SAAS,OAAA,EAAS;AAC3B,UAAA,MAAM,SAAA,GAAY,KAAA,CAAM,KAAA,CAAM,KAAA,CAAM,eAAA,GAAkB,CAAA;AACtD,UAAA,IAAI,SAAA,EAAW;AACb,YAAA,QAAA,CAAS;AAAA,cACP,IAAA,EAAM,eAAA;AAAA,cACN,QAAA,EAAU,GAAA;AAAA,cACV,QAAQ,MAAA,CAAO,MAAA;AAAA,cACf,MAAA,EAAQ;AAAA,aACT,CAAA;AAAA,UACH;AACA,UAAA,SAAA,CAAU,IAAI,KAAA,CAAM,KAAA,CAAM,SAAA,EAAW,IAAA,CAAK,KAAK,CAAA;AAAA,QACjD,CAAA,MAAA,IAAW,MAAA,CAAO,IAAA,KAAS,SAAA,EAAW;AACpC,UAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,GAAA,CAAI,KAAA,CAAM,MAAM,SAAS,CAAA;AACjD,UAAA,SAAA,CAAU,MAAA,CAAO,KAAA,CAAM,KAAA,CAAM,SAAS,CAAA;AACtC,UAAA,QAAA,CAAS;AAAA,YACP,IAAA,EAAM,YAAA;AAAA,YACN,QAAA,EAAU,GAAA;AAAA,YACV,QAAQ,MAAA,CAAO,MAAA;AAAA,YACf,UAAA,EAAY,KAAA,GAAQ,IAAA,CAAK,GAAA,KAAQ,KAAA,GAAQ;AAAA,WAC1C,CAAA;AAAA,QACH,CAAA,MAAA,IAAW,MAAA,CAAO,IAAA,KAAS,OAAA,EAAS;AAClC,UAAA,SAAA,CAAU,MAAA,CAAO,KAAA,CAAM,KAAA,CAAM,SAAS,CAAA;AACtC,UAAA,QAAA,CAAS;AAAA,YACP,IAAA,EAAM,aAAA;AAAA,YACN,QAAA,EAAU,GAAA;AAAA,YACV,QAAQ,MAAA,CAAO,MAAA;AAAA,YACf,KAAA,EAAO,KAAA,CAAM,KAAA,CAAM,KAAA,CAAM;AAAA,WAC1B,CAAA;AAAA,QACH;AAAA,MACF,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,wBAAA,EAA0B;AAClD,QAAA,MAAM,CAAA,GAAI,MAAM,KAAA,CAAM,KAAA;AACtB,QAAA,IAAI,CAAA,CAAE,WAAW,SAAA,IAAa,CAAA,CAAE,gBAAgB,MAAA,IAAU,CAAA,CAAE,kBAAkB,CAAA,EAAG;AAC/E,UAAA,QAAA,CAAS,EAAE,MAAM,WAAA,EAAa,QAAA,EAAU,KAAK,MAAA,EAAQ,MAAA,CAAO,QAAQ,CAAA;AAAA,QACtE;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AAED,IAAA,MAAM,WAAW,EAAA,CAAG,gBAAA,EAAiB,CAAE,SAAA,CAAU,CAAC,KAAA,KAAU;AAC1D,MAAA,IAAI,KAAA,CAAM,SAAS,SAAA,EAAW;AAC9B,MAAA,MAAM,IAAI,KAAA,CAAM,QAAA;AAChB,MAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI,IAAK,EAAE,KAAA,CAAM,WAAA,IAAe,KAAK,GAAA,EAAI,CAAA;AAC1D,MAAA,MAAM,EAAA,GAAK,EAAE,OAAA,CAAQ,WAAA;AACrB,MAAA,IAAI,CAAA,CAAE,KAAA,CAAM,MAAA,KAAW,SAAA,EAAW;AAChC,QAAA,QAAA,CAAS;AAAA,UACP,IAAA,EAAM,kBAAA;AAAA,UACN,GAAI,EAAA,GAAK,EAAE,WAAA,EAAa,EAAA,KAA6B,EAAC;AAAA,UACtD,QAAQ,MAAA,CAAO,MAAA;AAAA,UACf,UAAA,EAAY;AAAA,SACb,CAAA;AAAA,MACH,CAAA,MAAA,IAAW,CAAA,CAAE,KAAA,CAAM,MAAA,KAAW,OAAA,EAAS;AACrC,QAAA,QAAA,CAAS;AAAA,UACP,IAAA,EAAM,gBAAA;AAAA,UACN,GAAI,EAAA,GAAK,EAAE,WAAA,EAAa,EAAA,KAA6B,EAAC;AAAA,UACtD,QAAQ,MAAA,CAAO,MAAA;AAAA,UACf,KAAA,EAAO,EAAE,KAAA,CAAM,KAAA;AAAA,UACf,UAAA,EAAY;AAAA,SACb,CAAA;AAAA,MACH;AAAA,IACF,CAAC,CAAA;AAED,IAAA,MAAM,SAAA,GAAY,OAAO,aAAA,CAAc,SAAA;AAAA,MAAY,CAAC,GAAA,KAClD,QAAA,CAAS,EAAE,IAAA,EAAM,cAAA,EAAgB,GAAG,GAAA,EAAK,MAAA,EAAQ,MAAA,CAAO,MAAA,EAAQ;AAAA,KAClE;AAEA,IAAA,MAAM,YAAA,GAAe,MAAM,OAAA,CAAQ,YAAA;AAAA,MAAe,CAAC,GAAA,KACjD,QAAA,CAAS,EAAE,IAAA,EAAM,eAAA,EAAiB,KAAK;AAAA,KACzC;AAEA,IAAA,OAAO,MAAM;AACX,MAAA,UAAA,EAAW;AACX,MAAA,QAAA,EAAS;AACT,MAAA,SAAA,IAAY;AACZ,MAAA,YAAA,IAAe;AAAA,IACjB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,EAAA,EAAI,WAAA,EAAa,QAAQ,KAAA,CAAM,OAAA,EAAS,QAAQ,CAAC,CAAA;AAKrD,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,wBAAA,EAA0B;AAC/B,IAAA,MAAMC,WAAU,KAAA,CAAM,OAAA;AACtB,IAAA,MAAA,CAAO,yBAAA,CAA0B;AAAA,MAC/B,SAAS,YAAY;AACnB,QAAA,MAAM,YAAA,GAAeA,SAAQ,eAAA,EAAgB;AAC7C,QAAA,IAAI,CAAC,YAAA,EAAc;AACjB,UAAA,QAAA,CAAS,EAAE,IAAA,EAAM,cAAA,EAAgB,IAAA,EAAM,UAAA,EAAY,SAAS,KAAA,EAAO,MAAA,EAAQ,MAAA,CAAO,MAAA,EAAQ,CAAA;AAC1F,UAAA,wBAAA,IAA2B;AAC3B,UAAA,OAAO,IAAA;AAAA,QACT;AACA,QAAA,IAAI;AACF,UAAA,MAAM,aAAA,GAAgBA,QAAAA,CAAQ,sBAAA,EAAuB,IAAK,KAAA,CAAA;AAC1D,UAAA,MAAM,CAAA,GAAI,MAAM,MAAA,CAAO,SAAA,CAAU,OAAA,CAAQ;AAAA,YACvC,YAAA;AAAA,YACA,GAAI,aAAA,GAAgB,EAAE,aAAA,KAAkB;AAAC,WAC1C,CAAA;AACD,UAAAA,QAAAA,CAAQ,gBAAA,CAAiB,CAAA,CAAE,aAAa,CAAA;AACxC,UAAA,IAAI,EAAE,YAAA,EAAcA,QAAAA,CAAQ,eAAA,CAAgB,EAAE,YAAY,CAAA;AAC1D,UAAA,QAAA,CAAS,EAAE,IAAA,EAAM,cAAA,EAAgB,IAAA,EAAM,UAAA,EAAY,SAAS,IAAA,EAAM,MAAA,EAAQ,MAAA,CAAO,MAAA,EAAQ,CAAA;AACzF,UAAA,OAAO,CAAA,CAAE,aAAA;AAAA,QACX,CAAA,CAAA,MAAQ;AACN,UAAA,QAAA,CAAS,EAAE,IAAA,EAAM,cAAA,EAAgB,IAAA,EAAM,UAAA,EAAY,SAAS,KAAA,EAAO,MAAA,EAAQ,MAAA,CAAO,MAAA,EAAQ,CAAA;AAC1F,UAAA,wBAAA,IAA2B;AAC3B,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,MACF;AAAA,KACD,CAAA;AACD,IAAA,OAAO,MAAM,MAAA,CAAO,yBAAA,CAA0B,IAAI,CAAA;AAAA,EACpD,CAAA,EAAG,CAAC,wBAAA,EAA0B,MAAA,EAAQ,MAAM,OAAA,EAAS,QAAA,EAAU,wBAAwB,CAAC,CAAA;AAExF,EAAA,uBACEC,GAAAA,CAAC,cAAA,CAAe,UAAf,EAAwB,KAAA,EACvB,0BAAAA,GAAAA,CAAC,uBAAA,CAAwB,QAAA,EAAxB,EAAiC,OAAO,cAAA,EACvC,QAAA,kBAAAA,IAAC,mBAAA,EAAA,EAAoB,MAAA,EAAQ,IAC3B,QAAA,kBAAAA,GAAAA;AAAA,IAAC,mBAAA;AAAA,IAAA;AAAA,MACC,MAAA;AAAA,MACA,SAAS,KAAA,CAAM,OAAA;AAAA,MACd,GAAI,eAAA,KAAoB,MAAA,GAAY,EAAE,eAAA,KAAoB,EAAC;AAAA,MAE5D,QAAA,kBAAAA,GAAAA;AAAA,QAAC,sBAAA;AAAA,QAAA;AAAA,UACC,MAAA;AAAA,UACA,SAAS,KAAA,CAAM,OAAA;AAAA,UACd,GAAI,0BAAA,KAA+B,MAAA,GAChC,EAAE,0BAAA,KACF,EAAC;AAAA,UAEJ;AAAA;AAAA;AACH;AAAA,GACF,EACF,GACF,CAAA,EACF,CAAA;AAEJ;AAMA,SAAS,mBAAA,CAAoB;AAAA,EAC3B,MAAA;AAAA,EACA,OAAA;AAAA,EACA,eAAA;AAAA,EACA;AACF,CAAA,EAKsB;AACpB,EAAA,MAAM,KAAKC,cAAAA,EAAe;AAC1B,EAAA,MAAM,CAAC,QAAA,EAAU,gBAAgB,CAAA,GAAIL,SAAwB,MAAM;AACjE,IAAA,IAAI,eAAA,KAAoB,QAAW,OAAO,eAAA;AAC1C,IAAA,MAAM,WAAA,GAAc,QAAQ,WAAA,EAAY;AACxC,IAAA,IAAI,WAAA,KAAgB,MAAM,OAAO,WAAA;AACjC,IAAA,OAAO,MAAA,CAAO,MAAA,EAAQ,WAAA,EAAa,UAAA,EAAY,SAAS,QAAA,IAAY,IAAA;AAAA,EACtE,CAAC,CAAA;AACD,EAAA,MAAM,CAAC,QAAA,EAAU,gBAAgB,CAAA,GAAIA,QAAAA;AAAA,IACnC,MAAM,MAAA,CAAO,MAAA,EAAQ,WAAA,EAAa,UAAA,EAAY,SAAS,QAAA,IAAY;AAAA,GACrE;AACA,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,SAAwB,IAAI,CAAA;AACxE,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,SAAS,KAAK,CAAA;AACpD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,SAAuB,IAAI,CAAA;AAMjE,EAAAE,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,QAAA,IAAa,QAAA,KAAa,IAAA,IAAQ,mBAAmB,IAAA,EAAO;AACjE,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,MAAM,KAAA,GAAQ,QAAQ,gBAAA,EAAiB;AACvC,IAAA,MAAM,UAAU,KAAA,GAAQI,IAAAA,CAAK,SAAS,KAAK,CAAA,GAAIA,KAAK,SAAA,EAAU;AAC9D,IAAA,EAAA,CAAG,UAAA,CAAW;AAAA,MACZ,QAAA,EAAU;AAAA,QACR,SAAA;AAAA,QACA,cAAA;AAAA,QACA,QAAA;AAAA,QACA,EAAE,MAAA,EAAQ,MAAA,CAAO,MAAA,EAAQ,QAAA,EAAU,QAAQ,IAAA;AAAK,OAClD;AAAA,MACA,SAAS,MAAM,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,UAAU,OAAO,CAAA;AAAA,MACjD,WAAW,CAAA,GAAI;AAAA,KAChB,CAAA,CACE,IAAA,CAAK,CAAC,IAAA,KAAS;AACd,MAAA,IAAI,SAAA,EAAW;AACf,MAAA,IAAI,QAAA,KAAa,IAAA,EAAM,gBAAA,CAAiB,IAAA,CAAK,QAAQ,CAAA;AACrD,MAAA,iBAAA,CAAkB,IAAA,CAAK,QAAA,EAAU,OAAA,EAAS,OAAA,IAAW,IAAI,CAAA;AAAA,IAC3D,CAAC,CAAA,CACA,KAAA,CAAM,MAAM;AAAA,IAEb,CAAC,CAAA;AACH,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,CAAA;AAAA,EAEF,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,MAAM,OAAA,GAAUL,WAAAA;AAAA,IACd,OAAO,IAAA,KAAwB;AAE7B,MAAA,OAAA,CAAQ,YAAY,IAAI,CAAA;AACxB,MAAA,OAAA,CAAQ,UAAU,IAAI,CAAA;AACtB,MAAA,gBAAA,CAAiB,IAAI,CAAA;AACrB,MAAA,cAAA,CAAe,IAAI,CAAA;AACnB,MAAA,KAAK,GAAG,iBAAA,CAAkB,EAAE,UAAU,CAAC,SAAS,GAAG,CAAA;AAEnD,MAAA,IAAI,SAAS,IAAA,EAAM;AACjB,QAAA,gBAAA,CAAiB,IAAI,CAAA;AACrB,QAAA,iBAAA,CAAkB,IAAI,CAAA;AACtB,QAAA;AAAA,MACF;AAEA,MAAA,cAAA,CAAe,IAAI,CAAA;AACnB,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,GAAQ,QAAQ,gBAAA,EAAiB;AACvC,QAAA,MAAM,UAAU,KAAA,GAAQK,IAAAA,CAAK,SAAS,KAAK,CAAA,GAAIA,KAAK,SAAA,EAAU;AAE9D,QAAA,MAAM,IAAA,GAAO,MAAM,EAAA,CAAG,UAAA,CAAW;AAAA,UAC/B,QAAA,EAAU;AAAA,YACR,SAAA;AAAA,YACA,cAAA;AAAA,YACA,IAAA;AAAA,YACA,EAAE,MAAA,EAAQ,MAAA,CAAO,MAAA,EAAQ,QAAA,EAAU,QAAQ,IAAA;AAAK,WAClD;AAAA,UACA,SAAS,MAAM,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,MAAM,OAAO,CAAA;AAAA,UAC7C,WAAW,CAAA,GAAI;AAAA,SAChB,CAAA;AACD,QAAA,MAAM,eAAe,IAAA,CAAK,QAAA;AAC1B,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,QAAA,EAAU,OAAA,EAAS,OAAA,IAAW,IAAA;AACtD,QAAA,gBAAA,CAAiB,YAAY,CAAA;AAC7B,QAAA,iBAAA,CAAkB,UAAU,CAAA;AAE5B,QAAA,MAAM,OAAO,cAAA,CAAe,KAAA;AAAA,UAC1B;AAAA,YACE,QAAA,EAAU,IAAA;AAAA,YACV,GAAI,YAAA,GAAe,EAAE,QAAA,EAAU,YAAA,KAAiB,EAAC;AAAA,YACjD,GAAI,UAAA,GAAa,EAAE,cAAA,EAAgB,UAAA,KAAe;AAAC,WACrD;AAAA,UACA;AAAA,SACF;AAAA,MACF,SAAS,CAAA,EAAG;AACV,QAAA,cAAA,CAAe,CAAA,YAAa,QAAQ,CAAA,GAAI,IAAI,MAAM,MAAA,CAAO,CAAC,CAAC,CAAC,CAAA;AAAA,MAC9D,CAAA,SAAE;AACA,QAAA,cAAA,CAAe,KAAK,CAAA;AAAA,MACtB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,MAAA,EAAQ,OAAA,EAAS,EAAE;AAAA,GACtB;AAEA,EAAA,MAAM,WAAA,GAAcL,WAAAA;AAAA,IAClB,OAAO,IAAA,KAAiB;AAEtB,MAAA,OAAA,CAAQ,UAAU,IAAI,CAAA;AACtB,MAAA,gBAAA,CAAiB,IAAI,CAAA;AACrB,MAAA,cAAA,CAAe,IAAI,CAAA;AAGnB,MAAA,MAAA,CAAO,oBAAA,CAAqB,EAAE,QAAA,EAAU,IAAA,EAAM,CAAA;AAC9C,MAAA,KAAK,GAAG,iBAAA,CAAkB,EAAE,UAAU,CAAC,SAAS,GAAG,CAAA;AACnD,MAAA,cAAA,CAAe,IAAI,CAAA;AACnB,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,GAAQ,QAAQ,gBAAA,EAAiB;AACvC,QAAA,MAAM,UAAU,KAAA,GAAQK,IAAAA,CAAK,SAAS,KAAK,CAAA,GAAIA,KAAK,SAAA,EAAU;AAE9D,QAAA,MAAM,OAAO,cAAA,CAAe,KAAA;AAAA,UAC1B,EAAE,UAAU,IAAA,EAAM,GAAI,WAAW,EAAE,QAAA,EAAS,GAAI,EAAC,EAAG;AAAA,UACpD;AAAA,SACF;AAAA,MACF,SAAS,CAAA,EAAG;AACV,QAAA,cAAA,CAAe,CAAA,YAAa,QAAQ,CAAA,GAAI,IAAI,MAAM,MAAA,CAAO,CAAC,CAAC,CAAC,CAAA;AAAA,MAC9D,CAAA,SAAE;AACA,QAAA,cAAA,CAAe,KAAK,CAAA;AAAA,MACtB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,MAAA,EAAQ,OAAA,EAAS,EAAA,EAAI,QAAQ;AAAA,GAChC;AAEA,EAAA,MAAM,KAAA,GAAQP,OAAAA;AAAA,IACZ,OAAO;AAAA,MACL,QAAA;AAAA,MACA,QAAA;AAAA,MACA,cAAA;AAAA,MACA,OAAA;AAAA,MACA,WAAA;AAAA,MACA,WAAA;AAAA,MACA;AAAA,KACF,CAAA;AAAA,IACA,CAAC,QAAA,EAAU,QAAA,EAAU,gBAAgB,OAAA,EAAS,WAAA,EAAa,aAAa,WAAW;AAAA,GACrF;AAEA,EAAA,uBAAOK,GAAAA,CAAC,kBAAA,CAAmB,QAAA,EAAnB,EAA4B,OAAe,QAAA,EAAS,CAAA;AAC9D;AAGO,SAAS,UAAA,GAAkC;AAChD,EAAA,MAAM,GAAA,GAAMN,WAAW,cAAc,CAAA;AACrC,EAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,MAAM,mDAAmD,CAAA;AAC7E,EAAA,OAAO,GAAA;AACT","file":"chunk-SMJ5IQZJ.js","sourcesContent":["import { createContext, useContext } from \"react\";\n\n/**\n * All telemetry events emitted through the EmporixProvider's `onTelemetry`\n * callback. Discriminated by `type` — exhaustive switch is type-safe.\n *\n * Consumers can emit their own `{ type: \"custom\" }` events via\n * {@link useEmporixTelemetry}. Namespace `name` with an app-specific\n * prefix (e.g. `\"app.checkout-cta-click\"`) to avoid collisions with\n * future SDK event types.\n */\nexport type EmporixTelemetryEvent =\n // Cache lifecycle (React-Query QueryCache)\n | { type: \"cache.hit\"; queryKey: readonly unknown[]; tenant: string }\n | {\n type: \"cache.miss\";\n queryKey: readonly unknown[];\n tenant: string;\n durationMs: number;\n }\n | {\n type: \"query.refetch\";\n queryKey: readonly unknown[];\n tenant: string;\n reason: \"invalidate\" | \"focus\" | \"stale\";\n }\n | {\n type: \"query.error\";\n queryKey: readonly unknown[];\n tenant: string;\n error: unknown;\n }\n // Mutation lifecycle\n | {\n type: \"mutation.success\";\n mutationKey?: readonly unknown[];\n tenant: string;\n durationMs: number;\n }\n | {\n type: \"mutation.error\";\n mutationKey?: readonly unknown[];\n tenant: string;\n error: unknown;\n durationMs: number;\n }\n // Auth refresh (SDK-side)\n | {\n type: \"auth.refresh\";\n kind: \"anonymous\" | \"customer\";\n tenant: string;\n success: boolean;\n }\n // Storage writes\n | {\n type: \"storage.write\";\n key: \"customerToken\" | \"cartId\" | \"siteCode\" | \"anonymousSession\" | \"activeLegalEntityId\" | \"refreshToken\";\n }\n // Active-company switch (B2B)\n | {\n type: \"company:switched\";\n from: string | null;\n to: string | null;\n durationMs: number;\n }\n // Consumer-emitted\n | { type: \"custom\"; name: string; props?: Record<string, unknown> };\n\n/** Internal: the React context carrying the emit function down the tree. */\nexport const EmporixTelemetryContext = createContext<{\n emit: (event: EmporixTelemetryEvent) => void;\n} | null>(null);\n\n/**\n * Hook to emit custom telemetry events through the same channel as SDK\n * events. Throws when used outside an {@link EmporixProvider}.\n *\n * When the provider has no `onTelemetry` callback configured, `emit` is a\n * no-op — calling it is safe and incurs no overhead.\n */\nexport function useEmporixTelemetry(): {\n emit: (event: EmporixTelemetryEvent) => void;\n} {\n const ctx = useContext(EmporixTelemetryContext);\n if (!ctx) {\n throw new Error(\"useEmporixTelemetry must be used within an EmporixProvider\");\n }\n return ctx;\n}\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { auth, type EmporixClient, type LegalEntity } from \"@viu/emporix-sdk\";\nimport type { EmporixStorage } from \"./storage\";\nimport { useEmporixTelemetry } from \"./telemetry\";\n\nexport type CompanyMode = \"b2c\" | \"b2b\" | \"unresolved\";\n\nexport interface CompanyContextValue {\n /** Active legal entity. `null` = B2C mode. */\n activeCompany: LegalEntity | null;\n /** All legal entities the customer is assigned to. */\n myCompanies: LegalEntity[];\n /**\n * `b2b` = a company is active; `b2c` = none active (and ≤1 available);\n * `unresolved` = multiple companies available, none picked yet — the\n * storefront must render a picker.\n */\n mode: CompanyMode;\n status: \"idle\" | \"loading\" | \"switching\" | \"error\";\n error: unknown;\n /**\n * Switch the active company. Eagerly calls\n * `client.customers.refresh({ legalEntityId })` so the customer token is\n * rescoped server-side, drops the cart id, then invalidates company-scoped\n * queries. Falls back to a local-state-only update when no refresh token\n * is in storage (e.g. fresh page load with memory storage).\n */\n setActiveCompany: (legalEntityId: string | null) => Promise<void>;\n refetchMyCompanies: () => Promise<void>;\n}\n\nconst NULL_CTX: CompanyContextValue = {\n activeCompany: null,\n myCompanies: [],\n mode: \"b2c\",\n status: \"idle\",\n error: null,\n setActiveCompany: async () => {\n throw new Error(\"CompanyContextProvider not mounted\");\n },\n refetchMyCompanies: async () => {},\n};\n\nexport const EmporixCompanyContext = createContext<CompanyContextValue>(NULL_CTX);\n\n/** Returns the active-company context. Safe outside the provider — returns idle B2C defaults. */\nexport function useActiveCompany(): CompanyContextValue {\n return useContext(EmporixCompanyContext);\n}\n\nexport interface CompanyContextProviderProps {\n client: EmporixClient;\n storage: EmporixStorage;\n initialActiveLegalEntityId?: string | null;\n children: ReactNode;\n}\n\nexport function CompanyContextProvider({\n client,\n storage,\n initialActiveLegalEntityId,\n children,\n}: CompanyContextProviderProps): React.JSX.Element {\n const qc = useQueryClient();\n const { emit } = useEmporixTelemetry();\n const [myCompanies, setMyCompanies] = useState<LegalEntity[]>([]);\n const [activeCompany, setActive] = useState<LegalEntity | null>(null);\n const [status, setStatus] = useState<CompanyContextValue[\"status\"]>(\"idle\");\n const [error, setError] = useState<unknown>(null);\n // Ref so switchTo can capture the latest `activeCompany` for telemetry `from`.\n const activeRef = useRef<LegalEntity | null>(null);\n activeRef.current = activeCompany;\n\n /** Internal: eager refresh + storage write + state update. */\n const switchTo = useCallback(\n async (target: LegalEntity | null) => {\n const start = Date.now();\n const from = activeRef.current?.id ?? null;\n const refreshToken = storage.getRefreshToken();\n const token = storage.getCustomerToken();\n if (!refreshToken || !token) {\n // Local-state-only fallback — no rescope possible.\n setActive(target);\n storage.setActiveLegalEntityId(target?.id ?? null);\n } else {\n const next = await client.customers.refresh({\n refreshToken,\n ...(target ? { legalEntityId: target.id } : {}),\n });\n storage.setCustomerToken(next.customerToken);\n if (next.refreshToken) storage.setRefreshToken(next.refreshToken);\n storage.setCartId(null);\n storage.setActiveLegalEntityId(target?.id ?? null);\n setActive(target);\n qc.invalidateQueries({\n predicate: (q) =>\n Array.isArray(q.queryKey) &&\n q.queryKey.some(\n (k) =>\n k === \"cart\" ||\n k === \"companies\" ||\n k === \"customer\" ||\n k === from ||\n (target !== null && k === target.id),\n ),\n });\n }\n emit({\n type: \"company:switched\",\n from,\n to: target?.id ?? null,\n durationMs: Date.now() - start,\n });\n },\n [client, storage, qc, emit],\n );\n\n const load = useCallback(async () => {\n const token = storage.getCustomerToken();\n if (!token) {\n setMyCompanies([]);\n setActive(null);\n setStatus(\"idle\");\n return;\n }\n setStatus(\"loading\");\n try {\n const companies = await client.companies.listMine(auth.customer(token));\n setMyCompanies(companies);\n const persisted = initialActiveLegalEntityId ?? storage.getActiveLegalEntityId();\n const matched = persisted ? companies.find((c) => c.id === persisted) ?? null : null;\n if (matched) {\n setActive(matched);\n if (storage.getActiveLegalEntityId() !== matched.id) {\n storage.setActiveLegalEntityId(matched.id ?? null);\n }\n } else if (companies.length === 1) {\n await switchTo(companies[0] ?? null);\n } else {\n setActive(null);\n if (persisted && !matched) storage.setActiveLegalEntityId(null);\n }\n setStatus(\"idle\");\n } catch (e) {\n setError(e);\n setStatus(\"error\");\n }\n }, [client, storage, initialActiveLegalEntityId, switchTo]);\n\n useEffect(() => {\n void load();\n }, [load]);\n\n // Re-run bootstrap only on token-presence transitions (login/logout). A\n // mid-session token swap (e.g. switch-driven refresh) keeps prev/next both\n // truthy and is ignored — otherwise the auto-pick branch would clobber an\n // explicit B2C choice as soon as the new token is written.\n useEffect(() => {\n let prev = storage.getCustomerToken();\n return storage.subscribe?.((next) => {\n const becameAuth = !prev && next;\n const becameUnauth = prev && !next;\n prev = next;\n if (becameAuth || becameUnauth) void load();\n });\n }, [storage, load]);\n\n const setActiveCompany = useCallback(\n async (legalEntityId: string | null) => {\n setStatus(\"switching\");\n try {\n if (legalEntityId === null) {\n await switchTo(null);\n } else {\n const target = myCompanies.find((c) => c.id === legalEntityId) ?? null;\n if (!target) throw new Error(`setActiveCompany: unknown legalEntityId ${legalEntityId}`);\n await switchTo(target);\n }\n setStatus(\"idle\");\n } catch (e) {\n setError(e);\n setStatus(\"error\");\n throw e;\n }\n },\n [myCompanies, switchTo],\n );\n\n const value = useMemo<CompanyContextValue>(() => {\n const mode: CompanyMode = activeCompany\n ? \"b2b\"\n : myCompanies.length > 1\n ? \"unresolved\"\n : \"b2c\";\n return {\n activeCompany,\n myCompanies,\n mode,\n status,\n error,\n setActiveCompany,\n refetchMyCompanies: load,\n };\n }, [activeCompany, myCompanies, status, error, setActiveCompany, load]);\n\n return (\n <EmporixCompanyContext.Provider value={value}>{children}</EmporixCompanyContext.Provider>\n );\n}\n","import { createContext, useCallback, useContext, useEffect, useMemo, useState, type ReactNode } from \"react\";\nimport { QueryClient, QueryClientProvider, useQueryClient } from \"@tanstack/react-query\";\nimport { auth, type EmporixClient } from \"@viu/emporix-sdk\";\nimport type { EmporixStorage } from \"./storage/index\";\nimport { createMemoryStorage } from \"./storage/memory\";\nimport { EmporixTelemetryContext, type EmporixTelemetryEvent } from \"./telemetry\";\nimport { CompanyContextProvider } from \"./company-context\";\n\ninterface EmporixContextValue {\n client: EmporixClient;\n storage: EmporixStorage;\n}\n\nexport interface SiteContextValue {\n siteCode: string | null;\n /** MS-4 populates this from the active site's DTO. */\n currency: string | null;\n /** MS-4 populates this from the active site's DTO. */\n targetLocation: string | null;\n /**\n * Asynchronous site switch. Updates local state + storage immediately\n * (optimistic), then PATCHes `/session-context/{tenant}/me/context` so\n * the server sees the same site on the next request. When no session\n * context exists yet (first visit, before any cart), the PATCH is\n * skipped — local state still flips.\n *\n * `isSwitching` is `true` while the PATCH is in flight. `switchError`\n * surfaces a PATCH failure; the optimistic state is NOT rolled back\n * (the cache was already invalidated, the UI already moved on).\n */\n setSite: (code: string | null) => Promise<void>;\n /**\n * Switch the active currency at runtime. Re-binds the anonymous price context\n * (so guest pricing changes even before a cart exists), clears the\n * currency-bound guest cart, and PATCHes an existing server session context.\n * The chosen currency must be in the active site's `availableCurrencies`.\n */\n setCurrency: (currency: string) => Promise<void>;\n isSwitching: boolean;\n switchError: Error | null;\n}\n\nconst EmporixContext = createContext<EmporixContextValue | null>(null);\nexport const EmporixSiteContext = createContext<SiteContextValue | null>(null);\n\n/**\n * Balanced React-Query defaults applied to the provider's fallback QueryClient\n * (only when no `queryClient` prop is passed). Keeps the Emporix API-quota in\n * check by suppressing window-focus refetches and capping retries.\n */\nconst DEFAULT_QUERY_OPTIONS = {\n staleTime: 30_000,\n refetchOnWindowFocus: false,\n retry: 1,\n} as const;\n\n/** Props for {@link EmporixProvider}. */\nexport interface EmporixProviderProps {\n client: EmporixClient;\n queryClient?: QueryClient;\n storage?: EmporixStorage;\n initialCustomerToken?: string;\n /**\n * Initial site code. Resolution order: this prop → `storage.getSiteCode()` →\n * `client.config.credentials.storefront.context.siteCode` → `null`.\n */\n initialSiteCode?: string;\n /**\n * Initial active legal-entity id (B2B). When set, the CompanyContext\n * provider tries to match it against `companies.listMine()` once the\n * customer is loaded; mismatches are dropped silently.\n */\n initialActiveLegalEntityId?: string | null;\n /**\n * Opt-in telemetry callback. Receives a typed event stream covering cache\n * hit/miss, refetches, errors, mutations, auth refreshes, storage writes,\n * and consumer-emitted custom events. Wire this to Datadog/Sentry/custom\n * analytics. The handler is wrapped in try/catch — a throwing handler\n * never breaks the provider.\n */\n onTelemetry?: (event: EmporixTelemetryEvent) => void;\n /**\n * Opt in to reactive customer-token auto-refresh: on a `customer`-kind 401,\n * the SDK refreshes once (via the stored refresh token + anonymous auth) and\n * retries. Default: false (the customer token stays caller-owned).\n */\n autoRefreshCustomerToken?: boolean;\n /**\n * Called when a customer-token refresh is needed but fails (refresh token\n * expired/revoked) or no refresh token is stored. Use to drive logout /\n * redirect to login.\n */\n onCustomerSessionExpired?: () => void;\n children: ReactNode;\n}\n\n/** Provides the SDK client, token storage, react-query client, and site context to the tree. */\nexport function EmporixProvider({\n client,\n queryClient,\n storage,\n initialCustomerToken,\n initialSiteCode,\n initialActiveLegalEntityId,\n onTelemetry,\n autoRefreshCustomerToken,\n onCustomerSessionExpired,\n children,\n}: EmporixProviderProps): React.JSX.Element {\n const value = useMemo<EmporixContextValue>(() => {\n const s =\n storage ??\n createMemoryStorage(\n initialCustomerToken !== undefined ? { initial: initialCustomerToken } : {},\n );\n if (initialCustomerToken && storage && storage.getCustomerToken() === null) {\n storage.setCustomerToken(initialCustomerToken);\n }\n return { client, storage: s };\n \n }, [client, storage, initialCustomerToken]);\n const qc = useMemo(\n () =>\n queryClient ??\n new QueryClient({ defaultOptions: { queries: DEFAULT_QUERY_OPTIONS } }),\n [queryClient],\n );\n\n // Idempotent one-time wiring: attaches a storage-backed adapter to the SDK's\n // token provider so anonymous sessions survive reloads. Runs once per\n // (client, storage) pair via useState's lazy initializer.\n useState(() => {\n client.tokenProvider.attachAnonymousStore?.({\n read: () => value.storage.getAnonymousSession(),\n write: (s) => value.storage.setAnonymousSession(s),\n });\n return null;\n });\n\n // Telemetry: stable safeEmit + context value. emit is no-op when no\n // onTelemetry callback was provided (no overhead).\n const safeEmit = useCallback(\n (event: EmporixTelemetryEvent) => {\n if (!onTelemetry) return;\n try {\n onTelemetry(event);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(\"[emporix] telemetry handler threw:\", err);\n }\n },\n [onTelemetry],\n );\n const telemetryValue = useMemo(() => ({ emit: safeEmit }), [safeEmit]);\n\n // Source subscriptions: cache + mutation cache + token-provider + storage.\n // All only active when onTelemetry is provided.\n useEffect(() => {\n if (!onTelemetry) return;\n const startedAt = new Map<string, number>();\n\n const unsubQuery = qc.getQueryCache().subscribe((event) => {\n const key = event.query.queryKey;\n if (!Array.isArray(key) || key[0] !== \"emporix\") return;\n if (event.type === \"updated\") {\n const action = event.action as { type: string };\n if (action.type === \"fetch\") {\n const isRefetch = event.query.state.dataUpdateCount > 0;\n if (isRefetch) {\n safeEmit({\n type: \"query.refetch\",\n queryKey: key,\n tenant: client.tenant,\n reason: \"invalidate\",\n });\n }\n startedAt.set(event.query.queryHash, Date.now());\n } else if (action.type === \"success\") {\n const start = startedAt.get(event.query.queryHash);\n startedAt.delete(event.query.queryHash);\n safeEmit({\n type: \"cache.miss\",\n queryKey: key,\n tenant: client.tenant,\n durationMs: start ? Date.now() - start : 0,\n });\n } else if (action.type === \"error\") {\n startedAt.delete(event.query.queryHash);\n safeEmit({\n type: \"query.error\",\n queryKey: key,\n tenant: client.tenant,\n error: event.query.state.error,\n });\n }\n } else if (event.type === \"observerResultsUpdated\") {\n const s = event.query.state;\n if (s.status === \"success\" && s.fetchStatus === \"idle\" && s.dataUpdateCount > 0) {\n safeEmit({ type: \"cache.hit\", queryKey: key, tenant: client.tenant });\n }\n }\n });\n\n const unsubMut = qc.getMutationCache().subscribe((event) => {\n if (event.type !== \"updated\") return;\n const m = event.mutation;\n const dur = Date.now() - (m.state.submittedAt ?? Date.now());\n const mk = m.options.mutationKey;\n if (m.state.status === \"success\") {\n safeEmit({\n type: \"mutation.success\",\n ...(mk ? { mutationKey: mk as readonly unknown[] } : {}),\n tenant: client.tenant,\n durationMs: dur,\n });\n } else if (m.state.status === \"error\") {\n safeEmit({\n type: \"mutation.error\",\n ...(mk ? { mutationKey: mk as readonly unknown[] } : {}),\n tenant: client.tenant,\n error: m.state.error,\n durationMs: dur,\n });\n }\n });\n\n const unsubAuth = client.tokenProvider.onRefresh?.((evt) =>\n safeEmit({ type: \"auth.refresh\", ...evt, tenant: client.tenant }),\n );\n\n const unsubStorage = value.storage.subscribeAll?.((key) =>\n safeEmit({ type: \"storage.write\", key }),\n );\n\n return () => {\n unsubQuery();\n unsubMut();\n unsubAuth?.();\n unsubStorage?.();\n };\n }, [qc, onTelemetry, client, value.storage, safeEmit]);\n\n // Opt-in reactive customer-token auto-refresh. Registered on the client so\n // the core HttpClient can refresh-and-retry a customer 401. Single-flight is\n // handled in the core registry. Off unless `autoRefreshCustomerToken`.\n useEffect(() => {\n if (!autoRefreshCustomerToken) return;\n const storage = value.storage;\n client.setCustomerTokenRefresher({\n refresh: async () => {\n const refreshToken = storage.getRefreshToken();\n if (!refreshToken) {\n safeEmit({ type: \"auth.refresh\", kind: \"customer\", success: false, tenant: client.tenant });\n onCustomerSessionExpired?.();\n return null;\n }\n try {\n const legalEntityId = storage.getActiveLegalEntityId() ?? undefined;\n const s = await client.customers.refresh({\n refreshToken,\n ...(legalEntityId ? { legalEntityId } : {}),\n });\n storage.setCustomerToken(s.customerToken);\n if (s.refreshToken) storage.setRefreshToken(s.refreshToken);\n safeEmit({ type: \"auth.refresh\", kind: \"customer\", success: true, tenant: client.tenant });\n return s.customerToken;\n } catch {\n safeEmit({ type: \"auth.refresh\", kind: \"customer\", success: false, tenant: client.tenant });\n onCustomerSessionExpired?.();\n return null;\n }\n },\n });\n return () => client.setCustomerTokenRefresher(null);\n }, [autoRefreshCustomerToken, client, value.storage, safeEmit, onCustomerSessionExpired]);\n\n return (\n <EmporixContext.Provider value={value}>\n <EmporixTelemetryContext.Provider value={telemetryValue}>\n <QueryClientProvider client={qc}>\n <SiteContextProvider\n client={client}\n storage={value.storage}\n {...(initialSiteCode !== undefined ? { initialSiteCode } : {})}\n >\n <CompanyContextProvider\n client={client}\n storage={value.storage}\n {...(initialActiveLegalEntityId !== undefined\n ? { initialActiveLegalEntityId }\n : {})}\n >\n {children}\n </CompanyContextProvider>\n </SiteContextProvider>\n </QueryClientProvider>\n </EmporixTelemetryContext.Provider>\n </EmporixContext.Provider>\n );\n}\n\n/**\n * Manages the active-site state. Sits inside `QueryClientProvider` so\n * `setSite` can invalidate the React-Query cache on switch.\n */\nfunction SiteContextProvider({\n client,\n storage,\n initialSiteCode,\n children,\n}: {\n client: EmporixClient;\n storage: EmporixStorage;\n initialSiteCode?: string;\n children: ReactNode;\n}): React.JSX.Element {\n const qc = useQueryClient();\n const [siteCode, setSiteCodeState] = useState<string | null>(() => {\n if (initialSiteCode !== undefined) return initialSiteCode;\n const fromStorage = storage.getSiteCode();\n if (fromStorage !== null) return fromStorage;\n return client.config?.credentials?.storefront?.context?.siteCode ?? null;\n });\n const [currency, setCurrencyState] = useState<string | null>(\n () => client.config?.credentials?.storefront?.context?.currency ?? null,\n );\n const [targetLocation, setTargetLocation] = useState<string | null>(null);\n const [isSwitching, setIsSwitching] = useState(false);\n const [switchError, setSwitchError] = useState<Error | null>(null);\n\n // Mount-time derivation: if a siteCode is already resolved, fetch its DTO\n // once so currency + targetLocation populate without a user-driven switch.\n // A currency seeded from the client config is NOT overridden (the user's /\n // persisted choice wins); only fields still `null` are filled in.\n useEffect(() => {\n if (!siteCode || (currency !== null && targetLocation !== null)) return;\n let cancelled = false;\n const token = storage.getCustomerToken();\n const authCtx = token ? auth.customer(token) : auth.anonymous();\n qc.fetchQuery({\n queryKey: [\n \"emporix\",\n \"site-by-code\",\n siteCode,\n { tenant: client.tenant, authKind: authCtx.kind },\n ],\n queryFn: () => client.sites.get(siteCode, authCtx),\n staleTime: 5 * 60_000,\n })\n .then((site) => {\n if (cancelled) return;\n if (currency === null) setCurrencyState(site.currency);\n setTargetLocation(site.homeBase?.address?.country ?? null);\n })\n .catch(() => {\n // Best-effort — silent. setSite-driven derivation surfaces real errors.\n });\n return () => {\n cancelled = true;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [siteCode]);\n\n const setSite = useCallback(\n async (code: string | null) => {\n // 1) Optimistic flip — UI moves immediately.\n storage.setSiteCode(code);\n storage.setCartId(null);\n setSiteCodeState(code);\n setSwitchError(null);\n void qc.invalidateQueries({ queryKey: [\"emporix\"] });\n\n if (code === null) {\n setCurrencyState(null);\n setTargetLocation(null);\n return;\n }\n\n setIsSwitching(true);\n try {\n const token = storage.getCustomerToken();\n const authCtx = token ? auth.customer(token) : auth.anonymous();\n // 2) Derive currency + targetLocation from the site DTO (cached 5min).\n const site = await qc.fetchQuery({\n queryKey: [\n \"emporix\",\n \"site-by-code\",\n code,\n { tenant: client.tenant, authKind: authCtx.kind },\n ],\n queryFn: () => client.sites.get(code, authCtx),\n staleTime: 5 * 60_000,\n });\n const nextCurrency = site.currency;\n const nextTarget = site.homeBase?.address?.country ?? null;\n setCurrencyState(nextCurrency);\n setTargetLocation(nextTarget);\n // 3) Push everything into the session-context PATCH.\n await client.sessionContext.patch(\n {\n siteCode: code,\n ...(nextCurrency ? { currency: nextCurrency } : {}),\n ...(nextTarget ? { targetLocation: nextTarget } : {}),\n },\n authCtx,\n );\n } catch (e) {\n setSwitchError(e instanceof Error ? e : new Error(String(e)));\n } finally {\n setIsSwitching(false);\n }\n },\n [client, storage, qc],\n );\n\n const setCurrency = useCallback(\n async (next: string) => {\n // Carts are currency-bound — drop the guest cart so a fresh one is created.\n storage.setCartId(null);\n setCurrencyState(next);\n setSwitchError(null);\n // Re-bind the anonymous price context so guest pricing uses the new\n // currency even before a session/cart exists (sessionContext.patch can't).\n client.setStorefrontContext({ currency: next });\n void qc.invalidateQueries({ queryKey: [\"emporix\"] });\n setIsSwitching(true);\n try {\n const token = storage.getCustomerToken();\n const authCtx = token ? auth.customer(token) : auth.anonymous();\n // Update an existing server session context (no-op / returns false pre-cart).\n await client.sessionContext.patch(\n { currency: next, ...(siteCode ? { siteCode } : {}) },\n authCtx,\n );\n } catch (e) {\n setSwitchError(e instanceof Error ? e : new Error(String(e)));\n } finally {\n setIsSwitching(false);\n }\n },\n [client, storage, qc, siteCode],\n );\n\n const value = useMemo<SiteContextValue>(\n () => ({\n siteCode,\n currency,\n targetLocation,\n setSite,\n setCurrency,\n isSwitching,\n switchError,\n }),\n [siteCode, currency, targetLocation, setSite, setCurrency, isSwitching, switchError],\n );\n\n return <EmporixSiteContext.Provider value={value}>{children}</EmporixSiteContext.Provider>;\n}\n\n/** Returns the SDK client and token storage. Throws outside an {@link EmporixProvider}. */\nexport function useEmporix(): EmporixContextValue {\n const ctx = useContext(EmporixContext);\n if (!ctx) throw new Error(\"useEmporix must be used within an EmporixProvider\");\n return ctx;\n}\n"]}