@faststore/core 3.42.0 → 3.44.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 (210) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +55 -55
  3. package/.next/cache/.tsbuildinfo +1 -1
  4. package/.next/cache/config.json +3 -3
  5. package/.next/cache/webpack/client-production/0.pack +0 -0
  6. package/.next/cache/webpack/client-production/index.pack +0 -0
  7. package/.next/cache/webpack/server-production/0.pack +0 -0
  8. package/.next/cache/webpack/server-production/index.pack +0 -0
  9. package/.next/prerender-manifest.js +1 -1
  10. package/.next/prerender-manifest.json +1 -1
  11. package/.next/react-loadable-manifest.json +65 -65
  12. package/.next/routes-manifest.json +1 -1
  13. package/.next/server/chunks/1506.js +1 -1
  14. package/.next/server/chunks/2443.js +1 -0
  15. package/.next/server/chunks/2524.js +1 -0
  16. package/.next/server/chunks/4289.js +2 -362
  17. package/.next/server/chunks/4559.js +361 -0
  18. package/.next/server/chunks/4725.js +1 -0
  19. package/.next/server/chunks/4746.js +1 -1
  20. package/.next/server/chunks/5474.js +6 -0
  21. package/.next/server/chunks/5607.js +1 -0
  22. package/.next/server/chunks/563.js +1 -1
  23. package/.next/server/chunks/6594.js +1 -1
  24. package/.next/server/chunks/674.js +1 -1
  25. package/.next/server/chunks/6968.js +10 -0
  26. package/.next/server/chunks/7986.js +6 -1
  27. package/.next/server/chunks/804.js +1 -0
  28. package/.next/server/chunks/831.js +1 -1
  29. package/.next/server/chunks/8562.js +1 -1
  30. package/.next/server/chunks/8646.js +1 -1
  31. package/.next/server/chunks/ButtonSignIn.js +1 -1
  32. package/.next/server/chunks/UIBannerText.js +1 -1
  33. package/.next/server/chunks/UISKUMatrixSidebar.js +1 -1
  34. package/.next/server/middleware-build-manifest.js +1 -1
  35. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  36. package/.next/server/pages/404.js +1 -1
  37. package/.next/server/pages/404.js.nft.json +1 -1
  38. package/.next/server/pages/500.js +1 -1
  39. package/.next/server/pages/500.js.nft.json +1 -1
  40. package/.next/server/pages/[...slug].js +1 -1
  41. package/.next/server/pages/[...slug].js.nft.json +1 -1
  42. package/.next/server/pages/[slug]/p.js +1 -1
  43. package/.next/server/pages/[slug]/p.js.nft.json +1 -1
  44. package/.next/server/pages/_app.js +1 -1
  45. package/.next/server/pages/_app.js.nft.json +1 -1
  46. package/.next/server/pages/_document.js +1 -1
  47. package/.next/server/pages/_document.js.nft.json +1 -1
  48. package/.next/server/pages/_error.js +1 -1
  49. package/.next/server/pages/_error.js.nft.json +1 -1
  50. package/.next/server/pages/account/profile.js +1 -1
  51. package/.next/server/pages/account/profile.js.nft.json +1 -1
  52. package/.next/server/pages/account.js +1 -1
  53. package/.next/server/pages/account.js.nft.json +1 -1
  54. package/.next/server/pages/api/graphql.js +2 -1
  55. package/.next/server/pages/api/graphql.js.nft.json +1 -1
  56. package/.next/server/pages/api/health/live.js.nft.json +1 -1
  57. package/.next/server/pages/api/health/ready.js.nft.json +1 -1
  58. package/.next/server/pages/api/preview.js +1 -1
  59. package/.next/server/pages/api/preview.js.nft.json +1 -1
  60. package/.next/server/pages/checkout.js +1 -1
  61. package/.next/server/pages/checkout.js.nft.json +1 -1
  62. package/.next/server/pages/en-US/404.html +2 -2
  63. package/.next/server/pages/en-US/500.html +2 -2
  64. package/.next/server/pages/en-US/checkout.html +2 -2
  65. package/.next/server/pages/en-US/login.html +2 -2
  66. package/.next/server/pages/en-US/s.html +2 -2
  67. package/.next/server/pages/en-US.html +2 -2
  68. package/.next/server/pages/index.js +1 -1
  69. package/.next/server/pages/index.js.nft.json +1 -1
  70. package/.next/server/pages/login.js +1 -1
  71. package/.next/server/pages/login.js.nft.json +1 -1
  72. package/.next/server/pages/s.js +1 -1
  73. package/.next/server/pages/s.js.nft.json +1 -1
  74. package/.next/server/pages-manifest.json +1 -1
  75. package/.next/static/U_9W0qMyv_4RQSLFdrtHC/_buildManifest.js +1 -0
  76. package/.next/static/chunks/{1153.ed17e19083f51bdb.js → 1153.8f0ac867c4ddce90.js} +1 -1
  77. package/.next/static/chunks/1173.ca14a5bc4e1264f4.js +1 -0
  78. package/.next/static/chunks/1418-e86227bcf9a5d486.js +28 -0
  79. package/.next/static/chunks/1552.8751332da83cadc5.js +1 -0
  80. package/.next/static/chunks/{6076.d80e37e35892bafc.js → 3684.3e6f435506c2c7c9.js} +1 -1
  81. package/.next/static/chunks/417.edbb75ab2f55482f.js +1 -0
  82. package/.next/static/chunks/{4349-6fc936580b772e67.js → 4349-87a956a73b97519c.js} +1 -1
  83. package/.next/static/chunks/{4625-9a273e78866c389b.js → 4625-553d20c86b0ca577.js} +1 -1
  84. package/.next/static/chunks/{4746.19eddeaeb33ea820.js → 4746.2e16ec0663a3873f.js} +1 -1
  85. package/.next/static/chunks/{4774.907a71a04126d57c.js → 4774.8e70c01dcd0ed4b3.js} +1 -1
  86. package/.next/static/chunks/{4865.3e2ae9feb511c870.js → 4865.4017be0f8e7c8cf0.js} +1 -1
  87. package/.next/static/chunks/5836.c5c244a8cbfa7f7d.js +1 -0
  88. package/.next/static/chunks/630.13d3dd939b789798.js +6 -0
  89. package/.next/static/chunks/6335-6eb4ff84af184b88.js +1 -0
  90. package/.next/static/chunks/6536.d5260107222db13c.js +1 -0
  91. package/.next/static/chunks/{7195.e88924bd232c58b7.js → 7195.fd4cacc0bef1a233.js} +1 -1
  92. package/.next/static/chunks/7498-72289e704e7c7056.js +1 -0
  93. package/.next/static/chunks/7959.7c721505286572c0.js +1 -0
  94. package/.next/static/chunks/9.89f24163370f3a22.js +1 -0
  95. package/.next/static/chunks/BannerNewsletter.8982f42e60ed8828.js +1 -0
  96. package/.next/static/chunks/{ButtonSignIn.df0e3ce490436fe2.js → ButtonSignIn.bff8dc7b2133806c.js} +1 -1
  97. package/.next/static/chunks/CartItem.f2493be7c504f22f.js +1 -0
  98. package/.next/static/chunks/{CartSidebar.26d3e39bf93a368f.js → CartSidebar.aa9e43be37034654.js} +1 -1
  99. package/.next/static/chunks/{Gift.affb75f8f7bcb6db.js → Gift.375356d6a74e2693.js} +1 -1
  100. package/.next/static/chunks/Newsletter.9db4df2d4fb33227.js +1 -0
  101. package/.next/static/chunks/OrderSummary.e6e0a3af3c224b4e.js +1 -0
  102. package/.next/static/chunks/ProductShelf.9cea36116836c161.js +1 -0
  103. package/.next/static/chunks/ProductTiles.059a4a6360e1d4ea.js +1 -0
  104. package/.next/static/chunks/RegionModal.4594b707a1092551.js +1 -0
  105. package/.next/static/chunks/UIBannerText.45cf608e46cde628.js +1 -0
  106. package/.next/static/chunks/UIButton.3186f933c0ecfb31.js +1 -0
  107. package/.next/static/chunks/UISKUMatrixSidebar.9ac3980a60cfc358.js +1 -0
  108. package/.next/static/chunks/UIToast.221eb10681d2f642.js +1 -0
  109. package/.next/static/chunks/pages/{404-8e61ea158e7b314c.js → 404-6300c433469b7262.js} +1 -1
  110. package/.next/static/chunks/pages/{500-68f51177e64de6e7.js → 500-2d1dd344c8a8827f.js} +1 -1
  111. package/.next/static/chunks/pages/[...slug]-c1a62d58f5940747.js +1 -0
  112. package/.next/static/chunks/pages/[slug]/p-555dc09a5e78260e.js +1 -0
  113. package/.next/static/chunks/pages/_app-929466ed763a6d46.js +1 -0
  114. package/.next/static/chunks/pages/account/{profile-1fdb500de8f12b3a.js → profile-23b2e9fbbd95a30b.js} +1 -1
  115. package/.next/static/chunks/pages/{checkout-0dfe0dc9cee443ba.js → checkout-93b647fc45454d97.js} +1 -1
  116. package/.next/static/chunks/pages/{index-d36123e232b889d8.js → index-07bc320fc045538c.js} +1 -1
  117. package/.next/static/chunks/pages/{login-b59ea5561defc0d4.js → login-2454f1cd309c27d2.js} +1 -1
  118. package/.next/static/chunks/pages/{s-6120de2f57d674fc.js → s-9901e6857f517b8b.js} +1 -1
  119. package/.next/static/chunks/webpack-c2eed1e0b727b3ee.js +1 -0
  120. package/.next/static/css/b8945ac5f5327c34.css +1 -0
  121. package/.next/static/css/{f03f8973f7c72071.css → dbbb10bf2f162a58.css} +1 -1
  122. package/.next/trace +113 -109
  123. package/.turbo/turbo-build.log +25 -25
  124. package/.turbo/turbo-test.log +5 -5
  125. package/@generated/gql.ts +18 -2
  126. package/@generated/graphql.ts +58 -1
  127. package/@generated/persisted-documents.json +3 -1
  128. package/@generated/schema.graphql +14 -0
  129. package/CHANGELOG.md +12 -0
  130. package/cms/faststore/sections.json +110 -1
  131. package/discovery.config.default.js +12 -0
  132. package/package.json +7 -6
  133. package/src/Layout.tsx +2 -0
  134. package/src/components/cms/GlobalSections.tsx +13 -9
  135. package/src/components/cms/global/Components.ts +2 -0
  136. package/src/components/region/RegionBar/RegionBar.tsx +35 -2
  137. package/src/components/region/RegionButton/RegionButton.tsx +41 -6
  138. package/src/components/region/RegionModal/RegionModal.tsx +46 -34
  139. package/src/components/region/RegionModal/useRegion.ts +79 -0
  140. package/src/components/region/RegionModal/useRegionModal.ts +44 -0
  141. package/src/components/region/RegionPopover/RegionPopover.tsx +174 -0
  142. package/src/components/region/RegionPopover/index.ts +1 -0
  143. package/src/components/region/RegionPopover/section.module.scss +9 -0
  144. package/src/components/search/SearchInput/SearchInput.tsx +2 -2
  145. package/src/components/sections/Navbar/section.module.scss +3 -0
  146. package/src/components/sections/RegionBar/RegionBar.tsx +8 -3
  147. package/src/components/templates/LandingPage/LandingPage.tsx +22 -18
  148. package/src/components/templates/ProductListingPage/ProductListing.tsx +6 -1
  149. package/src/constants.ts +1 -0
  150. package/src/experimental/searchServerSideFunctions/getServerSideProps.ts +8 -5
  151. package/src/experimental/searchServerSideFunctions/getStaticProps.ts +9 -7
  152. package/src/pages/404.tsx +6 -5
  153. package/src/pages/500.tsx +6 -5
  154. package/src/pages/[...slug].tsx +11 -4
  155. package/src/pages/[slug]/p.tsx +16 -6
  156. package/src/pages/_app.tsx +4 -2
  157. package/src/pages/api/preview.ts +43 -18
  158. package/src/pages/index.tsx +9 -7
  159. package/src/pages/login.tsx +6 -5
  160. package/src/sdk/error/MissingContentError/MissingContentError.ts +6 -4
  161. package/src/sdk/error/MultipleContentError/MultipleContentError.ts +6 -4
  162. package/src/sdk/geolocation/useGeolocation.ts +42 -0
  163. package/src/sdk/product/index.ts +21 -0
  164. package/src/sdk/profile/index.ts +31 -0
  165. package/src/sdk/session/index.ts +37 -0
  166. package/src/sdk/ui/useOnClickOutside.ts +3 -38
  167. package/src/server/cms/index.ts +1 -2
  168. package/src/server/content/service.ts +227 -0
  169. package/src/server/content/types.ts +26 -0
  170. package/src/server/content/utils.ts +8 -0
  171. package/src/utils/utilities.ts +9 -1
  172. package/test/server/index.test.ts +1 -0
  173. package/.next/server/chunks/3105.js +0 -6
  174. package/.next/server/chunks/3779.js +0 -1
  175. package/.next/server/chunks/4444.js +0 -6
  176. package/.next/server/chunks/6026.js +0 -9
  177. package/.next/server/chunks/6030.js +0 -1
  178. package/.next/server/chunks/7337.js +0 -1
  179. package/.next/server/chunks/7675.js +0 -1
  180. package/.next/server/chunks/9594.js +0 -1
  181. package/.next/static/Ra_8xXVEVCNHcT2KePSUO/_buildManifest.js +0 -1
  182. package/.next/static/chunks/1036.27f5244aaf7d0915.js +0 -1
  183. package/.next/static/chunks/1173.5e86a9295010b785.js +0 -1
  184. package/.next/static/chunks/1552.e7cece605fc2e1cd.js +0 -1
  185. package/.next/static/chunks/3684.ba7a2a994988063b.js +0 -1
  186. package/.next/static/chunks/417.c39c1c5e5ef57b4a.js +0 -1
  187. package/.next/static/chunks/485.a35fab0c7c75a11b.js +0 -1
  188. package/.next/static/chunks/6167-ecb49640dcb9d566.js +0 -28
  189. package/.next/static/chunks/6335-5870fc075bf96b86.js +0 -1
  190. package/.next/static/chunks/6536.cd75ac69c241a35c.js +0 -1
  191. package/.next/static/chunks/7498-415859c993f5002b.js +0 -1
  192. package/.next/static/chunks/7959.9d31abae51a7e419.js +0 -1
  193. package/.next/static/chunks/9.e42e9b7463b94493.js +0 -1
  194. package/.next/static/chunks/BannerNewsletter.06b2b9724aa3c3ea.js +0 -1
  195. package/.next/static/chunks/CartItem.44cc90c698a69889.js +0 -1
  196. package/.next/static/chunks/Newsletter.d775e641d99322e6.js +0 -1
  197. package/.next/static/chunks/OrderSummary.8f34504b20564fec.js +0 -1
  198. package/.next/static/chunks/ProductShelf.0b5a71a93bca3148.js +0 -1
  199. package/.next/static/chunks/ProductTiles.a75612c0bcf990d6.js +0 -1
  200. package/.next/static/chunks/RegionModal.68b05bfd591d27fc.js +0 -1
  201. package/.next/static/chunks/UIBannerText.5ee380812ac3772c.js +0 -1
  202. package/.next/static/chunks/UIButton.c7a3273ac6ee5da5.js +0 -1
  203. package/.next/static/chunks/UISKUMatrixSidebar.c68540bda6d40e13.js +0 -1
  204. package/.next/static/chunks/UIToast.85ae30e3e8cc5ec7.js +0 -1
  205. package/.next/static/chunks/pages/[...slug]-f4fd6c8d7dc53f8f.js +0 -1
  206. package/.next/static/chunks/pages/[slug]/p-3b513ae37c648620.js +0 -1
  207. package/.next/static/chunks/pages/_app-0f16b6b5d7dfab2a.js +0 -1
  208. package/.next/static/chunks/webpack-d72e5eb27bf80195.js +0 -1
  209. package/.next/static/css/31fb64e064998460.css +0 -1
  210. /package/.next/static/{Ra_8xXVEVCNHcT2KePSUO → U_9W0qMyv_4RQSLFdrtHC}/_ssgManifest.js +0 -0
