Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@
/coverage-report/
/coverage.xml
/build/
.caliber/
24 changes: 12 additions & 12 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# AGENTS.md — detain/phlex-shared
# AGENTS.md — detain/phlix-shared

Agent brief for the `phlex-shared` package. This package is **pure
Agent brief for the `phlix-shared` package. This package is **pure
interfaces and value objects**. Keep it that way.

## Conventions
Expand All @@ -9,8 +9,8 @@ interfaces and value objects**. Keep it that way.
first-class callable syntax, etc.) where they aid clarity.
- **`declare(strict_types=1);`** at the top of every PHP file.
- **PSR-12** coding standard, enforced by phpcs.
- **PSR-4 autoload** — `Phlex\Shared\` → `src/`,
`Phlex\Shared\Tests\` → `tests/`. Namespaces mirror directories.
- **PSR-4 autoload** — `Phlix\Shared\` → `src/`,
`Phlix\Shared\Tests\` → `tests/`. Namespaces mirror directories.
- **Static analysis bar:** PHPStan level 9 and Psalm errorLevel 1, both
green from day 1. No baselines.
- **Zero I/O.** No filesystem reads, no network, no DB, no logging
Expand All @@ -28,11 +28,11 @@ interfaces and value objects**. Keep it that way.

```
src/
Plugin/ # Phlex\Shared\Plugin\* — lifecycle, manifest, types
Events/ # Phlex\Shared\Events\* — event name constants & DTOs
Auth/ # Phlex\Shared\Auth\* — token, identity, claim types
Hub/ # Phlex\Shared\Hub\* — phlexphlex-hub protocol types
Arr/ # Phlex\Shared\Arr\* — typed array helpers (PHPStan-friendly)
Plugin/ # Phlix\Shared\Plugin\* — lifecycle, manifest, types
Events/ # Phlix\Shared\Events\* — event name constants & DTOs
Auth/ # Phlix\Shared\Auth\* — token, identity, claim types
Hub/ # Phlix\Shared\Hub\* — phlixphlix-hub protocol types
Arr/ # Phlix\Shared\Arr\* — typed array helpers (PHPStan-friendly)
Version.php
tests/
(mirror of src/ — PHPUnit 10)
Expand All @@ -44,10 +44,10 @@ Subdirectories materialise as B.3 lands real interfaces.
## Layout rationale

