chore: 添加缺失的静态资源文件
添加多个前端界面所需的图片、字体、音频等静态资源文件,包括: - 管理员后台的图标、背景图、组件图片 - 移动端页面的商品图片、用户中心图片、活动图标 - 第三方库的示例图片和字体文件 - 浏览器兼容性配置文件 - 图标字体文件(eot、ttf、woff、woff2格式) 这些资源是前端界面正常显示所必需的,之前可能因版本控制忽略或遗漏而缺失。
This commit is contained in:
82
vendor/ergebnis/classy/src/Construct.php
vendored
Normal file
82
vendor/ergebnis/classy/src/Construct.php
vendored
Normal file
@@ -0,0 +1,82 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/**
|
||||
* Copyright (c) 2017-2022 Andreas Möller
|
||||
*
|
||||
* For the full copyright and license information, please view
|
||||
* the LICENSE.md file that was distributed with this source code.
|
||||
*
|
||||
* @see https://github.com/ergebnis/classy
|
||||
*/
|
||||
|
||||
namespace Ergebnis\Classy;
|
||||
|
||||
/**
|
||||
* @psalm-immutable
|
||||
*/
|
||||
final class Construct
|
||||
{
|
||||
private string $name;
|
||||
|
||||
/**
|
||||
* @var array<int, string>
|
||||
*/
|
||||
private array $fileNames = [];
|
||||
|
||||
private function __construct(string $name)
|
||||
{
|
||||
$this->name = $name;
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated Will be removed in the next major release.
|
||||
*
|
||||
* Returns a string representation of the construct.
|
||||
*/
|
||||
public function __toString(): string
|
||||
{
|
||||
return $this->name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new construct from a construct name.
|
||||
*/
|
||||
public static function fromName(string $name): self
|
||||
{
|
||||
return new self($name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the name of the construct.
|
||||
*/
|
||||
public function name(): string
|
||||
{
|
||||
return $this->name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an array of file names in which the construct is defined.
|
||||
*
|
||||
* @return array<int, string>
|
||||
*/
|
||||
public function fileNames(): array
|
||||
{
|
||||
return $this->fileNames;
|
||||
}
|
||||
|
||||
/**
|
||||
* Clones the construct and adds the file name to the list of files the construct is defined in.
|
||||
*/
|
||||
public function definedIn(string ...$fileNames): self
|
||||
{
|
||||
$instance = clone $this;
|
||||
|
||||
foreach ($fileNames as $fileName) {
|
||||
$instance->fileNames[] = $fileName;
|
||||
}
|
||||
|
||||
return $instance;
|
||||
}
|
||||
}
|
||||
256
vendor/ergebnis/classy/src/Constructs.php
vendored
Normal file
256
vendor/ergebnis/classy/src/Constructs.php
vendored
Normal file
@@ -0,0 +1,256 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/**
|
||||
* Copyright (c) 2017-2022 Andreas Möller
|
||||
*
|
||||
* For the full copyright and license information, please view
|
||||
* the LICENSE.md file that was distributed with this source code.
|
||||
*
|
||||
* @see https://github.com/ergebnis/classy
|
||||
*/
|
||||
|
||||
namespace Ergebnis\Classy;
|
||||
|
||||
final class Constructs
|
||||
{
|
||||
/**
|
||||
* Returns an array of names of classy constructs (classes, interfaces, traits) found in source.
|
||||
*
|
||||
* @throws Exception\ParseError
|
||||
*
|
||||
* @return array<int, Construct>
|
||||
*/
|
||||
public static function fromSource(string $source): array
|
||||
{
|
||||
$constructs = [];
|
||||
|
||||
try {
|
||||
$sequence = \token_get_all(
|
||||
$source,
|
||||
\TOKEN_PARSE,
|
||||
);
|
||||
} catch (\ParseError $exception) {
|
||||
throw Exception\ParseError::fromParseError($exception);
|
||||
}
|
||||
|
||||
$count = \count($sequence);
|
||||
$namespacePrefix = '';
|
||||
|
||||
$namespaceSegmentOrNamespaceTokens = [
|
||||
\T_STRING,
|
||||
\T_NAME_QUALIFIED,
|
||||
];
|
||||
|
||||
$classyTokens = [
|
||||
\T_CLASS,
|
||||
\T_INTERFACE,
|
||||
\T_TRAIT,
|
||||
];
|
||||
|
||||
// https://wiki.php.net/rfc/enumerations
|
||||
if (\PHP_VERSION_ID >= 80100 && \defined('T_ENUM')) {
|
||||
$classyTokens = [
|
||||
\T_CLASS,
|
||||
\T_ENUM,
|
||||
\T_INTERFACE,
|
||||
\T_TRAIT,
|
||||
];
|
||||
}
|
||||
|
||||
for ($index = 0; $index < $count; ++$index) {
|
||||
$token = $sequence[$index];
|
||||
|
||||
// collect namespace name
|
||||
if (\is_array($token) && \T_NAMESPACE === $token[0]) {
|
||||
$namespaceSegments = [];
|
||||
|
||||
// collect namespace segments
|
||||
for ($index = self::significantAfter($index, $sequence, $count); $index < $count; ++$index) {
|
||||
$token = $sequence[$index];
|
||||
|
||||
if (\is_array($token) && !\in_array($token[0], $namespaceSegmentOrNamespaceTokens, true)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$content = self::content($token);
|
||||
|
||||
if (\in_array($content, ['{', ';'], true)) {
|
||||
break;
|
||||
}
|
||||
|
||||
$namespaceSegments[] = $content;
|
||||
}
|
||||
|
||||
$namespace = \implode('\\', $namespaceSegments);
|
||||
$namespacePrefix = $namespace . '\\';
|
||||
}
|
||||
|
||||
// skip non-classy tokens
|
||||
if (!\is_array($token) || !\in_array($token[0], $classyTokens, true)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// skip anonymous classes
|
||||
if (\T_CLASS === $token[0]) {
|
||||
$current = self::significantBefore($index, $sequence);
|
||||
$token = $sequence[$current];
|
||||
|
||||
// if significant token before T_CLASS is T_NEW, it's an instantiation of an anonymous class
|
||||
if (\is_array($token) && \T_NEW === $token[0]) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
$index = self::significantAfter($index, $sequence, $count);
|
||||
$token = $sequence[$index];
|
||||
|
||||
$constructs[] = Construct::fromName($namespacePrefix . self::content($token));
|
||||
}
|
||||
|
||||
\usort($constructs, static function (Construct $a, Construct $b): int {
|
||||
return \strcmp(
|
||||
$a->name(),
|
||||
$b->name(),
|
||||
);
|
||||
});
|
||||
|
||||
return $constructs;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an array of constructs defined in a directory.
|
||||
*
|
||||
* @throws Exception\DirectoryDoesNotExist
|
||||
* @throws Exception\MultipleDefinitionsFound
|
||||
*
|
||||
* @return array<int, Construct>
|
||||
*/
|
||||
public static function fromDirectory(string $directory): array
|
||||
{
|
||||
if (!\is_dir($directory)) {
|
||||
throw Exception\DirectoryDoesNotExist::fromDirectory($directory);
|
||||
}
|
||||
|
||||
$iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator(
|
||||
$directory,
|
||||
\RecursiveDirectoryIterator::FOLLOW_SYMLINKS,
|
||||
));
|
||||
|
||||
$constructs = [];
|
||||
|
||||
foreach ($iterator as $fileInfo) {
|
||||
/** @var \SplFileInfo $fileInfo */
|
||||
if (!$fileInfo->isFile()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($fileInfo->getBasename('.php') === $fileInfo->getBasename()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
/** @var string $fileName */
|
||||
$fileName = $fileInfo->getRealPath();
|
||||
|
||||
/** @var string $source */
|
||||
$source = \file_get_contents($fileName);
|
||||
|
||||
try {
|
||||
$constructsFromFile = self::fromSource($source);
|
||||
} catch (Exception\ParseError $exception) {
|
||||
throw Exception\ParseError::fromFileNameAndParseError(
|
||||
$fileName,
|
||||
$exception,
|
||||
);
|
||||
}
|
||||
|
||||
if (0 === \count($constructsFromFile)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
foreach ($constructsFromFile as $construct) {
|
||||
$name = $construct->name();
|
||||
|
||||
if (\array_key_exists($name, $constructs)) {
|
||||
$construct = $constructs[$name];
|
||||
}
|
||||
|
||||
$constructs[$name] = $construct->definedIn($fileName);
|
||||
}
|
||||
}
|
||||
|
||||
\usort($constructs, static function (Construct $a, Construct $b): int {
|
||||
return \strcmp(
|
||||
$a->name(),
|
||||
$b->name(),
|
||||
);
|
||||
});
|
||||
|
||||
$constructsWithMultipleDefinitions = \array_filter($constructs, static function (Construct $construct): bool {
|
||||
return 1 < \count($construct->fileNames());
|
||||
});
|
||||
|
||||
if (0 < \count($constructsWithMultipleDefinitions)) {
|
||||
throw Exception\MultipleDefinitionsFound::fromConstructs($constructsWithMultipleDefinitions);
|
||||
}
|
||||
|
||||
return \array_values($constructs);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the index of the significant token after the index.
|
||||
*
|
||||
* @param array<int, array{0: int, 1: string, 2: int}|string> $sequence
|
||||
*/
|
||||
private static function significantAfter(int $index, array $sequence, int $count): int
|
||||
{
|
||||
for ($current = $index + 1; $current < $count; ++$current) {
|
||||
$token = $sequence[$current];
|
||||
|
||||
if (\is_array($token) && \in_array($token[0], [\T_COMMENT, \T_DOC_COMMENT, \T_WHITESPACE], true)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
return $current;
|
||||
}
|
||||
|
||||
throw Exception\ShouldNotHappen::create();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the index of the significant token after the index.
|
||||
*
|
||||
* @param array<int, array{0: int, 1: string, 2: int}|string> $sequence
|
||||
*/
|
||||
private static function significantBefore(
|
||||
int $index,
|
||||
array $sequence,
|
||||
): int {
|
||||
for ($current = $index - 1; -1 < $current; --$current) {
|
||||
$token = $sequence[$current];
|
||||
|
||||
if (\is_array($token) && \in_array($token[0], [\T_COMMENT, \T_DOC_COMMENT, \T_WHITESPACE], true)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
return $current;
|
||||
}
|
||||
|
||||
throw Exception\ShouldNotHappen::create();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the string content of a token.
|
||||
*
|
||||
* @param array{0: int, 1: string, 2: int}|string $token
|
||||
*/
|
||||
private static function content($token): string
|
||||
{
|
||||
if (\is_array($token)) {
|
||||
return $token[1];
|
||||
}
|
||||
|
||||
return $token;
|
||||
}
|
||||
}
|
||||
42
vendor/ergebnis/classy/src/Exception/DirectoryDoesNotExist.php
vendored
Normal file
42
vendor/ergebnis/classy/src/Exception/DirectoryDoesNotExist.php
vendored
Normal file
@@ -0,0 +1,42 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/**
|
||||
* Copyright (c) 2017-2022 Andreas Möller
|
||||
*
|
||||
* For the full copyright and license information, please view
|
||||
* the LICENSE.md file that was distributed with this source code.
|
||||
*
|
||||
* @see https://github.com/ergebnis/classy
|
||||
*/
|
||||
|
||||
namespace Ergebnis\Classy\Exception;
|
||||
|
||||
final class DirectoryDoesNotExist extends \InvalidArgumentException implements ExceptionInterface
|
||||
{
|
||||
private string $directory = '';
|
||||
|
||||
/**
|
||||
* Returns a new exception from a directory.
|
||||
*/
|
||||
public static function fromDirectory(string $directory): self
|
||||
{
|
||||
$exception = new self(\sprintf(
|
||||
'Directory "%s" does not exist.',
|
||||
$directory,
|
||||
));
|
||||
|
||||
$exception->directory = $directory;
|
||||
|
||||
return $exception;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the directory.
|
||||
*/
|
||||
public function directory(): string
|
||||
{
|
||||
return $this->directory;
|
||||
}
|
||||
}
|
||||
18
vendor/ergebnis/classy/src/Exception/ExceptionInterface.php
vendored
Normal file
18
vendor/ergebnis/classy/src/Exception/ExceptionInterface.php
vendored
Normal file
@@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/**
|
||||
* Copyright (c) 2017-2022 Andreas Möller
|
||||
*
|
||||
* For the full copyright and license information, please view
|
||||
* the LICENSE.md file that was distributed with this source code.
|
||||
*
|
||||
* @see https://github.com/ergebnis/classy
|
||||
*/
|
||||
|
||||
namespace Ergebnis\Classy\Exception;
|
||||
|
||||
interface ExceptionInterface extends \Throwable
|
||||
{
|
||||
}
|
||||
57
vendor/ergebnis/classy/src/Exception/MultipleDefinitionsFound.php
vendored
Normal file
57
vendor/ergebnis/classy/src/Exception/MultipleDefinitionsFound.php
vendored
Normal file
@@ -0,0 +1,57 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/**
|
||||
* Copyright (c) 2017-2022 Andreas Möller
|
||||
*
|
||||
* For the full copyright and license information, please view
|
||||
* the LICENSE.md file that was distributed with this source code.
|
||||
*
|
||||
* @see https://github.com/ergebnis/classy
|
||||
*/
|
||||
|
||||
namespace Ergebnis\Classy\Exception;
|
||||
|
||||
use Ergebnis\Classy\Construct;
|
||||
|
||||
final class MultipleDefinitionsFound extends \RuntimeException implements ExceptionInterface
|
||||
{
|
||||
/**
|
||||
* @var array<int, Construct>
|
||||
*/
|
||||
private array $constructs = [];
|
||||
|
||||
/**
|
||||
* Returns a new exception from constructs.
|
||||
*
|
||||
* @param array<int, Construct> $constructs
|
||||
*/
|
||||
public static function fromConstructs(array $constructs): self
|
||||
{
|
||||
$exception = new self(\sprintf(
|
||||
"Multiple definitions have been found for the following constructs:\n\n%s",
|
||||
\implode("\n", \array_map(static function (Construct $construct): string {
|
||||
return \sprintf(
|
||||
' - "%s" defined in "%s"',
|
||||
$construct->name(),
|
||||
\implode('", "', $construct->fileNames()),
|
||||
);
|
||||
}, $constructs)),
|
||||
));
|
||||
|
||||
$exception->constructs = $constructs;
|
||||
|
||||
return $exception;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an array of constructs.
|
||||
*
|
||||
* @return array<int, Construct>
|
||||
*/
|
||||
public function constructs(): array
|
||||
{
|
||||
return $this->constructs;
|
||||
}
|
||||
}
|
||||
41
vendor/ergebnis/classy/src/Exception/ParseError.php
vendored
Normal file
41
vendor/ergebnis/classy/src/Exception/ParseError.php
vendored
Normal file
@@ -0,0 +1,41 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/**
|
||||
* Copyright (c) 2017-2022 Andreas Möller
|
||||
*
|
||||
* For the full copyright and license information, please view
|
||||
* the LICENSE.md file that was distributed with this source code.
|
||||
*
|
||||
* @see https://github.com/ergebnis/classy
|
||||
*/
|
||||
|
||||
namespace Ergebnis\Classy\Exception;
|
||||
|
||||
final class ParseError extends \ParseError implements ExceptionInterface
|
||||
{
|
||||
public static function fromParseError(\ParseError $exception): self
|
||||
{
|
||||
return new self(
|
||||
$exception->getMessage(),
|
||||
0,
|
||||
$exception,
|
||||
);
|
||||
}
|
||||
|
||||
public static function fromFileNameAndParseError(
|
||||
string $fileName,
|
||||
\ParseError $exception,
|
||||
): self {
|
||||
return new self(
|
||||
\sprintf(
|
||||
'A parse error occurred when parsing "%s": "%s".',
|
||||
$fileName,
|
||||
$exception->getMessage(),
|
||||
),
|
||||
0,
|
||||
$exception,
|
||||
);
|
||||
}
|
||||
}
|
||||
22
vendor/ergebnis/classy/src/Exception/ShouldNotHappen.php
vendored
Normal file
22
vendor/ergebnis/classy/src/Exception/ShouldNotHappen.php
vendored
Normal file
@@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/**
|
||||
* Copyright (c) 2017-2022 Andreas Möller
|
||||
*
|
||||
* For the full copyright and license information, please view
|
||||
* the LICENSE.md file that was distributed with this source code.
|
||||
*
|
||||
* @see https://github.com/ergebnis/classy
|
||||
*/
|
||||
|
||||
namespace Ergebnis\Classy\Exception;
|
||||
|
||||
final class ShouldNotHappen extends \LogicException implements ExceptionInterface
|
||||
{
|
||||
public static function create(): self
|
||||
{
|
||||
return new self('This should not happen.');
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user