@@ -1,12 +1,14 @@
1
1
  import type { Options } from 'src/server/cms'
2
+ import type { EntryPathParams } from '@vtex/client-cp'
3
+ import { contentSource } from 'discovery.config.default'
2
4
 
3
5
  export default class MultipleContentError extends Error {
4
- constructor(options: Options) {
6
+ constructor(params: Options | EntryPathParams) {
5
7
  super(
6
- `Multiple content defined on the CMS for content type ${
7
- options.contentType
8
+ `Multiple content defined on the ${contentSource.type} for content type ${
9
+ params.contentType
8
10
  }. Remove duplicated content before proceeding. Context: ${JSON.stringify(
9
- options,
11
+ params,
10
12
  null,
11
13
  2
12
14
  )}`
@@ -0,0 +1,42 @@
1
+ import { useEffect } from 'react'
2
+
3
+ import { deliveryPromise } from 'discovery.config'
4
+ import { TIME_TO_VALIDATE_SESSION } from 'src/constants'
5
+ import { sessionStore, validateSession } from 'src/sdk/session'
6
+
7
+ async function askGeolocationConsent() {
8
+ const { postalCode: stalePostalCode, geoCoordinates: staleGeoCoordinates } =
9
+ sessionStore.read()
10
+
11
+ if (navigator?.geolocation && (!stalePostalCode || !staleGeoCoordinates)) {
12
+ navigator.geolocation.getCurrentPosition(
13
+ async ({ coords: { latitude, longitude } }) => {
14
+ // Revalidate the session because users can set a zip code while granting consent.
15
+ const revalidatedSession = sessionStore.read()
16
+ if (
17
+ revalidatedSession.postalCode ||
18
+ revalidatedSession.geoCoordinates
19
+ ) {
20
+ return
21
+ }
22
+
23
+ const newSession = {
24
+ ...revalidatedSession,
25
+ geoCoordinates: { latitude, longitude },
26
+ }
27
+ const validatedSession = await validateSession(newSession)
28
+ sessionStore.set(validatedSession ?? newSession)
29
+ }
30
+ )
31
+ }
32
+ }
33
+
34
+ export default function useGeolocation() {
35
+ useEffect(() => {
36
+ if (!deliveryPromise.enabled) {
37
+ return
38
+ }
39
+
40
+ setTimeout(() => askGeolocationConsent(), TIME_TO_VALIDATE_SESSION)
41
+ }, [])
42
+ }
@@ -0,0 +1,21 @@
1
+ import { gql } from '@generated'
2
+
3
+ import type {
4
+ ClientProductCountQueryQuery as Query,
5
+ ClientProductCountQueryQueryVariables as Variables,
6
+ } from '@generated/graphql'
7
+ import { request } from '../graphql/request'
8
+
9
+ export const query = gql(`
10
+ query ClientProductCountQuery($term: String) {
11
+ productCount(term: $term) {
12
+ total
13
+ }
14
+ }
15
+ `)
16
+
17
+ export const getProductCount = async (term?: string) => {
18
+ const { productCount } = await request<Query, Variables>(query, { term })
19
+
20
+ return productCount.total
21
+ }
@@ -0,0 +1,31 @@
1
+ import { gql } from '@generated'
2
+
3
+ import type {
4
+ ClientProfileQueryQuery as Query,
5
+ ClientProfileQueryQueryVariables as Variables,
6
+ } from '@generated/graphql'
7
+ import { request } from '../graphql/request'
8
+
9
+ export const query = gql(`
10
+ query ClientProfileQuery($id: String!) {
11
+ profile(id: $id) {
12
+ addresses {
13
+ country
14
+ postalCode
15
+ geoCoordinate
16
+ city
17
+ }
18
+ }
19
+ }
20
+ `)
21
+
22
+ export const getAddresses = async (id: string) => {
23
+ const data = await request<Query, Variables>(query, { id })
24
+ return data.profile.addresses
25
+ }
26
+
27
+ export const getSavedAddress = async (id: string) => {
28
+ const addresses = await getAddresses(id)
29
+ // returning the first address of the list because there is no favorite address feature
30
+ return addresses ? addresses[0] : null
31
+ }
@@ -10,6 +10,7 @@ import type {
10
10
  import storeConfig from '../../../discovery.config'
11
11
  import { cartStore } from '../cart'
12
12
  import { request } from '../graphql/request'
13
+ import { getSavedAddress } from '../profile'
13
14
  import { createValidationStore, useStore } from '../useStore'
14
15
 
15
16
  export const mutation = gql(`
@@ -20,6 +21,7 @@ export const mutation = gql(`
20
21
  country
21
22
  addressType
22
23
  postalCode
24
+ city
23
25
  deliveryMode {
24
26
  deliveryChannel
25
27
  deliveryMethod
@@ -58,6 +60,41 @@ export const mutation = gql(`
58
60
  `)
59
61
 
60
62
  export const validateSession = async (session: Session) => {
63
+ // If deliveryPromise is enabled and there is no postalCode in the session
64
+ if (storeConfig.deliveryPromise?.enabled && !session.postalCode) {
65
+ const isLoggedIn = !!session.person?.id
66
+
67
+ // If user is logged try to get the location (postalCode / geoCoordinates / country) from the user's address
68
+ if (isLoggedIn) {
69
+ const userId = session.person?.id
70
+ const address = await getSavedAddress(userId)
71
+
72
+ // Save the location in the session
73
+ if (address) {
74
+ sessionStore.set({
75
+ ...session,
76
+ city: address?.city,
77
+ postalCode: address?.postalCode,
78
+ geoCoordinates: {
79
+ // the values come in the reverse expected order
80
+ latitude: address?.geoCoordinate ? address?.geoCoordinate[1] : null,
81
+ longitude: address?.geoCoordinate
82
+ ? address?.geoCoordinate[0]
83
+ : null,
84
+ },
85
+ country: address?.country,
86
+ })
87
+ }
88
+ } else {
89
+ // Use the initial postalCode defined in discovery.config.js
90
+ const initialPostalCode = defaultStore.readInitial().postalCode
91
+
92
+ if (!!initialPostalCode) {
93
+ sessionStore.set({ ...session, postalCode: initialPostalCode })
94
+ }
95
+ }
96
+ }
97
+
61
98
  const data = await request<
62
99
  ValidateSessionMutation,
63
100
  ValidateSessionMutationVariables
@@ -1,38 +1,3 @@
1
- import type { RefObject } from 'react'
2
- import { useEffect } from 'react'
3
-
4
- type Handler = (event: any) => void
5
-
6
- export default function useOnClickOutside<T extends HTMLElement = HTMLElement>(
7
- ref: RefObject<T>,
8
- handler: Handler
9
- ) {
10
- useEffect(
11
- () => {
12
- const listener: Handler = (event) => {
13
- if (!ref.current || ref.current.contains(event.target)) {
14
- return
15
- }
16
-
17
- handler(event)
18
- }
19
-
20
- document.addEventListener('mousedown', listener)
21
- document.addEventListener('touchstart', listener)
22
-
23
- return () => {
24
- document.removeEventListener('mousedown', listener)
25
- document.removeEventListener('touchstart', listener)
26
- }
27
- },
28
- /**
29
- * Add ref and handler to effect dependencies.
30
- * It's worth noting that because passed in handler is a new
31
- * function on every render that will cause this effect
32
- * callback/cleanup to run every render. It's not a big deal
33
- * but to optimize you can wrap handler in useCallback before
34
- * passing it into this hook.
35
- */
36
- [ref, handler]
37
- )
38
- }
1
+ // This hook was moved to the UI package, this export is to avoid breaking changes
2
+ // TODO: remove in the next major release
3
+ export { useOnClickOutside as default } from '@faststore/ui'
@@ -1,7 +1,6 @@
1
1
  import type { ContentData, ContentTypeOptions, Locator } from '@vtex/client-cms'
2
2
  import ClientCMS from '@vtex/client-cms'
3
3
 
4
- import MissingContentError from 'src/sdk/error/MissingContentError'
5
4
  import MultipleContentError from 'src/sdk/error/MultipleContentError'
6
5
  import config from '../../../discovery.config'
7
6
 
@@ -57,7 +56,7 @@ export type PageContentType = ContentData & {
57
56
  }
58
57
  }
59
58
 
60
- const isLocator = (x: any): x is Locator =>
59
+ export const isLocator = (x: any): x is Locator =>
61
60
  typeof x.contentType === 'string' &&
62
61
  (typeof x.releaseId === 'string' ||
63
62
  typeof x.documentId === 'string' ||
@@ -0,0 +1,227 @@
1
+ import type { ContentData, Locator } from '@vtex/client-cms'
2
+ import ClientCP from '@vtex/client-cp'
3
+ import type { ContentEntry, EntryPathParams } from '@vtex/client-cp'
4
+ import { getCMSPage, getPage, type PageContentType } from 'src/server/cms'
5
+ import type { ContentOptions, ContentParams } from './types'
6
+ import config from '../../../discovery.config'
7
+ import { getPLP, type PLPContentType } from '../cms/plp'
8
+ import {
9
+ findBestPDPTemplate,
10
+ findBestPLPTemplate,
11
+ type Rewrite,
12
+ type RewritesConfig,
13
+ } from 'src/utils/multipleTemplates'
14
+ import MissingContentError from 'src/sdk/error/MissingContentError'
15
+ import { getPDP, type PDPContentType } from '../cms/pdp'
16
+ import MultipleContentError from 'src/sdk/error/MultipleContentError'
17
+ import type { ServerProductQueryQuery } from '@generated/graphql'
18
+ import { isContentPlatformSource } from './utils'
19
+
20
+ export class ContentService {
21
+ private clientCP: ClientCP
22
+
23
+ constructor() {
24
+ this.clientCP = new ClientCP({
25
+ tenant: config.api.storeId,
26
+ })
27
+ }
28
+
29
+ async getSingleContent<T extends ContentData>(
30
+ params: ContentParams
31
+ ): Promise<T> {
32
+ const options = this.createContentOptions(params)
33
+
34
+ if (isContentPlatformSource()) {
35
+ return this.getFromCP<T>(options)
36
+ }
37
+ return getPage(options.cmsOptions)
38
+ }
39
+
40
+ async getContent(params: ContentParams) {
41
+ const options = this.createContentOptions(params)
42
+
43
+ if (isContentPlatformSource()) {
44
+ const serviceParams = this.convertOptionsToParams(options)
45
+ const { entries } = await this.clientCP.listEntries(serviceParams)
46
+ const data = await Promise.all(
47
+ entries.map(async (entry) => {
48
+ const entryData = await this.getSingleEntry(
49
+ { ...serviceParams, entryId: entry.id },
50
+ !!options.isPreview
51
+ )
52
+ return this.mergeEntryWithData(entry, entryData)
53
+ })
54
+ )
55
+ return { data }
56
+ }
57
+ return getCMSPage(options.cmsOptions)
58
+ }
59
+
60
+ async getPlpContent(
61
+ params: ContentParams,
62
+ rewrites: Rewrite[] | RewritesConfig
63
+ ): Promise<PLPContentType> {
64
+ const plpParams = { ...params, contentType: 'plp' }
65
+ const options = this.createContentOptions(plpParams)
66
+
67
+ if (isContentPlatformSource()) {
68
+ const pages = (await this.getContent(plpParams)).data
69
+ if (!pages?.length) throw new MissingContentError(options.cmsOptions)
70
+ return findBestPLPTemplate(
71
+ pages,
72
+ options.slug,
73
+ rewrites
74
+ ) as PLPContentType
75
+ }
76
+ return getPLP(options.slug, options.cmsOptions as Locator, rewrites)
77
+ }
78
+
79
+ async getPdpContent(
80
+ product: ServerProductQueryQuery['product'],
81
+ params: ContentParams
82
+ ): Promise<PDPContentType> {
83
+ const pdpParams = { ...params, contentType: 'pdp' }
84
+ const options = this.createContentOptions(pdpParams)
85
+
86
+ if (isContentPlatformSource()) {
87
+ const pages = (await this.getContent(pdpParams)).data
88
+ if (!pages.length) throw new MissingContentError(options.cmsOptions)
89
+ return findBestPDPTemplate(pages, product) as PDPContentType
90
+ }
91
+ return getPDP(product, options.cmsOptions as Locator)
92
+ }
93
+
94
+ private async getFromCP<T extends ContentData>(
95
+ options: ContentOptions
96
+ ): Promise<T> {
97
+ const params = this.convertOptionsToParams(options)
98
+ try {
99
+ const entry: PageContentType =
100
+ params.entryId || params.slug
101
+ ? await this.getSingleEntry(params, !!options.isPreview)
102
+ : await this.fetchFirstEntry(params, !!options.isPreview)
103
+
104
+ return entry as T
105
+ } catch (err: unknown) {
106
+ if (isNotFoundError(err)) console.error('Content not found', err)
107
+ else throw err
108
+ }
109
+ }
110
+
111
+ private async getSingleEntry(
112
+ params: EntryPathParams,
113
+ isPreview: boolean
114
+ ): Promise<PageContentType> {
115
+ if (isPreview) {
116
+ if (params.entryId)
117
+ return this.clientCP.previewEntryById(
118
+ params
119
+ ) as Promise<PageContentType>
120
+ if (params.slug)
121
+ return this.clientCP.previewEntryBySlug(
122
+ params
123
+ ) as Promise<PageContentType>
124
+ throw new Error('Preview requires entryId or slug')
125
+ }
126
+ if (params.entryId)
127
+ return this.clientCP.getEntry(params) as Promise<PageContentType>
128
+ if (params.slug)
129
+ return this.clientCP.getEntryBySlug(params) as Promise<PageContentType>
130
+ throw new Error('getEntry requires entryId or slug')
131
+ }
132
+
133
+ private async fetchFirstEntry(
134
+ params: EntryPathParams,
135
+ isPreview: boolean
136
+ ): Promise<PageContentType> {
137
+ const { entries } = await this.clientCP.listEntries(params)
138
+ if (!entries || entries.length === 0) {
139
+ console.error('No entries found for params', params)
140
+ return {} as PageContentType
141
+ }
142
+ if (entries.length > 1) {
143
+ throw new MultipleContentError(params)
144
+ }
145
+ return this.getSingleEntry({ ...params, entryId: entries[0].id }, isPreview)
146
+ }
147
+
148
+ private mergeEntryWithData(
149
+ entry: ContentEntry,
150
+ data: PageContentType
151
+ ): ContentEntry & PageContentType {
152
+ return {
153
+ ...entry,
154
+ ...data,
155
+ id: entry.id,
156
+ name: entry.name || '',
157
+ }
158
+ }
159
+
160
+ private convertOptionsToParams(options: ContentOptions): EntryPathParams {
161
+ const { cmsOptions } = options
162
+ const params: Partial<EntryPathParams> = {
163
+ accountName: config.api.storeId,
164
+ storeId: 'faststore',
165
+ contentType: cmsOptions.contentType,
166
+ slug: options.slug,
167
+ }
168
+
169
+ if ('documentId' in cmsOptions && cmsOptions.documentId) {
170
+ params.entryId = cmsOptions.documentId
171
+ }
172
+ if ('versionId' in cmsOptions && cmsOptions.versionId) {
173
+ params.branchId = cmsOptions.versionId
174
+ }
175
+ if ('releaseId' in cmsOptions && cmsOptions.releaseId) {
176
+ params.branchId = cmsOptions.releaseId
177
+ }
178
+ if ('filters' in cmsOptions && cmsOptions.filters) {
179
+ const nested = cmsOptions.filters.filters as Record<string, any>
180
+ if (nested['settings.seo.slug']) {
181
+ const seo = nested['settings.seo.slug'] as string
182
+ params.slug = seo.replace(/^\//, '')
183
+ }
184
+ Object.assign(params, cmsOptions.filters)
185
+ }
186
+
187
+ return params as EntryPathParams
188
+ }
189
+
190
+ private createContentOptions(params: ContentParams): ContentOptions {
191
+ const {
192
+ contentType,
193
+ previewData,
194
+ slug,
195
+ documentId,
196
+ versionId,
197
+ releaseId,
198
+ filters,
199
+ } = params
200
+
201
+ const isPreview = previewData?.contentType === contentType
202
+ const { slug: _, ...previewLocator } = previewData || {}
203
+
204
+ const cmsOptions = {
205
+ contentType,
206
+ ...(isPreview ? previewLocator : {}),
207
+ ...(documentId !== undefined && { documentId }),
208
+ ...(versionId !== undefined && { versionId }),
209
+ ...(releaseId !== undefined && { releaseId }),
210
+ ...(filters && { filters }),
211
+ }
212
+
213
+ return {
214
+ cmsOptions,
215
+ ...(slug !== undefined && { slug }),
216
+ isPreview,
217
+ }
218
+ }
219
+ }
220
+
221
+ function isNotFoundError(err: unknown): boolean {
222
+ if (err instanceof MissingContentError) return true
223
+ if (err instanceof Error && /\b404\b/.test(err.message)) return true
224
+ return false
225
+ }
226
+
227
+ export const contentService = new ContentService()
@@ -0,0 +1,26 @@
1
+ import type { Locator } from '@vtex/client-cms'
2
+ import type { Options } from '../cms'
3
+
4
+ export const ContentSourceType = {
5
+ ContentPlatform: 'cp',
6
+ }
7
+
8
+ export type PreviewData = Locator & {
9
+ slug?: string
10
+ }
11
+
12
+ export interface ContentParams {
13
+ contentType?: string
14
+ previewData?: PreviewData | null
15
+ slug?: string
16
+ documentId?: string
17
+ versionId?: string
18
+ releaseId?: string
19
+ filters?: Record<string, any>
20
+ }
21
+
22
+ export interface ContentOptions {
23
+ cmsOptions: Options
24
+ slug?: string
25
+ isPreview: boolean
26
+ }
@@ -0,0 +1,8 @@
1
+ import { contentSource } from '../../../discovery.config'
2
+ import { ContentSourceType } from './types'
3
+
4
+ export function isContentPlatformSource(): boolean {
5
+ return (
6
+ contentSource.type.toLocaleLowerCase() === ContentSourceType.ContentPlatform
7
+ )
8
+ }
@@ -1,4 +1,4 @@
1
- //Input "Example Text!". Output: example-text
1
+ // Input "Example Text!". Output: example-text
2
2
  export function textToKebabCase(text: string): string {
3
3
  // Replace spaces and special characters with hyphens
4
4
  let kebabCase = text.replace(/[^\w\s]/gi, '-')
@@ -11,3 +11,11 @@ export function textToKebabCase(text: string): string {
11
11
 
12
12
  return kebabCase ?? ''
13
13
  }
14
+
15
+ // Input "EXAMPLE text!". Output: "Example Text!"
16
+ export function textToTitleCase(text: string): string {
17
+ return text.replace(
18
+ /\S+/g,
19
+ (word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()
20
+ )
21
+ }
@@ -72,6 +72,7 @@ const QUERIES = [
72
72
  'redirect',
73
73
  'sellers',
74
74
  'profile',
75
+ 'productCount',
75
76
  ]
76
77
 
77
78
  const MUTATIONS = ['validateCart', 'validateSession', 'subscribeToNewsletter']
@@ -1,6 +0,0 @@
1
- exports.id=3105,exports.ids=[3105],exports.modules={30033:(e,t,n)=>{"use strict";let r=["strategy","src","children","dangerouslySetInnerHTML"],i=["strategy"],o=["crossOrigin","nonce"],a=["strategy","children","dangerouslySetInnerHTML","src"];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){var r;r=n[t],t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):ownKeys(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function _objectWithoutProperties(e,t){if(null==e)return{};var n,r,i=function(e,t){if(null==e)return{};var n,r,i={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],!(t.indexOf(n)>=0)&&Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{Head:function(){return Head},NextScript:function(){return NextScript},Html:function(){return Html},Main:function(){return Main},default:function(){return Document}});let s=_interop_require_default(n(16689)),l=n(81123),c=n(67212),u=n(81453),p=_interop_require_default(n(61003)),d=n(75870);function _interop_require_default(e){return e&&e.__esModule?e:{default:e}}let f=new Set;function getDocumentFiles(e,t,n){let r=(0,c.getPageFiles)(e,"/_app"),i=n?[]:(0,c.getPageFiles)(e,t);return{sharedFiles:r,pageFiles:i,allFiles:[...new Set([...r,...i])]}}function getPolyfillScripts(e,t){let{assetPrefix:n,buildManifest:r,assetQueryString:i,disableOptimizedLoading:o,crossOrigin:a}=e;return r.polyfillFiles.filter(e=>e.endsWith(".js")&&!e.endsWith(".module.js")).map(e=>s.default.createElement("script",{key:e,defer:!o,nonce:t.nonce,crossOrigin:t.crossOrigin||a,noModule:!0,src:`${n}/_next/${e}${i}`}))}function AmpStyles({styles:e}){if(!e)return null;let t=Array.isArray(e)?e:[];if(e.props&&Array.isArray(e.props.children)){let hasStyles=e=>{var t,n;return null==e?void 0:null==(n=e.props)?void 0:null==(t=n.dangerouslySetInnerHTML)?void 0:t.__html};e.props.children.forEach(e=>{Array.isArray(e)?e.forEach(e=>hasStyles(e)&&t.push(e)):hasStyles(e)&&t.push(e)})}return s.default.createElement("style",{"amp-custom":"",dangerouslySetInnerHTML:{__html:t.map(e=>e.props.dangerouslySetInnerHTML.__html).join("").replace(/\/\*# sourceMappingURL=.*\*\//g,"").replace(/\/\*@ sourceURL=.*?\*\//g,"")}})}function getDynamicChunks(e,t,n){let{dynamicImports:r,assetPrefix:i,isDevelopment:o,assetQueryString:a,disableOptimizedLoading:l,crossOrigin:c}=e;return r.map(e=>!e.endsWith(".js")||n.allFiles.includes(e)?null:s.default.createElement("script",{async:!o&&l,defer:!l,key:e,src:`${i}/_next/${encodeURI(e)}${a}`,nonce:t.nonce,crossOrigin:t.crossOrigin||c}))}function getScripts(e,t,n){var r;let{assetPrefix:i,buildManifest:o,isDevelopment:a,assetQueryString:l,disableOptimizedLoading:c,crossOrigin:u}=e,p=n.allFiles.filter(e=>e.endsWith(".js")),d=null==(r=o.lowPriorityFiles)?void 0:r.filter(e=>e.endsWith(".js"));return[...p,...d].map(e=>s.default.createElement("script",{key:e,src:`${i}/_next/${encodeURI(e)}${l}`,nonce:t.nonce,async:!a&&c,defer:!c,crossOrigin:t.crossOrigin||u}))}function getPreNextScripts(e,t){let{scriptLoader:n,disableOptimizedLoading:o,crossOrigin:a}=e,l=function(e,t){let{assetPrefix:n,scriptLoader:i,crossOrigin:o,nextScriptWorkers:a}=e;if(!a)return null;try{let{partytownSnippet:e}=require("@builder.io/partytown/integration"),a=Array.isArray(t.children)?t.children:[t.children],l=a.find(e=>{var t,n;return!!e&&!!e.props&&(null==e?void 0:null==(n=e.props)?void 0:null==(t=n.dangerouslySetInnerHTML)?void 0:t.__html.length)&&"data-partytown-config"in e.props});return s.default.createElement(s.default.Fragment,null,!l&&s.default.createElement("script",{"data-partytown-config":"",dangerouslySetInnerHTML:{__html:`
2
- partytown = {
3
- lib: "${n}/_next/static/~partytown/"
4
- };
5
- `}}),s.default.createElement("script",{"data-partytown":"",dangerouslySetInnerHTML:{__html:e()}}),(i.worker||[]).map((e,n)=>{let{strategy:i,src:a,children:l,dangerouslySetInnerHTML:c}=e,u=_objectWithoutProperties(e,r),p={};if(a)p.src=a;else if(c&&c.__html)p.dangerouslySetInnerHTML={__html:c.__html};else if(l)p.dangerouslySetInnerHTML={__html:"string"==typeof l?l:Array.isArray(l)?l.join(""):""};else throw Error("Invalid usage of next/script. Did you forget to include a src attribute or an inline script? https://nextjs.org/docs/messages/invalid-script");return s.default.createElement("script",_objectSpread(_objectSpread(_objectSpread({},p),u),{},{type:"text/partytown",key:a||n,nonce:t.nonce,"data-nscript":"worker",crossOrigin:t.crossOrigin||o}))}))}catch(e){return(0,p.default)(e)&&"MODULE_NOT_FOUND"!==e.code&&console.warn(`Warning: ${e.message}`),null}}(e,t),c=(n.beforeInteractive||[]).filter(e=>e.src).map((e,n)=>{let{strategy:r}=e,l=_objectWithoutProperties(e,i);return s.default.createElement("script",_objectSpread(_objectSpread({},l),{},{key:l.src||n,defer:l.defer??!o,nonce:t.nonce,"data-nscript":"beforeInteractive",crossOrigin:t.crossOrigin||a}))});return s.default.createElement(s.default.Fragment,null,l,c)}let Head=class Head extends s.default.Component{getCssLinks(e){let{assetPrefix:t,assetQueryString:n,dynamicImports:r,crossOrigin:i,optimizeCss:o,optimizeFonts:a}=this.context,l=e.allFiles.filter(e=>e.endsWith(".css")),c=new Set(e.sharedFiles),u=new Set([]),p=Array.from(new Set(r.filter(e=>e.endsWith(".css"))));if(p.length){let e=new Set(l);p=p.filter(t=>!(e.has(t)||c.has(t))),u=new Set(p),l.push(...p)}let d=[];return l.forEach(e=>{let r=c.has(e);o||d.push(s.default.createElement("link",{key:`${e}-preload`,nonce:this.props.nonce,rel:"preload",href:`${t}/_next/${encodeURI(e)}${n}`,as:"style",crossOrigin:this.props.crossOrigin||i}));let a=u.has(e);d.push(s.default.createElement("link",{key:e,nonce:this.props.nonce,rel:"stylesheet",href:`${t}/_next/${encodeURI(e)}${n}`,crossOrigin:this.props.crossOrigin||i,"data-n-g":a?void 0:r?"":void 0,"data-n-p":a?void 0:r?void 0:""}))}),a&&(d=this.makeStylesheetInert(d)),0===d.length?null:d}getPreloadDynamicChunks(){let{dynamicImports:e,assetPrefix:t,assetQueryString:n,crossOrigin:r}=this.context;return e.map(e=>e.endsWith(".js")?s.default.createElement("link",{rel:"preload",key:e,href:`${t}/_next/${encodeURI(e)}${n}`,as:"script",nonce:this.props.nonce,crossOrigin:this.props.crossOrigin||r}):null).filter(Boolean)}getPreloadMainLinks(e){let{assetPrefix:t,assetQueryString:n,scriptLoader:r,crossOrigin:i}=this.context,o=e.allFiles.filter(e=>e.endsWith(".js"));return[...(r.beforeInteractive||[]).map(e=>s.default.createElement("link",{key:e.src,nonce:this.props.nonce,rel:"preload",href:e.src,as:"script",crossOrigin:this.props.crossOrigin||i})),...o.map(e=>s.default.createElement("link",{key:e,nonce:this.props.nonce,rel:"preload",href:`${t}/_next/${encodeURI(e)}${n}`,as:"script",crossOrigin:this.props.crossOrigin||i}))]}getBeforeInteractiveInlineScripts(){let{scriptLoader:e}=this.context,{nonce:t,crossOrigin:n}=this.props;return(e.beforeInteractive||[]).filter(e=>!e.src&&(e.dangerouslySetInnerHTML||e.children)).map((e,r)=>{let{strategy:i,children:o,dangerouslySetInnerHTML:l,src:c}=e,u=_objectWithoutProperties(e,a),p="";return l&&l.__html?p=l.__html:o&&(p="string"==typeof o?o:Array.isArray(o)?o.join(""):""),s.default.createElement("script",_objectSpread(_objectSpread({},u),{},{dangerouslySetInnerHTML:{__html:p},key:u.id||r,nonce:t,"data-nscript":"beforeInteractive",crossOrigin:n||void 0}))})}getDynamicChunks(e){return getDynamicChunks(this.context,this.props,e)}getPreNextScripts(){return getPreNextScripts(this.context,this.props)}getScripts(e){return getScripts(this.context,this.props,e)}getPolyfillScripts(){return getPolyfillScripts(this.context,this.props)}makeStylesheetInert(e){return s.default.Children.map(e,e=>{var t,n;if((null==e?void 0:e.type)==="link"&&(null==e?void 0:null==(t=e.props)?void 0:t.href)&&l.OPTIMIZED_FONT_PROVIDERS.some(({url:t})=>{var n,r;return null==e?void 0:null==(r=e.props)?void 0:null==(n=r.href)?void 0:n.startsWith(t)})){let t=_objectSpread(_objectSpread({},e.props||{}),{},{"data-href":e.props.href,href:void 0});return s.default.cloneElement(e,t)}if(null==e?void 0:null==(n=e.props)?void 0:n.children){let t=_objectSpread(_objectSpread({},e.props||{}),{},{children:this.makeStylesheetInert(e.props.children)});return s.default.cloneElement(e,t)}return e}).filter(Boolean)}render(){let{styles:e,ampPath:t,inAmpMode:r,hybridAmp:i,canonicalBase:a,__NEXT_DATA__:l,dangerousAsPath:c,headTags:u,unstable_runtimeJS:p,unstable_JsPreload:d,disableOptimizedLoading:f,optimizeCss:m,optimizeFonts:_,assetPrefix:h,nextFontManifest:E}=this.context,g=!1===p,S=!1===d||!f;this.context.docComponentsRendered.Head=!0;let{head:y}=this.context,I=[],T=[];y&&(y.forEach(e=>{let t;this.context.strictNextHead&&(t=s.default.createElement("meta",{name:"next-head",content:"1"})),e&&"link"===e.type&&"preload"===e.props.rel&&"style"===e.props.as?(t&&I.push(t),I.push(e)):e&&(t&&("meta"!==e.type||!e.props.charSet)&&T.push(t),T.push(e))}),y=I.concat(T));let P=s.default.Children.toArray(this.props.children).filter(Boolean);_&&!r&&(P=this.makeStylesheetInert(P));let b=!1,O=!1;y=s.default.Children.map(y||[],e=>{if(!e)return e;let{type:t,props:n}=e;if(r){let r="";if("meta"===t&&"viewport"===n.name?r='name="viewport"':"link"===t&&"canonical"===n.rel?O=!0:"script"===t&&(n.src&&-1>n.src.indexOf("ampproject")||n.dangerouslySetInnerHTML&&(!n.type||"text/javascript"===n.type))&&(r="<script",Object.keys(n).forEach(e=>{r+=` ${e}="${n[e]}"`}),r+="/>"),r)return console.warn(`Found conflicting amp tag "${e.type}" with conflicting prop ${r} in ${l.page}. https://nextjs.org/docs/messages/conflicting-amp-tag`),null}else"link"===t&&"amphtml"===n.rel&&(b=!0);return e});let A=getDocumentFiles(this.context.buildManifest,this.context.__NEXT_DATA__.page,r),v=function(e,t,n=""){if(!e)return{preconnect:null,preload:null};let r=e.pages["/_app"],i=e.pages[t],o=[...r??[],...i??[]],a=!!(0===o.length&&(r||i));return{preconnect:a?s.default.createElement("link",{"data-next-font":e.pagesUsingSizeAdjust?"size-adjust":"",rel:"preconnect",href:"/",crossOrigin:"anonymous"}):null,preload:o?o.map(e=>{let t=/\.(woff|woff2|eot|ttf|otf)$/.exec(e)[1];return s.default.createElement("link",{key:e,rel:"preload",href:`${n}/_next/${encodeURI(e)}`,as:"font",type:`font/${t}`,crossOrigin:"anonymous","data-next-font":e.includes("-s")?"size-adjust":""})}):null}}(E,c,h);return s.default.createElement("head",function(e){let{crossOrigin:t,nonce:n}=e,r=_objectWithoutProperties(e,o);return r}(this.props),this.context.isDevelopment&&s.default.createElement(s.default.Fragment,null,s.default.createElement("style",{"data-next-hide-fouc":!0,"data-ampdevmode":r?"true":void 0,dangerouslySetInnerHTML:{__html:"body{display:none}"}}),s.default.createElement("noscript",{"data-next-hide-fouc":!0,"data-ampdevmode":r?"true":void 0},s.default.createElement("style",{dangerouslySetInnerHTML:{__html:"body{display:block}"}}))),y,this.context.strictNextHead?null:s.default.createElement("meta",{name:"next-head-count",content:s.default.Children.count(y||[]).toString()}),P,_&&s.default.createElement("meta",{name:"next-font-preconnect"}),v.preconnect,v.preload,r&&s.default.createElement(s.default.Fragment,null,s.default.createElement("meta",{name:"viewport",content:"width=device-width,minimum-scale=1,initial-scale=1"}),!O&&s.default.createElement("link",{rel:"canonical",href:a+n(77252).cleanAmpPath(c)}),s.default.createElement("link",{rel:"preload",as:"script",href:"https://cdn.ampproject.org/v0.js"}),s.default.createElement(AmpStyles,{styles:e}),s.default.createElement("style",{"amp-boilerplate":"",dangerouslySetInnerHTML:{__html:"body{-webkit-animation:-amp-start 8s steps(1,end) 0s 1 normal both;-moz-animation:-amp-start 8s steps(1,end) 0s 1 normal both;-ms-animation:-amp-start 8s steps(1,end) 0s 1 normal both;animation:-amp-start 8s steps(1,end) 0s 1 normal both}@-webkit-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@-moz-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@-ms-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@-o-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}"}}),s.default.createElement("noscript",null,s.default.createElement("style",{"amp-boilerplate":"",dangerouslySetInnerHTML:{__html:"body{-webkit-animation:none;-moz-animation:none;-ms-animation:none;animation:none}"}})),s.default.createElement("script",{async:!0,src:"https://cdn.ampproject.org/v0.js"})),!r&&s.default.createElement(s.default.Fragment,null,!b&&i&&s.default.createElement("link",{rel:"amphtml",href:a+(t||`${c}${c.includes("?")?"&":"?"}amp=1`)}),this.getBeforeInteractiveInlineScripts(),!m&&this.getCssLinks(A),!m&&s.default.createElement("noscript",{"data-n-css":this.props.nonce??""}),!g&&!S&&this.getPreloadDynamicChunks(),!g&&!S&&this.getPreloadMainLinks(A),!f&&!g&&this.getPolyfillScripts(),!f&&!g&&this.getPreNextScripts(),!f&&!g&&this.getDynamicChunks(A),!f&&!g&&this.getScripts(A),m&&this.getCssLinks(A),m&&s.default.createElement("noscript",{"data-n-css":this.props.nonce??""}),this.context.isDevelopment&&s.default.createElement("noscript",{id:"__next_css__DO_NOT_USE__"}),e||null),s.default.createElement(s.default.Fragment,{},...u||[]))}};Head.contextType=d.HtmlContext;let NextScript=class NextScript extends s.default.Component{getDynamicChunks(e){return getDynamicChunks(this.context,this.props,e)}getPreNextScripts(){return getPreNextScripts(this.context,this.props)}getScripts(e){return getScripts(this.context,this.props,e)}getPolyfillScripts(){return getPolyfillScripts(this.context,this.props)}static getInlineScriptSource(e){let{__NEXT_DATA__:t,largePageDataBytes:r}=e;try{let i=JSON.stringify(t);if(f.has(t.page))return(0,u.htmlEscapeJsonString)(i);let o=Buffer.from(i).byteLength,a=n(80558).Z;return r&&o>r&&(f.add(t.page),console.warn(`Warning: data for page "${t.page}"${t.page===e.dangerousAsPath?"":` (path "${e.dangerousAsPath}")`} is ${a(o)} which exceeds the threshold of ${a(r)}, this amount of data can reduce performance.
6
- See more info here: https://nextjs.org/docs/messages/large-page-data`)),(0,u.htmlEscapeJsonString)(i)}catch(e){if((0,p.default)(e)&&-1!==e.message.indexOf("circular structure"))throw Error(`Circular structure in "getInitialProps" result of page "${t.page}". https://nextjs.org/docs/messages/circular-structure`);throw e}}render(){let{assetPrefix:e,inAmpMode:t,buildManifest:n,unstable_runtimeJS:r,docComponentsRendered:i,assetQueryString:o,disableOptimizedLoading:a,crossOrigin:l}=this.context,c=!1===r;if(i.NextScript=!0,t)return null;let u=getDocumentFiles(this.context.buildManifest,this.context.__NEXT_DATA__.page,t);return s.default.createElement(s.default.Fragment,null,!c&&n.devFiles?n.devFiles.map(t=>s.default.createElement("script",{key:t,src:`${e}/_next/${encodeURI(t)}${o}`,nonce:this.props.nonce,crossOrigin:this.props.crossOrigin||l})):null,c?null:s.default.createElement("script",{id:"__NEXT_DATA__",type:"application/json",nonce:this.props.nonce,crossOrigin:this.props.crossOrigin||l,dangerouslySetInnerHTML:{__html:NextScript.getInlineScriptSource(this.context)}}),a&&!c&&this.getPolyfillScripts(),a&&!c&&this.getPreNextScripts(),a&&!c&&this.getDynamicChunks(u),a&&!c&&this.getScripts(u))}};function Html(e){let{inAmpMode:t,docComponentsRendered:n,locale:r,scriptLoader:i,__NEXT_DATA__:o}=(0,d.useHtmlContext)();return n.Html=!0,function(e,t,n){var r,i,o,a;if(!n.children)return;let l=[],c=Array.isArray(n.children)?n.children:[n.children],u=null==(i=c.find(e=>e.type===Head))?void 0:null==(r=i.props)?void 0:r.children,p=null==(a=c.find(e=>"body"===e.type))?void 0:null==(o=a.props)?void 0:o.children,d=[...Array.isArray(u)?u:[u],...Array.isArray(p)?p:[p]];s.default.Children.forEach(d,t=>{var n;if(t&&(null==(n=t.type)?void 0:n.__nextScript)){if("beforeInteractive"===t.props.strategy){e.beforeInteractive=(e.beforeInteractive||[]).concat([_objectSpread({},t.props)]);return}if(["lazyOnload","afterInteractive","worker"].includes(t.props.strategy)){l.push(t.props);return}}}),t.scriptLoader=l}(i,o,e),s.default.createElement("html",_objectSpread(_objectSpread({},e),{},{lang:e.lang||r||void 0,amp:t?"":void 0,"data-ampdevmode":void 0}))}function Main(){let{docComponentsRendered:e}=(0,d.useHtmlContext)();return e.Main=!0,s.default.createElement("next-js-internal-body-render-target",null)}NextScript.contextType=d.HtmlContext;let Document=class Document extends s.default.Component{static getInitialProps(e){return e.defaultGetInitialProps(e)}render(){return s.default.createElement(Html,null,s.default.createElement(Head,null),s.default.createElement("body",null,s.default.createElement(Main,null),s.default.createElement(NextScript,null)))}};Document[l.NEXT_BUILTIN_DOCUMENT]=function(){return s.default.createElement(Html,null,s.default.createElement(Head,null),s.default.createElement("body",null,s.default.createElement(Main,null),s.default.createElement(NextScript,null)))}},81123:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{MODERN_BROWSERSLIST_TARGET:function(){return i.default},COMPILER_NAMES:function(){return o},INTERNAL_HEADERS:function(){return a},COMPILER_INDEXES:function(){return s},PHASE_EXPORT:function(){return l},PHASE_PRODUCTION_BUILD:function(){return c},PHASE_PRODUCTION_SERVER:function(){return u},PHASE_DEVELOPMENT_SERVER:function(){return p},PHASE_TEST:function(){return d},PHASE_INFO:function(){return f},PAGES_MANIFEST:function(){return m},APP_PATHS_MANIFEST:function(){return _},APP_PATH_ROUTES_MANIFEST:function(){return h},BUILD_MANIFEST:function(){return E},APP_BUILD_MANIFEST:function(){return g},FUNCTIONS_CONFIG_MANIFEST:function(){return S},SUBRESOURCE_INTEGRITY_MANIFEST:function(){return y},NEXT_FONT_MANIFEST:function(){return I},EXPORT_MARKER:function(){return T},EXPORT_DETAIL:function(){return P},PRERENDER_MANIFEST:function(){return b},ROUTES_MANIFEST:function(){return O},IMAGES_MANIFEST:function(){return A},SERVER_FILES_MANIFEST:function(){return v},DEV_CLIENT_PAGES_MANIFEST:function(){return N},MIDDLEWARE_MANIFEST:function(){return x},DEV_MIDDLEWARE_MANIFEST:function(){return R},REACT_LOADABLE_MANIFEST:function(){return M},FONT_MANIFEST:function(){return L},SERVER_DIRECTORY:function(){return j},CONFIG_FILES:function(){return D},BUILD_ID_FILE:function(){return C},BLOCKED_PAGES:function(){return F},CLIENT_PUBLIC_FILES_PATH:function(){return k},CLIENT_STATIC_FILES_PATH:function(){return w},STRING_LITERAL_DROP_BUNDLE:function(){return U},NEXT_BUILTIN_DOCUMENT:function(){return H},BARREL_OPTIMIZATION_PREFIX:function(){return B},CLIENT_REFERENCE_MANIFEST:function(){return $},SERVER_REFERENCE_MANIFEST:function(){return W},MIDDLEWARE_BUILD_MANIFEST:function(){return G},MIDDLEWARE_REACT_LOADABLE_MANIFEST:function(){return z},CLIENT_STATIC_FILES_RUNTIME_MAIN:function(){return X},CLIENT_STATIC_FILES_RUNTIME_MAIN_APP:function(){return V},APP_CLIENT_INTERNALS:function(){return Y},CLIENT_STATIC_FILES_RUNTIME_REACT_REFRESH:function(){return K},CLIENT_STATIC_FILES_RUNTIME_AMP:function(){return q},CLIENT_STATIC_FILES_RUNTIME_WEBPACK:function(){return J},CLIENT_STATIC_FILES_RUNTIME_POLYFILLS:function(){return Z},CLIENT_STATIC_FILES_RUNTIME_POLYFILLS_SYMBOL:function(){return Q},EDGE_RUNTIME_WEBPACK:function(){return ee},TEMPORARY_REDIRECT_STATUS:function(){return et},PERMANENT_REDIRECT_STATUS:function(){return en},STATIC_PROPS_ID:function(){return er},SERVER_PROPS_ID:function(){return ei},PAGE_SEGMENT_KEY:function(){return eo},GOOGLE_FONT_PROVIDER:function(){return ea},OPTIMIZED_FONT_PROVIDERS:function(){return es},DEFAULT_SERIF_FONT:function(){return el},DEFAULT_SANS_SERIF_FONT:function(){return ec},STATIC_STATUS_PAGES:function(){return eu},TRACE_OUTPUT_VERSION:function(){return ep},TURBO_TRACE_DEFAULT_MEMORY_LIMIT:function(){return ed},RSC_MODULE_TYPES:function(){return ef},EDGE_UNSUPPORTED_NODE_APIS:function(){return em},SYSTEM_ENTRYPOINTS:function(){return e_}});let r=n(55248),i=r._(n(61672)),o={client:"client",server:"server",edgeServer:"edge-server"},a=["x-invoke-path","x-invoke-status","x-invoke-error","x-invoke-query","x-middleware-invoke"],s={[o.client]:0,[o.server]:1,[o.edgeServer]:2},l="phase-export",c="phase-production-build",u="phase-production-server",p="phase-development-server",d="phase-test",f="phase-info",m="pages-manifest.json",_="app-paths-manifest.json",h="app-path-routes-manifest.json",E="build-manifest.json",g="app-build-manifest.json",S="functions-config-manifest.json",y="subresource-integrity-manifest",I="next-font-manifest",T="export-marker.json",P="export-detail.json",b="prerender-manifest.json",O="routes-manifest.json",A="images-manifest.json",v="required-server-files.json",N="_devPagesManifest.json",x="middleware-manifest.json",R="_devMiddlewareManifest.json",M="react-loadable-manifest.json",L="font-manifest.json",j="server",D=["next.config.js","next.config.mjs"],C="BUILD_ID",F=["/_document","/_app","/_error"],k="public",w="static",U="__NEXT_DROP_CLIENT_FILE__",H="__NEXT_BUILTIN_DOCUMENT__",B="__barrel_optimize__",$="client-reference-manifest",W="server-reference-manifest",G="middleware-build-manifest",z="middleware-react-loadable-manifest",X="main",V=""+X+"-app",Y="app-pages-internals",K="react-refresh",q="amp",J="webpack",Z="polyfills",Q=Symbol(Z),ee="edge-runtime-webpack",et=307,en=308,er="__N_SSG",ei="__N_SSP",eo="__PAGE__",ea="https://fonts.googleapis.com/",es=[{url:ea,preconnect:"https://fonts.gstatic.com"},{url:"https://use.typekit.net",preconnect:"https://use.typekit.net"}],el={name:"Times New Roman",xAvgCharWidth:821,azAvgWidth:854.3953488372093,unitsPerEm:2048},ec={name:"Arial",xAvgCharWidth:904,azAvgWidth:934.5116279069767,unitsPerEm:2048},eu=["/500"],ep=1,ed=6e3,ef={client:"client",server:"server"},em=["clearImmediate","setImmediate","BroadcastChannel","ByteLengthQueuingStrategy","CompressionStream","CountQueuingStrategy","DecompressionStream","DomException","MessageChannel","MessageEvent","MessagePort","ReadableByteStreamController","ReadableStreamBYOBRequest","ReadableStreamDefaultController","TransformStreamDefaultController","WritableStreamDefaultController"],e_=new Set([X,K,q,V]);("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},61672:e=>{"use strict";e.exports=["chrome 64","edge 79","firefox 67","opera 51","safari 12"]},99399:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"normalizePagePath",{enumerable:!0,get:function(){return normalizePagePath}});let r=n(4664),i=n(49207),o=n(95422);function normalizePagePath(e){let t=/^\/index(\/|$)/.test(e)&&!(0,i.isDynamicRoute)(e)?"/index"+e:"/"===e?"/index":(0,r.ensureLeadingSlash)(e);{let{posix:e}=n(71017),r=e.normalize(t);if(r!==t)throw new o.NormalizeError("Requested and resolved page mismatch: "+t+" "+r)}return t}},80558:(e,t)=>{"use strict";Object.defineProperty(t,"Z",{enumerable:!0,get:function(){return prettyBytes}});let n=["B","kB","MB","GB","TB","PB","EB","ZB","YB"],toLocaleString=(e,t)=>{let n=e;return"string"==typeof t?n=e.toLocaleString(t):!0===t&&(n=e.toLocaleString()),n};function prettyBytes(e,t){if(!Number.isFinite(e))throw TypeError(`Expected a finite number, got ${typeof e}: ${e}`);if((t=Object.assign({},t)).signed&&0===e)return" 0 B";let r=e<0,i=r?"-":t.signed?"+":"";if(r&&(e=-e),e<1){let n=toLocaleString(e,t.locale);return i+n+" B"}let o=Math.min(Math.floor(Math.log10(e)/3),n.length-1);e=Number((e/Math.pow(1e3,o)).toPrecision(3));let a=toLocaleString(e,t.locale),s=n[o];return i+a+" "+s}},75870:(e,t,n)=>{"use strict";e.exports=n(9339).vendored.contexts.HtmlContext},67212:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"getPageFiles",{enumerable:!0,get:function(){return getPageFiles}});let r=n(5333),i=n(99399);function getPageFiles(e,t){let n=(0,r.denormalizePagePath)((0,i.normalizePagePath)(t));return e.pages[n]||(console.warn(`Could not find files for ${n} in .next/build-manifest.json`),[])}},81453:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{ESCAPE_REGEX:function(){return r},htmlEscapeJsonString:function(){return htmlEscapeJsonString}});let n={"&":"\\u0026",">":"\\u003e","<":"\\u003c","\u2028":"\\u2028","\u2029":"\\u2029"},r=/[&><\u2028\u2029]/g;function htmlEscapeJsonString(e){return e.replace(r,e=>n[e])}},77252:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{isBlockedPage:function(){return isBlockedPage},cleanAmpPath:function(){return cleanAmpPath},debounce:function(){return debounce}});let r=n(81123);function isBlockedPage(e){return r.BLOCKED_PAGES.includes(e)}function cleanAmpPath(e){return e.match(/\?amp=(y|yes|true|1)/)&&(e=e.replace(/\?amp=(y|yes|true|1)&?/,"?")),e.match(/&amp=(y|yes|true|1)/)&&(e=e.replace(/&amp=(y|yes|true|1)/,"")),e=e.replace(/\?$/,"")}function debounce(e,t,n=1/0){let r,i,o;let a=0,s=0;function run(){let l=Date.now(),c=s+t-l;c<=0||a+n>=l?(r=void 0,e.apply(o,i)):r=setTimeout(run,c)}return function(...e){i=e,o=this,s=Date.now(),void 0===r&&(a=s,r=setTimeout(run,t))}}},77986:(e,t,n)=>{e.exports=n(30033)}};
@@ -1 +0,0 @@
1
- "use strict";exports.id=3779,exports.ids=[3779],exports.modules={42256:(e,t,a)=>{a.d(t,{Z:()=>n});var r=a(16689),l=a.n(r);let i=(0,r.forwardRef)(function({testId:e="fs-input",...t},a){return l().createElement("input",{ref:a,"data-fs-input":!0,"data-testid":e,...t})}),n=i},93779:(e,t,a)=>{a.d(t,{Z:()=>__WEBPACK_DEFAULT_EXPORT__});var r=a(16689),l=a.n(r),i=a(42256),n=a(31953),d=a(37041),s=a(2614),c=a(83339);let __WEBPACK_DEFAULT_EXPORT__=({id:e,label:t,type:a="text",error:r,displayClearButton:f,actionable:p,buttonActionText:u="Apply",onSubmit:o,onClear:m,placeholder:E=" ",inputRef:_,disabled:Z,value:C,testId:v="fs-input-field",...A})=>{let x=!Z&&r&&""!==r,F=p&&!Z&&""!==C;return l().createElement("div",{"data-fs-input-field":!0,"data-fs-input-field-actionable":p,"data-fs-input-field-error":r&&""!==r,"data-testid":v},l().createElement(i.Z,{id:e,type:a,value:C,ref:_,disabled:Z,placeholder:E,...A}),l().createElement(n.Z,{htmlFor:e},t),F&&(f||r?l().createElement(d.Z,{size:"small","aria-label":"Clear Field",icon:l().createElement(s.Z,{name:"XCircle"}),onClick:()=>{m?.(),_?.current?.focus()}}):l().createElement(c.Z,{variant:"tertiary",size:"small",onClick:o},u)),x&&l().createElement("span",{"data-fs-input-field-error-message":!0},r))}}};