Skip to content

Metadata provider abstraction layer with TVDB support#2573

Merged
enoch85 merged 3 commits into
developmentfrom
feat/metadata-provider-rebuild-20260331
Mar 31, 2026
Merged

Metadata provider abstraction layer with TVDB support#2573
enoch85 merged 3 commits into
developmentfrom
feat/metadata-provider-rebuild-20260331

Conversation

@enoch85

@enoch85 enoch85 commented Mar 31, 2026

Copy link
Copy Markdown
Collaborator

Adds a fully provider-agnostic metadata layer that centralizes external ID resolution, image fetching, and content details behind a single IMetadataProvider interface. The rebuild also carries the current development-branch cleanup needed around UI image consumers, metadata settings, and client/server logging so the feature lands consistently instead of as a partial port.


Provider-agnostic architecture

Each provider (TMDB, TVDB, or any future addition) implements IMetadataProvider:

  • isAvailable() — is this provider configured and ready?
  • extractId() / assignId() — read or write the provider's own ID from a shared ID bag
  • getDetails() / getPosterUrl() / getBackdropUrl() / getPersonDetails() — normalized data access
  • findByExternalId() — cross-provider ID search, e.g. look up a TVDB entry by IMDB ID

MetadataService never hard-codes TMDB or TVDB branches into callers. It receives the registered providers via injection, orders them by the saved provider preference, resolves direct IDs first, fills missing IDs through details lookups and external-ID searches, and falls back automatically when a provider is unavailable or missing the needed ID.

Example flow — a Sonarr action handler needs external IDs for a media-server item

  1. Calls metadataService.resolveIds(mediaServerId)
  2. MetadataService fetches the item from Plex or Jellyfin
  3. Walks up the hierarchy when needed (episode → season → show)
  4. Extracts any IDs already present on the media item
  5. Cross-fills missing IDs through provider details and external-ID search
  6. Returns a provider-agnostic ID bag such as { tmdb, tvdb, imdb, type }

The handler then builds ordered Servarr lookup candidates from the resolved IDs instead of knowing which provider won.

                            ┌─────────────────────────────────────────────┐
                            │           Settings + Contracts              │
                            │                                             │
  Settings UI ──────────▶ SettingsController                              │
                            │  TMDB / TVDB / preference endpoints         │
                            │       │                  │                  │
                            │       ▼                  ▼                  │
                            │  MetadataSettingsService  @maintainerr/     │
                            │   test, save, remove      contracts         │
                            │     │        │        │   DTOs + enums      │
                            │     │        ▼        ▼                     │
                            │     │   TmdbApiService  TvdbApiService      │
                            │     │        ▲              ▲               │
                            │     ▼        │              │               │
                            │   ┌─────┐    │              │               │
                            │   │ DB  │    │              │               │
                            │   └─────┘    │              │               │
                            └──────────────┼──────────────┼───────────────┘
                                           │              │
  ┌────────────────────────────────────────┐│              │
  │           Metadata Layer               ││              │
  │                                        ││              │
  │  MetadataService                       ││              │
  │   • getOrderedProviders()  (pref.)     ││              │
  │   • resolveIds()           (ID res.)   ││              │
  │   • withProviderFallback() (fallback)  ││              │
  │          │              │              ││              │
  │          ▼              ▼              ││              │
  │  TmdbMetadataProvider  TvdbMetadataProvider            │
  │  (IMetadataProvider)   (IMetadataProvider)             │
  │          │              │              │               │
  │          ▼              ▼              │               │
  │    TmdbApiService  TvdbApiService ─────┘               │
  │                                        │               │
  │  MetadataController                    │               │
  │   GET /api/metadata/image/:type        │               │
  │   GET /api/metadata/backdrop/:type     │               │
  │          │                             │               │
  │          ▼                             │               │
  │    MetadataService                     │               │
  └────────────────────────────────────────┘

  Consumers ──────────────────────────▶ MetadataService
   • Action handlers (Radarr / Sonarr)
   • Rule getters (Radarr / Sonarr / Seerr)
   • Collections service

  UI image consumers ─────────────────▶ MetadataController
   • Media cards, modal, overview

  DB: settings table + collection_media (tvdbId migration)

