Skip to content

Instantly share code, notes, and snippets.

@sasezaki
Created October 10, 2025 10:33
Show Gist options
  • Select an option

  • Save sasezaki/579be9abfe9aeeb1324b605ba321db44 to your computer and use it in GitHub Desktop.

Select an option

Save sasezaki/579be9abfe9aeeb1324b605ba321db44 to your computer and use it in GitHub Desktop.
diff --git a/src/Adapters/Archive/Detectors/AuthorName.php b/src/Adapters/Archive/Detectors/AuthorName.php
index 3aef8b7..400be60 100644
--- a/src/Adapters/Archive/Detectors/AuthorName.php
+++ b/src/Adapters/Archive/Detectors/AuthorName.php
@@ -3,14 +3,15 @@ declare(strict_types = 1);
namespace Embed\Adapters\Archive\Detectors;
-use Embed\Adapters\Archive\Extractor;
use Embed\Detectors\AuthorName as Detector;
-class AuthorName extends Detector
+/**
+ * @extends Detector<\Embed\Adapters\Archive\Extractor>
+ */
+final class AuthorName extends Detector
{
public function detect(): ?string
{
- /** @var Extractor $extractor */
$extractor = $this->extractor;
$api = $extractor->getApi();
diff --git a/src/Adapters/Archive/Detectors/Code.php b/src/Adapters/Archive/Detectors/Code.php
index 1840621..33f3a3b 100644
--- a/src/Adapters/Archive/Detectors/Code.php
+++ b/src/Adapters/Archive/Detectors/Code.php
@@ -8,7 +8,10 @@ use Embed\EmbedCode;
use function Embed\html;
use function Embed\matchPath;
-class Code extends Detector
+/**
+ * @extends Detector<\Embed\Adapters\Archive\Extractor>
+ */
+final class Code extends Detector
{
public function detect(): ?EmbedCode
{
diff --git a/src/Adapters/Archive/Detectors/Description.php b/src/Adapters/Archive/Detectors/Description.php
index baffbba..91f5f4e 100644
--- a/src/Adapters/Archive/Detectors/Description.php
+++ b/src/Adapters/Archive/Detectors/Description.php
@@ -3,14 +3,15 @@ declare(strict_types = 1);
namespace Embed\Adapters\Archive\Detectors;
-use Embed\Adapters\Archive\Extractor;
use Embed\Detectors\Description as Detector;
-class Description extends Detector
+/**
+ * @extends Detector<\Embed\Adapters\Archive\Extractor>
+ */
+final class Description extends Detector
{
public function detect(): ?string
{
- /** @var Extractor $extractor */
$extractor = $this->extractor;
$api = $extractor->getApi();
diff --git a/src/Adapters/Archive/Detectors/ProviderName.php b/src/Adapters/Archive/Detectors/ProviderName.php
index e8a632a..da006b8 100644
--- a/src/Adapters/Archive/Detectors/ProviderName.php
+++ b/src/Adapters/Archive/Detectors/ProviderName.php
@@ -5,7 +5,10 @@ namespace Embed\Adapters\Archive\Detectors;
use Embed\Detectors\ProviderName as Detector;
-class ProviderName extends Detector
+/**
+ * @extends Detector<\Embed\Adapters\Archive\Extractor>
+ */
+final class ProviderName extends Detector
{
public function detect(): string
{
diff --git a/src/Adapters/Archive/Detectors/PublishedTime.php b/src/Adapters/Archive/Detectors/PublishedTime.php
index 0d298d9..74149a8 100644
--- a/src/Adapters/Archive/Detectors/PublishedTime.php
+++ b/src/Adapters/Archive/Detectors/PublishedTime.php
@@ -4,14 +4,15 @@ declare(strict_types = 1);
namespace Embed\Adapters\Archive\Detectors;
use DateTime;
-use Embed\Adapters\Archive\Extractor;
use Embed\Detectors\PublishedTime as Detector;
-class PublishedTime extends Detector
+/**
+ * @extends Detector<\Embed\Adapters\Archive\Extractor>
+ */
+final class PublishedTime extends Detector
{
public function detect(): ?DateTime
{
- /** @var Extractor $extractor */
$extractor = $this->extractor;
$api = $extractor->getApi();
diff --git a/src/Adapters/Archive/Detectors/Title.php b/src/Adapters/Archive/Detectors/Title.php
index 328ed05..6511b19 100644
--- a/src/Adapters/Archive/Detectors/Title.php
+++ b/src/Adapters/Archive/Detectors/Title.php
@@ -3,14 +3,15 @@ declare(strict_types = 1);
namespace Embed\Adapters\Archive\Detectors;
-use Embed\Adapters\Archive\Extractor;
use Embed\Detectors\Title as Detector;
-class Title extends Detector
+/**
+ * @extends Detector<\Embed\Adapters\Archive\Extractor>
+ */
+final class Title extends Detector
{
public function detect(): ?string
{
- /** @var Extractor $extractor */
$extractor = $this->extractor;
$api = $extractor->getApi();
diff --git a/src/Adapters/Archive/Extractor.php b/src/Adapters/Archive/Extractor.php
index ae99596..482e13a 100644
--- a/src/Adapters/Archive/Extractor.php
+++ b/src/Adapters/Archive/Extractor.php
@@ -9,6 +9,9 @@ use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\UriInterface;
+/**
+ * @template-extends Base<\Embed\Detectors\Detector<self>>
+ */
class Extractor extends Base
{
private Api $api;
@@ -28,9 +31,6 @@ class Extractor extends Base
return $this->api;
}
- /**
- * @return array<string, \Embed\Detectors\Detector>
- */
public function createCustomDetectors(): array
{
return [
diff --git a/src/Adapters/Bandcamp/Detectors/ProviderName.php b/src/Adapters/Bandcamp/Detectors/ProviderName.php
index 74575ae..a52c98a 100644
--- a/src/Adapters/Bandcamp/Detectors/ProviderName.php
+++ b/src/Adapters/Bandcamp/Detectors/ProviderName.php
@@ -5,6 +5,9 @@ namespace Embed\Adapters\Bandcamp\Detectors;
use Embed\Detectors\ProviderName as Detector;
+/**
+ * @extends Detector<\Embed\Adapters\Bandcamp\Extractor>
+ */
class ProviderName extends Detector
{
public function detect(): string
diff --git a/src/Adapters/Bandcamp/Extractor.php b/src/Adapters/Bandcamp/Extractor.php
index 4375d9c..94e0353 100644
--- a/src/Adapters/Bandcamp/Extractor.php
+++ b/src/Adapters/Bandcamp/Extractor.php
@@ -5,11 +5,11 @@ namespace Embed\Adapters\Bandcamp;
use Embed\Extractor as Base;
+/**
+ * @template-extends Base<\Embed\Detectors\Detector<self>>
+ */
class Extractor extends Base
{
- /**
- * @return array<string, \Embed\Detectors\Detector>
- */
public function createCustomDetectors(): array
{
return [
diff --git a/src/Adapters/CadenaSer/Detectors/Code.php b/src/Adapters/CadenaSer/Detectors/Code.php
index 0715ef2..bf70e66 100644
--- a/src/Adapters/CadenaSer/Detectors/Code.php
+++ b/src/Adapters/CadenaSer/Detectors/Code.php
@@ -9,6 +9,9 @@ use Embed\EmbedCode;
use function Embed\html;
use function Embed\matchPath;
+/**
+ * @extends Detector<\Embed\Adapters\CadenaSer\Extractor>
+ */
class Code extends Detector
{
public function detect(): ?EmbedCode
diff --git a/src/Adapters/CadenaSer/Extractor.php b/src/Adapters/CadenaSer/Extractor.php
index 63d1b63..e6d05ef 100644
--- a/src/Adapters/CadenaSer/Extractor.php
+++ b/src/Adapters/CadenaSer/Extractor.php
@@ -5,11 +5,11 @@ namespace Embed\Adapters\CadenaSer;
use Embed\Extractor as Base;
+/**
+ * @template-extends Base<\Embed\Detectors\Detector<self>>
+ */
class Extractor extends Base
{
- /**
- * @return array<string, \Embed\Detectors\Detector>
- */
public function createCustomDetectors(): array
{
return [
diff --git a/src/Adapters/Facebook/Detectors/Title.php b/src/Adapters/Facebook/Detectors/Title.php
index 8d05113..298d263 100644
--- a/src/Adapters/Facebook/Detectors/Title.php
+++ b/src/Adapters/Facebook/Detectors/Title.php
@@ -5,6 +5,9 @@ namespace Embed\Adapters\Facebook\Detectors;
use Embed\Detectors\Title as Detector;
+/**
+ * @extends Detector<\Embed\Adapters\Facebook\Extractor>
+ */
class Title extends Detector
{
/**
diff --git a/src/Adapters/Facebook/Extractor.php b/src/Adapters/Facebook/Extractor.php
index 9d24eeb..9b8e4fd 100644
--- a/src/Adapters/Facebook/Extractor.php
+++ b/src/Adapters/Facebook/Extractor.php
@@ -8,7 +8,7 @@ use Embed\Extractor as Base;
class Extractor extends Base
{
/**
- * @return array<string, \Embed\Detectors\Detector>
+ * @return array{title: Detectors\Title}
*/
public function createCustomDetectors(): array
{
diff --git a/src/Adapters/Flickr/Detectors/Code.php b/src/Adapters/Flickr/Detectors/Code.php
index 273a0d6..9f14eb1 100644
--- a/src/Adapters/Flickr/Detectors/Code.php
+++ b/src/Adapters/Flickr/Detectors/Code.php
@@ -9,6 +9,9 @@ use Embed\EmbedCode;
use function Embed\html;
use function Embed\matchPath;
+/**
+ * @extends Detector<\Embed\Adapters\Flickr\Extractor>
+ */
class Code extends Detector
{
public function detect(): ?EmbedCode
diff --git a/src/Adapters/Flickr/Extractor.php b/src/Adapters/Flickr/Extractor.php
index 263b873..0a4369c 100644
--- a/src/Adapters/Flickr/Extractor.php
+++ b/src/Adapters/Flickr/Extractor.php
@@ -5,11 +5,11 @@ namespace Embed\Adapters\Flickr;
use Embed\Extractor as Base;
+/**
+ * @template-extends Base<\Embed\Detectors\Detector<self>>
+ */
class Extractor extends Base
{
- /**
- * @return array<string, \Embed\Detectors\Detector>
- */
public function createCustomDetectors(): array
{
return [
diff --git a/src/Adapters/Gist/Detectors/AuthorName.php b/src/Adapters/Gist/Detectors/AuthorName.php
index 214910f..2aee6dc 100644
--- a/src/Adapters/Gist/Detectors/AuthorName.php
+++ b/src/Adapters/Gist/Detectors/AuthorName.php
@@ -3,14 +3,15 @@ declare(strict_types = 1);
namespace Embed\Adapters\Gist\Detectors;
-use Embed\Adapters\Gist\Extractor;
use Embed\Detectors\AuthorName as Detector;
+/**
+ * @extends Detector<\Embed\Adapters\Gist\Extractor>
+ */
class AuthorName extends Detector
{
public function detect(): ?string
{
- /** @var Extractor $extractor */
$extractor = $this->extractor;
$api = $extractor->getApi();
diff --git a/src/Adapters/Gist/Detectors/AuthorUrl.php b/src/Adapters/Gist/Detectors/AuthorUrl.php
index 0060136..d9bae2a 100644
--- a/src/Adapters/Gist/Detectors/AuthorUrl.php
+++ b/src/Adapters/Gist/Detectors/AuthorUrl.php
@@ -3,15 +3,16 @@ declare(strict_types = 1);
namespace Embed\Adapters\Gist\Detectors;
-use Embed\Adapters\Gist\Extractor;
use Embed\Detectors\AuthorUrl as Detector;
use Psr\Http\Message\UriInterface;
+/**
+ * @extends Detector<\Embed\Adapters\Gist\Extractor>
+ */
class AuthorUrl extends Detector
{
public function detect(): ?UriInterface
{
- /** @var Extractor $extractor */
$extractor = $this->extractor;
$api = $extractor->getApi();
$owner = $api->str('owner');
diff --git a/src/Adapters/Gist/Detectors/Code.php b/src/Adapters/Gist/Detectors/Code.php
index b7df106..28d510f 100644
--- a/src/Adapters/Gist/Detectors/Code.php
+++ b/src/Adapters/Gist/Detectors/Code.php
@@ -3,11 +3,13 @@ declare(strict_types = 1);
namespace Embed\Adapters\Gist\Detectors;
-use Embed\Adapters\Gist\Extractor;
use Embed\Detectors\Code as Detector;
use Embed\EmbedCode;
use function Embed\html;
+/**
+ * @extends Detector<\Embed\Adapters\Gist\Extractor>
+ */
class Code extends Detector
{
public function detect(): ?EmbedCode
@@ -18,7 +20,6 @@ class Code extends Detector
private function fallback(): ?EmbedCode
{
- /** @var Extractor $extractor */
$extractor = $this->extractor;
$api = $extractor->getApi();
diff --git a/src/Adapters/Gist/Detectors/PublishedTime.php b/src/Adapters/Gist/Detectors/PublishedTime.php
index d49c5da..775b6ce 100644
--- a/src/Adapters/Gist/Detectors/PublishedTime.php
+++ b/src/Adapters/Gist/Detectors/PublishedTime.php
@@ -4,14 +4,15 @@ declare(strict_types = 1);
namespace Embed\Adapters\Gist\Detectors;
use DateTime;
-use Embed\Adapters\Gist\Extractor;
use Embed\Detectors\PublishedTime as Detector;
+/**
+ * @extends Detector<\Embed\Adapters\Gist\Extractor>
+ */
class PublishedTime extends Detector
{
public function detect(): ?DateTime
{
- /** @var Extractor $extractor */
$extractor = $this->extractor;
$api = $extractor->getApi();
diff --git a/src/Adapters/Gist/Extractor.php b/src/Adapters/Gist/Extractor.php
index 369ad17..088f874 100644
--- a/src/Adapters/Gist/Extractor.php
+++ b/src/Adapters/Gist/Extractor.php
@@ -9,6 +9,9 @@ use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\UriInterface;
+/**
+ * @template-extends Base<\Embed\Detectors\Detector<self>>
+ */
class Extractor extends Base
{
private Api $api;
@@ -28,9 +31,6 @@ class Extractor extends Base
return $this->api;
}
- /**
- * @return array<string, \Embed\Detectors\Detector>
- */
public function createCustomDetectors(): array
{
return [
diff --git a/src/Adapters/Github/Detectors/Code.php b/src/Adapters/Github/Detectors/Code.php
index e3adc4d..03cb9a3 100644
--- a/src/Adapters/Github/Detectors/Code.php
+++ b/src/Adapters/Github/Detectors/Code.php
@@ -8,6 +8,9 @@ use Embed\EmbedCode;
use function Embed\html;
use function Embed\matchPath;
+/**
+ * @extends Detector<\Embed\Adapters\Github\Extractor>
+ */
class Code extends Detector
{
public function detect(): ?EmbedCode
diff --git a/src/Adapters/Github/Extractor.php b/src/Adapters/Github/Extractor.php
index 1976388..6762be8 100644
--- a/src/Adapters/Github/Extractor.php
+++ b/src/Adapters/Github/Extractor.php
@@ -5,11 +5,11 @@ namespace Embed\Adapters\Github;
use Embed\Extractor as Base;
+/**
+ * @template-extends Base<\Embed\Detectors\Detector<self>>
+ */
class Extractor extends Base
{
- /**
- * @return array<string, \Embed\Detectors\Detector>
- */
public function createCustomDetectors(): array
{
return [
diff --git a/src/Adapters/Ideone/Detectors/Code.php b/src/Adapters/Ideone/Detectors/Code.php
index e14c027..6459d86 100644
--- a/src/Adapters/Ideone/Detectors/Code.php
+++ b/src/Adapters/Ideone/Detectors/Code.php
@@ -7,6 +7,9 @@ use Embed\Detectors\Code as Detector;
use Embed\EmbedCode;
use function Embed\html;
+/**
+ * @extends Detector<\Embed\Adapters\Ideone\Extractor>
+ */
class Code extends Detector
{
public function detect(): ?EmbedCode
diff --git a/src/Adapters/Ideone/Extractor.php b/src/Adapters/Ideone/Extractor.php
index 1581c0a..2dc9116 100644
--- a/src/Adapters/Ideone/Extractor.php
+++ b/src/Adapters/Ideone/Extractor.php
@@ -5,11 +5,11 @@ namespace Embed\Adapters\Ideone;
use Embed\Extractor as Base;
+/**
+ * @template-extends Base<\Embed\Detectors\Detector<self>>
+ */
class Extractor extends Base
{
- /**
- * @return array<string, \Embed\Detectors\Detector>
- */
public function createCustomDetectors(): array
{
return [
diff --git a/src/Adapters/ImageShack/Detectors/AuthorName.php b/src/Adapters/ImageShack/Detectors/AuthorName.php
index f77bbbc..8eeed2d 100644
--- a/src/Adapters/ImageShack/Detectors/AuthorName.php
+++ b/src/Adapters/ImageShack/Detectors/AuthorName.php
@@ -6,11 +6,13 @@ namespace Embed\Adapters\ImageShack\Detectors;
use Embed\Adapters\ImageShack\Extractor;
use Embed\Detectors\AuthorName as Detector;
+/**
+ * @extends Detector<\Embed\Adapters\ImageShack\Extractor>
+ */
class AuthorName extends Detector
{
public function detect(): ?string
{
- /** @var Extractor $extractor */
$extractor = $this->extractor;
$api = $extractor->getApi();
diff --git a/src/Adapters/ImageShack/Detectors/AuthorUrl.php b/src/Adapters/ImageShack/Detectors/AuthorUrl.php
index 598e319..7fcd0b0 100644
--- a/src/Adapters/ImageShack/Detectors/AuthorUrl.php
+++ b/src/Adapters/ImageShack/Detectors/AuthorUrl.php
@@ -3,15 +3,16 @@ declare(strict_types = 1);
namespace Embed\Adapters\ImageShack\Detectors;
-use Embed\Adapters\ImageShack\Extractor;
use Embed\Detectors\AuthorUrl as Detector;
use Psr\Http\Message\UriInterface;
+/**
+ * @extends Detector<\Embed\Adapters\ImageShack\Extractor>
+ */
class AuthorUrl extends Detector
{
public function detect(): ?UriInterface
{
- /** @var Extractor $extractor */
$extractor = $this->extractor;
$api = $extractor->getApi();
$owner = $api->str('owner', 'username');
diff --git a/src/Adapters/ImageShack/Detectors/Description.php b/src/Adapters/ImageShack/Detectors/Description.php
index ecd7af6..0ebd1df 100644
--- a/src/Adapters/ImageShack/Detectors/Description.php
+++ b/src/Adapters/ImageShack/Detectors/Description.php
@@ -3,14 +3,15 @@ declare(strict_types = 1);
namespace Embed\Adapters\ImageShack\Detectors;
-use Embed\Adapters\ImageShack\Extractor;
use Embed\Detectors\Description as Detector;
+/**
+ * @extends Detector<\Embed\Adapters\ImageShack\Extractor>
+ */
class Description extends Detector
{
public function detect(): ?string
{
- /** @var Extractor $extractor */
$extractor = $this->extractor;
$api = $extractor->getApi();
diff --git a/src/Adapters/ImageShack/Detectors/Image.php b/src/Adapters/ImageShack/Detectors/Image.php
index c11e891..531e306 100644
--- a/src/Adapters/ImageShack/Detectors/Image.php
+++ b/src/Adapters/ImageShack/Detectors/Image.php
@@ -3,15 +3,16 @@ declare(strict_types = 1);
namespace Embed\Adapters\ImageShack\Detectors;
-use Embed\Adapters\ImageShack\Extractor;
use Embed\Detectors\Image as Detector;
use Psr\Http\Message\UriInterface;
+/**
+ * @extends Detector<\Embed\Adapters\ImageShack\Extractor>
+ */
class Image extends Detector
{
public function detect(): ?UriInterface
{
- /** @var Extractor $extractor */
$extractor = $this->extractor;
$api = $extractor->getApi();
diff --git a/src/Adapters/ImageShack/Detectors/ProviderName.php b/src/Adapters/ImageShack/Detectors/ProviderName.php
index 661d45e..fffe0d3 100644
--- a/src/Adapters/ImageShack/Detectors/ProviderName.php
+++ b/src/Adapters/ImageShack/Detectors/ProviderName.php
@@ -5,6 +5,9 @@ namespace Embed\Adapters\ImageShack\Detectors;
use Embed\Detectors\ProviderName as Detector;
+/**
+ * @extends Detector<\Embed\Adapters\ImageShack\Extractor>
+ */
class ProviderName extends Detector
{
public function detect(): string
diff --git a/src/Adapters/ImageShack/Detectors/PublishedTime.php b/src/Adapters/ImageShack/Detectors/PublishedTime.php
index 8224860..ad1f803 100644
--- a/src/Adapters/ImageShack/Detectors/PublishedTime.php
+++ b/src/Adapters/ImageShack/Detectors/PublishedTime.php
@@ -7,11 +7,13 @@ use DateTime;
use Embed\Adapters\ImageShack\Extractor;
use Embed\Detectors\PublishedTime as Detector;
+/**
+ * @extends Detector<\Embed\Adapters\ImageShack\Extractor>
+ */
class PublishedTime extends Detector
{
public function detect(): ?DateTime
{
- /** @var Extractor $extractor */
$extractor = $this->extractor;
$api = $extractor->getApi();
diff --git a/src/Adapters/ImageShack/Detectors/Title.php b/src/Adapters/ImageShack/Detectors/Title.php
index 4d74f0c..6f53df5 100644
--- a/src/Adapters/ImageShack/Detectors/Title.php
+++ b/src/Adapters/ImageShack/Detectors/Title.php
@@ -3,14 +3,15 @@ declare(strict_types = 1);
namespace Embed\Adapters\ImageShack\Detectors;
-use Embed\Adapters\ImageShack\Extractor;
use Embed\Detectors\Title as Detector;
+/**
+ * @extends Detector<\Embed\Adapters\ImageShack\Extractor>
+ */
class Title extends Detector
{
public function detect(): ?string
{
- /** @var Extractor $extractor */
$extractor = $this->extractor;
$api = $extractor->getApi();
diff --git a/src/Adapters/ImageShack/Extractor.php b/src/Adapters/ImageShack/Extractor.php
index 327bf9b..416228d 100644
--- a/src/Adapters/ImageShack/Extractor.php
+++ b/src/Adapters/ImageShack/Extractor.php
@@ -9,6 +9,9 @@ use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\UriInterface;
+/**
+ * @template-extends Base<\Embed\Detectors\Detector<self>>
+ */
class Extractor extends Base
{
private Api $api;
@@ -28,9 +31,6 @@ class Extractor extends Base
return $this->api;
}
- /**
- * @return array<string, \Embed\Detectors\Detector>
- */
public function createCustomDetectors(): array
{
return [
diff --git a/src/Adapters/Instagram/Extractor.php b/src/Adapters/Instagram/Extractor.php
index 8e0e73e..c7a7802 100644
--- a/src/Adapters/Instagram/Extractor.php
+++ b/src/Adapters/Instagram/Extractor.php
@@ -9,6 +9,9 @@ use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\UriInterface;
+/**
+ * @template-extends Base<\Embed\Detectors\Detector<self>>
+ */
class Extractor extends Base
{
public function __construct(UriInterface $uri, RequestInterface $request, ResponseInterface $response, Crawler $crawler)
diff --git a/src/Adapters/Pinterest/Detectors/Code.php b/src/Adapters/Pinterest/Detectors/Code.php
index b033ec7..626975b 100644
--- a/src/Adapters/Pinterest/Detectors/Code.php
+++ b/src/Adapters/Pinterest/Detectors/Code.php
@@ -8,6 +8,9 @@ use Embed\EmbedCode;
use function Embed\html;
use function Embed\matchPath;
+/**
+ * @extends Detector<\Embed\Adapters\Pinterest\Extractor>
+ */
class Code extends Detector
{
public function detect(): ?EmbedCode
diff --git a/src/Adapters/Pinterest/Extractor.php b/src/Adapters/Pinterest/Extractor.php
index 39aa79d..5c627aa 100644
--- a/src/Adapters/Pinterest/Extractor.php
+++ b/src/Adapters/Pinterest/Extractor.php
@@ -5,11 +5,11 @@ namespace Embed\Adapters\Pinterest;
use Embed\Extractor as Base;
+/**
+ * @template-extends Base<\Embed\Detectors\Detector<self>>
+ */
class Extractor extends Base
{
- /**
- * @return array<string, \Embed\Detectors\Detector>
- */
public function createCustomDetectors(): array
{
return [
diff --git a/src/Adapters/Sassmeister/Detectors/Code.php b/src/Adapters/Sassmeister/Detectors/Code.php
index f9b39b6..f421a52 100644
--- a/src/Adapters/Sassmeister/Detectors/Code.php
+++ b/src/Adapters/Sassmeister/Detectors/Code.php
@@ -8,6 +8,9 @@ use Embed\EmbedCode;
use function Embed\html;
use function Embed\matchPath;
+/**
+ * @extends Detector<\Embed\Adapters\Sassmeister\Extractor>
+ */
class Code extends Detector
{
public function detect(): ?EmbedCode
diff --git a/src/Adapters/Sassmeister/Extractor.php b/src/Adapters/Sassmeister/Extractor.php
index 718e79e..4e3cde5 100644
--- a/src/Adapters/Sassmeister/Extractor.php
+++ b/src/Adapters/Sassmeister/Extractor.php
@@ -5,11 +5,11 @@ namespace Embed\Adapters\Sassmeister;
use Embed\Extractor as Base;
+/**
+ * @template-extends Base<\Embed\Detectors\Detector<self>>
+ */
class Extractor extends Base
{
- /**
- * @return array<string, \Embed\Detectors\Detector>
- */
public function createCustomDetectors(): array
{
return [
diff --git a/src/Adapters/Slides/Detectors/Code.php b/src/Adapters/Slides/Detectors/Code.php
index 8e6ffb9..2db4364 100644
--- a/src/Adapters/Slides/Detectors/Code.php
+++ b/src/Adapters/Slides/Detectors/Code.php
@@ -8,6 +8,9 @@ use Embed\Detectors\Code as Detector;
use Embed\EmbedCode;
use function Embed\html;
+/**
+ * @extends Detector<\Embed\Adapters\Slides\Extractor>
+ */
class Code extends Detector
{
public function detect(): EmbedCode
diff --git a/src/Adapters/Slides/Extractor.php b/src/Adapters/Slides/Extractor.php
index 949cc7b..c7d9daa 100644
--- a/src/Adapters/Slides/Extractor.php
+++ b/src/Adapters/Slides/Extractor.php
@@ -5,11 +5,11 @@ namespace Embed\Adapters\Slides;
use Embed\Extractor as Base;
+/**
+ * @template-extends Base<\Embed\Detectors\Detector<self>>
+ */
class Extractor extends Base
{
- /**
- * @return array<string, \Embed\Detectors\Detector>
- */
public function createCustomDetectors(): array
{
return [
diff --git a/src/Adapters/Snipplr/Detectors/Code.php b/src/Adapters/Snipplr/Detectors/Code.php
index 2663039..a496862 100644
--- a/src/Adapters/Snipplr/Detectors/Code.php
+++ b/src/Adapters/Snipplr/Detectors/Code.php
@@ -8,6 +8,9 @@ use Embed\EmbedCode;
use function Embed\html;
use function Embed\matchPath;
+/**
+ * @extends Detector<\Embed\Adapters\Snipplr\Extractor>
+ */
class Code extends Detector
{
public function detect(): ?EmbedCode
diff --git a/src/Adapters/Snipplr/Extractor.php b/src/Adapters/Snipplr/Extractor.php
index 06ab210..fc34955 100644
--- a/src/Adapters/Snipplr/Extractor.php
+++ b/src/Adapters/Snipplr/Extractor.php
@@ -5,11 +5,11 @@ namespace Embed\Adapters\Snipplr;
use Embed\Extractor as Base;
+/**
+ * @template-extends Base<\Embed\Detectors\Detector<self>>
+ */
class Extractor extends Base
{
- /**
- * @return array<string, \Embed\Detectors\Detector>
- */
public function createCustomDetectors(): array
{
return [
diff --git a/src/Adapters/Twitch/Detectors/Code.php b/src/Adapters/Twitch/Detectors/Code.php
index 2780dc4..b06f39f 100644
--- a/src/Adapters/Twitch/Detectors/Code.php
+++ b/src/Adapters/Twitch/Detectors/Code.php
@@ -7,6 +7,9 @@ use Embed\Detectors\Code as Detector;
use Embed\EmbedCode;
use function Embed\html;
+/**
+ * @extends Detector<\Embed\Adapters\Twitch\Extractor>
+ */
class Code extends Detector
{
public function detect(): ?EmbedCode
diff --git a/src/Adapters/Twitch/Extractor.php b/src/Adapters/Twitch/Extractor.php
index 990f62b..f54552d 100644
--- a/src/Adapters/Twitch/Extractor.php
+++ b/src/Adapters/Twitch/Extractor.php
@@ -5,11 +5,11 @@ namespace Embed\Adapters\Twitch;
use Embed\Extractor as Base;
+/**
+ * @template-extends Base<\Embed\Detectors\Detector<self>>
+ */
class Extractor extends Base
{
- /**
- * @return array<string, \Embed\Detectors\Detector>
- */
public function createCustomDetectors(): array
{
return [
diff --git a/src/Adapters/Twitter/Detectors/AuthorName.php b/src/Adapters/Twitter/Detectors/AuthorName.php
index d9c050d..a97d2d4 100644
--- a/src/Adapters/Twitter/Detectors/AuthorName.php
+++ b/src/Adapters/Twitter/Detectors/AuthorName.php
@@ -6,11 +6,13 @@ namespace Embed\Adapters\Twitter\Detectors;
use Embed\Adapters\Twitter\Extractor;
use Embed\Detectors\AuthorName as Detector;
+/**
+ * @extends Detector<\Embed\Adapters\Twitter\Extractor>
+ */
class AuthorName extends Detector
{
public function detect(): ?string
{
- /** @var Extractor $extractor */
$extractor = $this->extractor;
$api = $extractor->getApi();
diff --git a/src/Adapters/Twitter/Detectors/AuthorUrl.php b/src/Adapters/Twitter/Detectors/AuthorUrl.php
index c30c47d..d2b38b9 100644
--- a/src/Adapters/Twitter/Detectors/AuthorUrl.php
+++ b/src/Adapters/Twitter/Detectors/AuthorUrl.php
@@ -7,11 +7,13 @@ use Embed\Adapters\Twitter\Extractor;
use Embed\Detectors\AuthorUrl as Detector;
use Psr\Http\Message\UriInterface;
+/**
+ * @extends Detector<\Embed\Adapters\Twitter\Extractor>
+ */
class AuthorUrl extends Detector
{
public function detect(): ?UriInterface
{
- /** @var Extractor $extractor */
$extractor = $this->extractor;
$api = $extractor->getApi();
$username = $api->str('includes', 'users', '0', 'username');
diff --git a/src/Adapters/Twitter/Detectors/Description.php b/src/Adapters/Twitter/Detectors/Description.php
index d61db34..fb01d2a 100644
--- a/src/Adapters/Twitter/Detectors/Description.php
+++ b/src/Adapters/Twitter/Detectors/Description.php
@@ -6,11 +6,13 @@ namespace Embed\Adapters\Twitter\Detectors;
use Embed\Adapters\Twitter\Extractor;
use Embed\Detectors\Description as Detector;
+/**
+ * @extends Detector<\Embed\Adapters\Twitter\Extractor>
+ */
class Description extends Detector
{
public function detect(): ?string
{
- /** @var Extractor $extractor */
$extractor = $this->extractor;
$api = $extractor->getApi();
diff --git a/src/Adapters/Twitter/Detectors/Image.php b/src/Adapters/Twitter/Detectors/Image.php
index 75fad8e..4e5879e 100644
--- a/src/Adapters/Twitter/Detectors/Image.php
+++ b/src/Adapters/Twitter/Detectors/Image.php
@@ -7,11 +7,13 @@ use Embed\Adapters\Twitter\Extractor;
use Embed\Detectors\Image as Detector;
use Psr\Http\Message\UriInterface;
+/**
+ * @extends Detector<\Embed\Adapters\Twitter\Extractor>
+ */
class Image extends Detector
{
public function detect(): ?UriInterface
{
- /** @var Extractor $extractor */
$extractor = $this->extractor;
$api = $extractor->getApi();
$preview = $api->url('includes', 'media', '0', 'preview_image_url');
diff --git a/src/Adapters/Twitter/Detectors/ProviderName.php b/src/Adapters/Twitter/Detectors/ProviderName.php
index e5c99c0..93bed7a 100644
--- a/src/Adapters/Twitter/Detectors/ProviderName.php
+++ b/src/Adapters/Twitter/Detectors/ProviderName.php
@@ -5,6 +5,9 @@ namespace Embed\Adapters\Twitter\Detectors;
use Embed\Detectors\ProviderName as Detector;
+/**
+ * @extends Detector<\Embed\Adapters\Twitter\Extractor>
+ */
class ProviderName extends Detector
{
public function detect(): string
diff --git a/src/Adapters/Twitter/Detectors/PublishedTime.php b/src/Adapters/Twitter/Detectors/PublishedTime.php
index 49cef11..a889738 100644
--- a/src/Adapters/Twitter/Detectors/PublishedTime.php
+++ b/src/Adapters/Twitter/Detectors/PublishedTime.php
@@ -7,11 +7,13 @@ use DateTime;
use Embed\Adapters\Twitter\Extractor;
use Embed\Detectors\PublishedTime as Detector;
+/**
+ * @extends Detector<\Embed\Adapters\Twitter\Extractor>
+ */
class PublishedTime extends Detector
{
public function detect(): ?DateTime
{
- /** @var Extractor $extractor */
$extractor = $this->extractor;
$api = $extractor->getApi();
diff --git a/src/Adapters/Twitter/Detectors/Title.php b/src/Adapters/Twitter/Detectors/Title.php
index 36e8c12..d37231b 100644
--- a/src/Adapters/Twitter/Detectors/Title.php
+++ b/src/Adapters/Twitter/Detectors/Title.php
@@ -6,11 +6,13 @@ namespace Embed\Adapters\Twitter\Detectors;
use Embed\Adapters\Twitter\Extractor;
use Embed\Detectors\Title as Detector;
+/**
+ * @extends Detector<\Embed\Adapters\Twitter\Extractor>
+ */
class Title extends Detector
{
public function detect(): ?string
{
- /** @var Extractor $extractor */
$extractor = $this->extractor;
$api = $extractor->getApi();
$name = $api->str('includes', 'users', '0', 'name');
diff --git a/src/Adapters/Twitter/Extractor.php b/src/Adapters/Twitter/Extractor.php
index 0908b5a..d505e5e 100644
--- a/src/Adapters/Twitter/Extractor.php
+++ b/src/Adapters/Twitter/Extractor.php
@@ -9,6 +9,9 @@ use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\UriInterface;
+/**
+ * @template-extends Base<\Embed\Detectors\Detector<self>>
+ */
class Extractor extends Base
{
private Api $api;
@@ -28,9 +31,6 @@ class Extractor extends Base
return $this->api;
}
- /**
- * @return array<string, \Embed\Detectors\Detector>
- */
public function createCustomDetectors(): array
{
return [
diff --git a/src/Adapters/Wikipedia/Detectors/Description.php b/src/Adapters/Wikipedia/Detectors/Description.php
index fdb18dd..102c4d0 100644
--- a/src/Adapters/Wikipedia/Detectors/Description.php
+++ b/src/Adapters/Wikipedia/Detectors/Description.php
@@ -3,14 +3,15 @@ declare(strict_types = 1);
namespace Embed\Adapters\Wikipedia\Detectors;
-use Embed\Adapters\Wikipedia\Extractor;
use Embed\Detectors\Description as Detector;
+/**
+ * @extends Detector<\Embed\Adapters\Wikipedia\Extractor>
+ */
class Description extends Detector
{
public function detect(): ?string
{
- /** @var Extractor $extractor */
$extractor = $this->extractor;
$api = $extractor->getApi();
diff --git a/src/Adapters/Wikipedia/Detectors/Title.php b/src/Adapters/Wikipedia/Detectors/Title.php
index bfe001a..413c587 100644
--- a/src/Adapters/Wikipedia/Detectors/Title.php
+++ b/src/Adapters/Wikipedia/Detectors/Title.php
@@ -6,11 +6,13 @@ namespace Embed\Adapters\Wikipedia\Detectors;
use Embed\Adapters\Wikipedia\Extractor;
use Embed\Detectors\Title as Detector;
+/**
+ * @extends Detector<\Embed\Adapters\Wikipedia\Extractor>
+ */
class Title extends Detector
{
public function detect(): ?string
{
- /** @var Extractor $extractor */
$extractor = $this->extractor;
$api = $extractor->getApi();
diff --git a/src/Adapters/Wikipedia/Extractor.php b/src/Adapters/Wikipedia/Extractor.php
index 75afb5e..c432707 100644
--- a/src/Adapters/Wikipedia/Extractor.php
+++ b/src/Adapters/Wikipedia/Extractor.php
@@ -9,6 +9,9 @@ use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\UriInterface;
+/**
+ * @template-extends Base<\Embed\Detectors\Detector<self>>
+ */
class Extractor extends Base
{
private Api $api;
@@ -28,9 +31,6 @@ class Extractor extends Base
return $this->api;
}
- /**
- * @return array<string, \Embed\Detectors\Detector>
- */
public function createCustomDetectors(): array
{
return [
diff --git a/src/Adapters/Youtube/Detectors/Feeds.php b/src/Adapters/Youtube/Detectors/Feeds.php
index 0bc9559..b63aeeb 100644
--- a/src/Adapters/Youtube/Detectors/Feeds.php
+++ b/src/Adapters/Youtube/Detectors/Feeds.php
@@ -8,6 +8,9 @@ use function Embed\getDirectory;
use function Embed\matchPath;
use Psr\Http\Message\UriInterface;
+/**
+ * @extends Detector<\Embed\Adapters\Youtube\Extractor>
+ */
class Feeds extends Detector
{
/**
diff --git a/src/Adapters/Youtube/Extractor.php b/src/Adapters/Youtube/Extractor.php
index ea43c12..1b81d63 100644
--- a/src/Adapters/Youtube/Extractor.php
+++ b/src/Adapters/Youtube/Extractor.php
@@ -5,11 +5,11 @@ namespace Embed\Adapters\Youtube;
use Embed\Extractor as Base;
+/**
+ * @template-extends Base<\Embed\Detectors\Detector<self>>
+ */
class Extractor extends Base
{
- /**
- * @return array<string, \Embed\Detectors\Detector>
- */
public function createCustomDetectors(): array
{
return [
diff --git a/src/Detectors/AuthorName.php b/src/Detectors/AuthorName.php
index 3d1dc67..a65881f 100644
--- a/src/Detectors/AuthorName.php
+++ b/src/Detectors/AuthorName.php
@@ -3,6 +3,10 @@ declare(strict_types = 1);
namespace Embed\Detectors;
+/**
+ * @template TExtractor of \Embed\Extractor
+ * @template-extends Detector<TExtractor>
+ */
class AuthorName extends Detector
{
public function detect(): ?string
diff --git a/src/Detectors/AuthorUrl.php b/src/Detectors/AuthorUrl.php
index c11f2af..9903e63 100644
--- a/src/Detectors/AuthorUrl.php
+++ b/src/Detectors/AuthorUrl.php
@@ -5,6 +5,10 @@ namespace Embed\Detectors;
use Psr\Http\Message\UriInterface;
+/**
+ * @template TExtractor of \Embed\Extractor
+ * @template-extends Detector<TExtractor>
+ */
class AuthorUrl extends Detector
{
public function detect(): ?UriInterface
diff --git a/src/Detectors/Cms.php b/src/Detectors/Cms.php
index 027de53..d3df134 100644
--- a/src/Detectors/Cms.php
+++ b/src/Detectors/Cms.php
@@ -3,6 +3,10 @@ declare(strict_types = 1);
namespace Embed\Detectors;
+/**
+ * @template TExtractor of \Embed\Extractor
+ * @template-extends Detector<TExtractor>
+ */
class Cms extends Detector
{
public const BLOGSPOT = 'blogspot';
diff --git a/src/Detectors/Code.php b/src/Detectors/Code.php
index 883ee85..870c82c 100644
--- a/src/Detectors/Code.php
+++ b/src/Detectors/Code.php
@@ -6,6 +6,10 @@ namespace Embed\Detectors;
use Embed\EmbedCode;
use function Embed\html;
+/**
+ * @template TExtractor of \Embed\Extractor
+ * @template-extends Detector<TExtractor>
+ */
class Code extends Detector
{
public function detect(): ?EmbedCode
diff --git a/src/Detectors/Description.php b/src/Detectors/Description.php
index 0fffdee..cc845af 100644
--- a/src/Detectors/Description.php
+++ b/src/Detectors/Description.php
@@ -3,6 +3,10 @@ declare(strict_types = 1);
namespace Embed\Detectors;
+/**
+ * @template TExtractor of \Embed\Extractor
+ * @template-extends Detector<TExtractor>
+ */
class Description extends Detector
{
public function detect(): ?string
diff --git a/src/Detectors/Detector.php b/src/Detectors/Detector.php
index ca67a7b..036087e 100644
--- a/src/Detectors/Detector.php
+++ b/src/Detectors/Detector.php
@@ -5,12 +5,19 @@ namespace Embed\Detectors;
use Embed\Extractor;
+/**
+ * @template TExtractor of Extractor
+ */
abstract class Detector
{
+ /** @var TExtractor */
protected Extractor $extractor;
/** @var array<string, mixed> */
private array $cache = [];
+ /**
+ * @param TExtractor $extractor
+ */
public function __construct(Extractor $extractor)
{
$this->extractor = $extractor;
diff --git a/src/Detectors/Favicon.php b/src/Detectors/Favicon.php
index dbeca1a..2e0b193 100644
--- a/src/Detectors/Favicon.php
+++ b/src/Detectors/Favicon.php
@@ -5,6 +5,10 @@ namespace Embed\Detectors;
use Psr\Http\Message\UriInterface;
+/**
+ * @template TExtractor of \Embed\Extractor
+ * @template-extends Detector<TExtractor>
+ */
class Favicon extends Detector
{
public function detect(): UriInterface
diff --git a/src/Detectors/Feeds.php b/src/Detectors/Feeds.php
index 8660726..b00c205 100644
--- a/src/Detectors/Feeds.php
+++ b/src/Detectors/Feeds.php
@@ -3,6 +3,10 @@ declare(strict_types = 1);
namespace Embed\Detectors;
+/**
+ * @template TExtractor of \Embed\Extractor
+ * @template-extends Detector<TExtractor>
+ */
class Feeds extends Detector
{
/** @var string[] */
diff --git a/src/Detectors/Icon.php b/src/Detectors/Icon.php
index 29f24d4..eae8147 100644
--- a/src/Detectors/Icon.php
+++ b/src/Detectors/Icon.php
@@ -5,6 +5,10 @@ namespace Embed\Detectors;
use Psr\Http\Message\UriInterface;
+/**
+ * @template TExtractor of \Embed\Extractor
+ * @template-extends Detector<TExtractor>
+ */
class Icon extends Detector
{
public function detect(): ?UriInterface
diff --git a/src/Detectors/Image.php b/src/Detectors/Image.php
index d7ffa4f..10c7ae7 100644
--- a/src/Detectors/Image.php
+++ b/src/Detectors/Image.php
@@ -5,6 +5,10 @@ namespace Embed\Detectors;
use Psr\Http\Message\UriInterface;
+/**
+ * @template TExtractor of \Embed\Extractor
+ * @template-extends Detector<TExtractor>
+ */
class Image extends Detector
{
public function detect(): ?UriInterface
diff --git a/src/Detectors/Keywords.php b/src/Detectors/Keywords.php
index a4ce5b9..472c9ed 100644
--- a/src/Detectors/Keywords.php
+++ b/src/Detectors/Keywords.php
@@ -3,6 +3,10 @@ declare(strict_types = 1);
namespace Embed\Detectors;
+/**
+ * @template TExtractor of \Embed\Extractor
+ * @template-extends Detector<TExtractor>
+ */
class Keywords extends Detector
{
/**
diff --git a/src/Detectors/Language.php b/src/Detectors/Language.php
index ed667db..b8dd1e4 100644
--- a/src/Detectors/Language.php
+++ b/src/Detectors/Language.php
@@ -3,6 +3,10 @@ declare(strict_types = 1);
namespace Embed\Detectors;
+/**
+ * @template TExtractor of \Embed\Extractor
+ * @template-extends Detector<TExtractor>
+ */
class Language extends Detector
{
public function detect(): ?string
diff --git a/src/Detectors/Languages.php b/src/Detectors/Languages.php
index eb765a6..5f899c1 100644
--- a/src/Detectors/Languages.php
+++ b/src/Detectors/Languages.php
@@ -5,6 +5,10 @@ namespace Embed\Detectors;
use function Embed\isEmpty;
+/**
+ * @template TExtractor of \Embed\Extractor
+ * @template-extends Detector<TExtractor>
+ */
class Languages extends Detector
{
/**
diff --git a/src/Detectors/License.php b/src/Detectors/License.php
index 3c74d29..a9cf26d 100644
--- a/src/Detectors/License.php
+++ b/src/Detectors/License.php
@@ -3,6 +3,10 @@ declare(strict_types = 1);
namespace Embed\Detectors;
+/**
+ * @template TExtractor of \Embed\Extractor
+ * @template-extends Detector<TExtractor>
+ */
class License extends Detector
{
public function detect(): ?string
diff --git a/src/Detectors/ProviderName.php b/src/Detectors/ProviderName.php
index 4ae7aa8..1340aa7 100644
--- a/src/Detectors/ProviderName.php
+++ b/src/Detectors/ProviderName.php
@@ -3,6 +3,10 @@ declare(strict_types = 1);
namespace Embed\Detectors;
+/**
+ * @template TExtractor of \Embed\Extractor
+ * @template-extends Detector<TExtractor>
+ */
class ProviderName extends Detector
{
/** @var string[] */
diff --git a/src/Detectors/ProviderUrl.php b/src/Detectors/ProviderUrl.php
index 7396fd5..9201179 100644
--- a/src/Detectors/ProviderUrl.php
+++ b/src/Detectors/ProviderUrl.php
@@ -5,6 +5,10 @@ namespace Embed\Detectors;
use Psr\Http\Message\UriInterface;
+/**
+ * @template TExtractor of \Embed\Extractor
+ * @template-extends Detector<TExtractor>
+ */
class ProviderUrl extends Detector
{
public function detect(): UriInterface
diff --git a/src/Detectors/PublishedTime.php b/src/Detectors/PublishedTime.php
index 5b9c097..c6ed932 100644
--- a/src/Detectors/PublishedTime.php
+++ b/src/Detectors/PublishedTime.php
@@ -5,6 +5,10 @@ namespace Embed\Detectors;
use DateTime;
+/**
+ * @template TExtractor of \Embed\Extractor
+ * @template-extends Detector<TExtractor>
+ */
class PublishedTime extends Detector
{
public function detect(): ?DateTime
diff --git a/src/Detectors/Redirect.php b/src/Detectors/Redirect.php
index 717bcf9..1f18437 100644
--- a/src/Detectors/Redirect.php
+++ b/src/Detectors/Redirect.php
@@ -5,6 +5,10 @@ namespace Embed\Detectors;
use Psr\Http\Message\UriInterface;
+/**
+ * @template TExtractor of \Embed\Extractor
+ * @template-extends Detector<TExtractor>
+ */
class Redirect extends Detector
{
public function detect(): ?UriInterface
diff --git a/src/Detectors/Title.php b/src/Detectors/Title.php
index cda77ba..7f38b00 100644
--- a/src/Detectors/Title.php
+++ b/src/Detectors/Title.php
@@ -3,6 +3,10 @@ declare(strict_types = 1);
namespace Embed\Detectors;
+/**
+ * @template TExtractor of \Embed\Extractor
+ * @template-extends Detector<TExtractor>
+ */
class Title extends Detector
{
public function detect(): ?string
diff --git a/src/Detectors/Url.php b/src/Detectors/Url.php
index 41f5acc..7771eef 100644
--- a/src/Detectors/Url.php
+++ b/src/Detectors/Url.php
@@ -5,6 +5,10 @@ namespace Embed\Detectors;
use Psr\Http\Message\UriInterface;
+/**
+ * @template TExtractor of \Embed\Extractor
+ * @template-extends Detector<TExtractor>
+ */
class Url extends Detector
{
public function detect(): UriInterface
diff --git a/src/Extractor.php b/src/Extractor.php
index ac8d6af..641968a 100644
--- a/src/Extractor.php
+++ b/src/Extractor.php
@@ -53,6 +53,8 @@ use Psr\Http\Message\UriInterface;
* @property UriInterface|null $redirect
* @property string|null $title
* @property UriInterface $url
+ *
+ * @template TDetector of Detector = Detector
*/
class Extractor
{
@@ -68,27 +70,45 @@ class Extractor
/** @var array<string, mixed> */
private array $settings = [];
- /** @var array<string, Detectors\Detector> */
+ /** @var array<string, Detectors\Detector<$this>> */
private array $customDetectors = [];
-
+ /** @var AuthorName<$this> */
protected AuthorName $authorName;
+ /** @var AuthorUrl<$this> */
protected AuthorUrl $authorUrl;
+ /** @var Cms<$this> */
protected Cms $cms;
+ /** @var Code<$this> */
protected Code $code;
+ /** @var Description<$this> */
protected Description $description;
+ /** @var Favicon<$this> */
protected Favicon $favicon;
+ /** @var Feeds<$this> */
protected Feeds $feeds;
+ /** @var Icon<$this> */
protected Icon $icon;
+ /** @var Image<$this> */
protected Image $image;
+ /** @var Keywords<$this> */
protected Keywords $keywords;
+ /** @var Language<$this> */
protected Language $language;
+ /** @var Languages<$this> */
protected Languages $languages;
+ /** @var License<$this> */
protected License $license;
+ /** @var ProviderName<$this> */
protected ProviderName $providerName;
+ /** @var ProviderUrl<$this> */
protected ProviderUrl $providerUrl;
+ /** @var PublishedTime<$this> */
protected PublishedTime $publishedTime;
+ /** @var Redirect<$this> */
protected Redirect $redirect;
+ /** @var Title<$this> */
protected Title $title;
+ /** @var Url<$this> */
protected Url $url;
public function __construct(UriInterface $uri, RequestInterface $request, ResponseInterface $response, Crawler $crawler)
@@ -150,13 +170,16 @@ class Extractor
}
/**
- * @return array<string, Detector>
+ * @return array<string, TDetector>
*/
public function createCustomDetectors(): array
{
return [];
}
+ /**
+ * @phpstan-param Detector<$this> $detector
+ */
public function addDetector(string $name, Detector $detector): void
{
$this->customDetectors[$name] = $detector;
diff --git a/src/ExtractorFactory.php b/src/ExtractorFactory.php
index f93c60a..dc43daa 100644
--- a/src/ExtractorFactory.php
+++ b/src/ExtractorFactory.php
@@ -10,6 +10,7 @@ use Psr\Http\Message\UriInterface;
class ExtractorFactory
{
+ /** @var class-string<Extractor> */
private string $default = Extractor::class;
/** @var array<string, class-string<Extractor>> */
private array $adapters = [
@@ -33,7 +34,7 @@ class ExtractorFactory
'twitter.com' => Adapters\Twitter\Extractor::class,
'x.com' => Adapters\Twitter\Extractor::class,
];
- /** @var array<string, class-string<Detectors\Detector>> */
+ /** @var array<string, class-string<Detectors\Detector<Extractor>>> */
private array $customDetectors = [];
/** @var array<string, mixed> */
private array $settings;
@@ -65,12 +66,10 @@ class ExtractorFactory
}
}
- /** @var Extractor $extractor */
$extractor = new $class($uri, $request, $response, $crawler);
$extractor->setSettings($this->settings);
foreach ($this->customDetectors as $name => $detectorClass) {
- /** @var Detectors\Detector */
$detector = new $detectorClass($extractor);
$extractor->addDetector($name, $detector);
}
@@ -91,7 +90,7 @@ class ExtractorFactory
}
/**
- * @param class-string<Detectors\Detector> $class
+ * @param class-string<Detectors\Detector<Extractor>> $class
*/
public function addDetector(string $name, string $class): void
{
@@ -103,6 +102,9 @@ class ExtractorFactory
unset($this->adapters[$pattern]);
}
+ /**
+ * @param class-string<Extractor> $class
+ */
public function setDefault(string $class): void
{
$this->default = $class;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment