|
1 | 1 | const fs = require('fs'); |
2 | 2 | const path = require('path'); |
3 | 3 | const Handlebars = require('handlebars'); |
4 | | -const { findDescription, prepareBaseTemplate, getPrimaryImage, generatePriceString, getImageList } = require('./lib'); |
| 4 | +const { findDescription, prepareBaseTemplate, getPrimaryImage, generatePriceString, getImageList, sanitize } = require('./lib'); |
5 | 5 | const { generateLdJson } = require('./ldJson'); |
6 | 6 | const { requestSaaS, getProductUrl } = require('../utils'); |
7 | 7 | const { ProductQuery, ProductByUrlKeyQuery } = require('../queries'); |
8 | 8 |
|
9 | 9 | const productTemplateCache = {}; |
| 10 | +// according to https://www.aem.live/developer/markup-reference |
10 | 11 |
|
11 | 12 | function toTemplateProductData(baseProduct) { |
12 | | - const templateProductData = { ...baseProduct }; |
13 | 13 | const primaryImage = getPrimaryImage(baseProduct)?.url; |
14 | 14 |
|
15 | | - templateProductData.hasImages = baseProduct.images?.length > 0; |
16 | | - templateProductData.imageList = getImageList(primaryImage, baseProduct.images); |
17 | | - templateProductData.priceString = generatePriceString(baseProduct); |
18 | | - templateProductData.metaDescription = findDescription(baseProduct); |
19 | | - templateProductData.metaImage = primaryImage; |
20 | | - templateProductData.primaryImage = primaryImage; |
21 | | - templateProductData.metaTitle = baseProduct.metaTitle || baseProduct.name || 'Product Details'; |
22 | | - |
23 | | - return templateProductData; |
| 15 | + return { |
| 16 | + name: sanitize(baseProduct.name, 'inline'), |
| 17 | + description: sanitize(baseProduct.description, 'all'), |
| 18 | + externalId: sanitize(baseProduct.externalId, 'no'), |
| 19 | + sku: sanitize(baseProduct.sku, 'no'), |
| 20 | + __typename: sanitize(baseProduct.__typename, 'no'), |
| 21 | + metaDescription: findDescription(baseProduct), |
| 22 | + metaKeyword: sanitize(baseProduct.metaKeyword, 'no'), |
| 23 | + metaTitle: sanitize(baseProduct.metaTitle, 'no') || sanitize(baseProduct.name, 'no') || 'Product Details', |
| 24 | + metaImage: primaryImage, |
| 25 | + primaryImage: primaryImage, |
| 26 | + options: baseProduct.options ? [...baseProduct.options] : null, |
| 27 | + hasImages: baseProduct.images?.length > 0, |
| 28 | + imageList: getImageList(primaryImage, baseProduct.images), |
| 29 | + priceString: generatePriceString(baseProduct), |
| 30 | + }; |
24 | 31 | } |
25 | 32 |
|
26 | 33 | async function generateProductHtml(sku, urlKey, context) { |
@@ -55,12 +62,17 @@ async function generateProductHtml(sku, urlKey, context) { |
55 | 62 | const baseUrl = getProductUrl(baseProduct, context); |
56 | 63 | if (Array.isArray(option.values)) { |
57 | 64 | option.values = option.values.map((value) => ({ |
58 | | - ...value, |
| 65 | + title: sanitize(value.title, 'inline'), |
59 | 66 | url: baseUrl.toLowerCase() + '?optionsUIDs=' + value.id, |
60 | 67 | })); |
61 | 68 | option.values.sort((a, b) => a.title.localeCompare(b.title)); |
62 | 69 | } |
63 | | - return option; |
| 70 | + return { |
| 71 | + title: sanitize(option.title, 'inline'), |
| 72 | + id: sanitize(option.id, 'no'), |
| 73 | + required: sanitize(option.required, 'no'), |
| 74 | + values: option.values |
| 75 | + }; |
64 | 76 | }); |
65 | 77 | } |
66 | 78 |
|
|
0 commit comments