@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.
- package/CHANGELOG.md +791 -0
- package/README.md +10 -10
- package/dist/core/auth/auth-client.d.ts +14 -8
- package/dist/core/auth/auth-client.d.ts.map +1 -1
- package/dist/core/auth/auth-client.js +26 -20
- package/dist/core/auth/handlers.d.ts +31 -0
- package/dist/core/auth/handlers.d.ts.map +1 -1
- package/dist/core/auth/handlers.js +69 -0
- package/dist/core/auth/types.d.ts +5 -5
- package/dist/core/auth/types.d.ts.map +1 -1
- package/dist/core/cache.d.ts +1 -1
- package/dist/core/cache.js +1 -1
- package/dist/core/cart/cart-client.d.ts +1 -1
- package/dist/core/cart/cart-client.js +1 -1
- package/dist/core/cart/types.d.ts +65 -45
- package/dist/core/cart/types.d.ts.map +1 -1
- package/dist/core/client/compose.d.ts +1 -1
- package/dist/core/client/compose.js +1 -1
- package/dist/core/client/create-client.d.ts +2 -2
- package/dist/core/client/create-client.js +2 -2
- package/dist/core/client/execute.d.ts.map +1 -1
- package/dist/core/client/execute.js +6 -0
- package/dist/core/client/types.js +1 -1
- package/dist/core/index.d.ts +2 -2
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +1 -1
- package/dist/core/language/cookie-config.d.ts +7 -2
- package/dist/core/language/cookie-config.d.ts.map +1 -1
- package/dist/core/language/cookie-config.js +7 -2
- package/dist/core/operations/auth.d.ts +11 -5
- package/dist/core/operations/auth.d.ts.map +1 -1
- package/dist/core/operations/auth.js +22 -16
- package/dist/core/operations/cart.d.ts +8 -8
- package/dist/core/operations/cart.d.ts.map +1 -1
- package/dist/core/operations/cart.js +58 -42
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/react/hooks/use-auth.d.ts +4 -4
- package/dist/react/hooks/use-auth.d.ts.map +1 -1
- package/dist/react/hooks/use-auth.js +11 -18
- package/dist/react/hooks/use-cart-manager.d.ts +1 -1
- package/dist/react/hooks/use-cart-manager.js +1 -1
- package/dist/react/index.d.ts +1 -1
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/stores/auth.store.d.ts +0 -2
- package/dist/react/stores/auth.store.d.ts.map +1 -1
- package/dist/react/stores/auth.store.js +10 -7
- 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 [
|
|
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(
|
|
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
|
-
|
|
91
|
-
|
|
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
|
|
110
|
+
const refreshToken = useCallback(async () => {
|
|
113
111
|
setError(null);
|
|
114
112
|
setIsRenewingToken(true);
|
|
115
113
|
try {
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
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
|
-
|
|
154
|
+
refreshToken,
|
|
162
155
|
isLoggingIn,
|
|
163
156
|
isLoggingOut,
|
|
164
|
-
|
|
165
|
-
isLoading: isLoggingIn || isLoggingOut ||
|
|
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([{
|
|
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([{
|
|
12
|
+
* await addItem([{ variantId: 'variant-123', quantity: 1 }]);
|
|
13
13
|
* ```
|
|
14
14
|
*/
|
|
15
15
|
'use client';
|
package/dist/react/index.d.ts
CHANGED
|
@@ -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
|
|
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,
|
|
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;;;;;
|
|
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:
|
|
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
|
-
|
|
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 <
|
|
61
|
-
//
|
|
62
|
-
//
|
|
63
|
-
|
|
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": "
|
|
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",
|