normalisedExtensionName = $normalisedExtensionName; } /** @phpstan-assert-if-true non-empty-string $extensionName */ public static function isValidExtensionName(string $extensionName): bool { return preg_match(self::VALID_PACKAGE_NAME_REGEX, $extensionName) >= 1; } public static function determineFromComposerPackage(PackageInterface $package): self { $phpExt = $package->getPhpExt(); if ( $phpExt === null || ! array_key_exists('extension-name', $phpExt) || ! is_string($phpExt['extension-name']) || $phpExt['extension-name'] === '' ) { $packageNameParts = explode('/', $package->getPrettyName()); Assert::count($packageNameParts, 2, 'Expected a package name like vendor/package for ' . $package->getPrettyName()); return self::normaliseFromString($packageNameParts[1]); } return self::normaliseFromString($phpExt['extension-name']); } public static function normaliseFromString(string $extensionName): self { if (str_starts_with($extensionName, 'ext-')) { return new self(substr($extensionName, strlen('ext-'))); } return new self($extensionName); } /** @return non-empty-string */ public function name(): string { return $this->normalisedExtensionName; } /** @return non-empty-string */ public function nameWithExtPrefix(): string { return 'ext-' . $this->normalisedExtensionName; } /** @return non-empty-string */ public function phpFormattedExtensionName(): string { return match ($this->name()) { 'core' => 'Core', 'spl' => 'SPL', 'phar' => 'Phar', 'reflection' => 'Reflection', 'pdo' => 'PDO', 'ffi' => 'FFI', 'opcache' => 'Zend OPcache', 'simplexml' => 'SimpleXML', default => $this->name(), }; } }