@scayle/storefront-nuxt 8.9.0 → 8.9.2

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,156 @@
1
1
  # @scayle/storefront-nuxt
2
2
 
3
+ ## 8.9.2
4
+
5
+ ### Patch Changes
6
+
7
+ - Deprecate `key`, `packages`, `shippingDates`, `isEmpty`, `countWithoutSoldOutItems`, `removeItem`, `contains`, `findItem`, `products`, `generateBasketKey` and `mergeBaskets` from `useBasket`.
8
+
9
+ Required updates:
10
+
11
+ - `key`:
12
+
13
+ ```TypeScript
14
+ const { key } = useBasket()
15
+
16
+ // will become
17
+
18
+ const { data } = useBasket()
19
+ const key = computed(() => data.value.key)
20
+ ```
21
+
22
+ - `packages`:
23
+
24
+ ```TypeScript
25
+ const { packages } = useBasket()
26
+
27
+ // will become
28
+
29
+ const { data } = useBasket()
30
+ const packages = computed(() => data.value.packages)
31
+ ```
32
+
33
+ - `shippingDates`:
34
+
35
+ ```TypeScript
36
+ const { shippingDates } = useBasket()
37
+
38
+ // will become
39
+ import { getShippingDates } from '@scayle/storefront-nuxt'
40
+ const { data } = useBasket()
41
+ const shippingDates = computed(() => shippingDates(data.value.packages))
42
+ ```
43
+
44
+ - `isEmpty`:
45
+
46
+ ```TypeScript
47
+ const { isEmpty } = useBasket()
48
+
49
+ // will become
50
+
51
+ const { count } = useBasket()
52
+ const isEmpty = computed(() => count.value === 0)
53
+ ```
54
+
55
+ - `countWithoutSoldOutItems`:
56
+
57
+ ```TypeScript
58
+ const { countWithoutSoldOutItems } = useBasket()
59
+
60
+ // will become
61
+
62
+ import { countAvailableBasketItems } from '#storefront-basket'
63
+ const { items } = useBasket()
64
+ const isEmpty = computed(() => countAvailableBasketItems(items.value ?? []))
65
+ ```
66
+
67
+ - `products`:
68
+
69
+ ```TypeScript
70
+ const { products } = useBasket()
71
+
72
+ // will become
73
+
74
+ import { findItem } from '#storefront-basket'
75
+ const { items } = useBasket()
76
+ const products = computed(() => items.value?.map((item) => item.product))
77
+ ```
78
+
79
+ - `removeItem`:
80
+
81
+ ```TypeScript
82
+ const { removeItem, items } = useBasket()
83
+ removeItem({ variantId: items.value[0].variant.id })
84
+
85
+ // will become
86
+
87
+ const { removeItemByKey, items } = useBasket()
88
+ removeItemByKey(items.value[0].key)
89
+ ```
90
+
91
+ - `contains`:
92
+
93
+ ```TypeScript
94
+ const { contains } = useBasket()
95
+ const isInBasket = contains({ variantId: 1 })
96
+
97
+ // will become
98
+
99
+ import { contains } from '#storefront-basket'
100
+ const { items } = useBasket()
101
+ const isInBasket = contains({ variantId: 1 }, items.value ?? [])
102
+ ```
103
+
104
+ - `findItem`:
105
+
106
+ ```TypeScript
107
+ const { findItem } = useBasket()
108
+ const basketItem = findItem({ variantId: 1 })
109
+
110
+ // will become
111
+
112
+ import { findItem } from '#storefront-basket'
113
+ const { items } = useBasket()
114
+ const basketItem = findItem({ variantId: 1 }, items.value ?? [])
115
+ ```
116
+
117
+ - `generateBasketKey`:
118
+
119
+ ```TypeScript
120
+ const { generateBasketKey } = useBasket()
121
+
122
+ // will become
123
+
124
+ import { generateBasketKey } from '@scayle/storefront-core/dist/utils/keys'
125
+ ```
126
+
127
+ - `generateBasketKey`:
128
+
129
+ ```TypeScript
130
+ const { mergeBaskets } = useBasket()
131
+ mergeBaskets('oldKey', 'newKey')
132
+ // will become
133
+
134
+ const mergeBasket = useRpcCall('mergeBaskets')
135
+ mergeBaskets('oldKey', 'newKey')
136
+ ```
137
+
138
+ - Improve bootstrap performance by avoiding object merge and reflection
139
+
140
+ **Dependencies**
141
+
142
+ - Updated dependency to @scayle/storefront-core@8.7.0
143
+
144
+ ## 8.9.1
145
+
146
+ ### Patch Changes
147
+
148
+ - Updated dependency `@vueuse/core@12.5.0` to `@vueuse/core@12.6.1`
149
+
150
+ **Dependencies**
151
+
152
+ - Updated dependency to @scayle/storefront-core@8.6.1
153
+
3
154
  ## 8.9.0
