@akinon/next 1.14.0 → 1.14.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/.eslintrc.js +40 -40
- package/.prettierrc +13 -13
- package/CHANGELOG.md +6 -0
- package/api/auth.ts +231 -231
- package/api/cache.ts +44 -44
- package/api/client.ts +174 -174
- package/api/logout.ts +42 -42
- package/bin/pz-check-dependencies.js +98 -98
- package/bin/pz-install-plugins.js +33 -33
- package/bin/pz-install-theme.js +58 -58
- package/bin/pz-postbuild.js +1 -1
- package/bin/pz-postdev.js +1 -1
- package/bin/pz-postinstall.js +6 -6
- package/bin/pz-poststart.js +1 -1
- package/bin/pz-prebuild.js +4 -4
- package/bin/pz-predev.js +4 -4
- package/bin/pz-prestart.js +1 -1
- package/bin/run-script.js +44 -44
- package/components/accordion.tsx +52 -52
- package/components/button.tsx +46 -46
- package/components/client-root.tsx +19 -19
- package/components/icon.tsx +18 -18
- package/components/image.tsx +133 -133
- package/components/index.ts +17 -17
- package/components/input.tsx +110 -110
- package/components/lazy-component.tsx +33 -33
- package/components/loader-spinner.tsx +23 -23
- package/components/mobile-app-toggler.tsx +26 -26
- package/components/oauth-login.tsx +24 -24
- package/components/price.tsx +55 -55
- package/components/pz-providers.tsx +24 -24
- package/components/pz-root.tsx +21 -21
- package/components/radio.tsx +18 -18
- package/components/react-portal.tsx +45 -45
- package/components/redirect-three-d/content/index.tsx +74 -74
- package/components/redirect-three-d/index.tsx +17 -17
- package/components/trans.tsx +39 -39
- package/data/client/account.ts +208 -208
- package/data/client/api.ts +85 -85
- package/data/client/basket.ts +82 -82
- package/data/client/misc.ts +101 -101
- package/data/client/product.ts +89 -89
- package/data/client/user.ts +99 -99
- package/data/client/wishlist.ts +118 -118
- package/data/server/category.ts +132 -132
- package/data/server/flatpage.ts +21 -21
- package/data/server/form.ts +22 -22
- package/data/server/index.ts +10 -10
- package/data/server/landingpage.ts +24 -24
- package/data/server/list.ts +67 -67
- package/data/server/menu.ts +35 -35
- package/data/server/product.ts +86 -86
- package/data/server/seo.ts +48 -48
- package/data/server/special-page.ts +47 -47
- package/data/server/widget.ts +27 -27
- package/data/urls.ts +221 -221
- package/hocs/client/index.ts +1 -1
- package/hocs/client/with-segment-defaults.tsx +25 -25
- package/hocs/server/index.ts +1 -1
- package/hocs/server/with-segment-defaults.tsx +85 -85
- package/hooks/index.ts +10 -10
- package/hooks/use-captcha.tsx +76 -76
- package/hooks/use-common-product-attributes.ts +36 -36
- package/hooks/use-debounce.ts +20 -20
- package/hooks/use-localization.ts +78 -78
- package/hooks/use-media-query.ts +36 -36
- package/hooks/use-mobile-iframe-handler.ts +23 -23
- package/hooks/use-on-click-outside.tsx +28 -28
- package/hooks/use-router.ts +45 -45
- package/hooks/use-translation.ts +14 -14
- package/lib/cache.ts +215 -215
- package/localization/index.ts +5 -5
- package/localization/provider.tsx +58 -58
- package/middlewares/currency.ts +100 -100
- package/middlewares/default.ts +256 -256
- package/middlewares/index.ts +29 -29
- package/middlewares/locale.ts +68 -68
- package/middlewares/oauth-login.ts +79 -79
- package/middlewares/pretty-url.ts +104 -104
- package/middlewares/redirection-payment.ts +160 -160
- package/middlewares/three-d-redirection.ts +159 -159
- package/middlewares/url-redirection.ts +65 -65
- package/package.json +2 -2
- package/redux/hooks.ts +7 -7
- package/redux/middlewares/index.ts +50 -50
- package/redux/reducers/checkout.ts +184 -184
- package/redux/reducers/config.ts +28 -28
- package/redux/reducers/header.ts +59 -59
- package/redux/reducers/root.ts +61 -61
- package/sentry/index.ts +27 -27
- package/tailwind/rtl.js +137 -137
- package/types/commerce/account.ts +64 -64
- package/types/commerce/address.ts +94 -94
- package/types/commerce/basket.ts +43 -43
- package/types/commerce/category.ts +114 -114
- package/types/commerce/checkout.ts +143 -143
- package/types/commerce/flatpage.ts +7 -7
- package/types/commerce/form.ts +66 -66
- package/types/commerce/index.ts +12 -12
- package/types/commerce/landingpage.ts +7 -7
- package/types/commerce/misc.ts +127 -127
- package/types/commerce/order.ts +119 -119
- package/types/commerce/product.ts +109 -109
- package/types/commerce/widget.ts +28 -28
- package/types/gtm.ts +16 -16
- package/types/index.ts +274 -274
- package/types/metadata.ts +7 -7
- package/types/next-auth.d.ts +24 -24
- package/utils/app-fetch.ts +69 -69
- package/utils/deep-merge.js +24 -24
- package/utils/image-loader.ts +31 -31
- package/utils/index.ts +150 -150
- package/utils/localization.ts +29 -29
- package/utils/log.ts +138 -138
- package/utils/menu-generator.ts +27 -27
- package/utils/mobile-3d-iframe.ts +77 -77
- package/utils/server-translation.ts +57 -57
- package/utils/server-variables.ts +9 -9
- package/with-pz-config.js +94 -94
package/data/server/product.ts
CHANGED
|
@@ -1,86 +1,86 @@
|
|
|
1
|
-
import { Cache, CacheKey } from '../../lib/cache';
|
|
2
|
-
import { product } from '../urls';
|
|
3
|
-
import {
|
|
4
|
-
BreadcrumbResultType,
|
|
5
|
-
ProductCategoryResult,
|
|
6
|
-
ProductResult
|
|
7
|
-
} from '../../types';
|
|
8
|
-
import appFetch from '../../utils/app-fetch';
|
|
9
|
-
|
|
10
|
-
type GetProduct = {
|
|
11
|
-
pk: number;
|
|
12
|
-
searchParams?: URLSearchParams;
|
|
13
|
-
groupProduct?: boolean;
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
const getProductDataHandler = ({
|
|
17
|
-
pk,
|
|
18
|
-
searchParams,
|
|
19
|
-
groupProduct
|
|
20
|
-
}: GetProduct) => {
|
|
21
|
-
return async function () {
|
|
22
|
-
let url = groupProduct
|
|
23
|
-
? product.getGroupProductByPk(pk)
|
|
24
|
-
: product.getProductByPk(pk);
|
|
25
|
-
|
|
26
|
-
if (searchParams) {
|
|
27
|
-
url +=
|
|
28
|
-
'?' +
|
|
29
|
-
Object.keys(searchParams)
|
|
30
|
-
.map((key) => `${key}=${searchParams[key]}`)
|
|
31
|
-
.join('&');
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
const data = await appFetch<ProductResult>(url, {
|
|
35
|
-
headers: {
|
|
36
|
-
Accept: 'application/json',
|
|
37
|
-
'Content-Type': 'application/json'
|
|
38
|
-
}
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
const categoryUrl = product.categoryUrl(data.product.pk);
|
|
42
|
-
|
|
43
|
-
const productCategoryData = await appFetch<ProductCategoryResult>(
|
|
44
|
-
categoryUrl,
|
|
45
|
-
{
|
|
46
|
-
headers: {
|
|
47
|
-
Accept: 'application/json',
|
|
48
|
-
'Content-Type': 'application/json'
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
);
|
|
52
|
-
|
|
53
|
-
const breadcrumbUrl = product.breadcrumbUrl(
|
|
54
|
-
productCategoryData.results[0].menuitemmodel
|
|
55
|
-
);
|
|
56
|
-
|
|
57
|
-
const breadcrumbData = await appFetch<any>(breadcrumbUrl, {
|
|
58
|
-
headers: {
|
|
59
|
-
Accept: 'application/json',
|
|
60
|
-
'Content-Type': 'application/json'
|
|
61
|
-
}
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
return {
|
|
65
|
-
data,
|
|
66
|
-
breadcrumbData: breadcrumbData?.menu
|
|
67
|
-
};
|
|
68
|
-
};
|
|
69
|
-
};
|
|
70
|
-
|
|
71
|
-
export const getProductData = async ({
|
|
72
|
-
pk,
|
|
73
|
-
searchParams,
|
|
74
|
-
groupProduct
|
|
75
|
-
}: GetProduct) => {
|
|
76
|
-
return Cache.wrap(
|
|
77
|
-
CacheKey[groupProduct ? 'GroupProduct' : 'Product'](
|
|
78
|
-
pk,
|
|
79
|
-
searchParams ?? new URLSearchParams()
|
|
80
|
-
),
|
|
81
|
-
getProductDataHandler({ pk, searchParams, groupProduct }),
|
|
82
|
-
{
|
|
83
|
-
expire: 300
|
|
84
|
-
}
|
|
85
|
-
);
|
|
86
|
-
};
|
|
1
|
+
import { Cache, CacheKey } from '../../lib/cache';
|
|
2
|
+
import { product } from '../urls';
|
|
3
|
+
import {
|
|
4
|
+
BreadcrumbResultType,
|
|
5
|
+
ProductCategoryResult,
|
|
6
|
+
ProductResult
|
|
7
|
+
} from '../../types';
|
|
8
|
+
import appFetch from '../../utils/app-fetch';
|
|
9
|
+
|
|
10
|
+
type GetProduct = {
|
|
11
|
+
pk: number;
|
|
12
|
+
searchParams?: URLSearchParams;
|
|
13
|
+
groupProduct?: boolean;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
const getProductDataHandler = ({
|
|
17
|
+
pk,
|
|
18
|
+
searchParams,
|
|
19
|
+
groupProduct
|
|
20
|
+
}: GetProduct) => {
|
|
21
|
+
return async function () {
|
|
22
|
+
let url = groupProduct
|
|
23
|
+
? product.getGroupProductByPk(pk)
|
|
24
|
+
: product.getProductByPk(pk);
|
|
25
|
+
|
|
26
|
+
if (searchParams) {
|
|
27
|
+
url +=
|
|
28
|
+
'?' +
|
|
29
|
+
Object.keys(searchParams)
|
|
30
|
+
.map((key) => `${key}=${searchParams[key]}`)
|
|
31
|
+
.join('&');
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const data = await appFetch<ProductResult>(url, {
|
|
35
|
+
headers: {
|
|
36
|
+
Accept: 'application/json',
|
|
37
|
+
'Content-Type': 'application/json'
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
const categoryUrl = product.categoryUrl(data.product.pk);
|
|
42
|
+
|
|
43
|
+
const productCategoryData = await appFetch<ProductCategoryResult>(
|
|
44
|
+
categoryUrl,
|
|
45
|
+
{
|
|
46
|
+
headers: {
|
|
47
|
+
Accept: 'application/json',
|
|
48
|
+
'Content-Type': 'application/json'
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
);
|
|
52
|
+
|
|
53
|
+
const breadcrumbUrl = product.breadcrumbUrl(
|
|
54
|
+
productCategoryData.results[0].menuitemmodel
|
|
55
|
+
);
|
|
56
|
+
|
|
57
|
+
const breadcrumbData = await appFetch<any>(breadcrumbUrl, {
|
|
58
|
+
headers: {
|
|
59
|
+
Accept: 'application/json',
|
|
60
|
+
'Content-Type': 'application/json'
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
return {
|
|
65
|
+
data,
|
|
66
|
+
breadcrumbData: breadcrumbData?.menu
|
|
67
|
+
};
|
|
68
|
+
};
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
export const getProductData = async ({
|
|
72
|
+
pk,
|
|
73
|
+
searchParams,
|
|
74
|
+
groupProduct
|
|
75
|
+
}: GetProduct) => {
|
|
76
|
+
return Cache.wrap(
|
|
77
|
+
CacheKey[groupProduct ? 'GroupProduct' : 'Product'](
|
|
78
|
+
pk,
|
|
79
|
+
searchParams ?? new URLSearchParams()
|
|
80
|
+
),
|
|
81
|
+
getProductDataHandler({ pk, searchParams, groupProduct }),
|
|
82
|
+
{
|
|
83
|
+
expire: 300
|
|
84
|
+
}
|
|
85
|
+
);
|
|
86
|
+
};
|
package/data/server/seo.ts
CHANGED
|
@@ -1,48 +1,48 @@
|
|
|
1
|
-
import appFetch from '../../utils/app-fetch';
|
|
2
|
-
import { Cache, CacheKey } from '../../lib/cache';
|
|
3
|
-
import { misc } from '../../data/urls';
|
|
4
|
-
import logger from '../../utils/log';
|
|
5
|
-
|
|
6
|
-
function getRootSeoDataHandler() {
|
|
7
|
-
return async function () {
|
|
8
|
-
let data = {};
|
|
9
|
-
|
|
10
|
-
try {
|
|
11
|
-
data = await appFetch<{ [key: string]: string }>(misc.cmsSeo('/'));
|
|
12
|
-
} catch (error) {
|
|
13
|
-
logger.error('Error while fetching root seo data', error);
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
return data;
|
|
17
|
-
};
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
function getSeoDataHandler(url: string) {
|
|
21
|
-
return async function () {
|
|
22
|
-
let data = {} as {
|
|
23
|
-
title: string;
|
|
24
|
-
description: string;
|
|
25
|
-
keywords: string;
|
|
26
|
-
[key: string]: string;
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
try {
|
|
30
|
-
data = await appFetch(misc.cmsSeo(url));
|
|
31
|
-
} catch (error) {
|
|
32
|
-
// logger.error('Error while fetching seo data', { url, error });
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
return data;
|
|
36
|
-
};
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* @deprecated Use getSeoData instead
|
|
41
|
-
*/
|
|
42
|
-
export const getRootSeo = async () => {
|
|
43
|
-
return Cache.wrap(CacheKey.RootSeo, getRootSeoDataHandler());
|
|
44
|
-
};
|
|
45
|
-
|
|
46
|
-
export const getSeoData = async (url: string) => {
|
|
47
|
-
return Cache.wrap(CacheKey.Seo(url), getSeoDataHandler(url));
|
|
48
|
-
};
|
|
1
|
+
import appFetch from '../../utils/app-fetch';
|
|
2
|
+
import { Cache, CacheKey } from '../../lib/cache';
|
|
3
|
+
import { misc } from '../../data/urls';
|
|
4
|
+
import logger from '../../utils/log';
|
|
5
|
+
|
|
6
|
+
function getRootSeoDataHandler() {
|
|
7
|
+
return async function () {
|
|
8
|
+
let data = {};
|
|
9
|
+
|
|
10
|
+
try {
|
|
11
|
+
data = await appFetch<{ [key: string]: string }>(misc.cmsSeo('/'));
|
|
12
|
+
} catch (error) {
|
|
13
|
+
logger.error('Error while fetching root seo data', error);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
return data;
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function getSeoDataHandler(url: string) {
|
|
21
|
+
return async function () {
|
|
22
|
+
let data = {} as {
|
|
23
|
+
title: string;
|
|
24
|
+
description: string;
|
|
25
|
+
keywords: string;
|
|
26
|
+
[key: string]: string;
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
try {
|
|
30
|
+
data = await appFetch(misc.cmsSeo(url));
|
|
31
|
+
} catch (error) {
|
|
32
|
+
// logger.error('Error while fetching seo data', { url, error });
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return data;
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* @deprecated Use getSeoData instead
|
|
41
|
+
*/
|
|
42
|
+
export const getRootSeo = async () => {
|
|
43
|
+
return Cache.wrap(CacheKey.RootSeo, getRootSeoDataHandler());
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
export const getSeoData = async (url: string) => {
|
|
47
|
+
return Cache.wrap(CacheKey.Seo(url), getSeoDataHandler(url));
|
|
48
|
+
};
|
|
@@ -1,47 +1,47 @@
|
|
|
1
|
-
import { Cache, CacheKey } from '../../lib/cache';
|
|
2
|
-
import { category } from '../urls';
|
|
3
|
-
import { GetCategoryResponse } from '../../types';
|
|
4
|
-
import { generateCommerceSearchParams } from '../../utils';
|
|
5
|
-
import appFetch from '../../utils/app-fetch';
|
|
6
|
-
import header from '../../redux/reducers/header';
|
|
7
|
-
|
|
8
|
-
const getSpecialPageDataHandler = (
|
|
9
|
-
pk: number,
|
|
10
|
-
searchParams: URLSearchParams,
|
|
11
|
-
headers?: Record<string, string>
|
|
12
|
-
) => {
|
|
13
|
-
return async function () {
|
|
14
|
-
const params = generateCommerceSearchParams(searchParams);
|
|
15
|
-
|
|
16
|
-
const data: GetCategoryResponse = await appFetch(
|
|
17
|
-
`${category.getSpecialPageByPk(pk)}${params}`,
|
|
18
|
-
{
|
|
19
|
-
headers: {
|
|
20
|
-
Accept: 'application/json',
|
|
21
|
-
'Content-Type': 'application/json',
|
|
22
|
-
...(headers ?? {})
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
);
|
|
26
|
-
|
|
27
|
-
return data;
|
|
28
|
-
};
|
|
29
|
-
};
|
|
30
|
-
|
|
31
|
-
export const getSpecialPageData = async ({
|
|
32
|
-
pk,
|
|
33
|
-
searchParams,
|
|
34
|
-
headers
|
|
35
|
-
}: {
|
|
36
|
-
pk: number;
|
|
37
|
-
searchParams: URLSearchParams;
|
|
38
|
-
headers?: Record<string, string>;
|
|
39
|
-
}) => {
|
|
40
|
-
return Cache.wrap(
|
|
41
|
-
CacheKey.SpecialPage(pk, searchParams, headers),
|
|
42
|
-
getSpecialPageDataHandler(pk, searchParams, headers),
|
|
43
|
-
{
|
|
44
|
-
expire: 300
|
|
45
|
-
}
|
|
46
|
-
);
|
|
47
|
-
};
|
|
1
|
+
import { Cache, CacheKey } from '../../lib/cache';
|
|
2
|
+
import { category } from '../urls';
|
|
3
|
+
import { GetCategoryResponse } from '../../types';
|
|
4
|
+
import { generateCommerceSearchParams } from '../../utils';
|
|
5
|
+
import appFetch from '../../utils/app-fetch';
|
|
6
|
+
import header from '../../redux/reducers/header';
|
|
7
|
+
|
|
8
|
+
const getSpecialPageDataHandler = (
|
|
9
|
+
pk: number,
|
|
10
|
+
searchParams: URLSearchParams,
|
|
11
|
+
headers?: Record<string, string>
|
|
12
|
+
) => {
|
|
13
|
+
return async function () {
|
|
14
|
+
const params = generateCommerceSearchParams(searchParams);
|
|
15
|
+
|
|
16
|
+
const data: GetCategoryResponse = await appFetch(
|
|
17
|
+
`${category.getSpecialPageByPk(pk)}${params}`,
|
|
18
|
+
{
|
|
19
|
+
headers: {
|
|
20
|
+
Accept: 'application/json',
|
|
21
|
+
'Content-Type': 'application/json',
|
|
22
|
+
...(headers ?? {})
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
);
|
|
26
|
+
|
|
27
|
+
return data;
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
export const getSpecialPageData = async ({
|
|
32
|
+
pk,
|
|
33
|
+
searchParams,
|
|
34
|
+
headers
|
|
35
|
+
}: {
|
|
36
|
+
pk: number;
|
|
37
|
+
searchParams: URLSearchParams;
|
|
38
|
+
headers?: Record<string, string>;
|
|
39
|
+
}) => {
|
|
40
|
+
return Cache.wrap(
|
|
41
|
+
CacheKey.SpecialPage(pk, searchParams, headers),
|
|
42
|
+
getSpecialPageDataHandler(pk, searchParams, headers),
|
|
43
|
+
{
|
|
44
|
+
expire: 300
|
|
45
|
+
}
|
|
46
|
+
);
|
|
47
|
+
};
|
package/data/server/widget.ts
CHANGED
|
@@ -1,27 +1,27 @@
|
|
|
1
|
-
import { Cache, CacheKey } from '../../lib/cache';
|
|
2
|
-
import 'server-only';
|
|
3
|
-
import { CacheOptions, WidgetResultType } from '../../types';
|
|
4
|
-
import appFetch from '../../utils/app-fetch';
|
|
5
|
-
import { widgets } from '../urls';
|
|
6
|
-
|
|
7
|
-
const getWidgetDataHandler = (slug: string) => async () => {
|
|
8
|
-
if (!slug) {
|
|
9
|
-
return null;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
return await appFetch(widgets.getWidget(slug));
|
|
13
|
-
};
|
|
14
|
-
|
|
15
|
-
export const getWidgetData = async <T>({
|
|
16
|
-
slug,
|
|
17
|
-
cacheOptions
|
|
18
|
-
}: {
|
|
19
|
-
slug: string;
|
|
20
|
-
cacheOptions?: CacheOptions;
|
|
21
|
-
}): Promise<WidgetResultType<T>> => {
|
|
22
|
-
return Cache.wrap(
|
|
23
|
-
CacheKey.Widget(slug),
|
|
24
|
-
getWidgetDataHandler(slug),
|
|
25
|
-
cacheOptions
|
|
26
|
-
);
|
|
27
|
-
};
|
|
1
|
+
import { Cache, CacheKey } from '../../lib/cache';
|
|
2
|
+
import 'server-only';
|
|
3
|
+
import { CacheOptions, WidgetResultType } from '../../types';
|
|
4
|
+
import appFetch from '../../utils/app-fetch';
|
|
5
|
+
import { widgets } from '../urls';
|
|
6
|
+
|
|
7
|
+
const getWidgetDataHandler = (slug: string) => async () => {
|
|
8
|
+
if (!slug) {
|
|
9
|
+
return null;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
return await appFetch(widgets.getWidget(slug));
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export const getWidgetData = async <T>({
|
|
16
|
+
slug,
|
|
17
|
+
cacheOptions
|
|
18
|
+
}: {
|
|
19
|
+
slug: string;
|
|
20
|
+
cacheOptions?: CacheOptions;
|
|
21
|
+
}): Promise<WidgetResultType<T>> => {
|
|
22
|
+
return Cache.wrap(
|
|
23
|
+
CacheKey.Widget(slug),
|
|
24
|
+
getWidgetDataHandler(slug),
|
|
25
|
+
cacheOptions
|
|
26
|
+
);
|
|
27
|
+
};
|