Repository: tsedio/tsed
Pull request #3082: docs: add premium plugins section and installation instructions
Author: login: Romakita
Labels: name: released
Created: 2025-05-19T11:15:06Z | Merged: 2025-05-19T12:58:37Z



<!-- This is an auto-generated comment: release notes by coderabbit.ai -->
## Summary by CodeRabbit

- **New Features**
  - Added comprehensive documentation for premium plugins, including IORedis, MongoDB, and Vault config sources, plus Redis, MongoDB, and Vault TestContainers integrations.
  - Introduced a detailed guide for installing premium plugins with step-by-step instructions and troubleshooting tips.
  - Expanded navigation and sidebar menus to include premium plugin sections and direct links for easier access.

- **Documentation**
  - Enhanced configuration sources documentation with premium sources, a roadmap for future integrations, and contact info for custom requests.
  - Updated homepage and warehouse sections to showcase new premium plugins and provide clearer descriptions.
  - Upgraded documentation theme dependency for improved appearance and functionality.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->


Diff:
diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts
index 5ba4c6e6b38..1889d6a9b9c 100644
--- a/docs/.vitepress/config.mts
+++ b/docs/.vitepress/config.mts
@@ -308,9 +308,42 @@ export default defineConfig({
             text: "Marketplace",
             link: "/plugins/index"
           },
+          {
+            text: "Install premium plugins",
+            link: "/plugins/premium/install-premium-plugins"
+          },
           {
             text: "Create your own plugins",
             link: "/plugins/create-your-own-plugins"
+          },
+          {
+            text: "Premium plugins",
+            items: [
+              {
+                text: "IORedis ConfigSource",
+                link: "/plugins/premium/config-source/ioredis"
+              },
+              {
+                text: "Mongo ConfigSource",
+                link: "/plugins/premium/config-source/mongo"
+              },
+              {
+                text: "Vault ConfigSource",
+                link: "/plugins/premium/config-source/vault"
+              },
+              {
+                text: "Redis Testcontainers",
+                link: "/plugins/premium/testcontainers/redis"
+              },
+              {
+                text: "Mongo Testcontainers",
+                link: "/plugins/premium/testcontainers/mongo"
+              },
+              {
+                text: "Vault Testcontainers",
+                link: "/plugins/premium/testcontainers/vault"
+              }
+            ]
           }
         ]
       },