See `plans/expansion/b.1-shared-design.md` in
[`detain/phlex`](https://github.com/detain/phlex) for the full WHAT
[`detain/phlix`](https://github.com/detain/phlix) for the full WHAT
MOVES WHERE table and the design rationale for the namespace split.
Do not re-litigate that design here — propose changes in a new plan
step against `detain/phlex` if needed.
step against `detain/phlix` if needed.

## Before committing

Expand All @@ -64,5 +64,5 @@ If any tool emits warnings, fix the code — do not add to a baseline.
## Versioning

[Semantic Versioning](https://semver.org/spec/v2.0.0.html). Bump the
`Phlex\Shared\Version::VERSION` constant in lockstep with the git tag
`Phlix\Shared\Version::VERSION` constant in lockstep with the git tag
and the `CHANGELOG.md` heading.
48 changes: 24 additions & 24 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Changelog

All notable changes to `detain/phlex-shared` are documented here.
All notable changes to `detain/phlix-shared` are documented here.

This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

Expand All @@ -9,53 +9,53 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
## [0.4.0] — 2026-05-18

### Added
- `Phlex\Shared\Arr\ArrClientInterface` — common interface for Sonarr/Radarr
- `Phlix\Shared\Arr\ArrClientInterface` — common interface for Sonarr/Radarr
HTTP clients (queue, quality profiles, tags, test-connection).
- `Phlex\Shared\Arr\ArrClientFactory` — factory that instantiates Sonarr/Radarr
- `Phlix\Shared\Arr\ArrClientFactory` — factory that instantiates Sonarr/Radarr
clients from instance config arrays.
- `Phlex\Shared\Arr\SyncResult` — immutable value object returned by sync flows.
- `Phlex\Shared\Arr\SonarrClient` — typed Sonarr v3 HTTP client.
- `Phlex\Shared\Arr\RadarrClient` — typed Radarr v3 HTTP client.
- `Phlex\Shared\Arr\BazarrClient` — typed Bazarr HTTP client.
- `Phlex\Shared\Arr\ProwlarrClient` — typed Prowlarr HTTP client.
- `Phlex\Shared\Arr\TrashGuidesProvider` — fetches TRaSH-Guides quality
- `Phlix\Shared\Arr\SyncResult` — immutable value object returned by sync flows.
- `Phlix\Shared\Arr\SonarrClient` — typed Sonarr v3 HTTP client.
- `Phlix\Shared\Arr\RadarrClient` — typed Radarr v3 HTTP client.
- `Phlix\Shared\Arr\BazarrClient` — typed Bazarr HTTP client.
- `Phlix\Shared\Arr\ProwlarrClient` — typed Prowlarr HTTP client.
- `Phlix\Shared\Arr\TrashGuidesProvider` — fetches TRaSH-Guides quality
profile + custom format JSON.
- `psr/log` runtime dependency to allow optional PSR-3 loggers on the arr
clients without pulling phlex-server's concrete `StructuredLogger`.
clients without pulling phlix-server's concrete `StructuredLogger`.

### Changed
- Arr classes now type-hint `Psr\Log\LoggerInterface` instead of phlex-server's
- Arr classes now type-hint `Psr\Log\LoggerInterface` instead of phlix-server's
`StructuredLogger`, allowing the hub and any other PSR-3 consumer to inject
its own logger. Required for Step K.1 (arr clients shared between
phlex-server and phlex-hub) and K.3 (hub-side request fulfillment).
phlix-server and phlix-hub) and K.3 (hub-side request fulfillment).

## [0.3.0] — 2026-05-17

### Added
- `Phlex\Shared\Auth\ProviderInterface` — core interface for pluggable external
- `Phlix\Shared\Auth\ProviderInterface` — core interface for pluggable external
authentication providers (OIDC, LDAP, SAML, passkeys). Zero I/O dependencies
so both phlex-server and phlex-hub can implement providers without pulling in
so both phlix-server and phlix-hub can implement providers without pulling in
server/runtime dependencies.
- `Phlex\Shared\Auth\AuthResult` — immutable value object returned by
- `Phlix\Shared\Auth\AuthResult` — immutable value object returned by
`ProviderInterface::authenticate()`. Captures success/failure, local userId,
provider externalId, error code, and arbitrary attributes (email, name,
avatarUrl …).
- `Phlex\Shared\Auth\UserInfo` — immutable value object returned by
- `Phlix\Shared\Auth\UserInfo` — immutable value object returned by
`ProviderInterface::getUserInfo()`. Describes an external identity for
account linking and profile display.

## [0.2.0] — 2026-05-17

### Added
- `Phlex\Shared\Plugin\LifecycleInterface` — moved from `Phlex\Plugins\Contract\LifecycleInterface` in `phlex-server`.
- `Phlex\Shared\Plugin\{Manifest,ManifestType,ManifestValidationError,EventNameMap}` — moved from `Phlex\Plugins\*` in `phlex-server`. Validator logic stays in `phlex-server` (`Phlex\Plugins\Manifest\ManifestSchema`).
- `Phlex\Shared\Events\{AbstractEvent, Playback\*, Library\*, Auth\*}` — moved from `Phlex\Common\Events\*` in `phlex-server` (the 12 readonly event DTOs). PSR-14 dispatcher wiring stays in `phlex-server`.
- `Phlex\Shared\Auth\JwtClaims` — new value object capturing the Phlex JWT payload shape; consumed by `phlex-hub` starting Phase C.5.
- `Phlex\Shared\Hub\{ClaimRequest,ClaimResponse,ServerInfoDto,HeartbeatDto}` — new placeholder DTOs for the hub claim/heartbeat protocol; consumed by `phlex-hub` starting Phase C.1.
- `Phlex\Shared\Arr\.gitkeep` — namespace reserved for Phase K.1's `Sonarr`/`Radarr`/etc. typed clients.
- `Phlix\Shared\Plugin\LifecycleInterface` — moved from `Phlix\Plugins\Contract\LifecycleInterface` in `phlix-server`.
- `Phlix\Shared\Plugin\{Manifest,ManifestType,ManifestValidationError,EventNameMap}` — moved from `Phlix\Plugins\*` in `phlix-server`. Validator logic stays in `phlix-server` (`Phlix\Plugins\Manifest\ManifestSchema`).
- `Phlix\Shared\Events\{AbstractEvent, Playback\*, Library\*, Auth\*}` — moved from `Phlix\Common\Events\*` in `phlix-server` (the 12 readonly event DTOs). PSR-14 dispatcher wiring stays in `phlix-server`.
- `Phlix\Shared\Auth\JwtClaims` — new value object capturing the Phlix JWT payload shape; consumed by `phlix-hub` starting Phase C.5.
- `Phlix\Shared\Hub\{ClaimRequest,ClaimResponse,ServerInfoDto,HeartbeatDto}` — new placeholder DTOs for the hub claim/heartbeat protocol; consumed by `phlix-hub` starting Phase C.1.
- `Phlix\Shared\Arr\.gitkeep` — namespace reserved for Phase K.1's `Sonarr`/`Radarr`/etc. typed clients.

## [0.1.0] — 2026-05-17

### Added
- Initial release: composer package scaffolding, `Phlex\Shared\Version` marker class, CI workflow.
- Real interfaces and DTOs land in v0.2.0 per `plans/expansion/b.1-shared-design.md` in `detain/phlex`.
- Initial release: composer package scaffolding, `Phlix\Shared\Version` marker class, CI workflow.
- Real interfaces and DTOs land in v0.2.0 per `plans/expansion/b.1-shared-design.md` in `detain/phlix`.
2 changes: 1 addition & 1 deletion LICENSE
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
MIT License

Copyright (c) 2026 Joe Huss / Phlex Project
Copyright (c) 2026 Joe Huss / Phlix Project

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
Expand Down
30 changes: 15 additions & 15 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,22 +1,22 @@
# detain/phlex-shared
# detain/phlix-shared

Shared interfaces, DTOs, event names, and protocol types used by both
[`detain/phlex-server`](https://github.com/detain/phlex) (the media server)
and `detain/phlex-hub` (the multi-server hub, forthcoming). Composer-installable,
[`detain/phlix-server`](https://github.com/detain/phlix) (the media server)
and `detain/phlix-hub` (the multi-server hub, forthcoming). Composer-installable,
PHP 8.3+, zero I/O — pure interfaces and value objects only.

## Status

**v0.2.0 — Plugin / Events / Auth / Hub namespaces.** Shipped:

- `Phlex\Shared\Plugin\{LifecycleInterface, Manifest, ManifestType, ManifestValidationError, EventNameMap}`
- `Phlex\Shared\Events\{AbstractEvent, Playback\*, Library\*, Auth\*}` — 12 event DTOs.
- `Phlex\Shared\Auth\JwtClaims`
- `Phlex\Shared\Hub\{ClaimRequest, ClaimResponse, ServerInfoDto, HeartbeatDto}`
- `Phlex\Shared\Arr\` — namespace reserved for Phase K.1.
- `Phlix\Shared\Plugin\{LifecycleInterface, Manifest, ManifestType, ManifestValidationError, EventNameMap}`
- `Phlix\Shared\Events\{AbstractEvent, Playback\*, Library\*, Auth\*}` — 12 event DTOs.
- `Phlix\Shared\Auth\JwtClaims`
- `Phlix\Shared\Hub\{ClaimRequest, ClaimResponse, ServerInfoDto, HeartbeatDto}`
- `Phlix\Shared\Arr\` — namespace reserved for Phase K.1.

The PSR-14 dispatcher wiring (Tukio) and the manifest JSON-Schema
validator stay in `phlex-server` and consume this package via Composer.
validator stay in `phlix-server` and consume this package via Composer.

## Requirements

Expand All @@ -30,33 +30,33 @@ no Smarty. It is intended to be safely required by any PHP 8.3+ codebase.

## Installation

Until `detain/phlex-shared` is published to Packagist (planned post-v1.0),
Until `detain/phlix-shared` is published to Packagist (planned post-v1.0),
consumers require it via a Composer VCS repository entry:

```json
{
"repositories": [
{
"type": "vcs",
"url": "git@github.com:detain/phlex-shared.git"
"url": "git@github.com:detain/phlix-shared.git"
}
],
"require": {
"detain/phlex-shared": "^0.2"
"detain/phlix-shared": "^0.2"
}
}
```

Then:

```bash
composer update detain/phlex-shared
composer update detain/phlix-shared
```

## Related repositories

- [`detain/phlex`](https://github.com/detain/phlex) — the Phlex media server (consumes this package from B.3 onward).
- `detain/phlex-hub` — the multi-server hub (forthcoming, B.5+).
- [`detain/phlix`](https://github.com/detain/phlix) — the Phlix media server (consumes this package from B.3 onward).
- `detain/phlix-hub` — the multi-server hub (forthcoming, B.5+).

## Development

Expand Down
8 changes: 4 additions & 4 deletions composer.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "detain/phlex-shared",
"description": "Shared interfaces, DTOs, event names, and protocol types used by both phlex-server and phlex-hub. Composer-installable, PHP 8.3+, zero I/O.",
"name": "detain/phlix-shared",
"description": "Shared interfaces, DTOs, event names, and protocol types used by both phlix-server and phlix-hub. Composer-installable, PHP 8.3+, zero I/O.",
"type": "library",
"license": "MIT",
"require": {
Expand All @@ -18,12 +18,12 @@
},
"autoload": {
"psr-4": {
"Phlex\\Shared\\": "src/"
"Phlix\\Shared\\": "src/"
}
},
"autoload-dev": {
"psr-4": {
"Phlex\\Shared\\Tests\\": "tests/"
"Phlix\\Shared\\Tests\\": "tests/"
}
},
"minimum-stability": "stable",
Expand Down
4 changes: 2 additions & 2 deletions phpcs.xml.dist
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<ruleset name="phlex-shared">
<description>PSR-12 coding standard for detain/phlex-shared.</description>
<ruleset name="phlix-shared">
<description>PSR-12 coding standard for detain/phlix-shared.</description>

<file>src</file>

Expand Down
4 changes: 2 additions & 2 deletions src/Arr/ArrClientFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@

declare(strict_types=1);

namespace Phlex\Shared\Arr;
namespace Phlix\Shared\Arr;

use Psr\Log\LoggerInterface;

/**
* Factory for creating Sonarr/Radarr API clients from config.
*
* @package Phlex\Shared\Arr
* @package Phlix\Shared\Arr
* @since 0.12.0
*/
class ArrClientFactory
Expand Down
4 changes: 2 additions & 2 deletions src/Arr/ArrClientInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@

declare(strict_types=1);

namespace Phlex\Shared\Arr;
namespace Phlix\Shared\Arr;

/**
* Common interface for Sonarr/Radarr API clients.
*
* @package Phlex\Shared\Arr
* @package Phlix\Shared\Arr
* @since 0.12.0
*/
interface ArrClientInterface
Expand Down
4 changes: 2 additions & 2 deletions src/Arr/BazarrClient.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,15 @@

declare(strict_types=1);

namespace Phlex\Shared\Arr;
namespace Phlix\Shared\Arr;

use Psr\Log\LoggerInterface;
use RuntimeException;

/**
* Bazarr API client for subtitle management.
*
* @package Phlex\Shared\Arr
* @package Phlix\Shared\Arr
* @since 0.12.0
*/
class BazarrClient
Expand Down Expand Up @@ -75,7 +75,7 @@
*
* @param string $videoFilePath The full path to the video file.
* @param string $languageCode The language code for the subtitle (e.g. `en`, `es`, `pt-BR`).
* @return array<string, mixed> Download result.

Check failure on line 78 in src/Arr/BazarrClient.php

View workflow job for this annotation

GitHub Actions / Psalm Static Analysis

MixedReturnTypeCoercion

src/Arr/BazarrClient.php:78:16: MixedReturnTypeCoercion: The declared return type 'array<string, mixed>' for Phlix\Shared\Arr\BazarrClient::downloadSubtitle is more specific than the inferred return type 'array<array-key, mixed>' (see https://psalm.dev/197)
*/
public function downloadSubtitle(string $videoFilePath, string $languageCode): array
{
Expand All @@ -84,7 +84,7 @@
'language' => $languageCode,
];

return $this->post('/api/v1/subtitles/download', $payload);

Check failure on line 87 in src/Arr/BazarrClient.php

View workflow job for this annotation

GitHub Actions / Psalm Static Analysis

MixedReturnTypeCoercion

src/Arr/BazarrClient.php:87:16: MixedReturnTypeCoercion: The type 'array<array-key, mixed>' is more general than the declared return type 'array<string, mixed>' for Phlix\Shared\Arr\BazarrClient::downloadSubtitle (see https://psalm.dev/197)
}

/**
Expand Down Expand Up @@ -140,7 +140,7 @@

/** @var string|false */
$responseBody = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

Check failure on line 143 in src/Arr/BazarrClient.php

View workflow job for this annotation

GitHub Actions / Psalm Static Analysis

MixedAssignment

src/Arr/BazarrClient.php:143:9: MixedAssignment: Unable to determine the type that $httpCode is being assigned to (see https://psalm.dev/032)
$curlErrno = curl_errno($ch);
$curlError = curl_error($ch);
curl_close($ch);
Expand All @@ -158,12 +158,12 @@
}

if ($httpCode >= 400) {
throw new RuntimeException('Bazarr API error: HTTP ' . $httpCode);

Check failure on line 161 in src/Arr/BazarrClient.php

View workflow job for this annotation

GitHub Actions / Psalm Static Analysis

MixedOperand

src/Arr/BazarrClient.php:161:68: MixedOperand: Right operand cannot be mixed (see https://psalm.dev/059)
}

/** @var array<mixed, mixed> */
$decoded = json_decode($responseBody, true);
if (!is_array($decoded)) {

Check failure on line 166 in src/Arr/BazarrClient.php

View workflow job for this annotation

GitHub Actions / Psalm Static Analysis

DocblockTypeContradiction

src/Arr/BazarrClient.php:166:14: DocblockTypeContradiction: Docblock-defined type array<array-key, mixed> for $decoded is always array<array-key, mixed> (see https://psalm.dev/155)
throw new RuntimeException('Invalid JSON response from Bazarr');
}

Expand Down Expand Up @@ -204,7 +204,7 @@

/** @var string|false */
$responseBody = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

Check failure on line 207 in src/Arr/BazarrClient.php

View workflow job for this annotation

GitHub Actions / Psalm Static Analysis

MixedAssignment

src/Arr/BazarrClient.php:207:9: MixedAssignment: Unable to determine the type that $httpCode is being assigned to (see https://psalm.dev/032)
$curlErrno = curl_errno($ch);
$curlError = curl_error($ch);
curl_close($ch);
Expand All @@ -222,7 +222,7 @@
}

if ($httpCode >= 400) {
throw new RuntimeException('Bazarr API error: HTTP ' . $httpCode);

Check failure on line 225 in src/Arr/BazarrClient.php

View workflow job for this annotation

GitHub Actions / Psalm Static Analysis

MixedOperand

src/Arr/BazarrClient.php:225:68: MixedOperand: Right operand cannot be mixed (see https://psalm.dev/059)
}

if ($responseBody === '') {
Expand All @@ -231,7 +231,7 @@

/** @var array<mixed, mixed> */
$decoded = json_decode($responseBody, true);
if (!is_array($decoded)) {

Check failure on line 234 in src/Arr/BazarrClient.php

View workflow job for this annotation

GitHub Actions / Psalm Static Analysis

DocblockTypeContradiction

src/Arr/BazarrClient.php:234:14: DocblockTypeContradiction: Docblock-defined type array<array-key, mixed> for $decoded is always array<array-key, mixed> (see https://psalm.dev/155)
throw new RuntimeException('Invalid JSON response from Bazarr');
}

Expand Down
4 changes: 2 additions & 2 deletions src/Arr/ProwlarrClient.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,15 @@

declare(strict_types=1);

namespace Phlex\Shared\Arr;
namespace Phlix\Shared\Arr;

use Psr\Log\LoggerInterface;
use RuntimeException;

/**
* Prowlarr API client for indexer management.
*
* @package Phlex\Shared\Arr
* @package Phlix\Shared\Arr
* @since 0.12.0
*/
class ProwlarrClient
Expand Down Expand Up @@ -55,11 +55,11 @@
* Returns statistics for a specific indexer.
*
* @param int $indexerId The indexer ID.
* @return array<string, mixed> Indexer stats.

Check failure on line 58 in src/Arr/ProwlarrClient.php

View workflow job for this annotation

GitHub Actions / Psalm Static Analysis

MixedReturnTypeCoercion

src/Arr/ProwlarrClient.php:58:16: MixedReturnTypeCoercion: The declared return type 'array<string, mixed>' for Phlix\Shared\Arr\ProwlarrClient::getIndexerStats is more specific than the inferred return type 'array<array-key, mixed>' (see https://psalm.dev/197)
*/
public function getIndexerStats(int $indexerId): array
{
return $this->get('/api/v1/indexer/' . $indexerId);

Check failure on line 62 in src/Arr/ProwlarrClient.php

View workflow job for this annotation

GitHub Actions / Psalm Static Analysis

MixedReturnTypeCoercion

src/Arr/ProwlarrClient.php:62:16: MixedReturnTypeCoercion: The type 'array<array-key, mixed>' is more general than the declared return type 'array<string, mixed>' for Phlix\Shared\Arr\ProwlarrClient::getIndexerStats (see https://psalm.dev/197)
}

/**
Expand Down
4 changes: 2 additions & 2 deletions src/Arr/RadarrClient.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,15 @@

declare(strict_types=1);

namespace Phlex\Shared\Arr;
namespace Phlix\Shared\Arr;

use Psr\Log\LoggerInterface;
use RuntimeException;

/**
* Radarr v3 API client for movie management.
*
* @package Phlex\Shared\Arr
* @package Phlix\Shared\Arr
* @since 0.12.0
*/
class RadarrClient implements ArrClientInterface
Expand Down
4 changes: 2 additions & 2 deletions src/Arr/SonarrClient.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,15 @@

declare(strict_types=1);

namespace Phlex\Shared\Arr;
namespace Phlix\Shared\Arr;

use Psr\Log\LoggerInterface;
use RuntimeException;

/**
* Sonarr v3 API client for TV series management.
*
* @package Phlex\Shared\Arr
* @package Phlix\Shared\Arr
* @since 0.12.0
*/
class SonarrClient implements ArrClientInterface
Expand Down
4 changes: 2 additions & 2 deletions src/Arr/SyncResult.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@

declare(strict_types=1);

namespace Phlex\Shared\Arr;
namespace Phlix\Shared\Arr;

use DateTimeImmutable;

/**
* Value object representing the result of a TRaSH-Guides sync operation.
*
* @package Phlex\Shared\Arr
* @package Phlix\Shared\Arr
* @since 0.12.0
*/
class SyncResult
Expand Down
Loading
Loading