@viu/emporix-sdk 3.0.0 → 3.1.1

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/CHANGELOG.md CHANGED
@@ -1,5 +1,50 @@
1
1
  # @viu/emporix-sdk
2
2
 
3
+ ## 3.1.1
4
+
5
+ ### Patch Changes
6
+
7
+ - [#305](https://github.com/viuteam/emporix-sdk/pull/305) [`4dfeefc`](https://github.com/viuteam/emporix-sdk/commit/4dfeefcdab7fe9d6b41e31d9cee6f4763b8862f2) Thanks [@viu-release-bot](https://github.com/apps/viu-release-bot)! - chore(sdk): sync generated types with upstream Emporix API specs
8
+
9
+ Updated services: ai-service,import-service
10
+
11
+ ## 3.1.0
12
+
13
+ ### Minor Changes
14
+
15
+ - [#301](https://github.com/viuteam/emporix-sdk/pull/301) [`edf1e03`](https://github.com/viuteam/emporix-sdk/commit/edf1e03a3fc95c47023016de0ffeb1c12a9dd46e) Thanks [@amnael1](https://github.com/amnael1)! - feat(sdk): move the query-key builder, customer-session store and browser storage backends into the core SDK
16
+
17
+ `emporixKey`, `siteMeta`, `getCustomerSessionStore`, `createListenerSet` and the
18
+ browser storage backends (`createMemoryStorage`, `createLocalStorage`,
19
+ `createSessionStorage`, `createCookieStorage`, `fromWebStorage`) are now defined
20
+ in `@viu/emporix-sdk` and re-exported from `@viu/emporix-sdk-react`.
21
+
22
+ **No breaking change and no behaviour change.** Every existing import keeps
23
+ working, and each moved symbol is the same object through both paths — asserted
24
+ by identity, not deep equality, in `tests/agnostic-single-source.test.ts`,
25
+ because a duplicated implementation would pass a `toEqual` check and then drift.
26
+ The React suite passes unchanged: every file it touched became a re-export of
27
+ the same object.
28
+
29
+ This is the third instance of a move this repo has already made twice, for the
30
+ same reason: `STORAGE_KEYS` and `EmporixStorage` went down so
31
+ `@viu/emporix-sdk-next` could stop depending on the React bindings. These go
32
+ down so an Angular binding can do the same. A cache-key builder duplicated per
33
+ framework agrees on the day it is written and splits every cache entry in half
34
+ thereafter.
35
+
36
+ **The SDK stays DOM-free at the type level.** It compiles with `lib: ["ES2022"]`
37
+ and no `"DOM"`, which is what keeps it runnable on Node, edge runtimes and
38
+ workers. Rather than switch that guard off for all ~60 services to satisfy one
39
+ file, `core/browser-storage.ts` reaches `localStorage`, `sessionStorage`,
40
+ `document` and `location` through a narrowed `globalThis` — the pattern the
41
+ localStorage availability check already used before the move.
42
+
43
+ `scripts/check-treeshake.mjs` now also probes for `localStorage` and
44
+ `document.cookie`, so a Node or edge consumer that never imports a browser
45
+ backend provably does not pay for one. A `createEmporixClient`-only bundle is
46
+ 29.1 KB, unchanged by this move.
47
+
3
48
  ## 3.0.0
4
49
 
5
50
  ### Major Changes
package/dist/index.cjs CHANGED
@@ -679,6 +679,249 @@ function serverAuth(storage) {
679
679
  return token !== null ? auth.customer(token) : auth.anonymous();
680
680
  }
681
681
 
682
+ // src/core/browser-storage.ts
683
+ var browser = globalThis;
684
+ function createListenerSet() {
685
+ const listeners = /* @__PURE__ */ new Set();
686
+ return {
687
+ add(l) {
688
+ listeners.add(l);
689
+ return () => listeners.delete(l);
690
+ },
691
+ notify(value) {
692
+ for (const l of listeners) {
693
+ try {
694
+ l(value);
695
+ } catch {
696
+ }
697
+ }
698
+ }
699
+ };
700
+ }
701
+ function createMemoryStorage(opts = {}) {
702
+ let token = opts.initial ?? null;
703
+ let cartId = null;
704
+ let anon = null;
705
+ let siteCode = null;
706
+ let language = null;
707
+ let activeLegalEntityId = null;
708
+ let refreshToken = null;
709
+ let saasToken = null;
710
+ const tokenListeners = /* @__PURE__ */ new Set();
711
+ const all = createListenerSet();
712
+ return {
713
+ getCustomerToken: () => token,
714
+ setCustomerToken: (t) => {
715
+ token = t;
716
+ for (const l of tokenListeners) l(token);
717
+ all.notify("customerToken");
718
+ },
719
+ subscribe: (l) => {
720
+ tokenListeners.add(l);
721
+ return () => tokenListeners.delete(l);
722
+ },
723
+ getCartId: () => cartId,
724
+ setCartId: (id) => {
725
+ cartId = id;
726
+ all.notify("cartId");
727
+ },
728
+ getAnonymousSession: () => anon,
729
+ setAnonymousSession: (s) => {
730
+ anon = s;
731
+ all.notify("anonymousSession");
732
+ },
733
+ getSiteCode: () => siteCode,
734
+ setSiteCode: (code) => {
735
+ siteCode = code;
736
+ all.notify("siteCode");
737
+ },
738
+ getLanguage: () => language,
739
+ setLanguage: (l) => {
740
+ language = l;
741
+ all.notify("language");
742
+ },
743
+ getActiveLegalEntityId: () => activeLegalEntityId,
744
+ setActiveLegalEntityId: (id) => {
745
+ activeLegalEntityId = id;
746
+ all.notify("activeLegalEntityId");
747
+ },
748
+ getRefreshToken: () => refreshToken,
749
+ setRefreshToken: (t) => {
750
+ refreshToken = t;
751
+ all.notify("refreshToken");
752
+ },
753
+ getSaasToken: () => saasToken,
754
+ setSaasToken: (t) => {
755
+ saasToken = t;
756
+ all.notify("saasToken");
757
+ },
758
+ subscribeAll: (l) => all.add(l)
759
+ };
760
+ }
761
+ function fromWebStorage(storage, opts = {}) {
762
+ const tokenKey = opts.key ?? STORAGE_KEYS.customerToken;
763
+ const tokenListeners = /* @__PURE__ */ new Set();
764
+ const all = createListenerSet();
765
+ return {
766
+ getCustomerToken: () => storage.getItem(tokenKey),
767
+ setCustomerToken: (t) => {
768
+ if (t === null) storage.removeItem(tokenKey);
769
+ else storage.setItem(tokenKey, t);
770
+ for (const l of tokenListeners) l(t);
771
+ all.notify("customerToken");
772
+ },
773
+ subscribe: (l) => {
774
+ tokenListeners.add(l);
775
+ return () => tokenListeners.delete(l);
776
+ },
777
+ getCartId: () => storage.getItem(STORAGE_KEYS.cartId),
778
+ setCartId: (id) => {
779
+ if (id === null) storage.removeItem(STORAGE_KEYS.cartId);
780
+ else storage.setItem(STORAGE_KEYS.cartId, id);
781
+ all.notify("cartId");
782
+ },
783
+ getAnonymousSession: () => parseAnonymousSession(storage.getItem(STORAGE_KEYS.anonymousSession)),
784
+ setAnonymousSession: (s) => {
785
+ if (s === null) storage.removeItem(STORAGE_KEYS.anonymousSession);
786
+ else
787
+ storage.setItem(
788
+ STORAGE_KEYS.anonymousSession,
789
+ JSON.stringify({ refreshToken: s.refreshToken, sessionId: s.sessionId })
790
+ );
791
+ all.notify("anonymousSession");
792
+ },
793
+ getSiteCode: () => storage.getItem(STORAGE_KEYS.siteCode),
794
+ setSiteCode: (code) => {
795
+ if (code === null) storage.removeItem(STORAGE_KEYS.siteCode);
796
+ else storage.setItem(STORAGE_KEYS.siteCode, code);
797
+ all.notify("siteCode");
798
+ },
799
+ getLanguage: () => storage.getItem(STORAGE_KEYS.language),
800
+ setLanguage: (l) => {
801
+ if (l === null) storage.removeItem(STORAGE_KEYS.language);
802
+ else storage.setItem(STORAGE_KEYS.language, l);
803
+ all.notify("language");
804
+ },
805
+ getActiveLegalEntityId: () => storage.getItem(STORAGE_KEYS.activeLegalEntityId),
806
+ setActiveLegalEntityId: (id) => {
807
+ if (id === null) storage.removeItem(STORAGE_KEYS.activeLegalEntityId);
808
+ else storage.setItem(STORAGE_KEYS.activeLegalEntityId, id);
809
+ all.notify("activeLegalEntityId");
810
+ },
811
+ getRefreshToken: () => storage.getItem(STORAGE_KEYS.refreshToken),
812
+ setRefreshToken: (t) => {
813
+ if (t === null) storage.removeItem(STORAGE_KEYS.refreshToken);
814
+ else storage.setItem(STORAGE_KEYS.refreshToken, t);
815
+ all.notify("refreshToken");
816
+ },
817
+ getSaasToken: () => storage.getItem(STORAGE_KEYS.saasToken),
818
+ setSaasToken: (t) => {
819
+ if (t === null) storage.removeItem(STORAGE_KEYS.saasToken);
820
+ else storage.setItem(STORAGE_KEYS.saasToken, t);
821
+ all.notify("saasToken");
822
+ },
823
+ subscribeAll: (l) => all.add(l)
824
+ };
825
+ }
826
+ function createLocalStorage(opts = {}) {
827
+ const store = browser.localStorage;
828
+ if (store === void 0) {
829
+ console.warn("[emporix] localStorage unavailable; falling back to in-memory storage");
830
+ return createMemoryStorage();
831
+ }
832
+ return fromWebStorage(store, opts);
833
+ }
834
+ var createLocalStorageStorage = createLocalStorage;
835
+ function createSessionStorage(opts = {}) {
836
+ const store = browser.sessionStorage;
837
+ if (store === void 0) {
838
+ console.warn("[emporix] sessionStorage unavailable; falling back to in-memory storage");
839
+ return createMemoryStorage();
840
+ }
841
+ return fromWebStorage(store, opts);
842
+ }
843
+ function createCookieStorage(opts = {}) {
844
+ const sameSite = opts.sameSite ?? "lax";
845
+ const secure = opts.secure ?? browser.location?.protocol === "https:";
846
+ const doc = browser.document;
847
+ if (doc === void 0) {
848
+ console.warn("[emporix] document unavailable; cookie storage falling back to in-memory");
849
+ return createMemoryStorage();
850
+ }
851
+ const attrs = `path=/; SameSite=${sameSite}${secure ? "; Secure" : ""}`;
852
+ const all = createListenerSet();
853
+ const storage = createCookieBackedStorage(
854
+ {
855
+ get: (name) => {
856
+ for (const part of doc.cookie.split("; ")) {
857
+ const [k, ...v] = part.split("=");
858
+ if (k === name) return decodeURIComponent(v.join("=")) || null;
859
+ }
860
+ return null;
861
+ },
862
+ set: (name, value) => {
863
+ doc.cookie = value === null ? `${name}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; ${attrs}` : `${name}=${encodeURIComponent(value)}; ${attrs}`;
864
+ }
865
+ },
866
+ {
867
+ ...opts.name !== void 0 ? { tokenName: opts.name } : {},
868
+ notify: (key) => all.notify(key)
869
+ }
870
+ );
871
+ return { ...storage, subscribeAll: (l) => all.add(l) };
872
+ }
873
+
874
+ // src/core/query-keys.ts
875
+ function emporixKey(resource, args, context) {
876
+ const meta = {
877
+ tenant: context.tenant,
878
+ authKind: context.authKind
879
+ };
880
+ if (context.siteCode !== void 0) {
881
+ meta.siteCode = context.siteCode;
882
+ }
883
+ if (context.language !== void 0) {
884
+ meta.language = context.language;
885
+ }
886
+ return ["emporix", resource, ...args, meta];
887
+ }
888
+ function siteMeta(site, siteCode, language) {
889
+ return site === "full" ? { siteCode, language } : site === "language" ? { language } : {};
890
+ }
891
+
892
+ // src/core/customer-session-store.ts
893
+ var stores = /* @__PURE__ */ new WeakMap();
894
+ function getCustomerSessionStore(storage) {
895
+ const existing = stores.get(storage);
896
+ if (existing) return existing;
897
+ let state = {
898
+ token: storage.getCustomerToken(),
899
+ refreshToken: storage.getRefreshToken(),
900
+ saasToken: storage.getSaasToken?.() ?? null
901
+ };
902
+ const listeners = /* @__PURE__ */ new Set();
903
+ const store = {
904
+ getSnapshot: () => state,
905
+ setState: (next) => {
906
+ const resolved = typeof next === "function" ? next(state) : next;
907
+ if (resolved === state) return;
908
+ state = resolved;
909
+ for (const listener of listeners) listener();
910
+ },
911
+ subscribe: (listener) => {
912
+ listeners.add(listener);
913
+ return () => {
914
+ listeners.delete(listener);
915
+ };
916
+ }
917
+ };
918
+ storage.subscribe?.((t) => {
919
+ store.setState((s) => s.token === t ? s : { ...s, token: t });
920
+ });
921
+ stores.set(storage, store);
922
+ return store;
923
+ }
924
+
682
925
  // src/core/sse.ts
683
926
  function parseFrame(frame) {
684
927
  const ev = { data: "" };
@@ -999,7 +1242,7 @@ var HttpClient = class {
999
1242
  };
1000
1243
 
1001
1244
  // package.json
1002
- var version = "3.0.0";
1245
+ var version = "3.1.1";
1003
1246
 
1004
1247
  // src/version.ts
1005
1248
  var SDK_VERSION = version;
@@ -8874,11 +9117,20 @@ exports.approvalStatusPatch = approvalStatusPatch;
8874
9117
  exports.auth = auth;
8875
9118
  exports.createConsoleLogger = createConsoleLogger;
8876
9119
  exports.createCookieBackedStorage = createCookieBackedStorage;
9120
+ exports.createCookieStorage = createCookieStorage;
8877
9121
  exports.createCore = createCore;
8878
9122
  exports.createEmporixClient = createEmporixClient;
9123
+ exports.createListenerSet = createListenerSet;
9124
+ exports.createLocalStorage = createLocalStorage;
9125
+ exports.createLocalStorageStorage = createLocalStorageStorage;
9126
+ exports.createMemoryStorage = createMemoryStorage;
8879
9127
  exports.createNoopLogger = createNoopLogger;
8880
9128
  exports.createServerStorage = createServerStorage;
9129
+ exports.createSessionStorage = createSessionStorage;
9130
+ exports.emporixKey = emporixKey;
8881
9131
  exports.errorFromResponse = errorFromResponse;
9132
+ exports.fromWebStorage = fromWebStorage;
9133
+ exports.getCustomerSessionStore = getCustomerSessionStore;
8882
9134
  exports.iterateAll = iterateAll;
8883
9135
  exports.parseAnonymousSession = parseAnonymousSession;
8884
9136
  exports.pickFee = pickFee;
@@ -8889,6 +9141,7 @@ exports.resolveQuery = resolveQuery;
8889
9141
  exports.resolveToken = resolveToken;
8890
9142
  exports.resolveZone = resolveZone;
8891
9143
  exports.serverAuth = serverAuth;
9144
+ exports.siteMeta = siteMeta;
8892
9145
  exports.validateConfig = validateConfig;
8893
9146
  //# sourceMappingURL=index.cjs.map
8894
9147
  //# sourceMappingURL=index.cjs.map