diff --git a/core/modules/migrate/src/Plugin/NoSourcePluginDecorator.php b/core/modules/migrate/src/Plugin/NoSourcePluginDecorator.php
index aa2121eee2ecb9d90ad3bb471512af673a08b1e4..98a0c7cbc827a1e6836e1b2c6ea5a6a753590a12 100644
--- a/core/modules/migrate/src/Plugin/NoSourcePluginDecorator.php
+++ b/core/modules/migrate/src/Plugin/NoSourcePluginDecorator.php
@@ -36,7 +36,7 @@ public function getDefinitions() {
     /** @var \Drupal\Component\Plugin\PluginManagerInterface $source_plugin_manager */
     $source_plugin_manager = \Drupal::service('plugin.manager.migrate.source');
     return array_filter($this->decorated->getDefinitions(), function (array $definition) use ($source_plugin_manager) {
-      return $source_plugin_manager->hasDefinition($definition['source']['plugin']);
+      return !empty($definition['source']['plugin']) && $source_plugin_manager->hasDefinition($definition['source']['plugin']);
     });
   }
 
diff --git a/core/modules/migrate/tests/src/Unit/Plugin/NoSourcePluginDecoratorTest.php b/core/modules/migrate/tests/src/Unit/Plugin/NoSourcePluginDecoratorTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..aa1a50e3351db0f15e1a800d13a5cc8cfcab5791
--- /dev/null
+++ b/core/modules/migrate/tests/src/Unit/Plugin/NoSourcePluginDecoratorTest.php
@@ -0,0 +1,78 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Drupal\Tests\migrate\Unit\Plugin;
+
+use Drupal\Component\Plugin\Discovery\DiscoveryInterface;
+use Drupal\Core\DependencyInjection\ContainerBuilder;
+use Drupal\migrate\Plugin\MigrateSourcePluginManager;
+use Drupal\migrate\Plugin\NoSourcePluginDecorator;
+use Drupal\Tests\UnitTestCase;
+
+/**
+ * @coversDefaultClass \Drupal\migrate\Plugin\NoSourcePluginDecorator
+ * @group migrate
+ */
+class NoSourcePluginDecoratorTest extends UnitTestCase {
+
+  /**
+   * @covers ::getDefinitions
+   * @dataProvider providerGetDefinitions
+   */
+  public function testGetDefinitions(array $definition, bool $source_exists): void {
+    $source_manager = $this->createMock(MigrateSourcePluginManager::class);
+    $source_manager->expects($this->any())
+      ->method('hasDefinition')
+      ->willReturn($source_exists);
+    $container = new ContainerBuilder();
+    $container->set('plugin.manager.migrate.source', $source_manager);
+    \Drupal::setContainer($container);
+
+    $discovery_interface = $this->createMock(DiscoveryInterface::class);
+    $discovery_interface->expects($this->once())
+      ->method('getDefinitions')
+      ->willReturn([$definition]);
+
+    $decorator = new NoSourcePluginDecorator($discovery_interface);
+    $results = $decorator->getDefinitions();
+    if ($source_exists) {
+      $this->assertEquals([$definition], $results);
+    }
+    else {
+      $this->assertEquals([], $results);
+    }
+  }
+
+  /**
+   * Provides data for testGetDefinitions().
+   */
+  public static function providerGetDefinitions(): array {
+    return [
+      'source exists' => [
+        [
+          'source' => ['plugin' => 'valid_plugin'],
+          'process' => [],
+          'destination' => [],
+        ],
+        TRUE,
+      ],
+      'source does not exist' => [
+        [
+          'source' => ['plugin' => 'invalid_plugin'],
+          'process' => [],
+          'destination' => [],
+        ],
+        FALSE,
+      ],
+      'source is not defined' => [
+        [
+          'process' => [],
+          'destination' => [],
+        ],
+        FALSE,
+      ],
+    ];
+  }
+
+}