From 073dbd7819f3740fe7bdc3e60aa46cbbdbfcdcf6 Mon Sep 17 00:00:00 2001 From: Boaz Poolman Date: Sat, 4 Apr 2026 12:09:36 +0200 Subject: [PATCH] feat: UP migration path --- apps/playground/config/plugins.ts | 8 +- apps/playground/package.json | 1 + .../types/generated/contentTypes.d.ts | 155 +++++ packages/migrate-auth/README.md | 236 ++++++++ packages/migrate-auth/package.json | 46 ++ .../src/adapters/destinations/better-auth.ts | 64 +++ .../src/adapters/destinations/index.ts | 1 + .../src/adapters/sources/index.ts | 1 + .../src/adapters/sources/users-permissions.ts | 76 +++ packages/migrate-auth/src/adapters/types.ts | 91 +++ packages/migrate-auth/src/index.ts | 14 + packages/migrate-auth/src/migrators/roles.ts | 159 ++++++ packages/migrate-auth/src/migrators/users.ts | 98 ++++ .../src/utils/bcrypt-compatibility.ts | 69 +++ packages/migrate-auth/test/migration.test.ts | 350 ++++++++++++ packages/migrate-auth/test/utils.ts | 81 +++ packages/migrate-auth/tsconfig.json | 11 + packages/migrate-auth/vitest.config.ts | 8 + pnpm-lock.yaml | 538 ++++++++++++------ pnpm-workspace.yaml | 1 + 20 files changed, 1846 insertions(+), 162 deletions(-) create mode 100644 packages/migrate-auth/README.md create mode 100644 packages/migrate-auth/package.json create mode 100644 packages/migrate-auth/src/adapters/destinations/better-auth.ts create mode 100644 packages/migrate-auth/src/adapters/destinations/index.ts create mode 100644 packages/migrate-auth/src/adapters/sources/index.ts create mode 100644 packages/migrate-auth/src/adapters/sources/users-permissions.ts create mode 100644 packages/migrate-auth/src/adapters/types.ts create mode 100644 packages/migrate-auth/src/index.ts create mode 100644 packages/migrate-auth/src/migrators/roles.ts create mode 100644 packages/migrate-auth/src/migrators/users.ts create mode 100644 packages/migrate-auth/src/utils/bcrypt-compatibility.ts create mode 100644 packages/migrate-auth/test/migration.test.ts create mode 100644 packages/migrate-auth/test/utils.ts create mode 100644 packages/migrate-auth/tsconfig.json create mode 100644 packages/migrate-auth/vitest.config.ts diff --git a/apps/playground/config/plugins.ts b/apps/playground/config/plugins.ts index 56bf55f..decd335 100644 --- a/apps/playground/config/plugins.ts +++ b/apps/playground/config/plugins.ts @@ -1 +1,7 @@ -export default () => ({}); +export default () => ({ + // Enabled only when running migrate-auth integration tests so that + // the users-permissions auth strategy does not interfere with other test suites. + ...(process.env.ENABLE_USERS_PERMISSIONS === "true" && { + "users-permissions": { enabled: true }, + }), +}); diff --git a/apps/playground/package.json b/apps/playground/package.json index 5790949..b111d97 100644 --- a/apps/playground/package.json +++ b/apps/playground/package.json @@ -19,6 +19,7 @@ "dependencies": { "@strapi-community/plugin-api-permissions": "workspace:*", "@strapi-community/plugin-better-auth": "workspace:*", + "@strapi/plugin-users-permissions": "catalog:strapi", "@strapi/strapi": "catalog:strapi", "@strapi/types": "catalog:strapi", "better-auth": "catalog:better-auth", diff --git a/apps/playground/types/generated/contentTypes.d.ts b/apps/playground/types/generated/contentTypes.d.ts index 31c239c..84204a0 100644 --- a/apps/playground/types/generated/contentTypes.d.ts +++ b/apps/playground/types/generated/contentTypes.d.ts @@ -1188,6 +1188,158 @@ export interface PluginUploadFolder extends Struct.CollectionTypeSchema { }; } +export interface PluginUsersPermissionsPermission + extends Struct.CollectionTypeSchema { + collectionName: "up_permissions"; + info: { + description: ""; + displayName: "Permission"; + name: "permission"; + pluralName: "permissions"; + singularName: "permission"; + }; + options: { + draftAndPublish: false; + }; + pluginOptions: { + "content-manager": { + visible: false; + }; + "content-type-builder": { + visible: false; + }; + }; + attributes: { + action: Schema.Attribute.String & Schema.Attribute.Required; + createdAt: Schema.Attribute.DateTime; + createdBy: Schema.Attribute.Relation<"oneToOne", "admin::user"> & + Schema.Attribute.Private; + locale: Schema.Attribute.String & Schema.Attribute.Private; + localizations: Schema.Attribute.Relation< + "oneToMany", + "plugin::users-permissions.permission" + > & + Schema.Attribute.Private; + publishedAt: Schema.Attribute.DateTime; + role: Schema.Attribute.Relation< + "manyToOne", + "plugin::users-permissions.role" + >; + updatedAt: Schema.Attribute.DateTime; + updatedBy: Schema.Attribute.Relation<"oneToOne", "admin::user"> & + Schema.Attribute.Private; + }; +} + +export interface PluginUsersPermissionsRole + extends Struct.CollectionTypeSchema { + collectionName: "up_roles"; + info: { + description: ""; + displayName: "Role"; + name: "role"; + pluralName: "roles"; + singularName: "role"; + }; + options: { + draftAndPublish: false; + }; + pluginOptions: { + "content-manager": { + visible: false; + }; + "content-type-builder": { + visible: false; + }; + }; + attributes: { + createdAt: Schema.Attribute.DateTime; + createdBy: Schema.Attribute.Relation<"oneToOne", "admin::user"> & + Schema.Attribute.Private; + description: Schema.Attribute.String; + locale: Schema.Attribute.String & Schema.Attribute.Private; + localizations: Schema.Attribute.Relation< + "oneToMany", + "plugin::users-permissions.role" + > & + Schema.Attribute.Private; + name: Schema.Attribute.String & + Schema.Attribute.Required & + Schema.Attribute.SetMinMaxLength<{ + minLength: 3; + }>; + permissions: Schema.Attribute.Relation< + "oneToMany", + "plugin::users-permissions.permission" + >; + publishedAt: Schema.Attribute.DateTime; + type: Schema.Attribute.String & Schema.Attribute.Unique; + updatedAt: Schema.Attribute.DateTime; + updatedBy: Schema.Attribute.Relation<"oneToOne", "admin::user"> & + Schema.Attribute.Private; + users: Schema.Attribute.Relation< + "oneToMany", + "plugin::users-permissions.user" + >; + }; +} + +export interface PluginUsersPermissionsUser + extends Struct.CollectionTypeSchema { + collectionName: "up_users"; + info: { + description: ""; + displayName: "User"; + name: "user"; + pluralName: "users"; + singularName: "user"; + }; + options: { + draftAndPublish: false; + timestamps: true; + }; + attributes: { + blocked: Schema.Attribute.Boolean & Schema.Attribute.DefaultTo; + confirmationToken: Schema.Attribute.String & Schema.Attribute.Private; + confirmed: Schema.Attribute.Boolean & Schema.Attribute.DefaultTo; + createdAt: Schema.Attribute.DateTime; + createdBy: Schema.Attribute.Relation<"oneToOne", "admin::user"> & + Schema.Attribute.Private; + email: Schema.Attribute.Email & + Schema.Attribute.Required & + Schema.Attribute.SetMinMaxLength<{ + minLength: 6; + }>; + locale: Schema.Attribute.String & Schema.Attribute.Private; + localizations: Schema.Attribute.Relation< + "oneToMany", + "plugin::users-permissions.user" + > & + Schema.Attribute.Private; + password: Schema.Attribute.Password & + Schema.Attribute.Private & + Schema.Attribute.SetMinMaxLength<{ + minLength: 6; + }>; + provider: Schema.Attribute.String; + publishedAt: Schema.Attribute.DateTime; + resetPasswordToken: Schema.Attribute.String & Schema.Attribute.Private; + role: Schema.Attribute.Relation< + "manyToOne", + "plugin::users-permissions.role" + >; + updatedAt: Schema.Attribute.DateTime; + updatedBy: Schema.Attribute.Relation<"oneToOne", "admin::user"> & + Schema.Attribute.Private; + username: Schema.Attribute.String & + Schema.Attribute.Required & + Schema.Attribute.Unique & + Schema.Attribute.SetMinMaxLength<{ + minLength: 3; + }>; + }; +} + declare module "@strapi/strapi" { export module Public { export interface ContentTypeSchemas { @@ -1213,6 +1365,9 @@ declare module "@strapi/strapi" { "plugin::review-workflows.workflow-stage": PluginReviewWorkflowsWorkflowStage; "plugin::upload.file": PluginUploadFile; "plugin::upload.folder": PluginUploadFolder; + "plugin::users-permissions.permission": PluginUsersPermissionsPermission; + "plugin::users-permissions.role": PluginUsersPermissionsRole; + "plugin::users-permissions.user": PluginUsersPermissionsUser; } } } diff --git a/packages/migrate-auth/README.md b/packages/migrate-auth/README.md new file mode 100644 index 0000000..2641421 --- /dev/null +++ b/packages/migrate-auth/README.md @@ -0,0 +1,236 @@ +# @strapi-community/migrate-auth + +Migration utilities for moving user data from Strapi's built-in `users-permissions` plugin to [`@strapi-community/plugin-better-auth`](https://github.com/strapi-community/plugin-better-auth). + +## Prerequisites + +Both plugins must be installed and configured in your Strapi project before running a migration: + +- [`@strapi/plugin-users-permissions`](https://docs.strapi.io/dev-docs/plugins/users-permissions) — the migration source +- [`@strapi-community/plugin-better-auth`](https://github.com/strapi-community/plugin-better-auth) — the migration destination +- `@strapi-community/plugin-api-permissions` — required for role migration + +## Installation + +```bash +npm install @strapi-community/migrate-auth +# or +pnpm add @strapi-community/migrate-auth +``` + +## Overview + +The migration runs in two independent steps: + +1. **`migrateUsers`** — copies user records and their credentials/OAuth accounts from `users-permissions` to Better Auth. +2. **`migrateRoles`** — copies roles from `users-permissions` to `api-permissions` and re-assigns already-migrated Better Auth users to their new roles. + +Always run `migrateUsers` before `migrateRoles`. + +## Usage + +The recommended approach is to run the migration inside a [Strapi bootstrap function](https://docs.strapi.io/dev-docs/configurations/functions#bootstrap) or a custom Strapi command, where the fully-initialized `strapi` instance is available. + +### 1. Migrate users + +```ts +// src/index.ts (or any file that has access to the strapi instance) +import { + UsersPermissionsSource, + BetterAuthDestination, + migrateUsers, +} from '@strapi-community/migrate-auth'; + +export default { + async bootstrap({ strapi }) { + const report = await migrateUsers({ + source: new UsersPermissionsSource(strapi), + destination: new BetterAuthDestination(strapi), + }); + + console.log('User migration complete', report); + // { total: 120, migrated: 118, skipped: 2, errors: [] } + }, +}; +``` + +### 2. Migrate roles + +Run this after `migrateUsers` so that Better Auth users exist and can be connected to their roles. + +```ts +import { migrateRoles } from '@strapi-community/migrate-auth'; + +const report = await migrateRoles(strapi); + +console.log('Role migration complete', report); +// { total: 3, created: 2, skipped: 1, assigned: 118, errors: [] } +``` + +### 3. Full migration example + +```ts +// src/index.ts +import { + UsersPermissionsSource, + BetterAuthDestination, + migrateUsers, + migrateRoles, +} from '@strapi-community/migrate-auth'; + +export default { + async bootstrap({ strapi }) { + // Step 1 — users + const userReport = await migrateUsers({ + source: new UsersPermissionsSource(strapi), + destination: new BetterAuthDestination(strapi), + skipExisting: true, // default — safe to re-run + }); + console.log('Users:', userReport); + + // Step 2 — roles (requires users to exist first) + const roleReport = await migrateRoles(strapi); + console.log('Roles:', roleReport); + }, +}; +``` + +## Options + +### `migrateUsers(options)` + +| Option | Type | Default | Description | +|---|---|---|---| +| `source` | `SourceAdapter` | — | Reads users from the source auth provider | +| `destination` | `DestinationAdapter` | — | Writes users to the destination auth provider | +| `dryRun` | `boolean` | `false` | Runs queries but writes nothing. Reports accurate `total` and `skipped` counts; `migrated` will be `0`. | +| `skipExisting` | `boolean` | `true` | Skips users whose email already exists in the destination. Safe to re-run. | +| `batchSize` | `number` | `100` | Number of users fetched from the source per batch. | + +Returns a `MigrationReport`: + +```ts +interface MigrationReport { + total: number; // users found in source + migrated: number; // users written to destination + skipped: number; // users skipped (already existed) + errors: Array<{ email: string; reason: string }>; +} +``` + +### `migrateRoles(strapi, options?)` + +| Option | Type | Default | Description | +|---|---|---|---| +| `dryRun` | `boolean` | `false` | Counts roles and assignments without writing any records. | + +Returns a `RoleMigrationReport`: + +```ts +interface RoleMigrationReport { + total: number; // source roles found + created: number; // new roles created in api-permissions + skipped: number; // roles that already existed + assigned: number; // users whose role was updated + errors: Array<{ name: string; reason: string }>; +} +``` + +## Dry-run mode + +Use `dryRun: true` to preview what the migration will do before committing any changes: + +```ts +const report = await migrateUsers({ + source: new UsersPermissionsSource(strapi), + destination: new BetterAuthDestination(strapi), + dryRun: true, +}); +// report.migrated === 0, report.total shows actual count +``` + +```ts +const report = await migrateRoles(strapi, { dryRun: true }); +// No roles or assignments are written +``` + +## bcrypt password compatibility + +`users-permissions` stores passwords as **bcrypt** hashes. Better Auth uses **scrypt** by default. Without extra configuration, migrated users cannot sign in after migration. + +Use `createBcryptCompatiblePassword()` in your Better Auth config to handle both hash formats transparently: + +```ts +// config/better-auth.ts +import { betterAuth } from 'better-auth'; +import { createBcryptCompatiblePassword } from '@strapi-community/migrate-auth'; + +export default betterAuth({ + emailAndPassword: { + enabled: true, + password: createBcryptCompatiblePassword(), + }, + // ...rest of your config +}); +``` + +This configures Better Auth to: +- **Hash** new passwords with scrypt (Better Auth default). +- **Verify** passwords by detecting the hash format: + - `$2…` prefix → bcrypt (migrated users) + - anything else → scrypt (new users) + +> Migrated users keep their bcrypt hash until they reset their password or you run a separate re-hashing pass. + +## Custom adapters + +The migration engine is decoupled from any specific provider. You can implement the `SourceAdapter` or `DestinationAdapter` interfaces to migrate from or to a different system. + +```ts +import type { SourceAdapter, SourceUser } from '@strapi-community/migrate-auth'; + +class MyCustomSource implements SourceAdapter { + async getUserCount(): Promise { + // return total user count from your system + } + + async getUsers(options: { limit: number; offset: number }): Promise { + // return a page of users mapped to the SourceUser shape + } +} +``` + +Then pass your adapter to `migrateUsers`: + +```ts +await migrateUsers({ + source: new MyCustomSource(), + destination: new BetterAuthDestination(strapi), +}); +``` + +## Field mapping + +### `UsersPermissionsSource` + +| `users-permissions` field | `SourceUser` field | +|---|---| +| `username` | `name` | +| `email` | `email` | +| `confirmed` | `emailVerified` | +| `password` (local users only) | `password` | +| `provider` | `provider` | +| `role` (relation) | `role` | + +### `BetterAuthDestination` + +For each source user the adapter creates two records: + +- A `plugin::better-auth.user` record with `name`, `email`, and `emailVerified`. +- A `plugin::better-auth.account` record: + - Local users → `providerId: "credential"`, password hash stored as-is. + - OAuth users → `providerId: ` (e.g. `"google"`), no password. + +## License + +MIT diff --git a/packages/migrate-auth/package.json b/packages/migrate-auth/package.json new file mode 100644 index 0000000..a2e2543 --- /dev/null +++ b/packages/migrate-auth/package.json @@ -0,0 +1,46 @@ +{ + "name": "@strapi-community/migrate-auth", + "version": "0.0.0", + "description": "Migration utilities for moving user data between Strapi auth providers", + "type": "commonjs", + "exports": { + ".": { + "source": "./src/index.ts", + "require": "./dist/index.js", + "default": "./dist/index.js" + }, + "./package.json": "./package.json" + }, + "files": [ + "dist" + ], + "scripts": { + "build": "tsc", + "check-types": "tsc --noEmit", + "test:integration": "node --js-explicit-resource-management node_modules/vitest/vitest.mjs run", + "lint": "biome check --fix" + }, + "peerDependencies": { + "@strapi/strapi": "catalog:strapi", + "@strapi/types": "catalog:strapi" + }, + "devDependencies": { + "@biomejs/biome": "^2.3.11", + "@strapi/typescript-utils": "catalog:strapi", + "@types/bcryptjs": "^2.4.6", + "better-auth": "catalog:better-auth", + "typescript": "^5.9.3", + "vitest": "^4.1.0" + }, + "license": "MIT", + "author": { + "name": "Boaz Poolman", + "email": "boaz@pluginpal.io", + "url": "https://github.com/boazpoolman" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/strapi-community/auth.git", + "directory": "packages/migrate-auth" + } +} diff --git a/packages/migrate-auth/src/adapters/destinations/better-auth.ts b/packages/migrate-auth/src/adapters/destinations/better-auth.ts new file mode 100644 index 0000000..65f6a7b --- /dev/null +++ b/packages/migrate-auth/src/adapters/destinations/better-auth.ts @@ -0,0 +1,64 @@ +import type { Core } from "@strapi/strapi"; +import type { DestinationAdapter, MigratedUser, SourceUser } from "../types"; + +const USER_UID = "plugin::better-auth.user" as const; +const ACCOUNT_UID = "plugin::better-auth.account" as const; + +/** + * Destination adapter that writes users to the `plugin-better-auth` plugin. + * + * For each source user this adapter: + * 1. Creates a `plugin::better-auth.user` record + * 2. Creates a `plugin::better-auth.account` record linked to that user + * - credential users → `providerId: "credential"`, password hash stored as-is + * - OAuth users → `providerId: `, no password + * + * Note: bcrypt hashes migrated from users-permissions are stored verbatim. + * To allow sign-in with those hashes after migration, configure Better Auth with + * `createBcryptCompatiblePassword()` from this package. + */ +export class BetterAuthDestination implements DestinationAdapter { + constructor(private readonly strapi: Core.Strapi) { + if (!strapi.plugin("better-auth")) { + throw new Error( + "[@strapi-community/migrate-auth] The `better-auth` plugin is not installed. " + + "Install @strapi-community/plugin-better-auth before running this migration.", + ); + } + } + + async userExists(email: string): Promise { + const user = await this.strapi.documents(USER_UID).findFirst({ + filters: { email }, + }); + return !!user; + } + + async createUser(user: SourceUser): Promise { + const created = await this.strapi.documents(USER_UID).create({ + data: { + name: user.name, + email: user.email, + emailVerified: user.emailVerified, + }, + }); + + return { id: created.id, documentId: created.documentId }; + } + + async createAccount( + user: SourceUser, + migratedUser: MigratedUser, + ): Promise { + await this.strapi.documents(ACCOUNT_UID).create({ + data: { + accountId: user.email, + providerId: user.provider === "local" ? "credential" : user.provider, + // numeric id — consistent with supportsNumericIds: true in the adapter + userId: migratedUser.id, + // carry the hash forward; null for OAuth accounts + password: user.password ?? null, + }, + }); + } +} diff --git a/packages/migrate-auth/src/adapters/destinations/index.ts b/packages/migrate-auth/src/adapters/destinations/index.ts new file mode 100644 index 0000000..62de6b6 --- /dev/null +++ b/packages/migrate-auth/src/adapters/destinations/index.ts @@ -0,0 +1 @@ +export { BetterAuthDestination } from "./better-auth"; diff --git a/packages/migrate-auth/src/adapters/sources/index.ts b/packages/migrate-auth/src/adapters/sources/index.ts new file mode 100644 index 0000000..6e829f8 --- /dev/null +++ b/packages/migrate-auth/src/adapters/sources/index.ts @@ -0,0 +1 @@ +export { UsersPermissionsSource } from "./users-permissions"; diff --git a/packages/migrate-auth/src/adapters/sources/users-permissions.ts b/packages/migrate-auth/src/adapters/sources/users-permissions.ts new file mode 100644 index 0000000..d687b9b --- /dev/null +++ b/packages/migrate-auth/src/adapters/sources/users-permissions.ts @@ -0,0 +1,76 @@ +import type { Core } from "@strapi/strapi"; +import type { SourceAdapter, SourceUser } from "../types"; + +const UID = "plugin::users-permissions.user" as const; + +/** + * Source adapter that reads users from Strapi's built-in `users-permissions` plugin. + * + * Field mapping: + * - `username` → `name` + * - `email` → `email` + * - `confirmed` → `emailVerified` + * - `password` → `password` (bcrypt hash, local users only) + * - `provider` → `provider` + * - `role` → `role` (populated relation) + */ +export class UsersPermissionsSource implements SourceAdapter { + constructor(private readonly strapi: Core.Strapi) { + if (!strapi.plugin("users-permissions")) { + throw new Error( + "[@strapi-community/migrate-auth] The `users-permissions` plugin is not installed. " + + "Install @strapi/plugin-users-permissions before running this migration.", + ); + } + } + + async getUserCount(): Promise { + return this.strapi.db.query(UID).count({}); + } + + async getUsers(options: { + limit: number; + offset: number; + }): Promise { + const users = await this.strapi.db.query(UID).findMany({ + where: {}, + limit: options.limit, + offset: options.offset, + populate: ["role"], + }); + + return (users as RawUpUser[]).map((user) => ({ + email: user.email, + // users-permissions has `username` rather than a separate `name` field + name: user.username || user.email.split("@")[0], + emailVerified: user.confirmed ?? false, + // Only carry the hash for credential (local) users + password: + user.provider === "local" && user.password ? user.password : undefined, + provider: user.provider ?? "local", + role: user.role + ? { + name: user.role.name, + description: user.role.description ?? undefined, + } + : undefined, + })); + } +} + +// Minimal shape of the raw record returned by strapi.db.query for users-permissions +interface RawUpUser { + id: number; + username: string; + email: string; + provider: string; + password: string | null; + confirmed: boolean; + blocked: boolean; + role?: { + id: number; + name: string; + description?: string | null; + type?: string; + } | null; +} diff --git a/packages/migrate-auth/src/adapters/types.ts b/packages/migrate-auth/src/adapters/types.ts new file mode 100644 index 0000000..b334b72 --- /dev/null +++ b/packages/migrate-auth/src/adapters/types.ts @@ -0,0 +1,91 @@ +/** + * A normalized user read from a source auth provider. + */ +export interface SourceUser { + /** Display name (derived from username or similar field) */ + name: string; + /** Email address — used as the unique key across source and destination */ + email: string; + /** Whether the email has been confirmed */ + emailVerified: boolean; + /** + * Raw password hash from the source (e.g. bcrypt). + * Only present for credential / local-auth users. + */ + password?: string; + /** + * Auth provider identifier. + * Use "local" for email+password users. + * Use the provider name (e.g. "google", "github") for OAuth users. + */ + provider: string; + /** The role assigned to this user in the source system, if any */ + role?: { + name: string; + description?: string; + }; +} + +/** + * A user that has been written to the destination auth provider. + */ +export interface MigratedUser { + /** Numeric database id — used as the foreign key in account records */ + id: number; + /** Stable document identifier returned by Strapi's Document Service */ + documentId: string; +} + +/** + * Reads user records from a source auth provider. + * Implement this interface to add a new migration source. + */ +export interface SourceAdapter { + /** Returns the total number of users in the source system */ + getUserCount(): Promise; + /** Returns a page of users from the source system */ + getUsers(options: { limit: number; offset: number }): Promise; +} + +/** + * Writes user records to a destination auth provider. + * Implement this interface to add a new migration destination. + */ +export interface DestinationAdapter { + /** Returns true if a user with the given email already exists */ + userExists(email: string): Promise; + /** Creates a user record and returns the persisted identifiers */ + createUser(user: SourceUser): Promise; + /** Creates an account / credential record linked to the migrated user */ + createAccount(user: SourceUser, migratedUser: MigratedUser): Promise; +} + +/** + * Result of a user migration run. + */ +export interface MigrationReport { + /** Total number of users found in the source system */ + total: number; + /** Number of users successfully written to the destination */ + migrated: number; + /** Number of users skipped (e.g. already exist in the destination) */ + skipped: number; + /** Per-user errors that did not abort the entire run */ + errors: Array<{ email: string; reason: string }>; +} + +/** + * Result of a role migration run. + */ +export interface RoleMigrationReport { + /** Total number of source roles found */ + total: number; + /** Number of new roles created in the destination */ + created: number; + /** Number of roles that already existed and were skipped */ + skipped: number; + /** Number of users whose role assignment was updated */ + assigned: number; + /** Per-role / per-user errors that did not abort the run */ + errors: Array<{ name: string; reason: string }>; +} diff --git a/packages/migrate-auth/src/index.ts b/packages/migrate-auth/src/index.ts new file mode 100644 index 0000000..052a7a2 --- /dev/null +++ b/packages/migrate-auth/src/index.ts @@ -0,0 +1,14 @@ +export { BetterAuthDestination } from "./adapters/destinations"; +export { UsersPermissionsSource } from "./adapters/sources"; +export type { + DestinationAdapter, + MigrationReport, + MigratedUser, + RoleMigrationReport, + SourceAdapter, + SourceUser, +} from "./adapters/types"; +export { migrateRoles } from "./migrators/roles"; +export type { MigrateUsersOptions } from "./migrators/users"; +export { migrateUsers } from "./migrators/users"; +export { createBcryptCompatiblePassword } from "./utils/bcrypt-compatibility"; diff --git a/packages/migrate-auth/src/migrators/roles.ts b/packages/migrate-auth/src/migrators/roles.ts new file mode 100644 index 0000000..0767510 --- /dev/null +++ b/packages/migrate-auth/src/migrators/roles.ts @@ -0,0 +1,159 @@ +import type { Core } from "@strapi/strapi"; +import type { RoleMigrationReport } from "../adapters/types"; + +const UP_USER_UID = "plugin::users-permissions.user" as const; +const UP_ROLE_UID = "plugin::users-permissions.role" as const; +const API_ROLE_UID = "plugin::api-permissions.role" as const; +const BA_USER_UID = "plugin::better-auth.user" as const; + +/** + * Migrates roles from `users-permissions` to `api-permissions` and re-assigns + * already-migrated Better Auth users to their corresponding new roles. + * + * Role migration is intentionally static — roles always flow from + * `users-permissions` → `api-permissions`. If a matching role (by name) already + * exists in `api-permissions` it is reused rather than duplicated. + * + * Run this after `migrateUsers()` so that Better Auth users exist and can be + * connected to their roles. + * + * @example + * ```ts + * const report = await migrateRoles(strapi); + * console.log(report); + * ``` + */ +export async function migrateRoles( + strapi: Core.Strapi, + options: { dryRun?: boolean } = {}, +): Promise { + const { dryRun = false } = options; + + if (!strapi.plugin("users-permissions")) { + throw new Error( + "[@strapi-community/migrate-auth] The `users-permissions` plugin is not installed.", + ); + } + if (!strapi.plugin("api-permissions")) { + throw new Error( + "[@strapi-community/migrate-auth] The `api-permissions` plugin is not installed.", + ); + } + if (!strapi.plugin("better-auth")) { + throw new Error( + "[@strapi-community/migrate-auth] The `better-auth` plugin is not installed.", + ); + } + + const report: RoleMigrationReport = { + total: 0, + created: 0, + skipped: 0, + assigned: 0, + errors: [], + }; + + // ----------------------------------------------------------------------- + // Step 1: build a mapping from users-permissions role id → api-permissions + // role documentId, creating roles as needed. + // ----------------------------------------------------------------------- + const upRoles = (await strapi.db + .query(UP_ROLE_UID) + .findMany({})) as RawUpRole[]; + + report.total = upRoles.length; + + // Cache: upRole.id → { documentId } + const roleMap = new Map(); + + for (const upRole of upRoles) { + try { + const existing = await strapi.documents(API_ROLE_UID).findFirst({ + filters: { name: upRole.name }, + }); + + if (existing) { + roleMap.set(upRole.id, { documentId: existing.documentId }); + report.skipped++; + } else if (!dryRun) { + const created = await strapi.documents(API_ROLE_UID).create({ + data: { + name: upRole.name, + description: upRole.description ?? "", + }, + }); + roleMap.set(upRole.id, { documentId: created.documentId }); + report.created++; + } else { + // dry-run placeholder so role assignment logic can still run + roleMap.set(upRole.id, { documentId: `dry-run-${upRole.id}` }); + report.created++; + } + } catch (err) { + report.errors.push({ + name: upRole.name, + reason: err instanceof Error ? err.message : String(err), + }); + } + } + + // ----------------------------------------------------------------------- + // Step 2: for every users-permissions user, connect the corresponding + // Better Auth user to the mapped api-permissions role. + // ----------------------------------------------------------------------- + const upUsers = (await strapi.db.query(UP_USER_UID).findMany({ + where: {}, + populate: ["role"], + })) as RawUpUser[]; + + for (const upUser of upUsers) { + if (!upUser.role) continue; + + const apiRole = roleMap.get(upUser.role.id); + if (!apiRole) continue; + + try { + const baUser = await strapi.documents(BA_USER_UID).findFirst({ + filters: { email: upUser.email }, + }); + + if (!baUser) continue; + + if (!dryRun) { + await strapi.documents(BA_USER_UID).update({ + documentId: baUser.documentId, + // `roles` is a dynamic manyToMany relation injected at runtime by api-permissions + data: { + roles: { connect: [{ documentId: apiRole.documentId }] }, + } as never, + }); + } + + report.assigned++; + } catch (err) { + report.errors.push({ + name: upUser.email, + reason: err instanceof Error ? err.message : String(err), + }); + } + } + + return report; +} + +// --------------------------------------------------------------------------- +// Internal raw types for the db.query results +// --------------------------------------------------------------------------- + +interface RawUpRole { + id: number; + name: string; + description?: string | null; + type?: string; +} + +interface RawUpUser { + id: number; + email: string; + role?: RawUpRole | null; +} diff --git a/packages/migrate-auth/src/migrators/users.ts b/packages/migrate-auth/src/migrators/users.ts new file mode 100644 index 0000000..4efaea4 --- /dev/null +++ b/packages/migrate-auth/src/migrators/users.ts @@ -0,0 +1,98 @@ +import type { + DestinationAdapter, + MigrationReport, + SourceAdapter, +} from "../adapters/types"; + +export interface MigrateUsersOptions { + /** Reads user records from the source auth provider */ + source: SourceAdapter; + /** Writes user records to the destination auth provider */ + destination: DestinationAdapter; + /** + * When true, queries are executed but no records are written. + * The report will show accurate `total` and `skipped` counts but `migrated` will be 0. + * @default false + */ + dryRun?: boolean; + /** + * When true, users whose email already exists in the destination are skipped. + * @default true + */ + skipExisting?: boolean; + /** + * Number of source users to process per batch. + * @default 100 + */ + batchSize?: number; +} + +/** + * Migrates users from a source auth provider to a destination auth provider. + * + * The migration engine is decoupled from any specific provider — it only calls + * the `SourceAdapter` and `DestinationAdapter` interfaces. To migrate from a + * different source or to a different destination, swap the adapter implementations. + * + * @example + * ```ts + * const report = await migrateUsers({ + * source: new UsersPermissionsSource(strapi), + * destination: new BetterAuthDestination(strapi), + * skipExisting: true, + * }); + * console.log(report); + * ``` + */ +export async function migrateUsers( + options: MigrateUsersOptions, +): Promise { + const { + source, + destination, + dryRun = false, + skipExisting = true, + batchSize = 100, + } = options; + + const report: MigrationReport = { + total: 0, + migrated: 0, + skipped: 0, + errors: [], + }; + + report.total = await source.getUserCount(); + + let offset = 0; + + while (offset < report.total) { + const users = await source.getUsers({ limit: batchSize, offset }); + + for (const user of users) { + try { + const exists = skipExisting && (await destination.userExists(user.email)); + + if (exists) { + report.skipped++; + continue; + } + + if (!dryRun) { + const migratedUser = await destination.createUser(user); + await destination.createAccount(user, migratedUser); + report.migrated++; + } + } catch (err) { + report.errors.push({ + email: user.email, + reason: err instanceof Error ? err.message : String(err), + }); + } + } + + offset += batchSize; + } + + return report; +} diff --git a/packages/migrate-auth/src/utils/bcrypt-compatibility.ts b/packages/migrate-auth/src/utils/bcrypt-compatibility.ts new file mode 100644 index 0000000..80d3218 --- /dev/null +++ b/packages/migrate-auth/src/utils/bcrypt-compatibility.ts @@ -0,0 +1,69 @@ +import type { BetterAuthOptions } from "better-auth"; + +type PasswordConfig = NonNullable< + NonNullable["password"] +>; + +/** + * Creates a password configuration for Better Auth that transparently supports + * both **bcrypt** hashes (migrated from `users-permissions`) and **scrypt** + * hashes (Better Auth's default for new passwords). + * + * After migrating users from `users-permissions` their passwords are stored as + * bcrypt hashes (`$2b$…`). Without this helper, Better Auth's built-in scrypt + * verifier will reject those hashes and migrated users will be unable to sign in. + * + * **How it works:** + * - `hash()` — always produces a scrypt hash (Better Auth default). + * - `verify()` — detects the hash format by its prefix: + * - `$2` prefix → bcrypt; verified via `bcryptjs.compare()` + * - anything else → scrypt; verified via Better Auth's `verifyPassword()` + * + * ⚠️ Passwords are **not** automatically re-hashed to scrypt on login. + * Migrated users will continue to use bcrypt until you run a separate + * re-hashing pass or they reset their password through your normal flow. + * + * `bcryptjs` is a transitive runtime dependency of `@strapi/admin`. No extra + * installation is required. + * + * @example + * ```ts + * // apps/playground/config/better-auth.ts + * import { createBcryptCompatiblePassword } from '@strapi-community/migrate-auth'; + * + * export default betterAuth({ + * emailAndPassword: { + * enabled: true, + * password: createBcryptCompatiblePassword(), + * }, + * }); + * ``` + */ +export function createBcryptCompatiblePassword(): PasswordConfig { + return { + async hash(password: string): Promise { + const { hashPassword } = await import("better-auth/crypto"); + return hashPassword(password); + }, + + async verify({ + hash, + password, + }: { + hash: string; + password: string; + }): Promise { + // Bcrypt hashes always start with "$2" (e.g. "$2b$10$…" or "$2a$10$…") + if (hash.startsWith("$2")) { + // bcryptjs is a transitive dep of @strapi/admin — always available at runtime + // eslint-disable-next-line @typescript-eslint/no-require-imports + const bcrypt = require("bcryptjs") as typeof import("bcryptjs"); + return bcrypt.compare(password, hash); + } + + // Better Auth scrypt format: "hexSalt:hexHash" + const { verifyPassword } = await import("better-auth/crypto"); + return verifyPassword({ hash, password }); + }, + }; +} diff --git a/packages/migrate-auth/test/migration.test.ts b/packages/migrate-auth/test/migration.test.ts new file mode 100644 index 0000000..d0d6dc0 --- /dev/null +++ b/packages/migrate-auth/test/migration.test.ts @@ -0,0 +1,350 @@ +import { afterAll, afterEach, beforeAll, describe, expect, it } from "vitest"; +import { + BetterAuthDestination, + UsersPermissionsSource, + migrateRoles, + migrateUsers, +} from "../src"; +import { setupStrapi, stopStrapi } from "./utils"; + +const UP_USER_UID = "plugin::users-permissions.user"; +const UP_ROLE_UID = "plugin::users-permissions.role"; +const BA_USER_UID = "plugin::better-auth.user"; +const BA_ACCOUNT_UID = "plugin::better-auth.account"; +const API_ROLE_UID = "plugin::api-permissions.role"; + +// --------------------------------------------------------------------------- +// Lifecycle +// --------------------------------------------------------------------------- + +beforeAll(async () => { + await setupStrapi(); +}); + +afterAll(async () => { + await stopStrapi(); +}); + +// --------------------------------------------------------------------------- +// Helpers +// --------------------------------------------------------------------------- + +/** A known bcrypt hash for the plain-text password "password" */ +const BCRYPT_HASH = + "$2b$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy"; + +async function createUpUser(data: { + username: string; + email: string; + password?: string | null; + provider?: string; + confirmed?: boolean; + roleId?: number; +}) { + return strapi.db.query(UP_USER_UID).create({ + data: { + username: data.username, + email: data.email, + password: data.password !== undefined ? data.password : BCRYPT_HASH, + provider: data.provider ?? "local", + confirmed: data.confirmed ?? true, + blocked: false, + ...(data.roleId != null && { role: data.roleId }), + }, + }); +} + +async function cleanupUpUsers() { + const users = (await strapi.db + .query(UP_USER_UID) + .findMany({})) as Array<{ id: number }>; + for (const user of users) { + await strapi.db.query(UP_USER_UID).delete({ where: { id: user.id } }); + } +} + +async function cleanupBetterAuth() { + const accounts = await strapi.documents(BA_ACCOUNT_UID).findMany({}); + for (const acc of accounts) { + await strapi + .documents(BA_ACCOUNT_UID) + .delete({ documentId: acc.documentId }); + } + + const users = await strapi.documents(BA_USER_UID).findMany({}); + for (const user of users) { + await strapi.documents(BA_USER_UID).delete({ documentId: user.documentId }); + } +} + +function makeAdapters() { + return { + source: new UsersPermissionsSource(strapi), + destination: new BetterAuthDestination(strapi), + }; +} + +// --------------------------------------------------------------------------- +// migrateUsers +// --------------------------------------------------------------------------- + +describe("migrateUsers", () => { + afterEach(async () => { + await cleanupBetterAuth(); + await cleanupUpUsers(); + }); + + it("dry-run: returns accurate total without writing any records", async () => { + await createUpUser({ username: "alice", email: "alice@example.com" }); + await createUpUser({ username: "bob", email: "bob@example.com" }); + + const { source, destination } = makeAdapters(); + const report = await migrateUsers({ source, destination, dryRun: true }); + + expect(report.total).toBe(2); + expect(report.migrated).toBe(0); + expect(report.errors).toHaveLength(0); + + const baUsers = await strapi.documents(BA_USER_UID).findMany({}); + expect(baUsers).toHaveLength(0); + }); + + it("migrates a local user and creates a credential account", async () => { + await createUpUser({ + username: "alice", + email: "alice@example.com", + confirmed: true, + }); + + const { source, destination } = makeAdapters(); + const report = await migrateUsers({ source, destination }); + + expect(report.migrated).toBe(1); + expect(report.skipped).toBe(0); + expect(report.errors).toHaveLength(0); + + const baUsers = await strapi.documents(BA_USER_UID).findMany({}); + expect(baUsers).toHaveLength(1); + expect(baUsers[0].email).toBe("alice@example.com"); + expect(baUsers[0].name).toBe("alice"); + expect(baUsers[0].emailVerified).toBe(true); + + const accounts = await strapi.documents(BA_ACCOUNT_UID).findMany({}); + expect(accounts).toHaveLength(1); + expect(accounts[0].providerId).toBe("credential"); + expect(accounts[0].accountId).toBe("alice@example.com"); + expect(accounts[0].password).toBe(BCRYPT_HASH); + }); + + it("migrates an unconfirmed user with emailVerified = false", async () => { + await createUpUser({ + username: "unverified", + email: "unverified@example.com", + confirmed: false, + }); + + const { source, destination } = makeAdapters(); + await migrateUsers({ source, destination }); + + const baUser = await strapi + .documents(BA_USER_UID) + .findFirst({ filters: { email: "unverified@example.com" } }); + + expect(baUser?.emailVerified).toBe(false); + }); + + it("migrates an OAuth user with the correct providerId and no password", async () => { + await createUpUser({ + username: "charlie", + email: "charlie@example.com", + provider: "google", + password: null, + }); + + const { source, destination } = makeAdapters(); + const report = await migrateUsers({ source, destination }); + + expect(report.migrated).toBe(1); + + const accounts = await strapi.documents(BA_ACCOUNT_UID).findMany({}); + expect(accounts).toHaveLength(1); + expect(accounts[0].providerId).toBe("google"); + expect(accounts[0].password).toBeNull(); + }); + + it("skips already-migrated users when skipExisting is true (default)", async () => { + await createUpUser({ username: "alice", email: "alice@example.com" }); + + const { source, destination } = makeAdapters(); + + // First run + const first = await migrateUsers({ source, destination }); + expect(first.migrated).toBe(1); + + // Second run — should skip + const second = await migrateUsers({ source, destination }); + expect(second.skipped).toBe(1); + expect(second.migrated).toBe(0); + + // Only one user should exist + const baUsers = await strapi.documents(BA_USER_UID).findMany({}); + expect(baUsers).toHaveLength(1); + }); + + it("dry-run with skipExisting: accurately counts would-be skips", async () => { + await createUpUser({ username: "alice", email: "alice@example.com" }); + await createUpUser({ username: "bob", email: "bob@example.com" }); + + const { source, destination } = makeAdapters(); + + // Migrate only alice + await migrateUsers({ + source, + destination, + skipExisting: false, + batchSize: 1, + }); + // Remove bob from BA so alice is the only existing one + const bobBA = await strapi + .documents(BA_USER_UID) + .findFirst({ filters: { email: "bob@example.com" } }); + if (bobBA) { + const bobAccounts = await strapi + .documents(BA_ACCOUNT_UID) + .findMany({ filters: { userId: bobBA.id } }); + for (const acc of bobAccounts) { + await strapi + .documents(BA_ACCOUNT_UID) + .delete({ documentId: acc.documentId }); + } + await strapi + .documents(BA_USER_UID) + .delete({ documentId: bobBA.documentId }); + } + + const report = await migrateUsers({ + source, + destination, + dryRun: true, + skipExisting: true, + }); + + expect(report.total).toBe(2); + expect(report.skipped).toBe(1); // alice already exists + expect(report.migrated).toBe(0); // dry-run + }); +}); + +// --------------------------------------------------------------------------- +// migrateRoles +// --------------------------------------------------------------------------- + +describe("migrateRoles", () => { + afterEach(async () => { + await cleanupBetterAuth(); + await cleanupUpUsers(); + }); + + it("creates a new api-permissions role for each users-permissions role", async () => { + const upRole = (await strapi.db.query(UP_ROLE_UID).create({ + data: { name: "Editor", description: "Content editors", type: "editor" }, + })) as { id: number }; + + // Seed a user with that role + await createUpUser({ + username: "alice", + email: "alice@example.com", + roleId: upRole.id, + }); + + // Migrate users first so there is a BA user to assign the role to + const { source, destination } = makeAdapters(); + await migrateUsers({ source, destination }); + + const report = await migrateRoles(strapi); + + // "Editor" should now exist in api-permissions + const apiRole = await strapi + .documents(API_ROLE_UID) + .findFirst({ filters: { name: "Editor" } }); + + expect(apiRole).toBeTruthy(); + expect(report.created).toBeGreaterThanOrEqual(1); + expect(report.assigned).toBeGreaterThanOrEqual(1); + expect(report.errors).toHaveLength(0); + + // Cleanup + if (apiRole) { + await strapi + .documents(API_ROLE_UID) + .delete({ documentId: apiRole.documentId }); + } + await strapi.db + .query(UP_ROLE_UID) + .delete({ where: { id: upRole.id } }); + }); + + it("skips creating a role that already exists in api-permissions", async () => { + // Pre-create the role in api-permissions + const existing = await strapi.documents(API_ROLE_UID).create({ + data: { name: "Reviewer", description: "Pre-existing" }, + }); + + const upRole = (await strapi.db.query(UP_ROLE_UID).create({ + data: { name: "Reviewer", description: "Reviewers", type: "reviewer" }, + })) as { id: number }; + + await createUpUser({ + username: "alice", + email: "alice@example.com", + roleId: upRole.id, + }); + + const { source, destination } = makeAdapters(); + await migrateUsers({ source, destination }); + + const report = await migrateRoles(strapi); + + expect(report.skipped).toBeGreaterThanOrEqual(1); + expect(report.created).toBe(0); + + // Cleanup + await strapi + .documents(API_ROLE_UID) + .delete({ documentId: existing.documentId }); + await strapi.db + .query(UP_ROLE_UID) + .delete({ where: { id: upRole.id } }); + }); + + it("dry-run: does not create roles or assign users", async () => { + const upRole = (await strapi.db.query(UP_ROLE_UID).create({ + data: { name: "DryEditor", description: "Dry run editors", type: "dry-editor" }, + })) as { id: number }; + + await createUpUser({ + username: "dryuser", + email: "dryuser@example.com", + roleId: upRole.id, + }); + + const { source, destination } = makeAdapters(); + await migrateUsers({ source, destination }); + + const report = await migrateRoles(strapi, { dryRun: true }); + + // Role should NOT have been created + const apiRole = await strapi + .documents(API_ROLE_UID) + .findFirst({ filters: { name: "DryEditor" } }); + expect(apiRole).toBeNull(); + + expect(report.created).toBeGreaterThanOrEqual(1); // counted as would-create + expect(report.errors).toHaveLength(0); + + // Cleanup + await strapi.db + .query(UP_ROLE_UID) + .delete({ where: { id: upRole.id } }); + }); +}); diff --git a/packages/migrate-auth/test/utils.ts b/packages/migrate-auth/test/utils.ts new file mode 100644 index 0000000..176772b --- /dev/null +++ b/packages/migrate-auth/test/utils.ts @@ -0,0 +1,81 @@ +import assert from "node:assert"; +import fs from "node:fs"; +import fspromises from "node:fs/promises"; +import { createRequire } from "node:module"; +import net from "node:net"; +import path from "node:path"; +import { threadId } from "node:worker_threads"; +import type { Core } from "@strapi/strapi"; + +const require = createRequire(import.meta.url); +const { compileStrapi, createStrapi } = + require("@strapi/strapi") as typeof import("@strapi/strapi"); + +function getFreePort(): Promise { + return new Promise((resolve, reject) => { + const srv = net.createServer(); + srv.listen(0, "127.0.0.1", () => { + const addr = srv.address(); + srv.close(() => resolve((addr as net.AddressInfo).port)); + }); + srv.on("error", reject); + }); +} + +const instanceId = `${process.pid}-${threadId}`; + +export const playgroundDir = path.resolve(process.cwd(), "../../apps/playground"); + +let instance: Core.Strapi | undefined; + +export async function setupStrapi() { + const databaseFilename = `.tmp/vitest-${instanceId}.db`; + const databasePath = path.join(playgroundDir, databaseFilename); + + const port = await getFreePort(); + + // Required for the users-permissions plugin (source of migration data) + process.env.ENABLE_USERS_PERMISSIONS = "true"; + + process.env.APP_KEYS ??= + "test-app-key-1,test-app-key-2,test-app-key-3,test-app-key-4"; + process.env.API_TOKEN_SALT ??= "test-api-token-salt"; + process.env.ADMIN_JWT_SECRET ??= "test-admin-jwt-secret"; + process.env.TRANSFER_TOKEN_SALT ??= "test-transfer-token-salt"; + process.env.ENCRYPTION_KEY ??= "test-encryption-key-1234567890"; + process.env.JWT_SECRET ??= "test-jwt-secret"; + process.env.BETTER_AUTH_URL = `http://localhost:${port}`; + process.env.PORT = String(port); + process.env.DATABASE_FILENAME = databaseFilename; + + await fspromises.rm(databasePath, { force: true }); + + if (!instance) { + const appContext = await compileStrapi({ + appDir: playgroundDir, + ignoreDiagnostics: true, + }); + const strapi = await createStrapi(appContext).load(); + await strapi.start(); + + instance = strapi; + } +} + +export async function stopStrapi() { + if (instance) { + const tmpDbFile = instance.config.get( + "database.connection.connection.filename", + ); + + assert(typeof tmpDbFile === "string"); + + await instance.destroy(); + + if (fs.existsSync(tmpDbFile)) { + fs.unlinkSync(tmpDbFile); + } + + instance = undefined; + } +} diff --git a/packages/migrate-auth/tsconfig.json b/packages/migrate-auth/tsconfig.json new file mode 100644 index 0000000..8ddf9ca --- /dev/null +++ b/packages/migrate-auth/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "@strapi/typescript-utils/tsconfigs/server", + "include": ["src"], + "compilerOptions": { + "rootDir": "./src", + "outDir": "./dist", + "declaration": true, + "declarationMap": true, + "strict": true + } +} diff --git a/packages/migrate-auth/vitest.config.ts b/packages/migrate-auth/vitest.config.ts new file mode 100644 index 0000000..a32fce8 --- /dev/null +++ b/packages/migrate-auth/vitest.config.ts @@ -0,0 +1,8 @@ +import { defineProject } from "vitest/config"; + +export default defineProject({ + test: { + pool: "threads", + include: ["test/**/*.test.ts"], + }, +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c0e5996..db6b0c9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,6 +13,9 @@ catalogs: specifier: 1.5.6 version: 1.5.6 strapi: + '@strapi/plugin-users-permissions': + specifier: 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66 + version: 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66 '@strapi/strapi': specifier: 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66 version: 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66 @@ -92,12 +95,15 @@ importers: '@strapi-community/plugin-better-auth': specifier: workspace:* version: link:../../packages/plugin-better-auth + '@strapi/plugin-users-permissions': + specifier: catalog:strapi + version: 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(332101d68cfbb4b1a4b5d46258fadd7f) '@strapi/strapi': specifier: catalog:strapi version: 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@babel/preset-env@7.29.2(@babel/core@7.28.5))(@babel/runtime@7.28.4)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(@emotion/is-prop-valid@1.4.0)(@swc/helpers@0.5.18)(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@20.19.37)(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(better-sqlite3@12.4.1)(codemirror@5.65.20)(esbuild@0.25.12)(koa@2.16.4)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.44.1)(type-fest@4.41.0)(webpack-dev-server@4.15.2(webpack@5.104.1(esbuild@0.25.12))) '@strapi/types': specifier: catalog:strapi - version: 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@20.19.37)(better-sqlite3@12.4.1)(typescript@5.9.3) + version: 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@20.19.37)(better-sqlite3@12.4.1)(typescript@5.4.4) better-auth: specifier: catalog:better-auth version: 1.5.6(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vitest@4.1.0(@opentelemetry/api@1.9.0)(@types/node@20.19.37)(vite@5.4.21(@types/node@20.19.37)(terser@5.44.1))) @@ -133,6 +139,34 @@ importers: specifier: ^5 version: 5.9.3 + packages/migrate-auth: + dependencies: + '@strapi/strapi': + specifier: catalog:strapi + version: 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@babel/preset-env@7.29.2(@babel/core@7.28.5))(@emotion/is-prop-valid@1.4.0)(@swc/helpers@0.5.18)(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@25.0.5)(@types/react@18.3.27)(better-sqlite3@12.4.1)(esbuild@0.25.12)(koa@2.16.4)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.44.1)(type-fest@4.41.0)(webpack-dev-server@4.15.2(webpack@5.104.1(esbuild@0.25.12))) + '@strapi/types': + specifier: catalog:strapi + version: 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@25.0.5)(better-sqlite3@12.4.1)(typescript@5.9.3) + devDependencies: + '@biomejs/biome': + specifier: ^2.3.11 + version: 2.3.11 + '@strapi/typescript-utils': + specifier: catalog:strapi + version: 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66 + '@types/bcryptjs': + specifier: ^2.4.6 + version: 2.4.6 + better-auth: + specifier: catalog:better-auth + version: 1.5.6(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vitest@4.1.0(@opentelemetry/api@1.9.0)(@types/node@25.0.5)(vite@6.4.1(@types/node@25.0.5)(jiti@1.21.7)(terser@5.44.1)(yaml@2.8.2))) + typescript: + specifier: ^5.9.3 + version: 5.9.3 + vitest: + specifier: ^4.1.0 + version: 4.1.0(@opentelemetry/api@1.9.0)(@types/node@25.0.5)(vite@6.4.1(@types/node@25.0.5)(jiti@1.21.7)(terser@5.44.1)(yaml@2.8.2)) + packages/plugin-api-permissions: dependencies: '@strapi/design-system': @@ -210,7 +244,7 @@ importers: version: link:../plugin-api-permissions '@strapi/strapi': specifier: catalog:strapi - version: 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@babel/preset-env@7.29.2(@babel/core@7.28.5))(@babel/runtime@7.28.4)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(@emotion/is-prop-valid@1.4.0)(@swc/helpers@0.5.18)(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@25.0.5)(@types/react@18.3.27)(better-sqlite3@12.4.1)(codemirror@5.65.20)(esbuild@0.25.12)(koa@2.16.4)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.44.1)(type-fest@4.41.0)(webpack-dev-server@4.15.2(webpack@5.104.1(esbuild@0.25.12))) + version: 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@babel/preset-env@7.29.2(@babel/core@7.28.5))(@emotion/is-prop-valid@1.4.0)(@swc/helpers@0.5.18)(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@25.0.5)(@types/react@18.3.27)(better-sqlite3@12.4.1)(esbuild@0.25.12)(koa@2.16.4)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.44.1)(type-fest@4.41.0)(webpack-dev-server@4.15.2(webpack@5.104.1(esbuild@0.25.12))) '@strapi/types': specifier: catalog:strapi version: 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@25.0.5)(better-sqlite3@12.4.1)(typescript@5.9.3) @@ -3500,6 +3534,10 @@ packages: '@sideway/pinpoint@2.0.0': resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} + '@simov/deep-extend@1.0.0': + resolution: {integrity: sha512-Arv8/ZPcdKAMJnNF8cks35mPq1y3JnwH1lWpfWDKlJoj+Vw2xmA4+oL7m9GVHTgdX0mGFR7bCPTBTGbxhnfJJw==} + engines: {node: '>=4.0.0'} + '@sinclair/typebox@0.27.10': resolution: {integrity: sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==} @@ -3664,6 +3702,16 @@ packages: resolution: {integrity: sha512-2rBNWEhNSzMt13C23hJjQQDTOt8ME0+VyiqivBAJtNHD3PIHQNw34Qp8e2QvWHdm659mNgRSkxK+wI/OyrPVKA==} engines: {node: '>=20.0.0 <=24.x.x', npm: '>=6.0.0'} + '@strapi/plugin-users-permissions@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66': + resolution: {integrity: sha512-R6WG4RZuGgC8JoAQEfaooAY14LQURAJk5+9abmScThsqtxfBqI7kTrKprF94wRyv7swPkPS2PdnWtgeFMOmUrg==} + engines: {node: '>=20.0.0 <=24.x.x', npm: '>=6.0.0'} + peerDependencies: + '@strapi/strapi': ^5.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router-dom: ^6.30.3 + styled-components: ^6.0.0 + '@strapi/provider-email-sendmail@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66': resolution: {integrity: sha512-8W3K9UxlVyguXAFZgjZPPxHCgE3lvX5lHDDrWjrAFGys3s4ikgY+ROi83xjzuEGc0LrGHG8G/LqxlPW9jguQNQ==} engines: {node: '>=20.0.0 <=24.x.x', npm: '>=6.0.0'} @@ -3958,6 +4006,9 @@ packages: '@types/babel__traverse@7.28.0': resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} + '@types/bcryptjs@2.4.6': + resolution: {integrity: sha512-9xlo6R2qDs5uixm0bcIqCeMCE6HiQsIyel9KQySStiyqNl2tnj2mP3DX1Nf56MD6KMenNNlBBsy3LJ7gUEQPXQ==} + '@types/body-parser@1.19.6': resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} @@ -4604,6 +4655,9 @@ packages: asap@2.0.6: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + asn1.js@5.4.1: + resolution: {integrity: sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==} + assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} @@ -4788,6 +4842,9 @@ packages: bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + bn.js@4.12.3: + resolution: {integrity: sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==} + body-parser@1.20.4: resolution: {integrity: sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} @@ -4831,6 +4888,9 @@ packages: broadcast-channel@3.7.0: resolution: {integrity: sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg==} + brorand@1.1.0: + resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} + browserslist-to-esbuild@1.2.0: resolution: {integrity: sha512-ftrrbI/VHBgEnmnSyhkqvQVMp6jAKybfs0qMIlm7SLBrQTGMsdCIP4q3BoKeLsZTBQllIQtY9kbxgRYV2WU47g==} engines: {node: '>=12'} @@ -5718,6 +5778,9 @@ packages: electron-to-chromium@1.5.267: resolution: {integrity: sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==} + elliptic@6.6.1: + resolution: {integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==} + emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} engines: {node: '>=12'} @@ -6418,6 +6481,10 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + grant@5.4.24: + resolution: {integrity: sha512-PD5AvSI7wgCBDi2mEd6M/TIe+70c/fVc3Ik4B0s4mloWTy9J800eUEcxivOiyqSP9wvBy2QjWq1JR8gOfDMnEg==} + engines: {node: '>=12.0.0'} + gray-matter@4.0.3: resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} engines: {node: '>=6.0'} @@ -6462,6 +6529,9 @@ packages: resolution: {integrity: sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hash.js@1.1.7: + resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} @@ -6507,6 +6577,9 @@ packages: hls.js@1.5.20: resolution: {integrity: sha512-uu0VXUK52JhihhnN/MVVo1lvqNNuhoxkonqgO3IpjvQiGpJBdIXMGkofjQb/j9zvV7a1SW8U9g1FslWx/1HOiQ==} + hmac-drbg@1.0.1: + resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} + hoist-non-react-statics@3.3.2: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} @@ -7066,6 +7139,15 @@ packages: jwa@1.4.2: resolution: {integrity: sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==} + jwa@2.0.1: + resolution: {integrity: sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==} + + jwk-to-pem@2.0.5: + resolution: {integrity: sha512-L90jwellhO8jRKYwbssU9ifaMVqajzj3fpRjDKcsDzrslU9syRbFqfkXtT4B89HYAap+xsxNcxgBSB09ig+a7A==} + + jwk-to-pem@2.0.7: + resolution: {integrity: sha512-cSVphrmWr6reVchuKQZdfSs4U9c5Y4hwZggPoz6cbVnTpAVgGRpEuQng86IyqLeGZlhTh+c4MAreB6KbdQDKHQ==} + jwks-rsa@3.1.0: resolution: {integrity: sha512-v7nqlfezb9YfHHzYII3ef2a2j1XnGeSE/bK3WfumaYCqONAIstJbrEGapz4kadScZzEt7zYCN7bucj8C0Mv/Rg==} engines: {node: '>=14'} @@ -7073,6 +7155,9 @@ packages: jws@3.2.3: resolution: {integrity: sha512-byiJ0FLRdLdSVSReO/U4E7RoEyOCKnEnEPMjq3HxWtvzLsV08/i5RQKsFVNkCldrCaPr2vDNAOMsfs8T/Hze7g==} + jws@4.0.1: + resolution: {integrity: sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==} + keygrip@1.1.0: resolution: {integrity: sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==} engines: {node: '>= 0.6'} @@ -7747,6 +7832,9 @@ packages: minimalistic-assert@1.0.1: resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + minimalistic-crypto-utils@1.0.1: + resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + minimatch@10.2.3: resolution: {integrity: sha512-Rwi3pnapEqirPSbWbrZaa6N3nmqq4Xer/2XooiOKyV3q12ML06f7MOuc5DVH8ONZIFhwIYQ3yzPH4nt7iWHaTg==} engines: {node: 18 || 20 || >=22} @@ -7858,6 +7946,9 @@ packages: resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} hasBin: true + multistream@4.1.0: + resolution: {integrity: sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==} + mute-stream@0.0.8: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} @@ -7997,6 +8088,9 @@ packages: peerDependencies: webpack: ^4.0.0 || ^5.0.0 + oauth-sign@0.9.0: + resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} + object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -8833,6 +8927,10 @@ packages: resolution: {integrity: sha512-LjgDO2zPtoXP2wJpDjZrGdojii1uqO0cnwKoIoUzkfS98HDmbeiGmYiXo3lXeFlq2xvne1QFQhwYXSUCLKtEuA==} engines: {node: '>=12.20'} + purest@4.0.2: + resolution: {integrity: sha512-Uq6kdia8zGVHOb/0zAOb7FvKFMKeyeTZTLEwpO0JR3cIFEkpH6asv3ls9M9URDjHiYIdgAPmht5ecSbvPacfyg==} + engines: {node: '>=12.0.0'} + qs@6.14.1: resolution: {integrity: sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==} engines: {node: '>=0.6'} @@ -9243,9 +9341,21 @@ packages: resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} engines: {node: '>=0.10'} + request-compose@2.1.7: + resolution: {integrity: sha512-27amNkWTK4Qq25XEwdmrhb4VLMiQzRSKuDfsy1o1griykcyXk5MxMHmJG+OKTRdO9PgsO7Kkn7GrEkq0UAIIMQ==} + engines: {node: '>=12.0.0'} + request-ip@3.3.0: resolution: {integrity: sha512-cA6Xh6e0fDBBBwH77SLJaJPBmD3nWVAcF9/XAcsrIHdjhFzFiB5aNQFytdjCGPezU3ROwrR11IddKAM08vohxA==} + request-multipart@1.0.0: + resolution: {integrity: sha512-dazx88T19dIKFNc0XdlZV8H46D2RmNFdR4mipcbrFOaN70PSSSMM3urVY+eVbrpraf/fHXccxFhLvG1wkSUtKQ==} + engines: {node: '>=8.0.0'} + + request-oauth@1.0.1: + resolution: {integrity: sha512-85THTg1RgOYtqQw42JON6AqvHLptlj1biw265Tsq4fD4cPdUvhDB2Qh9NTv17yCD322ROuO9aOmpc4GyayGVBA==} + engines: {node: '>=8.0.0'} + require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -10267,6 +10377,9 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + url-join@4.0.1: + resolution: {integrity: sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==} + url-loader@4.1.1: resolution: {integrity: sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==} engines: {node: '>= 10.13.0'} @@ -13477,18 +13590,6 @@ snapshots: dependencies: tslib: 2.8.1 - '@formatjs/intl@2.10.0(typescript@5.4.4)': - dependencies: - '@formatjs/ecma402-abstract': 1.18.2 - '@formatjs/fast-memoize': 2.2.0 - '@formatjs/icu-messageformat-parser': 2.7.6 - '@formatjs/intl-displaynames': 6.6.6 - '@formatjs/intl-listformat': 7.5.5 - intl-messageformat: 10.5.11 - tslib: 2.8.1 - optionalDependencies: - typescript: 5.4.4 - '@formatjs/intl@2.10.0(typescript@5.9.3)': dependencies: '@formatjs/ecma402-abstract': 1.18.2 @@ -14858,6 +14959,8 @@ snapshots: '@sideway/pinpoint@2.0.0': {} + '@simov/deep-extend@1.0.0': {} + '@sinclair/typebox@0.27.10': {} '@sindresorhus/is@4.6.0': {} @@ -15007,7 +15110,7 @@ snapshots: '@radix-ui/react-context': 1.0.1(@types/react@18.3.27)(react@18.3.1) '@radix-ui/react-toolbar': 1.0.4(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@reduxjs/toolkit': 1.9.7(react-redux@8.1.3(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(redux@4.2.1))(react@18.3.1) - '@strapi/data-transfer': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@20.19.37)(better-sqlite3@12.4.1)(typescript@5.9.3) + '@strapi/data-transfer': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@20.19.37)(better-sqlite3@12.4.1)(typescript@5.4.4) '@strapi/design-system': 2.1.2(@babel/runtime@7.28.4)(@codemirror/autocomplete@6.20.0)(@codemirror/language@6.12.1)(@codemirror/lint@6.9.2)(@codemirror/search@6.5.11)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(@strapi/icons@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(codemirror@5.65.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@strapi/icons': 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@strapi/permissions': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66 @@ -15101,7 +15204,7 @@ snapshots: - supports-color - tedious - '@strapi/admin@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@babel/runtime@7.28.4)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(@emotion/is-prop-valid@1.4.0)(@strapi/data-transfer@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@25.0.5)(better-sqlite3@12.4.1)(typescript@5.4.4))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@25.0.5)(@types/react@18.3.27)(better-sqlite3@12.4.1)(codemirror@5.65.20)(debug@4.3.4)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + '@strapi/admin@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@emotion/is-prop-valid@1.4.0)(@strapi/data-transfer@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@25.0.5)(better-sqlite3@12.4.1)(typescript@5.4.4))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@25.0.5)(@types/react@18.3.27)(better-sqlite3@12.4.1)(debug@4.3.4)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': dependencies: '@casl/ability': 6.7.5 '@internationalized/date': 3.5.4 @@ -15109,7 +15212,7 @@ snapshots: '@radix-ui/react-toolbar': 1.0.4(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@reduxjs/toolkit': 1.9.7(react-redux@8.1.3(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(redux@4.2.1))(react@18.3.1) '@strapi/data-transfer': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@25.0.5)(better-sqlite3@12.4.1)(typescript@5.4.4) - '@strapi/design-system': 2.1.2(@babel/runtime@7.28.4)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(@strapi/icons@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/react@18.3.27)(codemirror@5.65.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@strapi/design-system': 2.1.2(@strapi/icons@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@strapi/icons': 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@strapi/permissions': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66 '@strapi/types': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@25.0.5)(better-sqlite3@12.4.1)(typescript@5.4.4) @@ -15228,7 +15331,7 @@ snapshots: - debug - supports-color - '@strapi/content-manager@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(88180bbb747f1a663e1c80460137f499)': + '@strapi/content-manager@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(5a29c120345b3356cafd7b468df47f91)': dependencies: '@dnd-kit/core': 6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@dnd-kit/sortable': 10.0.0(@dnd-kit/core@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) @@ -15236,10 +15339,10 @@ snapshots: '@radix-ui/react-toolbar': 1.0.4(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@reduxjs/toolkit': 1.9.7(react-redux@8.1.3(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(redux@4.2.1))(react@18.3.1) '@sindresorhus/slugify': 1.1.0 - '@strapi/admin': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@babel/runtime@7.28.4)(@codemirror/autocomplete@6.20.0)(@codemirror/language@6.12.1)(@codemirror/lint@6.9.2)(@codemirror/search@6.5.11)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(@emotion/is-prop-valid@1.4.0)(@strapi/data-transfer@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@22.19.15)(typescript@5.4.4))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@22.19.15)(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(codemirror@5.65.20)(debug@4.3.4)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@strapi/admin': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@babel/runtime@7.28.4)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(@emotion/is-prop-valid@1.4.0)(@strapi/data-transfer@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@20.19.37)(better-sqlite3@12.4.1)(typescript@5.4.4))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@20.19.37)(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(better-sqlite3@12.4.1)(codemirror@5.65.20)(debug@4.3.4)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@strapi/design-system': 2.1.2(@babel/runtime@7.28.4)(@codemirror/autocomplete@6.20.0)(@codemirror/language@6.12.1)(@codemirror/lint@6.9.2)(@codemirror/search@6.5.11)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(@strapi/icons@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(codemirror@5.65.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@strapi/icons': 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@strapi/types': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@22.19.15)(typescript@5.4.4) + '@strapi/types': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@20.19.37)(better-sqlite3@12.4.1)(typescript@5.4.4) '@strapi/utils': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66 codemirror5: codemirror@5.65.20 date-fns: 2.30.0 @@ -15261,11 +15364,11 @@ snapshots: prismjs: 1.30.0 qs: 6.14.1 react: 18.3.1 - react-dnd: 16.0.1(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@22.19.15)(@types/react@18.3.27)(react@18.3.1) + react-dnd: 16.0.1(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@20.19.37)(@types/react@18.3.27)(react@18.3.1) react-dnd-html5-backend: 16.0.1 react-dom: 18.3.1(react@18.3.1) react-helmet: 6.1.0(react@18.3.1) - react-intl: 6.6.2(react@18.3.1)(typescript@5.4.4) + react-intl: 6.6.2(react@18.3.1)(typescript@5.9.3) react-query: 3.39.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-redux: 8.1.3(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(redux@4.2.1) react-router-dom: 6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -15302,7 +15405,7 @@ snapshots: - tedious - typescript - '@strapi/content-manager@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(c14cb639f3000434604628e7fdd36a04)': + '@strapi/content-manager@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(88180bbb747f1a663e1c80460137f499)': dependencies: '@dnd-kit/core': 6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@dnd-kit/sortable': 10.0.0(@dnd-kit/core@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) @@ -15310,10 +15413,10 @@ snapshots: '@radix-ui/react-toolbar': 1.0.4(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@reduxjs/toolkit': 1.9.7(react-redux@8.1.3(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(redux@4.2.1))(react@18.3.1) '@sindresorhus/slugify': 1.1.0 - '@strapi/admin': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@babel/runtime@7.28.4)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(@emotion/is-prop-valid@1.4.0)(@strapi/data-transfer@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@25.0.5)(better-sqlite3@12.4.1)(typescript@5.4.4))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@25.0.5)(@types/react@18.3.27)(better-sqlite3@12.4.1)(codemirror@5.65.20)(debug@4.3.4)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@strapi/design-system': 2.1.2(@babel/runtime@7.28.4)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(@strapi/icons@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/react@18.3.27)(codemirror@5.65.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@strapi/admin': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@babel/runtime@7.28.4)(@codemirror/autocomplete@6.20.0)(@codemirror/language@6.12.1)(@codemirror/lint@6.9.2)(@codemirror/search@6.5.11)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(@emotion/is-prop-valid@1.4.0)(@strapi/data-transfer@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@22.19.15)(typescript@5.4.4))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@22.19.15)(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(codemirror@5.65.20)(debug@4.3.4)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@strapi/design-system': 2.1.2(@babel/runtime@7.28.4)(@codemirror/autocomplete@6.20.0)(@codemirror/language@6.12.1)(@codemirror/lint@6.9.2)(@codemirror/search@6.5.11)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(@strapi/icons@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(codemirror@5.65.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@strapi/icons': 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@strapi/types': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@25.0.5)(better-sqlite3@12.4.1)(typescript@5.4.4) + '@strapi/types': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@22.19.15)(typescript@5.4.4) '@strapi/utils': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66 codemirror5: codemirror@5.65.20 date-fns: 2.30.0 @@ -15335,7 +15438,7 @@ snapshots: prismjs: 1.30.0 qs: 6.14.1 react: 18.3.1 - react-dnd: 16.0.1(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@25.0.5)(@types/react@18.3.27)(react@18.3.1) + react-dnd: 16.0.1(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@22.19.15)(@types/react@18.3.27)(react@18.3.1) react-dnd-html5-backend: 16.0.1 react-dom: 18.3.1(react@18.3.1) react-helmet: 6.1.0(react@18.3.1) @@ -15376,7 +15479,7 @@ snapshots: - tedious - typescript - '@strapi/content-manager@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(e896166f0b90569e59d995b27bb2a36f)': + '@strapi/content-manager@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@strapi/admin@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@emotion/is-prop-valid@1.4.0)(@strapi/data-transfer@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@25.0.5)(better-sqlite3@12.4.1)(typescript@5.4.4))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@25.0.5)(@types/react@18.3.27)(better-sqlite3@12.4.1)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@25.0.5)(@types/react@18.3.27)(better-sqlite3@12.4.1)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.4.4)': dependencies: '@dnd-kit/core': 6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@dnd-kit/sortable': 10.0.0(@dnd-kit/core@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) @@ -15384,10 +15487,10 @@ snapshots: '@radix-ui/react-toolbar': 1.0.4(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@reduxjs/toolkit': 1.9.7(react-redux@8.1.3(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(redux@4.2.1))(react@18.3.1) '@sindresorhus/slugify': 1.1.0 - '@strapi/admin': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@babel/runtime@7.28.4)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(@emotion/is-prop-valid@1.4.0)(@strapi/data-transfer@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@20.19.37)(better-sqlite3@12.4.1)(typescript@5.4.4))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@20.19.37)(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(better-sqlite3@12.4.1)(codemirror@5.65.20)(debug@4.3.4)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@strapi/design-system': 2.1.2(@babel/runtime@7.28.4)(@codemirror/autocomplete@6.20.0)(@codemirror/language@6.12.1)(@codemirror/lint@6.9.2)(@codemirror/search@6.5.11)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(@strapi/icons@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(codemirror@5.65.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@strapi/admin': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@emotion/is-prop-valid@1.4.0)(@strapi/data-transfer@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@25.0.5)(better-sqlite3@12.4.1)(typescript@5.4.4))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@25.0.5)(@types/react@18.3.27)(better-sqlite3@12.4.1)(debug@4.3.4)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@strapi/design-system': 2.1.2(@strapi/icons@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@strapi/icons': 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@strapi/types': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@20.19.37)(better-sqlite3@12.4.1)(typescript@5.4.4) + '@strapi/types': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@25.0.5)(better-sqlite3@12.4.1)(typescript@5.4.4) '@strapi/utils': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66 codemirror5: codemirror@5.65.20 date-fns: 2.30.0 @@ -15409,7 +15512,7 @@ snapshots: prismjs: 1.30.0 qs: 6.14.1 react: 18.3.1 - react-dnd: 16.0.1(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@20.19.37)(@types/react@18.3.27)(react@18.3.1) + react-dnd: 16.0.1(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@25.0.5)(@types/react@18.3.27)(react@18.3.1) react-dnd-html5-backend: 16.0.1 react-dom: 18.3.1(react@18.3.1) react-helmet: 6.1.0(react@18.3.1) @@ -15450,15 +15553,15 @@ snapshots: - tedious - typescript - '@strapi/content-releases@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(93d35792eee73c7a9d10a54cefc84cb0)': + '@strapi/content-releases@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(c109d509cf47c7acd624fdbda7c41e20)': dependencies: '@reduxjs/toolkit': 1.9.7(react-redux@8.1.3(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(redux@4.2.1))(react@18.3.1) - '@strapi/admin': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@babel/runtime@7.28.4)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(@emotion/is-prop-valid@1.4.0)(@strapi/data-transfer@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@20.19.37)(better-sqlite3@12.4.1)(typescript@5.4.4))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@20.19.37)(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(better-sqlite3@12.4.1)(codemirror@5.65.20)(debug@4.3.4)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@strapi/content-manager': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(e896166f0b90569e59d995b27bb2a36f) - '@strapi/database': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@20.19.37)(better-sqlite3@12.4.1) - '@strapi/design-system': 2.1.2(@babel/runtime@7.28.4)(@codemirror/autocomplete@6.20.0)(@codemirror/language@6.12.1)(@codemirror/lint@6.9.2)(@codemirror/search@6.5.11)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(@strapi/icons@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(codemirror@5.65.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@strapi/admin': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@emotion/is-prop-valid@1.4.0)(@strapi/data-transfer@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@25.0.5)(better-sqlite3@12.4.1)(typescript@5.4.4))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@25.0.5)(@types/react@18.3.27)(better-sqlite3@12.4.1)(debug@4.3.4)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@strapi/content-manager': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@strapi/admin@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@emotion/is-prop-valid@1.4.0)(@strapi/data-transfer@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@25.0.5)(better-sqlite3@12.4.1)(typescript@5.4.4))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@25.0.5)(@types/react@18.3.27)(better-sqlite3@12.4.1)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@25.0.5)(@types/react@18.3.27)(better-sqlite3@12.4.1)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.4.4) + '@strapi/database': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@25.0.5)(better-sqlite3@12.4.1) + '@strapi/design-system': 2.1.2(@strapi/icons@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@strapi/icons': 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@strapi/types': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@20.19.37)(better-sqlite3@12.4.1)(typescript@5.4.4) + '@strapi/types': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@25.0.5)(better-sqlite3@12.4.1)(typescript@5.4.4) '@strapi/utils': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66 date-fns: 2.30.0 date-fns-tz: 2.0.1(date-fns@2.30.0) @@ -15544,15 +15647,15 @@ snapshots: - tedious - typescript - '@strapi/content-releases@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(e07ce3dc41652f90e84819fd8b09599d)': + '@strapi/content-releases@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(eb6e8de440432bebdf501728a50c21e3)': dependencies: '@reduxjs/toolkit': 1.9.7(react-redux@8.1.3(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(redux@4.2.1))(react@18.3.1) - '@strapi/admin': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@babel/runtime@7.28.4)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(@emotion/is-prop-valid@1.4.0)(@strapi/data-transfer@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@25.0.5)(better-sqlite3@12.4.1)(typescript@5.4.4))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@25.0.5)(@types/react@18.3.27)(better-sqlite3@12.4.1)(codemirror@5.65.20)(debug@4.3.4)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@strapi/content-manager': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(c14cb639f3000434604628e7fdd36a04) - '@strapi/database': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@25.0.5)(better-sqlite3@12.4.1) - '@strapi/design-system': 2.1.2(@babel/runtime@7.28.4)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(@strapi/icons@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/react@18.3.27)(codemirror@5.65.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@strapi/admin': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@babel/runtime@7.28.4)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(@emotion/is-prop-valid@1.4.0)(@strapi/data-transfer@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@20.19.37)(better-sqlite3@12.4.1)(typescript@5.4.4))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@20.19.37)(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(better-sqlite3@12.4.1)(codemirror@5.65.20)(debug@4.3.4)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@strapi/content-manager': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(5a29c120345b3356cafd7b468df47f91) + '@strapi/database': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@20.19.37)(better-sqlite3@12.4.1) + '@strapi/design-system': 2.1.2(@babel/runtime@7.28.4)(@codemirror/autocomplete@6.20.0)(@codemirror/language@6.12.1)(@codemirror/lint@6.9.2)(@codemirror/search@6.5.11)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(@strapi/icons@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(codemirror@5.65.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@strapi/icons': 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@strapi/types': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@25.0.5)(better-sqlite3@12.4.1)(typescript@5.4.4) + '@strapi/types': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@20.19.37)(better-sqlite3@12.4.1)(typescript@5.4.4) '@strapi/utils': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66 date-fns: 2.30.0 date-fns-tz: 2.0.1(date-fns@2.30.0) @@ -15591,7 +15694,7 @@ snapshots: - tedious - typescript - '@strapi/content-type-builder@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(bd71796090aa897bd71ab49dee6d0e4e)': + '@strapi/content-type-builder@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(79cc7be3941ae91380bbdfc22237b92c)': dependencies: '@ai-sdk/react': 2.0.120(react@18.3.1)(zod@3.25.67) '@dnd-kit/core': 6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -15600,9 +15703,9 @@ snapshots: '@dnd-kit/utilities': 3.2.2(react@18.3.1) '@reduxjs/toolkit': 1.9.7(react-redux@8.1.3(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(redux@4.2.1))(react@18.3.1) '@sindresorhus/slugify': 1.1.0 - '@strapi/admin': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@babel/runtime@7.28.4)(@codemirror/autocomplete@6.20.0)(@codemirror/language@6.12.1)(@codemirror/lint@6.9.2)(@codemirror/search@6.5.11)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(@emotion/is-prop-valid@1.4.0)(@strapi/data-transfer@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@22.19.15)(typescript@5.4.4))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@22.19.15)(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(codemirror@5.65.20)(debug@4.3.4)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@strapi/admin': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@babel/runtime@7.28.4)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(@emotion/is-prop-valid@1.4.0)(@strapi/data-transfer@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@20.19.37)(better-sqlite3@12.4.1)(typescript@5.4.4))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@20.19.37)(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(better-sqlite3@12.4.1)(codemirror@5.65.20)(debug@4.3.4)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@strapi/design-system': 2.1.2(@babel/runtime@7.28.4)(@codemirror/autocomplete@6.20.0)(@codemirror/language@6.12.1)(@codemirror/lint@6.9.2)(@codemirror/search@6.5.11)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(@strapi/icons@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(codemirror@5.65.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@strapi/generators': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@babel/preset-env@7.29.2(@babel/core@7.28.5))(@types/node@22.19.15) + '@strapi/generators': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@babel/preset-env@7.29.2(@babel/core@7.28.5))(@types/node@20.19.37) '@strapi/icons': 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@strapi/utils': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66 ai: 5.0.52(zod@3.25.67) @@ -15643,7 +15746,7 @@ snapshots: - supports-color - typescript - '@strapi/content-type-builder@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(d187309ba4a19747f90e8fa03e675a64)': + '@strapi/content-type-builder@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@babel/preset-env@7.29.2(@babel/core@7.28.5))(@strapi/admin@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@emotion/is-prop-valid@1.4.0)(@strapi/data-transfer@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@25.0.5)(better-sqlite3@12.4.1)(typescript@5.4.4))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@25.0.5)(@types/react@18.3.27)(better-sqlite3@12.4.1)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/node@25.0.5)(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.4.4)': dependencies: '@ai-sdk/react': 2.0.120(react@18.3.1)(zod@3.25.67) '@dnd-kit/core': 6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -15652,8 +15755,8 @@ snapshots: '@dnd-kit/utilities': 3.2.2(react@18.3.1) '@reduxjs/toolkit': 1.9.7(react-redux@8.1.3(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(redux@4.2.1))(react@18.3.1) '@sindresorhus/slugify': 1.1.0 - '@strapi/admin': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@babel/runtime@7.28.4)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(@emotion/is-prop-valid@1.4.0)(@strapi/data-transfer@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@25.0.5)(better-sqlite3@12.4.1)(typescript@5.4.4))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@25.0.5)(@types/react@18.3.27)(better-sqlite3@12.4.1)(codemirror@5.65.20)(debug@4.3.4)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@strapi/design-system': 2.1.2(@babel/runtime@7.28.4)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(@strapi/icons@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/react@18.3.27)(codemirror@5.65.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@strapi/admin': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@emotion/is-prop-valid@1.4.0)(@strapi/data-transfer@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@25.0.5)(better-sqlite3@12.4.1)(typescript@5.4.4))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@25.0.5)(@types/react@18.3.27)(better-sqlite3@12.4.1)(debug@4.3.4)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@strapi/design-system': 2.1.2(@strapi/icons@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@strapi/generators': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@babel/preset-env@7.29.2(@babel/core@7.28.5))(@types/node@25.0.5) '@strapi/icons': 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@strapi/utils': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66 @@ -15695,7 +15798,7 @@ snapshots: - supports-color - typescript - '@strapi/content-type-builder@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(ef23b0ce18ee62a3a0fa91e704161782)': + '@strapi/content-type-builder@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(bd71796090aa897bd71ab49dee6d0e4e)': dependencies: '@ai-sdk/react': 2.0.120(react@18.3.1)(zod@3.25.67) '@dnd-kit/core': 6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -15704,9 +15807,9 @@ snapshots: '@dnd-kit/utilities': 3.2.2(react@18.3.1) '@reduxjs/toolkit': 1.9.7(react-redux@8.1.3(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(redux@4.2.1))(react@18.3.1) '@sindresorhus/slugify': 1.1.0 - '@strapi/admin': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@babel/runtime@7.28.4)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(@emotion/is-prop-valid@1.4.0)(@strapi/data-transfer@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@20.19.37)(better-sqlite3@12.4.1)(typescript@5.4.4))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@20.19.37)(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(better-sqlite3@12.4.1)(codemirror@5.65.20)(debug@4.3.4)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@strapi/admin': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@babel/runtime@7.28.4)(@codemirror/autocomplete@6.20.0)(@codemirror/language@6.12.1)(@codemirror/lint@6.9.2)(@codemirror/search@6.5.11)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(@emotion/is-prop-valid@1.4.0)(@strapi/data-transfer@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@22.19.15)(typescript@5.4.4))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@22.19.15)(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(codemirror@5.65.20)(debug@4.3.4)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@strapi/design-system': 2.1.2(@babel/runtime@7.28.4)(@codemirror/autocomplete@6.20.0)(@codemirror/language@6.12.1)(@codemirror/lint@6.9.2)(@codemirror/search@6.5.11)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(@strapi/icons@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(codemirror@5.65.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@strapi/generators': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@babel/preset-env@7.29.2(@babel/core@7.28.5))(@types/node@20.19.37) + '@strapi/generators': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@babel/preset-env@7.29.2(@babel/core@7.28.5))(@types/node@22.19.15) '@strapi/icons': 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@strapi/utils': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66 ai: 5.0.52(zod@3.25.67) @@ -15933,12 +16036,12 @@ snapshots: - supports-color - tedious - '@strapi/core@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@babel/preset-env@7.29.2(@babel/core@7.28.5))(@babel/runtime@7.28.4)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(@emotion/is-prop-valid@1.4.0)(@strapi/data-transfer@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@25.0.5)(better-sqlite3@12.4.1)(typescript@5.4.4))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@25.0.5)(@types/react@18.3.27)(better-sqlite3@12.4.1)(codemirror@5.65.20)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + '@strapi/core@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@babel/preset-env@7.29.2(@babel/core@7.28.5))(@emotion/is-prop-valid@1.4.0)(@strapi/data-transfer@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@25.0.5)(better-sqlite3@12.4.1)(typescript@5.4.4))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@25.0.5)(@types/react@18.3.27)(better-sqlite3@12.4.1)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': dependencies: '@koa/cors': 5.0.0 '@koa/router': 12.0.2 '@paralleldrive/cuid2': 2.2.2 - '@strapi/admin': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@babel/runtime@7.28.4)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(@emotion/is-prop-valid@1.4.0)(@strapi/data-transfer@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@25.0.5)(better-sqlite3@12.4.1)(typescript@5.4.4))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@25.0.5)(@types/react@18.3.27)(better-sqlite3@12.4.1)(codemirror@5.65.20)(debug@4.3.4)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@strapi/admin': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@emotion/is-prop-valid@1.4.0)(@strapi/data-transfer@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@25.0.5)(better-sqlite3@12.4.1)(typescript@5.4.4))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@25.0.5)(@types/react@18.3.27)(better-sqlite3@12.4.1)(debug@4.3.4)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@strapi/database': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@25.0.5)(better-sqlite3@12.4.1) '@strapi/generators': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@babel/preset-env@7.29.2(@babel/core@7.28.5))(@types/node@25.0.5) '@strapi/logger': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66 @@ -16026,7 +16129,7 @@ snapshots: - supports-color - tedious - '@strapi/data-transfer@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@20.19.37)(better-sqlite3@12.4.1)(typescript@5.9.3)': + '@strapi/data-transfer@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@20.19.37)(better-sqlite3@12.4.1)(typescript@5.4.4)': dependencies: '@strapi/logger': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66 '@strapi/types': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@20.19.37)(better-sqlite3@12.4.1)(typescript@5.4.4) @@ -16238,7 +16341,7 @@ snapshots: - '@types/react-dom' - codemirror - '@strapi/design-system@2.1.2(@babel/runtime@7.28.4)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(@strapi/icons@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/react@18.3.27)(codemirror@5.65.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + '@strapi/design-system@2.1.2(@strapi/icons@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': dependencies: '@codemirror/lang-json': 6.0.1 '@floating-ui/react-dom': 2.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -16326,7 +16429,7 @@ snapshots: - '@types/react-dom' - codemirror - '@strapi/email@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(ab00eefd9cd076d5350647f8c1d5a816)': + '@strapi/email@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(7727a761cfb0834c77451a299c2cb029)': dependencies: '@strapi/admin': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@babel/runtime@7.28.4)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(@emotion/is-prop-valid@1.4.0)(@strapi/data-transfer@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@20.19.37)(better-sqlite3@12.4.1)(typescript@5.4.4))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@20.19.37)(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(better-sqlite3@12.4.1)(codemirror@5.65.20)(debug@4.3.4)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@strapi/design-system': 2.1.2(@babel/runtime@7.28.4)(@codemirror/autocomplete@6.20.0)(@codemirror/language@6.12.1)(@codemirror/lint@6.9.2)(@codemirror/search@6.5.11)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(@strapi/icons@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(codemirror@5.65.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) @@ -16362,10 +16465,10 @@ snapshots: - sequelize - typescript - '@strapi/email@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(bc0b8f063491cecfc56bb17013f17caf)': + '@strapi/email@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@strapi/admin@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@emotion/is-prop-valid@1.4.0)(@strapi/data-transfer@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@25.0.5)(better-sqlite3@12.4.1)(typescript@5.4.4))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@25.0.5)(@types/react@18.3.27)(better-sqlite3@12.4.1)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/react@18.3.27)(koa@2.16.4)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.4.4)': dependencies: - '@strapi/admin': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@babel/runtime@7.28.4)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(@emotion/is-prop-valid@1.4.0)(@strapi/data-transfer@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@25.0.5)(better-sqlite3@12.4.1)(typescript@5.4.4))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@25.0.5)(@types/react@18.3.27)(better-sqlite3@12.4.1)(codemirror@5.65.20)(debug@4.3.4)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@strapi/design-system': 2.1.2(@babel/runtime@7.28.4)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(@strapi/icons@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/react@18.3.27)(codemirror@5.65.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@strapi/admin': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@emotion/is-prop-valid@1.4.0)(@strapi/data-transfer@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@25.0.5)(better-sqlite3@12.4.1)(typescript@5.4.4))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@25.0.5)(@types/react@18.3.27)(better-sqlite3@12.4.1)(debug@4.3.4)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@strapi/design-system': 2.1.2(@strapi/icons@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@strapi/icons': 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@strapi/provider-email-sendmail': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66 '@strapi/utils': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66 @@ -16488,12 +16591,12 @@ snapshots: - '@types/node' - supports-color - '@strapi/i18n@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(9b380c9455c736b1386db7b52f2e8dd6)': + '@strapi/i18n@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(31fed7a030e6a68c53d970108b995a5d)': dependencies: '@reduxjs/toolkit': 1.9.7(react-redux@8.1.3(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(redux@4.2.1))(react@18.3.1) - '@strapi/admin': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@babel/runtime@7.28.4)(@codemirror/autocomplete@6.20.0)(@codemirror/language@6.12.1)(@codemirror/lint@6.9.2)(@codemirror/search@6.5.11)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(@emotion/is-prop-valid@1.4.0)(@strapi/data-transfer@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@22.19.15)(typescript@5.4.4))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@22.19.15)(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(codemirror@5.65.20)(debug@4.3.4)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@strapi/content-manager': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(88180bbb747f1a663e1c80460137f499) - '@strapi/design-system': 2.1.2(@babel/runtime@7.28.4)(@codemirror/autocomplete@6.20.0)(@codemirror/language@6.12.1)(@codemirror/lint@6.9.2)(@codemirror/search@6.5.11)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(@strapi/icons@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(codemirror@5.65.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@strapi/admin': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@emotion/is-prop-valid@1.4.0)(@strapi/data-transfer@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@25.0.5)(better-sqlite3@12.4.1)(typescript@5.4.4))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@25.0.5)(@types/react@18.3.27)(better-sqlite3@12.4.1)(debug@4.3.4)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@strapi/content-manager': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@strapi/admin@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@emotion/is-prop-valid@1.4.0)(@strapi/data-transfer@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@25.0.5)(better-sqlite3@12.4.1)(typescript@5.4.4))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@25.0.5)(@types/react@18.3.27)(better-sqlite3@12.4.1)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@25.0.5)(@types/react@18.3.27)(better-sqlite3@12.4.1)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.4.4) + '@strapi/design-system': 2.1.2(@strapi/icons@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@strapi/icons': 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@strapi/utils': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66 lodash: 4.17.23 @@ -16522,11 +16625,11 @@ snapshots: - redux - typescript - '@strapi/i18n@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(b8fc11a174e07fc4b65c4ca44038a0be)': + '@strapi/i18n@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(991e80c46d7658a6bb295049afc62133)': dependencies: '@reduxjs/toolkit': 1.9.7(react-redux@8.1.3(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(redux@4.2.1))(react@18.3.1) '@strapi/admin': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@babel/runtime@7.28.4)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(@emotion/is-prop-valid@1.4.0)(@strapi/data-transfer@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@20.19.37)(better-sqlite3@12.4.1)(typescript@5.4.4))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@20.19.37)(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(better-sqlite3@12.4.1)(codemirror@5.65.20)(debug@4.3.4)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@strapi/content-manager': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(e896166f0b90569e59d995b27bb2a36f) + '@strapi/content-manager': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(5a29c120345b3356cafd7b468df47f91) '@strapi/design-system': 2.1.2(@babel/runtime@7.28.4)(@codemirror/autocomplete@6.20.0)(@codemirror/language@6.12.1)(@codemirror/lint@6.9.2)(@codemirror/search@6.5.11)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(@strapi/icons@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(codemirror@5.65.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@strapi/icons': 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@strapi/utils': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66 @@ -16556,12 +16659,12 @@ snapshots: - redux - typescript - '@strapi/i18n@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(bedd715739f48cbe756cfb7b1b317b9a)': + '@strapi/i18n@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(9b380c9455c736b1386db7b52f2e8dd6)': dependencies: '@reduxjs/toolkit': 1.9.7(react-redux@8.1.3(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(redux@4.2.1))(react@18.3.1) - '@strapi/admin': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@babel/runtime@7.28.4)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(@emotion/is-prop-valid@1.4.0)(@strapi/data-transfer@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@25.0.5)(better-sqlite3@12.4.1)(typescript@5.4.4))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@25.0.5)(@types/react@18.3.27)(better-sqlite3@12.4.1)(codemirror@5.65.20)(debug@4.3.4)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@strapi/content-manager': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(c14cb639f3000434604628e7fdd36a04) - '@strapi/design-system': 2.1.2(@babel/runtime@7.28.4)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(@strapi/icons@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/react@18.3.27)(codemirror@5.65.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@strapi/admin': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@babel/runtime@7.28.4)(@codemirror/autocomplete@6.20.0)(@codemirror/language@6.12.1)(@codemirror/lint@6.9.2)(@codemirror/search@6.5.11)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(@emotion/is-prop-valid@1.4.0)(@strapi/data-transfer@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@22.19.15)(typescript@5.4.4))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@22.19.15)(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(codemirror@5.65.20)(debug@4.3.4)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@strapi/content-manager': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(88180bbb747f1a663e1c80460137f499) + '@strapi/design-system': 2.1.2(@babel/runtime@7.28.4)(@codemirror/autocomplete@6.20.0)(@codemirror/language@6.12.1)(@codemirror/lint@6.9.2)(@codemirror/search@6.5.11)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(@strapi/icons@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(codemirror@5.65.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@strapi/icons': 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@strapi/utils': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66 lodash: 4.17.23 @@ -16623,6 +16726,53 @@ snapshots: qs: 6.14.1 sift: 16.0.1 + '@strapi/plugin-users-permissions@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(332101d68cfbb4b1a4b5d46258fadd7f)': + dependencies: + '@strapi/design-system': 2.1.2(@babel/runtime@7.28.4)(@codemirror/autocomplete@6.20.0)(@codemirror/language@6.12.1)(@codemirror/lint@6.9.2)(@codemirror/search@6.5.11)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(@strapi/icons@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(codemirror@5.65.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@strapi/icons': 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@strapi/strapi': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@babel/preset-env@7.29.2(@babel/core@7.28.5))(@babel/runtime@7.28.4)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(@emotion/is-prop-valid@1.4.0)(@swc/helpers@0.5.18)(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@20.19.37)(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(better-sqlite3@12.4.1)(codemirror@5.65.20)(esbuild@0.25.12)(koa@2.16.4)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.44.1)(type-fest@4.41.0)(webpack-dev-server@4.15.2(webpack@5.104.1(esbuild@0.25.12))) + '@strapi/utils': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66 + bcryptjs: 2.4.3 + formik: 2.4.5(@types/react@18.3.27)(react@18.3.1) + grant: 5.4.24 + immer: 9.0.21 + jsonwebtoken: 9.0.0 + jwk-to-pem: 2.0.5 + koa: 2.16.3 + koa2-ratelimit: 1.1.3 + lodash: 4.17.23 + prop-types: 15.8.1 + purest: 4.0.2 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-intl: 6.6.2(react@18.3.1)(typescript@5.9.3) + react-query: 3.39.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-redux: 8.1.3(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(redux@4.2.1) + react-router-dom: 6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + styled-components: 6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + url-join: 4.0.1 + yup: 0.32.9 + zod: 3.25.67 + transitivePeerDependencies: + - '@babel/runtime' + - '@codemirror/autocomplete' + - '@codemirror/language' + - '@codemirror/lint' + - '@codemirror/search' + - '@codemirror/state' + - '@codemirror/theme-one-dark' + - '@codemirror/view' + - '@types/react' + - '@types/react-dom' + - codemirror + - mongoose + - react-native + - redis + - redux + - sequelize + - supports-color + - typescript + '@strapi/provider-email-sendmail@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66': dependencies: '@strapi/utils': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66 @@ -16670,11 +16820,11 @@ snapshots: - redux - typescript - '@strapi/review-workflows@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(39e114555c79088335d052105021d41b)': + '@strapi/review-workflows@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(4d65bd5b8e13c9b7f3ef5bad36466793)': dependencies: '@reduxjs/toolkit': 1.9.7(react-redux@8.1.3(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(redux@4.2.1))(react@18.3.1) '@strapi/admin': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@babel/runtime@7.28.4)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(@emotion/is-prop-valid@1.4.0)(@strapi/data-transfer@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@20.19.37)(better-sqlite3@12.4.1)(typescript@5.4.4))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@20.19.37)(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(better-sqlite3@12.4.1)(codemirror@5.65.20)(debug@4.3.4)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@strapi/content-manager': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(e896166f0b90569e59d995b27bb2a36f) + '@strapi/content-manager': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(5a29c120345b3356cafd7b468df47f91) '@strapi/design-system': 2.1.2(@babel/runtime@7.28.4)(@codemirror/autocomplete@6.20.0)(@codemirror/language@6.12.1)(@codemirror/lint@6.9.2)(@codemirror/search@6.5.11)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(@strapi/icons@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(codemirror@5.65.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@strapi/icons': 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@strapi/utils': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66 @@ -16707,12 +16857,12 @@ snapshots: - redux - typescript - '@strapi/review-workflows@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(f5f4e13decf780e67ae4087a552b16ae)': + '@strapi/review-workflows@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(c601b960e5763962058f9c33cfa94e17)': dependencies: '@reduxjs/toolkit': 1.9.7(react-redux@8.1.3(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(redux@4.2.1))(react@18.3.1) - '@strapi/admin': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@babel/runtime@7.28.4)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(@emotion/is-prop-valid@1.4.0)(@strapi/data-transfer@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@25.0.5)(better-sqlite3@12.4.1)(typescript@5.4.4))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@25.0.5)(@types/react@18.3.27)(better-sqlite3@12.4.1)(codemirror@5.65.20)(debug@4.3.4)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@strapi/content-manager': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(c14cb639f3000434604628e7fdd36a04) - '@strapi/design-system': 2.1.2(@babel/runtime@7.28.4)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(@strapi/icons@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/react@18.3.27)(codemirror@5.65.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@strapi/admin': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@emotion/is-prop-valid@1.4.0)(@strapi/data-transfer@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@25.0.5)(better-sqlite3@12.4.1)(typescript@5.4.4))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@25.0.5)(@types/react@18.3.27)(better-sqlite3@12.4.1)(debug@4.3.4)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@strapi/content-manager': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@strapi/admin@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@emotion/is-prop-valid@1.4.0)(@strapi/data-transfer@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@25.0.5)(better-sqlite3@12.4.1)(typescript@5.4.4))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@25.0.5)(@types/react@18.3.27)(better-sqlite3@12.4.1)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@25.0.5)(@types/react@18.3.27)(better-sqlite3@12.4.1)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.4.4) + '@strapi/design-system': 2.1.2(@strapi/icons@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@strapi/icons': 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@strapi/utils': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66 fractional-indexing: 3.2.0 @@ -16947,22 +17097,22 @@ snapshots: '@pmmmwh/react-refresh-webpack-plugin': 0.5.15(react-refresh@0.14.0)(type-fest@4.41.0)(webpack-dev-server@4.15.2(webpack@5.104.1(esbuild@0.25.12)))(webpack-hot-middleware@2.26.1)(webpack@5.104.1(esbuild@0.25.12)) '@strapi/admin': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@babel/runtime@7.28.4)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(@emotion/is-prop-valid@1.4.0)(@strapi/data-transfer@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@20.19.37)(better-sqlite3@12.4.1)(typescript@5.4.4))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@20.19.37)(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(better-sqlite3@12.4.1)(codemirror@5.65.20)(debug@4.3.4)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@strapi/cloud-cli': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66 - '@strapi/content-manager': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(e896166f0b90569e59d995b27bb2a36f) - '@strapi/content-releases': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(93d35792eee73c7a9d10a54cefc84cb0) - '@strapi/content-type-builder': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(ef23b0ce18ee62a3a0fa91e704161782) + '@strapi/content-manager': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(5a29c120345b3356cafd7b468df47f91) + '@strapi/content-releases': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(eb6e8de440432bebdf501728a50c21e3) + '@strapi/content-type-builder': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(79cc7be3941ae91380bbdfc22237b92c) '@strapi/core': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@babel/preset-env@7.29.2(@babel/core@7.28.5))(@babel/runtime@7.28.4)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(@emotion/is-prop-valid@1.4.0)(@strapi/data-transfer@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@20.19.37)(better-sqlite3@12.4.1)(typescript@5.4.4))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@20.19.37)(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(better-sqlite3@12.4.1)(codemirror@5.65.20)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@strapi/data-transfer': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@20.19.37)(better-sqlite3@12.4.1)(typescript@5.9.3) + '@strapi/data-transfer': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@20.19.37)(better-sqlite3@12.4.1)(typescript@5.4.4) '@strapi/database': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@20.19.37)(better-sqlite3@12.4.1) - '@strapi/email': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(ab00eefd9cd076d5350647f8c1d5a816) + '@strapi/email': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(7727a761cfb0834c77451a299c2cb029) '@strapi/generators': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@babel/preset-env@7.29.2(@babel/core@7.28.5))(@types/node@20.19.37) - '@strapi/i18n': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(b8fc11a174e07fc4b65c4ca44038a0be) + '@strapi/i18n': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(991e80c46d7658a6bb295049afc62133) '@strapi/logger': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66 '@strapi/openapi': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66 '@strapi/permissions': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66 - '@strapi/review-workflows': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(39e114555c79088335d052105021d41b) + '@strapi/review-workflows': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(4d65bd5b8e13c9b7f3ef5bad36466793) '@strapi/types': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@20.19.37)(better-sqlite3@12.4.1)(typescript@5.4.4) '@strapi/typescript-utils': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66 - '@strapi/upload': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(e896166f0b90569e59d995b27bb2a36f) + '@strapi/upload': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(5a29c120345b3356cafd7b468df47f91) '@strapi/utils': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66 '@types/nodemon': 1.19.6 '@vitejs/plugin-react-swc': 3.6.0(@swc/helpers@0.5.18)(vite@5.4.21(@types/node@20.19.37)(terser@5.44.1)) @@ -17064,27 +17214,27 @@ snapshots: - webpack-dev-server - webpack-plugin-serve - '@strapi/strapi@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@babel/preset-env@7.29.2(@babel/core@7.28.5))(@babel/runtime@7.28.4)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(@emotion/is-prop-valid@1.4.0)(@swc/helpers@0.5.18)(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@25.0.5)(@types/react@18.3.27)(better-sqlite3@12.4.1)(codemirror@5.65.20)(esbuild@0.25.12)(koa@2.16.4)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.44.1)(type-fest@4.41.0)(webpack-dev-server@4.15.2(webpack@5.104.1(esbuild@0.25.12)))': + '@strapi/strapi@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@babel/preset-env@7.29.2(@babel/core@7.28.5))(@emotion/is-prop-valid@1.4.0)(@swc/helpers@0.5.18)(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@25.0.5)(@types/react@18.3.27)(better-sqlite3@12.4.1)(esbuild@0.25.12)(koa@2.16.4)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.44.1)(type-fest@4.41.0)(webpack-dev-server@4.15.2(webpack@5.104.1(esbuild@0.25.12)))': dependencies: '@pmmmwh/react-refresh-webpack-plugin': 0.5.15(react-refresh@0.14.0)(type-fest@4.41.0)(webpack-dev-server@4.15.2(webpack@5.104.1(esbuild@0.25.12)))(webpack-hot-middleware@2.26.1)(webpack@5.104.1(esbuild@0.25.12)) - '@strapi/admin': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@babel/runtime@7.28.4)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(@emotion/is-prop-valid@1.4.0)(@strapi/data-transfer@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@25.0.5)(better-sqlite3@12.4.1)(typescript@5.4.4))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@25.0.5)(@types/react@18.3.27)(better-sqlite3@12.4.1)(codemirror@5.65.20)(debug@4.3.4)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@strapi/admin': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@emotion/is-prop-valid@1.4.0)(@strapi/data-transfer@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@25.0.5)(better-sqlite3@12.4.1)(typescript@5.4.4))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@25.0.5)(@types/react@18.3.27)(better-sqlite3@12.4.1)(debug@4.3.4)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@strapi/cloud-cli': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66 - '@strapi/content-manager': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(c14cb639f3000434604628e7fdd36a04) - '@strapi/content-releases': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(e07ce3dc41652f90e84819fd8b09599d) - '@strapi/content-type-builder': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(d187309ba4a19747f90e8fa03e675a64) - '@strapi/core': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@babel/preset-env@7.29.2(@babel/core@7.28.5))(@babel/runtime@7.28.4)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(@emotion/is-prop-valid@1.4.0)(@strapi/data-transfer@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@25.0.5)(better-sqlite3@12.4.1)(typescript@5.4.4))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@25.0.5)(@types/react@18.3.27)(better-sqlite3@12.4.1)(codemirror@5.65.20)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@strapi/content-manager': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@strapi/admin@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@emotion/is-prop-valid@1.4.0)(@strapi/data-transfer@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@25.0.5)(better-sqlite3@12.4.1)(typescript@5.4.4))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@25.0.5)(@types/react@18.3.27)(better-sqlite3@12.4.1)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@25.0.5)(@types/react@18.3.27)(better-sqlite3@12.4.1)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.4.4) + '@strapi/content-releases': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(c109d509cf47c7acd624fdbda7c41e20) + '@strapi/content-type-builder': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@babel/preset-env@7.29.2(@babel/core@7.28.5))(@strapi/admin@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@emotion/is-prop-valid@1.4.0)(@strapi/data-transfer@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@25.0.5)(better-sqlite3@12.4.1)(typescript@5.4.4))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@25.0.5)(@types/react@18.3.27)(better-sqlite3@12.4.1)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/node@25.0.5)(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.4.4) + '@strapi/core': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@babel/preset-env@7.29.2(@babel/core@7.28.5))(@emotion/is-prop-valid@1.4.0)(@strapi/data-transfer@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@25.0.5)(better-sqlite3@12.4.1)(typescript@5.4.4))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@25.0.5)(@types/react@18.3.27)(better-sqlite3@12.4.1)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@strapi/data-transfer': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@25.0.5)(better-sqlite3@12.4.1)(typescript@5.4.4) '@strapi/database': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@25.0.5)(better-sqlite3@12.4.1) - '@strapi/email': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(bc0b8f063491cecfc56bb17013f17caf) + '@strapi/email': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@strapi/admin@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@emotion/is-prop-valid@1.4.0)(@strapi/data-transfer@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@25.0.5)(better-sqlite3@12.4.1)(typescript@5.4.4))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@25.0.5)(@types/react@18.3.27)(better-sqlite3@12.4.1)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/react@18.3.27)(koa@2.16.4)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.4.4) '@strapi/generators': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@babel/preset-env@7.29.2(@babel/core@7.28.5))(@types/node@25.0.5) - '@strapi/i18n': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(bedd715739f48cbe756cfb7b1b317b9a) + '@strapi/i18n': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(31fed7a030e6a68c53d970108b995a5d) '@strapi/logger': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66 '@strapi/openapi': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66 '@strapi/permissions': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66 - '@strapi/review-workflows': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(f5f4e13decf780e67ae4087a552b16ae) + '@strapi/review-workflows': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(c601b960e5763962058f9c33cfa94e17) '@strapi/types': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@25.0.5)(better-sqlite3@12.4.1)(typescript@5.4.4) '@strapi/typescript-utils': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66 - '@strapi/upload': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(c14cb639f3000434604628e7fdd36a04) + '@strapi/upload': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@strapi/admin@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@emotion/is-prop-valid@1.4.0)(@strapi/data-transfer@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@25.0.5)(better-sqlite3@12.4.1)(typescript@5.4.4))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@25.0.5)(@types/react@18.3.27)(better-sqlite3@12.4.1)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@25.0.5)(@types/react@18.3.27)(better-sqlite3@12.4.1)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.4.4) '@strapi/utils': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66 '@types/nodemon': 1.19.6 '@vitejs/plugin-react-swc': 3.6.0(@swc/helpers@0.5.18)(vite@5.4.21(@types/node@25.0.5)(terser@5.44.1)) @@ -17187,36 +17337,6 @@ snapshots: - webpack-plugin-serve '@strapi/types@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@20.19.37)(better-sqlite3@12.4.1)(typescript@5.4.4)': - dependencies: - '@casl/ability': 6.7.5 - '@koa/cors': 5.0.0 - '@koa/router': 12.0.2 - '@strapi/database': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@20.19.37)(better-sqlite3@12.4.1) - '@strapi/logger': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66 - '@strapi/permissions': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66 - '@strapi/utils': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66 - commander: 8.3.0 - json-logic-js: 2.0.5 - koa: 2.16.3 - koa-body: 6.0.1 - node-schedule: 2.1.1 - typedoc: 0.25.10(typescript@5.4.4) - typedoc-github-wiki-theme: 1.1.0(typedoc-plugin-markdown@3.17.1(typedoc@0.25.10(typescript@5.9.3)))(typedoc@0.25.10(typescript@5.9.3)) - typedoc-plugin-markdown: 3.17.1(typedoc@0.25.10(typescript@5.9.3)) - zod: 3.25.67 - transitivePeerDependencies: - - '@types/node' - - better-sqlite3 - - mysql - - mysql2 - - pg - - pg-native - - sqlite3 - - supports-color - - tedious - - typescript - - '@strapi/types@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@20.19.37)(better-sqlite3@12.4.1)(typescript@5.9.3)': dependencies: '@casl/ability': 6.7.5 '@koa/cors': 5.0.0 @@ -17231,7 +17351,7 @@ snapshots: koa-body: 6.0.1 node-schedule: 2.1.1 typedoc: 0.25.10(typescript@5.9.3) - typedoc-github-wiki-theme: 1.1.0(typedoc-plugin-markdown@3.17.1(typedoc@0.25.10(typescript@5.9.3)))(typedoc@0.25.10(typescript@5.9.3)) + typedoc-github-wiki-theme: 1.1.0(typedoc-plugin-markdown@3.17.1(typedoc@0.25.10(typescript@5.4.4)))(typedoc@0.25.10(typescript@5.9.3)) typedoc-plugin-markdown: 3.17.1(typedoc@0.25.10(typescript@5.9.3)) zod: 3.25.67 transitivePeerDependencies: @@ -17261,8 +17381,8 @@ snapshots: koa-body: 6.0.1 node-schedule: 2.1.1 typedoc: 0.25.10(typescript@5.4.4) - typedoc-github-wiki-theme: 1.1.0(typedoc-plugin-markdown@3.17.1(typedoc@0.25.10(typescript@5.4.4)))(typedoc@0.25.10(typescript@5.4.4)) - typedoc-plugin-markdown: 3.17.1(typedoc@0.25.10(typescript@5.4.4)) + typedoc-github-wiki-theme: 1.1.0(typedoc-plugin-markdown@3.17.1(typedoc@0.25.10(typescript@5.4.4)))(typedoc@0.25.10(typescript@5.9.3)) + typedoc-plugin-markdown: 3.17.1(typedoc@0.25.10(typescript@5.9.3)) zod: 3.25.67 transitivePeerDependencies: - '@types/node' @@ -17291,8 +17411,8 @@ snapshots: koa-body: 6.0.1 node-schedule: 2.1.1 typedoc: 0.25.10(typescript@5.4.4) - typedoc-github-wiki-theme: 1.1.0(typedoc-plugin-markdown@3.17.1(typedoc@0.25.10(typescript@5.4.4)))(typedoc@0.25.10(typescript@5.4.4)) - typedoc-plugin-markdown: 3.17.1(typedoc@0.25.10(typescript@5.4.4)) + typedoc-github-wiki-theme: 1.1.0(typedoc-plugin-markdown@3.17.1(typedoc@0.25.10(typescript@5.4.4)))(typedoc@0.25.10(typescript@5.9.3)) + typedoc-plugin-markdown: 3.17.1(typedoc@0.25.10(typescript@5.9.3)) zod: 3.25.67 transitivePeerDependencies: - '@types/node' @@ -17321,7 +17441,7 @@ snapshots: koa-body: 6.0.1 node-schedule: 2.1.1 typedoc: 0.25.10(typescript@5.9.3) - typedoc-github-wiki-theme: 1.1.0(typedoc-plugin-markdown@3.17.1(typedoc@0.25.10(typescript@5.9.3)))(typedoc@0.25.10(typescript@5.9.3)) + typedoc-github-wiki-theme: 1.1.0(typedoc-plugin-markdown@3.17.1(typedoc@0.25.10(typescript@5.4.4)))(typedoc@0.25.10(typescript@5.9.3)) typedoc-plugin-markdown: 3.17.1(typedoc@0.25.10(typescript@5.9.3)) zod: 3.25.67 transitivePeerDependencies: @@ -17403,13 +17523,13 @@ snapshots: - '@types/react' - '@types/react-dom' - '@strapi/upload@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(88180bbb747f1a663e1c80460137f499)': + '@strapi/upload@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(5a29c120345b3356cafd7b468df47f91)': dependencies: '@mux/mux-player-react': 3.1.0(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-toggle-group': 1.1.11(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@reduxjs/toolkit': 1.9.7(react-redux@8.1.3(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(redux@4.2.1))(react@18.3.1) - '@strapi/admin': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@babel/runtime@7.28.4)(@codemirror/autocomplete@6.20.0)(@codemirror/language@6.12.1)(@codemirror/lint@6.9.2)(@codemirror/search@6.5.11)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(@emotion/is-prop-valid@1.4.0)(@strapi/data-transfer@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@22.19.15)(typescript@5.4.4))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@22.19.15)(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(codemirror@5.65.20)(debug@4.3.4)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@strapi/database': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@22.19.15) + '@strapi/admin': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@babel/runtime@7.28.4)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(@emotion/is-prop-valid@1.4.0)(@strapi/data-transfer@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@20.19.37)(better-sqlite3@12.4.1)(typescript@5.4.4))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@20.19.37)(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(better-sqlite3@12.4.1)(codemirror@5.65.20)(debug@4.3.4)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@strapi/database': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@20.19.37)(better-sqlite3@12.4.1) '@strapi/design-system': 2.1.2(@babel/runtime@7.28.4)(@codemirror/autocomplete@6.20.0)(@codemirror/language@6.12.1)(@codemirror/lint@6.9.2)(@codemirror/search@6.5.11)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(@strapi/icons@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(codemirror@5.65.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@strapi/icons': 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@strapi/provider-upload-local': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66 @@ -17428,7 +17548,7 @@ snapshots: prop-types: 15.8.1 qs: 6.14.1 react: 18.3.1 - react-dnd: 16.0.1(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@22.19.15)(@types/react@18.3.27)(react@18.3.1) + react-dnd: 16.0.1(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@20.19.37)(@types/react@18.3.27)(react@18.3.1) react-dom: 18.3.1(react@18.3.1) react-intl: 6.6.2(react@18.3.1)(typescript@5.4.4) react-query: 3.39.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -17465,14 +17585,14 @@ snapshots: - tedious - typescript - '@strapi/upload@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(c14cb639f3000434604628e7fdd36a04)': + '@strapi/upload@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(88180bbb747f1a663e1c80460137f499)': dependencies: '@mux/mux-player-react': 3.1.0(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-toggle-group': 1.1.11(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@reduxjs/toolkit': 1.9.7(react-redux@8.1.3(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(redux@4.2.1))(react@18.3.1) - '@strapi/admin': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@babel/runtime@7.28.4)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(@emotion/is-prop-valid@1.4.0)(@strapi/data-transfer@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@25.0.5)(better-sqlite3@12.4.1)(typescript@5.4.4))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@25.0.5)(@types/react@18.3.27)(better-sqlite3@12.4.1)(codemirror@5.65.20)(debug@4.3.4)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@strapi/database': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@25.0.5)(better-sqlite3@12.4.1) - '@strapi/design-system': 2.1.2(@babel/runtime@7.28.4)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(@strapi/icons@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/react@18.3.27)(codemirror@5.65.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@strapi/admin': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@babel/runtime@7.28.4)(@codemirror/autocomplete@6.20.0)(@codemirror/language@6.12.1)(@codemirror/lint@6.9.2)(@codemirror/search@6.5.11)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(@emotion/is-prop-valid@1.4.0)(@strapi/data-transfer@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@22.19.15)(typescript@5.4.4))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@22.19.15)(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(codemirror@5.65.20)(debug@4.3.4)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@strapi/database': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@22.19.15) + '@strapi/design-system': 2.1.2(@babel/runtime@7.28.4)(@codemirror/autocomplete@6.20.0)(@codemirror/language@6.12.1)(@codemirror/lint@6.9.2)(@codemirror/search@6.5.11)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(@strapi/icons@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(codemirror@5.65.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@strapi/icons': 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@strapi/provider-upload-local': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66 '@strapi/utils': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66 @@ -17490,7 +17610,7 @@ snapshots: prop-types: 15.8.1 qs: 6.14.1 react: 18.3.1 - react-dnd: 16.0.1(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@25.0.5)(@types/react@18.3.27)(react@18.3.1) + react-dnd: 16.0.1(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@22.19.15)(@types/react@18.3.27)(react@18.3.1) react-dom: 18.3.1(react@18.3.1) react-intl: 6.6.2(react@18.3.1)(typescript@5.4.4) react-query: 3.39.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -17527,14 +17647,14 @@ snapshots: - tedious - typescript - '@strapi/upload@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(e896166f0b90569e59d995b27bb2a36f)': + '@strapi/upload@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@strapi/admin@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@emotion/is-prop-valid@1.4.0)(@strapi/data-transfer@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@25.0.5)(better-sqlite3@12.4.1)(typescript@5.4.4))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@25.0.5)(@types/react@18.3.27)(better-sqlite3@12.4.1)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@25.0.5)(@types/react@18.3.27)(better-sqlite3@12.4.1)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.4.4)': dependencies: '@mux/mux-player-react': 3.1.0(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-toggle-group': 1.1.11(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@reduxjs/toolkit': 1.9.7(react-redux@8.1.3(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(redux@4.2.1))(react@18.3.1) - '@strapi/admin': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@babel/runtime@7.28.4)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(@emotion/is-prop-valid@1.4.0)(@strapi/data-transfer@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@20.19.37)(better-sqlite3@12.4.1)(typescript@5.4.4))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@20.19.37)(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(better-sqlite3@12.4.1)(codemirror@5.65.20)(debug@4.3.4)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@strapi/database': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@20.19.37)(better-sqlite3@12.4.1) - '@strapi/design-system': 2.1.2(@babel/runtime@7.28.4)(@codemirror/autocomplete@6.20.0)(@codemirror/language@6.12.1)(@codemirror/lint@6.9.2)(@codemirror/search@6.5.11)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(@strapi/icons@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(codemirror@5.65.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@strapi/admin': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@emotion/is-prop-valid@1.4.0)(@strapi/data-transfer@0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@25.0.5)(better-sqlite3@12.4.1)(typescript@5.4.4))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@25.0.5)(@types/react@18.3.27)(better-sqlite3@12.4.1)(debug@4.3.4)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redux@4.2.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@strapi/database': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66(@types/node@25.0.5)(better-sqlite3@12.4.1) + '@strapi/design-system': 2.1.2(@strapi/icons@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@strapi/icons': 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@strapi/provider-upload-local': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66 '@strapi/utils': 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66 @@ -17552,7 +17672,7 @@ snapshots: prop-types: 15.8.1 qs: 6.14.1 react: 18.3.1 - react-dnd: 16.0.1(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@20.19.37)(@types/react@18.3.27)(react@18.3.1) + react-dnd: 16.0.1(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@25.0.5)(@types/react@18.3.27)(react@18.3.1) react-dom: 18.3.1(react@18.3.1) react-intl: 6.6.2(react@18.3.1)(typescript@5.4.4) react-query: 3.39.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -17832,6 +17952,8 @@ snapshots: dependencies: '@babel/types': 7.29.0 + '@types/bcryptjs@2.4.6': {} + '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 @@ -18666,6 +18788,13 @@ snapshots: asap@2.0.6: {} + asn1.js@5.4.1: + dependencies: + bn.js: 4.12.3 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + safer-buffer: 2.1.2 + assertion-error@2.0.1: {} ast-types@0.16.1: @@ -18850,6 +18979,8 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 + bn.js@4.12.3: {} + body-parser@1.20.4: dependencies: bytes: 3.1.2 @@ -18937,6 +19068,8 @@ snapshots: rimraf: 3.0.2 unload: 2.2.0 + brorand@1.1.0: {} + browserslist-to-esbuild@1.2.0: dependencies: browserslist: 4.28.1 @@ -19841,6 +19974,16 @@ snapshots: electron-to-chromium@1.5.267: {} + elliptic@6.6.1: + dependencies: + bn.js: 4.12.3 + brorand: 1.1.0 + hash.js: 1.1.7 + hmac-drbg: 1.0.1 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + emittery@0.13.1: {} emoji-regex@10.6.0: {} @@ -20370,7 +20513,7 @@ snapshots: fs-extra: 9.1.0 glob: 7.2.3 memfs: 3.5.3 - minimatch: 3.1.2 + minimatch: 3.1.5 schema-utils: 2.7.0 semver: 7.7.3 tapable: 1.1.3 @@ -20608,7 +20751,7 @@ snapshots: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 - minimatch: 3.1.2 + minimatch: 3.1.5 once: 1.4.0 path-is-absolute: 1.0.1 @@ -20705,6 +20848,17 @@ snapshots: graceful-fs@4.2.11: {} + grant@5.4.24: + dependencies: + qs: 6.15.0 + request-compose: 2.1.7 + request-oauth: 1.0.1 + optionalDependencies: + cookie: 0.7.2 + cookie-signature: 1.2.2 + jwk-to-pem: 2.0.7 + jws: 4.0.1 + gray-matter@4.0.3: dependencies: js-yaml: 3.14.2 @@ -20752,6 +20906,11 @@ snapshots: has-yarn@3.0.0: {} + hash.js@1.1.7: + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + hasown@2.0.2: dependencies: function-bind: 1.1.2 @@ -20867,6 +21026,12 @@ snapshots: hls.js@1.5.20: {} + hmac-drbg@1.0.1: + dependencies: + hash.js: 1.1.7 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + hoist-non-react-statics@3.3.2: dependencies: react-is: 16.13.1 @@ -21048,7 +21213,7 @@ snapshots: ignore-walk@3.0.4: dependencies: - minimatch: 3.1.2 + minimatch: 3.1.5 ignore@5.3.2: {} @@ -21468,6 +21633,26 @@ snapshots: ecdsa-sig-formatter: 1.0.11 safe-buffer: 5.2.1 + jwa@2.0.1: + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + optional: true + + jwk-to-pem@2.0.5: + dependencies: + asn1.js: 5.4.1 + elliptic: 6.6.1 + safe-buffer: 5.2.1 + + jwk-to-pem@2.0.7: + dependencies: + asn1.js: 5.4.1 + elliptic: 6.6.1 + safe-buffer: 5.2.1 + optional: true + jwks-rsa@3.1.0: dependencies: '@types/express': 4.17.25 @@ -21484,6 +21669,12 @@ snapshots: jwa: 1.4.2 safe-buffer: 5.2.1 + jws@4.0.1: + dependencies: + jwa: 2.0.1 + safe-buffer: 5.2.1 + optional: true + keygrip@1.1.0: dependencies: tsscmp: 1.0.6 @@ -22479,6 +22670,8 @@ snapshots: minimalistic-assert@1.0.1: {} + minimalistic-crypto-utils@1.0.1: {} + minimatch@10.2.3: dependencies: brace-expansion: 5.0.4 @@ -22561,6 +22754,11 @@ snapshots: dns-packet: 5.6.1 thunky: 1.1.0 + multistream@4.1.0: + dependencies: + once: 1.4.0 + readable-stream: 3.6.2 + mute-stream@0.0.8: {} mute-stream@1.0.0: {} @@ -22750,6 +22948,8 @@ snapshots: schema-utils: 3.3.0 webpack: 5.104.1 + oauth-sign@0.9.0: {} + object-assign@4.1.1: {} object-inspect@1.13.4: {} @@ -23669,6 +23869,14 @@ snapshots: dependencies: escape-goat: 4.0.0 + purest@4.0.2: + dependencies: + '@simov/deep-extend': 1.0.0 + qs: 6.15.0 + request-compose: 2.1.7 + request-multipart: 1.0.0 + request-oauth: 1.0.1 + qs@6.14.1: dependencies: side-channel: 1.1.0 @@ -23817,7 +24025,7 @@ snapshots: dependencies: '@formatjs/ecma402-abstract': 1.18.2 '@formatjs/icu-messageformat-parser': 2.7.6 - '@formatjs/intl': 2.10.0(typescript@5.4.4) + '@formatjs/intl': 2.10.0(typescript@5.9.3) '@formatjs/intl-displaynames': 6.6.6 '@formatjs/intl-listformat': 7.5.5 '@types/hoist-non-react-statics': 3.3.7(@types/react@18.3.27) @@ -24117,7 +24325,7 @@ snapshots: recursive-readdir@2.2.3: dependencies: - minimatch: 3.1.2 + minimatch: 3.1.5 redux-thunk@2.4.2(redux@4.2.1): dependencies: @@ -24259,8 +24467,24 @@ snapshots: repeat-string@1.6.1: {} + request-compose@2.1.7: {} + request-ip@3.3.0: {} + request-multipart@1.0.0: + dependencies: + bl: 4.1.0 + isstream: 0.1.2 + mime-types: 2.1.35 + multistream: 4.1.0 + uuid: 8.3.2 + + request-oauth@1.0.1: + dependencies: + oauth-sign: 0.9.0 + qs: 6.15.0 + uuid: 8.3.2 + require-directory@2.1.1: {} require-from-string@2.0.2: {} @@ -25199,21 +25423,11 @@ snapshots: dependencies: is-typedarray: 1.0.0 - typedoc-github-wiki-theme@1.1.0(typedoc-plugin-markdown@3.17.1(typedoc@0.25.10(typescript@5.4.4)))(typedoc@0.25.10(typescript@5.4.4)): - dependencies: - typedoc: 0.25.10(typescript@5.4.4) - typedoc-plugin-markdown: 3.17.1(typedoc@0.25.10(typescript@5.4.4)) - - typedoc-github-wiki-theme@1.1.0(typedoc-plugin-markdown@3.17.1(typedoc@0.25.10(typescript@5.9.3)))(typedoc@0.25.10(typescript@5.9.3)): + typedoc-github-wiki-theme@1.1.0(typedoc-plugin-markdown@3.17.1(typedoc@0.25.10(typescript@5.4.4)))(typedoc@0.25.10(typescript@5.9.3)): dependencies: typedoc: 0.25.10(typescript@5.9.3) typedoc-plugin-markdown: 3.17.1(typedoc@0.25.10(typescript@5.9.3)) - typedoc-plugin-markdown@3.17.1(typedoc@0.25.10(typescript@5.4.4)): - dependencies: - handlebars: 4.7.8 - typedoc: 0.25.10(typescript@5.4.4) - typedoc-plugin-markdown@3.17.1(typedoc@0.25.10(typescript@5.9.3)): dependencies: handlebars: 4.7.8 @@ -25391,6 +25605,8 @@ snapshots: dependencies: punycode: 2.3.1 + url-join@4.0.1: {} + url-loader@4.1.1(file-loader@6.2.0(webpack@5.104.1))(webpack@5.104.1): dependencies: loader-utils: 2.0.4 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 56e0384..70587c0 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -10,6 +10,7 @@ catalogs: "@strapi/design-system": 2.2.0 "@strapi/icons": 2.2.0 strapi: + "@strapi/plugin-users-permissions": 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66 "@strapi/strapi": 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66 "@strapi/types": 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66 "@strapi/typescript-utils": 0.0.0-experimental.593681493255d3a39231f63454a967a71fdd7d66