4
155
 
5
156
  ### Minor Changes
package/dist/module.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@scayle/storefront-nuxt",
3
- "version": "8.9.0",
3
+ "version": "8.9.2",
4
4
  "configKey": "storefront",
5
5
  "compatibility": {
6
6
  "nuxt": "^3.9.0"
package/dist/module.mjs CHANGED
@@ -45,7 +45,7 @@ export default {
45
45
  }`;
46
46
  }
47
47
  const PACKAGE_NAME = "@scayle/storefront-nuxt";
48
- const PACKAGE_VERSION = "8.9.0";
48
+ const PACKAGE_VERSION = "8.9.2";
49
49
  const logger = createConsola({
50
50
  fancy: true,
51
51
  formatOptions: {
@@ -1,3 +1,4 @@
1
+ import { generateBasketKey } from '@scayle/storefront-core/dist/utils/keys';
1
2
  import type { AddOrUpdateItemType, RpcMethodParameters, RpcMethodReturnType, BasketItem, Product, BasketTotalPrice } from '@scayle/storefront-core';
2
3
  import { ExistingItemHandling } from '@scayle/storefront-core';
3
4
  import { type NormalizedRpcResponse, type UseRpcReturn } from '../core/useRpc.js';
@@ -15,34 +16,46 @@ type UseBasketBaseReturn = Omit<Awaited<UseRpcReturn<'getBasket'>>, 'data'> & {
15
16
  existingItemHandling?: ExistingItemHandling;
16
17
  }) => Promise<void>;
17
18
  addItems: (items: AddOrUpdateItemType[], existingItemHandling?: typeof ExistingItemHandling.ADD_QUANTITY_TO_EXISTING) => Promise<void>;
19
+ removeItemByKey: (itemKey: string) => Promise<void>;
20
+ updateItem: (basketItemKey: string, update: BasketItemUpdateData) => Promise<void>;
21
+ clear: () => Promise<void>;
22
+ items: ComputedRef<BasketItem[] | undefined>;
23
+ cost: ComputedRef<BasketTotalPrice | undefined>;
24
+ count: ComputedRef<number | undefined>;
25
+ /** @deprecated In a future release `mergeBaskets` will be removed. Consider using `useRpcCall('mergeBaskets')` instead.*/
18
26
  mergeBaskets: (args: {
19
27
  fromBasketKey: string;
20
28
  toBasketKey: string;
21
29
  }) => RpcMethodReturnType<'mergeBaskets'>;
30
+ /** @deprecated In a future release `findItem` will be removed. Consider using `findItem` from `@scayle/storefront-basket` */
22
31
  findItem: (item: {
23
32
  variantId: number;
24
33
  } | {
25
34
  productId: number;
26
35
  }) => BasketItem | undefined;
36
+ /** @deprecated In a future release `contains` will be removed. Consider using `contains` from `@scayle/storefront-basket` */
27
37
  contains: (item: {
28
38
  variantId: number;
29
39
  } | {
30
40
  productId: number;
31
41
  }) => boolean;
42
+ /** @deprecated In a future release `removeItem` will be removed. Consider using {@link UseBasketBaseReturn.removeItemByKey | removeItemByKey } instead*/
32
43
  removeItem: (item: {
33
44
  variantId: number;
34
45
  }) => Promise<void>;
35
- removeItemByKey: (itemKey: string) => Promise<void>;
36
- updateItem: (basketItemKey: string, update: BasketItemUpdateData) => Promise<void>;
37
- clear: () => Promise<void>;
46
+ /** @deprecated In a future release `generateBasketKey` will be removed. Consider using {@link generateBasketKey} instead.*/
47
+ generateBasketKey: typeof generateBasketKey;
48
+ /** @deprecated In a future release `key` will be removed. Consider using {@link UseBasketBaseReturn.items | `items`} instead. */
38
49
  products: ComputedRef<Product[]>;
39
- count: ComputedRef<number | undefined>;
50
+ /** @deprecated In a future removeItem `countWithoutSoldOutItems` will be removed. Consider using `countAvailableBasketItems` from `@scayle/storefront-basket` */
40
51
  countWithoutSoldOutItems: ComputedRef<number | undefined>;
41
- items: ComputedRef<BasketItem[] | undefined>;
42
- cost: ComputedRef<BasketTotalPrice | undefined>;
52
+ /** @deprecated In a future release `key` will be removed. Consider using `data.value.key` instead. */
43
53
  key: ComputedRef<BasketKey | undefined>;
54
+ /** @deprecated In a future release `key` will be removed. Consider checking {@link UseBasketBaseReturn.count | count} instead. */
44
55
  isEmpty: ComputedRef<boolean>;
56
+ /** @deprecated In a future release `packages` will be removed. Consider using `data.value.packages` instead. */
45
57
  packages: ComputedRef<BasketPackageInformation[] | undefined>;
58
+ /** @deprecated In a future release `shippingDates` will be removed. Consider using {@link getShippingDates} instead. */
46
59
  shippingDates: ComputedRef<(string | null)[] | undefined>;
47
60
  };
48
61
  export declare function useBasket({ params, }?: UseBasketOptions, key?: string): UseBasketBaseReturn & Promise<UseBasketBaseReturn>;
@@ -207,26 +207,26 @@ export function useBasket({
207
207
  return extendPromise(asyncData, {
208
208
  data,
209
209
  items,
210
+ count,
210
211
  cost,
211
- key: basketKey,
212
- packages,
213
- shippingDates,
214
- isEmpty,
215
212
  refresh,
216
- count,
217
- countWithoutSoldOutItems,
213
+ error,
214
+ status,
218
215
  addItem,
219
216
  addItems,
220
- removeItem,
221
217
  removeItemByKey,
222
218
  updateItem,
223
219
  clear,
220
+ key: basketKey,
221
+ packages,
222
+ shippingDates,
223
+ isEmpty,
224
+ countWithoutSoldOutItems,
225
+ removeItem,
224
226
  contains,
225
227
  products,
226
228
  findItem,
227
229
  generateBasketKey,
228
- mergeBaskets,
229
- error,
230
- status
230
+ mergeBaskets
231
231
  });
232
232
  }
@@ -28,58 +28,8 @@ async function getBasketKey(appKeys, session, $log, $shopConfig) {
28
28
  log: $log
29
29
  }) : session?.id;
30
30
  }
31
- async function sessionProperties(context) {
32
- const { $shopConfig, $storefront, $log, session } = context;
33
- const appKeys = $shopConfig.appKeys ?? $storefront.appKeys;
34
- if (session) {
35
- return {
36
- wishlistKey: await getWishlistKey(appKeys, session, $log, $shopConfig),
37
- basketKey: await getBasketKey(appKeys, session, $log, $shopConfig),
38
- sessionId: session.id,
39
- get user() {
40
- return session.data?.user ?? void 0;
41
- },
42
- get accessToken() {
43
- return session.data?.accessToken ?? void 0;
44
- },
45
- get refreshToken() {
46
- return session.data?.refreshToken ?? void 0;
47
- },
48
- destroySession: async () => {
49
- await session.destroy();
50
- },
51
- createUserBoundSession: async () => {
52
- $log.debug("creating user bound session");
53
- const data = session.data;
54
- await session.regenerate();
55
- session.data = data;
56
- await session.save();
57
- },
58
- updateUser: async (user) => {
59
- session.data.user = user;
60
- await session.save();
61
- },
62
- updateTokens: async (tokens) => {
63
- Object.assign(session.data, tokens);
64
- await session.save();
65
- }
66
- };
67
- }
68
- return {
69
- wishlistKey: void 0,
70
- basketKey: void 0,
71
- sessionId: void 0,
72
- user: void 0,
73
- accessToken: void 0,
74
- refreshToken: void 0,
75
- destroySession: void 0,
76
- createUserBoundSession: void 0,
77
- updateUser: void 0,
78
- updateTokens: void 0
79
- };
80
- }
81
31
  export const buildContext = async (context) => {
82
- const { $cache, $shopConfig, $storefront, $log, config, event } = context;
32
+ const { $cache, $shopConfig, $storefront, $log, config, event, session } = context;
83
33
  const sapiConfig = $shopConfig.sapi ?? $storefront.sapi;
84
34
  const appKeys = $shopConfig.appKeys ?? $storefront.appKeys;
85
35
  const idpConfig = $shopConfig.idp ?? $storefront.idp;
@@ -100,7 +50,7 @@ export const buildContext = async (context) => {
100
50
  $storefront.cache?.enabled
101
51
  );
102
52
  const { hooks } = useNitroApp();
103
- const baseContext = {
53
+ const rpcContext = {
104
54
  cached,
105
55
  sapiClient,
106
56
  auth: {
@@ -110,11 +60,11 @@ export const buildContext = async (context) => {
110
60
  url: $shopConfig.checkout.host,
111
61
  secret: $shopConfig.checkout.secret,
112
62
  token: $shopConfig.checkout.token,
113
- user: $shopConfig.checkout.user,
63
+ user: String($shopConfig.checkout.user),
114
64
  cbdExpiration: $shopConfig.checkout.cbdExpiration
115
65
  },
116
66
  oauth: {
117
- clientId: $storefront.oauth.clientId,
67
+ clientId: String($storefront.oauth.clientId),
118
68
  clientSecret: $storefront.oauth.clientSecret,
119
69
  apiHost: $storefront.oauth.apiHost
120
70
  },
@@ -146,17 +96,47 @@ export const buildContext = async (context) => {
146
96
  $log
147
97
  ),
148
98
  runtimeConfiguration: config,
149
- ip: getRequestIP(event, { xForwardedFor: true }),
150
- headers: createAndPurifyHeaders(getRequestHeaders(event)),
99
+ get ip() {
100
+ return getRequestIP(event, { xForwardedFor: true });
101
+ },
102
+ get headers() {
103
+ return createAndPurifyHeaders(getRequestHeaders(event));
104
+ },
151
105
  internalAccessHeader: $storefront.internalAccessHeader,
152
106
  callHook: hooks.callHook,
153
107
  callHookParallel: hooks.callHookParallel,
154
- callHookWith: hooks.callHookWith
108
+ callHookWith: hooks.callHookWith,
109
+ wishlistKey: session ? await getWishlistKey(appKeys, session, $log, $shopConfig) : void 0,
110
+ basketKey: session ? await getBasketKey(appKeys, session, $log, $shopConfig) : void 0,
111
+ sessionId: session?.id,
112
+ get user() {
113
+ return session?.data?.user ?? void 0;
114
+ },
115
+ get accessToken() {
116
+ return session?.data?.accessToken ?? void 0;
117
+ },
118
+ get refreshToken() {
119
+ return session?.data?.refreshToken ?? void 0;
120
+ },
121
+ destroySession: session ? async () => {
122
+ await session.destroy();
123
+ } : void 0,
124
+ createUserBoundSession: session ? async () => {
125
+ $log.debug("creating user bound session");
126
+ const data = session.data;
127
+ await session.regenerate();
128
+ session.data = data;
129
+ await session.save();
130
+ } : void 0,
131
+ updateUser: session ? async (user) => {
132
+ session.data.user = user;
133
+ await session.save();
134
+ } : void 0,
135
+ updateTokens: session ? async (tokens) => {
136
+ Object.assign(session.data, tokens);
137
+ await session.save();
138
+ } : void 0
155
139
  };
156
- const rpcContext = Object.defineProperties({}, {
157
- ...Object.getOwnPropertyDescriptors(baseContext),
158
- ...Object.getOwnPropertyDescriptors(await sessionProperties(context))
159
- });
160
140
  await hooks?.callHook("storefront:context:created", rpcContext);
161
141
  return rpcContext;
162
142
  };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@scayle/storefront-nuxt",
3
3
  "type": "module",
4
- "version": "8.9.0",
4
+ "version": "8.9.2",
5
5
  "description": "Nuxt integration for the SCAYLE Commerce Engine and Storefront API",
6
6
  "author": "SCAYLE Commerce Engine",
7
7
  "license": "MIT",
@@ -72,9 +72,9 @@
72
72
  "dependencies": {
73
73
  "@opentelemetry/api": "^1.9.0",
74
74
  "@scayle/h3-session": "0.6.0",
75
- "@scayle/storefront-core": "8.6.0",
75
+ "@scayle/storefront-core": "8.7.0",
76
76
  "@scayle/unstorage-compression-driver": "^0.2.3",
77
- "@vueuse/core": "12.5.0",
77
+ "@vueuse/core": "12.6.1",
78
78
  "consola": "^3.2.3",
79
79
  "core-js": "^3.37.1",
80
80
  "defu": "^6.1.4",
@@ -97,7 +97,7 @@
97
97
  "@nuxt/test-utils": "3.15.4",
98
98
  "@scayle/eslint-config-storefront": "4.4.1",
99
99
  "@scayle/eslint-plugin-vue-composable": "0.2.1",
100
- "@types/node": "22.13.2",
100
+ "@types/node": "22.13.4",
101
101
  "dprint": "0.49.0",
102
102
  "eslint": "9.20.1",
103
103
  "eslint-formatter-gitlab": "5.1.0",