Adding a new provider

  1. Create the API service in modules/api/xxx-api/
  2. Create a provider class implementing IMetadataProvider
  3. Register it in MetadataModule
  4. Add one enum value to MetadataProviderPreference in @maintainerr/contracts

The preference selector, provider ordering, fallback chain, and ID-resolution pipeline then pick it up automatically.


What changed

MetadataService — single entry point for metadata resolution and provider fallback

  • Resolves media-server items to external IDs through one shared pipeline instead of scattered TMDB-only helpers
  • Exposes provider-aware getDetails(), getPosterUrl(), getBackdropUrl(), and getPersonDetails()
  • Applies runtime preference changes from settings events without restart
  • Builds ordered Servarr lookup candidates so actions and rule getters stop duplicating provider-specific fallback logic

Provider implementations

  • Added TmdbMetadataProvider and TvdbMetadataProvider
  • Added TvdbApiService with v4 authentication, refresh, remote ID lookup, artwork selection, and settings-driven re-authentication
  • Updated TmdbApiService to support user-configured API keys, settings hot reload, and explicit connection testing

MetadataController — new controller at api/metadata

  • Replaces the old TMDB-only /api/moviedb image/backdrop surface
  • Accepts all known provider IDs as query params and returns the chosen URL plus serving provider
  • Lets UI callers stay provider-agnostic even when metadata comes from different sources

All runtime consumers updated

  • Radarr and Sonarr action handlers now resolve IDs through MetadataService
  • Radarr, Sonarr, and Seerr rule getters now use the shared resolution pipeline
  • Collections now persist both tmdbId and tvdbId where available and fetch poster data through metadata details
  • Removed dead TMDB-only seams including MediaIdFinder, TmdbIdService, and the old TMDB controller route

Frontend

  • Added a Metadata settings page with TMDB and TVDB API key management plus provider preference selection
  • Migrated image consumers to /api/metadata so posters and backdrops use provider-aware query params instead of hard-coded TMDB paths
  • Fixed the MediaModal backdrop path and collection preview image flow to tolerate partial provider/image failures
  • Removed remaining raw UI console.error / console.warn usage in the touched app layer and routed event/log stream failures through the shared client logger

Contracts and persistence

  • Added shared metadata DTOs and provider-preference enums in @maintainerr/contracts
  • Added AddMetadataSupport migration for tmdb_api_key, tvdb_api_key, metadata_provider_preference, and collection_media.tvdbId
  • Kept the migration reversible by rebuilding the SQLite tables in both directions

Module encapsulation

  • MetadataModule now owns metadata provider wiring
  • TMDB/TVDB API modules are imported only where needed instead of hanging off AppModule as general-purpose runtime dependencies

Validation

  • yarn test → 580 passing, 0 failing
  • yarn workspace @maintainerr/ui build → passing, measured repeatedly around 2s on the current tree
  • Jellyfin runtime smoke script passes
  • Rules regression harness runs successfully and produces the expected matrix output
  • Final UI/logging cleanup rechecked with diagnostics and no remaining console.error|console.warn matches under apps/ui/src

Comment thread apps/server/src/modules/api/tmdb-api/tmdb.service.ts Dismissed
Comment thread apps/server/src/modules/api/tvdb-api/tvdb.service.ts Dismissed
@enoch85 enoch85 force-pushed the feat/metadata-provider-rebuild-20260331 branch from c40d3bb to 5293f5f Compare March 31, 2026 12:36
@enoch85 enoch85 merged commit 47575cf into development Mar 31, 2026
13 checks passed
@enoch85 enoch85 deleted the feat/metadata-provider-rebuild-20260331 branch March 31, 2026 12:48
@enoch85

enoch85 commented Mar 31, 2026

Copy link
Copy Markdown
Collaborator Author

@blixten85 this is in devlopment now.

@enoch85

enoch85 commented Mar 31, 2026

Copy link
Copy Markdown
Collaborator Author

Should solve #2413 maybe?

