diff --git a/vendor/magento/module-catalog/Model/Product/Option/Type/Select.php b/vendor/magento/module-catalog/Model/Product/Option/Type/Select.php
index 580ef7689ff4..c33407337fc8 100644
--- a/vendor/magento/module-catalog/Model/Product/Option/Type/Select.php
+++ b/vendor/magento/module-catalog/Model/Product/Option/Type/Select.php
@@ -90,19 +90,8 @@ public function validateUserValue($values)
         $option = $this->getOption();
         $value = $this->getUserValue();
 
-        if (empty($value) && $option->getIsRequire() && !$this->getSkipCheckRequiredOption()) {
-            $this->setIsValid(false);
-            throw new LocalizedException(
-                __("The product's required option(s) weren't entered. Make sure the options are entered and try again.")
-            );
-        }
-        if (!$this->_isSingleSelection()) {
-            if (is_string($value)) {
-                $value = explode(',', $value);
-            }
-            $valuesCollection = $option->getOptionValuesByOptionId($value, $this->getProduct()->getStoreId())->load();
-            $valueCount = is_array($value) ? count($value) : 0;
-            if ($valuesCollection->count() != $valueCount) {
+        if (empty($value)) {
+            if ($option->getIsRequire() && !$this->getSkipCheckRequiredOption()) {
                 $this->setIsValid(false);
                 throw new LocalizedException(
                     __(
@@ -111,6 +100,21 @@ public function validateUserValue($values)
                     )
                 );
             }
+        } else {
+            if (!$this->_isSingleSelection()) {
+                if (is_string($value)) {
+                    $value = explode(',', $value);
+                }
+                $valuesCollection = $option->getOptionValuesByOptionId($value, $this->getProduct()->getStoreId());
+                $valueCount = is_array($value) ? count($value) : 0;
+                if ($valuesCollection->count() != $valueCount) {
+                    $this->setIsValid(false);
+                    throw new LocalizedException($this->_getWrongConfigurationMessage());
+                }
+            } elseif (!$option->getValueById($value)) {
+                $this->setIsValid(false);
+                throw new LocalizedException($this->_getWrongConfigurationMessage());
+            }
         }
         return $this;
     }
diff --git a/vendor/magento/module-configurable-product-graph-ql/Model/Wishlist/ConfigurableOptions.php b/vendor/magento/module-configurable-product-graph-ql/Model/Wishlist/ConfigurableOptions.php
index 6fcb3e118e5f..34295abe161e 100644
--- a/vendor/magento/module-configurable-product-graph-ql/Model/Wishlist/ConfigurableOptions.php
+++ b/vendor/magento/module-configurable-product-graph-ql/Model/Wishlist/ConfigurableOptions.php
@@ -7,11 +7,14 @@
 
 namespace Magento\ConfigurableProductGraphQl\Model\Wishlist;
 
+use Magento\Catalog\Api\Data\ProductInterface;
 use Magento\Catalog\Helper\Product\Configuration;
 use Magento\Catalog\Model\Product\Configuration\Item\ItemInterface;
+use Magento\Framework\EntityManager\MetadataPool;
 use Magento\Framework\Exception\LocalizedException;
 use Magento\Framework\GraphQl\Config\Element\Field;
 use Magento\Framework\GraphQl\Query\ResolverInterface;
+use Magento\Framework\GraphQl\Query\Uid;
 use Magento\Framework\GraphQl\Schema\Type\ResolveInfo;
 
 /**
@@ -19,18 +22,39 @@
  */
 class ConfigurableOptions implements ResolverInterface
 {
+    /**
+     * Option type name
+     */
+    private const OPTION_TYPE = 'configurable';
+
     /**
      * @var Configuration
      */
     private $configurationHelper;
 
+    /**
+     * @var MetadataPool
+     */
+    private $metadataPool;
+
+    /**
+     * @var Uid
+     */
+    private $uidEncoder;
+
     /**
      * @param Configuration $configurationHelper
+     * @param MetadataPool $metadataPool
+     * @param Uid $uidEncoder
      */
     public function __construct(
-        Configuration $configurationHelper
+        Configuration $configurationHelper,
+        MetadataPool $metadataPool,
+        Uid $uidEncoder
     ) {
         $this->configurationHelper = $configurationHelper;
+        $this->metadataPool = $metadataPool;
+        $this->uidEncoder = $uidEncoder;
     }
 
     /**
@@ -52,12 +76,24 @@ public function resolve(
         /** @var ItemInterface $item */
         $item = $value['itemModel'];
         $result = [];
+        $linkField = $this->metadataPool->getMetadata(ProductInterface::class)->getLinkField();
+        $productLinkId = $item->getProduct()->getData($linkField);
 
         foreach ($this->configurationHelper->getOptions($item) as $option) {
+            if (isset($option['option_type'])) {
+                //Don't return customizable options in this resolver
+                continue;
+            }
             $result[] = [
                 'id' => $option['option_id'],
+                'configurable_product_option_uid' => $this->uidEncoder->encode(
+                    self::OPTION_TYPE . '/' . $productLinkId . '/' . $option['option_id']
+                ),
                 'option_label' => $option['label'],
                 'value_id' => $option['option_value'],
+                'configurable_product_option_value_uid' => $this->uidEncoder->encode(
+                    self::OPTION_TYPE . '/' . $option['option_id'] . '/' . $option['option_value']
+                ),
                 'value_label' => $option['value'],
             ];
         }
diff --git a/vendor/magento/module-configurable-product-graph-ql/etc/schema.graphqls b/vendor/magento/module-configurable-product-graph-ql/etc/schema.graphqls
index a31c7a6362b1..5dc05f43af18 100644
--- a/vendor/magento/module-configurable-product-graph-ql/etc/schema.graphqls
+++ b/vendor/magento/module-configurable-product-graph-ql/etc/schema.graphqls
@@ -77,8 +77,9 @@ type SelectedConfigurableOption @doc(description: "Contains details about a sele
 }
 
 type ConfigurableWishlistItem implements WishlistItemInterface @doc(description: "A configurable product wish list item."){
-    child_sku: String! @doc(description: "The SKU of the simple product corresponding to a set of selected configurable options.") @resolver(class: "\\Magento\\ConfigurableProductGraphQl\\Model\\Wishlist\\ChildSku")
+    child_sku: String! @deprecated(reason: "Use `ConfigurableWishlistItem.configured_variant.sku` instead.") @doc(description: "The SKU of the simple product corresponding to a set of selected configurable options.") @resolver(class: "\\Magento\\ConfigurableProductGraphQl\\Model\\Wishlist\\ChildSku")
     configurable_options: [SelectedConfigurableOption!] @resolver(class: "\\Magento\\ConfigurableProductGraphQl\\Model\\Wishlist\\ConfigurableOptions") @doc(description: "An array of selected configurable options.")
+    configured_variant: ProductInterface @doc(description: "Product details of the selected variant. The value is null if some options are not configured.") @resolver(class: "\\Magento\\ConfigurableProductGraphQl\\Model\\Wishlist\\ConfiguredVariant")
 }
 
 type ConfigurableProductOptionsSelection @doc(description: "Contains metadata corresponding to the selected configurable options.") {
diff --git a/vendor/magento/module-quote-graph-ql/Model/CartItem/DataProvider/CustomizableOptionValue/Dropdown.php b/vendor/magento/module-quote-graph-ql/Model/CartItem/DataProvider/CustomizableOptionValue/Dropdown.php
index d62c1951eda6..8a92bb87743f 100644
--- a/vendor/magento/module-quote-graph-ql/Model/CartItem/DataProvider/CustomizableOptionValue/Dropdown.php
+++ b/vendor/magento/module-quote-graph-ql/Model/CartItem/DataProvider/CustomizableOptionValue/Dropdown.php
@@ -59,28 +59,31 @@ public function getData(
             ->setOption($option)
             ->setConfigurationItemOption($selectedOption);
 
+        $selectedOptionValues = [];
         $selectedValue = $selectedOption->getValue();
         $optionValue = $option->getValueById($selectedValue);
-        $optionPriceType = (string)$optionValue->getPriceType();
-        $priceValueUnits = $this->priceUnitLabel->getData($optionPriceType);
+        if ($optionValue) {
+            $optionPriceType = (string)$optionValue->getPriceType();
+            $priceValueUnits = $this->priceUnitLabel->getData($optionPriceType);
 
-        $optionDetails = [
-            self::OPTION_TYPE,
-            $option->getOptionId(),
-            $optionValue->getOptionTypeId()
-        ];
+            $optionDetails = [
+                self::OPTION_TYPE,
+                $option->getOptionId(),
+                $optionValue->getOptionTypeId()
+            ];
 
-        $selectedOptionValueData = [
-            'id' => $selectedOption->getId(),
-            'customizable_option_value_uid' => $this->uidEncoder->encode((string) implode('/', $optionDetails)),
-            'label' => $optionTypeRenderer->getFormattedOptionValue($selectedValue),
-            'value' => $selectedValue,
-            'price' => [
-                'type' => strtoupper($optionPriceType),
-                'units' => $priceValueUnits,
-                'value' => $optionValue->getPrice(),
-            ]
-        ];
-        return [$selectedOptionValueData];
+            $selectedOptionValues[] = [
+                'id' => $selectedOption->getId(),
+                'customizable_option_value_uid' => $this->uidEncoder->encode((string)implode('/', $optionDetails)),
+                'label' => $optionTypeRenderer->getFormattedOptionValue($selectedValue),
+                'value' => $selectedValue,
+                'price' => [
+                    'type' => strtoupper($optionPriceType),
+                    'units' => $priceValueUnits,
+                    'value' => $optionValue->getPrice(),
+                ]
+            ];
+        }
+        return $selectedOptionValues;
     }
 }
diff --git a/vendor/magento/module-quote-graph-ql/Model/CartItem/DataProvider/CustomizableOptionValue/Multiple.php b/vendor/magento/module-quote-graph-ql/Model/CartItem/DataProvider/CustomizableOptionValue/Multiple.php
index 8831ee630439..76ea74b4320c 100644
--- a/vendor/magento/module-quote-graph-ql/Model/CartItem/DataProvider/CustomizableOptionValue/Multiple.php
+++ b/vendor/magento/module-quote-graph-ql/Model/CartItem/DataProvider/CustomizableOptionValue/Multiple.php
@@ -63,25 +63,27 @@ public function getData(
 
         foreach ($optionIds as $optionId) {
             $optionValue = $option->getValueById($optionId);
-            $priceValueUnits = $this->priceUnitLabel->getData($optionValue->getPriceType());
+            if ($optionValue) {
+                $priceValueUnits = $this->priceUnitLabel->getData($optionValue->getPriceType());
 
-            $optionDetails = [
-                self::OPTION_TYPE,
-                $option->getOptionId(),
-                $optionValue->getOptionTypeId()
-            ];
+                $optionDetails = [
+                    self::OPTION_TYPE,
+                    $option->getOptionId(),
+                    $optionValue->getOptionTypeId()
+                ];
 
-            $selectedOptionValueData[] = [
-                'id' => $selectedOption->getId(),
-                'customizable_option_value_uid' => $this->uidEncoder->encode((string)implode('/', $optionDetails)),
-                'label' => $optionValue->getTitle(),
-                'value' => $optionId,
-                'price' => [
-                    'type' => strtoupper($optionValue->getPriceType()),
-                    'units' => $priceValueUnits,
-                    'value' => $optionValue->getPrice(),
-                ],
-            ];
+                $selectedOptionValueData[] = [
+                    'id' => $selectedOption->getId(),
+                    'customizable_option_value_uid' => $this->uidEncoder->encode((string)implode('/', $optionDetails)),
+                    'label' => $optionValue->getTitle(),
+                    'value' => $optionId,
+                    'price' => [
+                        'type' => strtoupper($optionValue->getPriceType()),
+                        'units' => $priceValueUnits,
+                        'value' => $optionValue->getPrice(),
+                    ],
+                ];
+            }
         }
 
         return $selectedOptionValueData;
diff --git a/vendor/magento/module-wishlist-graph-ql/Model/Resolver/CustomizableOptions.php b/vendor/magento/module-wishlist-graph-ql/Model/Resolver/CustomizableOptions.php
new file mode 100644
index 000000000000..8f72f6be9db6
--- /dev/null
+++ b/vendor/magento/module-wishlist-graph-ql/Model/Resolver/CustomizableOptions.php
@@ -0,0 +1,65 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+declare(strict_types=1);
+
+namespace Magento\WishlistGraphQl\Model\Resolver;
+
+use Magento\Framework\Exception\LocalizedException;
+use Magento\Framework\GraphQl\Config\Element\Field;
+use Magento\Framework\GraphQl\Query\ResolverInterface;
+use Magento\Framework\GraphQl\Schema\Type\ResolveInfo;
+use Magento\Wishlist\Model\Item as WishlistItem;
+use Magento\WishlistGraphQl\Model\WishlistItem\DataProvider\CustomizableOption;
+
+/**
+ * @inheritdoc
+ */
+class CustomizableOptions implements ResolverInterface
+{
+    /**
+     * @var CustomizableOption
+     */
+    private $customizableOption;
+
+    /**
+     * @param CustomizableOption $customizableOption
+     */
+    public function __construct(
+        CustomizableOption $customizableOption
+    ) {
+        $this->customizableOption = $customizableOption;
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function resolve(Field $field, $context, ResolveInfo $info, array $value = null, array $args = null)
+    {
+        if (!isset($value['itemModel'])) {
+            throw new LocalizedException(__('"itemModel" value should be specified'));
+        }
+
+        /** @var WishlistItem $wishlistItem */
+        $wishlistItem = $value['itemModel'];
+        $wishlistItemOption = $wishlistItem->getOptionByCode('option_ids');
+
+        if (null === $wishlistItemOption) {
+            return [];
+        }
+
+        $customizableOptionsData = [];
+        $customizableOptionIds = explode(',', $wishlistItemOption->getValue());
+
+        foreach ($customizableOptionIds as $customizableOptionId) {
+            $customizableOption = $this->customizableOption->getData(
+                $wishlistItem,
+                (int)$customizableOptionId
+            );
+            $customizableOptionsData[] = $customizableOption;
+        }
+        return $customizableOptionsData;
+    }
+}
diff --git a/vendor/magento/module-wishlist-graph-ql/Model/WishlistItem/DataProvider/CustomizableOption.php b/vendor/magento/module-wishlist-graph-ql/Model/WishlistItem/DataProvider/CustomizableOption.php
new file mode 100644
index 000000000000..194fc43c9846
--- /dev/null
+++ b/vendor/magento/module-wishlist-graph-ql/Model/WishlistItem/DataProvider/CustomizableOption.php
@@ -0,0 +1,81 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+declare(strict_types=1);
+
+namespace Magento\WishlistGraphQl\Model\WishlistItem\DataProvider;
+
+use Magento\Framework\Exception\LocalizedException;
+use Magento\Framework\GraphQl\Query\Uid;
+use Magento\Wishlist\Model\Item as WishlistItem;
+
+/**
+ * Custom Option Data provider
+ */
+class CustomizableOption
+{
+    /**
+     * Option type name
+     */
+    private const OPTION_TYPE = 'custom-option';
+
+    /**
+     * @var CustomizableOptionValueInterface
+     */
+    private $customizableOptionValue;
+
+    /**
+     * @var Uid
+     */
+    private $uidEncoder;
+
+    /**
+     * @param CustomizableOptionValueInterface $customOptionValueDataProvider
+     * @param Uid $uidEncoder
+     */
+    public function __construct(
+        CustomizableOptionValueInterface $customOptionValueDataProvider,
+        Uid $uidEncoder
+    ) {
+        $this->customizableOptionValue = $customOptionValueDataProvider;
+        $this->uidEncoder = $uidEncoder;
+    }
+
+    /**
+     * Retrieve custom option data
+     *
+     * @param WishlistItem $wishlistItem
+     * @param int $optionId
+     * @return array
+     * @throws LocalizedException
+     */
+    public function getData(WishlistItem $wishlistItem, int $optionId): array
+    {
+        $product = $wishlistItem->getProduct();
+        $option = $product->getOptionById($optionId);
+
+        if (!$option) {
+            return [];
+        }
+
+        $selectedOption = $wishlistItem->getOptionByCode('option_' . $option->getId());
+
+        $selectedOptionValueData = $this->customizableOptionValue->getData(
+            $wishlistItem,
+            $option,
+            $selectedOption
+        );
+
+        return [
+            'id' => $option->getId(),
+            'customizable_option_uid' => $this->uidEncoder->encode((string) self::OPTION_TYPE . '/' . $option->getId()),
+            'label' => $option->getTitle(),
+            'type' => $option->getType(),
+            'values' => $selectedOptionValueData,
+            'sort_order' => $option->getSortOrder(),
+            'is_required' => $option->getIsRequire(),
+        ];
+    }
+}
diff --git a/vendor/magento/module-wishlist-graph-ql/Model/WishlistItem/DataProvider/CustomizableOptionValue/Composite.php b/vendor/magento/module-wishlist-graph-ql/Model/WishlistItem/DataProvider/CustomizableOptionValue/Composite.php
new file mode 100644
index 000000000000..e44f80201dd3
--- /dev/null
+++ b/vendor/magento/module-wishlist-graph-ql/Model/WishlistItem/DataProvider/CustomizableOptionValue/Composite.php
@@ -0,0 +1,68 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+declare(strict_types=1);
+
+namespace Magento\WishlistGraphQl\Model\WishlistItem\DataProvider\CustomizableOptionValue;
+
+use Magento\Catalog\Model\Product\Option;
+use Magento\Framework\Exception\LocalizedException;
+use Magento\Framework\GraphQl\Exception\GraphQlInputException;
+use Magento\Framework\ObjectManagerInterface;
+use Magento\Wishlist\Model\Item as WishlistItem;
+use Magento\Wishlist\Model\Item\Option as SelectedOption;
+use Magento\WishlistGraphQl\Model\WishlistItem\DataProvider\CustomizableOptionValueInterface;
+
+/**
+ * @inheritdoc
+ */
+class Composite implements CustomizableOptionValueInterface
+{
+    /**
+     * @var ObjectManagerInterface
+     */
+    private $objectManager;
+
+    /**
+     * @var CustomizableOptionValueInterface[]
+     */
+    private $customizableOptionValues;
+
+    /**
+     * @param ObjectManagerInterface $objectManager
+     * @param CustomizableOptionValueInterface[] $customizableOptionValues
+     */
+    public function __construct(
+        ObjectManagerInterface $objectManager,
+        array $customizableOptionValues = []
+    ) {
+        $this->objectManager = $objectManager;
+        $this->customizableOptionValues = $customizableOptionValues;
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function getData(
+        WishlistItem $wishlistItem,
+        Option $option,
+        SelectedOption $selectedOption
+    ): array {
+        $optionType = $option->getType();
+
+        if (!array_key_exists($optionType, $this->customizableOptionValues)) {
+            throw new GraphQlInputException(__('Option type "%1" is not supported', $optionType));
+        }
+        $customizableOptionValueClassName = $this->customizableOptionValues[$optionType];
+
+        $customizableOptionValue = $this->objectManager->get($customizableOptionValueClassName);
+        if (!$customizableOptionValue instanceof CustomizableOptionValueInterface) {
+            throw new LocalizedException(
+                __('%1 doesn\'t implement CustomizableOptionValueInterface', $customizableOptionValueClassName)
+            );
+        }
+        return $customizableOptionValue->getData($wishlistItem, $option, $selectedOption);
+    }
+}
diff --git a/vendor/magento/module-wishlist-graph-ql/Model/WishlistItem/DataProvider/CustomizableOptionValue/Dropdown.php b/vendor/magento/module-wishlist-graph-ql/Model/WishlistItem/DataProvider/CustomizableOptionValue/Dropdown.php
new file mode 100644
index 000000000000..50d2bb9d7c35
--- /dev/null
+++ b/vendor/magento/module-wishlist-graph-ql/Model/WishlistItem/DataProvider/CustomizableOptionValue/Dropdown.php
@@ -0,0 +1,92 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+declare(strict_types=1);
+
+namespace Magento\WishlistGraphQl\Model\WishlistItem\DataProvider\CustomizableOptionValue;
+
+use Magento\Catalog\Model\Product\Option;
+use Magento\Catalog\Model\Product\Option\Type\Select as SelectOptionType;
+use Magento\Framework\GraphQl\Query\Uid;
+use Magento\Wishlist\Model\Item as WishlistItem;
+use Magento\Wishlist\Model\Item\Option as SelectedOption;
+use Magento\WishlistGraphQl\Model\WishlistItem\DataProvider\CustomizableOptionValueInterface;
+
+/**
+ * @inheritdoc
+ */
+class Dropdown implements CustomizableOptionValueInterface
+{
+    /**
+     * Option type name
+     */
+    private const OPTION_TYPE = 'custom-option';
+
+    /**
+     * @var PriceUnitLabel
+     */
+    private $priceUnitLabel;
+
+    /**
+     * @var Uid
+     */
+    private $uidEncoder;
+
+    /**
+     * @param PriceUnitLabel $priceUnitLabel
+     * @param Uid $uidEncoder
+     */
+    public function __construct(
+        PriceUnitLabel $priceUnitLabel,
+        Uid $uidEncoder
+    ) {
+        $this->priceUnitLabel = $priceUnitLabel;
+        $this->uidEncoder = $uidEncoder;
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function getData(
+        WishlistItem $wishlistItem,
+        Option $option,
+        SelectedOption $selectedOption
+    ): array {
+        /** @var SelectOptionType $optionTypeRenderer */
+        $optionTypeRenderer = $option->groupFactory($option->getType())
+            ->setOption($option)
+            ->setConfigurationItemOption($selectedOption);
+
+        $selectedOptionValues = [];
+        $selectedValue = $selectedOption->getValue();
+        $optionValue = $option->getValueById($selectedValue);
+        if ($optionValue) {
+            $optionPriceType = (string)$optionValue->getPriceType();
+            $priceValueUnits = $this->priceUnitLabel->getData($optionPriceType);
+
+            $optionDetails = [
+                self::OPTION_TYPE,
+                $option->getOptionId(),
+                $optionValue->getOptionTypeId()
+            ];
+
+            $uuid = $this->uidEncoder->encode((string) implode('/', $optionDetails));
+
+            $selectedOptionValues[] = [
+                'id' => $selectedOption->getId(),
+                'customizable_option_value_uid' => $uuid,
+                'label' => $optionTypeRenderer->getFormattedOptionValue($selectedValue),
+                'value' => $selectedValue,
+                'price' => [
+                    'type' => strtoupper($optionPriceType),
+                    'units' => $priceValueUnits,
+                    'value' => $optionValue->getPrice(),
+                ]
+            ];
+        }
+
+        return $selectedOptionValues;
+    }
+}
diff --git a/vendor/magento/module-wishlist-graph-ql/Model/WishlistItem/DataProvider/CustomizableOptionValue/Multiple.php b/vendor/magento/module-wishlist-graph-ql/Model/WishlistItem/DataProvider/CustomizableOptionValue/Multiple.php
new file mode 100644
index 000000000000..623e1d718012
--- /dev/null
+++ b/vendor/magento/module-wishlist-graph-ql/Model/WishlistItem/DataProvider/CustomizableOptionValue/Multiple.php
@@ -0,0 +1,88 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+declare(strict_types=1);
+
+namespace Magento\WishlistGraphQl\Model\WishlistItem\DataProvider\CustomizableOptionValue;
+
+use Magento\Catalog\Model\Product\Option;
+use Magento\Framework\GraphQl\Query\Uid;
+use Magento\Wishlist\Model\Item as WishlistItem;
+use Magento\Wishlist\Model\Item\Option as SelectedOption;
+use Magento\WishlistGraphQl\Model\WishlistItem\DataProvider\CustomizableOptionValueInterface;
+
+/**
+ * Multiple Option Value Data provider
+ */
+class Multiple implements CustomizableOptionValueInterface
+{
+    /**
+     * Option type name
+     */
+    private const OPTION_TYPE = 'custom-option';
+
+    /**
+     * @var PriceUnitLabel
+     */
+    private $priceUnitLabel;
+
+    /**
+     * @var Uid
+     */
+    private $uidEncoder;
+
+    /**
+     * @param PriceUnitLabel $priceUnitLabel
+     * @param Uid $uidEncoder
+     */
+    public function __construct(
+        PriceUnitLabel $priceUnitLabel,
+        Uid $uidEncoder
+    ) {
+        $this->priceUnitLabel = $priceUnitLabel;
+        $this->uidEncoder = $uidEncoder;
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function getData(
+        WishlistItem $wishlistItem,
+        Option $option,
+        SelectedOption $selectedOption
+    ): array {
+        $selectedOptionValueData = [];
+        $optionIds = explode(',', $selectedOption->getValue());
+
+        foreach ($optionIds as $optionId) {
+            $optionValue = $option->getValueById($optionId);
+            if ($optionValue) {
+                $priceValueUnits = $this->priceUnitLabel->getData($optionValue->getPriceType());
+
+                $optionDetails = [
+                    self::OPTION_TYPE,
+                    $option->getOptionId(),
+                    $optionValue->getOptionTypeId()
+                ];
+
+                $uuid = $this->uidEncoder->encode((string)implode('/', $optionDetails));
+
+                $selectedOptionValueData[] = [
+                    'id' => $selectedOption->getId(),
+                    'customizable_option_value_uid' => $uuid,
+                    'label' => $optionValue->getTitle(),
+                    'value' => $optionId,
+                    'price' => [
+                        'type' => strtoupper($optionValue->getPriceType()),
+                        'units' => $priceValueUnits,
+                        'value' => $optionValue->getPrice(),
+                    ],
+                ];
+            }
+        }
+
+        return $selectedOptionValueData;
+    }
+}
diff --git a/vendor/magento/module-wishlist-graph-ql/Model/WishlistItem/DataProvider/CustomizableOptionValue/PriceUnitLabel.php b/vendor/magento/module-wishlist-graph-ql/Model/WishlistItem/DataProvider/CustomizableOptionValue/PriceUnitLabel.php
new file mode 100644
index 000000000000..9a135fb6aa09
--- /dev/null
+++ b/vendor/magento/module-wishlist-graph-ql/Model/WishlistItem/DataProvider/CustomizableOptionValue/PriceUnitLabel.php
@@ -0,0 +1,63 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+declare(strict_types=1);
+
+namespace Magento\WishlistGraphQl\Model\WishlistItem\DataProvider\CustomizableOptionValue;
+
+use Magento\Catalog\Model\Config\Source\ProductPriceOptionsInterface;
+use Magento\Framework\Exception\NoSuchEntityException;
+use Magento\Store\Api\Data\StoreInterface;
+use Magento\Store\Model\Store;
+use Magento\Store\Model\StoreManagerInterface;
+
+/**
+ * Custom Option Data provider
+ */
+class PriceUnitLabel
+{
+    /**
+     * @var StoreManagerInterface
+     */
+    private $storeManager;
+
+    /**
+     * @param StoreManagerInterface $storeManager
+     */
+    public function __construct(
+        StoreManagerInterface $storeManager
+    ) {
+        $this->storeManager = $storeManager;
+    }
+
+    /**
+     * Retrieve price value unit
+     *
+     * @param string $priceType
+     * @return string
+     */
+    public function getData(string $priceType): string
+    {
+        if (ProductPriceOptionsInterface::VALUE_PERCENT == $priceType) {
+            return '%';
+        }
+
+        return $this->getCurrencySymbol();
+    }
+
+    /**
+     * Get currency symbol
+     *
+     * @return string
+     * @throws NoSuchEntityException
+     */
+    private function getCurrencySymbol(): string
+    {
+        /** @var Store|StoreInterface $store */
+        $store = $this->storeManager->getStore();
+
+        return $store->getBaseCurrency()->getCurrencySymbol();
+    }
+}
diff --git a/vendor/magento/module-wishlist-graph-ql/Model/WishlistItem/DataProvider/CustomizableOptionValue/Text.php b/vendor/magento/module-wishlist-graph-ql/Model/WishlistItem/DataProvider/CustomizableOptionValue/Text.php
new file mode 100644
index 000000000000..e34d16dbeb73
--- /dev/null
+++ b/vendor/magento/module-wishlist-graph-ql/Model/WishlistItem/DataProvider/CustomizableOptionValue/Text.php
@@ -0,0 +1,76 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+declare(strict_types=1);
+
+namespace Magento\WishlistGraphQl\Model\WishlistItem\DataProvider\CustomizableOptionValue;
+
+use Magento\Catalog\Model\Product\Option;
+use Magento\Catalog\Model\Product\Option\Type\Text as TextOptionType;
+use Magento\Framework\GraphQl\Query\Uid;
+use Magento\Wishlist\Model\Item as WishlistItem;
+use Magento\Wishlist\Model\Item\Option as SelectedOption;
+use Magento\WishlistGraphQl\Model\WishlistItem\DataProvider\CustomizableOptionValueInterface;
+
+/**
+ * @inheritdoc
+ */
+class Text implements CustomizableOptionValueInterface
+{
+    /**
+     * Option type name
+     */
+    private const OPTION_TYPE = 'custom-option';
+
+    /**
+     * @var PriceUnitLabel
+     */
+    private $priceUnitLabel;
+
+    /**
+     * @var Uid
+     */
+    private $uidEncoder;
+
+    /**
+     * @param PriceUnitLabel $priceUnitLabel
+     * @param Uid $uidEncoder
+     */
+    public function __construct(
+        PriceUnitLabel $priceUnitLabel,
+        Uid $uidEncoder
+    ) {
+        $this->priceUnitLabel = $priceUnitLabel;
+        $this->uidEncoder = $uidEncoder;
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function getData(
+        WishlistItem $wishlistItem,
+        Option $option,
+        SelectedOption $selectedOption
+    ): array {
+        /** @var TextOptionType $optionTypeRenderer */
+        $optionTypeRenderer = $option->groupFactory($option->getType());
+        $optionTypeRenderer->setOption($option);
+        $priceValueUnits = $this->priceUnitLabel->getData($option->getPriceType());
+        $uuid = $this->uidEncoder->encode(self::OPTION_TYPE . '/' . $option->getOptionId());
+
+        $selectedOptionValueData = [
+            'id' => $selectedOption->getId(),
+            'customizable_option_value_uid' => $uuid,
+            'label' => '',
+            'value' => $optionTypeRenderer->getFormattedOptionValue($selectedOption->getValue()),
+            'price' => [
+                'type' => strtoupper($option->getPriceType()),
+                'units' => $priceValueUnits,
+                'value' => $option->getPrice(),
+            ],
+        ];
+        return [$selectedOptionValueData];
+    }
+}
diff --git a/vendor/magento/module-wishlist-graph-ql/Model/WishlistItem/DataProvider/CustomizableOptionValueInterface.php b/vendor/magento/module-wishlist-graph-ql/Model/WishlistItem/DataProvider/CustomizableOptionValueInterface.php
new file mode 100644
index 000000000000..38789a0c1b69
--- /dev/null
+++ b/vendor/magento/module-wishlist-graph-ql/Model/WishlistItem/DataProvider/CustomizableOptionValueInterface.php
@@ -0,0 +1,32 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+declare(strict_types=1);
+
+namespace Magento\WishlistGraphQl\Model\WishlistItem\DataProvider;
+
+use Magento\Catalog\Model\Product\Option;
+use Magento\Wishlist\Model\Item as WishlistItem;
+use Magento\Wishlist\Model\Item\Option as SelectedOption;
+
+/**
+ * Customizable Option Value Data provider
+ */
+interface CustomizableOptionValueInterface
+{
+    /**
+     * Customizable Option Value Data Provider
+     *
+     * @param WishlistItem $wishlistItem
+     * @param Option $option
+     * @param SelectedOption $selectedOption
+     * @return array
+     */
+    public function getData(
+        WishlistItem $wishlistItem,
+        Option $option,
+        SelectedOption $selectedOption
+    ): array;
+}
diff --git a/vendor/magento/module-wishlist-graph-ql/etc/graphql/di.xml b/vendor/magento/module-wishlist-graph-ql/etc/graphql/di.xml
index 864a5088f500..d9727e109b0b 100644
--- a/vendor/magento/module-wishlist-graph-ql/etc/graphql/di.xml
+++ b/vendor/magento/module-wishlist-graph-ql/etc/graphql/di.xml
@@ -7,6 +7,7 @@
 -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
+    <preference for="Magento\WishlistGraphQl\Model\WishlistItem\DataProvider\CustomizableOptionValueInterface" type="Magento\WishlistGraphQl\Model\WishlistItem\DataProvider\CustomizableOptionValue\Composite" />
     <type name="Magento\StoreGraphQl\Model\Resolver\Store\StoreConfigDataProvider">
         <arguments>
             <argument name="extendedConfigData" xsi:type="array">
@@ -24,4 +25,19 @@
             </argument>
         </arguments>
     </type>
+    <type name="Magento\WishlistGraphQl\Model\WishlistItem\DataProvider\CustomizableOptionValue\Composite">
+        <arguments>
+            <argument name="customizableOptionValues" xsi:type="array">
+                <item name="field" xsi:type="string">Magento\WishlistGraphQl\Model\WishlistItem\DataProvider\CustomizableOptionValue\Text</item>
+                <item name="date" xsi:type="string">Magento\WishlistGraphQl\Model\WishlistItem\DataProvider\CustomizableOptionValue\Text</item>
+                <item name="time" xsi:type="string">Magento\WishlistGraphQl\Model\WishlistItem\DataProvider\CustomizableOptionValue\Text</item>
+                <item name="date_time" xsi:type="string">Magento\WishlistGraphQl\Model\WishlistItem\DataProvider\CustomizableOptionValue\Text</item>
+                <item name="area" xsi:type="string">Magento\WishlistGraphQl\Model\WishlistItem\DataProvider\CustomizableOptionValue\Text</item>
+                <item name="drop_down" xsi:type="string">Magento\WishlistGraphQl\Model\WishlistItem\DataProvider\CustomizableOptionValue\Dropdown</item>
+                <item name="radio" xsi:type="string">Magento\WishlistGraphQl\Model\WishlistItem\DataProvider\CustomizableOptionValue\Dropdown</item>
+                <item name="checkbox" xsi:type="string">Magento\WishlistGraphQl\Model\WishlistItem\DataProvider\CustomizableOptionValue\Multiple</item>
+                <item name="multiple" xsi:type="string">Magento\WishlistGraphQl\Model\WishlistItem\DataProvider\CustomizableOptionValue\Multiple</item>
+            </argument>
+        </arguments>
+    </type>
 </config>
diff --git a/vendor/magento/module-wishlist-graph-ql/etc/schema.graphqls b/vendor/magento/module-wishlist-graph-ql/etc/schema.graphqls
index bdc0acda4738..45934a129c25 100644
--- a/vendor/magento/module-wishlist-graph-ql/etc/schema.graphqls
+++ b/vendor/magento/module-wishlist-graph-ql/etc/schema.graphqls
@@ -40,7 +40,7 @@ interface WishlistItemInterface @typeResolver(class: "Magento\\WishlistGraphQl\\
     description: String  @doc(description: "The description of the item.")
     added_at: String!  @doc(description: "The date and time the item was added to the wish list.")
     product: ProductInterface @doc(description: "Product details of the wish list item.") @resolver(class: "\\Magento\\WishlistGraphQl\\Model\\Resolver\\ProductResolver")
-    customizable_options: [SelectedCustomizableOption]! @doc(description: "Custom options selected for the wish list item.")
+    customizable_options: [SelectedCustomizableOption]! @resolver(class: "Magento\\WishlistGraphQl\\Model\\Resolver\\CustomizableOptions") @doc(description: "Custom options selected for the wish list item.")
 }
 
 type WishlistItems @doc(description: "Contains an array of items in a wish list.") {