@@ -502,9 +535,42 @@ export default defineConfig({
           text: "Marketplace",
           link: "/plugins/index"
         },
+        {
+          text: "Install premium plugins",
+          link: "/plugins/premium/install-premium-plugins"
+        },
         {
           text: "Create your own plugins",
           link: "/plugins/create-your-own-plugins"
+        },
+        {
+          text: "Premium plugins",
+          items: [
+            {
+              text: "IORedis ConfigSource",
+              link: "/plugins/premium/config-source/ioredis"
+            },
+            {
+              text: "Mongo ConfigSource",
+              link: "/plugins/premium/config-source/mongo"
+            },
+            {
+              text: "Vault ConfigSource",
+              link: "/plugins/premium/config-source/vault"
+            },
+            {
+              text: "Redis Testcontainers",
+              link: "/plugins/premium/testcontainers/redis"
+            },
+            {
+              text: "Mongo Testcontainers",
+              link: "/plugins/premium/testcontainers/mongo"
+            },
+            {
+              text: "Vault Testcontainers",
+              link: "/plugins/premium/testcontainers/vault"
+            }
+          ]
         }
       ],
       "/tutorials/": [
diff --git a/docs/docs/configuration/configuration-sources.md b/docs/docs/configuration/configuration-sources.md
index 524cfff725b..02935f61453 100644
--- a/docs/docs/configuration/configuration-sources.md
+++ b/docs/docs/configuration/configuration-sources.md
@@ -18,6 +18,20 @@ You can also create your own configuration sources by implementing the @@ConfigS
 | Json   | Yes        | `@tsed/config/json`   | Load configuration from a JSON file. Supports watch mode to reload the configuration when the file changes.                                                                     |
 | YAML   | Yes        | `@tsed/config/yaml`   | Load configuration from a YAML file. Supports watch mode to reload the configuration when the file changes.                                                                     |
 
+## Premium config sources
+
+| Type                                                 | Watch mode    | Import                  | Description                                                                                                                        |
+| ---------------------------------------------------- | ------------- | ----------------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
+| [IORedis](/plugins/premium/config-source/ioredis.md) | Yes           | `@tsed/config/ioredis`  | Load configuration from a Redis database using ioredis. Supports watch mode to reload the configuration when the database changes. |
+| [Mongo](/plugins/premium/config-source/mongo.md)     | Yes           | `@tsed/config/mongo`    | Load configuration from a MongoDB collection. Supports watch mode to reload the configuration when the collection changes.         |
+| [Vault](/plugins/premium/config-source/vault.md)     | Yes - polling | `@tsed/config/vault`    | Load configuration from a HashiCorp Vault. Supports watch mode to reload the configuration when the vault changes.                 |
+| Postgres - WIP                                       | Yes - polling | `@tsed/config/postgres` | Load configuration from a Postgres database. Supports watch mode to reload the configuration when the database changes.            |
+
+::: warning Wants more?
+Ask us for a custom config source! We can create a custom config source for you, tailored to your needs.
+Contact us at [contact-tsed@gmail.com](mailto:contact-tsed@gmail.com) or via [Slack](https://slack.tsed.io/).
+:::
+
 ## Installation
 
 ::: code-group
@@ -110,12 +124,15 @@ import {withOptions} from "@tsed/config";
 export class Server {}
 ```
 
-The `extends` option allows you to define multiple configuration sources. The order of the sources matters, as the last source will
-override the previous ones. In this example, the `EnvsConfigSource` will override any values defined in the `JsonConfigSource`.
+The `extends` option allows you to define multiple configuration sources. The order of the sources matters, as the last
+source will
+override the previous ones. In this example, the `EnvsConfigSource` will override any values defined in the
+`JsonConfigSource`.
 
 ## Accessing configuration values
 
-`@tsed/config` merge all configuration sources in a single object, but it also creates a configuration namespace for each source under
+`@tsed/config` merge all configuration sources in a single object, but it also creates a configuration namespace for
+each source under
 the `configs` key. This allows you to access the configuration values from each source separately.
 
 ```typescript
@@ -415,3 +432,18 @@ export class MyService {
   configSource = injectConfigSource<MyCustomConfigSource>("myCustomConfig");
 }
 ```
+
+## Roadmap
+
+These config sources are not implemented yet, but we plan to implement them in the future:
+
+- Consul / etcd
+- SSM Parameter Store / Vault / GCP/Azure équivalents
+- Kubernetes ConfigMap/Secret
+- HTTP/REST
+- Git (GitOps)
+
+::: warning Wants more?
+Ask us for a custom config source! We can create a custom config source for you, tailored to your needs.
+Contact us at contact-tsed@gmail.com or via [Slack](https://slack.tsed.io/).
+:::
diff --git a/docs/index.md b/docs/index.md
index 23b7e7d8fac..f0ee5084e3b 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -183,6 +183,9 @@ frameworks:
   - title: Pulse
     href: /tutorials/pulse.html
     src: /pulse.png
+  - title: Vault
+    href: /plugins/premium/config-source/vault.html
+    src: /vault.png
 partners:
   - title: eGain
     href: https://www.egain.com/
diff --git a/docs/package.json b/docs/package.json
index f8b8c49dc55..fd978009954 100644
--- a/docs/package.json
+++ b/docs/package.json
@@ -10,7 +10,7 @@
     "serve": "npx serve ./.vitepress/dist"
   },
   "dependencies": {
-    "@tsed/vitepress-theme": "1.5.5",
+    "@tsed/vitepress-theme": "1.5.6",
     "@vueuse/core": "10.11.0",
     "axios": "1.7.7",
     "lodash": "4.17.21",
diff --git a/docs/plugins/premium/config-source/ioredis.md b/docs/plugins/premium/config-source/ioredis.md
new file mode 100644
index 00000000000..23ff1efdeb0
--- /dev/null
+++ b/docs/plugins/premium/config-source/ioredis.md
@@ -0,0 +1,139 @@
+---
+head:
+  - - meta
+    - name: description
+      content: A powerful plugin for Ts.ED to manage your application configuration in Redis and sync changes in real time.
+  - - meta
+    - name: keywords
+      content: Ts.ED plugins premium ioredis config-source redis watch-mode hot-reload
+---
+
+# IORedis Config Source
+
+<Banner src="/ioredis.svg" height="200" href="https://github.com/luin/ioredis"></Banner>
+
+A powerful plugin for [Ts.ED](https://tsed.dev/) to manage your application configuration in Redis and sync changes in
+real time.
+
+## ✨ Features
+
+- ⚙️ **Configure one or more Redis connections** using the @@Configuration@@ decorator.
+- 👀 **Watch Redis keys** and automatically notify your application of any changes.
+- 🔄 **Sync configuration values** between your app and Redis, using Redis as a dynamic source of truth.
+- 🛠️ **Flexible options:** Supports standard Redis, Redis Cluster, and custom key prefixing.
+- 🔒 **Validation schema:** Add a validation schema to ensure your configs are always valid.
+
+For more details on the @@ConfigSource@@ feature, go to [Configuration Source documentation page](/docs/configuration/configuration-sources.md).
+
+## 📦 Installation
+
+Install the package and its peer dependencies:
+
+::: code-group
+
+```sh [npm]
+npm install --save @tsedio/config-ioredis
+npm install --save @tsed/config @tsed/ioredis ioredis
+```
+
+```sh [yarn]
+yarn add @tsedio/config-ioredis
+yarn add @tsed/config @tsed/ioredis ioredis
+```
+
+```sh [pnpm]
+pnpm add @tsedio/config-ioredis
+pnpm add @tsed/config @tsed/ioredis ioredis
+```
+
+```sh [bun]
+bun add @tsedio/config-ioredis
+bun add @tsed/config @tsed/ioredis ioredis
+```
+
+:::
+
+::: tip
+See our documentation page for instructions on [installing premium plugins](/plugins/premium/install-premium-plugins.md).
+:::
+
+## ⚙️ Configuration Example
+
+Configure the Redis source in your Ts.ED application:
+
+```typescript
+import {withOptions} from "@tsed/config";
+import {IORedisConfigSource} from "@tsedio/config-ioredis";
+import {Configuration, Constant} from "@tsed/di";
+
+@Configuration({
+  extends: [
+    withOptions(IORedisConfigSource, {
+      name: "redis",
+      prefixKey: "my-config", // Optional: All config keys will be prefixed
+      url: "redis://localhost:6379" // Or use any Redis/Cluster options
+      // validationSchema: object({}) // Optional: add a validation schema
+    })
+  ]
+})
+export class Server {
+  @Constant("configs.redis")
+  config: Record<string, any>;
+}
+```
+
+## 👀 Watching Redis Keys
+
+Enable key watching to keep your app config in sync with Redis in real time.  
+This will automatically configure Redis with `notify-keyspace-events` if needed.
+
+```typescript
+@Configuration({
+  extends: [
+    withOptions(IORedisConfigSource, {
+      name: "redis",
+      prefixKey: "my-config",
+      watch: true, // 👈 Enable key watching!
+      url: "redis://localhost:6379"
+    })
+  ]
+})
+export class Server {
+  @Constant("configs.redis")
+  config: Record<string, any>;
+}
+```
+
+## ✏️ Set Configuration Values Programmatically
+
+You can update configuration values in Redis directly from your services, using dependency injection.
+
+```typescript
+import {IORedisConfigSource} from "@tsed/ioredis-config";
+import {InjectConfigSource} from "@tsed/config/decorators/injectConfigSource.js";
+import {Injectable} from "@tsed/di";
+
+@Injectable()
+class MyService {
+  @InjectConfigSource()
+  ioredisConfigSource: IORedisConfigSource;
+
+  async setValue(key: string, value: any) {
+    await this.ioredisConfigSource.set(key, value);
+  }
+}
+```
+
+## 💡 Tips
+
+- 🔐 **Multiple connections:** Use the `name` property to manage several Redis instances or clusters.
+- 🏷️ **Key prefixing:** Use `prefixKey` to avoid key collisions across different environments or apps.
+- 🛑 **Watch mode:** Make sure your Redis server is configured with `notify-keyspace-events` for real-time updates (the
+  package will auto-configure this when possible).
+- 📚 **Validation:** Add a `validationSchema` to ensure your configs are always valid.
+
+## 📚 Resources
+
+- [Ts.ED Documentation](https://tsed.dev/) 📖
+- [ioredis Documentation](https://github.com/redis/ioredis) 🐙
+- [TestContainers Node.js](https://node.testcontainers.org/) 🐳
diff --git a/docs/plugins/premium/config-source/mongo.md b/docs/plugins/premium/config-source/mongo.md
new file mode 100644
index 00000000000..a08db91b5a0
--- /dev/null
+++ b/docs/plugins/premium/config-source/mongo.md
@@ -0,0 +1,143 @@
+---
+head:
+  - - meta
+    - name: description
+      content: A powerful plugin for Ts.ED to manage your application configuration in MongoDB and sync changes in real time.
+  - - meta
+    - name: keywords
+      content: Ts.ED plugins premium mongo config-source watch-mode hot-reload
+---
+
+# Mongo Config Source
+
+<Banner src="https://webimages.mongodb.com/_com_assets/cms/kuyjf3vea2hg34taa-horizontal_default_slate_blue.svg?auto=format%252Ccompress" height="200" href="https://www.mongodb.com/"></Banner>
+
+A powerful plugin for [Ts.ED](https://tsed.dev/) to manage your application configuration in MongoDB and sync changes in
+real time.
+
+## ✨ Features
+
+- ⚙️ **Configure your MongoDB connection** via the @@Configuration@@ decorator.
+- 👀 **Watch MongoDB collection changes** and auto-update your app config in real time (leveraging MongoDB Change
+  Streams).
+- 🔄 **Sync configuration values**: Use MongoDB as a dynamic source of truth for your app settings.
+- 🛠️ **Flexible options**: Supports all MongoDB client options, custom collections, and validation schemas.
+
+For more details on the @@ConfigSource@@ feature, go to [Configuration Source documentation page](/docs/configuration/configuration-sources.md).
+
+## 📦 Installation
+
+Install the package and its peer dependencies:
+
+::: code-group
+
+```sh [npm]
+npm install --save @tsedio/config-mongo
+npm install --save @tsed/config mongodb
+```
+
+```sh [yarn]
+yarn add @tsedio/config-mongo
+yarn add @tsed/config mongodb
+```
+
+```sh [pnpm]
+pnpm add @tsedio/config-mongo
+pnpm add @tsed/config mongodb
+```
+
+```sh [bun]
+bun add @tsedio/config-mongo
+bun add @tsed/config mongodb
+```
+
+:::
+
+::: tip
+See our documentation page for instructions on [installing premium plugins](/plugins/premium/install-premium-plugins.md).
+:::
+
+## ⚙️ Configuration Example
+
+Set up your MongoDB config source in your Ts.ED application:
+
+```typescript
+import {withOptions} from "@tsed/config";
+import {MongoConfigSource} from "@tsedio/config-mongo";
+import {Configuration, Constant} from "@tsed/di";
+
+@Configuration({
+  extends: [
+    withOptions(MongoConfigSource, {
+      name: "mongo",
+      url: "mongodb://localhost:27017", // MongoDB connection URL
+      database: "my_database", // Database name
+      collection: "config" // Collection used for config storage
+
+      // Additional MongoDB client options can be provided here
+
+      // ConfigSource options
+      // validationSchema: object({}) // Optional: add a validation schema
+    })
+  ]
+})
+export class Server {
+  @Constant("configs.mongo")
+  config: Record<string, any>;
+}
+```
+
+## 👀 Watching MongoDB Collection Changes
+
+Enable real-time watching of your configuration collection to auto-sync changes with your application.  
+This uses MongoDB's Change Streams feature.
+
+```typescript
+@Configuration({
+  extends: [
+    withOptions(MongoConfigSource, {
+      name: "mongo",
+      url: "mongodb://localhost:27017",
+      database: "my_database",
+      collection: "config",
+      watch: true // 👈 Enable watch mode for real-time config updates!
+    })
+  ]
+})
+export class Server {
+  @Constant("configs.mongo")
+  config: Record<string, any>;
+}
+```
+
+## ✏️ Set Configuration Values Programmatically
+
+You can update configuration values in MongoDB directly from your services, thanks to dependency injection:
+
+```typescript
+import {MongoConfigSource} from "@tsedio/config-mongo";
+import {InjectConfigSource} from "@tsed/config/decorators/injectConfigSource.js";
+import {Injectable} from "@tsed/di";
+
+@Injectable()
+class MyService {
+  @InjectConfigSource()
+  mongoConfigSource: MongoConfigSource;
+
+  async setValue(key: string, value: any) {
+    await this.mongoConfigSource.set(key, value);
+  }
+}
+```
+
+## 💡 Tips
+
+- 🍃 **Change Streams**: Make sure your MongoDB deployment supports Change Streams (requires replica set).
+- 🏷️ **Custom Collections**: Use the `collection` option to separate config from your main application data.
+- 📚 **Validation**: Add a `validationSchema` to enforce structure and types for your configuration.
+- 🔐 **Multiple Sources**: Use different `name` values to manage multiple MongoDB config sources in the same app.
+
+## 📚 Resources
+
+- [Ts.ED Documentation](https://tsed.dev/) 📖
+- [MongoDB Node.js Driver](https://mongodb.github.io/node-mongodb-native/) 🍃
diff --git a/docs/plugins/premium/config-source/vault.md b/docs/plugins/premium/config-source/vault.md
new file mode 100644
index 00000000000..eaf7c701c79
--- /dev/null
+++ b/docs/plugins/premium/config-source/vault.md
@@ -0,0 +1,159 @@
+---
+head:
+  - - meta
+    - name: description
+      content: A robust Ts.ED plugin for dynamic application configuration stored securely in HashiCorp Vault. Keep your secrets and config synchronized with your app in real time!
+  - - meta
+    - name: keywords
+      content: Ts.ED plugins premium vault hashicorp config-source
+---
+
+# Vault Config Source
+
+<Banner src="/vault.png" height="200" href="https://www.vaultproject.io/"></Banner>
+
+A robust [Ts.ED](https://tsed.dev/) plugin for dynamic application configuration stored securely
+in [HashiCorp Vault](https://www.vaultproject.io/).  
+Keep your secrets and config synchronized with your app in real time!
+
+## ✨ Features
+
+- ⚙️ **Configure HashiCorp Vault** connection easily with the `@Configuration` decorator.
+- 🔄 **Poll Vault for changes**: Regularly check Vault for updated secrets and notify your application automatically.
+- ✏️ **Sync and update**: Use Vault as a dynamic source of truth for app configuration, and update values
+  programmatically.
+- 🔒 **Supports both KV v1 and v2**: Compatible with both secret engine versions.
+
+For more details on the @@ConfigSource@@ feature, go
+to [Configuration Source documentation page](/docs/configuration/configuration-sources.md).
+
+## 📦 Installation
+
+Install the package and its dependencies:
+
+::: code-group
+
+```sh [npm]
+npm install --save @tsedio/config-vault
+npm install --save @tsed/config node-vault
+```
+
+```sh [yarn]
+yarn add @tsedio/config-vault
+yarn add @tsed/config node-vault
+```
+
+```sh [pnpm]
+pnpm add @tsedio/config-vault
+pnpm add @tsed/config node-vault
+```
+
+```sh [bun]
+bun add @tsedio/config-vault
+bun add @tsed/config node-vault
+```
+
+:::
+
+::: tip
+See our documentation page for instructions
+on [installing premium plugins](/plugins/premium/install-premium-plugins.md).
+:::
+
+## ⚙️ Configuration Example
+
+Set up your Vault config source in your Ts.ED app:
+
+```typescript
+import {withOptions} from "@tsed/config";
+import {VaultConfigSource} from "@tsedio/config-vault";
+import {Configuration, Constant} from "@tsed/di";
+
+@Configuration({
+  extends: [
+    withOptions(VaultConfigSource, {
+      name: "vault",
+      endpoint: "http://localhost:8200", // Vault server URL
+      token: "your-vault-token", // Your Vault token
+      secretPath: "secret/data/myapp", // Path to your secret (KV v2 or v1, see below)
+      refreshInterval: 10000, // ⏱️ Polling interval in ms (default: 10s)
+      clientOptions: {
+        // Additional node-vault options
+      }
+      // validationSchema: object({})              // Optional: add a validation schema
+    })
+  ]
+})
+export class Server {
+  @Constant("configs.vault")
+  config: Record<string, any>;
+}
+```
+
+## 👀 Automatically Watch for Vault Configuration Changes
+
+Since Vault does not provide native change notifications, polling is used to keep your app config in sync:
+
+```typescript
+@Configuration({
+  extends: [
+    withOptions(VaultConfigSource, {
+      name: "vault",
+      endpoint: "http://localhost:8200",
+      token: "your-vault-token",
+      secretPath: "secret/data/myapp",
+      refreshInterval: 5000 // ⏱️ Check for changes every 5 seconds
+    })
+  ]
+})
+export class Server {
+  @Constant("configs.vault")
+  config: Record<string, any>;
+}
+```
+
+## ✏️ Set Configuration Values Programmatically
+
+Update config values in Vault from your services using dependency injection:
+
+```typescript
+import {VaultConfigSource} from "@tsedio/config-vault";
+import {InjectConfigSource} from "@tsed/config/decorators/injectConfigSource.js";
+import {Injectable} from "@tsed/di";
+
+@Injectable()
+class MyService {
+  @InjectConfigSource()
+  vaultConfigSource: VaultConfigSource;
+
+  async setValue(key: string, value: any) {
+    await this.vaultConfigSource.set(key, value);
+  }
+}
+```
+
+## 🔑 Vault KV Secret Engine Versions
+
+This package works with both KV v1 and v2 engines.  
+**For KV v2**, use the full path with `/data/`:
+
+```typescript
+// KV v2 (recommended)
+secretPath: "secret/data/myapp";
+
+// KV v1
+secretPath: "secret/myapp";
+```
+
+## 💡 Tips
+
+- 🛡️ **Secure access:** Never commit your Vault token to version control!
+- 🔁 **Tune `refreshInterval`** to control how often your app checks Vault for updates.
+- 🏷️ **Multiple sources:** Use the `name` property for multiple Vault config sources.
+- 📚 **Validation:** Use `validationSchema` to enforce your configuration structure.
+
+## 📚 Resources
+
+- [Ts.ED Documentation](https://tsed.dev/) 📖
+- [HashiCorp Vault](https://www.vaultproject.io/) 🏰
+- [node-vault](https://github.com/kr1sp1n/node-vault) 🗝️
diff --git a/docs/plugins/premium/install-premium-plugins.md b/docs/plugins/premium/install-premium-plugins.md
new file mode 100644
index 00000000000..14abb6f657c
--- /dev/null
+++ b/docs/plugins/premium/install-premium-plugins.md
@@ -0,0 +1,100 @@
+---
+head:
+  - - meta
+    - name: description
+      content: Installation instructions for premium plugins in Ts.ED. Learn how to install and configure private packages from GitHub.
+  - - meta
+    - name: keywords
+      content: Ts.ED create plugins marketplace premium guide installation
+---
+
+# Installing a Premium Plugin
+
+Premium (private) Ts.ED plugins are distributed as private packages via GitHub's npm registry. To access and install
+them, you must:
+
+1. **Become a sponsor of Ts.ED at the required tier**
+2. **Generate a GitHub Personal Access Token (PAT) with the correct permissions**
+3. **Configure your project to use the token when installing packages**
+
+## 1. Become a Ts.ED Sponsor
+
+To access premium plugins, you must be an active sponsor at least at
+the [Power Dev tier](https://github.com/sponsors/Romakita/sponsorships?tier_id=489429&preview=false).
+
+- For higher tiers and benefits, visit the [Ts.ED sponsorship page](https://github.com/romakita/sponsors).
+- After subscribing, you'll receive a confirmation email with a link to access the private packages.
+
+::: warning
+**You must be a sponsor to access Ts.ED's private packages.**
+:::
+
+## 2. Generate a GitHub Personal Access Token
+
+You need a GitHub Personal Access Token (PAT) with the `read:packages` scope. Here's how to create one:
+
+1. Go to your **GitHub Account Settings**.
+2. Navigate to **Developer settings** > **Personal access tokens** > **Tokens (classic)**.
+3. Click **Generate new token**.
+4. Select the **`read:packages`** scope (you can uncheck other scopes for security).
+5. Click **Generate token** and copy the resulting token.  
+   _**Keep your token secret!**_
+
+## 3. Configure Your Project
+
+You must configure your package manager to use your token for the `@tsedio` scope.  
+**Replace `GH_TOKEN` below with your actual token or use an environment variable such as `${GH_TOKEN}`.**
+
+### Using npm or pnpm
+
+Create or update a `.npmrc` file **at the root of your project** (or in your user home directory for global use):
+
+```ini
+@tsedio:registry=https://npm.pkg.github.com
+//npm.pkg.github.com/:_authToken=GH_TOKEN
+```
+
+- For **pnpm**, this configuration is also valid.
+
+### Using Yarn v1
+
+Add or update a `.yarnrc` file:
+
+```
+"@tsedio:registry" "https://npm.pkg.github.com"
+```
+
+### Using Yarn v2+ (Berry)
+
+Add or update a `.yarnrc.yml` file:
+
+```yaml
+npmScopes:
+  tsedio:
+    npmRegistryServer: "https://npm.pkg.github.com"
+    npmAlwaysAuth: true
+```
+
+### Security Recommendations
+
+- Never commit your personal access token to version control.
+- Prefer using environment variables (e.g., replace `GH_TOKEN` with `${GH_TOKEN}`) and inject them as part of your CI/CD
+  pipeline or local environment.
+
+## 4. Install the Premium Plugin
+
+Once configured, you can install premium Ts.ED plugins as usual:
+
+```sh
+npm install @tsedio/your-premium-plugin
+# or
+yarn add @tsedio/your-premium-plugin
+# or
+pnpm add @tsedio/your-premium-plugin
+```
+
+## Troubleshooting
+
+- **401 Unauthorized or 403 Forbidden**: Ensure your sponsorship is active, the PAT has the `read:packages` scope, and
+  your `.npmrc` or `.yarnrc*` files are correctly set up.
+- **Still need help?** Contact [support](mailto:contact@tsed.io) with your GitHub username and details.
diff --git a/docs/plugins/premium/testcontainers/mongo.md b/docs/plugins/premium/testcontainers/mongo.md
new file mode 100644
index 00000000000..73f0ce85ea9
--- /dev/null
+++ b/docs/plugins/premium/testcontainers/mongo.md
@@ -0,0 +1,230 @@
+# Mongo TestContainers
+
+A package for the [Ts.ED](https://tsed.dev/) framework to help you test your code using
+the [TestContainers](https://node.testcontainers.org/) library.
+
+> **Note:** This package does **not** depend on `@tsed/platform-http`. You can use it with any test framework.
+
+## ✨ Features
+
+- 🚀 **Spin up a MongoDB server** using TestContainers for your tests
+- 🛑 **Automatically stop** the MongoDB server after your tests
+- 🔄 **Reset** the MongoDB server between test runs
+- 🏷️ **Namespace support** to isolate databases and avoid collisions between tests
+
+## 📦 Installation
+
+Install with your favorite package manager:
+
+::: code-group
+
+```sh [npm]
+npm install --save-dev @tsedio/testcontainers-mongo
+```
+
+```sh [yarn]
+yarn add --dev @tsedio/testcontainers-mongo
+```
+
+```sh [pnpm]
+pnpm add --dev @tsedio/testcontainers-mongo
+```
+
+```sh [bun]
+bun add --dev @tsedio/testcontainers-mongo
+```
+
+:::
+
+::: tip
+See our documentation page for instructions on [installing premium plugins](/plugins/premium/install-premium-plugins.md).
+:::
+
+## ⚙️ Configuration
+
+Set up a global test lifecycle to manage the MongoDB container.
+
+### 🧪 Vitest
+
+Add a global setup file in your `vitest.config.ts`:
+
+```ts
+import {defineConfig} from "vitest/config";
+
+export default defineConfig({
+  test: {
+    globalSetup: [import.meta.resolve("@tsed/testcontainers-mongo/vitest/setup")]
+  }
+});
+```
+
+### 🧪 Jest (not recommended)
+
+Add `globalSetup` and `globalTeardown` to your Jest config:
+
+```json
+{
+  "globalSetup": ["jest.setup.js"],
+  "globalTeardown": ["jest.teardown.js"]
+}
+```
+
+Example setup/teardown files:
+
+```ts
+// jest.config.js
+module.exports = {
+  globalSetup: ["jest.setup.js"],
+  globalTeardown: ["jest.teardown.js"]
+};
+
+// jest.setup.js
+import {TestContainersMongo} from "@tsedio/testcontainers-mongo";
+
+export default async () => {
+  await TestContainersMongo.startContainer();
+};
+
+// jest.teardown.js
+import {TestContainersMongo} from "@tsedio/testcontainers-mongo";
+
+export default async () => {
+  await TestContainersMongo.stopContainer();
+};
+```
+
+## 🛠️ Basic Usage
+
+```ts
+import {TestContainersMongo} from "@tsedio/testcontainers-mongo";
+
+describe("MyTest", () => {
+  beforeEach(() => {
+    const connectionOptions = TestContainersMongo.getMongoOptions();
+    console.log(connectionOptions);
+  });
+
+  afterEach(async () => {
+    await TestContainersMongo.reset();
+  });
+});
+```
+
+## 🤝 Usage with @tsed/mongoose
+
+### 🧩 Unit Test Example
+
+```ts
+import {PlatformTest} from "@tsed/platform-http/testing";
+import {Property, Required} from "@tsed/schema";
+import {Model, MongooseModel, ObjectID, PostHook, PreHook, Unique} from "@tsed/mongoose";
+import {TestContainersMongo} from "@tsedio/testcontainers-mongo";
+
+@Model({schemaOptions: {timestamps: true}})
+@PreHook("save", (user: UserModel, next: any) => {
+  user.pre = "hello pre";
+  next();
+})
+@PostHook("save", (user: UserModel, next: any) => {
+  user.post = "hello post";
+  next();
+})
+export class UserModel {
+  @ObjectID("id")
+  _id: string;
+
+  @Property()
+  @Required()
+  @Unique()
+  email: string;
+
+  @Property()
+  pre: string;
+
+  @Property()
+  post: string;
+}
+
+describe("UserModel", () => {
+  beforeEach(() =>
+    PlatformTest.create({
+      mongoose: [TestContainersMongo.getMongoOptions()]
+    })
+  );
+  afterEach(async () => {
+    await TestContainersMongo.reset(); // reset the database
+    await PlatformTest.reset();
+  });
+
+  it("should run pre and post hooks", async () => {
+    const userModel = PlatformTest.get<MongooseModel<UserModel>>(UserModel);
+
+    // GIVEN
+    const user = new userModel({
+      email: "test@test.fr"
+    });
+
+    // WHEN
+    await user.save();
+
+    // THEN
+    expect(user.pre).toEqual("hello pre");
+    expect(user.post).toEqual("hello post");
+  });
+});
+```
+
+### 🔗 Integration Test Example
+
+Use `PlatformTest.bootstrap` and `TestContainersMongo.getMongoOptions("default")` to start the MongoDB server before
+your tests:
+
+```ts
+beforeEach(() =>
+  PlatformTest.bootstrap(Server, {
+    mongoose: [TestContainersMongo.getMongoOptions()]
+  })
+);
+```
+
+## 🔄 Usage with MikroORM
+
+Example using `@tsedio/testcontainers-mongo` with MikroORM:
+
+```ts
+import {defineConfig} from "@mikro-orm/mongodb";
+import {PlatformTest} from "@tsed/platform-http/testing";
+import {TestContainersMongo} from "@tsedio/testcontainers-mongo";
+
+beforeEach(async () => {
+  const mongoSettings = TestContainersMongo.getMongoOptions();
+
+  await PlatformTest.bootstrap(Server, {
+    disableComponentScan: true,
+    imports: [MikroOrmModule],
+    mikroOrm: [
+      defineConfig({
+        clientUrl: mongoSettings.url,
+        driverOptions: mongoSettings.connectionOptions,
+        entities: [User],
+        subscribers: [UnmanagedEventSubscriber1, new UnmanagedEventSubscriber2()]
+      })
+    ]
+  });
+});
+```
+
+## 💡 Tips
+
+- 🧹 Use `TestContainersMongo.reset()` to clear the database between tests.
+- 🏷️ Use `TestContainersMongo.getMongoOptions(namespace, options)` to generate MongoDB connection options:
+  - `namespace` (string): isolates databases between tests.
+  - `options` (object): corresponds
+    to [MongoClientOptions](https://mongodb.github.io/node-mongodb-native/4.0/interfaces/MongoClientOptions.html).
+- 🌐 You can define a global namespace using `TestContainersMongo.setNamespace("my-namespace")` if you don’t want to
+  specify it on every call.
+
+## 📚 Resources
+
+- [Ts.ED Documentation](https://tsed.dev/) 📖
+- [TestContainers Node.js](https://node.testcontainers.org/) 🐳
diff --git a/docs/plugins/premium/testcontainers/redis.md b/docs/plugins/premium/testcontainers/redis.md
new file mode 100644
index 00000000000..3d6379f8c4e
--- /dev/null
+++ b/docs/plugins/premium/testcontainers/redis.md
@@ -0,0 +1,148 @@
+# Redis TestContainers
+
+A [Ts.ED](https://tsed.dev/) package to help you easily test your code using the power
+of [TestContainers](https://node.testcontainers.org/) with Redis.
+
+> **Note:** This package does **not** depend on `@tsed/platform-http` and can be used with any test framework.
+
+## ✨ Features
+
+- 🚀 Easily spin up a Redis server in a Docker container for your tests
+- 🛑 Automatically stop the Redis server after your tests
+- 🔄 Reset the Redis server state between tests (by restarting the container)
+- 🏷️ Namespacing support to avoid collisions between different test suites
+
+## 📦 Installation
+
+Install the package with your favorite package manager:
+
+::: code-group
+
+```sh [npm]
+npm install --save-dev @tsedio/testcontainers-redis
+```
+
+```sh [yarn]
+yarn add --dev @tsedio/testcontainers-redis
+```
+
+```sh [pnpm]
+pnpm add --dev @tsedio/testcontainers-redis
+```
+
+```sh [bun]
+bun add --dev @tsedio/testcontainers-redis
+```
+
+:::
+
+::: tip
+See our documentation page for instructions on [installing premium plugins](/plugins/premium/install-premium-plugins.md).
+:::
+
+## ⚙️ Configuration
+
+Set up a global test lifecycle to manage your Redis container.
+
+### 🧪 Vitest
+
+Add a global setup in your `vitest.config.ts`:
+
+```ts
+import {defineConfig} from "vitest/config";
+
+export default defineConfig({
+  test: {
+    globalSetup: [import.meta.resolve("@tsed/testcontainers-redis/vitest/setup")]
+  }
+});
+```
+
+### 🧪 Jest
+
+Add `globalSetup` and `globalTeardown` to your Jest config:
+
+```ts
+// jest.config.js
+module.exports = {
+  globalSetup: ["jest.setup.js"],
+  globalTeardown: ["jest.teardown.js"]
+};
+```
+
+Create the following files:
+
+```ts
+// jest.setup.js
+import {TestContainersRedis} from "@tsedio/testcontainers-redis";
+
+module.exports = async () => {
+  await TestContainersRedis.startContainer();
+};
+
+// jest.teardown.js
+import {TestContainersRedis} from "@tsedio/testcontainers-redis";
+
+module.exports = async () => {
+  await TestContainersRedis.stopContainer();
+};
+```
+
+## 🛠️ Usage
+
+Set up a Redis connection in your project like this:
+
+```ts
+import {registerConnectionProvider} from "@tsed/ioredis";
+import {type Redis} from "ioredis";
+
+export const REDIS_CONNECTION = Symbol.for("REDIS_CONNECTION");
+export type REDIS_CONNECTION = typeof Redis;
+
+registerConnectionProvider({
+  token: REDIS_CONNECTION,
+  name: "default"
+});
+```
+
+Start the Redis server before your tests using `TestContainersRedis`:
+
+```ts
+import {PlatformTest, inject} from "@tsed/platform-http/testing";
+import {TestContainersRedis} from "@tsedio/testcontainers-redis";
+
+describe("Integration test", () => {
+  beforeEach(() => {
+    return PlatformTest.create({
+      ioredis: [
+        {
+          name: "redis",
+          ...TestContainersRedis.getRedisOptions()
+        }
+      ]
+    });
+  });
+
+  afterEach(() => PlatformTest.reset());
+
+  it("should run pre and post hook", async () => {
+    const client = inject(REDIS_CONNECTION);
+    // do something with the client
+  });
+});
+```
+
+## 💡 Tips
+
+- 🧹 Use `TestContainersRedis.reset()` to clear the Redis server state between tests (by restarting the container).
+- 🏷️ Use `TestContainersRedis.getRedisOptions(namespace, options)` to generate Redis connection options:
+  - `namespace`: isolates Redis instances between tests.
+  - `options`: corresponds
+    to [RedisOptions](https://github.com/redis/ioredis/blob/master/API.md#new-redisport-host-options).
+- 🌐 You can set a global namespace with `TestContainersRedis.setNamespace("my-namespace")` if you want to use the same
+  namespace in every call.
+
+## 📚 Resources
+
+- [Ts.ED Documentation](https://tsed.dev/) 📖
+- [TestContainers Node.js](https://node.testcontainers.org/) 🐳
diff --git a/docs/plugins/premium/testcontainers/vault.md b/docs/plugins/premium/testcontainers/vault.md
new file mode 100644
index 00000000000..750fee457ca
--- /dev/null
+++ b/docs/plugins/premium/testcontainers/vault.md
@@ -0,0 +1,141 @@
+# Vault TestContainers
+
+A [Ts.ED](https://tsed.dev/) package to help you easily test your code using the power
+of [TestContainers](https://node.testcontainers.org/) with HashiCorp Vault.
+
+> **Note:** This package does **not** depend on `@tsed/platform-http` and can be used with any test framework.
+
+## ✨ Features
+
+- 🚀 Easily spin up a Vault server in a Docker container for your tests
+- 🛑 Automatically stop the Vault server after your tests
+- 🔄 Reset the Vault server state between tests
+- 🔐 Pre-configured with dev mode and root token for easy testing
+
+## 📦 Installation
+
+Install the package with your favorite package manager:
+
+::: code-group
+
+```sh [npm]
+npm install --save-dev @tsedio/testcontainers-vault
+```
+
+```sh [yarn]
+yarn add --dev @tsedio/testcontainers-vault
+```
+
+```sh [pnpm]
+pnpm add --dev @tsedio/testcontainers-vault
+```
+
+```sh [bun]
+bun add --dev @tsedio/testcontainers-vault
+```
+
+:::
+
+::: tip
+See our documentation page for instructions on [installing premium plugins](/plugins/premium/install-premium-plugins.md).
+:::
+
+## ⚙️ Configuration
+
+Set up a global test lifecycle to manage your Vault container.
+
+### 🧪 Vitest
+
+Add a global setup in your `vitest.config.ts`:
+
+```ts
+import {defineConfig} from "vitest/config";
+
+export default defineConfig({
+  test: {
+    globalSetup: [import.meta.resolve("@tsed/testcontainers-vault/vitest/setup")]
+  }
+});
+```
+
+### 🧪 Jest
+
+Add `globalSetup` and `globalTeardown` to your Jest config:
+
+```ts
+// jest.config.js
+module.exports = {
+  globalSetup: ["jest.setup.js"],
+  globalTeardown: ["jest.teardown.js"]
+};
+```
+
+Create the following files:
+
+```ts
+// jest.setup.js
+import {TestContainersVault} from "@tsedio/testcontainers-vault";
+
+module.exports = async () => {
+  await TestContainersVault.startContainer();
+};
+
+// jest.teardown.js
+import {TestContainersVault} from "@tsedio/testcontainers-vault";
+
+module.exports = async () => {
+  await TestContainersVault.stopContainer();
+};
+```
+
+## 🛠️ Usage
+
+Set up a Vault connection in your project like this:
+
+```ts
+import {withOptions} from "@tsed/config";
+import {DITest} from "@tsed/di";
+import {VaultConfigSource} from "@tsedio/config-vault";
+import {TestContainersVault} from "@tsedio/testcontainers-vault";
+
+describe("Integration test", () => {
+  beforeEach(async () => {
+    return DITest.create({
+      extends: [
+        withOptions(VaultConfigSource, {
+          name: "vault",
+          ...TestContainersVault.getVaultOptions(),
+          secretPath: "secret/data/tsed-test"
+        })
+      ]
+    });
+  });
+
+  afterEach(() => DITest.reset());
+
+  it("should store and retrieve secrets", async () => {
+    const configs = inject<CONFIG_SOURCES>(CONFIG_SOURCES);
+    const instance = configs.vault as VaultConfigSource;
+
+    await instance.set("hello", "world");
+    const result = await instance.getAll();
+
+    expect(result).toEqual({
+      hello: "world"
+    });
+  });
+});
+```
+
+## 💡 Tips
+
+- 🧹 Use `TestContainersVault.reset()` to clear all secrets in the Vault server between tests.
+- 🔐 The default root token is `dev-token` and the server runs in dev mode.
+- 🌐 You can use `TestContainersVault.getClient()` to get a pre-configured node-vault client.
+
+## 📚 Resources
+
+- [Ts.ED Documentation](https://tsed.dev/) 📖
+- [TestContainers Node.js](https://node.testcontainers.org/) 🐳
+- [HashiCorp Vault](https://www.vaultproject.io/) 🔐
+- [node-vault](https://github.com/kr1sp1n/node-vault) 🗝️
diff --git a/docs/public/vault.png b/docs/public/vault.png
new file mode 100644
index 00000000000..c401074a8aa
Binary files /dev/null and b/docs/public/vault.png differ
diff --git a/docs/warehouse/index.md b/docs/warehouse/index.md
index 9ab022c78f9..a3cfccacd0a 100644
--- a/docs/warehouse/index.md
+++ b/docs/warehouse/index.md
@@ -9,4 +9,6 @@ head:
       content: Ts.ED nodejs typescript plugins marketplace premium official community discover
 ---
 
-<Warehouse />
+<Warehouse>
+Discover our list of plugins to extend your Ts.ED project. Created by the Ts.ED team and community.
+</Warehouse>
diff --git a/docs/yarn.lock b/docs/yarn.lock
index 767780daa67..d091befb4ec 100644
--- a/docs/yarn.lock
+++ b/docs/yarn.lock
@@ -750,7 +750,7 @@ __metadata:
   version: 0.0.0-use.local
   resolution: "@tsed/docs-new@workspace:."
   dependencies:
-    "@tsed/vitepress-theme": "npm:1.5.5"
+    "@tsed/vitepress-theme": "npm:1.5.6"
     "@vueuse/core": "npm:10.11.0"
     autoprefixer: "npm:^10.4.19"
     axios: "npm:1.7.7"
@@ -762,14 +762,14 @@ __metadata:
   languageName: unknown
   linkType: soft
 
-"@tsed/vitepress-theme@npm:1.5.5":
-  version: 1.5.5
-  resolution: "@tsed/vitepress-theme@npm:1.5.5"
+"@tsed/vitepress-theme@npm:1.5.6":
+  version: 1.5.6
+  resolution: "@tsed/vitepress-theme@npm:1.5.6"
   dependencies:
     "@vueuse/core": "npm:10.11.0"
     axios: "npm:1.7.7"
     lucide-vue-next: "npm:^0.436.0"
-  checksum: 10/7c4ac4f9b629ec42b9c297389943b42b9ff8af3af34e6da3dcd53d53c3b4918c81e4ec0c4122237574c4f5f003af547b58dbe98f5134798495cd254fcb91dcde
+  checksum: 10/4e17dc46d7014ba6c5d0cf1516439ea6a0eb1fecf599fe08738185ba81ffe25408e90058fc58a9734ab9071d686acc462da607d7cd7250e24d8635d73c1e5c10
   languageName: node
   linkType: hard
 


Reviews:
user: login: coderabbitai[bot]
body: **Actionable comments posted: 13**

<details>
<summary>📜 Review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: ASSERTIVE**
**Plan: Pro**
**Cache: Disabled due to data retention organization setting**
**Knowledge Base: Disabled due to data retention organization setting**


<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between fa73a09ac2d2c1c92080014538caeb0e8f358e4f and 040a91bc67518f335e140e52c1051e890a0e3578.

</details>

<details>
<summary>⛔ Files ignored due to path filters (2)</summary>

* `docs/public/vault.png` is excluded by `!**/*.png`
* `docs/yarn.lock` is excluded by `!**/yarn.lock`, `!**/*.lock`

</details>

<details>
<summary>📒 Files selected for processing (12)</summary>

* `docs/.vitepress/config.mts` (2 hunks)
* `docs/docs/configuration/configuration-sources.md` (3 hunks)
* `docs/index.md` (1 hunks)
* `docs/package.json` (1 hunks)
* `docs/plugins/premium/config-source/ioredis.md` (1 hunks)
* `docs/plugins/premium/config-source/mongo.md` (1 hunks)
* `docs/plugins/premium/config-source/vault.md` (1 hunks)
* `docs/plugins/premium/install-premium-plugins.md` (1 hunks)
* `docs/plugins/premium/testcontainers/mongo.md` (1 hunks)
* `docs/plugins/premium/testcontainers/redis.md` (1 hunks)
* `docs/plugins/premium/testcontainers/vault.md` (1 hunks)
* `docs/warehouse/index.md` (1 hunks)

</details>

<details>
<summary>🧰 Additional context used</summary>

<details>
<summary>🪛 markdownlint-cli2 (0.17.2)</summary>

<details>
<summary>docs/warehouse/index.md</summary>

12-12: Inline HTML
Element: Warehouse

(MD033, no-inline-html)

---

12-12: First line in a file should be a top-level heading
null

(MD041, first-line-heading, first-line-h1)

</details>
<details>
<summary>docs/plugins/premium/config-source/vault.md</summary>

13-13: Inline HTML
Element: Banner

(MD033, no-inline-html)

</details>
<details>
<summary>docs/plugins/premium/install-premium-plugins.md</summary>

63-63: Fenced code blocks should have a language specified
null

(MD040, fenced-code-language)

</details>
<details>
<summary>docs/plugins/premium/config-source/mongo.md</summary>

13-13: Inline HTML
Element: Banner

(MD033, no-inline-html)

</details>
<details>
<summary>docs/docs/configuration/configuration-sources.md</summary>

32-32: Bare URL used
null

(MD034, no-bare-urls)

---

448-448: Bare URL used
null

(MD034, no-bare-urls)

</details>

</details>
<details>
<summary>🪛 LanguageTool</summary>

<details>
<summary>docs/plugins/premium/config-source/vault.md</summary>

[uncategorized] ~27-~27: Possible missing comma found.
Context: ...or more details on the @@ConfigSource@@ feature go to [Configuration Source documentati...

(AI_HYDRA_LEO_MISSING_COMMA)

</details>
<details>
<summary>docs/plugins/premium/testcontainers/redis.md</summary>

[uncategorized] ~140-~140: Loose punctuation mark.
Context: ...s instances between tests.   - `options`: corresponds     to [RedisOptions](https...

(UNLIKELY_OPENING_PUNCTUATION)

</details>
<details>
<summary>docs/plugins/premium/config-source/mongo.md</summary>

[uncategorized] ~18-~18: Possible missing comma found.
Context: ...or more details on the @@ConfigSource@@ feature go to [Configuration Source documentati...

(AI_HYDRA_LEO_MISSING_COMMA)

---

[uncategorized] ~28-~28: Possible missing comma found.
Context: ...or more details on the @@ConfigSource@@ feature go to [Configuration Source documentati...

(AI_HYDRA_LEO_MISSING_COMMA)

</details>
<details>
<summary>docs/plugins/premium/config-source/ioredis.md</summary>

[misspelling] ~132-~132: This word is normally spelled as one.
Context: ...r real-time updates (the   package will auto-configure this when possible). - 📚 **Validation:...

(EN_COMPOUNDS_AUTO_CONFIGURE)

</details>

</details>

</details>

<details>
<summary>⏰ Context from checks skipped due to timeout of 90000ms (9)</summary>

* GitHub Check: test-third-parties (20.12.2)
* GitHub Check: test-graphql (20.12.2)
* GitHub Check: test-security (20.12.2)
* GitHub Check: test-platform (20.12.2)
* GitHub Check: test-specs (20.12.2)
* GitHub Check: test-orm (20.12.2)
* GitHub Check: test-core (20.12.2)
* GitHub Check: lint (20.12.2)
* GitHub Check: CodeQL-Build

</details>

<details>
<summary>🔇 Additional comments (9)</summary><blockquote>

<details>
<summary>docs/package.json (1)</summary>

`13-13`: **Dependency version bump looks good.**
The update of `@tsed/vitepress-theme` from `1.5.5` to `1.5.6` aligns with the expanded documentation and theme requirements.

</details>
<details>
<summary>docs/index.md (1)</summary>

`186-188`: **Added Vault premium plugin framework tile.**
The new “Vault” entry correctly links to `/plugins/premium/config-source/vault.html` with its image. Please ensure the `/vault.png` asset is present in the static assets directory.

</details>
<details>
<summary>docs/warehouse/index.md (1)</summary>

`12-14`: **Expanded `<Warehouse>` component to include descriptive content.**
Replacing the self-closing tag with an explicit opening/closing tag adds valuable context for users. Inline HTML here is intentional for the Vue component.

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 markdownlint-cli2 (0.17.2)</summary>

12-12: Inline HTML
Element: Warehouse

(MD033, no-inline-html)

---

12-12: First line in a file should be a top-level heading
null

(MD041, first-line-heading, first-line-h1)

</details>

</details>

</details>
<details>
<summary>docs/.vitepress/config.mts (4)</summary>

`311-314`: **Nav: “Install premium plugins” entry added.**
The navigation now links to `/plugins/premium/install-premium-plugins`, integrating the installation guide under the “Plugins” menu.

---

`319-347`: **Nav: “Premium plugins” submenu integration.**
The new nested submenu lists all premium plugin docs. It matches the PR objectives; consider ordering (e.g., alphabetical) if the list expands further.

---

`538-541`: **Sidebar: “Install premium plugins” entry added.**
The sidebar under `/plugins/` now includes the installation guide, mirroring the main navigation.

---

`547-574`: **Sidebar: “Premium plugins” submenu integration.**
The sidebar grouping for premium plugins is consistent with the nav, providing easy access to each plugin’s documentation.

</details>
<details>
<summary>docs/plugins/premium/install-premium-plugins.md (1)</summary>

`1-101`: **Comprehensive installation guide for premium plugins.**
The step-by-step instructions cover sponsorship, token generation, package manager configuration, installation, and troubleshooting—offering a clear, end-to-end user experience.

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 markdownlint-cli2 (0.17.2)</summary>

63-63: Fenced code blocks should have a language specified
null

(MD040, fenced-code-language)

</details>

</details>

</details>
<details>
<summary>docs/plugins/premium/testcontainers/redis.md (1)</summary>

`1-149`: **Documentation looks great**

The Redis TestContainers guide is clear, consistent, and follows established patterns. No changes required.

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 LanguageTool</summary>

[uncategorized] ~140-~140: Loose punctuation mark.
Context: ...s instances between tests.   - `options`: corresponds     to [RedisOptions](https...

(UNLIKELY_OPENING_PUNCTUATION)

</details>

</details>

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-19T11:20:11Z
user: login: coderabbitai[bot]
body: **Actionable comments posted: 7**

<details>
<summary>♻️ Duplicate comments (4)</summary><blockquote>

<details>
<summary>docs/plugins/premium/install-premium-plugins.md (1)</summary><blockquote>

`63-66`: **Specify fenced code block language**: The Yarn v1 snippet currently lacks a language identifier. Add `ini` to the opening backticks for proper syntax highlighting:

```diff
-   ```
+   ```ini
```

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 markdownlint-cli2 (0.17.2)</summary>

63-63: Fenced code blocks should have a language specified
null

(MD040, fenced-code-language)

</details>

</details>

</blockquote></details>
<details>
<summary>docs/plugins/premium/testcontainers/vault.md (1)</summary><blockquote>

`96-114`: **Replace `DITest` with `PlatformTest`**  
The example refers to the undefined `DITest` identifier. Update all occurrences to use `PlatformTest.create` and `PlatformTest.reset` to align with other TestContainers documentation.

</blockquote></details>
<details>
<summary>docs/docs/configuration/configuration-sources.md (1)</summary><blockquote>

`446-449`: _🧹 Nitpick (assertive)_

**Convert email to mailto link in roadmap warning**  
Make the contact email clickable for better user experience.  

```diff
-Contact us at contact-tsed@gmail.com or via [Slack](https://slack.tsed.io/).
+Contact us at [contact-tsed@gmail.com](mailto:contact-tsed@gmail.com) or via [Slack](https://slack.tsed.io/).
```

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 markdownlint-cli2 (0.17.2)</summary>

448-448: Bare URL used
null

(MD034, no-bare-urls)

</details>

</details>

</blockquote></details>
<details>
<summary>docs/plugins/premium/config-source/ioredis.md (1)</summary><blockquote>

`112-112`: _⚠️ Potential issue_

**Fix the import path for the programmatic API snippet**  
The example currently imports from the wrong package name. It should reference the premium plugin package (`@tsedio/config-ioredis`) instead of `@tsed/ioredis-config`.  

Apply this diff:
```diff
-import {IORedisConfigSource} from "@tsed/ioredis-config";
+import {IORedisConfigSource} from "@tsedio/config-ioredis";
```

</blockquote></details>

</blockquote></details>

<details>
<summary>📜 Review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: ASSERTIVE**
**Plan: Pro**
**Cache: Disabled due to data retention organization setting**
**Knowledge Base: Disabled due to data retention organization setting**


<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 040a91bc67518f335e140e52c1051e890a0e3578 and 5bd865c25fae4fd0ecbc3b0bf36f112407f4793b.

</details>

<details>
<summary>⛔ Files ignored due to path filters (2)</summary>

* `docs/public/vault.png` is excluded by `!**/*.png`
* `docs/yarn.lock` is excluded by `!**/yarn.lock`, `!**/*.lock`

</details>

<details>
<summary>📒 Files selected for processing (12)</summary>

* `docs/.vitepress/config.mts` (2 hunks)
* `docs/docs/configuration/configuration-sources.md` (3 hunks)
* `docs/index.md` (1 hunks)
* `docs/package.json` (1 hunks)
* `docs/plugins/premium/config-source/ioredis.md` (1 hunks)
* `docs/plugins/premium/config-source/mongo.md` (1 hunks)
* `docs/plugins/premium/config-source/vault.md` (1 hunks)
* `docs/plugins/premium/install-premium-plugins.md` (1 hunks)
* `docs/plugins/premium/testcontainers/mongo.md` (1 hunks)
* `docs/plugins/premium/testcontainers/redis.md` (1 hunks)
* `docs/plugins/premium/testcontainers/vault.md` (1 hunks)
* `docs/warehouse/index.md` (1 hunks)

</details>

<details>
<summary>🧰 Additional context used</summary>

<details>
<summary>🪛 LanguageTool</summary>

<details>
<summary>docs/plugins/premium/testcontainers/redis.md</summary>

[uncategorized] ~140-~140: Loose punctuation mark.
Context: ...s instances between tests.   - `options`: corresponds     to [RedisOptions](https...

(UNLIKELY_OPENING_PUNCTUATION)

</details>
<details>
<summary>docs/plugins/premium/config-source/ioredis.md</summary>

[misspelling] ~132-~132: This word is normally spelled as one.
Context: ...r real-time updates (the   package will auto-configure this when possible). - 📚 **Validation:...

(EN_COMPOUNDS_AUTO_CONFIGURE)

</details>

</details>
<details>
<summary>🪛 markdownlint-cli2 (0.17.2)</summary>

<details>
<summary>docs/docs/configuration/configuration-sources.md</summary>

448-448: Bare URL used
null

(MD034, no-bare-urls)

</details>
<details>
<summary>docs/plugins/premium/install-premium-plugins.md</summary>

63-63: Fenced code blocks should have a language specified
null

(MD040, fenced-code-language)

</details>
<details>
<summary>docs/plugins/premium/config-source/ioredis.md</summary>

13-13: Inline HTML
Element: Banner

(MD033, no-inline-html)

</details>
<details>
<summary>docs/plugins/premium/config-source/mongo.md</summary>

13-13: Inline HTML
Element: Banner

(MD033, no-inline-html)

</details>

</details>

</details>

<details>
<summary>⏰ Context from checks skipped due to timeout of 90000ms (9)</summary>

* GitHub Check: test-third-parties (20.12.2)
* GitHub Check: test-security (20.12.2)
* GitHub Check: test-core (20.12.2)
* GitHub Check: test-orm (20.12.2)
* GitHub Check: test-graphql (20.12.2)
* GitHub Check: test-specs (20.12.2)
* GitHub Check: test-platform (20.12.2)
* GitHub Check: lint (20.12.2)
* GitHub Check: CodeQL-Build

</details>

<details>
<summary>🔇 Additional comments (8)</summary><blockquote>

<details>
<summary>docs/package.json (1)</summary>

`13-13`: <details>
<summary>❓ Verification inconclusive</summary>

**Dependency version bump**: The update to `@tsed/vitepress-theme` v1.5.6 aligns with the new documentation changes. Please rebuild and test the docs site locally to confirm theme compatibility and catch any visual regressions.  
  
Run:

to validate the changes.

---

🏁 Script executed:

```shell
yarn docs:build && yarn docs:preview
```

Length of output: 236

---



</details>

**Local validation required for docs theme bump**  
The bump to `@tsed/vitepress-theme` v1.5.6 looks correct, but I wasn’t able to build the docs in the sandbox (missing `node_modules`). Please run locally:  
```shell
yarn install
yarn docs:build && yarn docs:preview
```  
to confirm theme compatibility and catch any visual regressions.

</details>
<details>
<summary>docs/warehouse/index.md (1)</summary>

`12-14`: **Add descriptive content inside `<Warehouse>`**: Replacing the self-closing `<Warehouse />` tag with content enhances discoverability. Confirm that the rendered page displays this text correctly without layout or styling issues.  
  
Open the built HTML at `/warehouse/index.html` to visually inspect the content.

</details>
<details>
<summary>docs/.vitepress/config.mts (2)</summary>

`538-541`: <details>
<summary>✅ Verification successful</summary>

**Add "Install premium plugins" to sidebar**: Sidebar now mirrors the nav structure. Verify consistency and that the item appears correctly under `/plugins/`.  


---

🏁 Script executed:

```shell
grep -R "/plugins/premium/install-premium-plugins" -n docs/.vitepress/config.mts
```

Length of output: 208

---



</details>

**Confirmation: “Install premium plugins” is present under both nav and sidebar**  
The link `/plugins/premium/install-premium-plugins` appears at line 313 (nav) and line 540 (sidebar), so the sidebar correctly mirrors the nav structure.

---

`311-314`: <details>
<summary>✅ Verification successful</summary>

**Add "Install premium plugins" nav item**: This new navigation entry improves discoverability. Ensure the path `/plugins/premium/install-premium-plugins` is correct and the page is accessible via the nav.  


---

🏁 Script executed:

```shell
grep -R "/plugins/premium/install-premium-plugins" -n docs
```

Length of output: 1259

---

Please verify that the actual Markdown page exists at the expected path:

---

🏁 Script executed:

```shell
find docs/plugins/premium -maxdepth 1 -type f -name install-premium-plugins.md
```

Length of output: 128

---



</details>

**Confirmed “Install premium plugins” nav entry**  
The Markdown file `docs/plugins/premium/install-premium-plugins.md` exists and the link in `docs/.vitepress/config.mts` matches correctly.

- docs/.vitepress/config.mts (lines 311–314):  
  ```js
  {
    text: "Install premium plugins",
    link: "/plugins/premium/install-premium-plugins"
  },
  ```
- docs/plugins/premium/install-premium-plugins.md: verified present

</details>
<details>
<summary>docs/plugins/premium/testcontainers/mongo.md (1)</summary>

`1-231`: **LGTM**  
The MongoDB TestContainers documentation is clear, consistent, and correctly formatted. No changes needed.

</details>
<details>
<summary>docs/plugins/premium/config-source/mongo.md (1)</summary>

`1-144`: **Documentation is clear and complete**  
The MongoDB Config Source guide thoroughly covers features, installation, configuration examples, real-time watching, programmatic usage, tips, and resources without any apparent issues.

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 markdownlint-cli2 (0.17.2)</summary>

13-13: Inline HTML
Element: Banner

(MD033, no-inline-html)

</details>

</details>

</details>
<details>
<summary>docs/plugins/premium/config-source/ioredis.md (2)</summary>

`1-110`: **General approval**  
The IORedis Config Source documentation is well-structured and comprehensive. Features, installation instructions, configuration examples, watching mode, and tips are clearly presented and align with the plugin’s capabilities.

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 markdownlint-cli2 (0.17.2)</summary>

13-13: Inline HTML
Element: Banner

(MD033, no-inline-html)

</details>

</details>

---

`113-140`: **Final sections look good**  
The tips on multi-connection management, key prefixing, watch mode prerequisites, validation, and the resources list are concise and informative.

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 LanguageTool</summary>

[misspelling] ~132-~132: This word is normally spelled as one.
Context: ...r real-time updates (the   package will auto-configure this when possible). - 📚 **Validation:...

(EN_COMPOUNDS_AUTO_CONFIGURE)

</details>

</details>

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-19T12:38:24Z

Review comments:
diff_hunk: @@ -0,0 +1,100 @@
+---
+head:
+  - - meta
+    - name: description
+      content: Installation instructions for premium plugins in Ts.ED. Learn how to install and configure private packages from GitHub.
+  - - meta
+    - name: keywords
+      content: Ts.ED create plugins marketplace premium guide installation
+---
+
+# Installing a Premium Plugin
+
+Premium (private) Ts.ED plugins are distributed as private packages via GitHub's npm registry. To access and install
+them, you must:
+
+1. **Become a sponsor of Ts.ED at the required tier**
+2. **Generate a GitHub Personal Access Token (PAT) with the correct permissions**
+3. **Configure your project to use the token when installing packages**
+
+## 1. Become a Ts.ED Sponsor
+
+To access premium plugins, you must be an active sponsor at least at
+the [Power Dev tier](https://github.com/sponsors/Romakita/sponsorships?tier_id=489429&preview=false).
+
+- For higher tiers and benefits, visit the [Ts.ED sponsorship page](https://github.com/romakita/sponsors).
+- After subscribing, you'll receive a confirmation email with a link to access the private packages.
+
+::: warning
+**You must be a sponsor to access Ts.ED's private packages.**
+:::
+
+## 2. Generate a GitHub Personal Access Token
+
+You need a GitHub Personal Access Token (PAT) with the `read:packages` scope. Here's how to create one:
+
+1. Go to your **GitHub Account Settings**.
+2. Navigate to **Developer settings** > **Personal access tokens** > **Tokens (classic)**.
+3. Click **Generate new token**.
+4. Select the **`read:packages`** scope (you can uncheck other scopes for security).
+5. Click **Generate token** and copy the resulting token.  
+   _**Keep your token secret!**_
+
+## 3. Configure Your Project
+
+You must configure your package manager to use your token for the `@tsedio` scope.  
+**Replace `GH_TOKEN` below with your actual token or use an environment variable such as `${GH_TOKEN}`.**
+
+### Using npm or pnpm
+
+Create or update a `.npmrc` file **at the root of your project** (or in your user home directory for global use):
+
+```ini
+@tsedio:registry=https://npm.pkg.github.com
+//npm.pkg.github.com/:_authToken=GH_TOKEN
+```
+
+- For **pnpm**, this configuration is also valid.
+
+### Using Yarn v1
+
+Add or update a `.yarnrc` file:
+
+```
+"@tsedio:registry" "https://npm.pkg.github.com"
+```
+
path: docs/plugins/premium/install-premium-plugins.md
user: login: coderabbitai[bot]
body: _🧹 Nitpick (assertive)_

**Specify the fenced code block language.**
Add a language identifier (e.g., `ini`) to the Yarn v1 code block for proper syntax highlighting:
```diff
- ```
+ ```ini
```

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 markdownlint-cli2 (0.17.2)</summary>

63-63: Fenced code blocks should have a language specified
null

(MD040, fenced-code-language)

</details>

</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
In docs/plugins/premium/install-premium-plugins.md around lines 63 to 66, the
fenced code block lacks a language identifier, which prevents proper syntax
highlighting. Add the language identifier "ini" immediately after the opening
triple backticks to specify the code block language for better readability.
```

</details>

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-05-19T11:20:08Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,140 @@
+# Vault TestContainers
+
+A [Ts.ED](https://tsed.dev/) package to help you easily test your code using the power
+of [TestContainers](https://node.testcontainers.org/) with HashiCorp Vault.
+
+> **Note:** This package does **not** depend on `@tsed/platform-http` and can be used with any test framework.
+
+## ✨ Features
+
+- 🚀 Easily spin up a Vault server in a Docker container for your tests
+- 🛑 Automatically stop the Vault server after your tests
+- 🔄 Reset the Vault server state between tests
+- 🔐 Pre-configured with dev mode and root token for easy testing
+
+## 📦 Installation
+
+Install the package with your favorite package manager:
+
+::: code-group
+
+```sh [npm]
+npm install --save-dev @tsedio/testcontainers-vault
+```
+
+```sh [yarn]
+yarn add --dev @tsedio/testcontainers-vault
+```
+
+```sh [pnpm]
+pnpm add --dev @tsedio/testcontainers-vault
+```
+
+```sh [bun]
+bun add --dev @tsedio/testcontainers-vault
+```
+
+:::
+
+::: tip
+See our documentation page for instructions on [installing premium plugins](/plugins/premium/install-premium-plugins.md).
+:::
+
+## ⚙️ Configuration
+
+Set up a global test lifecycle to manage your Vault container.
+
+### 🧪 Vitest
+
+Add a global setup in your `vitest.config.ts`:
+
+```ts
+import {defineConfig} from "vitest/config";
+
+export default defineConfig({
+  test: {
+    globalSetup: [import.meta.resolve("@tsed/testcontainers-vault/vitest/setup")]
+  }
+});
+```
+
+### 🧪 Jest
+
+Add `globalSetup` and `globalTeardown` to your Jest config:
+
+```ts
+// jest.config.js
+module.exports = {
+  globalSetup: ["jest.setup.js"],
+  globalTeardown: ["jest.teardown.js"]
+};
+```
+
+Create the following files:
+
+```ts
+// jest.setup.js
+import {TestContainersVault} from "@tsedio/testcontainers-vault";
+
+module.exports = async () => {
+  await TestContainersVault.startContainer();
+};
+
+// jest.teardown.js
+import {TestContainersVault} from "@tsedio/testcontainers-vault";
+
+module.exports = async () => {
+  await TestContainersVault.stopContainer();
+};
+```
+
+## 🛠️ Usage
+
+Set up a Vault connection in your project like this:
+
+```ts
+import {withOptions} from "@tsed/config";
+import {VaultConfigSource} from "@tsedio/config-vault";
+import {TestContainersVault} from "@tsedio/testcontainers-vault";
+
+describe("Integration test", () => {
+  beforeEach(async () => {
+    return DITest.create({
+      extends: [
+        withOptions(VaultConfigSource, {
+          name: "vault",
+          ...TestContainersVault.getVaultOptions(),
+          secretPath: "secret/data/tsed-test"
+        })
+      ]
+    });
+  });
+
+  afterEach(() => DITest.reset());
+
path: docs/plugins/premium/testcontainers/vault.md
user: login: coderabbitai[bot]
body: _🛠️ Refactor suggestion_

**Fix undefined `DITest` usage in the usage example**

The example refers to `DITest.create` and `DITest.reset`, but `DITest` is neither imported nor defined, and this deviates from other TestContainers docs that use `PlatformTest`. Update the snippet as follows:

```diff
-import {withOptions} from "@tsed/config";
-import {VaultConfigSource} from "@tsedio/config-vault";
-import {TestContainersVault} from "@tsedio/testcontainers-vault";

+import {PlatformTest, inject} from "@tsed/platform-http/testing";
+import {withOptions} from "@tsed/config";
+import {VaultConfigSource} from "@tsedio/config-vault";
+import {TestContainersVault} from "@tsedio/testcontainers-vault";

 describe("Integration test", () => {
-  beforeEach(async () => {
-    return DITest.create({
+  beforeEach(async () => {
+    return PlatformTest.create({
       extends: [
         withOptions(VaultConfigSource, {
           name: "vault",
@@ -113,4 +113,4 @@ describe("Integration test", () => {
-  afterEach(() => DITest.reset());
+  afterEach(() => PlatformTest.reset());
 ```



<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

```suggestion
import {PlatformTest, inject} from "@tsed/platform-http/testing";
import {withOptions} from "@tsed/config";
import {VaultConfigSource} from "@tsedio/config-vault";
import {TestContainersVault} from "@tsedio/testcontainers-vault";

describe("Integration test", () => {
  beforeEach(async () => {
    return PlatformTest.create({
      extends: [
        withOptions(VaultConfigSource, {
          name: "vault",
          ...TestContainersVault.getVaultOptions(),
          secretPath: "secret/data/tsed-test"
        })
      ]
    });
  });

  afterEach(() => PlatformTest.reset());
```

</details>

<!-- suggestion_end -->

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
In docs/plugins/premium/testcontainers/vault.md around lines 95 to 114, the
example code uses an undefined identifier `DITest` for creating and resetting
the test context. Replace all occurrences of `DITest` with `PlatformTest` to
align with other TestContainers documentation and ensure the example works
correctly. Also, add an import statement for `PlatformTest` if it is missing.
```

</details>

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-05-19T11:20:08Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,157 @@
+---
+head:
+  - - meta
+    - name: description
+      content: A robust Ts.ED plugin for dynamic application configuration stored securely in HashiCorp Vault. Keep your secrets and config synchronized with your app in real time!
+  - - meta
+    - name: keywords
+      content: Ts.ED plugins premium vault hashicorp config-source
+---
+
+# Vault Config Source
+
+<Banner src="/vault.png" height="200" href="https://www.vaultproject.io/"></Banner>
+
+A robust [Ts.ED](https://tsed.dev/) plugin for dynamic application configuration stored securely
+in [HashiCorp Vault](https://www.vaultproject.io/).  
+Keep your secrets and config synchronized with your app in real time!
+
+## ✨ Features
+
+- ⚙️ **Configure HashiCorp Vault** connection easily with the `@Configuration` decorator.
+- 🔄 **Poll Vault for changes**: Regularly check Vault for updated secrets and notify your application automatically.
+- ✏️ **Sync and update**: Use Vault as a dynamic source of truth for app configuration, and update values
+  programmatically.
+- 🔒 **Supports both KV v1 and v2**: Compatible with both secret engine versions.
+
+For more details on the @@ConfigSource@@ feature go to [Configuration Source documentation page](/docs/configuration/configuration-sources.md).
path: docs/plugins/premium/config-source/vault.md
user: login: coderabbitai[bot]
body: _🧹 Nitpick (assertive)_

**Add missing comma for clarity in sentence**

Insert a comma after "feature" to improve readability:

```diff
- For more details on the @@ConfigSource@@ feature go to [Configuration Source documentation page](/docs/configuration/configuration-sources.md).
+ For more details on the @@ConfigSource@@ feature, go to [Configuration Source documentation page](/docs/configuration/configuration-sources.md).
```



<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

```suggestion
For more details on the @@ConfigSource@@ feature, go to [Configuration Source documentation page](/docs/configuration/configuration-sources.md).
```

</details>

<!-- suggestion_end -->

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 LanguageTool</summary>

[uncategorized] ~27-~27: Possible missing comma found.
Context: ...or more details on the @@ConfigSource@@ feature go to [Configuration Source documentati...

(AI_HYDRA_LEO_MISSING_COMMA)

</details>

</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
In docs/plugins/premium/config-source/vault.md at line 27, add a comma after the
word "feature" in the sentence to improve clarity and readability. This involves
inserting a comma right after "feature" before continuing the sentence.
```

</details>

<!-- This is an auto-generated comment by CodeRabbit -->

✅ Addressed in commit 5bd865c
created_at: 2025-05-19T11:20:09Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,230 @@
+# Mongo TestContainers
+
+A package for the [Ts.ED](https://tsed.dev/) framework to help you test your code using
+the [TestContainers](https://node.testcontainers.org/) library.
+
+> **Note**: This package does **not** depend on `@tsed/platform-http`. You can use it with any test framework.
+
+## ✨ Features
+
+- 🚀 **Spin up a MongoDB server** using TestContainers for your tests
+- 🛑 **Automatically stop** the MongoDB server after your tests
+- 🔄 **Reset** the MongoDB server between test runs
+- 🏷️ **Namespace support** to isolate databases and avoid collisions between tests
+
+## 📦 Installation
+
+Install with your favorite package manager:
+
+::: code-group
+
+```sh [npm]
+npm install --save-dev @tsedio/testcontainers-mongo
+```
+
+```sh [yarn]
+yarn add --dev @tsedio/testcontainers-mongo
+```
+
+```sh pnpm
+pnpm add --dev @tsedio/testcontainers-mongo
+```
path: docs/plugins/premium/testcontainers/mongo.md
user: login: coderabbitai[bot]
body: _🧹 Nitpick (assertive)_

**Fix code fence language identifier for pnpm**

Ensure the pnpm snippet matches the pattern used by other package managers:

```diff
- ```sh pnpm
+ ```sh [pnpm]
```

<details>
<summary>🤖 Prompt for AI Agents</summary>

````
In docs/plugins/premium/testcontainers/mongo.md around lines 29 to 31, the code
fence language identifier for the pnpm snippet is incorrect. Change the opening
code fence from ```sh pnpm to ```sh [pnpm] to match the pattern used by other
package managers and ensure consistent formatting.
````

</details>

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-05-19T11:20:09Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,230 @@
+# Mongo TestContainers
+
+A package for the [Ts.ED](https://tsed.dev/) framework to help you test your code using
+the [TestContainers](https://node.testcontainers.org/) library.
+
+> **Note**: This package does **not** depend on `@tsed/platform-http`. You can use it with any test framework.
path: docs/plugins/premium/testcontainers/mongo.md
user: login: coderabbitai[bot]
body: _🧹 Nitpick (assertive)_

**Unify Note block formatting**

The Jest note uses `**Note**:` while other docs use `**Note:**`. For consistency, update to:

```diff
- > **Note**: This package does **not** depend on `@tsed/platform-http`. You can use it with any test framework.
+ > **Note:** This package does **not** depend on `@tsed/platform-http`. You can use it with any test framework.
```



<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

```suggestion
> **Note:** This package does **not** depend on `@tsed/platform-http`. You can use it with any test framework.
```

</details>

<!-- suggestion_end -->

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
In docs/plugins/premium/testcontainers/mongo.md at line 6, the note block
formatting uses "**Note**:" but other documentation uses "**Note:**". Update the
note to use "**Note:**" with the colon inside the bold formatting for
consistency across docs.
```

</details>

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-05-19T11:20:09Z
author_association: CONTRIBUTOR
diff_hunk: @@ -415,3 +432,18 @@ export class MyService {
   configSource = injectConfigSource<MyCustomConfigSource>("myCustomConfig");
 }
 ```
+
+## Roadmap
+
+These config sources are not implemented yet, but we plan to implement them in the future:
+
+- Consul / etcd
+- SSM Parameter Store / Vault / GCP/Azure équivalents
+- Kubernetes ConfigMap/Secret
+- HTTP/REST
+- Git (GitOps)
+
+::: warning Wants more?
+Ask us for a custom config source! We can create a custom config source for you, tailored to your needs.
+Contact us at contact-tsed@gmail.com or via [Slack](https://slack.tsed.io/).
+:::
path: docs/docs/configuration/configuration-sources.md
user: login: coderabbitai[bot]
body: _🧹 Nitpick (assertive)_

**Convert the contact email to a mailto link in the roadmap warning**

Similarly update the email in the final warning box:

```diff
- Contact us at contact-tsed@gmail.com or via [Slack](https://slack.tsed.io/).
+ Contact us at [contact-tsed@gmail.com](mailto:contact-tsed@gmail.com) or via [Slack](https://slack.tsed.io/).
```



<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

```suggestion
::: warning Wants more?
Ask us for a custom config source! We can create a custom config source for you, tailored to your needs.
Contact us at [contact-tsed@gmail.com](mailto:contact-tsed@gmail.com) or via [Slack](https://slack.tsed.io/).
:::
```

</details>

<!-- suggestion_end -->

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 markdownlint-cli2 (0.17.2)</summary>

448-448: Bare URL used
null

(MD034, no-bare-urls)

</details>

</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
In docs/docs/configuration/configuration-sources.md around lines 446 to 449, the
contact email in the warning message is plain text. Convert the email address
contact-tsed@gmail.com into a clickable mailto link by wrapping it with the
appropriate markdown syntax
[contact-tsed@gmail.com](mailto:contact-tsed@gmail.com). Also, locate the final
warning box in the file and update its email similarly to use a mailto link.
```

</details>

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-05-19T11:20:09Z
author_association: CONTRIBUTOR
diff_hunk: @@ -18,6 +18,20 @@
 | Json   | Yes        | `@tsed/config/json`   | Load configuration from a JSON file. Supports watch mode to reload the configuration when the file changes.                                                                     |
 | YAML   | Yes        | `@tsed/config/yaml`   | Load configuration from a YAML file. Supports watch mode to reload the configuration when the file changes.                                                                     |
 
+## Premium config sources
+
+| Type                                                 | Watch mode    | Import                  | Description                                                                                                                        |
+| ---------------------------------------------------- | ------------- | ----------------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
+| [IORedis](/plugins/premium/config-source/ioredis.md) | Yes           | `@tsed/config/ioredis`  | Load configuration from a Redis database using ioredis. Supports watch mode to reload the configuration when the database changes. |
+| [Mongo](/plugins/premium/config-source/mongo.md)     | Yes           | `@tsed/config/mongo`    | Load configuration from a MongoDB collection. Supports watch mode to reload the configuration when the collection changes.         |
+| [Vault](/plugins/premium/config-source/vault.md)     | Yes - pulling | `@tsed/config/vault`    | Load configuration from a HashiCorp Vault. Supports watch mode to reload the configuration when the vault changes.                 |
+| Postgres - WIP                                       | Yes - pulling | `@tsed/config/postgres` | Load configuration from a Postgres database. Supports watch mode to reload the configuration when the database changes.            |
path: docs/docs/configuration/configuration-sources.md
user: login: coderabbitai[bot]
body: _🛠️ Refactor suggestion_

**Correct "pulling" typo in watch mode description**

The table currently says "Yes - pulling" for Vault and Postgres; it should read "Yes - polling":

```diff
- | [Vault](/plugins/premium/config-source/vault.md)     | Yes - pulling | `@tsed/config/vault`    | ...
+ | [Vault](/plugins/premium/config-source/vault.md)     | Yes - polling | `@tsed/config/vault`    | ...
- | Postgres - WIP                                       | Yes - pulling | `@tsed/config/postgres` | ...
+ | Postgres - WIP                                       | Yes - polling | `@tsed/config/postgres` | ...
```



<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

```suggestion
| [Vault](/plugins/premium/config-source/vault.md)     | Yes - polling | `@tsed/config/vault`    | Load configuration from a HashiCorp Vault. Supports watch mode to reload the configuration when the vault changes.                 |
| Postgres - WIP                                       | Yes - polling | `@tsed/config/postgres` | Load configuration from a Postgres database. Supports watch mode to reload the configuration when the database changes.            |
```

</details>

<!-- suggestion_end -->

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
In docs/docs/configuration/configuration-sources.md around lines 27 to 28, the
word "pulling" in the table describing watch mode support for Vault and Postgres
should be corrected to "polling". Update both instances of "Yes - pulling" to
"Yes - polling" to accurately reflect the functionality.
```

</details>

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-05-19T11:20:09Z
author_association: CONTRIBUTOR
diff_hunk: @@ -18,6 +18,20 @@
 | Json   | Yes        | `@tsed/config/json`   | Load configuration from a JSON file. Supports watch mode to reload the configuration when the file changes.                                                                     |
 | YAML   | Yes        | `@tsed/config/yaml`   | Load configuration from a YAML file. Supports watch mode to reload the configuration when the file changes.                                                                     |
 
+## Premium config sources
+
+| Type                                                 | Watch mode    | Import                  | Description                                                                                                                        |
+| ---------------------------------------------------- | ------------- | ----------------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
+| [IORedis](/plugins/premium/config-source/ioredis.md) | Yes           | `@tsed/config/ioredis`  | Load configuration from a Redis database using ioredis. Supports watch mode to reload the configuration when the database changes. |
+| [Mongo](/plugins/premium/config-source/mongo.md)     | Yes           | `@tsed/config/mongo`    | Load configuration from a MongoDB collection. Supports watch mode to reload the configuration when the collection changes.         |
+| [Vault](/plugins/premium/config-source/vault.md)     | Yes - pulling | `@tsed/config/vault`    | Load configuration from a HashiCorp Vault. Supports watch mode to reload the configuration when the vault changes.                 |
+| Postgres - WIP                                       | Yes - pulling | `@tsed/config/postgres` | Load configuration from a Postgres database. Supports watch mode to reload the configuration when the database changes.            |
+
+::: warning Wants more?
+Ask us for a custom config source! We can create a custom config source for you, tailored to your needs.
+Contact us at contact-tsed@gmail.com or via [Slack](https://slack.tsed.io/).
+:::
path: docs/docs/configuration/configuration-sources.md
user: login: coderabbitai[bot]
body: _🧹 Nitpick (assertive)_

**Convert the contact email to a mailto link**

Make the email address clickable:

```diff
- Contact us at contact-tsed@gmail.com or via [Slack](https://slack.tsed.io/).
+ Contact us at [contact-tsed@gmail.com](mailto:contact-tsed@gmail.com) or via [Slack](https://slack.tsed.io/).
```



<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

```suggestion
::: warning Wants more?
Ask us for a custom config source! We can create a custom config source for you, tailored to your needs.
Contact us at [contact-tsed@gmail.com](mailto:contact-tsed@gmail.com) or via [Slack](https://slack.tsed.io/).
:::
```

</details>

<!-- suggestion_end -->

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 markdownlint-cli2 (0.17.2)</summary>

32-32: Bare URL used
null

(MD034, no-bare-urls)

</details>

</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
In docs/docs/configuration/configuration-sources.md around lines 30 to 33, the
contact email address is plain text and should be converted into a clickable
mailto link. Replace the plain email text with a markdown mailto link format so
users can click the email address to open their email client directly.
```

</details>

<!-- This is an auto-generated comment by CodeRabbit -->

✅ Addressed in commit 5bd865c
created_at: 2025-05-19T11:20:09Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,145 @@
+---
+head:
+  - - meta
+    - name: description
+      content: A powerful plugin for Ts.ED to manage your application configuration in MongoDB and sync changes in real time.
+  - - meta
+    - name: keywords
+      content: Ts.ED plugins premium mongo config-source watch-mode hot-reload
+---
+
+# Mongo Config Source
+
+<Banner src="https://webimages.mongodb.com/_com_assets/cms/kuyjf3vea2hg34taa-horizontal_default_slate_blue.svg?auto=format%252Ccompress" height="200" href="https://www.mongodb.com/"></Banner>
+
+A powerful plugin for [Ts.ED](https://tsed.dev/) to manage your application configuration in MongoDB and sync changes in
+real time.
+
+For more details on the @@ConfigSource@@ feature go to [Configuration Source documentation page](/docs/configuration/configuration-sources.md).
+
+## ✨ Features
+
+- ⚙️ **Configure your MongoDB connection** via the @@Configuration@@ decorator.
+- 👀 **Watch MongoDB collection changes** and auto-update your app config in real time (leveraging MongoDB Change
+  Streams).
+- 🔄 **Sync configuration values**: Use MongoDB as a dynamic source of truth for your app settings.
+- 🛠️ **Flexible options**: Supports all MongoDB client options, custom collections, and validation schemas.
+
+For more details on the @@ConfigSource@@ feature go to [Configuration Source documentation page](/docs/configuration/configuration-sources.md).
path: docs/plugins/premium/config-source/mongo.md
user: login: coderabbitai[bot]
body: _🧹 Nitpick (assertive)_

**Reduce duplication of link.**

The link to the configuration-sources page appears twice (lines 18 and 28). Consider removing one instance to avoid redundancy.

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 LanguageTool</summary>

[uncategorized] ~18-~18: Possible missing comma found.
Context: ...or more details on the @@ConfigSource@@ feature go to [Configuration Source documentati...

(AI_HYDRA_LEO_MISSING_COMMA)

---

[uncategorized] ~28-~28: Possible missing comma found.
Context: ...or more details on the @@ConfigSource@@ feature go to [Configuration Source documentati...

(AI_HYDRA_LEO_MISSING_COMMA)

</details>

</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
In docs/plugins/premium/config-source/mongo.md around lines 18 to 28, the link
to the configuration-sources documentation page is duplicated at the beginning
and end of the section. Remove one of these instances to eliminate redundancy
and keep the content concise.
```

</details>

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-05-19T11:20:09Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,145 @@
+---
+head:
+  - - meta
+    - name: description
+      content: A powerful plugin for Ts.ED to manage your application configuration in MongoDB and sync changes in real time.
+  - - meta
+    - name: keywords
+      content: Ts.ED plugins premium mongo config-source watch-mode hot-reload
+---
+
+# Mongo Config Source
+
+<Banner src="https://webimages.mongodb.com/_com_assets/cms/kuyjf3vea2hg34taa-horizontal_default_slate_blue.svg?auto=format%252Ccompress" height="200" href="https://www.mongodb.com/"></Banner>
+
+A powerful plugin for [Ts.ED](https://tsed.dev/) to manage your application configuration in MongoDB and sync changes in
+real time.
+
+For more details on the @@ConfigSource@@ feature go to [Configuration Source documentation page](/docs/configuration/configuration-sources.md).
path: docs/plugins/premium/config-source/mongo.md
user: login: coderabbitai[bot]
body: _🧹 Nitpick (assertive)_

**Add missing comma after introductory clause.**

The sentence should read:  
“For more details on the @@ConfigSource@@ feature, go to …”  
Add a comma after “feature” to improve readability.

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 LanguageTool</summary>

[uncategorized] ~18-~18: Possible missing comma found.
Context: ...or more details on the @@ConfigSource@@ feature go to [Configuration Source documentati...

(AI_HYDRA_LEO_MISSING_COMMA)

</details>

</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
In docs/plugins/premium/config-source/mongo.md at line 18, add a comma after the
word "feature" in the sentence "For more details on the @@ConfigSource@@ feature
go to ...". This comma should be placed immediately after "feature" to separate
the introductory clause and improve readability.
```

</details>

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-05-19T11:20:10Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,145 @@
+---
+head:
+  - - meta
+    - name: description
+      content: A powerful plugin for Ts.ED to manage your application configuration in MongoDB and sync changes in real time.
+  - - meta
+    - name: keywords
+      content: Ts.ED plugins premium mongo config-source watch-mode hot-reload
+---
+
+# Mongo Config Source
+
+<Banner src="https://webimages.mongodb.com/_com_assets/cms/kuyjf3vea2hg34taa-horizontal_default_slate_blue.svg?auto=format%252Ccompress" height="200" href="https://www.mongodb.com/"></Banner>
+
+A powerful plugin for [Ts.ED](https://tsed.dev/) to manage your application configuration in MongoDB and sync changes in
+real time.
+
+For more details on the @@ConfigSource@@ feature go to [Configuration Source documentation page](/docs/configuration/configuration-sources.md).
+
+## ✨ Features
+
+- ⚙️ **Configure your MongoDB connection** via the @@Configuration@@ decorator.
+- 👀 **Watch MongoDB collection changes** and auto-update your app config in real time (leveraging MongoDB Change
+  Streams).
+- 🔄 **Sync configuration values**: Use MongoDB as a dynamic source of truth for your app settings.
+- 🛠️ **Flexible options**: Supports all MongoDB client options, custom collections, and validation schemas.
+
+For more details on the @@ConfigSource@@ feature go to [Configuration Source documentation page](/docs/configuration/configuration-sources.md).
path: docs/plugins/premium/config-source/mongo.md
user: login: coderabbitai[bot]
body: _🧹 Nitpick (assertive)_

**Add missing comma in repeated link sentence.**

Similarly, insert a comma after “feature”:  
“For more details on the @@ConfigSource@@ feature, go to …”

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 LanguageTool</summary>

[uncategorized] ~28-~28: Possible missing comma found.
Context: ...or more details on the @@ConfigSource@@ feature go to [Configuration Source documentati...

(AI_HYDRA_LEO_MISSING_COMMA)

</details>

</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
In docs/plugins/premium/config-source/mongo.md at line 28, add a comma after the
word "feature" in the sentence "For more details on the @@ConfigSource@@ feature
go to ...". This fixes the missing comma issue by changing it to "For more
details on the @@ConfigSource@@ feature, go to ...".
```

</details>

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-05-19T11:20:10Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,139 @@
+---
+head:
+  - - meta
+    - name: description
+      content: A powerful plugin for Ts.ED to manage your application configuration in Redis and sync changes in real time.
+  - - meta
+    - name: keywords
+      content: Ts.ED plugins premium ioredis config-source redis watch-mode hot-reload
+---
+
+# IORedis Config Source
+
+<Banner src="/ioredis.svg" height="200" href="https://github.com/luin/ioredis"></Banner>
+
+A powerful plugin for [Ts.ED](https://tsed.dev/) to manage your application configuration in Redis and sync changes in
+real time.
+
+## ✨ Features
+
+- ⚙️ **Configure one or more Redis connections** using the @@Configuration@@ decorator.
+- 👀 **Watch Redis keys** and automatically notify your application of any changes.
+- 🔄 **Sync configuration values** between your app and Redis, using Redis as a dynamic source of truth.
+- 🛠️ **Flexible options:** Supports standard Redis, Redis Cluster, and custom key prefixing.
+- 🔒 **Validation schema:** Add a validation schema to ensure your configs are always valid.
+
+For more details on the @@ConfigSource@@ feature go to [Configuration Source documentation page](/docs/configuration/configuration-sources.md).
path: docs/plugins/premium/config-source/ioredis.md
user: login: coderabbitai[bot]
body: _🧹 Nitpick (assertive)_

**Add missing comma after introductory clause.**

Insert a comma after “feature” for consistency:  
“For more details on the @@ConfigSource@@ feature, go to …”

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
In docs/plugins/premium/config-source/ioredis.md at line 26, add a comma after
the word "feature" in the sentence starting with "For more details on the
@@ConfigSource@@ feature" to correctly separate the introductory clause from the
main clause.
```

</details>

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-05-19T11:20:10Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,139 @@
+---
+head:
+  - - meta
+    - name: description
+      content: A powerful plugin for Ts.ED to manage your application configuration in Redis and sync changes in real time.
+  - - meta
+    - name: keywords
+      content: Ts.ED plugins premium ioredis config-source redis watch-mode hot-reload
+---
+
+# IORedis Config Source
+
+<Banner src="/ioredis.svg" height="200" href="https://github.com/luin/ioredis"></Banner>
+
+A powerful plugin for [Ts.ED](https://tsed.dev/) to manage your application configuration in Redis and sync changes in
+real time.
+
+## ✨ Features
+
+- ⚙️ **Configure one or more Redis connections** using the @@Configuration@@ decorator.
+- 👀 **Watch Redis keys** and automatically notify your application of any changes.
+- 🔄 **Sync configuration values** between your app and Redis, using Redis as a dynamic source of truth.
+- 🛠️ **Flexible options:** Supports standard Redis, Redis Cluster, and custom key prefixing.
+- 🔒 **Validation schema:** Add a validation schema to ensure your configs are always valid.
+
+For more details on the @@ConfigSource@@ feature go to [Configuration Source documentation page](/docs/configuration/configuration-sources.md).
+
+## 📦 Installation
+
+Install the package and its peer dependencies:
+
+::: code-group
+
+```sh [npm]
+npm install --save @tsedio/config-ioredis
+npm install --save @tsed/config @tsed/ioredis ioredis
+```
+
+```sh [yarn]
+yarn add @tsedio/config-ioredis
+yarn add @tsed/config @tsed/ioredis ioredis
+```
+
+```sh [pnpm]
+pnpm add @tsedio/config-ioredis
+pnpm add @tsed/config @tsed/ioredis ioredis
+```
+
+```sh [bun]
+bun add @tsedio/config-ioredis
+bun add @tsed/config @tsed/ioredis ioredis
+```
+
+:::
+
+::: tip
+See our documentation page for instructions on [installing premium plugins](/plugins/premium/install-premium-plugins.md).
+:::
+
+## ⚙️ Configuration Example
+
+Configure the Redis source in your Ts.ED application:
+
+```typescript
+import {withOptions} from "@tsed/config";
+import {IORedisConfigSource} from "@tsed/ioredis-config";
+import {Configuration, Constant} from "@tsed/di";
path: docs/plugins/premium/config-source/ioredis.md
user: login: coderabbitai[bot]
body: _⚠️ Potential issue_

**Fix plugin import path.**

The import should reference the premium plugin package as installed (`@tsedio/config-ioredis`), not `@tsed/ioredis-config`.  

Apply this diff:
```diff
-import {IORedisConfigSource} from "@tsed/ioredis-config";
+import {IORedisConfigSource} from "@tsedio/config-ioredis";
```


<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

```suggestion
import {withOptions} from "@tsed/config";
import {IORedisConfigSource} from "@tsedio/config-ioredis";
import {Configuration, Constant} from "@tsed/di";
```

</details>

<!-- suggestion_end -->

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
In docs/plugins/premium/config-source/ioredis.md around lines 65 to 67, the
import path for the IORedisConfigSource plugin is incorrect. Change the import
from "@tsed/ioredis-config" to "@tsedio/config-ioredis" to correctly reference
the premium plugin package as installed.
```

</details>

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-05-19T11:20:10Z
author_association: CONTRIBUTOR
diff_hunk: @@ -183,6 +183,9 @@ frameworks:
   - title: Pulse
     href: /tutorials/pulse.html
     src: /pulse.png
+  - title: Vault
+    href: /plugins/premium/config-source/vault.html
+    src: /vault.png
path: docs/index.md
user: login: coderabbitai[bot]
body: _💡 Verification agent_

<details>
<summary>🧩 Analysis chain</summary>

**New "Vault" framework entry**: Added a premium plugin link under the frameworks section. Verify that `/vault.png` exists in the assets and that the target page `/plugins/premium/config-source/vault.html` is generated and accessible.  


---

🏁 Script executed:

```shell
ls docs/public/vault.png
grep -R "vault.html" -n docs
```

Length of output: 147

---



</details>

**Missing Vault plugin page**  
- ✅ Asset `docs/public/vault.png` exists.  
- ❌ No generated page at `docs/plugins/premium/config-source/vault.html` (only a reference in `docs/index.md`).  

Please add or generate the `vault.html` page under `docs/plugins/premium/config-source/` so that the link is valid. You can verify with:  
```shell
ls docs/plugins/premium/config-source/vault.html
```

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
In docs/index.md around lines 186 to 188, the link to the Vault plugin page
points to /plugins/premium/config-source/vault.html, but this page does not
exist. To fix this, create or generate the vault.html page under
docs/plugins/premium/config-source/ so that the link is valid and accessible.
Verify the page creation by checking the file presence with ls
docs/plugins/premium/config-source/vault.html.
```

</details>

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-05-19T12:38:22Z
author_association: CONTRIBUTOR
diff_hunk: @@ -502,9 +535,42 @@ export default defineConfig({
           text: "Marketplace",
           link: "/plugins/index"
         },
+        {
+          text: "Install premium plugins",
+          link: "/plugins/premium/install-premium-plugins"
+        },
         {
           text: "Create your own plugins",
           link: "/plugins/create-your-own-plugins"
+        },
+        {
+          text: "Premium plugins",
+          items: [
+            {
+              text: "IORedis ConfigSource",
+              link: "/plugins/premium/config-source/ioredis"
+            },
+            {
+              text: "Mongo ConfigSource",
+              link: "/plugins/premium/config-source/mongo"
+            },
+            {
+              text: "Vault ConfigSource",
+              link: "/plugins/premium/config-source/vault"
+            },
+            {
+              text: "Redis Testcontainers",
+              link: "/plugins/premium/testcontainers/redis"
+            },
+            {
+              text: "Mongo Testcontainers",
+              link: "/plugins/premium/testcontainers/mongo"
+            },
+            {
+              text: "Vault Testcontainers",
+              link: "/plugins/premium/testcontainers/vault"
+            }
+          ]
         }
path: docs/.vitepress/config.mts
user: login: coderabbitai[bot]
body: _🧹 Nitpick (assertive)_

**Add "Premium plugins" submenu to sidebar**: Matches the nav configuration perfectly. Again, consider deduplicating these entries by defining them in a shared data structure or helper function to keep nav and sidebar in sync.

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
In docs/.vitepress/config.mts around lines 547 to 574, the "Premium plugins"
submenu entries are duplicated between the nav and sidebar configurations. To
fix this, extract the list of premium plugin items into a shared data structure
or helper function, then reference this shared source in both nav and sidebar
configurations to keep them in sync and avoid duplication.
```

</details>

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-05-19T12:38:23Z
author_association: CONTRIBUTOR
diff_hunk: @@ -308,9 +308,42 @@
             text: "Marketplace",
             link: "/plugins/index"
           },
+          {
+            text: "Install premium plugins",
+            link: "/plugins/premium/install-premium-plugins"
+          },
           {
             text: "Create your own plugins",
             link: "/plugins/create-your-own-plugins"
+          },
+          {
+            text: "Premium plugins",
+            items: [
+              {
+                text: "IORedis ConfigSource",
+                link: "/plugins/premium/config-source/ioredis"
+              },
+              {
+                text: "Mongo ConfigSource",
+                link: "/plugins/premium/config-source/mongo"
+              },
+              {
+                text: "Vault ConfigSource",
+                link: "/plugins/premium/config-source/vault"
+              },
+              {
+                text: "Redis Testcontainers",
+                link: "/plugins/premium/testcontainers/redis"
+              },
+              {
+                text: "Mongo Testcontainers",
+                link: "/plugins/premium/testcontainers/mongo"
+              },
+              {
+                text: "Vault Testcontainers",
+                link: "/plugins/premium/testcontainers/vault"
+              }
+            ]
path: docs/.vitepress/config.mts
user: login: coderabbitai[bot]
body: _🧹 Nitpick (assertive)_

**Introduce "Premium plugins" submenu in nav**: The nested list groups premium plugin docs logically. To reduce duplication and ease maintenance, consider extracting this list into a shared constant used by both nav and sidebar.

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
In docs/.vitepress/config.mts around lines 318 to 346, the "Premium plugins"
submenu is defined inline in the nav configuration, causing duplication and
harder maintenance. Extract the array of premium plugin items into a shared
constant variable outside the nav and sidebar configurations, then reference
this constant in both places to ensure consistency and reduce duplication.
```

</details>

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-05-19T12:38:23Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,141 @@
+# Vault TestContainers
+
+A [Ts.ED](https://tsed.dev/) package to help you easily test your code using the power
+of [TestContainers](https://node.testcontainers.org/) with HashiCorp Vault.
+
+> **Note:** This package does **not** depend on `@tsed/platform-http` and can be used with any test framework.
+
+## ✨ Features
+
+- 🚀 Easily spin up a Vault server in a Docker container for your tests
+- 🛑 Automatically stop the Vault server after your tests
+- 🔄 Reset the Vault server state between tests
+- 🔐 Pre-configured with dev mode and root token for easy testing
+
+## 📦 Installation
+
+Install the package with your favorite package manager:
+
+::: code-group
+
+```sh [npm]
+npm install --save-dev @tsedio/testcontainers-vault
+```
+
+```sh [yarn]
+yarn add --dev @tsedio/testcontainers-vault
+```
+
+```sh [pnpm]
+pnpm add --dev @tsedio/testcontainers-vault
+```
+
+```sh [bun]
+bun add --dev @tsedio/testcontainers-vault
+```
+
+:::
+
+::: tip
+See our documentation page for instructions on [installing premium plugins](/plugins/premium/install-premium-plugins.md).
+:::
+
+## ⚙️ Configuration
+
+Set up a global test lifecycle to manage your Vault container.
+
+### 🧪 Vitest
+
+Add a global setup in your `vitest.config.ts`:
+
+```ts
+import {defineConfig} from "vitest/config";
+
+export default defineConfig({
+  test: {
+    globalSetup: [import.meta.resolve("@tsed/testcontainers-vault/vitest/setup")]
+  }
+});
+```
+
+### 🧪 Jest
+
+Add `globalSetup` and `globalTeardown` to your Jest config:
+
+```ts
+// jest.config.js
+module.exports = {
+  globalSetup: ["jest.setup.js"],
+  globalTeardown: ["jest.teardown.js"]
+};
+```
+
+Create the following files:
+
+```ts
+// jest.setup.js
+import {TestContainersVault} from "@tsedio/testcontainers-vault";
+
+module.exports = async () => {
+  await TestContainersVault.startContainer();
+};
+
+// jest.teardown.js
+import {TestContainersVault} from "@tsedio/testcontainers-vault";
+
+module.exports = async () => {
+  await TestContainersVault.stopContainer();
+};
+```
+
+## 🛠️ Usage
+
+Set up a Vault connection in your project like this:
+
+```ts
+import {withOptions} from "@tsed/config";
+import {DITest} from "@tsed/di";
+import {VaultConfigSource} from "@tsedio/config-vault";
+import {TestContainersVault} from "@tsedio/testcontainers-vault";
path: docs/plugins/premium/testcontainers/vault.md
user: login: coderabbitai[bot]
body: _🛠️ Refactor suggestion_

**Correct imports for example**  
Remove the undefined `DITest` import and add the required imports for `PlatformTest`, the `inject` helper, and the `CONFIG_SOURCES` token so that the snippet compiles as shown below.  

```diff
-import {DITest} from "@tsed/di";
+import {PlatformTest, inject} from "@tsed/platform-http/testing";
+import {CONFIG_SOURCES} from "@tsed/config";
```


<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

```suggestion
import {withOptions} from "@tsed/config";
import {PlatformTest, inject} from "@tsed/platform-http/testing";
import {CONFIG_SOURCES} from "@tsed/config";
import {VaultConfigSource} from "@tsedio/config-vault";
import {TestContainersVault} from "@tsedio/testcontainers-vault";
```

</details>

<!-- suggestion_end -->

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
In docs/plugins/premium/testcontainers/vault.md around lines 96 to 99, the
import statements include an undefined `DITest` import and are missing necessary
imports for `PlatformTest`, the `inject` helper, and the `CONFIG_SOURCES` token.
Remove the `DITest` import and add imports for `PlatformTest` from
"@tsed/common", `inject` from "@tsed/testing", and `CONFIG_SOURCES` from
"@tsed/config" to ensure the example snippet compiles correctly.
```

</details>

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-05-19T12:38:23Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,157 @@
+---
+head:
+  - - meta
+    - name: description
+      content: A robust Ts.ED plugin for dynamic application configuration stored securely in HashiCorp Vault. Keep your secrets and config synchronized with your app in real time!
+  - - meta
+    - name: keywords
+      content: Ts.ED plugins premium vault hashicorp config-source
+---
+
+# Vault Config Source
+
+<Banner src="/vault.png" height="200" href="https://www.vaultproject.io/"></Banner>
+
+A robust [Ts.ED](https://tsed.dev/) plugin for dynamic application configuration stored securely
+in [HashiCorp Vault](https://www.vaultproject.io/).  
+Keep your secrets and config synchronized with your app in real time!
+
+## ✨ Features
+
+- ⚙️ **Configure HashiCorp Vault** connection easily with the `@Configuration` decorator.
+- 🔄 **Poll Vault for changes**: Regularly check Vault for updated secrets and notify your application automatically.
+- ✏️ **Sync and update**: Use Vault as a dynamic source of truth for app configuration, and update values
+  programmatically.
+- 🔒 **Supports both KV v1 and v2**: Compatible with both secret engine versions.
+
+For more details on the @@ConfigSource@@ feature, go to [Configuration Source documentation page](/docs/configuration/configuration-sources.md).
+
+## 📦 Installation
+
+Install the package and its dependencies:
+
+::: code-group
+
+```sh [npm]
+npm install --save @tsedio/config-vault
+npm install --save @tsed/config node-vault
+```
+
+```sh [yarn]
+yarn add @tsedio/config-vault
+yarn add @tsed/config node-vault
+```
+
+```sh [pnpm]
+pnpm add @tsedio/config-vault
+pnpm add @tsed/config node-vault
+```
+
+```sh [bun]
+bun add @tsedio/config-vault
+bun add @tsed/config node-vault
+```
+
+:::
+
+::: tip
+See our documentation page for instructions on [installing premium plugins](/plugins/premium/install-premium-plugins.md).
+:::
+
+## ⚙️ Configuration Example
+
+Set up your Vault config source in your Ts.ED app:
+
+```typescript
+import {withOptions} from "@tsed/config";
+import {VaultConfigSource} from "@tsedio/config-vault";
+import {Configuration, Constant} from "@tsed/di";
path: docs/plugins/premium/config-source/vault.md
user: login: coderabbitai[bot]
body: _🧹 Nitpick (assertive)_

**Add missing space before `from` in imports**  
For consistent formatting and readability, insert a space before `from` in these import statements.  

```diff
-import {withOptions}from "@tsed/config";
+import {withOptions} from "@tsed/config";
-import {VaultConfigSource}from "@tsedio/config-vault";
+import {VaultConfigSource} from "@tsedio/config-vault";
```


> Committable suggestion skipped: line range outside the PR's diff.

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
In docs/plugins/premium/config-source/vault.md around lines 66 to 68, the import
statements lack a space before the keyword 'from'. To fix this, add a space
before 'from' in each import statement to ensure consistent formatting and
improve readability.
```

</details>

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-05-19T12:38:23Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,157 @@
+---
+head:
+  - - meta
+    - name: description
+      content: A robust Ts.ED plugin for dynamic application configuration stored securely in HashiCorp Vault. Keep your secrets and config synchronized with your app in real time!
+  - - meta
+    - name: keywords
+      content: Ts.ED plugins premium vault hashicorp config-source
+---
+
+# Vault Config Source
+
+<Banner src="/vault.png" height="200" href="https://www.vaultproject.io/"></Banner>
+
+A robust [Ts.ED](https://tsed.dev/) plugin for dynamic application configuration stored securely
+in [HashiCorp Vault](https://www.vaultproject.io/).  
+Keep your secrets and config synchronized with your app in real time!
+
+## ✨ Features
+
+- ⚙️ **Configure HashiCorp Vault** connection easily with the `@Configuration` decorator.
+- 🔄 **Poll Vault for changes**: Regularly check Vault for updated secrets and notify your application automatically.
+- ✏️ **Sync and update**: Use Vault as a dynamic source of truth for app configuration, and update values
+  programmatically.
+- 🔒 **Supports both KV v1 and v2**: Compatible with both secret engine versions.
+
+For more details on the @@ConfigSource@@ feature, go to [Configuration Source documentation page](/docs/configuration/configuration-sources.md).
+
+## 📦 Installation
+
+Install the package and its dependencies:
+
+::: code-group
+
+```sh [npm]
+npm install --save @tsedio/config-vault
+npm install --save @tsed/config node-vault
+```
+
+```sh [yarn]
+yarn add @tsedio/config-vault
+yarn add @tsed/config node-vault
+```
+
+```sh [pnpm]
+pnpm add @tsedio/config-vault
+pnpm add @tsed/config node-vault
+```
+
+```sh [bun]
+bun add @tsedio/config-vault
+bun add @tsed/config node-vault
+```
+
+:::
+
+::: tip
+See our documentation page for instructions on [installing premium plugins](/plugins/premium/install-premium-plugins.md).
+:::
+
+## ⚙️ Configuration Example
+
+Set up your Vault config source in your Ts.ED app:
+
+```typescript
+import {withOptions} from "@tsed/config";
+import {VaultConfigSource} from "@tsedio/config-vault";
+import {Configuration, Constant} from "@tsed/di";
+
+@Configuration({
+  extends: [
+    withOptions(VaultConfigSource, {
+      name: "vault",
+      endpoint: "http://localhost:8200", // Vault server URL
+      token: "your-vault-token", // Your Vault token
+      secretPath: "secret/data/myapp", // Path to your secret (KV v2 or v1, see below)
+      refreshInterval: 10000, // ⏱️ Polling interval in ms (default: 10s)
+      clientOptions: {
+        // Additional node-vault options
+      }
+      // validationSchema: object({})              // Optional: add a validation schema
+    })
+  ]
path: docs/plugins/premium/config-source/vault.md
user: login: coderabbitai[bot]
body: _🛠️ Refactor suggestion_

**Add missing comma after `clientOptions` block**  
The `clientOptions` object literal must be followed by a comma to maintain valid TypeScript syntax in the example.  

```diff
-      clientOptions: {
-        // Additional node-vault options
-      }
+      clientOptions: {
+        // Additional node-vault options
+      },
```


<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

```suggestion
      clientOptions: {
        // Additional node-vault options
      },
      // validationSchema: object({})              // Optional: add a validation schema
    })
  ]
```

</details>

<!-- suggestion_end -->

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
In docs/plugins/premium/config-source/vault.md around lines 80 to 83, the
example code is missing a comma after the clientOptions object literal. Add a
comma immediately after the closing brace of clientOptions to ensure valid
TypeScript syntax and proper separation of object properties.
```

</details>

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-05-19T12:38:23Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,148 @@
+# Redis TestContainers
+
+A [Ts.ED](https://tsed.dev/) package to help you easily test your code using the power
+of [TestContainers](https://node.testcontainers.org/) with Redis.
+
+> **Note:** This package does **not** depend on `@tsed/platform-http` and can be used with any test framework.
+
+## ✨ Features
+
+- 🚀 Easily spin up a Redis server in a Docker container for your tests
+- 🛑 Automatically stop the Redis server after your tests
+- 🔄 Reset the Redis server state between tests (by restarting the container)
+- 🏷️ Namespacing support to avoid collisions between different test suites
+
+## 📦 Installation
+
+Install the package with your favorite package manager:
+
+::: code-group
+
+```sh [npm]
+npm install --save-dev @tsedio/testcontainers-redis
+```
+
+```sh [yarn]
+yarn add --dev @tsedio/testcontainers-redis
+```
+
+```sh [pnpm]
+pnpm add --dev @tsedio/testcontainers-redis
+```
+
+```sh [bun]
+bun add --dev @tsedio/testcontainers-redis
+```
+
+:::
+
+::: tip
+See our documentation page for instructions on [installing premium plugins](/plugins/premium/install-premium-plugins.md).
+:::
+
+## ⚙️ Configuration
+
+Set up a global test lifecycle to manage your Redis container.
+
+### 🧪 Vitest
+
+Add a global setup in your `vitest.config.ts`:
+
+```ts
+import {defineConfig} from "vitest/config";
+
+export default defineConfig({
+  test: {
+    globalSetup: [import.meta.resolve("@tsed/testcontainers-redis/vitest/setup")]
+  }
+});
+```
+
+### 🧪 Jest
+
+Add `globalSetup` and `globalTeardown` to your Jest config:
+
+```ts
+// jest.config.js
+module.exports = {
+  globalSetup: ["jest.setup.js"],
+  globalTeardown: ["jest.teardown.js"]
+};
+```
+
+Create the following files:
+
+```ts
+// jest.setup.js
+import {TestContainersRedis} from "@tsedio/testcontainers-redis";
+
+module.exports = async () => {
+  await TestContainersRedis.startContainer();
+};
+
+// jest.teardown.js
+import {TestContainersRedis} from "@tsedio/testcontainers-redis";
+
+module.exports = async () => {
+  await TestContainersRedis.stopContainer();
+};
+```
+
+## 🛠️ Usage
+
+Set up a Redis connection in your project like this:
+
+```ts
+import {registerConnectionProvider} from "@tsed/ioredis";
+import {type Redis} from "ioredis";
+
+export const REDIS_CONNECTION = Symbol.for("REDIS_CONNECTION");
+export type REDIS_CONNECTION = typeof Redis;
+
+registerConnectionProvider({
+  token: REDIS_CONNECTION,
+  name: "default"
+});
+```
+
+Start the Redis server before your tests using `TestContainersRedis`:
+
+```ts
+import {PlatformTest} from "@tsed/platform-http/testing";
+import {TestContainersRedis} from "@tsedio/testcontainers-redis";
+
path: docs/plugins/premium/testcontainers/redis.md
user: login: coderabbitai[bot]
body: _🛠️ Refactor suggestion_

**Import `inject` for DI usage**  
The integration test example calls `inject(REDIS_CONNECTION)` but does not import it. Merge into the PlatformTest import so the snippet compiles:  

```diff
-import {PlatformTest} from "@tsed/platform-http/testing";
+import {PlatformTest, inject} from "@tsed/platform-http/testing";
```


<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

```suggestion
import {PlatformTest, inject} from "@tsed/platform-http/testing";
import {TestContainersRedis} from "@tsedio/testcontainers-redis";
```

</details>

<!-- suggestion_end -->

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
In docs/plugins/premium/testcontainers/redis.md around lines 109 to 113, the
code snippet uses inject(REDIS_CONNECTION) but does not import inject. Update
the import statement from "@tsed/platform-http/testing" to also include inject,
so the snippet compiles correctly and supports dependency injection usage.
```

</details>

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-05-19T12:38:23Z
author_association: CONTRIBUTOR

PR comments:
user: login: coderabbitai[bot]
created_at: 2025-05-19T11:15:13Z
body: <!-- This is an auto-generated comment: summarize by coderabbit.ai -->
<!-- This is an auto-generated comment: failure by coderabbit.ai -->

> [!CAUTION]
> ## Review failed
> 
> The pull request is closed.

<!-- end of auto-generated comment: failure by coderabbit.ai -->
<!-- walkthrough_start -->

## Walkthrough

The documentation has been expanded to include detailed guides for several new premium plugins, including configuration sources for Redis, MongoDB, and Vault, as well as TestContainers integrations for MongoDB, Redis, and Vault. Navigation and sidebar menus were updated to reflect these additions. Instructions for installing premium plugins and a roadmap for future configuration sources were also introduced. Minor updates include a new homepage framework entry and a content addition to the warehouse index.

## Changes

| File(s)                                                                                          | Change Summary |
|-------------------------------------------------------------------------------------------------|----------------|
| docs/plugins/premium/config-source/ioredis.md<br>docs/plugins/premium/config-source/mongo.md<br>docs/plugins/premium/config-source/vault.md | Added new documentation files for premium configuration source plugins: IORedis, MongoDB, and Vault. Each file details features, installation, configuration, usage, and tips. |
| docs/plugins/premium/testcontainers/mongo.md<br>docs/plugins/premium/testcontainers/redis.md<br>docs/plugins/premium/testcontainers/vault.md | Added new documentation files for TestContainers integrations with MongoDB, Redis, and Vault, including installation, setup for test frameworks, usage, and tips. |
| docs/plugins/premium/install-premium-plugins.md                                                  | Added a new document with instructions for installing premium/private plugins, including authentication setup and troubleshooting. |
| docs/.vitepress/config.mts                                                                       | Navigation and sidebar updated to include new premium plugin entries and installation guide. |
| docs/docs/configuration/configuration-sources.md                                                | Expanded documentation with a new section on premium config sources, a roadmap for planned sources, and contact info for custom requests. |
| docs/index.md                                                                                    | Added a new "Vault" entry to the frameworks section on the homepage. |
| docs/package.json                                                                                | Updated "@tsed/vitepress-theme" dependency from version 1.5.5 to 1.5.6. |
| docs/warehouse/index.md                                                                          | Changed Warehouse component from self-closing to enclosing descriptive text content. |

## Sequence Diagram(s)

```mermaid
sequenceDiagram
    participant User
    participant DocsSite
    participant GitHub
    participant TsED Premium Plugins

    User->>DocsSite: Browse documentation
    DocsSite->>User: Show navigation/sidebar with premium plugins
    User->>DocsSite: Open "Install premium plugins" guide
    DocsSite->>User: Display installation steps with GitHub PAT instructions
    User->>GitHub: Create Personal Access Token (PAT)
    User->>DocsSite: Configure package manager with PAT
    User->>TsED Premium Plugins: Install premium plugin via npm registry
    TsED Premium Plugins->>User: Plugin installed and ready to use
```

```mermaid
sequenceDiagram
    participant User
    participant DocsSite

    User->>DocsSite: View configuration sources documentation
    DocsSite->>User: Show standard and premium config sources
    User->>DocsSite: Navigate to premium config source (e.g., Redis, Mongo, Vault)
    DocsSite->>User: Display detailed usage, installation, and tips for selected plugin
```

```mermaid
sequenceDiagram
    participant User
    participant DocsSite

    User->>DocsSite: View testcontainers documentation (Mongo, Redis, Vault)
    DocsSite->>User: Show setup, integration, and usage examples for each plugin
```

<!-- walkthrough_end -->
<!-- internal state start -->


<!-- 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 -->

<!-- internal state end -->
<!-- announcements_start -->

> [!NOTE]
> <details>
> <summary>⚡️ AI Code Reviews for VS Code, Cursor, Windsurf</summary>
> 
> CodeRabbit now has a plugin for VS Code, Cursor and Windsurf. This brings AI code reviews directly in the code editor. Each commit is reviewed immediately, finding bugs before the PR is raised. Seamless context handoff to your AI code agent ensures that you can easily incorporate review feedback.
> Learn more [here](http://coderabbit.ai/ide).
> 
> </details>

---

> [!NOTE]
> <details>
> <summary>⚡️ Faster reviews with caching</summary>
> 
> CodeRabbit now supports caching for code and dependencies, helping speed up reviews. This means quicker feedback, reduced wait times, and a smoother review experience overall. Cached data is encrypted and stored securely. This feature will be automatically enabled for all accounts on May 16th. To opt out, configure `Review - Disable Cache` at either the organization or repository level. If you prefer to disable all data retention across your organization, simply turn off the `Data Retention` setting under your Organization Settings.
> Enjoy the performance boost—your workflow just got faster.
> 
> </details>

<!-- announcements_end -->

---

<details>
<summary>📜 Recent review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: ASSERTIVE**
**Plan: Pro**
**Cache: Disabled due to data retention organization setting**
**Knowledge Base: Disabled due to data retention organization setting**


<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 5bd865c25fae4fd0ecbc3b0bf36f112407f4793b and 4fcf49aa14052b076aedd2403c5cf380d536e61c.

</details>

<details>
<summary>⛔ Files ignored due to path filters (2)</summary>

* `docs/public/vault.png` is excluded by `!**/*.png`
* `docs/yarn.lock` is excluded by `!**/yarn.lock`, `!**/*.lock`

</details>

<details>
<summary>📒 Files selected for processing (12)</summary>

* `docs/.vitepress/config.mts` (2 hunks)
* `docs/docs/configuration/configuration-sources.md` (3 hunks)
* `docs/index.md` (1 hunks)
* `docs/package.json` (1 hunks)
* `docs/plugins/premium/config-source/ioredis.md` (1 hunks)
* `docs/plugins/premium/config-source/mongo.md` (1 hunks)
* `docs/plugins/premium/config-source/vault.md` (1 hunks)
* `docs/plugins/premium/install-premium-plugins.md` (1 hunks)
* `docs/plugins/premium/testcontainers/mongo.md` (1 hunks)
* `docs/plugins/premium/testcontainers/redis.md` (1 hunks)
* `docs/plugins/premium/testcontainers/vault.md` (1 hunks)
* `docs/warehouse/index.md` (1 hunks)

</details>

</details>
<!-- finishing_touch_checkbox_start -->

<details open="true">
<summary>✨ Finishing Touches</summary>

- [ ] <!-- {"checkboxId": "7962f53c-55bc-4827-bfbf-6a18da830691"} --> 📝 Generate Docstrings

</details>

<!-- finishing_touch_checkbox_end -->
<!-- tips_start -->

---

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

<details>
<summary>❤️ Share</summary>

- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)
- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)
- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)
- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)

</details>

<details>
<summary>🪧 Tips</summary>

### Chat

There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=tsedio/tsed&utm_content=3082):

- Review comments: Directly reply to a review comment made by CodeRabbit. Example:
  - `I pushed a fix in commit <commit_id>, please review it.`
  - `Explain this complex logic.`
  - `Open a follow-up GitHub issue for this discussion.`
- Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples:
  - `@coderabbitai explain this code block.`
  -	`@coderabbitai modularize this function.`
- PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
  - `@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.`
  - `@coderabbitai read src/utils.ts and explain its main purpose.`
  - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.`
  - `@coderabbitai help me debug CodeRabbit configuration file.`

### Support

Need help? Create a ticket on our [support page](https://www.coderabbit.ai/contact-us/support) for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

### CodeRabbit Commands (Invoked using PR comments)

- `@coderabbitai pause` to pause the reviews on a PR.
- `@coderabbitai resume` to resume the paused reviews.
- `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
- `@coderabbitai full review` to do a full review from scratch and review all the files again.
- `@coderabbitai summary` to regenerate the summary of the PR.
- `@coderabbitai generate docstrings` to [generate docstrings](https://docs.coderabbit.ai/finishing-touches/docstrings) for this PR.
- `@coderabbitai generate sequence diagram` to generate a sequence diagram of the changes in this PR.
- `@coderabbitai resolve` resolve all the CodeRabbit review comments.
- `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository.
- `@coderabbitai help` to get help.

### Other keywords and placeholders

- Add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed.
- Add `@coderabbitai summary` to generate the high-level summary at a specific location in the PR description.
- Add `@coderabbitai` anywhere in the PR title to generate the title automatically.

### CodeRabbit Configuration File (`.coderabbit.yaml`)

- You can programmatically configure CodeRabbit by adding a `.coderabbit.yaml` file to the root of your repository.
- Please see the [configuration documentation](https://docs.coderabbit.ai/guides/configure-coderabbit) for more information.
- If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: `# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json`

### Documentation and Community

- Visit our [Documentation](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit.
- Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback.
- Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.

</details>

<!-- tips_end -->
author_association: CONTRIBUTOR
user: login: Romakita
created_at: 2025-05-19T15:46:56Z
body: :tada: This PR is included in version 8.9.4 :tada:

The release is available on:
- `v8.9.4`
- [GitHub release](https://github.com/tsedio/tsed/releases/tag/v8.9.4)

Your **[semantic-release](https://github.com/semantic-release/semantic-release)** bot :package::rocket:
author_association: COLLABORATOR