@doswiftly/storefront-sdk 4.7.2 → 7.0.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.
Files changed (48) hide show
  1. package/CHANGELOG.md +791 -0
  2. package/README.md +10 -10
  3. package/dist/core/auth/auth-client.d.ts +14 -8
  4. package/dist/core/auth/auth-client.d.ts.map +1 -1
  5. package/dist/core/auth/auth-client.js +26 -20
  6. package/dist/core/auth/handlers.d.ts +31 -0
  7. package/dist/core/auth/handlers.d.ts.map +1 -1
  8. package/dist/core/auth/handlers.js +69 -0
  9. package/dist/core/auth/types.d.ts +5 -5
  10. package/dist/core/auth/types.d.ts.map +1 -1
  11. package/dist/core/cache.d.ts +1 -1
  12. package/dist/core/cache.js +1 -1
  13. package/dist/core/cart/cart-client.d.ts +1 -1
  14. package/dist/core/cart/cart-client.js +1 -1
  15. package/dist/core/cart/types.d.ts +65 -45
  16. package/dist/core/cart/types.d.ts.map +1 -1
  17. package/dist/core/client/compose.d.ts +1 -1
  18. package/dist/core/client/compose.js +1 -1
  19. package/dist/core/client/create-client.d.ts +2 -2
  20. package/dist/core/client/create-client.js +2 -2
  21. package/dist/core/client/execute.d.ts.map +1 -1
  22. package/dist/core/client/execute.js +6 -0
  23. package/dist/core/client/types.js +1 -1
  24. package/dist/core/index.d.ts +2 -2
  25. package/dist/core/index.d.ts.map +1 -1
  26. package/dist/core/index.js +1 -1
  27. package/dist/core/language/cookie-config.d.ts +7 -2
  28. package/dist/core/language/cookie-config.d.ts.map +1 -1
  29. package/dist/core/language/cookie-config.js +7 -2
  30. package/dist/core/operations/auth.d.ts +11 -5
  31. package/dist/core/operations/auth.d.ts.map +1 -1
  32. package/dist/core/operations/auth.js +22 -16
  33. package/dist/core/operations/cart.d.ts +8 -8
  34. package/dist/core/operations/cart.d.ts.map +1 -1
  35. package/dist/core/operations/cart.js +58 -42
  36. package/dist/index.d.ts +1 -1
  37. package/dist/index.js +1 -1
  38. package/dist/react/hooks/use-auth.d.ts +4 -4
  39. package/dist/react/hooks/use-auth.d.ts.map +1 -1
  40. package/dist/react/hooks/use-auth.js +11 -18
  41. package/dist/react/hooks/use-cart-manager.d.ts +1 -1
  42. package/dist/react/hooks/use-cart-manager.js +1 -1
  43. package/dist/react/index.d.ts +1 -1
  44. package/dist/react/index.d.ts.map +1 -1
  45. package/dist/react/stores/auth.store.d.ts +0 -2
  46. package/dist/react/stores/auth.store.d.ts.map +1 -1
  47. package/dist/react/stores/auth.store.js +10 -7
  48. package/package.json +2 -3
