diff --git a/packages/extensions/venia-product-recommendations/lib/components/Gallery/Gallery.js b/packages/extensions/venia-product-recommendations/lib/components/Gallery/Gallery.js new file mode 100644 index 0000000000..b6cdd203e4 --- /dev/null +++ b/packages/extensions/venia-product-recommendations/lib/components/Gallery/Gallery.js @@ -0,0 +1,59 @@ +import React from 'react'; +import { string, shape, array } from 'prop-types'; +import { mergeClasses } from '@magento/venia-ui/lib/classify'; +import GalleryItem from '@magento/venia-ui/lib/components/Gallery/item'; +// inline loading of the css is janky, but the webpack loader gets blown out in local environment. +import defaultGalleryClasses from '!!style-loader!css-loader?modules!./gallery.css'; +import defaultItemClasses from '!!style-loader!css-loader?modules!./item.css'; + +/** + * Renders a Gallery of items. If items is an array of nulls Gallery will render + * a placeholder item for each. + * + * @params {Array} props.items an array of items to render + */ +export const Gallery = props => { + const galleryClasses = mergeClasses( + defaultGalleryClasses, + props.galleryClasses + ); + const itemClasses = mergeClasses(defaultItemClasses, props.itemClasses); + + const { items } = props; + + const galleryItems = items.map((item, index) => { + if (item === null) { + return ; + } + return ; + }); + + return ( +
+
{galleryItems}
+
+ ); +}; + +Gallery.propTypes = { + galleryClasses: shape({ + filters: string, + items: string, + root: string + }), + itemClasses: shape({ + image: string, + imageContainer: string, + imagePlaceholder: string, + image_pending: string, + images: string, + images_pending: string, + name: string, + name_pending: string, + price: string, + price_pending: string, + root: string, + root_pending: string + }), + items: array.isRequired +}; diff --git a/packages/extensions/venia-product-recommendations/lib/components/Gallery/gallery.css b/packages/extensions/venia-product-recommendations/lib/components/Gallery/gallery.css new file mode 100644 index 0000000000..b6570083a5 --- /dev/null +++ b/packages/extensions/venia-product-recommendations/lib/components/Gallery/gallery.css @@ -0,0 +1,24 @@ +.root { + display: grid; + grid-template-areas: + 'actions' + 'items'; + grid-template-columns: 1fr; + line-height: 1; +} + +.items { + grid-template-columns: repeat(5, 1fr); + margin-left: 2em; + margin-right: 2em; + margin-bottom: 60px; + display: grid; + grid-area: items; + grid-gap: 1rem; +} + +@media (max-width: 640px) { + .items { + grid-template-columns: repeat(2, 1fr); + } +} diff --git a/packages/extensions/venia-product-recommendations/lib/components/Gallery/index.js b/packages/extensions/venia-product-recommendations/lib/components/Gallery/index.js new file mode 100644 index 0000000000..18bb67f844 --- /dev/null +++ b/packages/extensions/venia-product-recommendations/lib/components/Gallery/index.js @@ -0,0 +1 @@ +export * from './Gallery'; diff --git a/packages/extensions/venia-product-recommendations/lib/components/Gallery/item.css b/packages/extensions/venia-product-recommendations/lib/components/Gallery/item.css new file mode 100644 index 0000000000..5de5efda3b --- /dev/null +++ b/packages/extensions/venia-product-recommendations/lib/components/Gallery/item.css @@ -0,0 +1,3 @@ +.name { + font-weight: bold; +} diff --git a/packages/extensions/venia-product-recommendations/lib/components/VeniaProductRecommendations/ProductRecommendations.css b/packages/extensions/venia-product-recommendations/lib/components/VeniaProductRecommendations/ProductRecommendations.css new file mode 100644 index 0000000000..a63f9751f8 --- /dev/null +++ b/packages/extensions/venia-product-recommendations/lib/components/VeniaProductRecommendations/ProductRecommendations.css @@ -0,0 +1,11 @@ +.unitTitle { + text-align: center; + margin: 1.5em; + font-weight: 700; + font-size: 2.25rem; + font-family: 'Source Serif Pro'; +} + +.root a { + text-decoration: none; +} diff --git a/packages/extensions/venia-product-recommendations/lib/components/VeniaProductRecommendations/VeniaProductRecommendations.js b/packages/extensions/venia-product-recommendations/lib/components/VeniaProductRecommendations/VeniaProductRecommendations.js new file mode 100644 index 0000000000..be0ba25938 --- /dev/null +++ b/packages/extensions/venia-product-recommendations/lib/components/VeniaProductRecommendations/VeniaProductRecommendations.js @@ -0,0 +1,126 @@ +import React, { useRef } from 'react'; +import { string, shape } from 'prop-types'; + +import useRecsTrackingProps from '../../hooks/useRecsTrackingProps'; +import { Gallery } from '../Gallery/Gallery'; +import { mergeClasses } from '@magento/venia-ui/lib/classify'; +// inline loading of the css is janky, but the webpack loader gets blown out in local environment. +import defaultClasses from '!!style-loader!css-loader?modules!./ProductRecommendations.css'; +import useObserver from '../../hooks/useObserver'; +import { mse } from '@magento/venia-data-collector'; + +export const VeniaProductRecommendations = props => { + const rendered = useRef([]); + const { units } = useRecsTrackingProps(props); + const { observeUnit } = useObserver(); + + const classes = mergeClasses(defaultClasses, props.classes); + const galleryClasses = mergeClasses(defaultClasses, props.galleryClasses); + const itemClasses = mergeClasses(defaultClasses, props.itemClasses); + + const galleryUnits = units.map(recommendationUnit => { + if (recommendationUnit.totalProducts < 1) { + return null; + } + + const items = recommendationUnit.products.map(shapeItem); + return ( +
observeUnit(recommendationUnit, element)} + > +
+ {recommendationUnit.storefrontLabel} +
+ +
+ ); + }); + + if (units && units.length > 0) { + units.forEach(recUnit => { + if ( + recUnit.totalProducts > 0 && + !rendered.current.includes(recUnit.unitId) + ) { + mse.publish.recsUnitRender(recUnit.unitId); + rendered.current.push(recUnit.unitId); + } + }); + + return
{galleryUnits}
; + } else { + return null; + } +}; + +VeniaProductRecommendations.propTypes = { + galleryClasses: shape({ + filters: string, + items: string, + root: string + }), + itemClasses: shape({ + image: string, + imageContainer: string, + imagePlaceholder: string, + image_pending: string, + images: string, + images_pending: string, + name: string, + name_pending: string, + price: string, + price_pending: string, + root: string, + root_pending: string + }), + classes: shape({ + unitTitle: string, + root: string + }), + pageType: string.isRequired +}; + +// format data for GalleryItem, exported for testing +export const shapeItem = item => { + if (item) { + const { url, image, prices, productId, currency, type } = item; + + // derive the url_key and url_suffix from the url + // example url --> https://magento.com/blah/blah/url_key.url_suffix + const urlArray = String(url) + .split('/') + .splice(-1)[0] + .split('.'); + const url_key = urlArray[0] + `.${urlArray[1]}`; + const url_suffix = `.${urlArray[1]}`; + + const price = { + regularPrice: { + amount: { + value: prices.minimum.regular, + currency + } + } + }; + + return { + ...item, + id: productId, + small_image: image, + url_key, + url_suffix, + price, + // use inStock when the recs service provides it, use the commented out line below: + // stock_status: inStock ? "IN_STOCK" : "OUT_OF_STOCK"; + stock_status: 'IN_STOCK', + type_id: type + }; + } else return null; +}; diff --git a/packages/extensions/venia-product-recommendations/lib/components/VeniaProductRecommendations/index.js b/packages/extensions/venia-product-recommendations/lib/components/VeniaProductRecommendations/index.js new file mode 100644 index 0000000000..4f40fdb4bf --- /dev/null +++ b/packages/extensions/venia-product-recommendations/lib/components/VeniaProductRecommendations/index.js @@ -0,0 +1 @@ +export * from './ProductRecommendations'; diff --git a/packages/extensions/venia-product-recommendations/lib/constants/index.js b/packages/extensions/venia-product-recommendations/lib/constants/index.js new file mode 100644 index 0000000000..41750d5493 --- /dev/null +++ b/packages/extensions/venia-product-recommendations/lib/constants/index.js @@ -0,0 +1,2 @@ +export * from './localStorageConstants'; +export * from './pageTypes'; diff --git a/packages/extensions/venia-product-recommendations/lib/constants/localStorageConstants.js b/packages/extensions/venia-product-recommendations/lib/constants/localStorageConstants.js new file mode 100644 index 0000000000..a9baa56c99 --- /dev/null +++ b/packages/extensions/venia-product-recommendations/lib/constants/localStorageConstants.js @@ -0,0 +1,4 @@ +export const USER_VIEW_HISTORY_TIME_DECAY_KEY = 'ds-view-history-time-decay'; +export const USER_VIEW_HISTORY_KEY = 'ds-view-history'; +export const PURCHASE_HISTORY_KEY = 'ds-purchase-history'; +export const CART_CONTENTS_KEY = 'ds-cart'; diff --git a/packages/extensions/venia-product-recommendations/lib/constants/pageTypes.js b/packages/extensions/venia-product-recommendations/lib/constants/pageTypes.js new file mode 100644 index 0000000000..c02a7983a3 --- /dev/null +++ b/packages/extensions/venia-product-recommendations/lib/constants/pageTypes.js @@ -0,0 +1,8 @@ +export const CMS = 'CMS'; +export const CART = 'Cart'; +export const CATEGORY = 'Category'; +export const PRODUCT = 'Product'; +export const CHECKOUT = 'Checkout'; +export const PAGEBUILDER = 'PageBuilder'; + +export const PageTypes = [CMS, CART, CATEGORY, CHECKOUT, PRODUCT, PAGEBUILDER]; diff --git a/packages/extensions/venia-product-recommendations/lib/hooks/useObserver.js b/packages/extensions/venia-product-recommendations/lib/hooks/useObserver.js new file mode 100644 index 0000000000..05539b42f9 --- /dev/null +++ b/packages/extensions/venia-product-recommendations/lib/hooks/useObserver.js @@ -0,0 +1,41 @@ +import { mse } from '@magento/venia-data-collector'; + +const cleared = {}; + +// oddly, these functions error when not wrapped in a hook. 🤷 +const useObserver = () => { + const meetThreshold = (entries, unit) => { + entries.forEach(entry => { + const { isIntersecting, intersectionRatio } = entry; + const { unitId } = unit; + + if (!isIntersecting) { + cleared[unitId] = true; + } + if (cleared[unitId] !== false && intersectionRatio >= 0.5) { + cleared[unitId] = false; + mse.publish.recsUnitView(unit.unitId); + } + }); + }; + + const observeUnit = (unit, element) => { + if (element) { + const options = { + threshold: [0.0, 0.5] + }; + const observer = new IntersectionObserver( + entries => meetThreshold(entries, unit), + options + ); + observer.observe(element); + } else { + console.warn( + 'VeniaProductRecommendations IntersectionObserver: Element is either null or undefined.' + ); + } + }; + return { observeUnit }; +}; + +export default useObserver; diff --git a/packages/extensions/venia-product-recommendations/lib/hooks/useRecsData.js b/packages/extensions/venia-product-recommendations/lib/hooks/useRecsData.js new file mode 100644 index 0000000000..65ab082ca4 --- /dev/null +++ b/packages/extensions/venia-product-recommendations/lib/hooks/useRecsData.js @@ -0,0 +1,105 @@ +import RecommendationsClient from '@magento/recommendations-js-sdk'; +import { useEffect, useState, useRef } from 'react'; +import { PageTypes, PRODUCT } from '../constants'; +import { mse } from '@magento/venia-data-collector'; + +const useRecsData = props => { + const [recs, setRecs] = useState(null); + const [isLoading, setIsLoading] = useState(false); + const [error, setError] = useState(null); + const fired = useRef(false); + const stale = useRef(false); + const [currentProduct, setCurrentProduct] = useState(null); + + if ( + (process.env.NODE_ENV === 'development' || + process.env.NODE_ENV === 'test') && + (!props || !props.pageType) + ) { + throw new Error( + 'Headless Recommendations: PageType is required to fetch recommendations.' + ); + } else if (props.pageType && !PageTypes.includes(props.pageType)) { + throw new Error( + `Headless Recommendations: ${ + props.pageType + } is not a valid pagetype. Valid types include ${JSON.stringify( + PageTypes + )}` + ); + } + const { pageType } = props; + const storefrontContext = mse.context.getStorefrontInstance(); + const product = mse.context.getProduct(); + + useEffect(() => { + const fetchRecs = async () => { + const storefront = { ...storefrontContext, pageType }; + + const client = new RecommendationsClient(storefront); + + let currentSku; + if (pageType === PRODUCT) { + currentSku = product.sku; + } + + const fetchProps = { + ...props, + currentSku + }; + let res; + + try { + setIsLoading(true); + fired.current = true; + stale.current = false; + mse.publish.recsRequestSent({ pageContext: { pageType } }); + + res = await client.fetchPreconfigured(fetchProps); + } catch (e) { + console.error(e); + setIsLoading(false); + setError(e); + } + if (res) { + const { data } = res; + mse.context.setRecommendations({ units: data.results }); + mse.publish.recsResponseReceived(); + setIsLoading(false); + setRecs(data); + } + }; + if ( + ((!fired.current && !recs) || stale.current) && + PageTypes.includes(pageType) && + storefrontContext !== undefined && + storefrontContext.environmentId && + ((pageType === PRODUCT && + product !== undefined && + product.sku !== undefined) || + pageType !== PRODUCT) + ) { + fetchRecs(); + } + }, [pageType, props, recs, storefrontContext, product]); + + useEffect(() => { + if ( + product && + product.sku && + (!currentProduct || product.sku !== currentProduct.sku) + ) { + setCurrentProduct(product); + } + }, [product, currentProduct]); + + useEffect(() => { + if (currentProduct && recs && fired.current === true) { + stale.current = true; + } + }, [currentProduct, recs]); + + return { data: recs, isLoading, error }; +}; + +export default useRecsData; diff --git a/packages/extensions/venia-product-recommendations/lib/hooks/useRecsTrackingProps.js b/packages/extensions/venia-product-recommendations/lib/hooks/useRecsTrackingProps.js new file mode 100644 index 0000000000..2eeb9472a3 --- /dev/null +++ b/packages/extensions/venia-product-recommendations/lib/hooks/useRecsTrackingProps.js @@ -0,0 +1,34 @@ +import { useState, useEffect } from 'react'; +import useRecsData from './useRecsData'; +import { mse } from '@magento/venia-data-collector'; + +const useRecsTrackingProps = props => { + const [units, setUnits] = useState([]); + const { data, isLoading, error } = useRecsData(props); + + useEffect(() => { + if (data && data.results) { + const tmpUnits = data.results.map(unit => { + const newUnit = { + ...unit, + pageType: props.pageType + }; + + const products = unit.products.map(product => { + const newProduct = { ...product, unit: newUnit }; + const onClick = () => { + const { unit, productId } = newProduct; + mse.publish.recsItemClick(unit.unitId, productId); + }; + return { ...newProduct, onClick }; + }); + return { ...newUnit, products }; + }); + + setUnits(tmpUnits); + } + }, [data, props.pageType]); + return { units, isLoading, error }; +}; + +export default useRecsTrackingProps; diff --git a/packages/extensions/venia-product-recommendations/lib/hooks/useSyncMSEToLocalStorage.js b/packages/extensions/venia-product-recommendations/lib/hooks/useSyncMSEToLocalStorage.js new file mode 100644 index 0000000000..4870b95ead --- /dev/null +++ b/packages/extensions/venia-product-recommendations/lib/hooks/useSyncMSEToLocalStorage.js @@ -0,0 +1,219 @@ +import { useEffect, useRef } from 'react'; +import { + CART_CONTENTS_KEY, + PURCHASE_HISTORY_KEY, + USER_VIEW_HISTORY_KEY, + USER_VIEW_HISTORY_TIME_DECAY_KEY +} from '../constants'; +import makeUrl from '@magento/venia-ui/lib/util/makeUrl'; +import useShoppingCartQuery from '@magento/venia-data-collector/lib/hooks/useShoppingCartQuery'; +import { mse } from '@magento/venia-data-collector'; + +export default () => { + const firstLoad = useRef(true); + const { data } = useShoppingCartQuery({ + fetchPolicy: 'cache-first', + skip: !firstLoad.current + }); + + const cartEventHandler = () => { + const shoppingCartContext = mse.context.getShoppingCart(); + const dsCart = transformData(shoppingCartContext); + localStorage.setItem(CART_CONTENTS_KEY, JSON.stringify(dsCart)); + }; + + const handleProductPageView = () => { + const product = mse.context.getProduct(); + + if (product && product.sku) { + const productPageViewContext = { + date: new Date().toISOString(), + sku: product.sku + }; + // if sku is not in viewHistorySkus + // write to view_history_decay + try { + const viewHistory = JSON.parse( + localStorage.getItem(USER_VIEW_HISTORY_TIME_DECAY_KEY) + ); + + if (!viewHistory) { + const updatedViewHistory = [productPageViewContext]; + localStorage.setItem( + USER_VIEW_HISTORY_TIME_DECAY_KEY, + JSON.stringify(updatedViewHistory) + ); + } else { + const productIndex = viewHistory.findIndex( + viewedProduct => viewedProduct.sku === product.sku + ); + if (productIndex === -1) { + const updatedViewHistory = [ + ...viewHistory, + productPageViewContext + ]; + localStorage.setItem( + USER_VIEW_HISTORY_TIME_DECAY_KEY, + JSON.stringify(updatedViewHistory) + ); + // has been viewed before + } else if (productIndex >= 0) { + // remove current value in viewHistory, + // and add the new value + viewHistory.splice( + productIndex, + 1, + productPageViewContext + ); + localStorage.setItem( + USER_VIEW_HISTORY_TIME_DECAY_KEY, + JSON.stringify(viewHistory) + ); + } + } + } catch (e) { + console.error(e); + } + + //write to view_history + try { + const viewHistory = JSON.parse( + localStorage.getItem(USER_VIEW_HISTORY_KEY) + ); + + if (!viewHistory) { + const updatedViewHistory = { skus: [product.sku] }; + localStorage.setItem( + USER_VIEW_HISTORY_KEY, + JSON.stringify(updatedViewHistory) + ); + } else { + const productIndex = viewHistory.skus.findIndex( + viewedProduct => viewedProduct === product.sku + ); + if (productIndex === -1) { + const updatedViewHistory = { + skus: [...viewHistory.skus, product.sku] + }; + localStorage.setItem( + USER_VIEW_HISTORY_KEY, + JSON.stringify(updatedViewHistory) + ); + // has been viewed before + } else if (productIndex >= 0) { + // remove current value in viewHistory, + // and add the new value + viewHistory.skus.splice(productIndex, 1, product.sku); + localStorage.setItem( + USER_VIEW_HISTORY_KEY, + JSON.stringify(viewHistory) + ); + } + } + } catch (e) { + console.error(e); + } + } + }; + + const handlePlaceOrder = event => { + if ( + event.eventInfo && + event.eventInfo.shoppingCartContext && + event.eventInfo.shoppingCartContext.items + ) { + let { items } = event.eventInfo.shoppingCartContext; + items = items.map(item => { + return item.product.sku; + }); + const additionalPurchaseHistory = { + date: new Date().toISOString(), + items + }; + try { + const currentPurchaseHistory = JSON.parse( + localStorage.getItem(PURCHASE_HISTORY_KEY) + ); + const newPurchaseHistory = [ + ...(currentPurchaseHistory ? currentPurchaseHistory : []), + additionalPurchaseHistory + ]; + localStorage.setItem( + PURCHASE_HISTORY_KEY, + JSON.stringify(newPurchaseHistory) + ); + } catch (e) { + console.error(e); + } + } + }; + + useEffect(() => { + mse.subscribe.removeFromCart(cartEventHandler); + mse.subscribe.addToCart(cartEventHandler); + mse.subscribe.productPageView(handleProductPageView); + mse.subscribe.placeOrder(handlePlaceOrder); + + return () => { + mse.unsubscribe.removeFromCart(cartEventHandler); + mse.unsubscribe.addToCart(cartEventHandler); + mse.unsubscribe.productPageView(handleProductPageView); + mse.unsubscribe.placeOrder(handlePlaceOrder); + }; + }, []); + + useEffect(() => { + if (data && firstLoad.current) { + firstLoad.current = false; + const firstLoadCart = transformData(data.cart, 'firstLoad'); + localStorage.setItem( + CART_CONTENTS_KEY, + JSON.stringify(firstLoadCart) + ); + } + }, [data, firstLoad]); +}; + +const productTypesMap = new Map([ + ['SimpleProduct', 'simple'], + ['ConfigurableProduct', 'configurable'] +]); + +const transformData = shoppingCart => { + let dsCart; + if (shoppingCart && shoppingCart.items && shoppingCart.items.length > 0) { + dsCart = { + cart: { + items: shoppingCart.items.map(item => { + const { product, prices } = item; + return { + product_type: productTypesMap.get(product.__typename), + item_id: item.id, + qty: item.quantity, + product_id: product.id, + product_name: product.name, + product_sku: product.sku, + product_url: makeUrl( + `${window.location.origin}/${product.url_key}${ + product.url_suffix + }` + ), + product_price_value: prices.price.value, + product_image: { + src: product.thumbnail.url, + alt: product.thumbnail.label || '' + } + }; + }) + } + }; + } else { + dsCart = { + cart: { + items: [] + } + }; + } + + return dsCart; +}; diff --git a/packages/extensions/venia-product-recommendations/lib/index.js b/packages/extensions/venia-product-recommendations/lib/index.js new file mode 100644 index 0000000000..7fbae52900 --- /dev/null +++ b/packages/extensions/venia-product-recommendations/lib/index.js @@ -0,0 +1,20 @@ +export * from './components/VeniaProductRecommendations/VeniaProductRecommendations'; +export * from './hooks/useRecsData'; + +import { + CMS, + PRODUCT, + PAGEBUILDER, + CART, + CATEGORY, + CHECKOUT +} from './constants/pageTypes'; + +export const PageTypes = { + CMS, + PRODUCT, + PAGEBUILDER, + CART, + CATEGORY, + CHECKOUT +}; diff --git a/packages/extensions/venia-product-recommendations/lib/queries/getCart.gql.js b/packages/extensions/venia-product-recommendations/lib/queries/getCart.gql.js new file mode 100644 index 0000000000..d6bf634d6a --- /dev/null +++ b/packages/extensions/venia-product-recommendations/lib/queries/getCart.gql.js @@ -0,0 +1,59 @@ +import { gql } from '@apollo/client'; + +export const ProductRecommendationsFragment = gql` + fragment ProductRecommendationsFragment on Cart { + total_quantity + prices { + subtotal_excluding_tax { + value + } + subtotal_including_tax { + value + } + } + id + items { + id + uid + ... on ConfigurableCartItem { + configured_variant { + uid + sku + } + } + product { + id + name + url_key + url_suffix + sku + image { + url + } + thumbnail { + url + label + } + } + prices { + price { + currency + value + } + } + quantity + } + } +`; + +const GET_CART_QUERY = gql` + query GetCart($cartId: String!) { + cart(cart_id: $cartId) @connection(key: "Cart") { + id + ...ProductRecommendationsFragment + } + } + ${ProductRecommendationsFragment} +`; + +export default GET_CART_QUERY; diff --git a/packages/extensions/venia-product-recommendations/lib/targets/intercept.js b/packages/extensions/venia-product-recommendations/lib/targets/intercept.js new file mode 100644 index 0000000000..c0e70c3650 --- /dev/null +++ b/packages/extensions/venia-product-recommendations/lib/targets/intercept.js @@ -0,0 +1,23 @@ +const myName = '@magento/venia-product-recommendations'; + +module.exports = targets => { + console.log(myName); + const builtins = targets.of('@magento/pwa-buildpack'); + builtins.specialFeatures.tap(flags => { + flags[targets.name] = { + esModules: true, + graphqlQueries: true, + cssModules: true + }; + }); + + builtins.envVarDefinitions.tap(() => { + targets.of('@magento/peregrine').talons.tap(talons => { + talons.App.useApp.wrapWith(`${myName}/lib/wrappers/wrapUseApp`); + talons.Gallery.useGalleryItem.wrapWith( + `${myName}/lib/wrappers/wrapUseGalleryItem` + ); + return talons; + }); + }); +}; diff --git a/packages/extensions/venia-product-recommendations/lib/wrappers/wrapUseApp.js b/packages/extensions/venia-product-recommendations/lib/wrappers/wrapUseApp.js new file mode 100644 index 0000000000..68ebf46293 --- /dev/null +++ b/packages/extensions/venia-product-recommendations/lib/wrappers/wrapUseApp.js @@ -0,0 +1,7 @@ +import useSyncMSEToLocalStorage from '../hooks/useSyncMSEToLocalStorage'; +export default function wrapUseApp(origUseApp) { + return function(props) { + useSyncMSEToLocalStorage(); + return origUseApp(props); + }; +} diff --git a/packages/extensions/venia-product-recommendations/lib/wrappers/wrapUseGalleryItem.js b/packages/extensions/venia-product-recommendations/lib/wrappers/wrapUseGalleryItem.js new file mode 100644 index 0000000000..1652459eff --- /dev/null +++ b/packages/extensions/venia-product-recommendations/lib/wrappers/wrapUseGalleryItem.js @@ -0,0 +1,12 @@ +export default function wrapUseGalleryItem(origUseGalleryItem) { + return function(props) { + const orig = origUseGalleryItem(props); + const handleLinkClick = props.item.onClick + ? props.item.onClick + : orig.handleLinkClick; + return { + ...orig, + handleLinkClick + }; + }; +} diff --git a/packages/extensions/venia-product-recommendations/package.json b/packages/extensions/venia-product-recommendations/package.json new file mode 100644 index 0000000000..94395fd446 --- /dev/null +++ b/packages/extensions/venia-product-recommendations/package.json @@ -0,0 +1,23 @@ +{ + "name": "@magento/venia-product-recommendations", + "version": "1.0.2", + "main": "./lib/index.js", + "files": [ + "/lib" + ], + "scripts": { + "clean": " ", + "cm": "cz" + }, + "license": "MIT", + "dependencies": { + "@magento/recommendations-js-sdk": "~2.0.7", + "@magento/venia-data-collector": "^1.0.7", + "prop-types": "^15.7.2" + }, + "pwa-studio": { + "targets": { + "intercept": "./lib/targets/intercept.js" + } + } +} diff --git a/packages/peregrine/lib/talons/Gallery/useAddToCartButton.js b/packages/peregrine/lib/talons/Gallery/useAddToCartButton.js index 11916dfa12..c72e345dc8 100644 --- a/packages/peregrine/lib/talons/Gallery/useAddToCartButton.js +++ b/packages/peregrine/lib/talons/Gallery/useAddToCartButton.js @@ -63,21 +63,33 @@ export const useAddToCartButton = props => { const quantity = 1; - await addToCart({ - variables: { - cartId, - cartItem: { - quantity, - entered_options: [ - { - uid: item.uid, - value: item.name - } - ], - sku: item.sku + if (item.uid) { + await addToCart({ + variables: { + cartId, + cartItem: { + quantity, + entered_options: [ + { + uid: item.uid, + value: item.name + } + ], + sku: item.sku + } } - } - }); + }); + } else { + await addToCart({ + variables: { + cartId, + cartItem: { + quantity, + sku: item.sku + } + } + }); + } dispatch({ type: 'CART_ADD_ITEM', diff --git a/packages/venia-concept/package.json b/packages/venia-concept/package.json index 06d9067abb..20f7339cdb 100644 --- a/packages/venia-concept/package.json +++ b/packages/venia-concept/package.json @@ -35,11 +35,13 @@ }, "homepage": "https://github.com/magento/pwa-studio/tree/main/packages/venia-concept#readme", "dependencies": { + "@magento/experience-platform-connector": "~1.0.9", "@magento/pwa-buildpack": "~11.5.3", "dompurify": "~3.2.4" }, "devDependencies": { "@adobe/apollo-link-mutation-queue": "~1.0.2", + "@adobe/magento-storefront-events-sdk": "~1.13.0", "@apollo/client": "~3.5.0", "@babel/core": "~7.15.0", "@babel/plugin-proposal-class-properties": "~7.14.5", @@ -56,7 +58,10 @@ "@magento/pagebuilder": "~9.3.3", "@magento/peregrine": "~14.5.1", "@magento/pwa-theme-venia": "~2.4.0", + "@magento/recommendations-js-sdk": "~2.0.7", "@magento/upward-security-headers": "~1.0.14", + "@magento/venia-data-collector": "~1.0.7", + "@magento/venia-product-recommendations": "~1.0.1", "@magento/venia-ui": "~11.6.0", "@pmmmwh/react-refresh-webpack-plugin": "0.4.1", "@storybook/react": "~6.3.7", diff --git a/yarn.lock b/yarn.lock index 8ee6efba9a..3e5d575efa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -15,10 +15,6 @@ integrity sha512-y5B1LcLo1xbUtRZLe4FRGiburzLu6kgY2VgLutgjoz0bpsKFxb21mqJ1axemsTfpJawYEvuP23+No1ud1ZsP2A== "@adobe/alloy@^2.9.0": - version "2.21.1" - resolved "https://registry.yarnpkg.com/@adobe/alloy/-/alloy-2.21.1.tgz#fc5fa5e857a94c23ae3d89973944c445a0ff4b6c" - integrity sha512-uTrHlf02eRMEDm69o3bSliwxBV4You/5EI6BtmXJEDhCNycy3xu0CfkYTmA0kNVdfNfZ/FYQrPEaajjyhROSfA== - version "2.23.0" resolved "https://registry.yarnpkg.com/@adobe/alloy/-/alloy-2.23.0.tgz#9e8baa35a717afd80c09007a0c2a431f927377d4" integrity sha512-UFPEtGqlST11kAIxwb8armSBp2urU8G7v+mHa/a2lM5bg/3KI34hbWe0uI69LOgo22a5ErHtRo855Njut7obaA== @@ -47,7 +43,6 @@ optionalDependencies: "@rollup/rollup-linux-x64-gnu" "^4.21.0" - "@adobe/apollo-link-mutation-queue@~1.0.2": version "1.0.2" resolved "https://registry.yarnpkg.com/@adobe/apollo-link-mutation-queue/-/apollo-link-mutation-queue-1.0.2.tgz#0c589ffb970b9917ba52c38812740c613c0a40da" @@ -55,6 +50,18 @@ dependencies: apollo-link "~1.2.13" +"@adobe/magento-storefront-event-collector@1.5.3": + version "1.5.3" + resolved "https://registry.yarnpkg.com/@adobe/magento-storefront-event-collector/-/magento-storefront-event-collector-1.5.3.tgz#3eeb02b1a0fb09db25f2bff1417b4a9a0df86f3f" + integrity sha512-XhkqRWGX0L8qSpSbvFNw2IGs317KBNtu/GfsqTEw+j0CKVidT30w7i9M1tpxPxwqvEhGRR4tSHjHBxTvz6BU9Q== + dependencies: + "@adobe/adobe-client-data-layer" "^2.0.2" + "@adobe/alloy" "^2.9.0" + "@adobe/magento-storefront-events-sdk" "*" + "@snowplow/browser-plugin-link-click-tracking" "^3.14.0" + "@snowplow/browser-plugin-performance-timing" "^3.14.0" + "@snowplow/browser-tracker" "^3.14.0" + "@adobe/magento-storefront-event-collector@~1.3.1": version "1.3.1" resolved "https://registry.yarnpkg.com/@adobe/magento-storefront-event-collector/-/magento-storefront-event-collector-1.3.1.tgz#e6aacd90313018738de01e59a2d2ce6a3dffeb2c" @@ -74,6 +81,20 @@ dependencies: "@adobe/adobe-client-data-layer" "^2.0.2" +"@adobe/magento-storefront-events-sdk@1.5.3": + version "1.5.3" + resolved "https://registry.yarnpkg.com/@adobe/magento-storefront-events-sdk/-/magento-storefront-events-sdk-1.5.3.tgz#7d7502055b48d80a256a5bf99de8bd3c4befbde4" + integrity sha512-RxKZO0MSihepJLqfr6l8y9t7JURwZkykEKmBgKoWiweKZ55jXhSsG3MGfCl7O29G1Fibu7Fh0gouDKBCoSVJFw== + dependencies: + "@adobe/adobe-client-data-layer" "^2.0.2" + +"@adobe/magento-storefront-events-sdk@~1.13.0": + version "1.13.0" + resolved "https://registry.yarnpkg.com/@adobe/magento-storefront-events-sdk/-/magento-storefront-events-sdk-1.13.0.tgz#14bd1a2f785284f68c09d590599a64f27d01a7ce" + integrity sha512-qgdZlFAEWN9dYLq9ZcoNYp2XvDIGyZbh5oHhkAAEUyKq4mjlwYT/rDzSKI/3nOojlI5q7HlDcYxVwD/No9MxDQ== + dependencies: + "@adobe/adobe-client-data-layer" "^2.0.2" + "@adobe/magento-storefront-events-sdk@~1.3.1": version "1.3.1" resolved "https://registry.yarnpkg.com/@adobe/magento-storefront-events-sdk/-/magento-storefront-events-sdk-1.3.1.tgz#efe9e5898462ef8d6b360af483919566dfadf69e" @@ -211,6 +232,7 @@ dependencies: "@babel/highlight" "^7.25.7" picocolors "^1.0.0" + "@babel/compat-data@^7.14.7", "@babel/compat-data@^7.16.8", "@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.5", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.25.7": version "7.25.7" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.25.7.tgz#b8479fe0018ef0ac87b6b7a5c6916fcd67ae2c9c" @@ -279,7 +301,7 @@ json5 "^2.1.2" semver "^6.3.0" source-map "^0.5.0" - + "@babel/eslint-parser@^7.25.1": version "7.25.7" resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.25.7.tgz#27b43de786c83cbabbcb328efbb4f099ae85415e" @@ -405,7 +427,7 @@ integrity sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ== dependencies: "@babel/types" "^7.24.7" - + "@babel/helper-member-expression-to-functions@^7.25.7": version "7.25.7" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.7.tgz#541a33b071f0355a63a0fa4bdf9ac360116b8574" @@ -489,7 +511,7 @@ integrity sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA== dependencies: "@babel/types" "^7.24.7" - + "@babel/helper-string-parser@^7.25.7": version "7.25.7" resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz#d50e8d37b1176207b4fe9acedec386c565a44a54" @@ -965,7 +987,7 @@ integrity sha512-EJN2mKxDwfOUCPxMO6MUI58RN3ganiRAG/MS/S3HfB6QFNjroAMelQo/gybyYq97WerCBAZoyrAoW8Tzdq2jWg== dependencies: "@babel/helper-plugin-utils" "^7.25.7" - + "@babel/plugin-transform-async-generator-functions@^7.25.7": version "7.25.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.7.tgz#af61a02b30d7bff5108c63bd39ac7938403426d7" @@ -975,7 +997,7 @@ "@babel/helper-remap-async-to-generator" "^7.25.7" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/traverse" "^7.25.7" - + "@babel/plugin-transform-async-to-generator@^7.16.8", "@babel/plugin-transform-async-to-generator@^7.25.7": version "7.25.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.7.tgz#a44c7323f8d4285a6c568dd43c5c361d6367ec52" @@ -991,7 +1013,7 @@ integrity sha512-xHttvIM9fvqW+0a3tZlYcZYSBpSWzGBFIt/sYG3tcdSzBB8ZeVgz2gBP7Df+sM0N1850jrviYSSeUuc+135dmQ== dependencies: "@babel/helper-plugin-utils" "^7.25.7" - + "@babel/plugin-transform-block-scoping@^7.12.12", "@babel/plugin-transform-block-scoping@^7.16.7", "@babel/plugin-transform-block-scoping@^7.25.7": version "7.25.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.7.tgz#6dab95e98adf780ceef1b1c3ab0e55cd20dd410a" @@ -1089,7 +1111,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.7" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - + "@babel/plugin-transform-flow-strip-types@^7.25.7": version "7.25.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.25.7.tgz#32be871a80e10bbe6d8b1c8a7eeedbbc896d5e80" @@ -1770,49 +1792,47 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@braintree/asset-loader@0.4.4": - version "0.4.4" - resolved "https://registry.yarnpkg.com/@braintree/asset-loader/-/asset-loader-0.4.4.tgz#9a5eda24c3627bfd5c7f7483cd48f0e411dd2f09" - integrity sha512-uVhXC5dydmngmNVuDiKgfXSlz4kv4x5ytIJodI8N5SY16mRh13m/UmbQ7yH+o8DQqp50qPZ45MUHIZkXKPg85w== - dependencies: - promise-polyfill "^8.1.3" +"@braintree/asset-loader@2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@braintree/asset-loader/-/asset-loader-2.0.1.tgz#7069b5d54e2827b6c1fb4155c4cdc8dc68e00a33" + integrity sha512-OGAoBA5MRVsr5qg0sXM6NMJbqHnYZhBudtM6WGgpQnoX42fjUYbE6Y6qFuuerD5z3lsOAjnu80DooBs1VBuh5Q== -"@braintree/browser-detection@1.14.0": - version "1.14.0" - resolved "https://registry.yarnpkg.com/@braintree/browser-detection/-/browser-detection-1.14.0.tgz#d1b397b00ccbc7cac12f6cec27c0a413d740332a" - integrity sha512-OsqU+28RhNvSw8Y5JEiUHUrAyn4OpYazFkjSJe8ZVZfkAaRXQc6hsV38MMEpIlkPMig+A68buk/diY+0O8/dMQ== +"@braintree/browser-detection@2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@braintree/browser-detection/-/browser-detection-2.0.1.tgz#11bc5e1d173c55cd25bda6ad22c6b3ee14ed87a2" + integrity sha512-wpRI7AXEUh6o3ILrJbpNOYE7ItfjX/S8JZP7Z5FF66ULngBGYOqE8SeLlLKXG69Nc07HtlL/6nk/h539iz9hcQ== "@braintree/browser-detection@^1.12.1": version "1.17.2" resolved "https://registry.yarnpkg.com/@braintree/browser-detection/-/browser-detection-1.17.2.tgz#bf4edf97a90897aaa0956869316e50be0c4fbcb5" integrity sha512-DdEX09uYs6kHwGt4cbONlxlta/0hfmrDUncP6EtfZxFVywNF9LeRUyon+2LihJTbqgSnGqz9ZL450hkqBd6oSw== -"@braintree/class-list@0.2.0": - version "0.2.0" - resolved "https://registry.yarnpkg.com/@braintree/class-list/-/class-list-0.2.0.tgz#4c4352ac19c262f61526f93d07d248244b399ec4" - integrity sha512-iLXJT51jnBFuGvyTAQqZ2uwyEVwdyapyz52F5MK1Uoh2ZOiPJ5hoqI0wncyCP2KfqrgyCpOkkEaLMLb/94unGA== - "@braintree/event-emitter@0.4.1": version "0.4.1" resolved "https://registry.yarnpkg.com/@braintree/event-emitter/-/event-emitter-0.4.1.tgz#204eaad8cf84eb7bf81fb288a359d34eda85a396" integrity sha512-X41357O3OXUDlnwMvS1m0GQEn3zB3s3flOBeg2J5OBvLvdJEIAVpPkblABPtsPrlciDSvfv1aSG5ixHPgFH0Zg== -"@braintree/extended-promise@0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@braintree/extended-promise/-/extended-promise-0.4.1.tgz#b44f8e6236ddb43434be11924f00fa69f8782a36" - integrity sha512-00n7m4z+swWHoFQLHLvrIBIEoxnGUBsl3ogvX79ITpcn8CHczDwtxYy5+RhMoAraRdfN3oB+8QIpN3KOxs2Q7w== +"@braintree/extended-promise@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@braintree/extended-promise/-/extended-promise-1.0.0.tgz#b9c52cf93b4935c429053b16e1152549df0696a7" + integrity sha512-E9529FJNG4OgeeLJ00vNs3TW67+AeSQobJg0hwfsQk29hgK4bVBsvQHVD4nwDuDD1Czon90K88gfQIFadAMs0w== -"@braintree/iframer@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@braintree/iframer/-/iframer-1.1.0.tgz#7e59b975c2a48bd92616f653367a5214fc2ddd4b" - integrity sha512-tVpr7U6u6bqeQlHreEjYMNtnHX62vLnNWziY2kQLqkWhvusPuY5DfuGEIPpWqsd+V/a1slyTQaxK6HWTlH6A/Q== +"@braintree/iframer@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@braintree/iframer/-/iframer-2.0.0.tgz#bbba9cfd62b701b8cb1f779dffcad6295aed9d23" + integrity sha512-x1kHOyIJNDvi4P1s6pVBZhqhBa1hqDG9+yzcsCR1oNVC0LxH9CAP8bKxioT8/auY1sUyy+D8T4Vp/jv7QqSqLQ== -"@braintree/sanitize-url@6.0.0": - version "6.0.0" - resolved "https://registry.yarnpkg.com/@braintree/sanitize-url/-/sanitize-url-6.0.0.tgz#fe364f025ba74f6de6c837a84ef44bdb1d61e68f" - integrity sha512-mgmE7XBYY/21erpzhexk4Cj1cyTQ9LzvnTxtzM17BJ7ERMNE6W72mQRo0I1Ud8eFJ+RVVIcBNhLFZ3GX4XFz5w== +"@braintree/sanitize-url@7.0.4": + version "7.0.4" + resolved "https://registry.yarnpkg.com/@braintree/sanitize-url/-/sanitize-url-7.0.4.tgz#a7ddd6d55dfb89e341f5684c9717ee24fef62301" + integrity sha512-hPYRrKFoI+nuckPgDJfyYAkybFvheo4usS0Vw0HNAe+fmGBQA5Az37b/yStO284atBoqqdOUhKJ3d9Zw3PQkcQ== + +"@braintree/uuid@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@braintree/uuid/-/uuid-1.0.0.tgz#4fda394ceae803a8129e673c29ccf6c5e2014360" + integrity sha512-AtI5hfttWSuWAgcwLUZdcZ7Fp/8jCCUf9JTs7+Xow9ditU28zuoBovqq083yph2m3SxPYb84lGjOq+cXlXBvJg== -"@braintree/uuid@0.1.0", "@braintree/uuid@^0.1.0": +"@braintree/uuid@^0.1.0": version "0.1.0" resolved "https://registry.yarnpkg.com/@braintree/uuid/-/uuid-0.1.0.tgz#ab9355015a7fb0e25cf3c2ff9cd32ece8ea304b0" integrity sha512-YvZJdlNcK5EnR+7M8AjgEAf4Qx696+FOSYlPfy5ePn80vODtVAUU0FxHnzKZC0og1VbDNQDDiwhthR65D4Na0g== @@ -3148,6 +3168,29 @@ resolved "https://registry.yarnpkg.com/@magento/eslint-config/-/eslint-config-1.5.3.tgz#7a9e54386fc255a9df359176ddfa0ce1f4ba37df" integrity sha512-nCmdeIFbadK6gLvQ/g3OXXuK8JBrp0Hxt8CZD1uj+824X51jr6W7xRKGabmeNKXifnYXFk0wfu+eeMq86PA3jA== +"@magento/recommendations-js-sdk@~2.0.7": + version "2.0.7" + resolved "https://registry.yarnpkg.com/@magento/recommendations-js-sdk/-/recommendations-js-sdk-2.0.7.tgz#8dff681ddd4484b72cd7418aa342c32aa8014237" + integrity sha512-e5lfcdHze3+IU7Cei7i0B25OBcpfLDO32zbimAXwG34Auoaw0MYgSt3oGFPqGxil78/qvQxkLSOfQ/nfBBZr6g== + dependencies: + isomorphic-unfetch "^3.1.0" + mustache "^4.1.0" + uuid "^8.3.2" + +"@magento/upward-security-headers@~1.0.14": + version "1.0.17" + resolved "https://registry.yarnpkg.com/@magento/upward-security-headers/-/upward-security-headers-1.0.17.tgz#2f82faf570b5d2a520830d636707788b2971aefd" + integrity sha512-/9ag9fj/N2WA0guJXxzvdq6gMHo1Vp6JPSsTufYsMVlZvmEMjBuxc+gdBjQkCErjOharJUAWGCnyPRLqWg1pWg== + +"@magento/venia-data-collector@^1.0.7", "@magento/venia-data-collector@~1.0.7": + version "1.0.7" + resolved "https://registry.yarnpkg.com/@magento/venia-data-collector/-/venia-data-collector-1.0.7.tgz#00f1c9dbe081f2467c65d713edcf53059f0c3e32" + integrity sha512-4z/p4gg3dyRs6DTHleM0BzPFNj1gXLFDta642PCJgQQPJZPm8KNmvq1ccRi60gMfpmLtajfujvnQ7vngMILs9w== + dependencies: + "@adobe/magento-storefront-event-collector" "1.5.3" + "@adobe/magento-storefront-events-sdk" "1.5.3" + prop-types "^15.7.2" + "@mdx-js/mdx@^1.6.22": version "1.6.22" resolved "https://registry.yarnpkg.com/@mdx-js/mdx/-/mdx-1.6.22.tgz#8a723157bf90e78f17dc0f27995398e6c731f1ba" @@ -4304,6 +4347,15 @@ "@snowplow/tracker-core" "3.24.4" tslib "^2.3.1" +"@snowplow/browser-plugin-link-click-tracking@^3.14.0": + version "3.24.6" + resolved "https://registry.yarnpkg.com/@snowplow/browser-plugin-link-click-tracking/-/browser-plugin-link-click-tracking-3.24.6.tgz#92fb2a189ecdac1ed3cc40e128e51a83c636397d" + integrity sha512-suE6e1KpsextQjSVswyq07PyafinJNfSR1IDB0TcwW45EX0gUgEGa8CmEdlYbIZfH83ftha6J6tX+Q4l9a5UFw== + dependencies: + "@snowplow/browser-tracker-core" "3.24.6" + "@snowplow/tracker-core" "3.24.6" + tslib "^2.3.1" + "@snowplow/browser-plugin-performance-timing@^3.0.1": version "3.24.4" resolved "https://registry.yarnpkg.com/@snowplow/browser-plugin-performance-timing/-/browser-plugin-performance-timing-3.24.4.tgz#8c62256105e9d68b8523620c077f30cd205a499a" @@ -4313,6 +4365,15 @@ "@snowplow/tracker-core" "3.24.4" tslib "^2.3.1" +"@snowplow/browser-plugin-performance-timing@^3.14.0": + version "3.24.6" + resolved "https://registry.yarnpkg.com/@snowplow/browser-plugin-performance-timing/-/browser-plugin-performance-timing-3.24.6.tgz#f856f7fa4a6b656332913d8b7ee8c6f299a2c61f" + integrity sha512-S48nOdEXMy/P0TJTGV/Gw+1eAqdzElFBIU7bk28g6UVYwRxXqu9QP+voH8/RaeMXHP4CoK3nuNoeC2A3TEmb8w== + dependencies: + "@snowplow/browser-tracker-core" "3.24.6" + "@snowplow/tracker-core" "3.24.6" + tslib "^2.3.1" + "@snowplow/browser-tracker-core@3.24.4": version "3.24.4" resolved "https://registry.yarnpkg.com/@snowplow/browser-tracker-core/-/browser-tracker-core-3.24.4.tgz#07134b2334bf97a2a86d27a35bdae7899f661c08" @@ -4323,6 +4384,16 @@ tslib "^2.3.1" uuid "^3.4.0" +"@snowplow/browser-tracker-core@3.24.6": + version "3.24.6" + resolved "https://registry.yarnpkg.com/@snowplow/browser-tracker-core/-/browser-tracker-core-3.24.6.tgz#d48a8011313d022233dbe39b19638713ba3418ad" + integrity sha512-rXBAmeZJcqRrn/ewm4yPmP8FfZ7uSiQv1E8Dcf41uE4NrY77SuyNMf61c+ppMtV1QyaIvOZnJvVNywwp52i0mQ== + dependencies: + "@snowplow/tracker-core" "3.24.6" + sha1 "^1.1.1" + tslib "^2.3.1" + uuid "^3.4.0" + "@snowplow/browser-tracker@^3.0.1": version "3.24.4" resolved "https://registry.yarnpkg.com/@snowplow/browser-tracker/-/browser-tracker-3.24.4.tgz#c1718bea451aab7faba959caad41b634e9cfacb5" @@ -4332,6 +4403,15 @@ "@snowplow/tracker-core" "3.24.4" tslib "^2.3.1" +"@snowplow/browser-tracker@^3.14.0": + version "3.24.6" + resolved "https://registry.yarnpkg.com/@snowplow/browser-tracker/-/browser-tracker-3.24.6.tgz#5df62472e90f664466596ca158011a78a5b6f446" + integrity sha512-QTqziA9GWi8OU7zzPtJSj4XU85G7ELHsCjUwni+zUUHBf/WSRAYsVqeG6eTEhoEe9LUmc6CaQ+5GrRyez+HZvw== + dependencies: + "@snowplow/browser-tracker-core" "3.24.6" + "@snowplow/tracker-core" "3.24.6" + tslib "^2.3.1" + "@snowplow/tracker-core@3.24.4": version "3.24.4" resolved "https://registry.yarnpkg.com/@snowplow/tracker-core/-/tracker-core-3.24.4.tgz#64a415bf61472d7f42106b5727538feb6fb54e1f" @@ -4340,6 +4420,14 @@ tslib "^2.3.1" uuid "^3.4.0" +"@snowplow/tracker-core@3.24.6": + version "3.24.6" + resolved "https://registry.yarnpkg.com/@snowplow/tracker-core/-/tracker-core-3.24.6.tgz#d20f914c3936125afc43018b11ebc89d1405cfca" + integrity sha512-nTpRj42OUkrpJQdbg8a74fZmkb3oSWfqjVc6NiOsAN4kcYmhU/mPt2S1C4tpYP/Qm2c77/8JGQq9sZL6eA77vw== + dependencies: + tslib "^2.3.1" + uuid "^3.4.0" + "@storybook/addons@6.3.13": version "6.3.13" resolved "https://registry.yarnpkg.com/@storybook/addons/-/addons-6.3.13.tgz#b9f7507210327fb54efca235e2ef90b6a652203f" @@ -5326,7 +5414,7 @@ resolved "https://registry.yarnpkg.com/@types/tmp/-/tmp-0.0.33.tgz#1073c4bc824754ae3d10cfab88ab0237ba964e4d" integrity sha512-gVC1InwyVrO326wbBZw+AO3u2vRXz/iRWq9jYhpG4W8LXyIgDv3ZmcLQ5Q4Gs+gFMyqx+viFoFT+l3p61QFCmQ== -"@types/trusted-types@^2.0.2": +"@types/trusted-types@^2.0.2", "@types/trusted-types@^2.0.7": version "2.0.7" resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.7.tgz#baccb07a970b91707df3a3e8ba6896c57ead2d11" integrity sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw== @@ -6842,38 +6930,35 @@ braces@^3.0.3, braces@~3.0.2: dependencies: fill-range "^7.1.1" -braintree-web-drop-in@~1.33.1, braintree-web-drop-in@~1.33.3: - version "1.33.7" - resolved "https://registry.yarnpkg.com/braintree-web-drop-in/-/braintree-web-drop-in-1.33.7.tgz#16cd3b00ab768437e2de91f2f9f307214f83891b" - integrity sha512-69wtLGbFh1jbgkUCyES598OwSsTljwLn33f9bsl2JRLlbvcW6emMazdyG95k3Am5kyh04Aa1Qx0RO3Yx81U/Jg== +braintree-web-drop-in@~1.43.0: + version "1.43.0" + resolved "https://registry.yarnpkg.com/braintree-web-drop-in/-/braintree-web-drop-in-1.43.0.tgz#d67744fd224401a66abdc87ca8c75998eb458b61" + integrity sha512-lkUpQfYXR0CGtR7mPRR17AnZoYkHjhycxVnMGIPcWT6JPagEZcG/7tYyy34iWjYZeGa2wsquLBDV2Xeita962Q== dependencies: - "@braintree/asset-loader" "0.4.4" - "@braintree/browser-detection" "1.14.0" - "@braintree/class-list" "0.2.0" + "@braintree/asset-loader" "2.0.1" + "@braintree/browser-detection" "2.0.1" "@braintree/event-emitter" "0.4.1" - "@braintree/uuid" "0.1.0" + "@braintree/uuid" "1.0.0" "@braintree/wrap-promise" "2.1.0" - braintree-web "3.88.3" - promise-polyfill "8.2.3" + braintree-web "3.103.0" -braintree-web@3.88.3: - version "3.88.3" - resolved "https://registry.yarnpkg.com/braintree-web/-/braintree-web-3.88.3.tgz#17e19b7b77b18de659f18f41b7842f880bdde265" - integrity sha512-+RM22/OeErWGJWoB3CYW8Od3QDaLLc3ZBEktKL3byqMabaHgzgJqHGrHVmqKNAy+ML+TCY15IQGM71U0N4pvqw== +braintree-web@3.103.0: + version "3.103.0" + resolved "https://registry.yarnpkg.com/braintree-web/-/braintree-web-3.103.0.tgz#2b965d788038d71cb0d9b8897c63e9427ed902df" + integrity sha512-gwmC5LSUP5VUC2HmUyaFnEyLjRRAo1iKKHS5eD9KIAZHB7cAQ2il1V1q2f5zdz7+7EE11eSHXznj6n/Qm6jp6w== dependencies: - "@braintree/asset-loader" "0.4.4" - "@braintree/browser-detection" "1.14.0" - "@braintree/class-list" "0.2.0" + "@braintree/asset-loader" "2.0.1" + "@braintree/browser-detection" "2.0.1" "@braintree/event-emitter" "0.4.1" - "@braintree/extended-promise" "0.4.1" - "@braintree/iframer" "1.1.0" - "@braintree/sanitize-url" "6.0.0" - "@braintree/uuid" "0.1.0" + "@braintree/extended-promise" "1.0.0" + "@braintree/iframer" "2.0.0" + "@braintree/sanitize-url" "7.0.4" + "@braintree/uuid" "1.0.0" "@braintree/wrap-promise" "2.1.0" - card-validator "8.1.1" - credit-card-type "9.1.0" - framebus "5.2.0" - inject-stylesheet "5.0.0" + card-validator "10.0.0" + credit-card-type "10.0.1" + framebus "6.0.0" + inject-stylesheet "6.0.1" promise-polyfill "8.2.3" restricted-input "3.0.5" @@ -7027,7 +7112,7 @@ buffer@^5.5.0, buffer@^5.7.0: base64-js "^1.3.1" ieee754 "^1.1.13" -builtin-modules@^3.1.0, builtin-modules@^3.3.0: +builtin-modules@^3.1.0: version "3.3.0" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== @@ -7296,10 +7381,10 @@ capture-exit@^2.0.0: dependencies: rsvp "^4.8.4" -card-validator@8.1.1: - version "8.1.1" - resolved "https://registry.yarnpkg.com/card-validator/-/card-validator-8.1.1.tgz#418f5f32435553fb9ca2a02634ad413bb38697a9" - integrity sha512-cN4FsKwoTfTFnqPwVc7TQLSsH/QMDB3n/gWm0XelcApz4sKipnOQ6k33sa3bWsNnnIpgs7eXOF+mUV2UQAX2Sw== +card-validator@10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/card-validator/-/card-validator-10.0.0.tgz#288a5525cae765566c4ff7d6e841d8e1ae63cd4c" + integrity sha512-2fLyCBOxO7/b56sxoYav8FeJqv9bWpZSyKq8sXKxnpxTGXHnM/0c8WEKG+ZJ+OXFcabnl98pD0EKBtTn+Tql0g== dependencies: credit-card-type "^9.1.0" @@ -7982,7 +8067,7 @@ copy-webpack-plugin@~6.4.0: schema-utils "^3.0.0" serialize-javascript "^5.0.1" webpack-sources "^1.4.3" - + core-js-compat@^3.20.2, core-js-compat@^3.21.0, core-js-compat@^3.38.0, core-js-compat@^3.38.1, core-js-compat@^3.8.1: version "3.38.1" resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.38.1.tgz#2bc7a298746ca5a7bcb9c164bcb120f2ebc09a09" @@ -8172,7 +8257,12 @@ create-require@^1.1.0: resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== -credit-card-type@9.1.0, credit-card-type@^9.1.0: +credit-card-type@10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/credit-card-type/-/credit-card-type-10.0.1.tgz#3464309395a9942f0f9768481645b696f9f7c58a" + integrity sha512-vQOuWmBgsgG1ovGeDi8m6Zeu1JaqH/JncrxKmaqMbv/LunyOQdLiQhPHtOsNlbUI05TocR5nod/Mbs3HYtr6sQ== + +credit-card-type@^9.1.0: version "9.1.0" resolved "https://registry.yarnpkg.com/credit-card-type/-/credit-card-type-9.1.0.tgz#54dd96c93b6579623e9c8656e6798fc2b93f5f05" integrity sha512-CpNFuLxiPFxuZqhSKml3M+t0K/484pMAnfYWH14JoD7OZMnmC0Lmo+P7JX9SobqFpRoo7ifA18kOHdxJywYPEA== @@ -8944,6 +9034,13 @@ dompurify@^2.3.8: resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.5.8.tgz#2809d89d7e528dc7a071dea440d7376df676f824" integrity sha512-o1vSNgrmYMQObbSSvF/1brBYEQPHhV1+gsmrusO7/GXtp1T9rCS8cXFqVxK/9crT1jA6Ccv+5MTSjBNqr7Sovw== +dompurify@~3.2.4: + version "3.2.5" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.2.5.tgz#11b108656a5fb72b24d916df17a1421663d7129c" + integrity sha512-mLPd29uoRe9HpvwP2TxClGQBzGXeEC/we/q+bFlmPPmj2p2Ugl3r6ATu/UU1v77DXNcehiBg9zsr1dREyA/dJQ== + optionalDependencies: + "@types/trusted-types" "^2.0.7" + domutils@^2.5.2, domutils@^2.8.0: version "2.8.0" resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" @@ -9649,11 +9746,6 @@ estree-to-babel@^3.1.0: "@babel/types" "^7.2.0" c8 "^7.6.0" -estree-walker@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362" - integrity sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w== - estree-walker@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700" @@ -9945,7 +10037,7 @@ fast-glob@^2.2.6: merge2 "^1.2.3" micromatch "^3.1.10" -fast-glob@^3.1.1, fast-glob@^3.2.4, fast-glob@^3.2.5, fast-glob@^3.2.9, fast-glob@^3.3.0: +fast-glob@^3.1.1, fast-glob@^3.2.4, fast-glob@^3.2.9, fast-glob@^3.3.0: version "3.3.2" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== @@ -10449,10 +10541,10 @@ fragment-cache@^0.2.1: dependencies: map-cache "^0.2.2" -framebus@5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/framebus/-/framebus-5.2.0.tgz#a1689e8bbd5abf3ae7af8b1139658bb66d808e62" - integrity sha512-hIKt71vBVd/g0emUbuVg8HAeHEjxBwhAE87CKXvxPIy0sCoGWqBulB1k9lWBWUU6ZHXPs0xjXWMwUldWMiqD6A== +framebus@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/framebus/-/framebus-6.0.0.tgz#4ebafaf4d78441fdb1f6c55cb9a6ea9f72c55cff" + integrity sha512-bL9V68hVaVBCY9rveoWbPFFI9hAXIJtESs51B+9XmzvMt38+wP8b4VdiJsavjMS6NfPZ/afQ/jc2qaHmSGI1kQ== dependencies: "@braintree/uuid" "^0.1.0" @@ -11827,10 +11919,10 @@ ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== -inject-stylesheet@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/inject-stylesheet/-/inject-stylesheet-5.0.0.tgz#bb34acf05ca6ed86e5763d886cd6c9b19f360ab1" - integrity sha512-GzncrJP8E/pavMQzoO93CXoYCfTttwVm2cX2TyXJdgtVE0cCvWSFCn1/uMsM6ZkEg7LUsOcKuamcLiGWlv2p9A== +inject-stylesheet@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/inject-stylesheet/-/inject-stylesheet-6.0.1.tgz#ab724474ac300684875e8980d1285cb4e99b33ae" + integrity sha512-2fvune1D4+8mvJoLVo95ncY4HrDkIaYIReRzXv8tkWFgdG9iuc5QuX57gtSDPWTWQI/f5BGwwtH85wxHouzucg== inline-style-parser@0.1.1: version "0.1.1" @@ -11891,24 +11983,6 @@ inquirer@^8.2.0: through "^2.3.6" wrap-ansi "^6.0.1" -inquirer@^9.2.23: - version "9.3.6" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-9.3.6.tgz#670f1e9408743c3ed23df576f94fe5369f353055" - integrity sha512-riK/iQB2ctwkpWYgjjWIRv3MBLt2gzb2Sj0JNQNbyTXgyXsLWcDPJ5WS5ZDTCx7BRFnJsARtYh+58fjP5M2Y0Q== - dependencies: - "@inquirer/figures" "^1.0.3" - ansi-escapes "^4.3.2" - cli-width "^4.1.0" - external-editor "^3.1.0" - mute-stream "1.0.0" - ora "^5.4.1" - run-async "^3.0.0" - rxjs "^7.8.1" - string-width "^4.2.3" - strip-ansi "^6.0.1" - wrap-ansi "^6.2.0" - yoctocolors-cjs "^2.1.2" - internal-ip@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907" @@ -12077,13 +12151,6 @@ is-buffer@^2.0.0: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== -is-builtin-module@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-3.2.1.tgz#f03271717d8654cfcaf07ab0463faa3571581169" - integrity sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A== - dependencies: - builtin-modules "^3.3.0" - is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" @@ -12545,6 +12612,14 @@ isomorphic-fetch@^3.0.0: node-fetch "^2.6.1" whatwg-fetch "^3.4.1" +isomorphic-unfetch@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/isomorphic-unfetch/-/isomorphic-unfetch-3.1.0.tgz#87341d5f4f7b63843d468438128cb087b7c3e98f" + integrity sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q== + dependencies: + node-fetch "^2.6.1" + unfetch "^4.2.0" + isomorphic-ws@4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc" @@ -12604,17 +12679,6 @@ istanbul-lib-instrument@^5.0.4: istanbul-lib-coverage "^3.2.0" semver "^6.3.0" -istanbul-lib-instrument@^6.0.1: - version "6.0.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz#fa15401df6c15874bcb2105f773325d78c666765" - integrity sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q== - dependencies: - "@babel/core" "^7.23.9" - "@babel/parser" "^7.23.9" - "@istanbuljs/schema" "^0.1.3" - istanbul-lib-coverage "^3.2.0" - semver "^7.5.4" - istanbul-lib-report@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" @@ -14467,6 +14531,11 @@ multicast-dns@^6.0.1: dns-packet "^1.3.1" thunky "^1.0.2" +mustache@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/mustache/-/mustache-4.2.0.tgz#e5892324d60a12ec9c2a73359edca52972bf6f64" + integrity sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ== + mute-stream@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" @@ -16174,11 +16243,6 @@ promise-polyfill@^7.1.1: resolved "https://registry.yarnpkg.com/promise-polyfill/-/promise-polyfill-7.1.2.tgz#ab05301d8c28536301622d69227632269a70ca3b" integrity sha512-FuEc12/eKqqoRYIGBrUptCBRhobL19PS2U31vMNTfyck1FxPyMfgsXyW4Mav85y/ZN1hop3hOwRlUDok23oYfQ== -promise-polyfill@^8.1.3: - version "8.3.0" - resolved "https://registry.yarnpkg.com/promise-polyfill/-/promise-polyfill-8.3.0.tgz#9284810268138d103807b11f4e23d5e945a4db63" - integrity sha512-H5oELycFml5yto/atYqmjyigJoAo3+OXwolYiH7OfQuYlAqhxNvTfiNMbV9hsC6Yp83yE5r2KTVmtrG6R9i6Pg== - promise.allsettled@^1.0.0: version "1.0.7" resolved "https://registry.yarnpkg.com/promise.allsettled/-/promise.allsettled-1.0.7.tgz#b9dd51e9cffe496243f5271515652c468865f2d8" @@ -17352,13 +17416,6 @@ rollup-plugin-terser@^7.0.0: serialize-javascript "^4.0.0" terser "^5.0.0" -rollup-pluginutils@^2.8.2: - version "2.8.2" - resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz#72f2af0748b592364dbd3389e600e5a9444a351e" - integrity sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ== - dependencies: - estree-walker "^0.6.1" - rollup@^2.43.1: version "2.79.2" resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.79.2.tgz#f150e4a5db4b121a21a747d762f701e5e9f49090" @@ -17391,31 +17448,6 @@ rollup@^4.21.0: "@rollup/rollup-win32-x64-msvc" "4.24.0" fsevents "~2.3.2" -rollup@^4.18.0: - version "4.20.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.20.0.tgz#f9d602161d29e178f0bf1d9f35f0a26f83939492" - integrity sha512-6rbWBChcnSGzIlXeIdNIZTopKYad8ZG8ajhl78lGRLsI2rX8IkaotQhVas2Ma+GPxJav19wrSzvRvuiv0YKzWw== - dependencies: - "@types/estree" "1.0.5" - optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.20.0" - "@rollup/rollup-android-arm64" "4.20.0" - "@rollup/rollup-darwin-arm64" "4.20.0" - "@rollup/rollup-darwin-x64" "4.20.0" - "@rollup/rollup-linux-arm-gnueabihf" "4.20.0" - "@rollup/rollup-linux-arm-musleabihf" "4.20.0" - "@rollup/rollup-linux-arm64-gnu" "4.20.0" - "@rollup/rollup-linux-arm64-musl" "4.20.0" - "@rollup/rollup-linux-powerpc64le-gnu" "4.20.0" - "@rollup/rollup-linux-riscv64-gnu" "4.20.0" - "@rollup/rollup-linux-s390x-gnu" "4.20.0" - "@rollup/rollup-linux-x64-gnu" "4.20.0" - "@rollup/rollup-linux-x64-musl" "4.20.0" - "@rollup/rollup-win32-arm64-msvc" "4.20.0" - "@rollup/rollup-win32-ia32-msvc" "4.20.0" - "@rollup/rollup-win32-x64-msvc" "4.20.0" - fsevents "~2.3.2" - rsvp@^4.8.4: version "4.8.5" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" @@ -18171,20 +18203,6 @@ spdx-satisfies@~5.0.1: spdx-expression-parse "^3.0.0" spdx-ranges "^2.0.0" -spdx-ranges@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/spdx-ranges/-/spdx-ranges-2.1.1.tgz#87573927ba51e92b3f4550ab60bfc83dd07bac20" - integrity sha512-mcdpQFV7UDAgLpXEE/jOMqvK4LBoO0uTQg0uvXUewmEFhpiZx5yJSZITHB8w1ZahKdhfZqP5GPEOKLyEq5p8XA== - -spdx-satisfies@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/spdx-satisfies/-/spdx-satisfies-5.0.1.tgz#9feeb2524686c08e5f7933c16248d4fdf07ed6a6" - integrity sha512-Nwor6W6gzFp8XX4neaKQ7ChV4wmpSh2sSDemMFSzHxpTw460jxFYeOn+jq4ybnSSw/5sc3pjka9MQPouksQNpw== - dependencies: - spdx-compare "^1.0.0" - spdx-expression-parse "^3.0.0" - spdx-ranges "^2.0.0" - spdy-transport@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" @@ -18400,7 +18418,7 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" -"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0": version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -18418,6 +18436,15 @@ string-width@^1.0.1: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + string-width@^2.0.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" @@ -18533,7 +18560,7 @@ stringify-object@^3.3.0: is-obj "^1.0.1" is-regexp "^1.0.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -18568,6 +18595,13 @@ strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-ansi@^7.0.1: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" @@ -20684,7 +20718,7 @@ worker-rpc@^0.1.0: dependencies: microevent.ts "~0.1.1" -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -20710,6 +20744,15 @@ wrap-ansi@^6.0.1, wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"