maintainerr-automation Bot added a commit that referenced this pull request Apr 3, 2026
* fix(server): Use shared watch state for isWatched and Plex viewCount (#2570)

* Metadata provider abstraction layer with TVDB support (#2573)

* fix: register tvdb cache in CacheManager

* build(deps-dev): bump the nestjs group with 2 updates (#2575)

Bumps the nestjs group with 2 updates: [@nestjs/cli](https://github.com/nestjs/nest-cli) and [@nestjs/schematics](https://github.com/nestjs/schematics).


Updates `@nestjs/cli` from 11.0.16 to 11.0.17
- [Release notes](https://github.com/nestjs/nest-cli/releases)
- [Commits](nestjs/nest-cli@11.0.16...11.0.17)

Updates `@nestjs/schematics` from 11.0.9 to 11.0.10
- [Release notes](https://github.com/nestjs/schematics/releases)
- [Commits](nestjs/schematics@11.0.9...11.0.10)

---
updated-dependencies:
- dependency-name: "@nestjs/cli"
  dependency-version: 11.0.17
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: nestjs
- dependency-name: "@nestjs/schematics"
  dependency-version: 11.0.10
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: nestjs
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump axios from 1.13.6 to 1.14.0 (#2576)

Bumps [axios](https://github.com/axios/axios) from 1.13.6 to 1.14.0.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](axios/axios@v1.13.6...v1.14.0)

---
updated-dependencies:
- dependency-name: axios
  dependency-version: 1.14.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps-dev): bump knip from 6.0.6 to 6.1.1 (#2578)

Bumps [knip](https://github.com/webpro-nl/knip/tree/HEAD/packages/knip) from 6.0.6 to 6.1.1.
- [Release notes](https://github.com/webpro-nl/knip/releases)
- [Commits](https://github.com/webpro-nl/knip/commits/knip@6.1.1/packages/knip)

---
updated-dependencies:
- dependency-name: knip
  dependency-version: 6.1.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps-dev): bump @tanstack/eslint-plugin-query (#2579)

Bumps [@tanstack/eslint-plugin-query](https://github.com/TanStack/query/tree/HEAD/packages/eslint-plugin-query) from 5.91.4 to 5.96.0.
- [Release notes](https://github.com/TanStack/query/releases)
- [Changelog](https://github.com/TanStack/query/blob/main/packages/eslint-plugin-query/CHANGELOG.md)
- [Commits](https://github.com/TanStack/query/commits/@tanstack/eslint-plugin-query@5.96.0/packages/eslint-plugin-query)

---
updated-dependencies:
- dependency-name: "@tanstack/eslint-plugin-query"
  dependency-version: 5.96.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* fix(ui): smooth settings refresh and stream warnings + tune flickering and loadingspinner (#2574)

* build(deps): bump react-router-dom from 7.13.1 to 7.13.2 (#2584)

Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 7.13.1 to 7.13.2.
- [Release notes](https://github.com/remix-run/react-router/releases)
- [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md)
- [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@7.13.2/packages/react-router-dom)

---
updated-dependencies:
- dependency-name: react-router-dom
  dependency-version: 7.13.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps-dev): bump ts-jest from 29.4.6 to 29.4.9 (#2583)

Bumps [ts-jest](https://github.com/kulshekhar/ts-jest) from 29.4.6 to 29.4.9.
- [Release notes](https://github.com/kulshekhar/ts-jest/releases)
- [Changelog](https://github.com/kulshekhar/ts-jest/blob/main/CHANGELOG.md)
- [Commits](kulshekhar/ts-jest@v29.4.6...v29.4.9)

---
updated-dependencies:
- dependency-name: ts-jest
  dependency-version: 29.4.9
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps-dev): bump @typescript-eslint/eslint-plugin (#2585)

Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 8.57.2 to 8.58.0.
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.58.0/packages/eslint-plugin)

---
updated-dependencies:
- dependency-name: "@typescript-eslint/eslint-plugin"
  dependency-version: 8.58.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* fix(ui): stabilize library switching and add media sorting (#2586)

* build(deps): bump lodash-es from 4.17.23 to 4.18.1 (#2587)

Bumps [lodash-es](https://github.com/lodash/lodash) from 4.17.23 to 4.18.1.
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](lodash/lodash@4.17.23...4.18.1)

---
updated-dependencies:
- dependency-name: lodash-es
  dependency-version: 4.18.1
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* feat(metadata): add per-provider metadata refresh action

Adds a "Refresh metadata" button to each provider card in Metadata
Settings. Clicking it:
1. Tests the provider connection as a safety net before touching cache
2. Flushes only that provider's local NodeCache
3. Fires batched refreshItemMetadata calls to Plex/Jellyfin for all
   collection items linked to that provider (fire-and-forget)

Button label is context-aware ("Save to refresh", "Configure to
refresh") and disabled while unsaved changes are pending. Inline
feedback reuses the shared useSettingsFeedback pattern. A server-side
in-progress guard prevents concurrent refreshes of the same provider.

* fix(ui): make overview title sort explicit (#2589)

* build(deps): bump @tanstack/react-query from 5.91.3 to 5.96.1 (#2590)

Bumps [@tanstack/react-query](https://github.com/TanStack/query/tree/HEAD/packages/react-query) from 5.91.3 to 5.96.1.
- [Release notes](https://github.com/TanStack/query/releases)
- [Changelog](https://github.com/TanStack/query/blob/main/packages/react-query/CHANGELOG.md)
- [Commits](https://github.com/TanStack/query/commits/@tanstack/react-query@5.96.1/packages/react-query)

---
updated-dependencies:
- dependency-name: "@tanstack/react-query"
  dependency-version: 5.96.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps-dev): bump @tanstack/eslint-plugin-query (#2591)

Bumps [@tanstack/eslint-plugin-query](https://github.com/TanStack/query/tree/HEAD/packages/eslint-plugin-query) from 5.96.0 to 5.96.1.
- [Release notes](https://github.com/TanStack/query/releases)
- [Changelog](https://github.com/TanStack/query/blob/main/packages/eslint-plugin-query/CHANGELOG.md)
- [Commits](https://github.com/TanStack/query/commits/@tanstack/eslint-plugin-query@5.96.1/packages/eslint-plugin-query)

---
updated-dependencies:
- dependency-name: "@tanstack/eslint-plugin-query"
  dependency-version: 5.96.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump lodash from 4.17.23 to 4.18.1 (#2592)

Bumps [lodash](https://github.com/lodash/lodash) from 4.17.23 to 4.18.1.
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](lodash/lodash@4.17.23...4.18.1)

---
updated-dependencies:
- dependency-name: lodash
  dependency-version: 4.18.1
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* feat(metadata): add ID validation and retry path for metadata refresh (#2594)

Introduces media-server-id.utils with heuristic ID classification to
skip foreign-server IDs (e.g. Jellyfin UUIDs stored against a Plex
instance) before queuing metadata refresh requests. Adds a GET-on-failure
retry path in MetadataSettingsService for manual refreshes: on first
failure, looks up the item to get a verified (possibly corrected) ID and
retries once, covering Jellyfin 'Guid can't be empty' corruption scenarios.

* fix: stabilize metadata sourcing and settings feedback flows (#2595)

* fix(ui): use active metadata provider in media modal

* chore(server): clean metadata lint warnings

* change tvdb link

* fix: align settings feedback and persist github cache

* fix(ui): align metadata test button text

* Update API key link in Metadata component

* fix: delete Tautulli config on media server switch to Jellyfin (#2597)

* build(deps): bump the nestjs group with 5 updates (#2598)

Bumps the nestjs group with 5 updates:

| Package | From | To |
| --- | --- | --- |
| [@nestjs/common](https://github.com/nestjs/nest/tree/HEAD/packages/common) | `11.1.17` | `11.1.18` |
| [@nestjs/core](https://github.com/nestjs/nest/tree/HEAD/packages/core) | `11.1.17` | `11.1.18` |
| [@nestjs/platform-express](https://github.com/nestjs/nest/tree/HEAD/packages/platform-express) | `11.1.17` | `11.1.18` |
| [@nestjs/typeorm](https://github.com/nestjs/typeorm) | `11.0.0` | `11.0.1` |
| [@nestjs/testing](https://github.com/nestjs/nest/tree/HEAD/packages/testing) | `11.1.17` | `11.1.18` |


Updates `@nestjs/common` from 11.1.17 to 11.1.18
- [Release notes](https://github.com/nestjs/nest/releases)
- [Commits](https://github.com/nestjs/nest/commits/v11.1.18/packages/common)

Updates `@nestjs/core` from 11.1.17 to 11.1.18
- [Release notes](https://github.com/nestjs/nest/releases)
- [Commits](https://github.com/nestjs/nest/commits/v11.1.18/packages/core)

Updates `@nestjs/platform-express` from 11.1.17 to 11.1.18
- [Release notes](https://github.com/nestjs/nest/releases)
- [Commits](https://github.com/nestjs/nest/commits/v11.1.18/packages/platform-express)

Updates `@nestjs/typeorm` from 11.0.0 to 11.0.1
- [Release notes](https://github.com/nestjs/typeorm/releases)
- [Commits](nestjs/typeorm@11.0.0...11.0.1)

Updates `@nestjs/testing` from 11.1.17 to 11.1.18
- [Release notes](https://github.com/nestjs/nest/releases)
- [Commits](https://github.com/nestjs/nest/commits/v11.1.18/packages/testing)

---
updated-dependencies:
- dependency-name: "@nestjs/common"
  dependency-version: 11.1.18
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: nestjs
- dependency-name: "@nestjs/core"
  dependency-version: 11.1.18
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: nestjs
- dependency-name: "@nestjs/platform-express"
  dependency-version: 11.1.18
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: nestjs
- dependency-name: "@nestjs/typeorm"
  dependency-version: 11.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: nestjs
- dependency-name: "@nestjs/testing"
  dependency-version: 11.1.18
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: nestjs
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump react-hook-form from 7.72.0 to 7.72.1 (#2599)

Bumps [react-hook-form](https://github.com/react-hook-form/react-hook-form) from 7.72.0 to 7.72.1.
- [Release notes](https://github.com/react-hook-form/react-hook-form/releases)
- [Changelog](https://github.com/react-hook-form/react-hook-form/blob/master/CHANGELOG.md)
- [Commits](react-hook-form/react-hook-form@v7.72.0...v7.72.1)

---
updated-dependencies:
- dependency-name: react-hook-form
  dependency-version: 7.72.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump @tanstack/react-query from 5.96.1 to 5.96.2 (#2600)

Bumps [@tanstack/react-query](https://github.com/TanStack/query/tree/HEAD/packages/react-query) from 5.96.1 to 5.96.2.
- [Release notes](https://github.com/TanStack/query/releases)
- [Changelog](https://github.com/TanStack/query/blob/main/packages/react-query/CHANGELOG.md)
- [Commits](https://github.com/TanStack/query/commits/@tanstack/react-query@5.96.2/packages/react-query)

---
updated-dependencies:
- dependency-name: "@tanstack/react-query"
  dependency-version: 5.96.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps-dev): bump @tanstack/eslint-plugin-query (#2601)

Bumps [@tanstack/eslint-plugin-query](https://github.com/TanStack/query/tree/HEAD/packages/eslint-plugin-query) from 5.96.1 to 5.96.2.
- [Release notes](https://github.com/TanStack/query/releases)
- [Changelog](https://github.com/TanStack/query/blob/main/packages/eslint-plugin-query/CHANGELOG.md)
- [Commits](https://github.com/TanStack/query/commits/@tanstack/eslint-plugin-query@5.96.2/packages/eslint-plugin-query)

---
updated-dependencies:
- dependency-name: "@tanstack/eslint-plugin-query"
  dependency-version: 5.96.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: wortmanb <744697+wortmanb@users.noreply.github.com>
Co-authored-by: enoch85 <mailto@danielhansson.nu>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Javiink <43996484+Javiink@users.noreply.github.com>
@maintainerr-automation

Copy link
Copy Markdown
Contributor

🎉 This PR is included in version 3.4.0 🎉

The release is available on GitHub release

Your semantic-release bot 📦🚀

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants