├── src ├── Contracts │ ├── Modifiable.php │ ├── Processable.php │ ├── Hookable.php │ └── ResolvesRequest.php ├── Exceptions │ ├── ConverterException.php │ ├── UnresolvableResourceException.php │ └── ConfigurationException.php ├── Processors │ ├── DefaultProcessor.php │ ├── ModelProcessor.php │ └── ResourceProcessor.php ├── Converters │ ├── ModelConverter.php │ ├── Modifiers │ │ └── UnsetRelationsModifier.php │ ├── DefaultConverter.php │ ├── ResourceConverter.php │ └── AbstractConverter.php ├── Actions │ ├── ResolveRequest.php │ ├── PersistTypescriptTypes.php │ ├── ConvertEntities.php │ ├── ProcessEntities.php │ ├── TranspileToTypescript.php │ ├── ResolveClassesInPhpFile.php │ ├── ResolveProcessableEntities.php │ ├── ListModelRelations.php │ └── ResolveMixinFromClass.php ├── Commands │ └── RuntypeCommand.php ├── Runtype.php ├── RuntypeServiceProvider.php ├── Values │ ├── TypescriptType.php │ └── TypescriptProperty.php ├── Types │ └── Types.php └── RuntypeConfig.php ├── CHANGELOG.md ├── package.json ├── LICENSE.md ├── composer.json ├── README.md ├── config └── runtype.php └── yarn.lock /src/Contracts/Modifiable.php: -------------------------------------------------------------------------------- 1 | $modifier])); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/Processors/DefaultProcessor.php: -------------------------------------------------------------------------------- 1 | addProperties($this->convertPropertiesToTypes(collect($instance->toArray()))); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/Converters/Modifiers/UnsetRelationsModifier.php: -------------------------------------------------------------------------------- 1 | unsetRelations(); 13 | } 14 | 15 | return $instance; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/Actions/ResolveRequest.php: -------------------------------------------------------------------------------- 1 | setUserResolver(fn () => Auth::user()) 15 | : request(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/Converters/DefaultConverter.php: -------------------------------------------------------------------------------- 1 | getName()); 14 | } 15 | 16 | return new TypescriptType(get_class($instance)); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/Exceptions/UnresolvableResourceException.php: -------------------------------------------------------------------------------- 1 | $resource])); 10 | } 11 | 12 | public static function resourceDoesNotExist(string $resource): self 13 | { 14 | return new self(__('Class :resource does not exist', ['resource' => $resource])); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/Processors/ModelProcessor.php: -------------------------------------------------------------------------------- 1 | handle($model); 16 | 17 | /** @var Model $instance */ 18 | $instance = $model::first() 19 | ->with($relations) 20 | ->first(); 21 | 22 | return $instance; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/Commands/RuntypeCommand.php: -------------------------------------------------------------------------------- 1 | confirmToProceed(); 21 | 22 | (new Runtype($config))->generate(); 23 | 24 | $this->info('Typescript types generated'); 25 | 26 | return self::SUCCESS; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/Converters/ResourceConverter.php: -------------------------------------------------------------------------------- 1 | resource instanceof ReflectionClass) { 21 | return $type; 22 | } 23 | 24 | $resourceData = collect($instance->resolve($this->getRequest())); 25 | 26 | $type = $type->addProperties($this->convertPropertiesToTypes($resourceData)); 27 | 28 | return $type; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | All notable changes to `runtype` will be documented in this file. 4 | 5 | ## Ensure optional types are processed correctly - 2025-05-27 6 | 7 | This update ensures that optional types are correctly added to the export i.e. `name?: boolean`. 8 | 9 | ## Added support for request user resolving in resources - 2025-04-01 10 | 11 | This updated binds the user to the request when present, allowing us to do checks based on the user in resources. 12 | 13 | ## Updated PHP-parser to latest version - 2024-04-02 14 | 15 | ### What's Changed 16 | 17 | * Update nikic/php-parser requirement from ^4.15 to ^5.0 by @dependabot in https://github.com/vagebnd/runtype/pull/9 18 | 19 | **Full Changelog**: https://github.com/vagebnd/runtype/compare/0.2.0...0.2.1 20 | 21 | ## Added support for L10 - 2024-04-02 22 | 23 | **Full Changelog**: https://github.com/vagebnd/runtype/compare/0.1.0...0.2.0 24 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "module", 3 | "name": "runtype", 4 | "version": "0.0.1", 5 | "main": "index.js", 6 | "repository": "git@github.com:vagebnd/runtype.git", 7 | "author": "Gianluca Riggio ", 8 | "license": "MIT", 9 | "devDependencies": { 10 | "sitemap": "^7.1.1", 11 | "vitepress": "^1.0.2", 12 | "vue": "^3.2.47" 13 | }, 14 | "scripts": { 15 | "docs:dev": "vitepress dev docs", 16 | "docs:build": "vitepress build docs && cp docs/google9e68245e28ca1b36.html docs/.vitepress/dist", 17 | "docs:preview": "vitepress preview docs" 18 | }, 19 | "prettier": { 20 | "printWidth": 120, 21 | "tabWidth": 2, 22 | "trailingComma": "all", 23 | "singleQuote": true, 24 | "semi": false, 25 | "arrowParens": "always", 26 | "quoteProps": "consistent", 27 | "overrides": [ 28 | { 29 | "files": "composer.json", 30 | "options": { 31 | "tabWidth": 4 32 | } 33 | } 34 | ] 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/Actions/PersistTypescriptTypes.php: -------------------------------------------------------------------------------- 1 | config = $config; 16 | } 17 | 18 | /** @param Collection $types */ 19 | public function handle(collection $types) 20 | { 21 | $this->ensureOutputFileExists(); 22 | 23 | file_put_contents( 24 | $this->config->getOutputFile(), 25 | (new TranspileToTypescript)->handle($types) 26 | ); 27 | } 28 | 29 | protected function ensureOutputFileExists(): void 30 | { 31 | if (! file_exists(pathinfo($this->config->getOutputFile(), PATHINFO_DIRNAME))) { 32 | mkdir(pathinfo($this->config->getOutputFile(), PATHINFO_DIRNAME), 0755, true); 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/Actions/ConvertEntities.php: -------------------------------------------------------------------------------- 1 | map(fn ($entity) => $this->convertEntity($entity)); 18 | } 19 | 20 | private function convertEntity($entity) 21 | { 22 | $converter = collect($this->config->getConverters()) 23 | ->filter(function (string $converter, string $entityClass) use ($entity) { 24 | return is_subclass_of($entity, $entityClass); 25 | }) 26 | ->first(default: $this->getDefaultConverter()); 27 | 28 | return (new $converter($this->config))->convert($entity); 29 | } 30 | 31 | private function getDefaultConverter() 32 | { 33 | return DefaultConverter::class; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/Exceptions/ConfigurationException.php: -------------------------------------------------------------------------------- 1 | $class])); 18 | } 19 | 20 | public static function replacementTypeShouldBeString(string $class, $replacement) 21 | { 22 | return new self(__('Replacement type for :class should be string, got :type', [ 23 | 'class' => $class, 'type' => gettype($replacement), 24 | ])); 25 | } 26 | 27 | public static function classDoesNotImplementModifiable(string $class) 28 | { 29 | return new self(__('Class :class does not implement :modifiable', [ 30 | 'class' => $class, 31 | 'modifiable' => Modifiable::class, 32 | ])); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/Processors/ResourceProcessor.php: -------------------------------------------------------------------------------- 1 | handle($class); 21 | 22 | $valueInstance = (new ProcessEntities($this->config))->handle([$resolvedClass]); 23 | 24 | if (! $this->isResourceCollection($class)) { 25 | return $class::make($valueInstance->first()); 26 | } 27 | 28 | return $class::make($valueInstance->values()); 29 | } 30 | 31 | private function isResourceCollection(string $class): bool 32 | { 33 | return (new ReflectionClass($class))->isSubclassOf(ResourceCollection::class); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) vagebond 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/Runtype.php: -------------------------------------------------------------------------------- 1 | config = $config; 18 | } 19 | 20 | public function generate() 21 | { 22 | $hooks = $this->config->getHooks(); 23 | 24 | foreach ($hooks as $hook) { 25 | $hook->before(); 26 | } 27 | 28 | $entities = (new ResolveProcessableEntities(new Finder, $this->config))->handle(); 29 | $instances = (new ProcessEntities($this->config))->handle($entities); 30 | $typescriptTypes = (new ConvertEntities($this->config))->handle($instances); 31 | 32 | (new PersistTypescriptTypes($this->config))->handle($typescriptTypes); 33 | 34 | foreach ($hooks as $hook) { 35 | $hook->after(); 36 | } 37 | 38 | return $typescriptTypes; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/Actions/ProcessEntities.php: -------------------------------------------------------------------------------- 1 | mapWithKeys(fn (string $class) => [$class => $this->getProcessor($class)]) 20 | ->map(fn (string $processor, string $entity) => (new $processor($this->config))->process($entity)); 21 | } 22 | 23 | private function getProcessor(string $class) 24 | { 25 | $classReflection = new ReflectionClass($class); 26 | 27 | return collect($this->config->getProcessors()) 28 | ->filter(function (string $processor, string $entity) use ($classReflection) { 29 | return $classReflection->isSubclassOf($entity); 30 | }) 31 | ->first(default: $this->getDefaultProcessor()); 32 | } 33 | 34 | private function getDefaultProcessor() 35 | { 36 | return DefaultProcessor::class; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/RuntypeServiceProvider.php: -------------------------------------------------------------------------------- 1 | name('runtype') 17 | ->hasConfigFile() 18 | ->hasCommand(RuntypeCommand::class); 19 | } 20 | 21 | public function packageRegistered(): void 22 | { 23 | $this->app->bind( 24 | RuntypeConfig::class, 25 | fn () => RuntypeConfig::make() 26 | ->autoDiscoverPaths(config('runtype.auto_discover_paths')) 27 | ->processors(config('runtype.processors')) 28 | ->converters(config('runtype.converters')) 29 | ->modifiers(config('runtype.modifiers')) 30 | ->hooks(config('runtype.hooks')) 31 | ->outputFile(config('runtype.output_file')) 32 | ->typeReplacements(config('runtype.type_replacements')) 33 | ); 34 | 35 | $this->app->bind(ResolvesRequest::class, ResolveRequest::class); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/Actions/TranspileToTypescript.php: -------------------------------------------------------------------------------- 1 | lines = collect(); 16 | $this->lines->push('// This file is generated by Vagebond\Runtype'); 17 | } 18 | 19 | /** @param Collection $types */ 20 | public function handle(Collection $types) 21 | { 22 | $types->each(fn (TypescriptType $type) => $this->processType($type)); 23 | 24 | return $this->lines->join(PHP_EOL); 25 | } 26 | 27 | private function processType(TypescriptType $type): void 28 | { 29 | $this->lines->push("// {$type->getClass()}"); 30 | 31 | if ($type->listProperties()->isEmpty()) { 32 | $this->lines->push("export type {$type->getName()} = any"); 33 | 34 | return; 35 | } 36 | 37 | $this->lines->push("export type {$type->getName()} = {"); 38 | 39 | $type->listProperties()->each(fn (TypescriptProperty $property) => $this->processProperty($property)); 40 | 41 | $this->lines->push('}'); 42 | } 43 | 44 | private function processProperty(TypescriptProperty $property): void 45 | { 46 | $this->lines->push("{$property->getName()}:{$property->getType()}"); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/Actions/ResolveClassesInPhpFile.php: -------------------------------------------------------------------------------- 1 | parser = (new ParserFactory)->createForNewestSupportedVersion(); 22 | } 23 | 24 | public function handle(SplFileInfo $file): array 25 | { 26 | $statements = $this->parser->parse($file->getContents()); 27 | 28 | $nodeFinder = new NodeFinder; 29 | 30 | $namespace = $nodeFinder->findFirst( 31 | $statements, 32 | fn ($node) => $node instanceof Namespace_ 33 | ); 34 | 35 | $classes = $nodeFinder->find( 36 | $statements, 37 | fn ($node) => $node instanceof Class_ || $node instanceof Interface_ || $node instanceof Trait_ || $node instanceof Enum_ 38 | ); 39 | 40 | return array_map(function (Class_|Interface_|Trait_|Enum_ $item) use ($namespace) { 41 | $className = $namespace instanceof Namespace_ 42 | ? "{$namespace->name}\\{$item->name}" 43 | : $item->name; 44 | 45 | return preg_replace('/^\\\*/', '', (string) $className); 46 | }, $classes); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/Actions/ResolveProcessableEntities.php: -------------------------------------------------------------------------------- 1 | config->getAutoDiscoverPaths(); 20 | $entities = []; 21 | 22 | if (empty($paths = $this->config->getAutoDiscoverPaths())) { 23 | throw ConfigurationException::NoAutoDiscoverPathsDefined(); 24 | } 25 | 26 | foreach ($this->resolveIterator($paths) as $path) { 27 | // TODO: add support for only looking for a specific type 28 | $entities[] = $path->getName(); 29 | } 30 | 31 | return $entities; 32 | } 33 | 34 | protected function resolveIterator(array $paths) 35 | { 36 | $paths = array_map( 37 | fn (string $path) => is_dir($path) ? $path : dirname($path), 38 | $paths 39 | ); 40 | 41 | foreach ($this->finder->in($paths) as $fileInfo) { 42 | try { 43 | $classes = (new ResolveClassesInPhpFile)->handle($fileInfo); 44 | 45 | foreach ($classes as $name) { 46 | $rc = new ReflectionClass($name); 47 | 48 | yield $name => $rc; 49 | } 50 | } catch (\Exception $exception) { 51 | } 52 | } 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /src/Values/TypescriptType.php: -------------------------------------------------------------------------------- 1 | properties[] = $property; 20 | 21 | return $this; 22 | } 23 | 24 | public function addProperties(iterable $properties): self 25 | { 26 | foreach ($properties as $property) { 27 | $this->addProperty($property); 28 | } 29 | 30 | return $this; 31 | } 32 | 33 | public function listProperties(): Collection 34 | { 35 | return collect($this->properties); 36 | } 37 | 38 | public function getName(): string 39 | { 40 | return self::determineName($this->class); 41 | } 42 | 43 | public function getClass(): string 44 | { 45 | return $this->class; 46 | } 47 | 48 | public function merge(TypescriptType $type, Collection $originalProperties): self 49 | { 50 | $newProperties = $type->listProperties() 51 | ->filter(fn ($prop) => ! $this->listProperties()->contains($prop)); 52 | 53 | $this->addProperties($newProperties); 54 | 55 | $optionalProperties = $this->listProperties() 56 | ->filter(fn ($prop) => ! $originalProperties->contains($prop)); 57 | 58 | $optionalProperties->each(fn ($prop) => $prop->setOptional(true)); 59 | 60 | return $this; 61 | } 62 | 63 | public static function determineName(string $class): string 64 | { 65 | $class = new ReflectionClass($class); 66 | 67 | return $class->getShortName().'Type'; 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /src/Types/Types.php: -------------------------------------------------------------------------------- 1 | config->getTypeReplacements() as $class => $replacement) { 32 | if ($value instanceof $class) { 33 | return $replacement; 34 | } 35 | } 36 | 37 | return match (true) { 38 | is_string($value) => self::STRING, 39 | is_bool($value) => self::BOOLEAN, 40 | is_int($value) => self::NUMBER, 41 | is_float($value) => self::NUMBER, 42 | is_array($value) => $this->processArray($value), 43 | $value instanceof ResourceCollection => TypescriptType::determineName($value->collects).'[]', 44 | $value instanceof JsonResource => TypescriptType::determineName(get_class($value)), 45 | $value instanceof Arrayable => $this->processArray($value->toArray()), // TODO: Test for this 46 | is_object($value) => $this->processArray((array) $value), 47 | default => self::UNKNOWN, 48 | }; 49 | } 50 | 51 | private function processArray(array $value) 52 | { 53 | if (Arr::isAssoc($value)) { 54 | $result = collect($value) 55 | ->mapWithKeys(fn ($value, $key) => [$key => $this->determineType($value)]) 56 | ->toJson(); 57 | 58 | return Str::replace('"', '', $result); 59 | } 60 | 61 | $types = collect($value)->map(fn ($value) => $this->determineType($value))->unique(); 62 | 63 | return $types->join('|').'[]'; 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /src/Values/TypescriptProperty.php: -------------------------------------------------------------------------------- 1 | isOptional() ? $this->name.'?' : $this->name; 27 | } 28 | 29 | public function getType(): string 30 | { 31 | return $this->type; 32 | } 33 | 34 | public function isOptional(): bool 35 | { 36 | return $this->optional; 37 | } 38 | 39 | public function setOptional(bool $optional) 40 | { 41 | $this->optional = $optional; 42 | } 43 | 44 | private static function determineType(mixed $value) 45 | { 46 | return match (true) { 47 | is_string($value) => 'string', 48 | is_bool($value) => 'boolean', 49 | is_int($value) => 'number', 50 | is_float($value) => 'number', 51 | is_array($value) => self::processArray($value), 52 | $value instanceof DateTimeInterface => 'string', 53 | $value instanceof ResourceCollection => TypescriptType::determineName($value->collects).'[]', 54 | $value instanceof JsonResource => TypescriptType::determineName(get_class($value)), 55 | is_object($value) => self::processArray((array) $value), 56 | default => 'any', 57 | }; 58 | } 59 | 60 | private static function processArray(array $value) 61 | { 62 | if (Arr::isAssoc($value)) { 63 | $result = collect($value) 64 | ->mapWithKeys(fn ($value, $key) => [$key => self::determineType($value)]) 65 | ->toJson(); 66 | 67 | return Str::replace('"', '', $result); 68 | } 69 | 70 | $types = collect($value)->map(fn ($value) => self::determineType($value))->unique(); 71 | 72 | return $types->join('|').'[]'; 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /src/Actions/ListModelRelations.php: -------------------------------------------------------------------------------- 1 | map(fn ($method) => new ReflectionMethod($model, $method)) 39 | ->reject( 40 | fn (ReflectionMethod $method) => $method->isStatic() 41 | || $method->isAbstract() 42 | || $method->getDeclaringClass()->getName() !== get_class($model) 43 | ) 44 | ->filter(function (ReflectionMethod $method) { 45 | $file = new SplFileObject($method->getFileName()); 46 | $file->seek($method->getStartLine() - 1); 47 | $code = ''; 48 | while ($file->key() < $method->getEndLine()) { 49 | $code .= $file->current(); 50 | $file->next(); 51 | } 52 | 53 | return collect($this->relationMethods) 54 | ->contains(fn ($relationMethod) => str_contains($code, '$this->'.$relationMethod.'(')); 55 | }) 56 | ->map(function (ReflectionMethod $method) use ($model) { 57 | $relation = $method->invoke($model); 58 | 59 | if (! $relation instanceof Relation) { 60 | return null; 61 | } 62 | 63 | if (! Schema::hasTable($relation->getRelated()->getTable())) { 64 | return null; 65 | } 66 | 67 | return $method->getName(); 68 | }) 69 | ->filter() 70 | ->values() 71 | ->toArray(); 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vagebond/runtype", 3 | "description": "Transform Laravel Resources and models into Typescript interfaces", 4 | "keywords": [ 5 | "vagebond", 6 | "laravel", 7 | "runtype", 8 | "typescript", 9 | "generator" 10 | ], 11 | "homepage": "https://github.com/vagebnd/runtype", 12 | "license": "MIT", 13 | "authors": [ 14 | { 15 | "name": "Gianluca Riggio", 16 | "email": "luca@maximumawesome.nl", 17 | "role": "Developer" 18 | } 19 | ], 20 | "require": { 21 | "php": "^8.2||^8.3||^8.4", 22 | "laravel/framework": "^11.0||^12.0", 23 | "nikic/php-parser": "^5.4", 24 | "spatie/laravel-package-tools": "^1.16" 25 | }, 26 | "require-dev": { 27 | "larastan/larastan": "^2.9||^3.0", 28 | "laravel/pint": "^1.21", 29 | "nunomaduro/collision": "^8.1.1||^7.10.0", 30 | "orchestra/testbench": "^10.0.0||^9.0.0||^8.22.0", 31 | "pestphp/pest": "^3.0", 32 | "pestphp/pest-plugin-laravel": "^3.0", 33 | "phpstan/extension-installer": "^2.0||^1.3", 34 | "phpstan/phpstan-deprecation-rules": "^1.0||^2.0", 35 | "phpstan/phpstan-phpunit": "^1.3||^2.0", 36 | "spatie/temporary-directory": "^2.3.0" 37 | }, 38 | "autoload": { 39 | "psr-4": { 40 | "Vagebond\\Runtype\\": "src", 41 | "Vagebond\\Runtype\\Database\\Factories\\": "database/factories" 42 | } 43 | }, 44 | "autoload-dev": { 45 | "psr-4": { 46 | "Vagebond\\Runtype\\Tests\\": "tests" 47 | } 48 | }, 49 | "scripts": { 50 | "post-autoload-dump": "@php vendor/bin/testbench package:discover --ansi", 51 | "analyse": "vendor/bin/phpstan analyse --memory-limit=2G", 52 | "test": "vendor/bin/pest", 53 | "test-coverage": "vendor/bin/pest --coverage", 54 | "format": "vendor/bin/pint" 55 | }, 56 | "config": { 57 | "sort-packages": true, 58 | "allow-plugins": { 59 | "pestphp/pest-plugin": true, 60 | "phpstan/extension-installer": true 61 | } 62 | }, 63 | "extra": { 64 | "laravel": { 65 | "providers": [ 66 | "Vagebond\\Runtype\\RuntypeServiceProvider" 67 | ], 68 | "aliases": { 69 | "Runtype": "Vagebond\\Runtype\\Facades\\Runtype" 70 | } 71 | } 72 | }, 73 | "minimum-stability": "dev", 74 | "prefer-stable": true 75 | } 76 | -------------------------------------------------------------------------------- /src/Converters/AbstractConverter.php: -------------------------------------------------------------------------------- 1 | handle($instance); 28 | 29 | $type = $this->runModifiers($type, $instance); 30 | 31 | return $type; 32 | } 33 | 34 | protected function runModifiers(TypescriptType $type, $instance): TypescriptType 35 | { 36 | foreach ($this->getModifiers($instance) as $modifier) { 37 | $classReflection = new ReflectionClass($modifier); 38 | 39 | if (! $classReflection->implementsInterface(Modifiable::class)) { 40 | ConverterException::modifierDoesNotImplementModifiable($modifier); 41 | } 42 | 43 | $instance = app($modifier)->modify($instance); 44 | $modifiedType = app(static::class)->handle($instance); 45 | 46 | $type = $type->merge($modifiedType, $type->listProperties()); 47 | } 48 | 49 | return $type; 50 | } 51 | 52 | protected function convertPropertiesToTypes(Collection $properties, bool $optional = false): Collection 53 | { 54 | // TODO: Improve this and make it more descriptive 55 | $typer = new Types($this->config); 56 | 57 | return $properties->map( 58 | fn ($value, $key) => new TypescriptProperty( 59 | name: $key, 60 | type: $typer->determineType($value), 61 | optional: $optional, 62 | ) 63 | ); 64 | } 65 | 66 | protected function getRequest() 67 | { 68 | return app()->make(ResolvesRequest::class)->resolve(); 69 | } 70 | 71 | private function getModifiers($instance) 72 | { 73 | $modifiers = array_merge($this->modifiers, [$this->config->getModifier($instance::class)]); 74 | 75 | return array_filter($modifiers); 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /src/Actions/ResolveMixinFromClass.php: -------------------------------------------------------------------------------- 1 | tryResolvingFromDocComment($classReflection); 19 | } 20 | 21 | private function tryResolvingFromDocComment(ReflectionClass $classReflection): string 22 | { 23 | $docComment = $classReflection->getDocComment(); 24 | 25 | $mixin = $this->extractMixinFromDocComment($docComment, '/@mixin\s+([\w\\\\]+)/'); 26 | 27 | if (empty($mixin)) { 28 | throw UnresolvableResourceException::noMixinFound($classReflection->getName()); 29 | } 30 | 31 | $resource = head($mixin); 32 | 33 | if (! class_exists($resource)) { 34 | $resource = $this->tryResolvingFromImports($classReflection, $resource); 35 | } 36 | 37 | if (! class_exists($resource)) { 38 | throw UnresolvableResourceException::resourceDoesNotExist($classReflection->getName()); 39 | } 40 | 41 | return $resource; 42 | } 43 | 44 | private function extractMixinFromDocComment(string $phpdocs, string $pattern): array 45 | { 46 | preg_match_all( 47 | $pattern, 48 | $phpdocs, 49 | $mixins 50 | ); 51 | 52 | return array_map( 53 | function ($mixin) { 54 | return preg_replace('#^\\\\#', '', $mixin); 55 | }, 56 | $mixins[1] 57 | ); 58 | } 59 | 60 | private function tryResolvingFromImports(ReflectionClass $classReflection, $model) 61 | { 62 | $parser = (new ParserFactory)->createForNewestSupportedVersion(); 63 | 64 | $statements = $parser->parse(file_get_contents($classReflection->getFileName())); 65 | 66 | $nodeFinder = new NodeFinder; 67 | 68 | $useStatements = $nodeFinder->find( 69 | $statements, 70 | fn ($node) => $node instanceof UseUse 71 | ); 72 | 73 | $imports = collect($useStatements) 74 | ->pluck('name') 75 | ->mapWithKeys(function (Name $name) { 76 | return [basename(str_replace('\\', '/', $name->name)) => $name->name]; 77 | }); 78 | 79 | return $imports->get($model, $model); 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Laravel Typescript Generator: Runtype 2 | 3 | [![Latest Version on Packagist](https://img.shields.io/packagist/v/vagebond/runtype.svg?style=flat-square)](https://packagist.org/packages/vagebond/runtype) 4 | [![GitHub Tests Action Status](https://img.shields.io/github/actions/workflow/status/vagebnd/runtype/run-tests.yml?branch=main&label=tests)](https://github.com/vagebnd/runtype/actions?query=workflow%3Arun-tests+branch%3Amain) 5 | [![GitHub Code Style Action Status](https://img.shields.io/github/actions/workflow/status/vagebnd/runtype/fix-php-code-style-issues.yml?branch=main)](https://github.com/vagebnd/runtype/actions?query=workflow%3A"Fix+PHP+code+style+issues"+branch%3Amain) 6 | [![Total Downloads](https://img.shields.io/packagist/dt/vagebond/runtype.svg?style=flat-square)](https://packagist.org/packages/vagebond/runtype) 7 | 8 | Generate TypeScript interfaces from Laravel Models & Resources 9 | 10 | This resource: 11 | ```PHP 12 | use Illuminate\Http\Resources\Json\JsonResource; 13 | 14 | /** @mixin \App\Models\Product */ 15 | class ProductResource extends JsonResource 16 | { 17 | public $showHiddenData = false; 18 | 19 | public function toArray($request) 20 | { 21 | return [ 22 | 'id' => $this->id, 23 | 'name' => $this->name, 24 | 'hidden' => $this->when($this->showHiddenData, false), 25 | ]; 26 | } 27 | } 28 | ``` 29 | 30 | will be converted into this interface: 31 | 32 | ```typescript 33 | export interface ProductResourceType { 34 | id: number; 35 | name: string; 36 | hidden?: boolean; 37 | } 38 | ``` 39 | 40 | You can read the full documentation [here](https://runtype.vagebond.nl/). 41 | 42 | ## Installation 43 | 44 | You can install the package via composer: 45 | 46 | ```bash 47 | composer require vagebond/runtype --dev 48 | ``` 49 | 50 | You can publish the config file with: 51 | 52 | ```bash 53 | php artisan vendor:publish --tag="runtype-config" 54 | ``` 55 | 56 | ## Usage 57 | 58 | ```bash 59 | php artisan runtype:generate 60 | ``` 61 | 62 | ## Testing 63 | 64 | ```bash 65 | composer test 66 | ``` 67 | 68 | ## Changelog 69 | 70 | Please see [CHANGELOG](CHANGELOG.md) for more information on what has changed recently. 71 | 72 | ## Contributing 73 | 74 | Please see [CONTRIBUTING](CONTRIBUTING.md) for details. 75 | 76 | ## Security Vulnerabilities 77 | 78 | Please review [our security policy](../../security/policy) on how to report security vulnerabilities. 79 | 80 | ## Credits 81 | 82 | - [Gianluca Riggio](https://github.com/mxaGianluca) 83 | - [All Contributors](../../contributors) 84 | 85 | ## License 86 | 87 | The MIT License (MIT). Please see [License File](LICENSE.md) for more information. 88 | -------------------------------------------------------------------------------- /config/runtype.php: -------------------------------------------------------------------------------- 1 | [ 17 | app_path('Http/Resources'), 18 | ], 19 | 20 | /** 21 | * Hooks allow you to add custom logic to the generation process 22 | * Each hook must implement the Vagebond\Runtype\Contracts\Hookable interface 23 | * 24 | * i.e. you can use the before hook to setup specific settings for your environment 25 | * like logging in a user, setting a tenant etc. 26 | * 27 | * You can also use the after hook to do some cleanup or to format the generated 28 | * typescript file 29 | */ 30 | 'hooks' => [ 31 | // 'App\Hooks\SetupEnvironmentHook', 32 | ], 33 | 34 | /** 35 | * Indicate how you would like your entities to be processed 36 | * you can choose a subclass or an interface 37 | */ 38 | 'processors' => [ 39 | JsonResource::class => ResourceProcessor::class, 40 | Model::class => ModelProcessor::class, 41 | ], 42 | 43 | /** 44 | * Indicate how you would like your entities to be converted 45 | * into Typescript types 46 | */ 47 | 'converters' => [ 48 | JsonResource::class => ResourceConverter::class, 49 | Model::class => ModelConverter::class, 50 | ], 51 | 52 | /** 53 | * There are certain situations where runtype can't determine the 54 | * required settings for a resource, i.e. when conditionally loading attributes, 55 | * You can use a modifier to set the required settings on your model so our 56 | * resource generator can detect them. 57 | */ 58 | 'modifiers' => [ 59 | // 'App\Models\MyModel' => 'App\Modifiers\MyModelModifier', 60 | ], 61 | 62 | /* 63 | * In your classes, you sometimes have types that should always be replaced 64 | * by the same TypeScript representations. For example, you can replace a 65 | * Datetime always with a string. You define these replacements here. 66 | */ 67 | 68 | 'type_replacements' => [ 69 | DateTime::class => 'string', 70 | DateTimeImmutable::class => 'string', 71 | // CarbonImmutable::class => 'string', 72 | Carbon::class => 'string', 73 | ], 74 | 75 | /** 76 | * runtype will write the generated Typescript to this file 77 | */ 78 | 'output_file' => resource_path('types/runtype.d.ts'), 79 | ]; 80 | -------------------------------------------------------------------------------- /src/RuntypeConfig.php: -------------------------------------------------------------------------------- 1 | autoDiscoverPaths = array_merge($this->autoDiscoverPaths, $paths); 34 | 35 | return $this; 36 | } 37 | 38 | public function processors(array $processors): self 39 | { 40 | $this->processors = array_merge($this->processors, $processors); 41 | 42 | return $this; 43 | } 44 | 45 | public function converters(array $converters): self 46 | { 47 | $this->converters = array_merge($this->converters, $converters); 48 | 49 | return $this; 50 | } 51 | 52 | public function outputFile(string $outputFile): self 53 | { 54 | $this->outputFile = $outputFile; 55 | 56 | return $this; 57 | } 58 | 59 | public function typeReplacements(array $typeReplacements): self 60 | { 61 | $this->typeReplacements = $typeReplacements; 62 | 63 | return $this; 64 | } 65 | 66 | public function modifiers(array $modifiers): self 67 | { 68 | $this->modifiers = $modifiers; 69 | 70 | return $this; 71 | } 72 | 73 | public function hooks(array $hooks): self 74 | { 75 | $this->hooks = $hooks; 76 | 77 | return $this; 78 | } 79 | 80 | public function getAutoDiscoverPaths(): array 81 | { 82 | return $this->autoDiscoverPaths; 83 | } 84 | 85 | public function getProcessors(): array 86 | { 87 | // TODO: Check if they exists and are of the correct type. 88 | return $this->processors; 89 | } 90 | 91 | public function getConverters(): array 92 | { 93 | // TODO: Check if they exists and are of the correct type. 94 | return $this->converters; 95 | } 96 | 97 | public function getOutputFile(): string 98 | { 99 | return $this->outputFile; 100 | } 101 | 102 | public function getTypeReplacements(): array 103 | { 104 | foreach ($this->typeReplacements as $class => $replacement) { 105 | if (! class_exists($class) && ! interface_exists($class)) { 106 | throw ConfigurationException::classDoesNotExist($class); 107 | } 108 | 109 | if (! is_string($replacement)) { 110 | throw ConfigurationException::replacementTypeShouldBeString($class, $replacement); 111 | } 112 | } 113 | 114 | return $this->typeReplacements; 115 | } 116 | 117 | public function getModifier(string $class) 118 | { 119 | $modifiersCollection = collect($this->modifiers); 120 | 121 | /** @var string */ 122 | $modifier = $modifiersCollection->get($class); 123 | 124 | if (empty($modifier)) { 125 | return; 126 | } 127 | 128 | if (! class_exists($modifier)) { 129 | throw ConfigurationException::classDoesNotExist($modifier); 130 | } 131 | 132 | if (! (new ReflectionClass($modifier))->implementsInterface(Modifiable::class)) { 133 | throw ConfigurationException::classDoesNotImplementModifiable($modifier); 134 | } 135 | 136 | return $modifier; 137 | } 138 | 139 | public function getHooks(): array 140 | { 141 | return collect($this->hooks) 142 | ->map(fn ($hook) => app($hook)) 143 | ->toArray(); 144 | } 145 | } 146 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@algolia/autocomplete-core@1.9.3": 6 | version "1.9.3" 7 | resolved "https://registry.yarnpkg.com/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz#1d56482a768c33aae0868c8533049e02e8961be7" 8 | integrity sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw== 9 | dependencies: 10 | "@algolia/autocomplete-plugin-algolia-insights" "1.9.3" 11 | "@algolia/autocomplete-shared" "1.9.3" 12 | 13 | "@algolia/autocomplete-plugin-algolia-insights@1.9.3": 14 | version "1.9.3" 15 | resolved "https://registry.yarnpkg.com/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz#9b7f8641052c8ead6d66c1623d444cbe19dde587" 16 | integrity sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg== 17 | dependencies: 18 | "@algolia/autocomplete-shared" "1.9.3" 19 | 20 | "@algolia/autocomplete-preset-algolia@1.9.3": 21 | version "1.9.3" 22 | resolved "https://registry.yarnpkg.com/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz#64cca4a4304cfcad2cf730e83067e0c1b2f485da" 23 | integrity sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA== 24 | dependencies: 25 | "@algolia/autocomplete-shared" "1.9.3" 26 | 27 | "@algolia/autocomplete-shared@1.9.3": 28 | version "1.9.3" 29 | resolved "https://registry.yarnpkg.com/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz#2e22e830d36f0a9cf2c0ccd3c7f6d59435b77dfa" 30 | integrity sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ== 31 | 32 | "@algolia/cache-browser-local-storage@4.23.2": 33 | version "4.23.2" 34 | resolved "https://registry.yarnpkg.com/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.23.2.tgz#060d15e89588fcac18e73643201fce0f4f7d5ca0" 35 | integrity sha512-PvRQdCmtiU22dw9ZcTJkrVKgNBVAxKgD0/cfiqyxhA5+PHzA2WDt6jOmZ9QASkeM2BpyzClJb/Wr1yt2/t78Kw== 36 | dependencies: 37 | "@algolia/cache-common" "4.23.2" 38 | 39 | "@algolia/cache-common@4.23.2": 40 | version "4.23.2" 41 | resolved "https://registry.yarnpkg.com/@algolia/cache-common/-/cache-common-4.23.2.tgz#c68706ce34b18377e56e71ac13cce2dd5662dcee" 42 | integrity sha512-OUK/6mqr6CQWxzl/QY0/mwhlGvS6fMtvEPyn/7AHUx96NjqDA4X4+Ju7aXFQKh+m3jW9VPB0B9xvEQgyAnRPNw== 43 | 44 | "@algolia/cache-in-memory@4.23.2": 45 | version "4.23.2" 46 | resolved "https://registry.yarnpkg.com/@algolia/cache-in-memory/-/cache-in-memory-4.23.2.tgz#94cd828275d7a12186959bf1b95a13247e103b23" 47 | integrity sha512-rfbi/SnhEa3MmlqQvgYz/9NNJ156NkU6xFxjbxBtLWnHbpj+qnlMoKd+amoiacHRITpajg6zYbLM9dnaD3Bczw== 48 | dependencies: 49 | "@algolia/cache-common" "4.23.2" 50 | 51 | "@algolia/client-account@4.23.2": 52 | version "4.23.2" 53 | resolved "https://registry.yarnpkg.com/@algolia/client-account/-/client-account-4.23.2.tgz#b53cb14e730fd8e0a0a227cf650b287b570a08bc" 54 | integrity sha512-VbrOCLIN/5I7iIdskSoSw3uOUPF516k4SjDD4Qz3BFwa3of7D9A0lzBMAvQEJJEPHWdVraBJlGgdJq/ttmquJQ== 55 | dependencies: 56 | "@algolia/client-common" "4.23.2" 57 | "@algolia/client-search" "4.23.2" 58 | "@algolia/transporter" "4.23.2" 59 | 60 | "@algolia/client-analytics@4.23.2": 61 | version "4.23.2" 62 | resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-4.23.2.tgz#7fdcf1cb27f0ae93e5da6beb4e612fc06a880b0c" 63 | integrity sha512-lLj7irsAztGhMoEx/SwKd1cwLY6Daf1Q5f2AOsZacpppSvuFvuBrmkzT7pap1OD/OePjLKxicJS8wNA0+zKtuw== 64 | dependencies: 65 | "@algolia/client-common" "4.23.2" 66 | "@algolia/client-search" "4.23.2" 67 | "@algolia/requester-common" "4.23.2" 68 | "@algolia/transporter" "4.23.2" 69 | 70 | "@algolia/client-common@4.23.2": 71 | version "4.23.2" 72 | resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-4.23.2.tgz#e5f86fc2de707eb6bf9f1109b70187dae179c72c" 73 | integrity sha512-Q2K1FRJBern8kIfZ0EqPvUr3V29ICxCm/q42zInV+VJRjldAD9oTsMGwqUQ26GFMdFYmqkEfCbY4VGAiQhh22g== 74 | dependencies: 75 | "@algolia/requester-common" "4.23.2" 76 | "@algolia/transporter" "4.23.2" 77 | 78 | "@algolia/client-personalization@4.23.2": 79 | version "4.23.2" 80 | resolved "https://registry.yarnpkg.com/@algolia/client-personalization/-/client-personalization-4.23.2.tgz#0472d9c207402eefcc9c98f7ffba5d26fe8e2fd0" 81 | integrity sha512-vwPsgnCGhUcHhhQG5IM27z8q7dWrN9itjdvgA6uKf2e9r7vB+WXt4OocK0CeoYQt3OGEAExryzsB8DWqdMK5wg== 82 | dependencies: 83 | "@algolia/client-common" "4.23.2" 84 | "@algolia/requester-common" "4.23.2" 85 | "@algolia/transporter" "4.23.2" 86 | 87 | "@algolia/client-search@4.23.2": 88 | version "4.23.2" 89 | resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-4.23.2.tgz#9b2741f0a209596459f06a44583118207ea287f7" 90 | integrity sha512-CxSB29OVGSE7l/iyoHvamMonzq7Ev8lnk/OkzleODZ1iBcCs3JC/XgTIKzN/4RSTrJ9QybsnlrN/bYCGufo7qw== 91 | dependencies: 92 | "@algolia/client-common" "4.23.2" 93 | "@algolia/requester-common" "4.23.2" 94 | "@algolia/transporter" "4.23.2" 95 | 96 | "@algolia/logger-common@4.23.2": 97 | version "4.23.2" 98 | resolved "https://registry.yarnpkg.com/@algolia/logger-common/-/logger-common-4.23.2.tgz#5441a828f0fad1ceaae3a27caec7b663d40dd27f" 99 | integrity sha512-jGM49Q7626cXZ7qRAWXn0jDlzvoA1FvN4rKTi1g0hxKsTTSReyYk0i1ADWjChDPl3Q+nSDhJuosM2bBUAay7xw== 100 | 101 | "@algolia/logger-console@4.23.2": 102 | version "4.23.2" 103 | resolved "https://registry.yarnpkg.com/@algolia/logger-console/-/logger-console-4.23.2.tgz#fda4252bb02df7c52a92c63f1e357bf7370cc8db" 104 | integrity sha512-oo+lnxxEmlhTBTFZ3fGz1O8PJ+G+8FiAoMY2Qo3Q4w23xocQev6KqDTA1JQAGPDxAewNA2VBwWOsVXeXFjrI/Q== 105 | dependencies: 106 | "@algolia/logger-common" "4.23.2" 107 | 108 | "@algolia/recommend@4.23.2": 109 | version "4.23.2" 110 | resolved "https://registry.yarnpkg.com/@algolia/recommend/-/recommend-4.23.2.tgz#02bf57f836ced2c850633239d493a0414be76a7f" 111 | integrity sha512-Q75CjnzRCDzgIlgWfPnkLtrfF4t82JCirhalXkSSwe/c1GH5pWh4xUyDOR3KTMo+YxxX3zTlrL/FjHmUJEWEcg== 112 | dependencies: 113 | "@algolia/cache-browser-local-storage" "4.23.2" 114 | "@algolia/cache-common" "4.23.2" 115 | "@algolia/cache-in-memory" "4.23.2" 116 | "@algolia/client-common" "4.23.2" 117 | "@algolia/client-search" "4.23.2" 118 | "@algolia/logger-common" "4.23.2" 119 | "@algolia/logger-console" "4.23.2" 120 | "@algolia/requester-browser-xhr" "4.23.2" 121 | "@algolia/requester-common" "4.23.2" 122 | "@algolia/requester-node-http" "4.23.2" 123 | "@algolia/transporter" "4.23.2" 124 | 125 | "@algolia/requester-browser-xhr@4.23.2": 126 | version "4.23.2" 127 | resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.23.2.tgz#2d0a6b642e2a2bbfb2e2ff3d1e82158e3e143def" 128 | integrity sha512-TO9wLlp8+rvW9LnIfyHsu8mNAMYrqNdQ0oLF6eTWFxXfxG3k8F/Bh7nFYGk2rFAYty4Fw4XUtrv/YjeNDtM5og== 129 | dependencies: 130 | "@algolia/requester-common" "4.23.2" 131 | 132 | "@algolia/requester-common@4.23.2": 133 | version "4.23.2" 134 | resolved "https://registry.yarnpkg.com/@algolia/requester-common/-/requester-common-4.23.2.tgz#9c2e5da4dc15e65f9b9bbe5bedb419cf23092ef1" 135 | integrity sha512-3EfpBS0Hri0lGDB5H/BocLt7Vkop0bTTLVUBB844HH6tVycwShmsV6bDR7yXbQvFP1uNpgePRD3cdBCjeHmk6Q== 136 | 137 | "@algolia/requester-node-http@4.23.2": 138 | version "4.23.2" 139 | resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-4.23.2.tgz#718ae71f58949eab3b5fcfc440be42af41bd640f" 140 | integrity sha512-SVzgkZM/malo+2SB0NWDXpnT7nO5IZwuDTaaH6SjLeOHcya1o56LSWXk+3F3rNLz2GVH+I/rpYKiqmHhSOjerw== 141 | dependencies: 142 | "@algolia/requester-common" "4.23.2" 143 | 144 | "@algolia/transporter@4.23.2": 145 | version "4.23.2" 146 | resolved "https://registry.yarnpkg.com/@algolia/transporter/-/transporter-4.23.2.tgz#61e7b9288d4f561b2015ddde689ba31e08c21644" 147 | integrity sha512-GY3aGKBy+8AK4vZh8sfkatDciDVKad5rTY2S10Aefyjh7e7UGBP4zigf42qVXwU8VOPwi7l/L7OACGMOFcjB0Q== 148 | dependencies: 149 | "@algolia/cache-common" "4.23.2" 150 | "@algolia/logger-common" "4.23.2" 151 | "@algolia/requester-common" "4.23.2" 152 | 153 | "@babel/parser@^7.16.4": 154 | version "7.20.15" 155 | resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.15.tgz#eec9f36d8eaf0948bb88c87a46784b5ee9fd0c89" 156 | integrity sha512-DI4a1oZuf8wC+oAJA9RW6ga3Zbe8RZFt7kD9i4qAspz3I/yHet1VvC3DiSy/fsUvv5pvJuNPh0LPOdCcqinDPg== 157 | 158 | "@babel/parser@^7.23.9": 159 | version "7.24.1" 160 | resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.1.tgz#1e416d3627393fab1cb5b0f2f1796a100ae9133a" 161 | integrity sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg== 162 | 163 | "@docsearch/css@3.6.0", "@docsearch/css@^3.6.0": 164 | version "3.6.0" 165 | resolved "https://registry.yarnpkg.com/@docsearch/css/-/css-3.6.0.tgz#0e9f56f704b3a34d044d15fd9962ebc1536ba4fb" 166 | integrity sha512-+sbxb71sWre+PwDK7X2T8+bhS6clcVMLwBPznX45Qu6opJcgRjAp7gYSDzVFp187J+feSj5dNBN1mJoi6ckkUQ== 167 | 168 | "@docsearch/js@^3.6.0": 169 | version "3.6.0" 170 | resolved "https://registry.yarnpkg.com/@docsearch/js/-/js-3.6.0.tgz#f9e46943449b9092d874944f7a80bcc071004cfb" 171 | integrity sha512-QujhqINEElrkIfKwyyyTfbsfMAYCkylInLYMRqHy7PHc8xTBQCow73tlo/Kc7oIwBrCLf0P3YhjlOeV4v8hevQ== 172 | dependencies: 173 | "@docsearch/react" "3.6.0" 174 | preact "^10.0.0" 175 | 176 | "@docsearch/react@3.6.0": 177 | version "3.6.0" 178 | resolved "https://registry.yarnpkg.com/@docsearch/react/-/react-3.6.0.tgz#b4f25228ecb7fc473741aefac592121e86dd2958" 179 | integrity sha512-HUFut4ztcVNmqy9gp/wxNbC7pTOHhgVVkHVGCACTuLhUKUhKAF9KYHJtMiLUJxEqiFLQiuri1fWF8zqwM/cu1w== 180 | dependencies: 181 | "@algolia/autocomplete-core" "1.9.3" 182 | "@algolia/autocomplete-preset-algolia" "1.9.3" 183 | "@docsearch/css" "3.6.0" 184 | algoliasearch "^4.19.1" 185 | 186 | "@esbuild/aix-ppc64@0.20.2": 187 | version "0.20.2" 188 | resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz#a70f4ac11c6a1dfc18b8bbb13284155d933b9537" 189 | integrity sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g== 190 | 191 | "@esbuild/android-arm64@0.20.2": 192 | version "0.20.2" 193 | resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz#db1c9202a5bc92ea04c7b6840f1bbe09ebf9e6b9" 194 | integrity sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg== 195 | 196 | "@esbuild/android-arm@0.20.2": 197 | version "0.20.2" 198 | resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.20.2.tgz#3b488c49aee9d491c2c8f98a909b785870d6e995" 199 | integrity sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w== 200 | 201 | "@esbuild/android-x64@0.20.2": 202 | version "0.20.2" 203 | resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.20.2.tgz#3b1628029e5576249d2b2d766696e50768449f98" 204 | integrity sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg== 205 | 206 | "@esbuild/darwin-arm64@0.20.2": 207 | version "0.20.2" 208 | resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz#6e8517a045ddd86ae30c6608c8475ebc0c4000bb" 209 | integrity sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA== 210 | 211 | "@esbuild/darwin-x64@0.20.2": 212 | version "0.20.2" 213 | resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz#90ed098e1f9dd8a9381695b207e1cff45540a0d0" 214 | integrity sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA== 215 | 216 | "@esbuild/freebsd-arm64@0.20.2": 217 | version "0.20.2" 218 | resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz#d71502d1ee89a1130327e890364666c760a2a911" 219 | integrity sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw== 220 | 221 | "@esbuild/freebsd-x64@0.20.2": 222 | version "0.20.2" 223 | resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz#aa5ea58d9c1dd9af688b8b6f63ef0d3d60cea53c" 224 | integrity sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw== 225 | 226 | "@esbuild/linux-arm64@0.20.2": 227 | version "0.20.2" 228 | resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz#055b63725df678379b0f6db9d0fa85463755b2e5" 229 | integrity sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A== 230 | 231 | "@esbuild/linux-arm@0.20.2": 232 | version "0.20.2" 233 | resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz#76b3b98cb1f87936fbc37f073efabad49dcd889c" 234 | integrity sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg== 235 | 236 | "@esbuild/linux-ia32@0.20.2": 237 | version "0.20.2" 238 | resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz#c0e5e787c285264e5dfc7a79f04b8b4eefdad7fa" 239 | integrity sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig== 240 | 241 | "@esbuild/linux-loong64@0.20.2": 242 | version "0.20.2" 243 | resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz#a6184e62bd7cdc63e0c0448b83801001653219c5" 244 | integrity sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ== 245 | 246 | "@esbuild/linux-mips64el@0.20.2": 247 | version "0.20.2" 248 | resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz#d08e39ce86f45ef8fc88549d29c62b8acf5649aa" 249 | integrity sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA== 250 | 251 | "@esbuild/linux-ppc64@0.20.2": 252 | version "0.20.2" 253 | resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz#8d252f0b7756ffd6d1cbde5ea67ff8fd20437f20" 254 | integrity sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg== 255 | 256 | "@esbuild/linux-riscv64@0.20.2": 257 | version "0.20.2" 258 | resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz#19f6dcdb14409dae607f66ca1181dd4e9db81300" 259 | integrity sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg== 260 | 261 | "@esbuild/linux-s390x@0.20.2": 262 | version "0.20.2" 263 | resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz#3c830c90f1a5d7dd1473d5595ea4ebb920988685" 264 | integrity sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ== 265 | 266 | "@esbuild/linux-x64@0.20.2": 267 | version "0.20.2" 268 | resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz#86eca35203afc0d9de0694c64ec0ab0a378f6fff" 269 | integrity sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw== 270 | 271 | "@esbuild/netbsd-x64@0.20.2": 272 | version "0.20.2" 273 | resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz#e771c8eb0e0f6e1877ffd4220036b98aed5915e6" 274 | integrity sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ== 275 | 276 | "@esbuild/openbsd-x64@0.20.2": 277 | version "0.20.2" 278 | resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz#9a795ae4b4e37e674f0f4d716f3e226dd7c39baf" 279 | integrity sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ== 280 | 281 | "@esbuild/sunos-x64@0.20.2": 282 | version "0.20.2" 283 | resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz#7df23b61a497b8ac189def6e25a95673caedb03f" 284 | integrity sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w== 285 | 286 | "@esbuild/win32-arm64@0.20.2": 287 | version "0.20.2" 288 | resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz#f1ae5abf9ca052ae11c1bc806fb4c0f519bacf90" 289 | integrity sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ== 290 | 291 | "@esbuild/win32-ia32@0.20.2": 292 | version "0.20.2" 293 | resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz#241fe62c34d8e8461cd708277813e1d0ba55ce23" 294 | integrity sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ== 295 | 296 | "@esbuild/win32-x64@0.20.2": 297 | version "0.20.2" 298 | resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz#9c907b21e30a52db959ba4f80bb01a0cc403d5cc" 299 | integrity sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ== 300 | 301 | "@jridgewell/sourcemap-codec@^1.4.15": 302 | version "1.4.15" 303 | resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" 304 | integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== 305 | 306 | "@rollup/rollup-android-arm-eabi@4.13.2": 307 | version "4.13.2" 308 | resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.2.tgz#fbf098f49d96a8cac9056f22f5fd80906ef3af85" 309 | integrity sha512-3XFIDKWMFZrMnao1mJhnOT1h2g0169Os848NhhmGweEcfJ4rCi+3yMCOLG4zA61rbJdkcrM/DjVZm9Hg5p5w7g== 310 | 311 | "@rollup/rollup-android-arm64@4.13.2": 312 | version "4.13.2" 313 | resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.13.2.tgz#0d2448251040fce19a98eee505dff5b3c8ec9b98" 314 | integrity sha512-GdxxXbAuM7Y/YQM9/TwwP+L0omeE/lJAR1J+olu36c3LqqZEBdsIWeQ91KBe6nxwOnb06Xh7JS2U5ooWU5/LgQ== 315 | 316 | "@rollup/rollup-darwin-arm64@4.13.2": 317 | version "4.13.2" 318 | resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.13.2.tgz#78db4d4da5b1b84c22adbe25c8a4961b3f22d3af" 319 | integrity sha512-mCMlpzlBgOTdaFs83I4XRr8wNPveJiJX1RLfv4hggyIVhfB5mJfN4P8Z6yKh+oE4Luz+qq1P3kVdWrCKcMYrrA== 320 | 321 | "@rollup/rollup-darwin-x64@4.13.2": 322 | version "4.13.2" 323 | resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.13.2.tgz#fcc05af54379f8ee5c7e954987d4514c6fd0fb42" 324 | integrity sha512-yUoEvnH0FBef/NbB1u6d3HNGyruAKnN74LrPAfDQL3O32e3k3OSfLrPgSJmgb3PJrBZWfPyt6m4ZhAFa2nZp2A== 325 | 326 | "@rollup/rollup-linux-arm-gnueabihf@4.13.2": 327 | version "4.13.2" 328 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.13.2.tgz#2ce200efa1ef4a56ee2af7b453edc74a259d7d31" 329 | integrity sha512-GYbLs5ErswU/Xs7aGXqzc3RrdEjKdmoCrgzhJWyFL0r5fL3qd1NPcDKDowDnmcoSiGJeU68/Vy+OMUluRxPiLQ== 330 | 331 | "@rollup/rollup-linux-arm64-gnu@4.13.2": 332 | version "4.13.2" 333 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.13.2.tgz#5a24aac882bff9abfda3f45f6f1db2166c342a4a" 334 | integrity sha512-L1+D8/wqGnKQIlh4Zre9i4R4b4noxzH5DDciyahX4oOz62CphY7WDWqJoQ66zNR4oScLNOqQJfNSIAe/6TPUmQ== 335 | 336 | "@rollup/rollup-linux-arm64-musl@4.13.2": 337 | version "4.13.2" 338 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.13.2.tgz#f1fb4c6f961d3f3397231a99e621d199200e4ea9" 339 | integrity sha512-tK5eoKFkXdz6vjfkSTCupUzCo40xueTOiOO6PeEIadlNBkadH1wNOH8ILCPIl8by/Gmb5AGAeQOFeLev7iZDOA== 340 | 341 | "@rollup/rollup-linux-powerpc64le-gnu@4.13.2": 342 | version "4.13.2" 343 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.13.2.tgz#46b2463d94ac3af3e0f7a2947b695397bc13b755" 344 | integrity sha512-zvXvAUGGEYi6tYhcDmb9wlOckVbuD+7z3mzInCSTACJ4DQrdSLPNUeDIcAQW39M3q6PDquqLWu7pnO39uSMRzQ== 345 | 346 | "@rollup/rollup-linux-riscv64-gnu@4.13.2": 347 | version "4.13.2" 348 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.13.2.tgz#47b932ee59a5395a3a341b0493e361d9e6032cf2" 349 | integrity sha512-C3GSKvMtdudHCN5HdmAMSRYR2kkhgdOfye4w0xzyii7lebVr4riCgmM6lRiSCnJn2w1Xz7ZZzHKuLrjx5620kw== 350 | 351 | "@rollup/rollup-linux-s390x-gnu@4.13.2": 352 | version "4.13.2" 353 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.13.2.tgz#8e14a1b3c3b9a4440c70a9c1ba12d32aa21f9712" 354 | integrity sha512-l4U0KDFwzD36j7HdfJ5/TveEQ1fUTjFFQP5qIt9gBqBgu1G8/kCaq5Ok05kd5TG9F8Lltf3MoYsUMw3rNlJ0Yg== 355 | 356 | "@rollup/rollup-linux-x64-gnu@4.13.2": 357 | version "4.13.2" 358 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.13.2.tgz#270e939194b66df77bcb33dd9a5ddf7784bd7997" 359 | integrity sha512-xXMLUAMzrtsvh3cZ448vbXqlUa7ZL8z0MwHp63K2IIID2+DeP5iWIT6g1SN7hg1VxPzqx0xZdiDM9l4n9LRU1A== 360 | 361 | "@rollup/rollup-linux-x64-musl@4.13.2": 362 | version "4.13.2" 363 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.13.2.tgz#e8dd0f3c2046acbda2934490b36552e856a3bc6a" 364 | integrity sha512-M/JYAWickafUijWPai4ehrjzVPKRCyDb1SLuO+ZyPfoXgeCEAlgPkNXewFZx0zcnoIe3ay4UjXIMdXQXOZXWqA== 365 | 366 | "@rollup/rollup-win32-arm64-msvc@4.13.2": 367 | version "4.13.2" 368 | resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.13.2.tgz#f8b65a4a7e7a6b383e7b14439129b2f474ff123c" 369 | integrity sha512-2YWwoVg9KRkIKaXSh0mz3NmfurpmYoBBTAXA9qt7VXk0Xy12PoOP40EFuau+ajgALbbhi4uTj3tSG3tVseCjuA== 370 | 371 | "@rollup/rollup-win32-ia32-msvc@4.13.2": 372 | version "4.13.2" 373 | resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.13.2.tgz#bc1c5a4fbc4337d6cb15da80a4de95fd53ab3573" 374 | integrity sha512-2FSsE9aQ6OWD20E498NYKEQLneShWes0NGMPQwxWOdws35qQXH+FplabOSP5zEe1pVjurSDOGEVCE2agFwSEsw== 375 | 376 | "@rollup/rollup-win32-x64-msvc@4.13.2": 377 | version "4.13.2" 378 | resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.2.tgz#851959c4c1c3c6647aba1f388198c8243aed6917" 379 | integrity sha512-7h7J2nokcdPePdKykd8wtc8QqqkqxIrUz7MHj6aNr8waBRU//NLDVnNjQnqQO6fqtjrtCdftpbTuOKAyrAQETQ== 380 | 381 | "@shikijs/core@1.2.3", "@shikijs/core@^1.2.0": 382 | version "1.2.3" 383 | resolved "https://registry.yarnpkg.com/@shikijs/core/-/core-1.2.3.tgz#551c257b6e1575ef0b87635c515dec134b32f611" 384 | integrity sha512-SM+aiQVaEK2P53dEcsvhq9+LJPr0rzwezHbMQhHaSrPN4OlOB4vp1qTdhVEKfMg6atdq8s9ZotWW/CSCzWftwg== 385 | 386 | "@shikijs/transformers@^1.2.0": 387 | version "1.2.3" 388 | resolved "https://registry.yarnpkg.com/@shikijs/transformers/-/transformers-1.2.3.tgz#e6539eb513c7460160bcef9a11570d01164748b0" 389 | integrity sha512-7m63LXtBW9feqH4+dafLe92oXm/vs05e6qaN1w5/Byozaf+RCqzOj3/b2/wu7OzTgLe3O9PzIrO3FebkGJK26g== 390 | dependencies: 391 | shiki "1.2.3" 392 | 393 | "@types/estree@1.0.5": 394 | version "1.0.5" 395 | resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" 396 | integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== 397 | 398 | "@types/linkify-it@*": 399 | version "3.0.5" 400 | resolved "https://registry.yarnpkg.com/@types/linkify-it/-/linkify-it-3.0.5.tgz#1e78a3ac2428e6d7e6c05c1665c242023a4601d8" 401 | integrity sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw== 402 | 403 | "@types/markdown-it@^13.0.7": 404 | version "13.0.7" 405 | resolved "https://registry.yarnpkg.com/@types/markdown-it/-/markdown-it-13.0.7.tgz#4a495115f470075bd4434a0438ac477a49c2e152" 406 | integrity sha512-U/CBi2YUUcTHBt5tjO2r5QV/x0Po6nsYwQU4Y04fBS6vfoImaiZ6f8bi3CjTCxBPQSO1LMyUqkByzi8AidyxfA== 407 | dependencies: 408 | "@types/linkify-it" "*" 409 | "@types/mdurl" "*" 410 | 411 | "@types/mdurl@*": 412 | version "1.0.5" 413 | resolved "https://registry.yarnpkg.com/@types/mdurl/-/mdurl-1.0.5.tgz#3e0d2db570e9fb6ccb2dc8fde0be1d79ac810d39" 414 | integrity sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA== 415 | 416 | "@types/node@*": 417 | version "18.14.6" 418 | resolved "https://registry.yarnpkg.com/@types/node/-/node-18.14.6.tgz#ae1973dd2b1eeb1825695bb11ebfb746d27e3e93" 419 | integrity sha512-93+VvleD3mXwlLI/xASjw0FzKcwzl3OdTCzm1LaRfqgS21gfFtK3zDXM5Op9TeeMsJVOaJ2VRDpT9q4Y3d0AvA== 420 | 421 | "@types/node@^17.0.5": 422 | version "17.0.45" 423 | resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.45.tgz#2c0fafd78705e7a18b7906b5201a522719dc5190" 424 | integrity sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw== 425 | 426 | "@types/sax@^1.2.1": 427 | version "1.2.4" 428 | resolved "https://registry.yarnpkg.com/@types/sax/-/sax-1.2.4.tgz#8221affa7f4f3cb21abd22f244cfabfa63e6a69e" 429 | integrity sha512-pSAff4IAxJjfAXUG6tFkO7dsSbTmf8CtUpfhhZ5VhkRpC4628tJhh3+V6H1E+/Gs9piSzYKT5yzHO5M4GG9jkw== 430 | dependencies: 431 | "@types/node" "*" 432 | 433 | "@types/web-bluetooth@^0.0.20": 434 | version "0.0.20" 435 | resolved "https://registry.yarnpkg.com/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz#f066abfcd1cbe66267cdbbf0de010d8a41b41597" 436 | integrity sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow== 437 | 438 | "@vitejs/plugin-vue@^5.0.4": 439 | version "5.0.4" 440 | resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue/-/plugin-vue-5.0.4.tgz#508d6a0f2440f86945835d903fcc0d95d1bb8a37" 441 | integrity sha512-WS3hevEszI6CEVEx28F8RjTX97k3KsrcY6kvTg7+Whm5y3oYvcqzVeGCU3hxSAn4uY2CLCkeokkGKpoctccilQ== 442 | 443 | "@vue/compiler-core@3.2.47": 444 | version "3.2.47" 445 | resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.2.47.tgz#3e07c684d74897ac9aa5922c520741f3029267f8" 446 | integrity sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig== 447 | dependencies: 448 | "@babel/parser" "^7.16.4" 449 | "@vue/shared" "3.2.47" 450 | estree-walker "^2.0.2" 451 | source-map "^0.6.1" 452 | 453 | "@vue/compiler-core@3.4.21": 454 | version "3.4.21" 455 | resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.4.21.tgz#868b7085378fc24e58c9aed14c8d62110a62be1a" 456 | integrity sha512-MjXawxZf2SbZszLPYxaFCjxfibYrzr3eYbKxwpLR9EQN+oaziSu3qKVbwBERj1IFIB8OLUewxB5m/BFzi613og== 457 | dependencies: 458 | "@babel/parser" "^7.23.9" 459 | "@vue/shared" "3.4.21" 460 | entities "^4.5.0" 461 | estree-walker "^2.0.2" 462 | source-map-js "^1.0.2" 463 | 464 | "@vue/compiler-dom@3.2.47": 465 | version "3.2.47" 466 | resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.2.47.tgz#a0b06caf7ef7056939e563dcaa9cbde30794f305" 467 | integrity sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ== 468 | dependencies: 469 | "@vue/compiler-core" "3.2.47" 470 | "@vue/shared" "3.2.47" 471 | 472 | "@vue/compiler-dom@3.4.21": 473 | version "3.4.21" 474 | resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.4.21.tgz#0077c355e2008207283a5a87d510330d22546803" 475 | integrity sha512-IZC6FKowtT1sl0CR5DpXSiEB5ayw75oT2bma1BEhV7RRR1+cfwLrxc2Z8Zq/RGFzJ8w5r9QtCOvTjQgdn0IKmA== 476 | dependencies: 477 | "@vue/compiler-core" "3.4.21" 478 | "@vue/shared" "3.4.21" 479 | 480 | "@vue/compiler-sfc@3.2.47": 481 | version "3.2.47" 482 | resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.2.47.tgz#1bdc36f6cdc1643f72e2c397eb1a398f5004ad3d" 483 | integrity sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ== 484 | dependencies: 485 | "@babel/parser" "^7.16.4" 486 | "@vue/compiler-core" "3.2.47" 487 | "@vue/compiler-dom" "3.2.47" 488 | "@vue/compiler-ssr" "3.2.47" 489 | "@vue/reactivity-transform" "3.2.47" 490 | "@vue/shared" "3.2.47" 491 | estree-walker "^2.0.2" 492 | magic-string "^0.25.7" 493 | postcss "^8.1.10" 494 | source-map "^0.6.1" 495 | 496 | "@vue/compiler-sfc@3.4.21": 497 | version "3.4.21" 498 | resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.4.21.tgz#4af920dc31ab99e1ff5d152b5fe0ad12181145b2" 499 | integrity sha512-me7epoTxYlY+2CUM7hy9PCDdpMPfIwrOvAXud2Upk10g4YLv9UBW7kL798TvMeDhPthkZ0CONNrK2GoeI1ODiQ== 500 | dependencies: 501 | "@babel/parser" "^7.23.9" 502 | "@vue/compiler-core" "3.4.21" 503 | "@vue/compiler-dom" "3.4.21" 504 | "@vue/compiler-ssr" "3.4.21" 505 | "@vue/shared" "3.4.21" 506 | estree-walker "^2.0.2" 507 | magic-string "^0.30.7" 508 | postcss "^8.4.35" 509 | source-map-js "^1.0.2" 510 | 511 | "@vue/compiler-ssr@3.2.47": 512 | version "3.2.47" 513 | resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.2.47.tgz#35872c01a273aac4d6070ab9d8da918ab13057ee" 514 | integrity sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw== 515 | dependencies: 516 | "@vue/compiler-dom" "3.2.47" 517 | "@vue/shared" "3.2.47" 518 | 519 | "@vue/compiler-ssr@3.4.21": 520 | version "3.4.21" 521 | resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.4.21.tgz#b84ae64fb9c265df21fc67f7624587673d324fef" 522 | integrity sha512-M5+9nI2lPpAsgXOGQobnIueVqc9sisBFexh5yMIMRAPYLa7+5wEJs8iqOZc1WAa9WQbx9GR2twgznU8LTIiZ4Q== 523 | dependencies: 524 | "@vue/compiler-dom" "3.4.21" 525 | "@vue/shared" "3.4.21" 526 | 527 | "@vue/devtools-api@^7.0.16": 528 | version "7.0.25" 529 | resolved "https://registry.yarnpkg.com/@vue/devtools-api/-/devtools-api-7.0.25.tgz#240bff9ee5bbe684e0c7b29696e98b497179368d" 530 | integrity sha512-fL6DlRp4MSXCLYcqYvKU7QhQZWE3Hfu7X8pC25BS74coJi7uJeSWs4tmrITcwFihNmC9S5GPiffkMdckkeWjzg== 531 | dependencies: 532 | "@vue/devtools-kit" "^7.0.25" 533 | 534 | "@vue/devtools-kit@^7.0.25": 535 | version "7.0.25" 536 | resolved "https://registry.yarnpkg.com/@vue/devtools-kit/-/devtools-kit-7.0.25.tgz#5090cf606facefefe95cef4121f5660c97dbfbf0" 537 | integrity sha512-wbLkSnOTsKHPb1mB9koFHUoSAF8Dp6Ii/ocR2+DeXFY4oKqIjCeJb/4Lihk4rgqEhCy1WwxLfTgNDo83VvDYkQ== 538 | dependencies: 539 | "@vue/devtools-shared" "^7.0.25" 540 | hookable "^5.5.3" 541 | mitt "^3.0.1" 542 | perfect-debounce "^1.0.0" 543 | speakingurl "^14.0.1" 544 | 545 | "@vue/devtools-shared@^7.0.25": 546 | version "7.0.25" 547 | resolved "https://registry.yarnpkg.com/@vue/devtools-shared/-/devtools-shared-7.0.25.tgz#3ac36cb730a2609b34a6e8a3731a07859fc0bbc2" 548 | integrity sha512-5+XYhcHSXuJSguYnNwL6/e6VTmXwCfryWQOkffh9ZU2zMByybqqqBrMWqvBkqTmMFCjPdzulo66xXbVbwLaElQ== 549 | dependencies: 550 | rfdc "^1.3.1" 551 | 552 | "@vue/reactivity-transform@3.2.47": 553 | version "3.2.47" 554 | resolved "https://registry.yarnpkg.com/@vue/reactivity-transform/-/reactivity-transform-3.2.47.tgz#e45df4d06370f8abf29081a16afd25cffba6d84e" 555 | integrity sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA== 556 | dependencies: 557 | "@babel/parser" "^7.16.4" 558 | "@vue/compiler-core" "3.2.47" 559 | "@vue/shared" "3.2.47" 560 | estree-walker "^2.0.2" 561 | magic-string "^0.25.7" 562 | 563 | "@vue/reactivity@3.2.47": 564 | version "3.2.47" 565 | resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.2.47.tgz#1d6399074eadfc3ed35c727e2fd707d6881140b6" 566 | integrity sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ== 567 | dependencies: 568 | "@vue/shared" "3.2.47" 569 | 570 | "@vue/reactivity@3.4.21": 571 | version "3.4.21" 572 | resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.4.21.tgz#affd3415115b8ebf4927c8d2a0d6a24bccfa9f02" 573 | integrity sha512-UhenImdc0L0/4ahGCyEzc/pZNwVgcglGy9HVzJ1Bq2Mm9qXOpP8RyNTjookw/gOCUlXSEtuZ2fUg5nrHcoqJcw== 574 | dependencies: 575 | "@vue/shared" "3.4.21" 576 | 577 | "@vue/runtime-core@3.2.47": 578 | version "3.2.47" 579 | resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.2.47.tgz#406ebade3d5551c00fc6409bbc1eeb10f32e121d" 580 | integrity sha512-RZxbLQIRB/K0ev0K9FXhNbBzT32H9iRtYbaXb0ZIz2usLms/D55dJR2t6cIEUn6vyhS3ALNvNthI+Q95C+NOpA== 581 | dependencies: 582 | "@vue/reactivity" "3.2.47" 583 | "@vue/shared" "3.2.47" 584 | 585 | "@vue/runtime-core@3.4.21": 586 | version "3.4.21" 587 | resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.4.21.tgz#3749c3f024a64c4c27ecd75aea4ca35634db0062" 588 | integrity sha512-pQthsuYzE1XcGZznTKn73G0s14eCJcjaLvp3/DKeYWoFacD9glJoqlNBxt3W2c5S40t6CCcpPf+jG01N3ULyrA== 589 | dependencies: 590 | "@vue/reactivity" "3.4.21" 591 | "@vue/shared" "3.4.21" 592 | 593 | "@vue/runtime-dom@3.2.47": 594 | version "3.2.47" 595 | resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.2.47.tgz#93e760eeaeab84dedfb7c3eaf3ed58d776299382" 596 | integrity sha512-ArXrFTjS6TsDei4qwNvgrdmHtD930KgSKGhS5M+j8QxXrDJYLqYw4RRcDy1bz1m1wMmb6j+zGLifdVHtkXA7gA== 597 | dependencies: 598 | "@vue/runtime-core" "3.2.47" 599 | "@vue/shared" "3.2.47" 600 | csstype "^2.6.8" 601 | 602 | "@vue/runtime-dom@3.4.21": 603 | version "3.4.21" 604 | resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.4.21.tgz#91f867ef64eff232cac45095ab28ebc93ac74588" 605 | integrity sha512-gvf+C9cFpevsQxbkRBS1NpU8CqxKw0ebqMvLwcGQrNpx6gqRDodqKqA+A2VZZpQ9RpK2f9yfg8VbW/EpdFUOJw== 606 | dependencies: 607 | "@vue/runtime-core" "3.4.21" 608 | "@vue/shared" "3.4.21" 609 | csstype "^3.1.3" 610 | 611 | "@vue/server-renderer@3.2.47": 612 | version "3.2.47" 613 | resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.2.47.tgz#8aa1d1871fc4eb5a7851aa7f741f8f700e6de3c0" 614 | integrity sha512-dN9gc1i8EvmP9RCzvneONXsKfBRgqFeFZLurmHOveL7oH6HiFXJw5OGu294n1nHc/HMgTy6LulU/tv5/A7f/LA== 615 | dependencies: 616 | "@vue/compiler-ssr" "3.2.47" 617 | "@vue/shared" "3.2.47" 618 | 619 | "@vue/server-renderer@3.4.21": 620 | version "3.4.21" 621 | resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.4.21.tgz#150751579d26661ee3ed26a28604667fa4222a97" 622 | integrity sha512-aV1gXyKSN6Rz+6kZ6kr5+Ll14YzmIbeuWe7ryJl5muJ4uwSwY/aStXTixx76TwkZFJLm1aAlA/HSWEJ4EyiMkg== 623 | dependencies: 624 | "@vue/compiler-ssr" "3.4.21" 625 | "@vue/shared" "3.4.21" 626 | 627 | "@vue/shared@3.2.47": 628 | version "3.2.47" 629 | resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.2.47.tgz#e597ef75086c6e896ff5478a6bfc0a7aa4bbd14c" 630 | integrity sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ== 631 | 632 | "@vue/shared@3.4.21": 633 | version "3.4.21" 634 | resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.4.21.tgz#de526a9059d0a599f0b429af7037cd0c3ed7d5a1" 635 | integrity sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g== 636 | 637 | "@vueuse/core@10.9.0", "@vueuse/core@^10.9.0": 638 | version "10.9.0" 639 | resolved "https://registry.yarnpkg.com/@vueuse/core/-/core-10.9.0.tgz#7d779a95cf0189de176fee63cee4ba44b3c85d64" 640 | integrity sha512-/1vjTol8SXnx6xewDEKfS0Ra//ncg4Hb0DaZiwKf7drgfMsKFExQ+FnnENcN6efPen+1kIzhLQoGSy0eDUVOMg== 641 | dependencies: 642 | "@types/web-bluetooth" "^0.0.20" 643 | "@vueuse/metadata" "10.9.0" 644 | "@vueuse/shared" "10.9.0" 645 | vue-demi ">=0.14.7" 646 | 647 | "@vueuse/integrations@^10.9.0": 648 | version "10.9.0" 649 | resolved "https://registry.yarnpkg.com/@vueuse/integrations/-/integrations-10.9.0.tgz#2b1a9556215ad3c1f96d39cbfbef102cf6e0ec05" 650 | integrity sha512-acK+A01AYdWSvL4BZmCoJAcyHJ6EqhmkQEXbQLwev1MY7NBnS+hcEMx/BzVoR9zKI+UqEPMD9u6PsyAuiTRT4Q== 651 | dependencies: 652 | "@vueuse/core" "10.9.0" 653 | "@vueuse/shared" "10.9.0" 654 | vue-demi ">=0.14.7" 655 | 656 | "@vueuse/metadata@10.9.0": 657 | version "10.9.0" 658 | resolved "https://registry.yarnpkg.com/@vueuse/metadata/-/metadata-10.9.0.tgz#769a1a9db65daac15cf98084cbf7819ed3758620" 659 | integrity sha512-iddNbg3yZM0X7qFY2sAotomgdHK7YJ6sKUvQqbvwnf7TmaVPxS4EJydcNsVejNdS8iWCtDk+fYXr7E32nyTnGA== 660 | 661 | "@vueuse/shared@10.9.0": 662 | version "10.9.0" 663 | resolved "https://registry.yarnpkg.com/@vueuse/shared/-/shared-10.9.0.tgz#13af2a348de15d07b7be2fd0c7fc9853a69d8fe0" 664 | integrity sha512-Uud2IWncmAfJvRaFYzv5OHDli+FbOzxiVEQdLCKQKLyhz94PIyFC3CHcH7EDMwIn8NPtD06+PNbC/PiO0LGLtw== 665 | dependencies: 666 | vue-demi ">=0.14.7" 667 | 668 | algoliasearch@^4.19.1: 669 | version "4.23.2" 670 | resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-4.23.2.tgz#3b7bc93d98f3965628c73a06cbf9203531324a9d" 671 | integrity sha512-8aCl055IsokLuPU8BzLjwzXjb7ty9TPcUFFOk0pYOwsE5DMVhE3kwCMFtsCFKcnoPZK7oObm+H5mbnSO/9ioxQ== 672 | dependencies: 673 | "@algolia/cache-browser-local-storage" "4.23.2" 674 | "@algolia/cache-common" "4.23.2" 675 | "@algolia/cache-in-memory" "4.23.2" 676 | "@algolia/client-account" "4.23.2" 677 | "@algolia/client-analytics" "4.23.2" 678 | "@algolia/client-common" "4.23.2" 679 | "@algolia/client-personalization" "4.23.2" 680 | "@algolia/client-search" "4.23.2" 681 | "@algolia/logger-common" "4.23.2" 682 | "@algolia/logger-console" "4.23.2" 683 | "@algolia/recommend" "4.23.2" 684 | "@algolia/requester-browser-xhr" "4.23.2" 685 | "@algolia/requester-common" "4.23.2" 686 | "@algolia/requester-node-http" "4.23.2" 687 | "@algolia/transporter" "4.23.2" 688 | 689 | arg@^5.0.0: 690 | version "5.0.2" 691 | resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" 692 | integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== 693 | 694 | csstype@^2.6.8: 695 | version "2.6.21" 696 | resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.21.tgz#2efb85b7cc55c80017c66a5ad7cbd931fda3a90e" 697 | integrity sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w== 698 | 699 | csstype@^3.1.3: 700 | version "3.1.3" 701 | resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" 702 | integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== 703 | 704 | entities@^4.5.0: 705 | version "4.5.0" 706 | resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" 707 | integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== 708 | 709 | esbuild@^0.20.1: 710 | version "0.20.2" 711 | resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.20.2.tgz#9d6b2386561766ee6b5a55196c6d766d28c87ea1" 712 | integrity sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g== 713 | optionalDependencies: 714 | "@esbuild/aix-ppc64" "0.20.2" 715 | "@esbuild/android-arm" "0.20.2" 716 | "@esbuild/android-arm64" "0.20.2" 717 | "@esbuild/android-x64" "0.20.2" 718 | "@esbuild/darwin-arm64" "0.20.2" 719 | "@esbuild/darwin-x64" "0.20.2" 720 | "@esbuild/freebsd-arm64" "0.20.2" 721 | "@esbuild/freebsd-x64" "0.20.2" 722 | "@esbuild/linux-arm" "0.20.2" 723 | "@esbuild/linux-arm64" "0.20.2" 724 | "@esbuild/linux-ia32" "0.20.2" 725 | "@esbuild/linux-loong64" "0.20.2" 726 | "@esbuild/linux-mips64el" "0.20.2" 727 | "@esbuild/linux-ppc64" "0.20.2" 728 | "@esbuild/linux-riscv64" "0.20.2" 729 | "@esbuild/linux-s390x" "0.20.2" 730 | "@esbuild/linux-x64" "0.20.2" 731 | "@esbuild/netbsd-x64" "0.20.2" 732 | "@esbuild/openbsd-x64" "0.20.2" 733 | "@esbuild/sunos-x64" "0.20.2" 734 | "@esbuild/win32-arm64" "0.20.2" 735 | "@esbuild/win32-ia32" "0.20.2" 736 | "@esbuild/win32-x64" "0.20.2" 737 | 738 | estree-walker@^2.0.2: 739 | version "2.0.2" 740 | resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" 741 | integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== 742 | 743 | focus-trap@^7.5.4: 744 | version "7.5.4" 745 | resolved "https://registry.yarnpkg.com/focus-trap/-/focus-trap-7.5.4.tgz#6c4e342fe1dae6add9c2aa332a6e7a0bbd495ba2" 746 | integrity sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w== 747 | dependencies: 748 | tabbable "^6.2.0" 749 | 750 | fsevents@~2.3.2: 751 | version "2.3.2" 752 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" 753 | integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== 754 | 755 | fsevents@~2.3.3: 756 | version "2.3.3" 757 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" 758 | integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== 759 | 760 | hookable@^5.5.3: 761 | version "5.5.3" 762 | resolved "https://registry.yarnpkg.com/hookable/-/hookable-5.5.3.tgz#6cfc358984a1ef991e2518cb9ed4a778bbd3215d" 763 | integrity sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ== 764 | 765 | magic-string@^0.25.7: 766 | version "0.25.9" 767 | resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" 768 | integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== 769 | dependencies: 770 | sourcemap-codec "^1.4.8" 771 | 772 | magic-string@^0.30.7: 773 | version "0.30.8" 774 | resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.8.tgz#14e8624246d2bedba70d5462aa99ac9681844613" 775 | integrity sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ== 776 | dependencies: 777 | "@jridgewell/sourcemap-codec" "^1.4.15" 778 | 779 | mark.js@8.11.1: 780 | version "8.11.1" 781 | resolved "https://registry.yarnpkg.com/mark.js/-/mark.js-8.11.1.tgz#180f1f9ebef8b0e638e4166ad52db879beb2ffc5" 782 | integrity sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ== 783 | 784 | minisearch@^6.3.0: 785 | version "6.3.0" 786 | resolved "https://registry.yarnpkg.com/minisearch/-/minisearch-6.3.0.tgz#985a2f1ca3c73c2d65af94f0616bfe57164b0b6b" 787 | integrity sha512-ihFnidEeU8iXzcVHy74dhkxh/dn8Dc08ERl0xwoMMGqp4+LvRSCgicb+zGqWthVokQKvCSxITlh3P08OzdTYCQ== 788 | 789 | mitt@^3.0.1: 790 | version "3.0.1" 791 | resolved "https://registry.yarnpkg.com/mitt/-/mitt-3.0.1.tgz#ea36cf0cc30403601ae074c8f77b7092cdab36d1" 792 | integrity sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw== 793 | 794 | nanoid@^3.3.4: 795 | version "3.3.4" 796 | resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" 797 | integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== 798 | 799 | nanoid@^3.3.7: 800 | version "3.3.7" 801 | resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" 802 | integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== 803 | 804 | perfect-debounce@^1.0.0: 805 | version "1.0.0" 806 | resolved "https://registry.yarnpkg.com/perfect-debounce/-/perfect-debounce-1.0.0.tgz#9c2e8bc30b169cc984a58b7d5b28049839591d2a" 807 | integrity sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA== 808 | 809 | picocolors@^1.0.0: 810 | version "1.0.0" 811 | resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" 812 | integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== 813 | 814 | postcss@^8.1.10: 815 | version "8.4.21" 816 | resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.21.tgz#c639b719a57efc3187b13a1d765675485f4134f4" 817 | integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg== 818 | dependencies: 819 | nanoid "^3.3.4" 820 | picocolors "^1.0.0" 821 | source-map-js "^1.0.2" 822 | 823 | postcss@^8.4.35, postcss@^8.4.38: 824 | version "8.4.38" 825 | resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" 826 | integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== 827 | dependencies: 828 | nanoid "^3.3.7" 829 | picocolors "^1.0.0" 830 | source-map-js "^1.2.0" 831 | 832 | preact@^10.0.0: 833 | version "10.12.1" 834 | resolved "https://registry.yarnpkg.com/preact/-/preact-10.12.1.tgz#8f9cb5442f560e532729b7d23d42fd1161354a21" 835 | integrity sha512-l8386ixSsBdbreOAkqtrwqHwdvR35ID8c3rKPa8lCWuO86dBi32QWHV4vfsZK1utLLFMvw+Z5Ad4XLkZzchscg== 836 | 837 | rfdc@^1.3.1: 838 | version "1.3.1" 839 | resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.1.tgz#2b6d4df52dffe8bb346992a10ea9451f24373a8f" 840 | integrity sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg== 841 | 842 | rollup@^4.13.0: 843 | version "4.13.2" 844 | resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.13.2.tgz#ac57d2dc48e8f5562f5a6daadb9caee590069262" 845 | integrity sha512-MIlLgsdMprDBXC+4hsPgzWUasLO9CE4zOkj/u6j+Z6j5A4zRY+CtiXAdJyPtgCsc42g658Aeh1DlrdVEJhsL2g== 846 | dependencies: 847 | "@types/estree" "1.0.5" 848 | optionalDependencies: 849 | "@rollup/rollup-android-arm-eabi" "4.13.2" 850 | "@rollup/rollup-android-arm64" "4.13.2" 851 | "@rollup/rollup-darwin-arm64" "4.13.2" 852 | "@rollup/rollup-darwin-x64" "4.13.2" 853 | "@rollup/rollup-linux-arm-gnueabihf" "4.13.2" 854 | "@rollup/rollup-linux-arm64-gnu" "4.13.2" 855 | "@rollup/rollup-linux-arm64-musl" "4.13.2" 856 | "@rollup/rollup-linux-powerpc64le-gnu" "4.13.2" 857 | "@rollup/rollup-linux-riscv64-gnu" "4.13.2" 858 | "@rollup/rollup-linux-s390x-gnu" "4.13.2" 859 | "@rollup/rollup-linux-x64-gnu" "4.13.2" 860 | "@rollup/rollup-linux-x64-musl" "4.13.2" 861 | "@rollup/rollup-win32-arm64-msvc" "4.13.2" 862 | "@rollup/rollup-win32-ia32-msvc" "4.13.2" 863 | "@rollup/rollup-win32-x64-msvc" "4.13.2" 864 | fsevents "~2.3.2" 865 | 866 | sax@^1.2.4: 867 | version "1.2.4" 868 | resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" 869 | integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== 870 | 871 | shiki@1.2.3, shiki@^1.2.0: 872 | version "1.2.3" 873 | resolved "https://registry.yarnpkg.com/shiki/-/shiki-1.2.3.tgz#7da5c145205ce563245bd883d353a99ffa1e2a19" 874 | integrity sha512-+v7lO5cJMeV2N2ySK4l+51YX3wTh5I49SLjAOs1ch1DbUfeEytU1Ac9KaZPoZJCVBGycDZ09OBQN5nbcPFc5FQ== 875 | dependencies: 876 | "@shikijs/core" "1.2.3" 877 | 878 | sitemap@^7.1.1: 879 | version "7.1.1" 880 | resolved "https://registry.yarnpkg.com/sitemap/-/sitemap-7.1.1.tgz#eeed9ad6d95499161a3eadc60f8c6dce4bea2bef" 881 | integrity sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg== 882 | dependencies: 883 | "@types/node" "^17.0.5" 884 | "@types/sax" "^1.2.1" 885 | arg "^5.0.0" 886 | sax "^1.2.4" 887 | 888 | source-map-js@^1.0.2: 889 | version "1.0.2" 890 | resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" 891 | integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== 892 | 893 | source-map-js@^1.2.0: 894 | version "1.2.0" 895 | resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" 896 | integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== 897 | 898 | source-map@^0.6.1: 899 | version "0.6.1" 900 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 901 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 902 | 903 | sourcemap-codec@^1.4.8: 904 | version "1.4.8" 905 | resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" 906 | integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== 907 | 908 | speakingurl@^14.0.1: 909 | version "14.0.1" 910 | resolved "https://registry.yarnpkg.com/speakingurl/-/speakingurl-14.0.1.tgz#f37ec8ddc4ab98e9600c1c9ec324a8c48d772a53" 911 | integrity sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ== 912 | 913 | tabbable@^6.2.0: 914 | version "6.2.0" 915 | resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-6.2.0.tgz#732fb62bc0175cfcec257330be187dcfba1f3b97" 916 | integrity sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew== 917 | 918 | vite@^5.2.2: 919 | version "5.2.7" 920 | resolved "https://registry.yarnpkg.com/vite/-/vite-5.2.7.tgz#e1b8a985eb54fcb9467d7f7f009d87485016df6e" 921 | integrity sha512-k14PWOKLI6pMaSzAuGtT+Cf0YmIx12z9YGon39onaJNy8DLBfBJrzg9FQEmkAM5lpHBZs9wksWAsyF/HkpEwJA== 922 | dependencies: 923 | esbuild "^0.20.1" 924 | postcss "^8.4.38" 925 | rollup "^4.13.0" 926 | optionalDependencies: 927 | fsevents "~2.3.3" 928 | 929 | vitepress@^1.0.2: 930 | version "1.0.2" 931 | resolved "https://registry.yarnpkg.com/vitepress/-/vitepress-1.0.2.tgz#5ce94d38443fa273bfa7f75c0bfb3eb1babb94b5" 932 | integrity sha512-bEj9yTEdWyewJFOhEREZF+mXuAgOq27etuJZT6DZSp+J3XpQstXMJc5piSVwhZBtuj8OfA0iXy+jdP1c71KMYQ== 933 | dependencies: 934 | "@docsearch/css" "^3.6.0" 935 | "@docsearch/js" "^3.6.0" 936 | "@shikijs/core" "^1.2.0" 937 | "@shikijs/transformers" "^1.2.0" 938 | "@types/markdown-it" "^13.0.7" 939 | "@vitejs/plugin-vue" "^5.0.4" 940 | "@vue/devtools-api" "^7.0.16" 941 | "@vueuse/core" "^10.9.0" 942 | "@vueuse/integrations" "^10.9.0" 943 | focus-trap "^7.5.4" 944 | mark.js "8.11.1" 945 | minisearch "^6.3.0" 946 | shiki "^1.2.0" 947 | vite "^5.2.2" 948 | vue "^3.4.21" 949 | 950 | vue-demi@>=0.14.7: 951 | version "0.14.7" 952 | resolved "https://registry.yarnpkg.com/vue-demi/-/vue-demi-0.14.7.tgz#8317536b3ef74c5b09f268f7782e70194567d8f2" 953 | integrity sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA== 954 | 955 | vue@^3.2.47: 956 | version "3.2.47" 957 | resolved "https://registry.yarnpkg.com/vue/-/vue-3.2.47.tgz#3eb736cbc606fc87038dbba6a154707c8a34cff0" 958 | integrity sha512-60188y/9Dc9WVrAZeUVSDxRQOZ+z+y5nO2ts9jWXSTkMvayiWxCWOWtBQoYjLeccfXkiiPZWAHcV+WTPhkqJHQ== 959 | dependencies: 960 | "@vue/compiler-dom" "3.2.47" 961 | "@vue/compiler-sfc" "3.2.47" 962 | "@vue/runtime-dom" "3.2.47" 963 | "@vue/server-renderer" "3.2.47" 964 | "@vue/shared" "3.2.47" 965 | 966 | vue@^3.4.21: 967 | version "3.4.21" 968 | resolved "https://registry.yarnpkg.com/vue/-/vue-3.4.21.tgz#69ec30e267d358ee3a0ce16612ba89e00aaeb731" 969 | integrity sha512-5hjyV/jLEIKD/jYl4cavMcnzKwjMKohureP8ejn3hhEjwhWIhWeuzL2kJAjzl/WyVsgPY56Sy4Z40C3lVshxXA== 970 | dependencies: 971 | "@vue/compiler-dom" "3.4.21" 972 | "@vue/compiler-sfc" "3.4.21" 973 | "@vue/runtime-dom" "3.4.21" 974 | "@vue/server-renderer" "3.4.21" 975 | "@vue/shared" "3.4.21" 976 | --------------------------------------------------------------------------------