diff --git a/CHANGELOG.md b/CHANGELOG.md index 2b7bdb34..df5678b2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ## [Unreleased] +### Added + +- Wrap the store around AdsProvider component to allow requesting ads across the store. + ## [2.144.0] - 2025-10-22 [YANKED] ### Changed diff --git a/manifest.json b/manifest.json index f1731b28..8f21b7fc 100644 --- a/manifest.json +++ b/manifest.json @@ -90,7 +90,10 @@ "type": "string" } }, - "required": ["rel", "href"] + "required": [ + "rel", + "href" + ] }, "description": "admin/store.faviconLinks.description" }, @@ -224,11 +227,11 @@ "type": "boolean", "default": false }, - "fetchSponsoredProductsOnSearch": { - "title": "admin/store.advancedSettings.fetchSponsoredProductsOnSearch.title", - "description": "admin/store.advancedSettings.fetchSponsoredProductsOnSearch.description", - "type": "boolean", - "default": false + "publisherId": { + "title": "admin/store.advancedSettings.publisherId.title", + "description": "admin/store.advancedSettings.publisherId.description", + "type": "string", + "default": "" }, "a11ySemanticHtmlMigration": { "title": "admin/store.advancedSettings.a11ySemanticHtmlMigration.title", @@ -258,7 +261,10 @@ "description": "admin/store.advancedSettings.customHeader.value.description" } }, - "required": ["key", "value"] + "required": [ + "key", + "value" + ] } }, "useDefaultBrowserNavigation": { @@ -276,14 +282,18 @@ { "properties": { "requiresAuthorization": { - "enum": [false] + "enum": [ + false + ] } } }, { "properties": { "requiresAuthorization": { - "enum": [true] + "enum": [ + true + ] }, "b2bEnabled": { "title": "admin/store.b2benabled.title", @@ -304,7 +314,12 @@ "b2bEnabled": { "ui:disabled": "true" }, - "ui:order": ["storeName", "requiresAuthorization", "b2bEnabled", "*"] + "ui:order": [ + "storeName", + "requiresAuthorization", + "b2bEnabled", + "*" + ] }, "$schema": "https://raw.githubusercontent.com/vtex/node-vtex-api/master/gen/manifest.schema" } diff --git a/react/SearchContext.jsx b/react/SearchContext.jsx index f0ff66b1..a5d05cc2 100644 --- a/react/SearchContext.jsx +++ b/react/SearchContext.jsx @@ -6,41 +6,44 @@ import { useRuntime } from 'vtex.render-runtime' import SearchQuery from 'vtex.search-result/SearchQuery' import { initializeMap, SORT_OPTIONS } from './modules/search' +import { VTEXAdsProvider } from './components/VTEXAdsProvider' const DEFAULT_MAX_ITEMS_PER_PAGE = 10 const trimStartingSlash = value => value && value.replace(/^\//, '') -const SearchContext = ({ - nextTreePath, - params, - maxItemsPerPage = DEFAULT_MAX_ITEMS_PER_PAGE, - queryField, - mapField, - orderByField, - hideUnavailableItems, - facetsBehavior = 'Static', - __unstableCategoryTreeBehavior = 'default', - skusFilter, - simulationBehavior, - installmentCriteria, - excludedPaymentSystems, - includedPaymentSystems, - sponsoredProductsBehavior = 'sync', - query: { - order: orderBy = orderByField || SORT_OPTIONS[0].value, - page: pageQuery, - map: mapQuery, - priceRange, - // backwards-compatibility - rest, - fuzzy, - operator, - searchState, - }, - children, - __unstableProductOriginVtex, -}) => { +const SearchContext = props => { + const { + nextTreePath, + params, + maxItemsPerPage = DEFAULT_MAX_ITEMS_PER_PAGE, + queryField, + mapField, + orderByField, + hideUnavailableItems, + facetsBehavior = 'Static', + __unstableCategoryTreeBehavior = 'default', + skusFilter, + simulationBehavior, + installmentCriteria, + excludedPaymentSystems, + includedPaymentSystems, + sponsoredProductsBehavior = 'sync', + query: { + order: orderBy = orderByField || SORT_OPTIONS[0].value, + page: pageQuery, + map: mapQuery, + priceRange, + // backwards-compatibility + rest, + fuzzy, + operator, + searchState, + }, + children, + __unstableProductOriginVtex, + } = props + const { page: runtimePage, query: runtimeQuery, @@ -102,62 +105,67 @@ const SearchContext = ({ searchState return ( - - {(searchQuery, extraParams) => { - return React.cloneElement(children, { - searchQuery: { - ...searchQuery, - // backwards-compatibility - data: { - ...(searchQuery.data || {}), + + + {(searchQuery, extraParams) => { + return React.cloneElement(children, { + searchQuery: { + ...searchQuery, + // backwards-compatibility + data: { + ...(searchQuery.data || {}), + products: path( + ['data', 'productSearch', 'products'], + searchQuery + ), + }, + facets: path(['data', 'facets'], searchQuery), products: path( ['data', 'productSearch', 'products'], searchQuery ), + recordsFiltered: path( + ['data', 'productSearch', 'recordsFiltered'], + searchQuery + ), }, - facets: path(['data', 'facets'], searchQuery), - products: path(['data', 'productSearch', 'products'], searchQuery), - recordsFiltered: path( - ['data', 'productSearch', 'recordsFiltered'], - searchQuery - ), - }, - searchContext: runtimePage, - pagesPath: nextTreePath, - map, - orderBy, - priceRange, - page: extraParams.page, - from: extraParams.from, - to: extraParams.to, - facetsLoading: extraParams.facetsLoading, - maxItemsPerPage, - // backwards-compatibility - rest, - lazyItemsRemaining: extraParams.lazyItemsRemaining, - }) - }} - + searchContext: runtimePage, + pagesPath: nextTreePath, + map, + orderBy, + priceRange, + page: extraParams.page, + from: extraParams.from, + to: extraParams.to, + facetsLoading: extraParams.facetsLoading, + maxItemsPerPage, + // backwards-compatibility + rest, + lazyItemsRemaining: extraParams.lazyItemsRemaining, + }) + }} + + ) } diff --git a/react/StoreWrapper.js b/react/StoreWrapper.js index 161f01d6..90fafe2d 100644 --- a/react/StoreWrapper.js +++ b/react/StoreWrapper.js @@ -23,6 +23,7 @@ import NetworkStatusToast from './components/NetworkStatusToast' import WrapperContainer from './components/WrapperContainer' import { normalizeNavigation } from './utils/navigation' import { useCanonicalLink } from './hooks/useCanonicalLink' +import { VTEXAdsProvider } from './components/VTEXAdsProvider' const APP_LOCATOR = 'vtex.store' const CONTENT_TYPE = 'text/html; charset=utf-8' @@ -128,9 +129,11 @@ const StoreWrapper = ({ children, CustomContext }) => { - - {children} - + + + {children} + + diff --git a/react/components/UserDataPixel.tsx b/react/components/UserDataPixel.tsx index 35a0de7a..9eabd11c 100644 --- a/react/components/UserDataPixel.tsx +++ b/react/components/UserDataPixel.tsx @@ -1,71 +1,11 @@ import { useEffect, FC } from 'react' import { usePixel } from 'vtex.pixel-manager/PixelContext' -const fields = [ - 'firstName', - 'lastName', - 'document', - 'id', - 'email', - 'phone', - 'isAuthenticated', -] as const - -interface SessionResponse { - response: { - namespaces: { - profile?: { - firstName?: { - value: string - } - lastName?: { - value: string - } - document?: { - value: string - } - id?: { - value: string - } - email?: { - value: string - } - phone?: { - value: string - } - isAuthenticated?: { - value: string - } - } - } - } -} - -const getSessionPromiseFromWindow: any = () => - !(window as any).__RENDER_8_SESSION__ || - !(window as any).__RENDER_8_SESSION__.sessionPromise - ? Promise.resolve(null) - : (window as any).__RENDER_8_SESSION__.sessionPromise - -const toBoolean = (value: string) => value.toLowerCase() === 'true' - -function getUserData( - profileFields: SessionResponse['response']['namespaces']['profile'] -) { - if (!profileFields) { - return {} - } - - return fields.reduce>((acc, key) => { - const value = profileFields[key]?.value - - if (value) { - acc[key] = key === 'isAuthenticated' ? toBoolean(value) : value - } - - return acc - }, {}) -} +import { + getSessionPromiseFromWindow, + getUserData, + SessionResponse, +} from '../hooks/getUserData' const UserDataPixel: FC = () => { const { push } = usePixel() diff --git a/react/components/VTEXAdsProvider.tsx b/react/components/VTEXAdsProvider.tsx new file mode 100644 index 00000000..5ce8b69e --- /dev/null +++ b/react/components/VTEXAdsProvider.tsx @@ -0,0 +1,113 @@ +import React, { useEffect, useState } from 'react' +import { AdsProvider } from '@vtex/ads-react' +import { Offer } from '@vtex/ads-core' +import productSearchV3 from 'vtex.store-resources/QueryProductSearchV3' +import { useApolloClient } from 'react-apollo' +import { useRuntime } from 'vtex.render-runtime' + +import { + getSessionPromiseFromWindow, + getUserData, + SessionResponse, +} from '../hooks/getUserData' + +interface VTEXAdsProviderProps { + children?: React.ReactNode +} + +interface Product { + items: Array<{ + ean: string + itemId: string + sellers: Array<{ sellerId: string }> + }> +} + +const matcher = (product: Product, offer: Offer): boolean => { + const productSku = product.items.find( + item => + item.itemId === offer.skuId && + item.sellers.some(seller => seller.sellerId === offer.sellerId) + ) + + if (productSku === undefined) { + return false + } + + const seller = productSku.sellers.find( + item => item.sellerId === offer.sellerId + ) + + if (!seller) { + return false + } + + productSku.sellers = [seller] + product.items = [productSku] + + return true +} + +export const VTEXAdsProvider = ({ children }: VTEXAdsProviderProps) => { + const { account, getSettings } = useRuntime() + const publisherId = getSettings('vtex.store')?.publisherId + + const [userId, setUserId] = useState(undefined) + const [sessionId, setSessionId] = useState('session-id') + + useEffect(() => { + getSessionPromiseFromWindow() + .then((data: SessionResponse) => { + const profileFields = data?.response?.namespaces?.profile + + if (!profileFields) { + return + } + + setSessionId(data.response?.id ?? 'session-id') + + const userData = getUserData(profileFields) + setUserId(userData.id as string | undefined) + }) + .catch(() => {}) + }, []) + + const client = useApolloClient() + const fetcher = async (offers: Offer[]): Promise => { + if (offers.length === 0) { + return [] + } + + try { + const skuIds = offers.map(o => o.skuId).join(';') + const { data } = await client.query<{ + productSearch: { products: Product[] } + }>({ + query: productSearchV3, + variables: { fullText: `sku.id:${skuIds}` }, + }) + return data?.productSearch.products ?? [] + } catch { + return [] + } + } + + if (!publisherId) { + return children + } + + return ( + + {children} + + ) +} diff --git a/react/hooks/getUserData.tsx b/react/hooks/getUserData.tsx new file mode 100644 index 00000000..c0e4b21f --- /dev/null +++ b/react/hooks/getUserData.tsx @@ -0,0 +1,66 @@ +const fields = [ + 'firstName', + 'lastName', + 'document', + 'id', + 'email', + 'phone', + 'isAuthenticated', +] as const + +export interface SessionResponse { + response: { + id: string + namespaces: { + profile?: { + firstName?: { + value: string + } + lastName?: { + value: string + } + document?: { + value: string + } + id?: { + value: string + } + email?: { + value: string + } + phone?: { + value: string + } + isAuthenticated?: { + value: string + } + } + } + } +} + +export const getSessionPromiseFromWindow: any = () => + !(window as any).__RENDER_8_SESSION__ || + !(window as any).__RENDER_8_SESSION__.sessionPromise + ? Promise.resolve(null) + : (window as any).__RENDER_8_SESSION__.sessionPromise + +const toBoolean = (value: string) => value.toLowerCase() === 'true' + +export function getUserData( + profileFields: SessionResponse['response']['namespaces']['profile'] +) { + if (!profileFields) { + return {} + } + + return fields.reduce>((acc, key) => { + const value = profileFields[key]?.value + + if (value) { + acc[key] = key === 'isAuthenticated' ? toBoolean(value) : value + } + + return acc + }, {}) +} diff --git a/react/package.json b/react/package.json index 09c1a601..7baf9b8d 100644 --- a/react/package.json +++ b/react/package.json @@ -5,6 +5,7 @@ "lint": "eslint --ext js,jsx,ts,tsx ." }, "dependencies": { + "@vtex/ads-react": "0.3.1", "hoist-non-react-statics": "^3.0.1", "prop-types": "^15.5.10", "query-string": "^7.0.1", diff --git a/react/typings/global.d.ts b/react/typings/global.d.ts index 01084cc3..b1bfe935 100644 --- a/react/typings/global.d.ts +++ b/react/typings/global.d.ts @@ -2,3 +2,8 @@ interface Window extends Window { dataLayer: any[] __hostname__: string | undefined } + +declare module 'vtex.store-resources/QueryProductSearchV3' { + const query: any + export default query +} diff --git a/react/typings/vtex.render-runtime.d.ts b/react/typings/vtex.render-runtime.d.ts index 6d47ccee..c4ffb15b 100644 --- a/react/typings/vtex.render-runtime.d.ts +++ b/react/typings/vtex.render-runtime.d.ts @@ -36,6 +36,7 @@ declare module 'vtex.render-runtime' { canonicalWithoutUrlParams: boolean removeStoreNameTitle: boolean a11ySemanticHtmlMigration: boolean + publisherId: string } interface KeyValue { diff --git a/react/yarn.lock b/react/yarn.lock index ed73b338..2bd0d6f9 100644 --- a/react/yarn.lock +++ b/react/yarn.lock @@ -1575,6 +1575,87 @@ dependencies: "@sinonjs/commons" "^1.7.0" +"@swc/core-darwin-arm64@1.13.3": + version "1.13.3" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.13.3.tgz#aaab6af81f255bdc9d3bf1d8d38457236cab1a02" + integrity sha512-ux0Ws4pSpBTqbDS9GlVP354MekB1DwYlbxXU3VhnDr4GBcCOimpocx62x7cFJkSpEBF8bmX8+/TTCGKh4PbyXw== + +"@swc/core-darwin-x64@1.13.3": + version "1.13.3" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.13.3.tgz#2f65063a9ffb169eec810d2d063d93d21b8ec593" + integrity sha512-p0X6yhxmNUOMZrbeZ3ZNsPige8lSlSe1llllXvpCLkKKxN/k5vZt1sULoq6Nj4eQ7KeHQVm81/+AwKZyf/e0TA== + +"@swc/core-linux-arm-gnueabihf@1.13.3": + version "1.13.3" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.13.3.tgz#1e4823f031f8ed8d77b0ea8ed70130cda2da6f1e" + integrity sha512-OmDoiexL2fVWvQTCtoh0xHMyEkZweQAlh4dRyvl8ugqIPEVARSYtaj55TBMUJIP44mSUOJ5tytjzhn2KFxFcBA== + +"@swc/core-linux-arm64-gnu@1.13.3": + version "1.13.3" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.13.3.tgz#1a82f884e9a73c5fb80a94ec67ee98e255f93cdd" + integrity sha512-STfKku3QfnuUj6k3g9ld4vwhtgCGYIFQmsGPPgT9MK/dI3Lwnpe5Gs5t1inoUIoGNP8sIOLlBB4HV4MmBjQuhw== + +"@swc/core-linux-arm64-musl@1.13.3": + version "1.13.3" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.13.3.tgz#f556489bec2451b8a3f28239e115a9480421c008" + integrity sha512-bc+CXYlFc1t8pv9yZJGus372ldzOVscBl7encUBlU1m/Sig0+NDJLz6cXXRcFyl6ABNOApWeR4Yl7iUWx6C8og== + +"@swc/core-linux-x64-gnu@1.13.3": + version "1.13.3" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.13.3.tgz#29e78da291a6ac800e807771a40f6a41d18f0ead" + integrity sha512-dFXoa0TEhohrKcxn/54YKs1iwNeW6tUkHJgXW33H381SvjKFUV53WR231jh1sWVJETjA3vsAwxKwR23s7UCmUA== + +"@swc/core-linux-x64-musl@1.13.3": + version "1.13.3" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.13.3.tgz#5f2b0639f54f89468ad2e464ba6b45ce19adeca2" + integrity sha512-ieyjisLB+ldexiE/yD8uomaZuZIbTc8tjquYln9Quh5ykOBY7LpJJYBWvWtm1g3pHv6AXlBI8Jay7Fffb6aLfA== + +"@swc/core-win32-arm64-msvc@1.13.3": + version "1.13.3" + resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.13.3.tgz#911185c11158b29a8884aea7036115a814a3725a" + integrity sha512-elTQpnaX5vESSbhCEgcwXjpMsnUbqqHfEpB7ewpkAsLzKEXZaK67ihSRYAuAx6ewRQTo7DS5iTT6X5aQD3MzMw== + +"@swc/core-win32-ia32-msvc@1.13.3": + version "1.13.3" + resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.13.3.tgz#279044bfdba0853f1afd138f582952461544e8e8" + integrity sha512-nvehQVEOdI1BleJpuUgPLrclJ0TzbEMc+MarXDmmiRFwEUGqj+pnfkTSb7RZyS1puU74IXdK/YhTirHurtbI9w== + +"@swc/core-win32-x64-msvc@1.13.3": + version "1.13.3" + resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.13.3.tgz#6069e132be45ac34ecb4d72730db53c60d6a5475" + integrity sha512-A+JSKGkRbPLVV2Kwx8TaDAV0yXIXm/gc8m98hSkVDGlPBBmydgzNdWy3X7HTUBM7IDk7YlWE7w2+RUGjdgpTmg== + +"@swc/core@^1.13.3": + version "1.13.3" + resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.13.3.tgz#7a8668d96a28b3431acc3b9652f2d3ff2b6e5531" + integrity sha512-ZaDETVWnm6FE0fc+c2UE8MHYVS3Fe91o5vkmGfgwGXFbxYvAjKSqxM/j4cRc9T7VZNSJjriXq58XkfCp3Y6f+w== + dependencies: + "@swc/counter" "^0.1.3" + "@swc/types" "^0.1.23" + optionalDependencies: + "@swc/core-darwin-arm64" "1.13.3" + "@swc/core-darwin-x64" "1.13.3" + "@swc/core-linux-arm-gnueabihf" "1.13.3" + "@swc/core-linux-arm64-gnu" "1.13.3" + "@swc/core-linux-arm64-musl" "1.13.3" + "@swc/core-linux-x64-gnu" "1.13.3" + "@swc/core-linux-x64-musl" "1.13.3" + "@swc/core-win32-arm64-msvc" "1.13.3" + "@swc/core-win32-ia32-msvc" "1.13.3" + "@swc/core-win32-x64-msvc" "1.13.3" + +"@swc/counter@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9" + integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== + +"@swc/types@^0.1.23": + version "0.1.24" + resolved "https://registry.yarnpkg.com/@swc/types/-/types-0.1.24.tgz#00f4343e2c966eac178cde89e8d821a784f7586d" + integrity sha512-tjTMh3V4vAORHtdTprLlfoMptu1WfTZG9Rsca6yOKyNYsRr+MUXutKmliB17orgSZk5DpnDxs8GUdd/qwYxOng== + dependencies: + "@swc/counter" "^0.1.3" + "@testing-library/dom@^7.22.3": version "7.31.2" resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-7.31.2.tgz#df361db38f5212b88555068ab8119f5d841a8c4a" @@ -1862,6 +1943,21 @@ resolved "https://registry.yarnpkg.com/@types/zen-observable/-/zen-observable-0.8.0.tgz#8b63ab7f1aa5321248aad5ac890a485656dcea4d" integrity sha512-te5lMAWii1uEJ4FwLjzdlbw3+n0FZNOvFXHxQDKeT0dilh7HOzdMzV2TrJVUzq8ep7J4Na8OUYPRLSQkJHAlrg== +"@vtex/ads-core@^0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@vtex/ads-core/-/ads-core-0.3.1.tgz#abc6e10dd3fb18ab1744f7f1de44c6e5e8fb22e1" + integrity sha512-nQ2Ktf4BC/6A1QfEQU2zntuIKrshS6Z78Ir9C0/scIO4xei5OlLxpVD1sADeTmQacNk6Fht38ePM6Zq+K9kXPQ== + dependencies: + "@swc/core" "^1.13.3" + cross-fetch "^4.1.0" + +"@vtex/ads-react@0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@vtex/ads-react/-/ads-react-0.3.1.tgz#7c74954e8d50c54dea70783bbb52f2358519e308" + integrity sha512-/ZQr++FUu0S2WCwIc4uRsCmZGl4S/LOUZHSk5fzh90G5fXnbK3EQ7lLv/Cm0g7h0l22kSGqxi8OlIzNFieYJvA== + dependencies: + "@vtex/ads-core" "^0.3.1" + "@vtex/test-tools@^3.4.3": version "3.4.3" resolved "https://registry.yarnpkg.com/@vtex/test-tools/-/test-tools-3.4.3.tgz#d0cc34c445410050b9b56f804236c7c07a242489" @@ -2552,6 +2648,13 @@ core-js-pure@^3.20.2: resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.24.0.tgz#10eeb90dbf0d670a6b22b081aecc7deb2faec7e1" integrity sha512-uzMmW8cRh7uYw4JQtzqvGWRyC2T5+4zipQLQdi2FmiRqP83k3d6F3stv2iAlNhOs6cXN401FCD5TL0vvleuHgA== +cross-fetch@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-4.1.0.tgz#8f69355007ee182e47fa692ecbaa37a52e43c3d2" + integrity sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw== + dependencies: + node-fetch "^2.7.0" + cross-spawn@^6.0.0: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" @@ -4254,6 +4357,13 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== +node-fetch@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== + dependencies: + whatwg-url "^5.0.0" + node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" @@ -5362,6 +5472,11 @@ tr46@^2.1.0: dependencies: punycode "^2.1.1" +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + trim-right@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" @@ -5664,6 +5779,11 @@ walker@^1.0.7, walker@~1.0.5: dependencies: makeerror "1.0.x" +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + webidl-conversions@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" @@ -5686,6 +5806,14 @@ whatwg-mimetype@^2.3.0: resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + whatwg-url@^8.0.0, whatwg-url@^8.5.0: version "8.7.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" diff --git a/store/contentSchemas.json b/store/contentSchemas.json index fcce1045..37b56883 100644 --- a/store/contentSchemas.json +++ b/store/contentSchemas.json @@ -82,6 +82,12 @@ "type": "boolean", "default": false, "description": "Enables semantic HTML improvements for accessibility that may introduce breaking changes. Components will use proper HTML elements like