@faststore/core 3.100.6 → 3.100.7
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/.next/BUILD_ID +1 -1
- package/.next/build-manifest.json +22 -22
- package/.next/cache/.tsbuildinfo +1 -1
- package/.next/cache/config.json +3 -3
- package/.next/cache/webpack/client-production/0.pack +2 -2
- package/.next/cache/webpack/client-production/index.pack +0 -0
- package/.next/cache/webpack/edge-server-production/0.pack +0 -0
- package/.next/cache/webpack/edge-server-production/index.pack +0 -0
- package/.next/cache/webpack/server-production/0.pack +2 -2
- package/.next/cache/webpack/server-production/index.pack +0 -0
- package/.next/prerender-manifest.js +1 -1
- package/.next/prerender-manifest.json +1 -1
- package/.next/react-loadable-manifest.json +1 -1
- package/.next/routes-manifest.json +1 -1
- package/.next/server/chunks/948.js +2 -2
- package/.next/server/functions-config-manifest.json +1 -1
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/.next/server/pages/api/preview.js +1 -1
- package/.next/server/pages/en-US/404.html +2 -2
- package/.next/server/pages/en-US/500.html +2 -2
- package/.next/server/pages/en-US/checkout.html +2 -2
- package/.next/server/pages/en-US/login.html +2 -2
- package/.next/server/pages/en-US/password-protection.html +2 -2
- package/.next/server/pages/en-US/s.html +2 -2
- package/.next/server/pages/en-US.html +2 -2
- package/.next/server/pages-manifest.json +1 -1
- package/.next/static/chunks/3802.9744a010fe6a4d07.js +1 -0
- package/.next/static/chunks/{webpack-6a844a3f6a390f62.js → webpack-bde714c56fd09a0c.js} +1 -1
- package/.next/trace +156 -156
- package/.turbo/turbo-build.log +9 -9
- package/.turbo/turbo-test.log +10 -9
- package/CHANGELOG.md +6 -0
- package/package.json +2 -2
- package/src/server/content/service.ts +69 -21
- package/test/server/content/service.test.ts +222 -0
- package/.next/static/chunks/3802.904f302bf009f795.js +0 -1
- /package/.next/static/{TfWW2xib3Snr8xF4Ldqws → Oxei21wY_TrPYtPGUrFiR}/_buildManifest.js +0 -0
- /package/.next/static/{TfWW2xib3Snr8xF4Ldqws → Oxei21wY_TrPYtPGUrFiR}/_ssgManifest.js +0 -0
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
|
|
2
|
-
> @faststore/core@3.100.
|
|
2
|
+
> @faststore/core@3.100.6 prebuild /home/runner/work/faststore/faststore/packages/core
|
|
3
3
|
> na run partytown && na run generate
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
> @faststore/core@3.100.
|
|
6
|
+
> @faststore/core@3.100.6 partytown /home/runner/work/faststore/faststore/packages/core
|
|
7
7
|
> partytown copylib ./public/~partytown
|
|
8
8
|
|
|
9
9
|
Partytown lib copied to: /home/runner/work/faststore/faststore/packages/core/public/~partytown
|
|
10
10
|
|
|
11
|
-
> @faststore/core@3.100.
|
|
11
|
+
> @faststore/core@3.100.6 generate /home/runner/work/faststore/faststore/packages/core
|
|
12
12
|
> na run generate:schema && na run generate:codegen && na run format:generated
|
|
13
13
|
|
|
14
14
|
|
|
15
|
-
> @faststore/core@3.100.
|
|
15
|
+
> @faststore/core@3.100.6 generate:schema /home/runner/work/faststore/faststore/packages/core
|
|
16
16
|
> tsx src/server/generator/generateGraphQLSchemaFile.ts
|
|
17
17
|
|
|
18
18
|
Schema GraphQL file generated successfully
|
|
19
19
|
|
|
20
|
-
> @faststore/core@3.100.
|
|
20
|
+
> @faststore/core@3.100.6 generate:codegen /home/runner/work/faststore/faststore/packages/core
|
|
21
21
|
> graphql-codegen
|
|
22
22
|
|
|
23
23
|
[STARTED] Parse Configuration
|
|
@@ -37,11 +37,11 @@ Running lifecycle hook "afterStart" scripts...
|
|
|
37
37
|
[CLI] Loading Documents
|
|
38
38
|
[CLI] Generating output
|
|
39
39
|
|
|
40
|
-
> @faststore/core@3.100.
|
|
40
|
+
> @faststore/core@3.100.6 format:generated /home/runner/work/faststore/faststore/packages/core
|
|
41
41
|
> prettier --write "@generated/**/*.{ts,js,tsx,jsx,json}" --loglevel error
|
|
42
42
|
|
|
43
43
|
|
|
44
|
-
> @faststore/core@3.100.
|
|
44
|
+
> @faststore/core@3.100.6 build /home/runner/work/faststore/faststore/packages/core
|
|
45
45
|
> next build
|
|
46
46
|
|
|
47
47
|
⚠ No build cache found. Please configure build caching for faster rebuilds. Read more: https://nextjs.org/docs/messages/no-cache
|
|
@@ -101,8 +101,8 @@ Import trace for requested module:
|
|
|
101
101
|
Generating static pages (0/8) ...
|
|
102
102
|
|
|
103
103
|
Generating static pages (2/8)
|
|
104
104
|
Search not found. Add a new component for this section or remove it from the CMS
|
|
105
|
-
Warning: Dynamic Content not found for the page: home. Refer to the Dynamic Content documentation at https://developers.vtex.com/docs/guides/faststore/dynamic-content-overview for mapping the page and the corresponding data-fetching function.
|
|
106
105
|
Search not found. Add a new component for this section or remove it from the CMS
|
|
106
|
+
Warning: Dynamic Content not found for the page: home. Refer to the Dynamic Content documentation at https://developers.vtex.com/docs/guides/faststore/dynamic-content-overview for mapping the page and the corresponding data-fetching function.
|
|
107
107
|
|
|
108
108
|
Generating static pages (4/8)
|
|
109
109
|
Search not found. Add a new component for this section or remove it from the CMS
|
|
110
110
|
Search not found. Add a new component for this section or remove it from the CMS
|
|
@@ -154,7 +154,7 @@ Route (pages) Size First Load JS
|
|
|
154
154
|
├ chunks/framework-d514426edf885c68.js 45.4 kB
|
|
155
155
|
├ chunks/main-a2d1cfe626f2fef1.js 33.4 kB
|
|
156
156
|
├ chunks/pages/_app-35e8dda638ee2672.js 26.6 kB
|
|
157
|
-
├ chunks/webpack-
|
|
157
|
+
├ chunks/webpack-bde714c56fd09a0c.js 3.9 kB
|
|
158
158
|
└ css/146a8678babc61bf.css 9.2 kB
|
|
159
159
|
|
|
160
160
|
ƒ Middleware 44.8 kB
|
package/.turbo/turbo-test.log
CHANGED
|
@@ -1,22 +1,23 @@
|
|
|
1
1
|
|
|
2
|
-
> @faststore/core@3.100.
|
|
2
|
+
> @faststore/core@3.100.6 test /home/runner/work/faststore/faststore/packages/core
|
|
3
3
|
> jest
|
|
4
4
|
|
|
5
|
-
PASS test/
|
|
6
|
-
PASS test/
|
|
7
|
-
PASS test/
|
|
5
|
+
PASS test/server/content/service.test.ts (15.95 s)
|
|
6
|
+
PASS test/utils/cookieCacheBusting.test.ts (15.164 s)
|
|
7
|
+
PASS test/server/password-protection-service.test.ts (17.702 s)
|
|
8
8
|
PASS test/utils/multipleTemplates.test.ts
|
|
9
|
+
PASS test/utils/clearCookies.test.ts
|
|
9
10
|
PASS test/sdk/redirects/index.test.ts
|
|
10
11
|
PASS test/utils/trustedForwardedHost.test.ts
|
|
11
12
|
PASS test/utils/validateSessionRefreshToken.test.ts
|
|
12
13
|
PASS test/server/cms/global.test.ts
|
|
13
14
|
PASS test/utils/isLocalHost.test.ts
|
|
14
15
|
PASS test/utils/isLocalHost.browser.test.ts
|
|
15
|
-
PASS test/server/cms/index.test.ts
|
|
16
|
-
PASS test/server/index.test.ts (
|
|
16
|
+
PASS test/server/cms/index.test.ts
|
|
17
|
+
PASS test/server/index.test.ts (9.929 s)
|
|
17
18
|
|
|
18
|
-
Test Suites:
|
|
19
|
-
Tests:
|
|
19
|
+
Test Suites: 13 passed, 13 total
|
|
20
|
+
Tests: 128 passed, 128 total
|
|
20
21
|
Snapshots: 0 total
|
|
21
|
-
Time:
|
|
22
|
+
Time: 28.81 s
|
|
22
23
|
Ran all test suites.
|
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,12 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [3.100.7](https://github.com/vtex/faststore/compare/v3.100.6...v3.100.7) (2026-10-26)
|
|
7
|
+
|
|
8
|
+
### Bug Fixes
|
|
9
|
+
|
|
10
|
+
- **core:** cache Content Platform template list across page generations (3.x) ([#3534](https://github.com/vtex/faststore/issues/3534)) ([825c176](https://github.com/vtex/faststore/commit/825c176357b0f40ac9d112ee9789dce0c8198cf0)), closes [#3526](https://github.com/vtex/faststore/issues/3526) [#3384](https://github.com/vtex/faststore/issues/3384) [#3526](https://github.com/vtex/faststore/issues/3526) [#3526](https://github.com/vtex/faststore/issues/3526) [#3384](https://github.com/vtex/faststore/issues/3384)
|
|
11
|
+
|
|
6
12
|
## [3.100.6](https://github.com/vtex/faststore/compare/v3.100.5...v3.100.6) (2026-10-07)
|
|
7
13
|
|
|
8
14
|
### Bug Fixes
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@faststore/core",
|
|
3
|
-
"version": "3.100.
|
|
3
|
+
"version": "3.100.7",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -127,5 +127,5 @@
|
|
|
127
127
|
"ts-jest": "29.1.1",
|
|
128
128
|
"typescript": "5.3.2"
|
|
129
129
|
},
|
|
130
|
-
"gitHead": "
|
|
130
|
+
"gitHead": "fc9b34b4fc943c17e225249677b49e393dc2d1f4"
|
|
131
131
|
}
|
|
@@ -19,9 +19,20 @@ import { isBranchPreview, isContentPlatformSource } from './utils'
|
|
|
19
19
|
|
|
20
20
|
type ContentResult = ContentData | (ContentEntry & PageContentType)
|
|
21
21
|
|
|
22
|
+
type ContentListCacheEntry = {
|
|
23
|
+
expiresAt: number
|
|
24
|
+
promise: Promise<{ data: ContentResult[] }>
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// Bounds how stale the template list can get in long-lived processes (ISR);
|
|
28
|
+
// a CMS publish already triggers a new build.
|
|
29
|
+
const CONTENT_LIST_CACHE_TTL_MS = 5 * 60 * 1000
|
|
30
|
+
|
|
22
31
|
export class ContentService {
|
|
23
32
|
private clientCP: ClientCP
|
|
24
33
|
|
|
34
|
+
private readonly contentListCache = new Map<string, ContentListCacheEntry>()
|
|
35
|
+
|
|
25
36
|
constructor() {
|
|
26
37
|
this.clientCP = new ClientCP({
|
|
27
38
|
tenant: config.api.storeId,
|
|
@@ -46,29 +57,12 @@ export class ContentService {
|
|
|
46
57
|
|
|
47
58
|
if (isContentPlatformSource()) {
|
|
48
59
|
const serviceParams = this.convertOptionsToParams(options)
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
let scroll: string | undefined
|
|
53
|
-
let pages = 0
|
|
54
|
-
|
|
55
|
-
do {
|
|
56
|
-
const result = await this.clientCP.listEntries(serviceParams, scroll)
|
|
57
|
-
allEntries.push(...result.entries)
|
|
58
|
-
const next = result.scroll ?? undefined
|
|
59
|
-
if (next && next === scroll) break
|
|
60
|
-
scroll = next
|
|
61
|
-
} while (scroll && ++pages < MAX_PAGES)
|
|
62
|
-
|
|
63
|
-
if (pages >= MAX_PAGES) {
|
|
64
|
-
console.warn('listEntries pagination hit MAX_PAGES cap', serviceParams)
|
|
60
|
+
|
|
61
|
+
if (options.isPreview) {
|
|
62
|
+
return this.listAndFillEntries(serviceParams, true)
|
|
65
63
|
}
|
|
66
64
|
|
|
67
|
-
return this.
|
|
68
|
-
allEntries,
|
|
69
|
-
serviceParams,
|
|
70
|
-
options.isPreview
|
|
71
|
-
)
|
|
65
|
+
return this.getCachedContentList(serviceParams)
|
|
72
66
|
}
|
|
73
67
|
return getCMSPage(options.cmsOptions)
|
|
74
68
|
}
|
|
@@ -136,6 +130,60 @@ export class ContentService {
|
|
|
136
130
|
}
|
|
137
131
|
}
|
|
138
132
|
|
|
133
|
+
private getCachedContentList(
|
|
134
|
+
serviceParams: EntryPathParams
|
|
135
|
+
): Promise<{ data: ContentResult[] }> {
|
|
136
|
+
// listEntries only depends on these fields; the page slug must stay out of the key.
|
|
137
|
+
const { accountName, storeId, contentType, locale } = serviceParams
|
|
138
|
+
const key = JSON.stringify([accountName, storeId, contentType, locale])
|
|
139
|
+
|
|
140
|
+
const cached = this.contentListCache.get(key)
|
|
141
|
+
if (cached && cached.expiresAt > Date.now()) {
|
|
142
|
+
return cached.promise
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
const promise = this.listAndFillEntries(serviceParams, false).catch(
|
|
146
|
+
(err: unknown) => {
|
|
147
|
+
if (this.contentListCache.get(key)?.promise === promise) {
|
|
148
|
+
this.contentListCache.delete(key)
|
|
149
|
+
}
|
|
150
|
+
throw err
|
|
151
|
+
}
|
|
152
|
+
)
|
|
153
|
+
|
|
154
|
+
this.contentListCache.set(key, {
|
|
155
|
+
expiresAt: Date.now() + CONTENT_LIST_CACHE_TTL_MS,
|
|
156
|
+
promise,
|
|
157
|
+
})
|
|
158
|
+
|
|
159
|
+
return promise
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
private async listAndFillEntries(
|
|
163
|
+
serviceParams: EntryPathParams,
|
|
164
|
+
isPreview: boolean
|
|
165
|
+
): Promise<{ data: (ContentEntry & PageContentType)[] }> {
|
|
166
|
+
// TODO: This should be temporary until the cp data-plane have a search engine.
|
|
167
|
+
const MAX_PAGES = 25
|
|
168
|
+
const allEntries: ContentEntry[] = []
|
|
169
|
+
let scroll: string | undefined
|
|
170
|
+
let pages = 0
|
|
171
|
+
|
|
172
|
+
do {
|
|
173
|
+
const result = await this.clientCP.listEntries(serviceParams, scroll)
|
|
174
|
+
allEntries.push(...result.entries)
|
|
175
|
+
const next = result.scroll ?? undefined
|
|
176
|
+
if (next && next === scroll) break
|
|
177
|
+
scroll = next
|
|
178
|
+
} while (scroll && ++pages < MAX_PAGES)
|
|
179
|
+
|
|
180
|
+
if (pages >= MAX_PAGES) {
|
|
181
|
+
console.warn('listEntries pagination hit MAX_PAGES cap', serviceParams)
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
return this.fillEntriesWithData(allEntries, serviceParams, isPreview)
|
|
185
|
+
}
|
|
186
|
+
|
|
139
187
|
private async fillEntriesWithData(
|
|
140
188
|
entries: ContentEntry[],
|
|
141
189
|
serviceParams: EntryPathParams,
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
import type { ContentEntry, EntryPathParams } from '@vtex/client-cp'
|
|
2
|
+
|
|
3
|
+
import { ContentService } from '../../../src/server/content/service'
|
|
4
|
+
import type { ContentParams } from '../../../src/server/content/types'
|
|
5
|
+
|
|
6
|
+
jest.mock('../../../src/server/content/utils', () => ({
|
|
7
|
+
...jest.requireActual('../../../src/server/content/utils'),
|
|
8
|
+
isContentPlatformSource: jest.fn(() => true),
|
|
9
|
+
}))
|
|
10
|
+
|
|
11
|
+
const NOT_FOUND = 'Request failed with status code 404'
|
|
12
|
+
const FIVE_MINUTES = 5 * 60 * 1000
|
|
13
|
+
|
|
14
|
+
const entryData: Record<string, Record<string, unknown>> = {
|
|
15
|
+
generic: { sections: [{ name: 'Generic' }] },
|
|
16
|
+
collection: {
|
|
17
|
+
settings: { template: { value: '/colecao' } },
|
|
18
|
+
sections: [{ name: 'Collection' }],
|
|
19
|
+
},
|
|
20
|
+
other: {
|
|
21
|
+
settings: { template: { value: '/outra' } },
|
|
22
|
+
sections: [{ name: 'Other' }],
|
|
23
|
+
},
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const toEntry = (id: string) => ({ id, name: id }) as ContentEntry
|
|
27
|
+
|
|
28
|
+
function createFakeClientCP(pages: string[][]) {
|
|
29
|
+
return {
|
|
30
|
+
listEntries: jest.fn(async (_params: EntryPathParams, scroll?: string) => {
|
|
31
|
+
const index = scroll ? Number(scroll) : 0
|
|
32
|
+
return {
|
|
33
|
+
entries: pages[index].map(toEntry),
|
|
34
|
+
scroll: index + 1 < pages.length ? String(index + 1) : null,
|
|
35
|
+
}
|
|
36
|
+
}),
|
|
37
|
+
getEntry: jest.fn(async ({ entryId }: EntryPathParams) => ({
|
|
38
|
+
...entryData[entryId as string],
|
|
39
|
+
})),
|
|
40
|
+
previewEntryById: jest.fn(async ({ entryId }: EntryPathParams) => ({
|
|
41
|
+
...entryData[entryId as string],
|
|
42
|
+
})),
|
|
43
|
+
getEntryBySlug: jest.fn(
|
|
44
|
+
async (_params: EntryPathParams): Promise<Record<string, unknown>> => {
|
|
45
|
+
throw new Error(NOT_FOUND)
|
|
46
|
+
}
|
|
47
|
+
),
|
|
48
|
+
previewEntryBySlug: jest.fn(
|
|
49
|
+
async (_params: EntryPathParams): Promise<Record<string, unknown>> => {
|
|
50
|
+
throw new Error(NOT_FOUND)
|
|
51
|
+
}
|
|
52
|
+
),
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function createServiceWithClient(
|
|
57
|
+
pages: string[][] = [['generic', 'collection', 'other']]
|
|
58
|
+
) {
|
|
59
|
+
const service = new ContentService()
|
|
60
|
+
const clientCP = createFakeClientCP(pages)
|
|
61
|
+
Object.defineProperty(service, 'clientCP', { value: clientCP })
|
|
62
|
+
return { service, clientCP }
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
describe('ContentService Content Platform template list cache', () => {
|
|
66
|
+
beforeEach(() => {
|
|
67
|
+
jest.spyOn(console, 'warn').mockImplementation(() => {})
|
|
68
|
+
})
|
|
69
|
+
|
|
70
|
+
afterEach(() => {
|
|
71
|
+
jest.restoreAllMocks()
|
|
72
|
+
jest.useRealTimers()
|
|
73
|
+
})
|
|
74
|
+
|
|
75
|
+
it('shares one list and entry fetch across concurrent PLPs with different slugs', async () => {
|
|
76
|
+
const { service, clientCP } = createServiceWithClient()
|
|
77
|
+
|
|
78
|
+
const [collectionPage, otherPage, unknownPage] = await Promise.all([
|
|
79
|
+
service.getPlpContent({ slug: 'colecao/camisetas' }, []),
|
|
80
|
+
service.getPlpContent({ slug: 'outra' }, []),
|
|
81
|
+
service.getPlpContent({ slug: 'nao-existe' }, []),
|
|
82
|
+
])
|
|
83
|
+
|
|
84
|
+
expect(clientCP.listEntries).toHaveBeenCalledTimes(1)
|
|
85
|
+
expect(clientCP.getEntry).toHaveBeenCalledTimes(3)
|
|
86
|
+
expect(collectionPage.sections).toEqual([{ name: 'Collection' }])
|
|
87
|
+
expect(otherPage.sections).toEqual([{ name: 'Other' }])
|
|
88
|
+
expect(unknownPage.sections).toEqual([{ name: 'Generic' }])
|
|
89
|
+
})
|
|
90
|
+
|
|
91
|
+
it('reuses the cached list within the TTL', async () => {
|
|
92
|
+
const { service, clientCP } = createServiceWithClient()
|
|
93
|
+
|
|
94
|
+
await service.getPlpContent({ slug: 'colecao' }, [])
|
|
95
|
+
await service.getPlpContent({ slug: 'outra' }, [])
|
|
96
|
+
|
|
97
|
+
expect(clientCP.listEntries).toHaveBeenCalledTimes(1)
|
|
98
|
+
expect(clientCP.getEntry).toHaveBeenCalledTimes(3)
|
|
99
|
+
})
|
|
100
|
+
|
|
101
|
+
it('still prefers a direct slug match over the cached list', async () => {
|
|
102
|
+
const { service, clientCP } = createServiceWithClient()
|
|
103
|
+
await service.getPlpContent({ slug: 'colecao' }, [])
|
|
104
|
+
|
|
105
|
+
clientCP.getEntryBySlug.mockResolvedValueOnce({
|
|
106
|
+
sections: [{ name: 'Direct' }],
|
|
107
|
+
})
|
|
108
|
+
const page = await service.getPlpContent({ slug: 'colecao' }, [])
|
|
109
|
+
|
|
110
|
+
expect(page.sections).toEqual([{ name: 'Direct' }])
|
|
111
|
+
expect(clientCP.listEntries).toHaveBeenCalledTimes(1)
|
|
112
|
+
})
|
|
113
|
+
|
|
114
|
+
it('consumes every scroll page once', async () => {
|
|
115
|
+
const { service, clientCP } = createServiceWithClient([
|
|
116
|
+
['generic'],
|
|
117
|
+
['collection'],
|
|
118
|
+
['other'],
|
|
119
|
+
])
|
|
120
|
+
|
|
121
|
+
await Promise.all([
|
|
122
|
+
service.getMultipleContent({ contentType: 'plp' }),
|
|
123
|
+
service.getMultipleContent({ contentType: 'plp' }),
|
|
124
|
+
])
|
|
125
|
+
const { data } = await service.getMultipleContent({ contentType: 'plp' })
|
|
126
|
+
|
|
127
|
+
expect(clientCP.listEntries).toHaveBeenCalledTimes(3)
|
|
128
|
+
expect(clientCP.listEntries.mock.calls.map(([, scroll]) => scroll)).toEqual(
|
|
129
|
+
[undefined, '1', '2']
|
|
130
|
+
)
|
|
131
|
+
expect(data.map((entry) => entry.id)).toEqual([
|
|
132
|
+
'generic',
|
|
133
|
+
'collection',
|
|
134
|
+
'other',
|
|
135
|
+
])
|
|
136
|
+
})
|
|
137
|
+
|
|
138
|
+
it('keeps separate entries per content type', async () => {
|
|
139
|
+
const { service, clientCP } = createServiceWithClient()
|
|
140
|
+
|
|
141
|
+
await service.getMultipleContent({ contentType: 'plp' })
|
|
142
|
+
await service.getMultipleContent({ contentType: 'pdp' })
|
|
143
|
+
await service.getMultipleContent({ contentType: 'pdp' })
|
|
144
|
+
|
|
145
|
+
expect(clientCP.listEntries).toHaveBeenCalledTimes(2)
|
|
146
|
+
expect(
|
|
147
|
+
clientCP.listEntries.mock.calls.map(([params]) => params.contentType)
|
|
148
|
+
).toEqual(['plp', 'pdp'])
|
|
149
|
+
})
|
|
150
|
+
|
|
151
|
+
it('bypasses the cache for previews', async () => {
|
|
152
|
+
const { service, clientCP } = createServiceWithClient()
|
|
153
|
+
const previewParams: ContentParams = {
|
|
154
|
+
contentType: 'plp',
|
|
155
|
+
previewData: {
|
|
156
|
+
contentType: 'plp',
|
|
157
|
+
documentId: 'collection',
|
|
158
|
+
versionId: 'version-1',
|
|
159
|
+
},
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
await service.getMultipleContent({ contentType: 'plp' })
|
|
163
|
+
await service.getMultipleContent(previewParams)
|
|
164
|
+
await service.getMultipleContent(previewParams)
|
|
165
|
+
await service.getMultipleContent({ contentType: 'plp' })
|
|
166
|
+
|
|
167
|
+
expect(clientCP.listEntries).toHaveBeenCalledTimes(3)
|
|
168
|
+
expect(clientCP.getEntry).toHaveBeenCalledTimes(3)
|
|
169
|
+
expect(clientCP.previewEntryById).toHaveBeenCalledTimes(6)
|
|
170
|
+
})
|
|
171
|
+
|
|
172
|
+
it('does not cache failures', async () => {
|
|
173
|
+
const { service, clientCP } = createServiceWithClient()
|
|
174
|
+
const error = new Error('Request failed with status code 500')
|
|
175
|
+
clientCP.listEntries.mockRejectedValueOnce(error)
|
|
176
|
+
|
|
177
|
+
await expect(
|
|
178
|
+
service.getMultipleContent({ contentType: 'plp' })
|
|
179
|
+
).rejects.toBe(error)
|
|
180
|
+
const { data } = await service.getMultipleContent({ contentType: 'plp' })
|
|
181
|
+
|
|
182
|
+
expect(clientCP.listEntries).toHaveBeenCalledTimes(2)
|
|
183
|
+
expect(data).toHaveLength(3)
|
|
184
|
+
})
|
|
185
|
+
|
|
186
|
+
it('does not let a late failure evict a newer fetch', async () => {
|
|
187
|
+
jest.useFakeTimers()
|
|
188
|
+
const { service, clientCP } = createServiceWithClient()
|
|
189
|
+
let rejectFirst: (err: Error) => void = () => {}
|
|
190
|
+
clientCP.listEntries.mockImplementationOnce(
|
|
191
|
+
() =>
|
|
192
|
+
new Promise((_, reject) => {
|
|
193
|
+
rejectFirst = reject
|
|
194
|
+
})
|
|
195
|
+
)
|
|
196
|
+
|
|
197
|
+
const first = service.getMultipleContent({ contentType: 'plp' })
|
|
198
|
+
const firstResult = expect(first).rejects.toThrow('late failure')
|
|
199
|
+
jest.advanceTimersByTime(FIVE_MINUTES)
|
|
200
|
+
await service.getMultipleContent({ contentType: 'plp' })
|
|
201
|
+
|
|
202
|
+
rejectFirst(new Error('late failure'))
|
|
203
|
+
await firstResult
|
|
204
|
+
await service.getMultipleContent({ contentType: 'plp' })
|
|
205
|
+
|
|
206
|
+
expect(clientCP.listEntries).toHaveBeenCalledTimes(2)
|
|
207
|
+
})
|
|
208
|
+
|
|
209
|
+
it('fetches the list again after the TTL', async () => {
|
|
210
|
+
jest.useFakeTimers()
|
|
211
|
+
const { service, clientCP } = createServiceWithClient()
|
|
212
|
+
|
|
213
|
+
await service.getMultipleContent({ contentType: 'plp' })
|
|
214
|
+
jest.advanceTimersByTime(FIVE_MINUTES - 1)
|
|
215
|
+
await service.getMultipleContent({ contentType: 'plp' })
|
|
216
|
+
expect(clientCP.listEntries).toHaveBeenCalledTimes(1)
|
|
217
|
+
|
|
218
|
+
jest.advanceTimersByTime(1)
|
|
219
|
+
await service.getMultipleContent({ contentType: 'plp' })
|
|
220
|
+
expect(clientCP.listEntries).toHaveBeenCalledTimes(2)
|
|
221
|
+
})
|
|
222
|
+
})
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3802],{35095:function(e,t,n){"use strict";var r=n(77900),i=n(41325),o=n(90427),s=n.n(o),c=n(31549);function Incentives(e){var{incentives:t,label:n}=e;return(0,c.jsx)(i.Z,{className:"".concat(s().section," section-incentives layout__section"),children:(0,c.jsx)(r.Z,{incentives:t,colored:!0,label:null!=n?n:""})})}Incentives.$componentKey="Incentives",t.Z=Incentives},3802:function(e,t,n){"use strict";n.r(t),n.d(t,{default:function(){return LandingPage},getLandingPageBySlug:function(){return X}});var r,i,o,s,c,a,l,d,p,u,v,f=n(74988),g=n(33067),y=n(35935),b=n(27322),P=n(19173),O=n(35949),j=n(93143),h=n(94173),m=n(25758),w=n(33882),S=n(35095),_=n(31841),I=n(80552),E=n(45859),C=n(76924),T=n(23091),Z=n(43412),x=n.n(Z);let MissingContentError=class MissingContentError extends Error{constructor(e){super("Missing content on the ".concat(Z.contentSource.type," for content type ").concat(e.contentType,". Add content before proceeding. Context: ").concat(JSON.stringify(e,null,2)))}};var D=n(56272),L=n(34235),B=n(18626),M=n.n(B),K=n(72692);let MultipleContentError=class MultipleContentError extends Error{constructor(e){super("Multiple content defined on the ".concat(Z.contentSource.type," for content type ").concat(e.contentType,". Remove duplicated content before proceeding. Context: ").concat(JSON.stringify(e,null,2)))}};var k=n(4018);function ownKeys(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function _objectSpread(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?ownKeys(Object(n),!0).forEach(function(t){(0,g.Z)(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):ownKeys(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}var isLocator=e=>"string"==typeof e.contentType&&("string"==typeof e.releaseId||"string"==typeof e.documentId||"string"==typeof e.versionId),N=new K.Z({workspace:x().api.workspace,tenant:x().api.storeId,builder:null!==(u=null===(v=x().contentSource)||void 0===v?void 0:v.project)&&void 0!==u?u:"faststore",host:(0,k.Y1)(x().storeUrl)}),F=(r=(0,f.Z)(function*(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:N;if(isLocator(e))return yield t.getCMSPage(e).then(e=>({data:[e]}));var n=[],r=yield t.getCMSPagesByContentType(e.contentType,_objectSpread(_objectSpread({},e.filters),{},{page:1,perPage:10}));n.push(...r.data);var i=Array.from({length:Math.ceil(r.totalItems/10)-1},(e,t)=>t+2);return r.totalItems>n.length&&(yield Promise.all(i.map(n=>t.getCMSPagesByContentType(e.contentType,_objectSpread(_objectSpread({},e.filters),{},{page:n,perPage:10}))))).forEach(e=>{n.push(...e.data)}),{data:n}}),function(e){return r.apply(this,arguments)}),W=(i=(0,f.Z)(function*(e){var t=(yield F(e)).data;if(t.length>1)throw new MultipleContentError(e);return t[0]}),function(e){return i.apply(this,arguments)});function normalizePLPSlug(e){var t=e.replace(/^\/+|\/+$/g,"");return"/"+(t=t.replace(/\/+/g,"/").replace(/\s+/g,"")).toLowerCase()}function findPLPTemplateBySlug(e,t,n){return e.find(e=>{if(!(null!==(r=e.settings)&&void 0!==r&&null!==(i=r.template)&&void 0!==i&&i.value))return!1;var r,i,o,s,c=normalizePLPSlug(null===(o=e.settings)||void 0===o?void 0:null===(s=o.template)||void 0===s?void 0:s.value);return c===t||function(e){var{rewrites:t,templateValue:n,slug:r}=e;return!!t&&!!(Array.isArray(t)?t:[...(null==t?void 0:t.beforeFiles)||[],...(null==t?void 0:t.afterFiles)||[],...(null==t?void 0:t.fallback)||[]]).find(e=>e.source===n&&e.destination===r)}({rewrites:n,templateValue:c,slug:t})})}function findBestPLPTemplate(e,t,n){for(var r=normalizePLPSlug(t),i=findPLPTemplateBySlug(e,r,n);!i&&-1!==r.lastIndexOf("/");)i=findPLPTemplateBySlug(e,r=r.substring(0,r.lastIndexOf("/")),n);return i||e.find(e=>{var t,n;return!(null!==(t=e.settings)&&void 0!==t&&null!==(n=t.template)&&void 0!==n&&n.value)})||e[0]}var getSlugsWithoutSkuIdFromPDP=e=>{for(var t=[],n=e,r=n.match(/-\d+\/p$/);r;){var i=n.replace(/-\d+\/p$/,"/p");t.push(i),r=(n=i).match(/-\d+\/p$/)}return t};function findBestPDPTemplate(e,t){for(var n of function(e){var{itemListElement:t=[]}=e,n=[...t].reverse().map(e=>{var{item:t}=e;return t}),r=n[0],i=getSlugsWithoutSkuIdFromPDP(r);return[r,...i,...n.slice(1)].filter((e,t,n)=>e&&n.indexOf(e)===t)}({itemListElement:null!==(i=t.breadcrumbList.itemListElement)&&void 0!==i?i:[]}))for(var r of e)if(null!==(o=r.settings)&&void 0!==o&&null!==(s=o.template)&&void 0!==s&&s.value){var i,o,s;if(function(e){var t=e.trim().replace(/^\/+|\/+$/g,"");return t.startsWith("/")||(t="/"+t),t.endsWith("/p")||(t+="/"),(t=t.replace(/\/+/g,"/").replace(/\s+/g,"")).toLowerCase()}(r.settings.template.value)===n)return r}return e.find(e=>{var t,n;return!(null!==(t=e.settings)&&void 0!==t&&null!==(n=t.template)&&void 0!==n&&n.value)})||e[0]}function plp_ownKeys(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function plp_objectSpread(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?plp_ownKeys(Object(n),!0).forEach(function(t){(0,g.Z)(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):plp_ownKeys(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}var A=(o=(0,f.Z)(function*(e,t,n){if(x().cms.data){var r=JSON.parse(x().cms.data).plp;return yield $("/".concat(e,"/"),r,plp_objectSpread(plp_objectSpread({},(null==t?void 0:t.contentType)==="plp"?t:null),{},{contentType:"plp"}),n)}return yield J("/".concat(e,"/"),plp_objectSpread(plp_objectSpread({},(null==t?void 0:t.contentType)==="plp"?t:null),{},{contentType:"plp"}),n)}),function(e,t,n){return o.apply(this,arguments)}),$=(s=(0,f.Z)(function*(e,t,n,r){var i=null!=t?t:[];if(!i[0])throw new MissingContentError(n);var o=findBestPLPTemplate(i,e,r);return W({contentType:"plp",documentId:o.documentId,versionId:o.versionId})}),function(e,t,n,r){return s.apply(this,arguments)}),J=(c=(0,f.Z)(function*(e,t,n){var r=(yield F(t)).data;if(!r[0])throw new MissingContentError(t);return findBestPLPTemplate(r,e,n)}),function(e,t,n){return c.apply(this,arguments)});function pdp_ownKeys(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function pdp_objectSpread(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?pdp_ownKeys(Object(n),!0).forEach(function(t){(0,g.Z)(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):pdp_ownKeys(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}var U=(a=(0,f.Z)(function*(e,t){if(x().cms.data){var n=JSON.parse(x().cms.data).pdp;return yield q(e,n,pdp_objectSpread(pdp_objectSpread({},(null==t?void 0:t.contentType)==="pdp"?t:null),{},{contentType:"pdp"}))}return yield z(e,pdp_objectSpread(pdp_objectSpread({},(null==t?void 0:t.contentType)==="pdp"?t:null),{},{contentType:"pdp"}))}),function(e,t){return a.apply(this,arguments)}),q=(l=(0,f.Z)(function*(e,t,n){var r=null!=t?t:[];if(!r[0])throw new MissingContentError(n);var i=findBestPDPTemplate(r,e);return W({contentType:"pdp",documentId:i.documentId,versionId:i.versionId})}),function(e,t,n){return l.apply(this,arguments)}),z=(d=(0,f.Z)(function*(e,t){var n=(yield F(t)).data;if(!n[0])throw new MissingContentError(t);return findBestPDPTemplate(n,e)}),function(e,t){return d.apply(this,arguments)}),G=n(20306),R=["slug"];function service_ownKeys(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function service_objectSpread(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?service_ownKeys(Object(n),!0).forEach(function(t){(0,g.Z)(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):service_ownKeys(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}var V=new class{constructor(){(0,g.Z)(this,"clientCP",void 0),this.clientCP=new(M())({tenant:x().api.storeId})}getSingleContent(e){var t=this;return(0,f.Z)(function*(){var n=t.createContentOptions(e);return(0,G.w)()?t.getFromCP(n):W(n.cmsOptions)})()}getMultipleContent(e){var t=this;return(0,f.Z)(function*(){var n=t.createContentOptions(e);if((0,G.w)()){var r=t.convertOptionsToParams(n),i=[],o=0;do{var s,c,a=yield t.clientCP.listEntries(r,s);i.push(...a.entries);var l=null!==(c=a.scroll)&&void 0!==c?c:void 0;if(l&&l===s)break;s=l}while(s&&++o<25);return o>=25&&console.warn("listEntries pagination hit MAX_PAGES cap",r),t.fillEntriesWithData(i,r,n.isPreview)}return F(n.cmsOptions)})()}getPlpContent(e,t){var n=this;return(0,f.Z)(function*(){var r=service_objectSpread(service_objectSpread({},e),{},{contentType:"plp"}),i=n.createContentOptions(r);if((0,G.w)()){var o=yield n.getSingleContent(r);if(o)return o;var s=(yield n.getMultipleContent(r)).data;if(!(null!=s&&s.length))throw new MissingContentError(i.cmsOptions);return findBestPLPTemplate(s,i.slug,t)}return A(i.slug,i.cmsOptions,t)})()}getPdpContent(e,t){var n=this;return(0,f.Z)(function*(){var r=service_objectSpread(service_objectSpread({},t),{},{contentType:"pdp"}),i=n.createContentOptions(r);if((0,G.w)()){var o=yield n.getSingleContent(r);if(o)return o;var s=(yield n.getMultipleContent(r)).data;if(!s.length)throw new MissingContentError(i.cmsOptions);return findBestPDPTemplate(s,e)}return U(e,i.cmsOptions)})()}getFromCP(e){var t=this;return(0,f.Z)(function*(){var n=t.convertOptionsToParams(e);try{return yield t.getEntry(n,e.isPreview)}catch(e){if(!(e instanceof MissingContentError||e instanceof Error&&/\b404\b/.test(e.message)))throw e;console.warn("Content not found",e)}})()}fillEntriesWithData(e,t,n){var r=this;return(0,f.Z)(function*(){var i;return{data:yield Promise.all(e.map((i=(0,f.Z)(function*(e){var i=yield r.getEntryData(service_objectSpread(service_objectSpread({},t),{},{entryId:e.id}),n);return r.mergeEntryWithData(e,i)}),function(e){return i.apply(this,arguments)})))}})()}getEntry(e,t){var n=this;return(0,f.Z)(function*(){return e.entryId||e.slug?yield n.getEntryData(e,t):yield n.fetchFirstEntryFromList(e,t)})()}getEntryData(e,t){var n=this;return(0,f.Z)(function*(){if(!e.entryId&&!e.slug)throw Error("".concat(t?"Preview":"getEntry"," requires entryId or slug"));return t?e.entryId?n.clientCP.previewEntryById(e):n.clientCP.previewEntryBySlug(e):e.entryId?n.clientCP.getEntry(e):n.clientCP.getEntryBySlug(e)})()}fetchFirstEntryFromList(e,t){var n=this;return(0,f.Z)(function*(){var{entries:r}=yield n.clientCP.listEntries(e);if(!r||0===r.length)return console.warn("No entries found for params",e),{};if(r.length>1)throw new MultipleContentError(e);return n.getEntryData(service_objectSpread(service_objectSpread({},e),{},{entryId:r[0].id}),t)})()}createContentOptions(e){var{contentType:t,previewData:n,slug:r}=e,i=(null==n?void 0:n.contentType)===t,o=(0,G.b)(n);return service_objectSpread(service_objectSpread({cmsOptions:this.buildCmsOptions(e,i,o)},void 0!==r&&{slug:r}),{},{isPreview:i||o})}convertOptionsToParams(e){var t,n,{cmsOptions:r}=e,i={accountName:x().api.storeId,storeId:null!==(t=null===(n=x().contentSource)||void 0===n?void 0:n.project)&&void 0!==t?t:"faststore",contentType:r.contentType,slug:e.slug};if("documentId"in r&&r.documentId&&(i.entryId=r.documentId),"versionId"in r&&r.versionId&&(i.branchId=r.versionId),"releaseId"in r&&r.releaseId&&(i.branchId=r.releaseId),"filters"in r&&r.filters){var o=r.filters.filters;if(o&&o["settings.seo.slug"]){var s=o["settings.seo.slug"];i.slug=s.replace(/^\//,"")}Object.assign(i,r.filters)}return i}buildCmsOptions(e,t,n){var{contentType:r,previewData:i,documentId:o,versionId:s,releaseId:c,filters:a}=e,l=i||{},{slug:d}=l,p=(0,L.Z)(l,R);return service_objectSpread(service_objectSpread(service_objectSpread(service_objectSpread(service_objectSpread(service_objectSpread({contentType:r},t?p:{}),n&&{versionId:null==i?void 0:i.versionId,releaseId:null==i?void 0:i.releaseId}),void 0!==o&&{documentId:o}),void 0!==s&&{versionId:s}),void 0!==c&&{releaseId:c}),a&&{filters:a})}mergeEntryWithData(e,t){return service_objectSpread(service_objectSpread(service_objectSpread({},e),t),{},{id:e.id,name:e.name||""})}},H=n(31549);function LandingPage_ownKeys(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function LandingPage_objectSpread(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?LandingPage_ownKeys(Object(n),!0).forEach(function(t){(0,g.Z)(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):LandingPage_ownKeys(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}var Q=LandingPage_objectSpread(LandingPage_objectSpread(LandingPage_objectSpread({},b.Z),{},{[(0,O.x)(w.V,"Hero")]:w.V,[(0,O.x)(h.OverriddenDefaultBannerText,"BannerText")]:h.OverriddenDefaultBannerText,[(0,O.x)(j.default,"BannerNewsletter")]:j.default,[(0,O.x)(S.Z,"Incentives")]:S.Z,[(0,O.x)(m.Z,"CrossSellingShelf")]:m.Z,[(0,O.x)(_.OverriddenDefaultNewsletter,"Newsletter")]:_.OverriddenDefaultNewsletter,[(0,O.x)(I.OverriddenDefaultProductShelf,"ProductShelf")]:I.OverriddenDefaultProductShelf,[(0,O.x)(E.Z,"ProductTiles")]:E.Z},T.Z),C.Z);function LandingPage(e){var t,n,r,i,o,s,c,a,l,d,p,u,v,f,{page:{sections:g,settings:b},slug:O,serverData:j,globalSections:h,globalSettings:m}=e;return(0,H.jsxs)(H.Fragment,{children:[(0,H.jsx)(y.PB,{title:null!==(t=null==b?void 0:null===(n=b.seo)||void 0===n?void 0:n.title)&&void 0!==t?t:x().seo.title,description:null!==(r=null==b?void 0:null===(i=b.seo)||void 0===i?void 0:i.description)&&void 0!==r?r:null===(o=x().seo)||void 0===o?void 0:o.description,titleTemplate:null!==(s=null===(c=x().seo)||void 0===c?void 0:c.titleTemplate)&&void 0!==s?s:null===(a=x().seo)||void 0===a?void 0:a.title,canonical:null!==(l=null==b?void 0:null===(d=b.seo)||void 0===d?void 0:d.canonical)&&void 0!==l?l:"".concat(x().storeUrl,"/").concat(O),openGraph:{type:"website",url:x().storeUrl,title:null!==(p=null==b?void 0:null===(u=b.seo)||void 0===u?void 0:u.title)&&void 0!==p?p:x().seo.title,description:null!==(v=null==b?void 0:null===(f=b.seo)||void 0===f?void 0:f.description)&&void 0!==v?v:x().seo.description}}),(0,H.jsx)(y.iu,{url:x().storeUrl,potentialActions:[{target:"".concat(x().storeUrl,"/s/?q"),queryInput:"search_term_string"}]}),(0,H.jsx)(D.ZP,{context:{data:j,globalSettings:m},children:(0,H.jsx)(P.ZP,{sections:g,globalSections:h,components:Q})})]})}var X=(p=(0,f.Z)(function*(e,t){try{if(x().cms.data){var n,r,i=JSON.parse(x().cms.data).landingPage.find(e=>{var t,n;null===(t=e.settings)||void 0===t||null===(n=t.seo)||void 0===n||n.slug});if(i)return yield V.getSingleContent({contentType:"landingPage",previewData:t,documentId:i.documentId,versionId:i.versionId,releaseId:i.releaseId,slug:null===(n=i.settings)||void 0===n?void 0:null===(r=n.seo)||void 0===r?void 0:r.slug})}return yield V.getSingleContent({contentType:"landingPage",previewData:t,slug:e,filters:(null==t?void 0:t.contentType)!=="landingPage"?{filters:{"settings.seo.slug":"/".concat(e)}}:void 0})}catch(e){if(e instanceof MissingContentError)return null;throw e}}),function(e,t){return p.apply(this,arguments)})},77900:function(e,t,n){"use strict";var r=n(94564),i=n(42659),o=n(2614),s=n(31549);t.Z=function(e){var{incentives:t,variant:n="horizontal",colored:c=!1,label:a}=e;return(0,s.jsx)("section",{"data-fs-incentives":!0,"data-fs-incentives-colored":c,"data-fs-incentives-variant":n,"aria-label":"Incentives List ".concat(a),children:(0,s.jsx)(r.Z,{"data-fs-content":"incentives",children:t.map((e,t)=>(0,s.jsx)("li",{role:"listitem",children:(0,s.jsxs)(i.Z,{tabIndex:0,children:[(0,s.jsx)(o.Z,{"data-fs-incentive-icon":!0,"aria-label":e.alt,name:e.icon,width:32,height:32}),(0,s.jsxs)("section",{"data-fs-incentive-content":!0,children:[(0,s.jsx)("p",{"data-fs-incentive-title":!0,children:e.title}),(0,s.jsx)("span",{"data-fs-incentive-description":!0,children:e.firstLineText}),e.secondLineText&&(0,s.jsx)("span",{"data-fs-incentive-description":!0,children:e.secondLineText})]})]})},String(t)))})})}},90427:function(e){e.exports={section:"section_section__jnQ3q"}},42659:function(e,t,n){"use strict";var r=n(44194);let i=(0,r.forwardRef)(function({testId:e="store-incentive",children:t,...n},i){return r.createElement("section",{ref:i,"data-fs-incentive":!0,"data-testid":e,...n},t)});t.Z=i}}]);
|
|
File without changes
|
|
File without changes
|