@faststore/core 3.0.155 → 3.0.158
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 +25 -25
- package/.next/cache/.tsbuildinfo +1 -1
- package/.next/cache/config.json +3 -3
- package/.next/cache/eslint/.cache_1gneedd +1 -1
- package/.next/cache/webpack/client-production/0.pack +0 -0
- package/.next/cache/webpack/client-production/index.pack +0 -0
- package/.next/cache/webpack/server-production/0.pack +0 -0
- package/.next/cache/webpack/server-production/index.pack +0 -0
- package/.next/next-minimal-server.js.nft.json +1 -1
- package/.next/next-server.js.nft.json +1 -1
- package/.next/prerender-manifest.js +1 -1
- package/.next/prerender-manifest.json +1 -1
- package/.next/react-loadable-manifest.json +13 -7
- package/.next/routes-manifest.json +1 -1
- package/.next/server/chunks/3202.js +1 -1
- package/.next/server/chunks/5484.js +1 -1
- package/.next/server/chunks/5754.js +2 -2
- package/.next/server/chunks/7917.js +1 -1
- package/.next/server/chunks/8419.js +1 -1
- package/.next/server/chunks/9572.js +2 -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/graphql.js +1 -1
- package/.next/server/pages/en-US/404.html +1 -1
- package/.next/server/pages/en-US/500.html +1 -1
- package/.next/server/pages/en-US/account.html +1 -1
- package/.next/server/pages/en-US/checkout.html +1 -1
- package/.next/server/pages/en-US/login.html +1 -1
- package/.next/server/pages/en-US/s.html +1 -1
- package/.next/server/pages/en-US.html +1 -1
- package/.next/static/chunks/1550-48e8637718c2dd74.js +1 -0
- package/.next/static/chunks/{3202.2bdeba847ce9ecd4.js → 3202.d7d5a83625bed7aa.js} +1 -1
- package/.next/static/chunks/3523.7b396bcd952800b9.js +1 -0
- package/.next/static/chunks/{5484.50796e8843ec9dad.js → 5484.4fe23adb8755a0dd.js} +1 -1
- package/.next/static/chunks/{6999-7b2e114edc42cc1c.js → 6999-911baa50692c1b5c.js} +1 -1
- package/.next/static/chunks/{ProductShelf.44b90c6f4e1c13d6.js → ProductShelf.0493dbf6e9982f10.js} +1 -1
- package/.next/static/chunks/{ProductTiles.b3c7bd3a52226529.js → ProductTiles.aa45bacca6c0044d.js} +1 -1
- package/.next/static/chunks/pages/[slug]/{p-eee2b539c749f442.js → p-9f8337097f0e7258.js} +1 -1
- package/.next/static/chunks/{webpack-909c48392196dcdf.js → webpack-9c6d1ba53f8caf2c.js} +1 -1
- package/.next/static/{S8L_8hrpu7sErrztJSYCX → gxJyuR6uuwUtbNvozKfXD}/_buildManifest.js +1 -1
- package/.next/trace +97 -97
- package/.turbo/turbo-build.log +4 -4
- package/.turbo/turbo-lint.log +1 -1
- package/.turbo/turbo-test.log +5 -5
- package/@generated/gql.ts +4 -4
- package/@generated/graphql.ts +4 -1
- package/@generated/persisted-documents.json +1 -1
- package/@generated/schema.graphql +2 -0
- package/cms/faststore/sections.json +406 -109
- package/package.json +3 -3
- package/src/components/search/SearchDropdown/SearchDropdown.tsx +27 -6
- package/src/components/search/SearchDropdown/index.ts +1 -0
- package/src/components/search/SearchProductItem/SearchProductItem.tsx +7 -0
- package/src/customizations/src/fragments/ClientManyProducts.ts +2 -0
- package/src/sdk/analytics/platform/vtex/search.ts +21 -0
- package/src/sdk/analytics/types.ts +12 -0
- package/src/sdk/product/useLocalizedVariables.ts +12 -1
- package/src/sdk/product/usePageProductsQuery.ts +2 -0
- package/src/sdk/product/useProductsPrefetch.ts +3 -1
- package/src/sdk/product/useProductsQuery.ts +2 -0
- package/.next/static/chunks/1550-f05e702b3204bd0a.js +0 -1
- package/.next/static/chunks/3523.9c4d94172a1336ac.js +0 -1
- /package/.next/static/{S8L_8hrpu7sErrztJSYCX → gxJyuR6uuwUtbNvozKfXD}/_ssgManifest.js +0 -0
package/.turbo/turbo-build.log
CHANGED
|
@@ -38,8 +38,8 @@ https://nextjs.org/telemetry
|
|
|
38
38
|
Collecting page data ...
|
|
39
39
|
Generating static pages (0/7) ...
|
|
40
40
|
|
|
41
41
|
Generating static pages (1/7)
|
|
42
|
-
|
|
43
42
|
Generating static pages (3/7)
|
|
44
43
|
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.
|
|
44
|
+
|
|
45
45
|
Generating static pages (3/7)
|
|
46
46
|
|
|
47
47
|
Generating static pages (5/7)
|
|
48
48
|
|
|
49
49
|
✓ Generating static pages (7/7)
|
|
50
50
|
Finalizing page optimization ...
|
|
@@ -50,7 +50,7 @@ Route (pages) Size First Load JS
|
|
|
50
50
|
├ └ css/b1806cbafd0c1f81.css 3.06 kB
|
|
51
51
|
├ /_app 0 B 91.7 kB
|
|
52
52
|
├ ● /[...slug] 2 kB 137 kB
|
|
53
|
-
├ ● /[slug]/p 30.
|
|
53
|
+
├ ● /[slug]/p 30.3 kB 148 kB
|
|
54
54
|
├ ├ css/bd9313ce4313a00a.css 11.1 kB
|
|
55
55
|
├ └ css/9718991cd57978e9.css 14.8 kB
|
|
56
56
|
├ ○ /404 1.46 kB 120 kB
|
|
@@ -67,11 +67,11 @@ Route (pages) Size First Load JS
|
|
|
67
67
|
├ chunks/framework-12a146e94cfcf7c4.js 45.4 kB
|
|
68
68
|
├ chunks/main-209ac4974b020af1.js 33.1 kB
|
|
69
69
|
├ chunks/pages/_app-e419b2062065ccf0.js 9.87 kB
|
|
70
|
-
├ chunks/webpack-
|
|
70
|
+
├ chunks/webpack-9c6d1ba53f8caf2c.js 3.36 kB
|
|
71
71
|
└ css/ee0556daedda6306.css 3.07 kB
|
|
72
72
|
|
|
73
73
|
λ (Server) server-side renders at runtime (uses getInitialProps or getServerSideProps)
|
|
74
74
|
○ (Static) automatically rendered as static HTML (uses no initial props)
|
|
75
75
|
● (SSG) automatically generated as static HTML + JSON (uses getStaticProps)
|
|
76
76
|
|
|
77
|
-
Done in 69.
|
|
77
|
+
Done in 69.94s.
|
package/.turbo/turbo-lint.log
CHANGED
package/.turbo/turbo-test.log
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
yarn run v1.22.22
|
|
2
2
|
$ jest
|
|
3
|
-
PASS test/server/cms/index.test.ts (34.
|
|
4
|
-
PASS test/utils/multipleTemplates.test.ts (34.
|
|
5
|
-
PASS test/server/index.test.ts (
|
|
3
|
+
PASS test/server/cms/index.test.ts (34.175 s)
|
|
4
|
+
PASS test/utils/multipleTemplates.test.ts (34.375 s)
|
|
5
|
+
PASS test/server/index.test.ts (37.644 s)
|
|
6
6
|
|
|
7
7
|
Test Suites: 3 passed, 3 total
|
|
8
8
|
Tests: 19 passed, 19 total
|
|
9
9
|
Snapshots: 0 total
|
|
10
|
-
Time:
|
|
10
|
+
Time: 38.767 s
|
|
11
11
|
Ran all test suites.
|
|
12
|
-
Done in 40.
|
|
12
|
+
Done in 40.04s.
|
package/@generated/gql.ts
CHANGED
|
@@ -18,7 +18,7 @@ const documents = {
|
|
|
18
18
|
types.Filter_FacetsFragmentDoc,
|
|
19
19
|
'\n fragment ProductDetailsFragment_product on StoreProduct {\n id: productID\n sku\n name\n gtin\n description\n unitMultiplier\n isVariantOf {\n name\n productGroupID\n skuVariants {\n activeVariations\n slugsMap\n availableVariations\n }\n }\n\n image {\n url\n alternateName\n }\n\n brand {\n name\n }\n\n offers {\n lowPrice\n lowPriceWithTaxes\n offers {\n availability\n price\n priceWithTaxes\n listPrice\n listPriceWithTaxes\n seller {\n identifier\n }\n }\n }\n\n additionalProperty {\n propertyID\n name\n value\n valueReference\n }\n\n # Contains necessary info to add this item to cart\n ...CartProductItem\n }\n':
|
|
20
20
|
types.ProductDetailsFragment_ProductFragmentDoc,
|
|
21
|
-
'\n fragment ClientManyProducts on Query {\n search(\n first: $first\n after: $after\n sort: $sort\n term: $term\n selectedFacets: $selectedFacets\n ) {\n products {\n pageInfo {\n totalCount\n }\n }\n }\n }\n':
|
|
21
|
+
'\n fragment ClientManyProducts on Query {\n search(\n first: $first\n after: $after\n sort: $sort\n term: $term\n selectedFacets: $selectedFacets\n sponsoredCount: $sponsoredCount\n\n ) {\n products {\n pageInfo {\n totalCount\n }\n }\n }\n }\n':
|
|
22
22
|
types.ClientManyProductsFragmentDoc,
|
|
23
23
|
'\n fragment ClientProduct on Query {\n product(locator: $locator) {\n id: productID\n }\n }\n':
|
|
24
24
|
types.ClientProductFragmentDoc,
|
|
@@ -42,7 +42,7 @@ const documents = {
|
|
|
42
42
|
types.ValidateCartMutationDocument,
|
|
43
43
|
'\n mutation SubscribeToNewsletter($data: IPersonNewsletter!) {\n subscribeToNewsletter(data: $data) {\n id\n }\n }\n':
|
|
44
44
|
types.SubscribeToNewsletterDocument,
|
|
45
|
-
'\n query ClientManyProductsQuery(\n $first: Int!\n $after: String\n $sort: StoreSort!\n $term: String!\n $selectedFacets: [IStoreSelectedFacet!]!\n ) {\n ...ClientManyProducts\n search(\n first: $first\n after: $after\n sort: $sort\n term: $term\n selectedFacets: $selectedFacets\n ) {\n products {\n pageInfo {\n totalCount\n }\n edges {\n node {\n ...ProductSummary_product\n }\n }\n }\n }\n }\n':
|
|
45
|
+
'\n query ClientManyProductsQuery(\n $first: Int!\n $after: String\n $sort: StoreSort!\n $term: String!\n $selectedFacets: [IStoreSelectedFacet!]!\n $sponsoredCount: Int\n ) {\n ...ClientManyProducts\n search(\n first: $first\n after: $after\n sort: $sort\n term: $term\n selectedFacets: $selectedFacets\n sponsoredCount: $sponsoredCount\n ) {\n products {\n pageInfo {\n totalCount\n }\n edges {\n node {\n ...ProductSummary_product\n }\n }\n }\n }\n }\n':
|
|
46
46
|
types.ClientManyProductsQueryDocument,
|
|
47
47
|
'\n query ClientProductGalleryQuery(\n $first: Int!\n $after: String!\n $sort: StoreSort!\n $term: String!\n $selectedFacets: [IStoreSelectedFacet!]!\n ) {\n ...ClientProductGallery\n redirect(term: $term, selectedFacets: $selectedFacets) {\n url\n }\n search(\n first: $first\n after: $after\n sort: $sort\n term: $term\n selectedFacets: $selectedFacets\n ) {\n products {\n pageInfo {\n totalCount\n }\n }\n facets {\n ...Filter_facets\n }\n metadata {\n ...SearchEvent_metadata\n }\n }\n }\n\n fragment SearchEvent_metadata on SearchMetadata {\n isTermMisspelled\n logicalOperator\n fuzzy\n }\n':
|
|
48
48
|
types.ClientProductGalleryQueryDocument,
|
|
@@ -80,7 +80,7 @@ export function gql(
|
|
|
80
80
|
* The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
|
|
81
81
|
*/
|
|
82
82
|
export function gql(
|
|
83
|
-
source: '\n fragment ClientManyProducts on Query {\n search(\n first: $first\n after: $after\n sort: $sort\n term: $term\n selectedFacets: $selectedFacets\n ) {\n products {\n pageInfo {\n totalCount\n }\n }\n }\n }\n'
|
|
83
|
+
source: '\n fragment ClientManyProducts on Query {\n search(\n first: $first\n after: $after\n sort: $sort\n term: $term\n selectedFacets: $selectedFacets\n sponsoredCount: $sponsoredCount\n\n ) {\n products {\n pageInfo {\n totalCount\n }\n }\n }\n }\n'
|
|
84
84
|
): typeof import('./graphql').ClientManyProductsFragmentDoc
|
|
85
85
|
/**
|
|
86
86
|
* The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
|
|
@@ -152,7 +152,7 @@ export function gql(
|
|
|
152
152
|
* The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
|
|
153
153
|
*/
|
|
154
154
|
export function gql(
|
|
155
|
-
source: '\n query ClientManyProductsQuery(\n $first: Int!\n $after: String\n $sort: StoreSort!\n $term: String!\n $selectedFacets: [IStoreSelectedFacet!]!\n ) {\n ...ClientManyProducts\n search(\n first: $first\n after: $after\n sort: $sort\n term: $term\n selectedFacets: $selectedFacets\n ) {\n products {\n pageInfo {\n totalCount\n }\n edges {\n node {\n ...ProductSummary_product\n }\n }\n }\n }\n }\n'
|
|
155
|
+
source: '\n query ClientManyProductsQuery(\n $first: Int!\n $after: String\n $sort: StoreSort!\n $term: String!\n $selectedFacets: [IStoreSelectedFacet!]!\n $sponsoredCount: Int\n ) {\n ...ClientManyProducts\n search(\n first: $first\n after: $after\n sort: $sort\n term: $term\n selectedFacets: $selectedFacets\n sponsoredCount: $sponsoredCount\n ) {\n products {\n pageInfo {\n totalCount\n }\n edges {\n node {\n ...ProductSummary_product\n }\n }\n }\n }\n }\n'
|
|
156
156
|
): typeof import('./graphql').ClientManyProductsQueryDocument
|
|
157
157
|
/**
|
|
158
158
|
* The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
|
package/@generated/graphql.ts
CHANGED
|
@@ -505,6 +505,7 @@ export type QuerySearchArgs = {
|
|
|
505
505
|
first: Scalars['Int']['input']
|
|
506
506
|
selectedFacets: InputMaybe<Array<IStoreSelectedFacet>>
|
|
507
507
|
sort?: InputMaybe<StoreSort>
|
|
508
|
+
sponsoredCount: InputMaybe<Scalars['Int']['input']>
|
|
508
509
|
term?: InputMaybe<Scalars['String']['input']>
|
|
509
510
|
}
|
|
510
511
|
|
|
@@ -1433,6 +1434,7 @@ export type ClientManyProductsQueryQueryVariables = Exact<{
|
|
|
1433
1434
|
sort: StoreSort
|
|
1434
1435
|
term: Scalars['String']['input']
|
|
1435
1436
|
selectedFacets: Array<IStoreSelectedFacet> | IStoreSelectedFacet
|
|
1437
|
+
sponsoredCount: InputMaybe<Scalars['Int']['input']>
|
|
1436
1438
|
}>
|
|
1437
1439
|
|
|
1438
1440
|
export type ClientManyProductsQueryQuery = {
|
|
@@ -1898,6 +1900,7 @@ export const ClientManyProductsFragmentDoc = new TypedDocumentString(
|
|
|
1898
1900
|
sort: $sort
|
|
1899
1901
|
term: $term
|
|
1900
1902
|
selectedFacets: $selectedFacets
|
|
1903
|
+
sponsoredCount: $sponsoredCount
|
|
1901
1904
|
) {
|
|
1902
1905
|
products {
|
|
1903
1906
|
pageInfo {
|
|
@@ -2102,7 +2105,7 @@ export const SubscribeToNewsletterDocument = {
|
|
|
2102
2105
|
export const ClientManyProductsQueryDocument = {
|
|
2103
2106
|
__meta__: {
|
|
2104
2107
|
operationName: 'ClientManyProductsQuery',
|
|
2105
|
-
operationHash: '
|
|
2108
|
+
operationHash: '14148671fbf53498fad5c600ee87765920145019',
|
|
2106
2109
|
},
|
|
2107
2110
|
} as unknown as TypedDocumentString<
|
|
2108
2111
|
ClientManyProductsQueryQuery,
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"46103bee661405bde706d72126fdbf9b0a0c9e6e": "fragment CartProductItem on StoreProduct { additionalProperty { name propertyID value valueReference } brand { name } gtin image { alternateName url } isVariantOf { name productGroupID skuVariants { activeVariations availableVariations slugsMap } } name sku unitMultiplier } fragment ProductDetailsFragment_product on StoreProduct { additionalProperty { name propertyID value valueReference } brand { name } description gtin image { alternateName url } isVariantOf { name productGroupID skuVariants { activeVariations availableVariations slugsMap } } name offers { lowPrice lowPriceWithTaxes offers { availability listPrice listPriceWithTaxes price priceWithTaxes seller { identifier } } } id: productID sku unitMultiplier ...CartProductItem } fragment ServerProduct on Query { product(locator: $locator) { id: productID } } query ServerProductQuery($locator: [IStoreSelectedFacet!]!) { product(locator: $locator) { brand { name } breadcrumbList { itemListElement { item name position } } description gtin image { alternateName url } isVariantOf { productGroupID } name offers { highPrice lowPrice lowPriceWithTaxes offers { availability itemCondition price priceCurrency priceValidUntil seller { identifier } } priceCurrency } id: productID releaseDate seo { canonical description title } sku ...ProductDetailsFragment_product } ...ServerProduct }",
|
|
4
4
|
"c2b3f8bff73ebf6ac79d758c66cabbc21ba9fcc0": "fragment CartItem on StoreOffer { itemOffered { ...CartProductItem } listPrice listPriceWithTaxes price priceWithTaxes quantity seller { identifier } } fragment CartMessage on StoreCartMessage { status text } fragment CartProductItem on StoreProduct { additionalProperty { name propertyID value valueReference } brand { name } gtin image { alternateName url } isVariantOf { name productGroupID skuVariants { activeVariations availableVariations slugsMap } } name sku unitMultiplier } mutation ValidateCartMutation($cart: IStoreCart!, $session: IStoreSession!) { validateCart(cart: $cart, session: $session) { messages { ...CartMessage } order { acceptedOffer { ...CartItem } orderNumber shouldSplitItem } } }",
|
|
5
5
|
"feb7005103a859e2bc8cf2360d568806fd88deba": "mutation SubscribeToNewsletter($data: IPersonNewsletter!) { subscribeToNewsletter(data: $data) { id } }",
|
|
6
|
-
"
|
|
6
|
+
"14148671fbf53498fad5c600ee87765920145019": "fragment ClientManyProducts on Query { search( first: $first after: $after sort: $sort term: $term selectedFacets: $selectedFacets sponsoredCount: $sponsoredCount ) { products { pageInfo { totalCount } } } } fragment ProductSummary_product on StoreProduct { additionalProperty { name propertyID value valueReference } advertisement { adId adResponseId } brand { brandName: name } brand { name } gtin image { alternateName url } isVariantOf { name productGroupID } name offers { lowPrice lowPriceWithTaxes offers { availability listPrice listPriceWithTaxes price quantity seller { identifier } } } id: productID sku slug } query ClientManyProductsQuery($after: String, $first: Int!, $selectedFacets: [IStoreSelectedFacet!]!, $sort: StoreSort!, $sponsoredCount: Int, $term: String!) { search( first: $first after: $after sort: $sort term: $term selectedFacets: $selectedFacets sponsoredCount: $sponsoredCount ) { products { edges { node { ...ProductSummary_product } } pageInfo { totalCount } } } ...ClientManyProducts }",
|
|
7
7
|
"bfc40da32b60f9404a4adb96b0856e3fbb04b076": "fragment ClientProductGallery on Query { search( first: $first after: $after sort: $sort term: $term selectedFacets: $selectedFacets ) { products { pageInfo { totalCount } } } } fragment Filter_facets on StoreFacet { ... on StoreFacetBoolean { __typename key label values { label quantity selected value } } ... on StoreFacetRange { __typename key label max { absolute selected } min { absolute selected } } } fragment SearchEvent_metadata on SearchMetadata { fuzzy isTermMisspelled logicalOperator } query ClientProductGalleryQuery($after: String!, $first: Int!, $selectedFacets: [IStoreSelectedFacet!]!, $sort: StoreSort!, $term: String!) { redirect(term: $term, selectedFacets: $selectedFacets) { url } search( first: $first after: $after sort: $sort term: $term selectedFacets: $selectedFacets ) { facets { ...Filter_facets } metadata { ...SearchEvent_metadata } products { pageInfo { totalCount } } } ...ClientProductGallery }",
|
|
8
8
|
"7d121ef8d4dc99174e64e4429a9b977b8bbebed8": "fragment CartProductItem on StoreProduct { additionalProperty { name propertyID value valueReference } brand { name } gtin image { alternateName url } isVariantOf { name productGroupID skuVariants { activeVariations availableVariations slugsMap } } name sku unitMultiplier } fragment ClientProduct on Query { product(locator: $locator) { id: productID } } fragment ProductDetailsFragment_product on StoreProduct { additionalProperty { name propertyID value valueReference } brand { name } description gtin image { alternateName url } isVariantOf { name productGroupID skuVariants { activeVariations availableVariations slugsMap } } name offers { lowPrice lowPriceWithTaxes offers { availability listPrice listPriceWithTaxes price priceWithTaxes seller { identifier } } } id: productID sku unitMultiplier ...CartProductItem } query ClientProductQuery($locator: [IStoreSelectedFacet!]!) { product(locator: $locator) { ...ProductDetailsFragment_product } ...ClientProduct }",
|
|
9
9
|
"47e48eaee91d16a4237eb2c1241bc2ed3e2ad9bb": "fragment ClientSearchSuggestions on Query { search(first: 5, term: $term, selectedFacets: $selectedFacets) { suggestions { terms { value } } } } fragment ProductSummary_product on StoreProduct { additionalProperty { name propertyID value valueReference } advertisement { adId adResponseId } brand { brandName: name } brand { name } gtin image { alternateName url } isVariantOf { name productGroupID } name offers { lowPrice lowPriceWithTaxes offers { availability listPrice listPriceWithTaxes price quantity seller { identifier } } } id: productID sku slug } fragment SearchEvent_metadata on SearchMetadata { fuzzy isTermMisspelled logicalOperator } query ClientSearchSuggestionsQuery($selectedFacets: [IStoreSelectedFacet!], $term: String!) { search(first: 5, term: $term, selectedFacets: $selectedFacets) { metadata { ...SearchEvent_metadata } products { pageInfo { totalCount } } suggestions { products { ...ProductSummary_product } terms { value } } } ...ClientSearchSuggestions }",
|
|
@@ -591,6 +591,8 @@ type Query {
|
|
|
591
591
|
term: String = ""
|
|
592
592
|
"""Array of selected search facets."""
|
|
593
593
|
selectedFacets: [IStoreSelectedFacet!]
|
|
594
|
+
"""Search advertisement products return in result."""
|
|
595
|
+
sponsoredCount: Int
|
|
594
596
|
): StoreSearchResult! @cacheControl(scope: "public", sMaxAge: 120, staleWhileRevalidate: 3600)
|
|
595
597
|
"""Returns information about all products."""
|
|
596
598
|
allProducts(
|