@@ -27,7 +27,7 @@ export function useAuth(options = {}) {
27
27
  const authStore = useAuthStoreApi();
28
28
  const [isLoggingIn, setIsLoggingIn] = useState(false);
29
29
  const [isLoggingOut, setIsLoggingOut] = useState(false);
30
- const [isRenewingToken, setIsRenewingToken] = useState(false);
30
+ const [isRefreshingToken, setIsRenewingToken] = useState(false);
31
31
  const [error, setError] = useState(null);
32
32
  const login = useCallback(async (email, password) => {
33
33
  setError(null);
@@ -40,7 +40,7 @@ export function useAuth(options = {}) {
40
40
  }
41
41
  // Fetch customer data and set store
42
42
  try {
43
- const customer = await authClient.getCustomer(result.accessToken);
43
+ const customer = await authClient.getCustomer();
44
44
  if (customer) {
45
45
  setAuth({
46
46
  id: customer.id,
@@ -87,10 +87,8 @@ export function useAuth(options = {}) {
87
87
  setError(null);
88
88
  setIsLoggingOut(true);
89
89
  try {
90
- const token = authStore.getState().accessToken;
91
- if (token) {
92
- await authClient.logout(token);
93
- }
90
+ // Auth context resolved server-side from cookie/Bearer — no token arg needed
91
+ await authClient.logout();
94
92
  // Clear httpOnly cookie
95
93
  if (options.onClearToken) {
96
94
  await options.onClearToken();
@@ -109,18 +107,13 @@ export function useAuth(options = {}) {
109
107
  setIsLoggingOut(false);
110
108
  }
111
109
  }, [authClient, clearAuth, options, authStore]);
112
- const renewToken = useCallback(async () => {
110
+ const refreshToken = useCallback(async () => {
113
111
  setError(null);
114
112
  setIsRenewingToken(true);
115
113
  try {
116
- const token = authStore.getState().accessToken;
117
- if (!token) {
118
- return {
119
- success: false,
120
- userErrors: [{ message: 'No token to renew' }],
121
- };
122
- }
123
- const result = await authClient.renewToken(token);
114
+ // Auth context resolved server-side from cookie/Bearer — no token arg needed.
115
+ // If no active session, backend will return 401 and refreshToken throws.
116
+ const result = await authClient.refreshToken();
124
117
  // Update httpOnly cookie
125
118
  if (options.onSetToken) {
126
119
  await options.onSetToken(result.accessToken);
@@ -158,11 +151,11 @@ export function useAuth(options = {}) {
158
151
  return {
159
152
  login,
160
153
  logout,
161
- renewToken,
154
+ refreshToken,
162
155
  isLoggingIn,
163
156
  isLoggingOut,
164
- isRenewingToken,
165
- isLoading: isLoggingIn || isLoggingOut || isRenewingToken,
157
+ isRefreshingToken,
158
+ isLoading: isLoggingIn || isLoggingOut || isRefreshingToken,
166
159
  error,
167
160
  };
168
161
  }
@@ -9,7 +9,7 @@
9
9
  * ```tsx
10
10
  * const { addItem, updateQuantity, removeItem, isLoading } = useCartManager();
11
11
  *
12
- * await addItem([{ merchandiseId: 'variant-123', quantity: 1 }]);
12
+ * await addItem([{ variantId: 'variant-123', quantity: 1 }]);
13
13
  * ```
14
14
  */
15
15
  import type { Cart, CartLineInput, CartLineUpdateInput } from '../../core/cart/types';
@@ -9,7 +9,7 @@
9
9
  * ```tsx
10
10
  * const { addItem, updateQuantity, removeItem, isLoading } = useCartManager();
11
11
  *
12
- * await addItem([{ merchandiseId: 'variant-123', quantity: 1 }]);
12
+ * await addItem([{ variantId: 'variant-123', quantity: 1 }]);
13
13
  * ```
14
14
  */
15
15
  'use client';
@@ -15,7 +15,7 @@ export { StorefrontProvider, type StorefrontProviderProps } from './providers/st
15
15
  export { StorefrontClientProvider, type StorefrontClientProviderProps } from './providers/storefront-client-provider';
16
16
  export { CurrencyProvider, type CurrencyProviderProps } from './providers/currency-provider';
17
17
  export { LanguageProvider, type LanguageProviderProps } from './providers/language-provider';
18
- export { useAuth, type UseAuthOptions, type LoginResult, type LogoutResult, type TokenRenewResult } from './hooks/use-auth';
18
+ export { useAuth, type UseAuthOptions, type LoginResult, type LogoutResult, type TokenRefreshResult } from './hooks/use-auth';
19
19
  export { useCartManager } from './hooks/use-cart-manager';
20
20
  export { useStorefrontClient } from './hooks/use-storefront-client';
21
21
  export { useCurrency } from './hooks/use-currency';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EAAE,kBAAkB,EAAE,KAAK,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AACnG,OAAO,EAAE,wBAAwB,EAAE,KAAK,6BAA6B,EAAE,MAAM,wCAAwC,CAAC;AACtH,OAAO,EAAE,gBAAgB,EAAE,KAAK,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAC7F,OAAO,EAAE,gBAAgB,EAAE,KAAK,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAG7F,OAAO,EAAE,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,WAAW,EAAE,KAAK,YAAY,EAAE,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAC5H,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGnD,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACxF,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC/E,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAG/E,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnE,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC/E,YAAY,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAGtD,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACxH,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAGlI,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,0BAA0B,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC;AAGrH,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAG9D,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAGhE,OAAO,EACL,eAAe,EACf,YAAY,EACZ,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,SAAS,EACT,eAAe,EACf,WAAW,EACX,QAAQ,EACR,kBAAkB,EAClB,aAAa,EACb,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAGpF,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EAAE,kBAAkB,EAAE,KAAK,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AACnG,OAAO,EAAE,wBAAwB,EAAE,KAAK,6BAA6B,EAAE,MAAM,wCAAwC,CAAC;AACtH,OAAO,EAAE,gBAAgB,EAAE,KAAK,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAC7F,OAAO,EAAE,gBAAgB,EAAE,KAAK,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAG7F,OAAO,EAAE,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,WAAW,EAAE,KAAK,YAAY,EAAE,KAAK,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC9H,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGnD,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACxF,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC/E,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAG/E,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnE,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC/E,YAAY,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAGtD,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACxH,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAGlI,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,0BAA0B,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC;AAGrH,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAG9D,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAGhE,OAAO,EACL,eAAe,EACf,YAAY,EACZ,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,SAAS,EACT,eAAe,EACf,WAAW,EACX,QAAQ,EACR,kBAAkB,EAClB,aAAa,EACb,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAGpF,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC"}
@@ -30,7 +30,6 @@ export declare const createAuthStore: (initialIsAuthenticated?: boolean) => Omit
30
30
  persist: {
31
31
  setOptions: (options: Partial<import("zustand/middleware").PersistOptions<AuthStore, {
32
32
  customer: CustomerInfo | null;
33
- accessToken: string | null;
34
33
  isAuthenticated: boolean;
35
34
  }, unknown>>) => void;
36
35
  clearStorage: () => void;
@@ -40,7 +39,6 @@ export declare const createAuthStore: (initialIsAuthenticated?: boolean) => Omit
40
39
  onFinishHydration: (fn: (state: AuthStore) => void) => () => void;
41
40
  getOptions: () => Partial<import("zustand/middleware").PersistOptions<AuthStore, {
42
41
  customer: CustomerInfo | null;
43
- accessToken: string | null;
44
42
  isAuthenticated: boolean;
45
43
  }, unknown>>;
46
44
  };
@@ -1 +1 @@
1
- {"version":3,"file":"auth.store.d.ts","sourceRoot":"","sources":["../../../src/react/stores/auth.store.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IAExB,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAC;IAC9B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,eAAe,EAAE,OAAO,CAAC;IACzB,SAAS,EAAE,OAAO,CAAC;IAGnB,OAAO,EAAE,CAAC,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/D,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,cAAc,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC,KAAK,IAAI,CAAC;IACzD,UAAU,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;CAC1C;AAED,eAAO,MAAM,eAAe,GAAI,gCAA8B;;;;;sBA+DtC,YAAY,GAAG,IAAI;yBAChB,MAAM,GAAG,IAAI;6BACT,OAAO;;;;;;;;sBAFd,YAAY,GAAG,IAAI;yBAChB,MAAM,GAAG,IAAI;6BACT,OAAO;;;CAWnC,CAAC"}
1
+ {"version":3,"file":"auth.store.d.ts","sourceRoot":"","sources":["../../../src/react/stores/auth.store.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IAExB,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAC;IAC9B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,eAAe,EAAE,OAAO,CAAC;IACzB,SAAS,EAAE,OAAO,CAAC;IAGnB,OAAO,EAAE,CAAC,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/D,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,cAAc,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC,KAAK,IAAI,CAAC;IACzD,UAAU,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;CAC1C;AAED,eAAO,MAAM,eAAe,GAAI,gCAA8B;;;;;sBAkEtC,YAAY,GAAG,IAAI;6BACZ,OAAO;;;;;;;;sBADd,YAAY,GAAG,IAAI;6BACZ,OAAO;;;CAUnC,CAAC"}
@@ -32,10 +32,12 @@ export const createAuthStore = (initialIsAuthenticated = false) => createStore()
32
32
  setLoading: (isLoading) => set({ isLoading }),
33
33
  }), {
34
34
  name: 'auth-storage',
35
- version: 2, // Invalidate stale data from old module-level store era
35
+ version: 3, // v3 (Iteracja 2 XSS fix): accessToken DROP'owany z localStorage
36
+ // persistence. Token żyje tylko w-memory + httpOnly cookie (browser auto-sent).
37
+ // Non-browser klienci (mobile native, server-to-server) ustawiają token explicit
38
+ // przez setAuth() — nigdy nie persistowany w localStorage SDK.
36
39
  partialize: (state) => ({
37
40
  customer: state.customer,
38
- accessToken: state.accessToken,
39
41
  isAuthenticated: state.isAuthenticated,
40
42
  }),
41
43
  /**
@@ -51,16 +53,17 @@ export const createAuthStore = (initialIsAuthenticated = false) => createStore()
51
53
  return {
52
54
  ...currentState,
53
55
  customer: persisted.customer ?? currentState.customer,
54
- accessToken: persisted.accessToken ?? currentState.accessToken,
56
+ // accessToken NIE persistowany — initialize zawsze na null (in-memory only)
55
57
  // Server cookie is the authority — never let stale localStorage override it
56
58
  isAuthenticated: currentState.isAuthenticated,
57
59
  };
58
60
  },
59
61
  migrate: (persistedState, version) => {
60
- if (version < 2) {
61
- // Data from old module-level store may be unreliable (Turbopack duplication)
62
- // Clear it user will re-authenticate via cookie or login
63
- return { customer: null, accessToken: null, isAuthenticated: false };
62
+ if (version < 3) {
63
+ // v1→v2: Turbopack duplication cleanup; v2→v3: XSS fix accessToken usunięty
64
+ // z localStorage. Po migracji store start fresh, użytkownik re-auth przez
65
+ // cookie hydration (BFF /api/auth/whoami) lub login flow.
66
+ return { customer: null, isAuthenticated: false };
64
67
  }
65
68
  return persistedState;
66
69
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@doswiftly/storefront-sdk",
3
- "version": "4.7.2",
3
+ "version": "7.0.0",
4
4
  "description": "Storefront runtime SDK for DoSwiftly Commerce — layered transport, middleware pipeline, React providers, Zustand stores, cache strategies. 0 runtime dependencies in core.",
5
5
  "type": "module",
6
6
  "files": [
@@ -35,8 +35,7 @@
35
35
  "graphql",
36
36
  "react",
37
37
  "zustand",
38
- "middleware",
39
- "hydrogen"
38
+ "middleware"
40
39
  ],
41
40
  "author": "DoSwiftly Team",
42
41
  "license": "MIT",