From 7f29756d658f86a87adb0eb80f6c41228f3de821 Mon Sep 17 00:00:00 2001 From: Ayoub Hidri Date: Fri, 25 Sep 2026 15:59:40 +0200 Subject: [PATCH 1/2] feat: add links component to profiles Add a repeatable `profile.link` component ({ type, value }, max 10) to `api::profile.profile`, accept and validate `links` in the user and organization profile endpoints, and populate it in their responses. Social types store only the handle; `website`/`other` store a full URL. The legacy `website`/`github` fields are kept until migrated. See docs/adr/0003-profile-links.md. --- .../profile/content-types/profile/schema.json | 6 + apps/cms/src/components/profile/link.json | 30 ++++ .../better-auth/controllers/organization.ts | 6 +- .../better-auth/controllers/user.ts | 6 +- .../better-auth/services/organization.ts | 2 + .../extensions/better-auth/services/user.ts | 4 +- .../src/extensions/better-auth/utils/index.ts | 7 +- .../better-auth/utils/profile-links.ts | 139 ++++++++++++++++++ .../better-auth/utils/profile-validation.ts | 7 +- apps/cms/types/generated/components.d.ts | 29 ++++ apps/cms/types/generated/contentTypes.d.ts | 7 + docs/adr/0003-profile-links.md | 42 ++++++ 12 files changed, 279 insertions(+), 6 deletions(-) create mode 100644 apps/cms/src/components/profile/link.json create mode 100644 apps/cms/src/extensions/better-auth/utils/profile-links.ts create mode 100644 docs/adr/0003-profile-links.md diff --git a/apps/cms/src/api/profile/content-types/profile/schema.json b/apps/cms/src/api/profile/content-types/profile/schema.json index 5c5f5eb..4c914b3 100644 --- a/apps/cms/src/api/profile/content-types/profile/schema.json +++ b/apps/cms/src/api/profile/content-types/profile/schema.json @@ -32,6 +32,12 @@ "github": { "type": "string" }, + "links": { + "type": "component", + "repeatable": true, + "component": "profile.link", + "max": 10 + }, "location": { "type": "string" }, diff --git a/apps/cms/src/components/profile/link.json b/apps/cms/src/components/profile/link.json new file mode 100644 index 0000000..063e9aa --- /dev/null +++ b/apps/cms/src/components/profile/link.json @@ -0,0 +1,30 @@ +{ + "collectionName": "components_profile_links", + "info": { + "displayName": "Link", + "icon": "link" + }, + "options": {}, + "attributes": { + "type": { + "type": "enumeration", + "required": true, + "enum": [ + "website", + "github", + "linkedin", + "x", + "instagram", + "youtube", + "linktree", + "other" + ] + }, + "value": { + "type": "string", + "required": true, + "maxLength": 2048 + } + }, + "config": {} +} diff --git a/apps/cms/src/extensions/better-auth/controllers/organization.ts b/apps/cms/src/extensions/better-auth/controllers/organization.ts index fd7b061..6496f3c 100644 --- a/apps/cms/src/extensions/better-auth/controllers/organization.ts +++ b/apps/cms/src/extensions/better-auth/controllers/organization.ts @@ -7,6 +7,7 @@ import { fromNodeHeaders } from "better-auth/node"; import { getPluginService, organizationProfileFields, + pickProfileLinks, validateProfileData, } from "../utils"; @@ -79,7 +80,10 @@ export default factories.createCoreController( const data = Object.fromEntries( organizationProfileFields .filter((field) => field in body) - .map((field) => [field, body[field]]), + .map((field) => [ + field, + field === "links" ? pickProfileLinks(body.links) : body[field], + ]), ); const errors = validateProfileData(data); diff --git a/apps/cms/src/extensions/better-auth/controllers/user.ts b/apps/cms/src/extensions/better-auth/controllers/user.ts index 14d7104..6f0c9ba 100644 --- a/apps/cms/src/extensions/better-auth/controllers/user.ts +++ b/apps/cms/src/extensions/better-auth/controllers/user.ts @@ -6,6 +6,7 @@ import { factories } from "@strapi/strapi"; import { fromNodeHeaders } from "better-auth/node"; import { getPluginService, + pickProfileLinks, userProfileFields, validateProfileData, } from "../utils"; @@ -61,7 +62,10 @@ export default factories.createCoreController( const data = Object.fromEntries( userProfileFields .filter((field) => field in body) - .map((field) => [field, body[field]]), + .map((field) => [ + field, + field === "links" ? pickProfileLinks(body.links) : body[field], + ]), ); const errors = validateProfileData(data); diff --git a/apps/cms/src/extensions/better-auth/services/organization.ts b/apps/cms/src/extensions/better-auth/services/organization.ts index 0f4174f..129b0df 100644 --- a/apps/cms/src/extensions/better-auth/services/organization.ts +++ b/apps/cms/src/extensions/better-auth/services/organization.ts @@ -163,11 +163,13 @@ export default factories.createCoreService( return strapi.documents("api::profile.profile").update({ documentId: organization.profile.documentId, data, + populate: ["links"], }); } const profile = await strapi.documents("api::profile.profile").create({ data, + populate: ["links"], }); await strapi.documents("plugin::better-auth.organization").update({ diff --git a/apps/cms/src/extensions/better-auth/services/user.ts b/apps/cms/src/extensions/better-auth/services/user.ts index f86a871..efbaee7 100644 --- a/apps/cms/src/extensions/better-auth/services/user.ts +++ b/apps/cms/src/extensions/better-auth/services/user.ts @@ -50,7 +50,7 @@ export default factories.createCoreService("plugin::better-auth.user", () => ({ const [user] = await strapi.documents("plugin::better-auth.user").findMany({ filters: { id: userId }, fields: ["documentId"], - populate: { profile: {} }, + populate: { profile: { populate: ["links"] } }, }); return user?.profile ?? null; @@ -80,11 +80,13 @@ export default factories.createCoreService("plugin::better-auth.user", () => ({ return strapi.documents("api::profile.profile").update({ documentId: user.profile.documentId, data, + populate: ["links"], }); } const profile = await strapi.documents("api::profile.profile").create({ data, + populate: ["links"], }); await strapi.documents("plugin::better-auth.user").update({ diff --git a/apps/cms/src/extensions/better-auth/utils/index.ts b/apps/cms/src/extensions/better-auth/utils/index.ts index b9b1299..6f040bd 100644 --- a/apps/cms/src/extensions/better-auth/utils/index.ts +++ b/apps/cms/src/extensions/better-auth/utils/index.ts @@ -16,6 +16,7 @@ export { type OwnerType, } from "./cascade-delete"; export { extractContentTypeName } from "./content-type-name"; +export { pickProfileLinks } from "./profile-links"; export { validateProfileData } from "./profile-validation"; export { sanitizeIfSvg } from "./sanitize-svg"; @@ -94,13 +95,14 @@ export async function isOrganizationMember( /** * `api::profile.profile` fields an org owner/admin may edit through the * organization "Profile" tab — scoped to exactly what the public - * organization page renders (bio/subtitle/website/github/location/readme). + * organization page renders (bio/subtitle/website/github/links/location/readme). */ export const organizationProfileFields = [ "bio", "subtitle", "website", "github", + "links", "location", "readme", ] as const; @@ -108,7 +110,7 @@ export const organizationProfileFields = [ /** * `api::profile.profile` fields a user may edit through their personal * "Profile" tab — scoped to exactly what the public user page renders - * (bio/subtitle/website/github/location/email/readme). Includes `email` + * (bio/subtitle/website/github/links/location/email/readme). Includes `email` * (a public contact address), unlike `organizationProfileFields` — an * organization has no equivalent distinct-from-account address. */ @@ -117,6 +119,7 @@ export const userProfileFields = [ "subtitle", "website", "github", + "links", "location", "email", "readme", diff --git a/apps/cms/src/extensions/better-auth/utils/profile-links.ts b/apps/cms/src/extensions/better-auth/utils/profile-links.ts new file mode 100644 index 0000000..9207d27 --- /dev/null +++ b/apps/cms/src/extensions/better-auth/utils/profile-links.ts @@ -0,0 +1,139 @@ +/** + * Rules for the repeatable `profile.link` component on + * `api::profile.profile` (see docs/adr/0003-profile-links.md). Social + * types store only the handle — the public URL is built from a fixed + * prefix at render time — while `website`/`other` store a full URL. + * + * The web app enforces the same rules inline before submitting; this is + * the server-side backstop for anyone calling the API directly. Keep the + * two in sync if either changes. + * + * The max of 10 links and the enum of types are also on the component + * schema itself (apps/cms/src/components/profile/link.json), so Strapi + * enforces them on every write path — they're re-checked here only to + * return a readable message. + */ + +export const PROFILE_LINK_TYPES = [ + "website", + "github", + "linkedin", + "x", + "instagram", + "youtube", + "linktree", + "other", +] as const; + +export type ProfileLinkType = (typeof PROFILE_LINK_TYPES)[number]; + +export const MAX_PROFILE_LINKS = 10; + +const HANDLE_RULES: Partial< + Record +> = { + github: { + label: "GitHub", + pattern: /^[a-z\d](?:[a-z\d]|-(?=[a-z\d])){0,38}$/i, + example: "octocat", + }, + linkedin: { + label: "LinkedIn", + pattern: /^[a-z\d-]{3,100}$/i, + example: "jane-doe", + }, + x: { + label: "X (Twitter)", + pattern: /^[A-Za-z0-9_]{1,15}$/, + example: "janedoe", + }, + instagram: { + label: "Instagram", + pattern: /^[A-Za-z0-9._]{1,30}$/, + example: "janedoe", + }, + youtube: { + label: "YouTube", + pattern: /^[A-Za-z0-9._-]{3,30}$/, + example: "janedoe", + }, + linktree: { + label: "Linktree", + pattern: /^[A-Za-z0-9._]{2,30}$/, + example: "janedoe", + }, +}; + +function isWebAddress(value: string): boolean { + try { + const url = new URL(value); + return ( + (url.protocol === "http:" || url.protocol === "https:") && + url.hostname.includes(".") + ); + } catch { + return false; + } +} + +function isProfileLinkType(type: unknown): type is ProfileLinkType { + return PROFILE_LINK_TYPES.includes(type as ProfileLinkType); +} + +/** + * Keeps only `type` and a trimmed `value` from each submitted link, so a + * client can't pass component `id`s (or anything else) through to the + * document service. `null` clears the list. Anything that isn't an array + * is returned untouched for `validateProfileLinks` to reject. + */ +export function pickProfileLinks(value: unknown): unknown { + if (value === null) return []; + if (!Array.isArray(value)) return value; + + return value.map((link) => { + if (typeof link !== "object" || link === null) return link; + const { type, value } = link as Record; + return { type, value: typeof value === "string" ? value.trim() : value }; + }); +} + +export function validateProfileLinks(links: unknown): string[] { + if (!Array.isArray(links)) return ["Links must be a list."]; + if (links.length > MAX_PROFILE_LINKS) { + return [`Add up to ${MAX_PROFILE_LINKS} links.`]; + } + + const errors: string[] = []; + + links.forEach((link, index) => { + const prefix = `Link ${index + 1}:`; + const { type, value } = (link ?? {}) as Record; + + if (!isProfileLinkType(type)) { + errors.push(`${prefix} Choose a link type.`); + return; + } + if (typeof value !== "string" || value === "") { + errors.push(`${prefix} Enter an address or username.`); + return; + } + + const rule = HANDLE_RULES[type]; + if (!rule) { + if (!isWebAddress(value)) { + errors.push( + `${prefix} Enter a full web address, like https://example.com.`, + ); + } + return; + } + + if (!rule.pattern.test(value)) { + errors.push( + `${prefix} Enter a ${rule.label} username, like ${rule.example}.`, + ); + } + }); + + return errors; +} diff --git a/apps/cms/src/extensions/better-auth/utils/profile-validation.ts b/apps/cms/src/extensions/better-auth/utils/profile-validation.ts index ed5905a..118c557 100644 --- a/apps/cms/src/extensions/better-auth/utils/profile-validation.ts +++ b/apps/cms/src/extensions/better-auth/utils/profile-validation.ts @@ -10,9 +10,12 @@ * `api::profile.profile` schema itself * (apps/cms/src/api/profile/content-types/profile/schema.json), enforced * by Strapi on every write path. This file only covers format rules a - * schema attribute can't express. + * schema attribute can't express. Rules for `links` live in + * ./profile-links.ts. */ +import { validateProfileLinks } from "./profile-links"; + /** `https://github.com/` only — not a repo, gist, or org team link. */ const GITHUB_PROFILE_PATTERN = /^https:\/\/(www\.)?github\.com\/[a-zA-Z\d](?:[a-zA-Z\d]|-(?=[a-zA-Z\d])){0,38}\/?$/; @@ -62,5 +65,7 @@ export function validateProfileData(data: Record): string[] { if (error) errors.push(error); } + if ("links" in data) errors.push(...validateProfileLinks(data.links)); + return errors; } diff --git a/apps/cms/types/generated/components.d.ts b/apps/cms/types/generated/components.d.ts index 5c0db1f..7512961 100644 --- a/apps/cms/types/generated/components.d.ts +++ b/apps/cms/types/generated/components.d.ts @@ -1,5 +1,33 @@ import type { Schema, Struct } from '@strapi/strapi'; +export interface ProfileLink extends Struct.ComponentSchema { + collectionName: 'components_profile_links'; + info: { + displayName: 'Link'; + icon: 'link'; + }; + attributes: { + type: Schema.Attribute.Enumeration< + [ + 'website', + 'github', + 'linkedin', + 'x', + 'instagram', + 'youtube', + 'linktree', + 'other', + ] + > & + Schema.Attribute.Required; + value: Schema.Attribute.String & + Schema.Attribute.Required & + Schema.Attribute.SetMinMaxLength<{ + maxLength: 2048; + }>; + }; +} + export interface SectionsCardGrid extends Struct.ComponentSchema { collectionName: 'components_sections_card_grids'; info: { @@ -223,6 +251,7 @@ export interface SharedVersionInfo extends Struct.ComponentSchema { declare module '@strapi/strapi' { export namespace Public { export interface ComponentSchemas { + 'profile.link': ProfileLink; 'sections.card-grid': SectionsCardGrid; 'sections.card-grid-item': SectionsCardGridItem; 'sections.cta': SectionsCta; diff --git a/apps/cms/types/generated/contentTypes.d.ts b/apps/cms/types/generated/contentTypes.d.ts index c75c246..e12fa00 100644 --- a/apps/cms/types/generated/contentTypes.d.ts +++ b/apps/cms/types/generated/contentTypes.d.ts @@ -1037,6 +1037,13 @@ export interface ApiProfileProfile extends Struct.CollectionTypeSchema { Schema.Attribute.Private; email: Schema.Attribute.String; github: Schema.Attribute.String; + links: Schema.Attribute.Component<'profile.link', true> & + Schema.Attribute.SetMinMax< + { + max: 10; + }, + number + >; locale: Schema.Attribute.String & Schema.Attribute.Private; localizations: Schema.Attribute.Relation< 'oneToMany', diff --git a/docs/adr/0003-profile-links.md b/docs/adr/0003-profile-links.md new file mode 100644 index 0000000..8e6f55c --- /dev/null +++ b/docs/adr/0003-profile-links.md @@ -0,0 +1,42 @@ +# ADR 0003 — Profile links are a repeatable component of `{ type, value }` + +**Date:** 2026-09-25 +**Status:** Accepted + +## Context + +`api::profile.profile` (shared by user and organization profiles) has two fixed link fields, +`website` and `github`, each holding a full URL. Members want to list more places they can be +found (LinkedIn, X, YouTube, …), and adding one string field per network does not scale — every +new network would mean a schema change, a new form input and new rendering code. + +## Decision + +A repeatable component `profile.link` is added to `api::profile.profile` as `links` (max 10): + +- `type` — enumeration: `website`, `github`, `linkedin`, `x`, `instagram`, `youtube`, `linktree`, + `other`. +- `value` — string. For social types it is **only the handle** (e.g. `octocat`); the public URL is + built at render time from a fixed per-type prefix (e.g. `github.com/`). For `website` and + `other` it is a full `http(s)://` URL. + +Duplicate types are allowed (e.g. two websites). Order is the order the member added them in. + +Per-type format rules are enforced in the web app's profile form and, as a backstop, in the +better-auth profile endpoints (`utils/profile-links.ts`), following the existing split for +`validateProfileData`. The type enum and the max count also live on the component schema, so +Strapi enforces them on every write path. + +The legacy `website` and `github` fields stay in place until existing values have been migrated +into `links` by a one-off data migration (`src/migration/`, behind `ENABLE_MIGRATION`), after +which they are removed in a follow-up. + +## Consequences + +- Supporting a new network means adding an enum value and a prefix/pattern entry — no new field. +- Storing handles rather than URLs means a network changing its URL scheme (e.g. twitter.com → + x.com) is a one-line prefix change, with no data rewrite. +- Every read of a profile that needs links must populate `links` explicitly (component fields are + not populated by default). +- The type list and format rules are duplicated between the CMS and the web app. Accepted, as for + the other profile validation rules; both files point at each other. From 95007b72bed46e7f869512af9c320177b9704afc Mon Sep 17 00:00:00 2001 From: Ayoub Hidri Date: Fri, 25 Sep 2026 16:10:16 +0200 Subject: [PATCH 2/2] chore: add vitest Add vitest to apps/web and apps/cms with a `test` script each and a `test` task in turbo, so `pnpm test` runs something. Pinned to vitest 3, which supports the vite 5 the workspace resolves for the Strapi admin. Cover the new profile links validation (cms) and the existing profile field validation (web). --- apps/cms/package.json | 6 +- .../better-auth/utils/profile-links.test.ts | 98 ++++ apps/cms/vitest.config.ts | 7 + apps/web/package.json | 6 +- .../profile-view/validation.test.ts | 45 ++ apps/web/vitest.config.ts | 7 + pnpm-lock.yaml | 551 ++++++++++++++++-- turbo.json | 3 + 8 files changed, 664 insertions(+), 59 deletions(-) create mode 100644 apps/cms/src/extensions/better-auth/utils/profile-links.test.ts create mode 100644 apps/cms/vitest.config.ts create mode 100644 apps/web/src/features/auth/components/profile-view/validation.test.ts create mode 100644 apps/web/vitest.config.ts diff --git a/apps/cms/package.json b/apps/cms/package.json index d6856c8..51c4aec 100644 --- a/apps/cms/package.json +++ b/apps/cms/package.json @@ -14,7 +14,8 @@ "lint": "biome check .", "check-types": "tsc --noEmit", "upgrade": "npx @strapi/upgrade latest", - "upgrade:dry": "npx @strapi/upgrade latest --dry" + "upgrade:dry": "npx @strapi/upgrade latest --dry", + "test": "vitest run" }, "dependencies": { "@better-auth-ui/react": "^1.6.44", @@ -58,7 +59,8 @@ "@types/node": "^20", "@types/react": "^18", "@types/react-dom": "^18", - "typescript": "^5" + "typescript": "^5", + "vitest": "^3.2.7" }, "engines": { "node": ">=20.0.0 <=24.x.x", diff --git a/apps/cms/src/extensions/better-auth/utils/profile-links.test.ts b/apps/cms/src/extensions/better-auth/utils/profile-links.test.ts new file mode 100644 index 0000000..a198dd2 --- /dev/null +++ b/apps/cms/src/extensions/better-auth/utils/profile-links.test.ts @@ -0,0 +1,98 @@ +import { describe, expect, it } from "vitest"; +import { + MAX_PROFILE_LINKS, + pickProfileLinks, + validateProfileLinks, +} from "./profile-links"; + +describe("pickProfileLinks", () => { + it("keeps only type and a trimmed value", () => { + expect( + pickProfileLinks([ + { id: 12, type: "github", value: " octocat ", extra: true }, + ]), + ).toEqual([{ type: "github", value: "octocat" }]); + }); + + it("turns null into an empty list", () => { + expect(pickProfileLinks(null)).toEqual([]); + }); + + it("leaves non-array input for validation to reject", () => { + expect(pickProfileLinks("github.com/octocat")).toBe("github.com/octocat"); + }); +}); + +describe("validateProfileLinks", () => { + it("accepts an empty list", () => { + expect(validateProfileLinks([])).toEqual([]); + }); + + it("accepts valid handles and URLs, including duplicate types", () => { + expect( + validateProfileLinks([ + { type: "github", value: "octocat" }, + { type: "linkedin", value: "jane-doe" }, + { type: "x", value: "jane_doe" }, + { type: "instagram", value: "jane.doe" }, + { type: "youtube", value: "janedoe" }, + { type: "linktree", value: "janedoe" }, + { type: "website", value: "https://example.com" }, + { type: "website", value: "http://blog.example.com/path" }, + { type: "other", value: "https://www.npmjs.com/~octocat" }, + ]), + ).toEqual([]); + }); + + it.each([ + ["github", "https://github.com/octocat", "GitHub"], + ["github", "-octocat", "GitHub"], + ["x", "way_too_long_for_x_handle", "X (Twitter)"], + ["linkedin", "ab", "LinkedIn"], + ["youtube", "@janedoe", "YouTube"], + ])("rejects %s handle %j", (type, value, label) => { + const errors = validateProfileLinks([{ type, value }]); + expect(errors).toHaveLength(1); + expect(errors[0]).toMatch(/^Link 1: Enter a /); + expect(errors[0]).toContain(`${label} username`); + }); + + it.each([ + "example.com", + "ftp://example.com", + "https://localhost", + ])("rejects web address %j", (value) => { + expect(validateProfileLinks([{ type: "website", value }])).toEqual([ + "Link 1: Enter a full web address, like https://example.com.", + ]); + }); + + it("numbers errors by position", () => { + expect( + validateProfileLinks([ + { type: "github", value: "octocat" }, + { type: "facebook", value: "jane" }, + { type: "x", value: "" }, + ]), + ).toEqual([ + "Link 2: Choose a link type.", + "Link 3: Enter an address or username.", + ]); + }); + + it(`rejects more than ${MAX_PROFILE_LINKS} links`, () => { + const links = Array.from({ length: MAX_PROFILE_LINKS + 1 }, () => ({ + type: "github", + value: "octocat", + })); + expect(validateProfileLinks(links)).toEqual([ + `Add up to ${MAX_PROFILE_LINKS} links.`, + ]); + }); + + it("rejects anything that isn't a list", () => { + expect(validateProfileLinks({ type: "github" })).toEqual([ + "Links must be a list.", + ]); + }); +}); diff --git a/apps/cms/vitest.config.ts b/apps/cms/vitest.config.ts new file mode 100644 index 0000000..ae847ff --- /dev/null +++ b/apps/cms/vitest.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + include: ["src/**/*.test.ts"], + }, +}); diff --git a/apps/web/package.json b/apps/web/package.json index 7d5280e..3e23093 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -9,7 +9,8 @@ "start": "next start", "typegen": "next typegen", "lint": "biome check .", - "check-types": "tsc --noEmit" + "check-types": "tsc --noEmit", + "test": "vitest run" }, "dependencies": { "@daveyplate/better-auth-ui": "^3.4.0", @@ -72,6 +73,7 @@ "@types/react-syntax-highlighter": "^15.5.13", "postcss": "^8.5.6", "tailwindcss": "^4.1.13", - "typescript": "5.9.2" + "typescript": "5.9.2", + "vitest": "^3.2.7" } } diff --git a/apps/web/src/features/auth/components/profile-view/validation.test.ts b/apps/web/src/features/auth/components/profile-view/validation.test.ts new file mode 100644 index 0000000..3c54a2b --- /dev/null +++ b/apps/web/src/features/auth/components/profile-view/validation.test.ts @@ -0,0 +1,45 @@ +import { describe, expect, it } from "vitest"; +import { + BIO_MAX_LENGTH, + SUBTITLE_MAX_LENGTH, + validateProfileField, +} from "./validation"; + +describe("validateProfileField", () => { + it("treats empty and whitespace-only values as valid", () => { + expect(validateProfileField("website", "")).toBeUndefined(); + expect(validateProfileField("website", " ")).toBeUndefined(); + expect(validateProfileField("website", null)).toBeUndefined(); + }); + + it("enforces the bio and subtitle length limits", () => { + expect( + validateProfileField("bio", "a".repeat(BIO_MAX_LENGTH)), + ).toBeUndefined(); + expect( + validateProfileField("bio", "a".repeat(BIO_MAX_LENGTH + 1)), + ).toBeDefined(); + expect( + validateProfileField("subtitle", "a".repeat(SUBTITLE_MAX_LENGTH + 1)), + ).toBeDefined(); + }); + + it("validates website, github and email formats", () => { + expect( + validateProfileField("website", "https://example.com"), + ).toBeUndefined(); + expect(validateProfileField("website", "example.com")).toBeDefined(); + expect( + validateProfileField("github", "https://github.com/octocat"), + ).toBeUndefined(); + expect( + validateProfileField("github", "https://github.com/octocat/repo"), + ).toBeDefined(); + expect(validateProfileField("email", "jane@example.com")).toBeUndefined(); + expect(validateProfileField("email", "jane@example")).toBeDefined(); + }); + + it("ignores fields without a rule", () => { + expect(validateProfileField("location", "anything")).toBeUndefined(); + }); +}); diff --git a/apps/web/vitest.config.ts b/apps/web/vitest.config.ts new file mode 100644 index 0000000..ae847ff --- /dev/null +++ b/apps/web/vitest.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + include: ["src/**/*.test.ts"], + }, +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 789dac8..c51fa07 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -57,10 +57,10 @@ importers: dependencies: '@better-auth-ui/react': specifier: ^1.6.44 - version: 1.6.44(aa053da5fc7296f706bdeb427c587693) + version: 1.6.44(5c229bf878d38fbcd2739e011f5bbc4e) '@better-auth/infra': specifier: ^0.2.5 - version: 0.2.5(@better-auth/core@1.6.9(@opentelemetry/api@1.9.0)(jose@6.1.3)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/sso@1.6.9(@better-auth/core@1.6.9(@opentelemetry/api@1.9.0)(jose@6.1.3)(kysely@0.28.14)(nanostores@1.2.0))(better-auth@1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(better-auth@1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(zod@4.4.3) + version: 0.2.5(9e57983451d8e442df89d1b18dde2cdf) '@piksail/strapi-provider-email-mailpit': specifier: ^1.0.0 version: 1.0.0 @@ -69,10 +69,10 @@ importers: version: 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@strapi-community/plugin-better-auth': specifier: ^1.0.0-beta.6 - version: 1.0.0-beta.6(7d5abf887fad104e0f500f198117e9ba) + version: 1.0.0-beta.6(6b4f5d2699a78d482b0b7c2e0585a6ed) '@strapi-community/plugin-better-auth-dashboard': specifier: 1.0.0-alpha.10 - version: 1.0.0-alpha.10(5644cf0eb191c1c65dea6c05a785e786) + version: 1.0.0-alpha.10(40ca11b95ece1e26c80f51567addd410) '@strapi/admin': specifier: catalog:strapi version: 5.52.2(@babel/runtime@7.28.4)(@codemirror/autocomplete@6.20.0)(@codemirror/language@6.11.3)(@codemirror/lint@6.9.2)(@codemirror/search@6.5.11)(@codemirror/theme-one-dark@6.1.3)(@emotion/is-prop-valid@1.2.2)(@strapi/data-transfer@5.52.2(@types/node@20.19.27)(better-sqlite3@12.4.1)(pg@8.21.0)(ts-toolbelt@9.6.0)(typescript@5.9.2))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@20.19.27)(@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)(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redis@4.6.14)(redux@4.2.1)(styled-components@6.1.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(ts-toolbelt@9.6.0) @@ -105,7 +105,7 @@ importers: version: 0.12.2 better-auth: specifier: catalog:better-auth - version: 1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vitest@3.2.7(@types/debug@4.1.12)(@types/node@20.19.27)(jsdom@30.0.1(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.51.2)) better-sqlite3: specifier: 12.4.1 version: 12.4.1 @@ -176,6 +176,9 @@ importers: typescript: specifier: ^5 version: 5.9.2 + vitest: + specifier: ^3.2.7 + version: 3.2.7(@types/debug@4.1.12)(@types/node@20.19.27)(jsdom@30.0.1(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.51.2) apps/mail: {} @@ -185,7 +188,7 @@ importers: dependencies: '@daveyplate/better-auth-ui': specifier: ^3.4.0 - version: 3.4.0(patch_hash=605e70874749a3e1c7daa139fde7e90878cde1971df13e1b1c019c792e89f357)(c8796668597022ffa11d01ab02ba6f2f) + version: 3.4.0(patch_hash=605e70874749a3e1c7daa139fde7e90878cde1971df13e1b1c019c792e89f357)(ff0364477f15285510bd03d84fb9fe05) '@hookform/resolvers': specifier: ^5.2.2 version: 5.2.2(react-hook-form@7.74.0(react@18.3.1)) @@ -236,7 +239,7 @@ importers: version: 4.1.2(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) better-auth: specifier: catalog:better-auth - version: 1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vitest@3.2.7(@types/debug@4.1.12)(@types/node@22.15.3)(jsdom@30.0.1(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.51.2)) class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -361,6 +364,9 @@ importers: typescript: specifier: 5.9.2 version: 5.9.2 + vitest: + specifier: ^3.2.7 + version: 3.2.7(@types/debug@4.1.12)(@types/node@22.15.3)(jsdom@30.0.1(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.51.2) packages/biome-config: {} @@ -2175,8 +2181,8 @@ packages: '@jridgewell/source-map@0.3.11': resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} - '@jridgewell/sourcemap-codec@1.5.5': - resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@jridgewell/sourcemap-codec@1.6.0': + resolution: {integrity: sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==} '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} @@ -4666,6 +4672,9 @@ packages: '@types/body-parser@1.19.6': resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + '@types/co-body@6.1.3': resolution: {integrity: sha512-UhuhrQ5hclX6UJctv5m4Rfp52AfG9o9+d9/HwjxhVB5NjXxr5t9oKgJxN8xRHgr35oo8meUEHUPFWiKg6y71aA==} @@ -4684,6 +4693,9 @@ packages: '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + '@types/dom-speech-recognition@0.0.1': resolution: {integrity: sha512-udCxb8DvjcDKfk1WTBzDsxFbLgYxmQGKrE/ricoMqHRNjSlSUCcamVTA5lIQqzY10mY5qCY0QDwBfFEwhfoDPw==} @@ -4952,6 +4964,35 @@ packages: peerDependencies: vite: ^4 || ^5 + '@vitest/expect@3.2.7': + resolution: {integrity: sha512-E8eBXaKibuvH2pSZErOjdVb5vF4PbKYcrnluBTYxEk1l/VhhwZg1kZQsdtjq+CsF5CFydf2Rdkz7jDHKSisi3w==} + + '@vitest/mocker@3.2.7': + resolution: {integrity: sha512-Trr0hYO9CM3Wj6ksWHRhK9IZpIY6wTMO5u/MqXurMxT57sWBaOPEtP3Oq60ihZuh5JsiagKfz95OcxdEP6dBrA==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@3.2.7': + resolution: {integrity: sha512-KUHlwqVu0sRlhCdyPdQ/wBoTfRahjUky1MubOmYw9fWfIZy1gNoHpuaaQBPAaMaVYdQYHJLurzj8ECCj5OwTqA==} + + '@vitest/runner@3.2.7': + resolution: {integrity: sha512-sB9y4ovltoQP+WaUPwmSxO9WIg9Ig694Di5PalVPsYHklAdE027mehpWF2SQSVq+k6sFgaivbTjTJwZLSHbedA==} + + '@vitest/snapshot@3.2.7': + resolution: {integrity: sha512-7C+MwShwtBSI5Buwoyg3s/iY1eHL9PKAf+O1wVh/TdnjXUtkoL/9YQtre90i4MtNXM6edP1wJ2zOBpfCyhIS7g==} + + '@vitest/spy@3.2.7': + resolution: {integrity: sha512-Q2eQGI6d2L/hBtZ0qNuKcAGid68XK6cv1xsoaIma6PaJhHPoqcEJhYpXZ/5myCMqkNgtP6UKuBhbc0nHKnrkuQ==} + + '@vitest/utils@3.2.7': + resolution: {integrity: sha512-x6BDOd7dyo3PFLY3I9/HJ25X/6OurhGXk2/B9gOZNPF7XDVjeBK4k01lQE5uvDpbuheErh91qYuE1E2OEjK3Rw==} + '@webassemblyjs/ast@1.14.1': resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} @@ -5205,6 +5246,10 @@ packages: resolution: {integrity: sha512-S2s3aOytiKdFRdulw2qPE51MzjzVOisppcVv7jVFR+Kw0kxwvFrDcYA0h7Ndqbmj0HkMIXYWaoj7fli8kgx1eg==} engines: {node: '>=12.0.0'} + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + ast-types@0.16.1: resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} engines: {node: '>=4'} @@ -5430,6 +5475,10 @@ packages: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + cache-content-type@1.0.1: resolution: {integrity: sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==} engines: {node: '>= 6.0.0'} @@ -5465,6 +5514,10 @@ packages: ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + chai@5.3.3: + resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} + engines: {node: '>=18'} + chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} @@ -5487,6 +5540,10 @@ packages: chardet@2.1.1: resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} + check-error@2.1.3: + resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==} + engines: {node: '>= 16'} + chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} @@ -5890,6 +5947,10 @@ packages: resolution: {integrity: sha512-6IvPrADQyyPGLpMnUh6kfKiqy7SrbXbjoUuZ90WMBJKErzv2pCiwlGEXjRX9/54OnTq+XFVnkOnOMzclLI5aEA==} engines: {node: '>=10'} + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + deep-equal@1.0.1: resolution: {integrity: sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==} @@ -6135,6 +6196,9 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + es-module-lexer@2.3.2: resolution: {integrity: sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==} @@ -6223,6 +6287,9 @@ packages: estree-util-is-identifier-name@3.0.0: resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + etag@1.8.1: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} @@ -6270,6 +6337,10 @@ packages: resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} engines: {node: '>=0.10.0'} + expect-type@1.4.0: + resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==} + engines: {node: '>=12.0.0'} + express-rate-limit@8.7.0: resolution: {integrity: sha512-hOwV7WOxXfjRpAM1DSJWZDXx3GhplwD8IfwuwvogD8i1Qnkgosw/H45s4ZnFAUHDAhPjlY9hLBvJhKmGMyY26g==} engines: {node: '>= 16'} @@ -7139,6 +7210,9 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + js-yaml@4.3.2: resolution: {integrity: sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==} hasBin: true @@ -7515,6 +7589,9 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true + loupe@3.2.1: + resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} + lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} @@ -8407,6 +8484,10 @@ packages: pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + pathval@2.0.1: + resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} + engines: {node: '>= 14.16'} + pause@0.0.1: resolution: {integrity: sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==} @@ -8461,6 +8542,10 @@ packages: resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} + picomatch@4.0.7: + resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==} + engines: {node: '>=12'} + picospinner@3.1.2: resolution: {integrity: sha512-0Z++uU8mvB0EvCPAEUq9BGiPcSravzJ+RPdXfjYlzXffqsogisiKRQqI6ctrSSJ6n985vxrgKtQ5n4sRINcJZg==} engines: {node: '>=18.0.0'} @@ -9396,6 +9481,9 @@ packages: sift@16.0.1: resolution: {integrity: sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ==} + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} @@ -9541,6 +9629,9 @@ packages: stack-trace@0.0.10: resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + stackframe@1.3.4: resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} @@ -9556,6 +9647,9 @@ packages: resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} engines: {node: '>= 0.8'} + std-env@3.10.0: + resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + strapi-lucide-icons@1.14.0: resolution: {integrity: sha512-WQRoqXm2wbmZC2Gmjn4g7vGh+rl3hxS7pKykYhG2WPGlw21VEtm0SLngWje5N72F+BAaUvcTXV6bu2B05dDO4g==} peerDependencies: @@ -9653,6 +9747,9 @@ packages: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} engines: {node: '>=0.10.0'} + strip-literal@3.1.0: + resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} + strnum@2.2.3: resolution: {integrity: sha512-oKx6RUCuHfT3oyVjtnrmn19H1SiCqgJSg+54XqURKp5aCMbrXrhLjRN9TjuwMjiYstZ0MzDrHqkGZ5dFTKd+zg==} @@ -9816,6 +9913,12 @@ packages: tiny-warning@1.0.3: resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + tinyexec@1.0.4: resolution: {integrity: sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw==} engines: {node: '>=18'} @@ -9824,10 +9927,22 @@ packages: resolution: {integrity: sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==} engines: {node: '>=18'} - tinyglobby@0.2.15: - resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} + tinypool@1.1.1: + resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} + engines: {node: ^18.0.0 || >=20.0.0} + + tinyrainbow@2.0.0: + resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} + engines: {node: '>=14.0.0'} + + tinyspy@4.0.6: + resolution: {integrity: sha512-u8KszXvGfU68hVcZpRHKG28T0krMuv2G5nDhiHaMLen/gIuFEgIJhaJuO69qjnXg5paSrbPMFfx3brNuN8eVSg==} + engines: {node: '>=14.0.0'} + title-case@4.3.2: resolution: {integrity: sha512-I/nkcBo73mO42Idfv08jhInV61IMb61OdIFxk+B4Gu1oBjWBPOLmhZdsli+oJCVaD+86pYQA93cJfFt224ZFAA==} @@ -10229,6 +10344,11 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + vite-node@3.2.4: + resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + vite@5.4.21: resolution: {integrity: sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==} engines: {node: ^18.0.0 || >=20.0.0} @@ -10260,6 +10380,34 @@ packages: terser: optional: true + vitest@3.2.7: + resolution: {integrity: sha512-KrxIJ62Fd89gfysR4WotlgZABiz2dqFPgqGzX7s+CwsqLFomRH7777ZcrOD6+WVAh7khPQP41A+BKbpcJFrdEg==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/debug': ^4.1.12 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@vitest/browser': 3.2.7 + '@vitest/ui': 3.2.7 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/debug': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + w3c-keyname@2.2.8: resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} @@ -10380,6 +10528,11 @@ packages: engines: {node: '>= 8'} hasBin: true + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + widest-line@3.1.0: resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} engines: {node: '>=8'} @@ -10985,19 +11138,19 @@ snapshots: '@babel/helper-string-parser': 7.29.7 '@babel/helper-validator-identifier': 7.29.7 - '@better-auth-ui/core@1.6.3(better-auth@1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + '@better-auth-ui/core@1.6.3(better-auth@1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vitest@3.2.7(@types/debug@4.1.12)(@types/node@20.19.27)(jsdom@30.0.1(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.51.2)))': dependencies: - better-auth: 1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + better-auth: 1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vitest@3.2.7(@types/debug@4.1.12)(@types/node@20.19.27)(jsdom@30.0.1(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.51.2)) - '@better-auth-ui/react@1.6.44(aa053da5fc7296f706bdeb427c587693)': + '@better-auth-ui/react@1.6.44(5c229bf878d38fbcd2739e011f5bbc4e)': dependencies: - '@better-auth-ui/core': 1.6.3(better-auth@1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@better-auth/api-key': 1.6.9(@better-auth/core@1.6.9(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.3.6))(jose@6.1.3)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/utils@0.4.0)(better-auth@1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@better-auth/oauth-provider': 1.6.26(@better-auth/core@1.6.9(@opentelemetry/api@1.9.0)(jose@6.1.3)(kysely@0.28.14)(nanostores@1.2.0))(better-auth@1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@better-auth/passkey': 1.6.9(@better-auth/core@1.6.9(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.3.6))(jose@6.1.3)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(better-auth@1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(better-call@1.3.5(zod@4.3.6))(nanostores@1.2.0) + '@better-auth-ui/core': 1.6.3(better-auth@1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vitest@3.2.7(@types/debug@4.1.12)(@types/node@20.19.27)(jsdom@30.0.1(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.51.2))) + '@better-auth/api-key': 1.6.9(@better-auth/core@1.6.9(@opentelemetry/api@1.9.0)(jose@6.1.3)(kysely@0.28.14)(nanostores@1.2.0))(better-auth@1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vitest@3.2.7(@types/debug@4.1.12)(@types/node@20.19.27)(jsdom@30.0.1(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.51.2))) + '@better-auth/oauth-provider': 1.6.26(@better-auth/core@1.6.9(@opentelemetry/api@1.9.0)(jose@6.1.3)(kysely@0.28.14)(nanostores@1.2.0))(better-auth@1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vitest@3.2.7(@types/debug@4.1.12)(@types/node@20.19.27)(jsdom@30.0.1(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.51.2))) + '@better-auth/passkey': 1.6.9(@better-auth/core@1.6.9(@opentelemetry/api@1.9.0)(jose@6.1.3)(kysely@0.28.14)(nanostores@1.2.0))(better-auth@1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vitest@3.2.7(@types/debug@4.1.12)(@types/node@20.19.27)(jsdom@30.0.1(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.51.2)))(nanostores@1.2.0) '@tanstack/query-core': 5.100.6 '@tanstack/react-query': 5.100.6(react@18.3.1) - better-auth: 1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + better-auth: 1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vitest@3.2.7(@types/debug@4.1.12)(@types/node@20.19.27)(jsdom@30.0.1(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.51.2)) clsx: 2.1.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -11007,11 +11160,17 @@ snapshots: optionalDependencies: react-email: 6.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@better-auth/api-key@1.6.9(@better-auth/core@1.6.9(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.3.6))(jose@6.1.3)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/utils@0.4.0)(better-auth@1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + '@better-auth/api-key@1.6.9(@better-auth/core@1.6.9(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.3.6))(jose@6.1.3)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/utils@0.4.0)(better-auth@1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vitest@3.2.7(@types/debug@4.1.12)(@types/node@22.15.3)(jsdom@30.0.1(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.51.2)))': dependencies: '@better-auth/core': 1.6.9(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.3.6))(jose@6.1.3)(kysely@0.28.14)(nanostores@1.2.0) '@better-auth/utils': 0.4.0 - better-auth: 1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + better-auth: 1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vitest@3.2.7(@types/debug@4.1.12)(@types/node@22.15.3)(jsdom@30.0.1(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.51.2)) + zod: 4.4.3 + + '@better-auth/api-key@1.6.9(@better-auth/core@1.6.9(@opentelemetry/api@1.9.0)(jose@6.1.3)(kysely@0.28.14)(nanostores@1.2.0))(better-auth@1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vitest@3.2.7(@types/debug@4.1.12)(@types/node@20.19.27)(jsdom@30.0.1(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.51.2)))': + dependencies: + '@better-auth/core': 1.6.9(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.3.6))(jose@6.1.3)(kysely@0.28.14)(nanostores@1.2.0) + better-auth: 1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vitest@3.2.7(@types/debug@4.1.12)(@types/node@20.19.27)(jsdom@30.0.1(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.51.2)) zod: 4.4.3 '@better-auth/core@1.6.9(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.3.6))(jose@6.1.3)(kysely@0.28.14)(nanostores@1.2.0)': @@ -11033,12 +11192,12 @@ snapshots: '@better-auth/core': 1.6.9(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.3.6))(jose@6.1.3)(kysely@0.28.14)(nanostores@1.2.0) '@better-auth/utils': 0.4.0 - '@better-auth/infra@0.2.5(@better-auth/core@1.6.9(@opentelemetry/api@1.9.0)(jose@6.1.3)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/sso@1.6.9(@better-auth/core@1.6.9(@opentelemetry/api@1.9.0)(jose@6.1.3)(kysely@0.28.14)(nanostores@1.2.0))(better-auth@1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(better-auth@1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(zod@4.4.3)': + '@better-auth/infra@0.2.5(9e57983451d8e442df89d1b18dde2cdf)': dependencies: '@better-auth/core': 1.6.9(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.3.6))(jose@6.1.3)(kysely@0.28.14)(nanostores@1.2.0) - '@better-auth/sso': 1.6.9(@better-auth/core@1.6.9(@opentelemetry/api@1.9.0)(jose@6.1.3)(kysely@0.28.14)(nanostores@1.2.0))(better-auth@1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@better-auth/sso': 1.6.9(@better-auth/core@1.6.9(@opentelemetry/api@1.9.0)(jose@6.1.3)(kysely@0.28.14)(nanostores@1.2.0))(better-auth@1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vitest@3.2.7(@types/debug@4.1.12)(@types/node@20.19.27)(jsdom@30.0.1(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.51.2))) '@better-fetch/fetch': 1.1.21 - better-auth: 1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + better-auth: 1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vitest@3.2.7(@types/debug@4.1.12)(@types/node@20.19.27)(jsdom@30.0.1(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.51.2)) better-call: 1.3.5(zod@4.4.3) jose: 6.1.3 libphonenumber-js: 1.12.42 @@ -11063,34 +11222,43 @@ snapshots: optionalDependencies: mongodb: 7.1.0(socks@2.8.8) - '@better-auth/oauth-provider@1.6.26(@better-auth/core@1.6.9(@opentelemetry/api@1.9.0)(jose@6.1.3)(kysely@0.28.14)(nanostores@1.2.0))(better-auth@1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + '@better-auth/oauth-provider@1.6.26(@better-auth/core@1.6.9(@opentelemetry/api@1.9.0)(jose@6.1.3)(kysely@0.28.14)(nanostores@1.2.0))(better-auth@1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vitest@3.2.7(@types/debug@4.1.12)(@types/node@20.19.27)(jsdom@30.0.1(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.51.2)))': dependencies: '@better-auth/core': 1.6.9(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.3.6))(jose@6.1.3)(kysely@0.28.14)(nanostores@1.2.0) - better-auth: 1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + better-auth: 1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vitest@3.2.7(@types/debug@4.1.12)(@types/node@20.19.27)(jsdom@30.0.1(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.51.2)) jose: 6.1.3 zod: 4.4.3 - '@better-auth/passkey@1.6.9(@better-auth/core@1.6.9(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.3.6))(jose@6.1.3)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(better-auth@1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(better-call@1.3.5(zod@4.3.6))(nanostores@1.2.0)': + '@better-auth/passkey@1.6.9(@better-auth/core@1.6.9(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.3.6))(jose@6.1.3)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(better-auth@1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vitest@3.2.7(@types/debug@4.1.12)(@types/node@22.15.3)(jsdom@30.0.1(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.51.2)))(better-call@1.3.5(zod@4.3.6))(nanostores@1.2.0)': dependencies: '@better-auth/core': 1.6.9(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.3.6))(jose@6.1.3)(kysely@0.28.14)(nanostores@1.2.0) '@better-auth/utils': 0.4.0 '@better-fetch/fetch': 1.1.21 '@simplewebauthn/browser': 13.3.0 '@simplewebauthn/server': 13.3.0 - better-auth: 1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + better-auth: 1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vitest@3.2.7(@types/debug@4.1.12)(@types/node@22.15.3)(jsdom@30.0.1(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.51.2)) better-call: 1.3.5(zod@4.3.6) nanostores: 1.2.0 zod: 4.4.3 + '@better-auth/passkey@1.6.9(@better-auth/core@1.6.9(@opentelemetry/api@1.9.0)(jose@6.1.3)(kysely@0.28.14)(nanostores@1.2.0))(better-auth@1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vitest@3.2.7(@types/debug@4.1.12)(@types/node@20.19.27)(jsdom@30.0.1(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.51.2)))(nanostores@1.2.0)': + dependencies: + '@better-auth/core': 1.6.9(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.3.6))(jose@6.1.3)(kysely@0.28.14)(nanostores@1.2.0) + '@simplewebauthn/browser': 13.3.0 + '@simplewebauthn/server': 13.3.0 + better-auth: 1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vitest@3.2.7(@types/debug@4.1.12)(@types/node@20.19.27)(jsdom@30.0.1(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.51.2)) + nanostores: 1.2.0 + zod: 4.4.3 + '@better-auth/prisma-adapter@1.6.9(@better-auth/core@1.6.9(@opentelemetry/api@1.9.0)(jose@6.1.3)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/utils@0.4.0)': dependencies: '@better-auth/core': 1.6.9(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.3.6))(jose@6.1.3)(kysely@0.28.14)(nanostores@1.2.0) '@better-auth/utils': 0.4.0 - '@better-auth/sso@1.6.9(@better-auth/core@1.6.9(@opentelemetry/api@1.9.0)(jose@6.1.3)(kysely@0.28.14)(nanostores@1.2.0))(better-auth@1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + '@better-auth/sso@1.6.9(@better-auth/core@1.6.9(@opentelemetry/api@1.9.0)(jose@6.1.3)(kysely@0.28.14)(nanostores@1.2.0))(better-auth@1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vitest@3.2.7(@types/debug@4.1.12)(@types/node@20.19.27)(jsdom@30.0.1(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.51.2)))': dependencies: '@better-auth/core': 1.6.9(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.3.6))(jose@6.1.3)(kysely@0.28.14)(nanostores@1.2.0) - better-auth: 1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + better-auth: 1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vitest@3.2.7(@types/debug@4.1.12)(@types/node@20.19.27)(jsdom@30.0.1(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.51.2)) fast-xml-parser: 5.7.2 jose: 6.1.3 samlify: 2.10.2 @@ -11302,21 +11470,21 @@ snapshots: enabled: 2.0.0 kuler: 2.0.0 - '@daveyplate/better-auth-tanstack@1.3.6(@tanstack/query-core@5.100.6)(@tanstack/react-query@5.100.6(react@18.3.1))(better-auth@1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@daveyplate/better-auth-tanstack@1.3.6(@tanstack/query-core@5.100.6)(@tanstack/react-query@5.100.6(react@18.3.1))(better-auth@1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vitest@3.2.7(@types/debug@4.1.12)(@types/node@22.15.3)(jsdom@30.0.1(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.51.2)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@tanstack/query-core': 5.100.6 '@tanstack/react-query': 5.100.6(react@18.3.1) - better-auth: 1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + better-auth: 1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vitest@3.2.7(@types/debug@4.1.12)(@types/node@22.15.3)(jsdom@30.0.1(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.51.2)) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@daveyplate/better-auth-ui@3.4.0(patch_hash=605e70874749a3e1c7daa139fde7e90878cde1971df13e1b1c019c792e89f357)(c8796668597022ffa11d01ab02ba6f2f)': + '@daveyplate/better-auth-ui@3.4.0(patch_hash=605e70874749a3e1c7daa139fde7e90878cde1971df13e1b1c019c792e89f357)(ff0364477f15285510bd03d84fb9fe05)': dependencies: - '@better-auth/api-key': 1.6.9(@better-auth/core@1.6.9(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.3.6))(jose@6.1.3)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/utils@0.4.0)(better-auth@1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@better-auth/passkey': 1.6.9(@better-auth/core@1.6.9(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.3.6))(jose@6.1.3)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(better-auth@1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(better-call@1.3.5(zod@4.3.6))(nanostores@1.2.0) + '@better-auth/api-key': 1.6.9(@better-auth/core@1.6.9(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.3.6))(jose@6.1.3)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/utils@0.4.0)(better-auth@1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vitest@3.2.7(@types/debug@4.1.12)(@types/node@22.15.3)(jsdom@30.0.1(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.51.2))) + '@better-auth/passkey': 1.6.9(@better-auth/core@1.6.9(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.3.6))(jose@6.1.3)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(better-auth@1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vitest@3.2.7(@types/debug@4.1.12)(@types/node@22.15.3)(jsdom@30.0.1(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.51.2)))(better-call@1.3.5(zod@4.3.6))(nanostores@1.2.0) '@better-fetch/fetch': 1.1.21 '@captchafox/react': 1.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@daveyplate/better-auth-tanstack': 1.3.6(@tanstack/query-core@5.100.6)(@tanstack/react-query@5.100.6(react@18.3.1))(better-auth@1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@daveyplate/better-auth-tanstack': 1.3.6(@tanstack/query-core@5.100.6)(@tanstack/react-query@5.100.6(react@18.3.1))(better-auth@1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vitest@3.2.7(@types/debug@4.1.12)(@types/node@22.15.3)(jsdom@30.0.1(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.51.2)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@hcaptcha/react-hcaptcha': 2.0.2 '@hookform/resolvers': 5.2.2(react-hook-form@7.74.0(react@18.3.1)) '@instantdb/react': 1.0.22(react@18.3.1) @@ -11341,7 +11509,7 @@ snapshots: '@triplit/client': 1.0.50(better-sqlite3@12.4.1)(typescript@5.9.2) '@triplit/react': 1.0.51(better-sqlite3@12.4.1)(react@18.3.1)(typescript@5.9.2) '@wojtekmaj/react-recaptcha-v3': 0.1.4(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - better-auth: 1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + better-auth: 1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vitest@3.2.7(@types/debug@4.1.12)(@types/node@22.15.3)(jsdom@30.0.1(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.51.2)) better-call: 2.0.2(zod@4.3.6) bowser: 2.14.1 class-variance-authority: 0.7.1 @@ -12149,7 +12317,7 @@ snapshots: '@jridgewell/gen-mapping@0.3.13': dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/sourcemap-codec': 1.6.0 '@jridgewell/trace-mapping': 0.3.31 '@jridgewell/remapping@2.3.5': @@ -12164,12 +12332,12 @@ snapshots: '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 - '@jridgewell/sourcemap-codec@1.5.5': {} + '@jridgewell/sourcemap-codec@1.6.0': {} '@jridgewell/trace-mapping@0.3.31': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/sourcemap-codec': 1.6.0 '@juggle/resize-observer@3.4.0': {} @@ -12379,7 +12547,7 @@ snapshots: detect-libc: 2.1.2 is-glob: 4.0.3 node-addon-api: 7.1.1 - picomatch: 4.0.3 + picomatch: 4.0.7 optionalDependencies: '@parcel/watcher-android-arm64': 2.5.6 '@parcel/watcher-darwin-arm64': 2.5.6 @@ -14184,16 +14352,16 @@ snapshots: '@standard-schema/utils@0.3.0': {} - '@strapi-community/plugin-better-auth-dashboard@1.0.0-alpha.10(5644cf0eb191c1c65dea6c05a785e786)': + '@strapi-community/plugin-better-auth-dashboard@1.0.0-alpha.10(40ca11b95ece1e26c80f51567addd410)': dependencies: - '@better-auth/infra': 0.2.5(@better-auth/core@1.6.9(@opentelemetry/api@1.9.0)(jose@6.1.3)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/sso@1.6.9(@better-auth/core@1.6.9(@opentelemetry/api@1.9.0)(jose@6.1.3)(kysely@0.28.14)(nanostores@1.2.0))(better-auth@1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(better-auth@1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(zod@4.4.3) - '@strapi-community/plugin-better-auth': 1.0.0-beta.6(7d5abf887fad104e0f500f198117e9ba) + '@better-auth/infra': 0.2.5(9e57983451d8e442df89d1b18dde2cdf) + '@strapi-community/plugin-better-auth': 1.0.0-beta.6(6b4f5d2699a78d482b0b7c2e0585a6ed) '@strapi/design-system': 2.2.0(@babel/runtime@7.28.4)(@codemirror/autocomplete@6.20.0)(@codemirror/language@6.11.3)(@codemirror/lint@6.9.2)(@codemirror/search@6.5.11)(@codemirror/state@6.7.1)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.43.0)(@strapi/icons@2.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.19(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.1.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@strapi/icons': 2.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@strapi/strapi': 5.52.2(@babel/runtime@7.28.4)(@codemirror/autocomplete@6.20.0)(@codemirror/language@6.11.3)(@codemirror/lint@6.9.2)(@codemirror/search@6.5.11)(@codemirror/theme-one-dark@6.1.3)(@emotion/is-prop-valid@1.2.2)(@swc/helpers@0.5.18)(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@20.19.27)(@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.28.2)(koa@2.16.4)(lightningcss@1.31.1)(pg@8.21.0)(postcss@8.5.6)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redis@4.6.14)(redux@4.2.1)(styled-components@6.1.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.51.2)(ts-toolbelt@9.6.0)(type-fest@4.41.0) '@strapi/types': 5.52.2(better-sqlite3@12.4.1)(pg@8.21.0)(ts-toolbelt@9.6.0)(typescript@5.9.2) '@strapi/utils': 5.52.2(ts-toolbelt@9.6.0) - better-auth: 1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + better-auth: 1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vitest@3.2.7(@types/debug@4.1.12)(@types/node@20.19.27)(jsdom@30.0.1(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.51.2)) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) react-intl: 7.1.14(react@18.3.1)(typescript@5.9.2) @@ -14201,12 +14369,12 @@ snapshots: react-router-dom: 6.30.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) styled-components: 6.1.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@strapi-community/plugin-better-auth@1.0.0-beta.6(7d5abf887fad104e0f500f198117e9ba)': + '@strapi-community/plugin-better-auth@1.0.0-beta.6(6b4f5d2699a78d482b0b7c2e0585a6ed)': dependencies: '@strapi/strapi': 5.52.2(@babel/runtime@7.28.4)(@codemirror/autocomplete@6.20.0)(@codemirror/language@6.11.3)(@codemirror/lint@6.9.2)(@codemirror/search@6.5.11)(@codemirror/theme-one-dark@6.1.3)(@emotion/is-prop-valid@1.2.2)(@swc/helpers@0.5.18)(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@20.19.27)(@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.28.2)(koa@2.16.4)(lightningcss@1.31.1)(pg@8.21.0)(postcss@8.5.6)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redis@4.6.14)(redux@4.2.1)(styled-components@6.1.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.51.2)(ts-toolbelt@9.6.0)(type-fest@4.41.0) '@strapi/types': 5.52.2(better-sqlite3@12.4.1)(pg@8.21.0)(ts-toolbelt@9.6.0)(typescript@5.9.2) '@strapi/utils': 5.52.2(ts-toolbelt@9.6.0) - better-auth: 1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + better-auth: 1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vitest@3.2.7(@types/debug@4.1.12)(@types/node@20.19.27)(jsdom@30.0.1(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.51.2)) lodash: 4.18.1 '@strapi/admin@5.52.2(@babel/runtime@7.28.4)(@codemirror/autocomplete@6.20.0)(@codemirror/language@6.11.3)(@codemirror/lint@6.9.2)(@codemirror/search@6.5.11)(@codemirror/theme-one-dark@6.1.3)(@emotion/is-prop-valid@1.2.2)(@strapi/data-transfer@5.52.2(@types/node@20.19.27)(better-sqlite3@12.4.1)(pg@8.21.0)(ts-toolbelt@9.6.0)(typescript@5.9.2))(@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27))(@types/node@20.19.27)(@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)(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(redis@4.6.14)(redux@4.2.1)(styled-components@6.1.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(ts-toolbelt@9.6.0)': @@ -15691,6 +15859,11 @@ snapshots: '@types/connect': 3.4.38 '@types/node': 22.15.3 + '@types/chai@5.2.3': + dependencies: + '@types/deep-eql': 4.0.2 + assertion-error: 2.0.1 + '@types/co-body@6.1.3': dependencies: '@types/node': 22.15.3 @@ -15717,6 +15890,8 @@ snapshots: dependencies: '@types/ms': 2.1.0 + '@types/deep-eql@4.0.2': {} + '@types/dom-speech-recognition@0.0.1': {} '@types/estree-jsx@1.0.5': @@ -16048,6 +16223,56 @@ snapshots: transitivePeerDependencies: - '@swc/helpers' + '@vitest/expect@3.2.7': + dependencies: + '@types/chai': 5.2.3 + '@vitest/spy': 3.2.7 + '@vitest/utils': 3.2.7 + chai: 5.3.3 + tinyrainbow: 2.0.0 + + '@vitest/mocker@3.2.7(vite@5.4.21(@types/node@20.19.27)(lightningcss@1.31.1)(terser@5.51.2))': + dependencies: + '@vitest/spy': 3.2.7 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 5.4.21(@types/node@20.19.27)(lightningcss@1.31.1)(terser@5.51.2) + + '@vitest/mocker@3.2.7(vite@5.4.21(@types/node@22.15.3)(lightningcss@1.31.1)(terser@5.51.2))': + dependencies: + '@vitest/spy': 3.2.7 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 5.4.21(@types/node@22.15.3)(lightningcss@1.31.1)(terser@5.51.2) + + '@vitest/pretty-format@3.2.7': + dependencies: + tinyrainbow: 2.0.0 + + '@vitest/runner@3.2.7': + dependencies: + '@vitest/utils': 3.2.7 + pathe: 2.0.3 + strip-literal: 3.1.0 + + '@vitest/snapshot@3.2.7': + dependencies: + '@vitest/pretty-format': 3.2.7 + magic-string: 0.30.21 + pathe: 2.0.3 + + '@vitest/spy@3.2.7': + dependencies: + tinyspy: 4.0.6 + + '@vitest/utils@3.2.7': + dependencies: + '@vitest/pretty-format': 3.2.7 + loupe: 3.2.1 + tinyrainbow: 2.0.0 + '@webassemblyjs/ast@1.14.1': dependencies: '@webassemblyjs/helper-numbers': 1.13.2 @@ -16338,6 +16563,8 @@ snapshots: pvutils: 1.1.5 tslib: 2.8.1 + assertion-error@2.0.1: {} + ast-types@0.16.1: dependencies: tslib: 2.8.1 @@ -16395,7 +16622,38 @@ snapshots: bcryptjs@2.4.3: {} - better-auth@1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + better-auth@1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vitest@3.2.7(@types/debug@4.1.12)(@types/node@20.19.27)(jsdom@30.0.1(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.51.2)): + dependencies: + '@better-auth/core': 1.6.9(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.3.6))(jose@6.1.3)(kysely@0.28.14)(nanostores@1.2.0) + '@better-auth/drizzle-adapter': 1.6.9(@better-auth/core@1.6.9(@opentelemetry/api@1.9.0)(jose@6.1.3)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/utils@0.4.0) + '@better-auth/kysely-adapter': 1.6.9(@better-auth/core@1.6.9(@opentelemetry/api@1.9.0)(jose@6.1.3)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/utils@0.4.0)(kysely@0.28.14) + '@better-auth/memory-adapter': 1.6.9(@better-auth/core@1.6.9(@opentelemetry/api@1.9.0)(jose@6.1.3)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/utils@0.4.0) + '@better-auth/mongo-adapter': 1.6.9(@better-auth/core@1.6.9(@opentelemetry/api@1.9.0)(jose@6.1.3)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/utils@0.4.0)(mongodb@7.1.0(socks@2.8.8)) + '@better-auth/prisma-adapter': 1.6.9(@better-auth/core@1.6.9(@opentelemetry/api@1.9.0)(jose@6.1.3)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/utils@0.4.0) + '@better-auth/telemetry': 1.6.9(@better-auth/core@1.6.9(@opentelemetry/api@1.9.0)(jose@6.1.3)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21) + '@better-auth/utils': 0.4.0 + '@better-fetch/fetch': 1.1.21 + '@noble/ciphers': 2.1.1 + '@noble/hashes': 2.0.1 + better-call: 1.3.5(zod@4.3.6) + defu: 6.1.4 + jose: 6.1.3 + kysely: 0.28.14 + nanostores: 1.2.0 + zod: 4.3.6 + optionalDependencies: + better-sqlite3: 12.4.1 + mongodb: 7.1.0(socks@2.8.8) + next: 16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + pg: 8.21.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + vitest: 3.2.7(@types/debug@4.1.12)(@types/node@20.19.27)(jsdom@30.0.1(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.51.2) + transitivePeerDependencies: + - '@cloudflare/workers-types' + - '@opentelemetry/api' + + better-auth@1.6.9(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(mongodb@7.1.0(socks@2.8.8))(next@16.0.10(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(pg@8.21.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vitest@3.2.7(@types/debug@4.1.12)(@types/node@22.15.3)(jsdom@30.0.1(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.51.2)): dependencies: '@better-auth/core': 1.6.9(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.3.6))(jose@6.1.3)(kysely@0.28.14)(nanostores@1.2.0) '@better-auth/drizzle-adapter': 1.6.9(@better-auth/core@1.6.9(@opentelemetry/api@1.9.0)(jose@6.1.3)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/utils@0.4.0) @@ -16421,6 +16679,7 @@ snapshots: pg: 8.21.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + vitest: 3.2.7(@types/debug@4.1.12)(@types/node@22.15.3)(jsdom@30.0.1(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.51.2) transitivePeerDependencies: - '@cloudflare/workers-types' - '@opentelemetry/api' @@ -16563,6 +16822,8 @@ snapshots: bytes@3.1.2: {} + cac@6.7.14: {} + cache-content-type@1.0.1: dependencies: mime-types: 2.1.35 @@ -16597,6 +16858,14 @@ snapshots: ccount@2.0.1: {} + chai@5.3.3: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.3 + deep-eql: 5.0.2 + loupe: 3.2.1 + pathval: 2.0.1 + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 @@ -16614,6 +16883,8 @@ snapshots: chardet@2.1.1: {} + check-error@2.1.3: {} + chokidar@3.6.0: dependencies: anymatch: 3.1.3 @@ -16984,6 +17255,8 @@ snapshots: dependencies: mimic-response: 3.1.0 + deep-eql@5.0.2: {} + deep-equal@1.0.1: {} deep-extend@0.6.0: {} @@ -17210,6 +17483,8 @@ snapshots: es-errors@1.3.0: {} + es-module-lexer@1.7.0: {} + es-module-lexer@2.3.2: {} es-object-atoms@1.1.1: @@ -17355,6 +17630,10 @@ snapshots: estree-util-is-identifier-name@3.0.0: {} + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.8 + etag@1.8.1: {} event-target-shim@5.0.1: {} @@ -17408,6 +17687,8 @@ snapshots: dependencies: homedir-polyfill: 1.0.3 + expect-type@1.4.0: {} + express-rate-limit@8.7.0(express@5.2.1): dependencies: debug: 4.4.3(supports-color@5.5.0) @@ -17488,9 +17769,9 @@ snapshots: dependencies: format: 0.2.2 - fdir@6.5.0(picomatch@4.0.3): + fdir@6.5.0(picomatch@4.0.7): optionalDependencies: - picomatch: 4.0.3 + picomatch: 4.0.7 fecha@4.2.3: {} @@ -18447,6 +18728,8 @@ snapshots: js-tokens@4.0.0: {} + js-tokens@9.0.1: {} + js-yaml@4.3.2: dependencies: argparse: 2.0.1 @@ -18883,6 +19166,8 @@ snapshots: dependencies: js-tokens: 4.0.0 + loupe@3.2.1: {} + lower-case@2.0.2: dependencies: tslib: 2.8.1 @@ -18923,7 +19208,7 @@ snapshots: magic-string@0.30.21: dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/sourcemap-codec': 1.6.0 make-dir@2.1.0: dependencies: @@ -19582,7 +19867,7 @@ snapshots: inquirer: 9.3.8(@types/node@20.19.27) isbinaryfile: 5.0.7 resolve: 1.22.11 - tinyglobby: 0.2.15 + tinyglobby: 0.2.17 title-case: 4.3.2 transitivePeerDependencies: - '@types/node' @@ -19898,6 +20183,8 @@ snapshots: pathe@2.0.3: {} + pathval@2.0.1: {} + pause@0.0.1: {} peberminta@0.9.0: {} @@ -19945,6 +20232,8 @@ snapshots: picomatch@4.0.3: {} + picomatch@4.0.7: {} + picospinner@3.1.2: {} pify@4.0.1: {} @@ -21202,6 +21491,8 @@ snapshots: sift@16.0.1: {} + siginfo@2.0.0: {} + signal-exit@3.0.7: {} signal-exit@4.1.0: {} @@ -21374,6 +21665,8 @@ snapshots: stack-trace@0.0.10: {} + stackback@0.0.2: {} + stackframe@1.3.4: {} statuses@1.5.0: {} @@ -21382,6 +21675,8 @@ snapshots: statuses@2.0.2: {} + std-env@3.10.0: {} + strapi-lucide-icons@1.14.0(e379402d5010a11a96dd3cdf1dbde9ed): dependencies: '@strapi/design-system': 2.2.0(@babel/runtime@7.28.4)(@codemirror/autocomplete@6.20.0)(@codemirror/language@6.11.3)(@codemirror/lint@6.9.2)(@codemirror/search@6.5.11)(@codemirror/state@6.7.1)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.43.0)(@strapi/icons@2.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.19(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.1.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) @@ -21513,6 +21808,10 @@ snapshots: strip-json-comments@2.0.1: {} + strip-literal@3.1.0: + dependencies: + js-tokens: 9.0.1 + strnum@2.2.3: {} strtok3@10.3.4: @@ -21670,14 +21969,24 @@ snapshots: tiny-warning@1.0.3: {} + tinybench@2.9.0: {} + + tinyexec@0.3.2: {} + tinyexec@1.0.4: {} tinyexec@1.3.0: {} - tinyglobby@0.2.15: + tinyglobby@0.2.17: dependencies: - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 + fdir: 6.5.0(picomatch@4.0.7) + picomatch: 4.0.7 + + tinypool@1.1.1: {} + + tinyrainbow@2.0.0: {} + + tinyspy@4.0.6: {} title-case@4.3.2: {} @@ -22052,6 +22361,42 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 + vite-node@3.2.4(@types/node@20.19.27)(lightningcss@1.31.1)(terser@5.51.2): + dependencies: + cac: 6.7.14 + debug: 4.4.3(supports-color@5.5.0) + es-module-lexer: 1.7.0 + pathe: 2.0.3 + vite: 5.4.21(@types/node@20.19.27)(lightningcss@1.31.1)(terser@5.51.2) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + vite-node@3.2.4(@types/node@22.15.3)(lightningcss@1.31.1)(terser@5.51.2): + dependencies: + cac: 6.7.14 + debug: 4.4.3(supports-color@5.5.0) + es-module-lexer: 1.7.0 + pathe: 2.0.3 + vite: 5.4.21(@types/node@22.15.3)(lightningcss@1.31.1)(terser@5.51.2) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + vite@5.4.21(@types/node@20.19.27)(lightningcss@1.31.1)(terser@5.51.2): dependencies: esbuild: 0.21.5 @@ -22063,6 +22408,97 @@ snapshots: lightningcss: 1.31.1 terser: 5.51.2 + vite@5.4.21(@types/node@22.15.3)(lightningcss@1.31.1)(terser@5.51.2): + dependencies: + esbuild: 0.21.5 + postcss: 8.5.6 + rollup: 4.53.5 + optionalDependencies: + '@types/node': 22.15.3 + fsevents: 2.3.3 + lightningcss: 1.31.1 + terser: 5.51.2 + + vitest@3.2.7(@types/debug@4.1.12)(@types/node@20.19.27)(jsdom@30.0.1(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.51.2): + dependencies: + '@types/chai': 5.2.3 + '@vitest/expect': 3.2.7 + '@vitest/mocker': 3.2.7(vite@5.4.21(@types/node@20.19.27)(lightningcss@1.31.1)(terser@5.51.2)) + '@vitest/pretty-format': 3.2.7 + '@vitest/runner': 3.2.7 + '@vitest/snapshot': 3.2.7 + '@vitest/spy': 3.2.7 + '@vitest/utils': 3.2.7 + chai: 5.3.3 + debug: 4.4.3(supports-color@5.5.0) + expect-type: 1.4.0 + magic-string: 0.30.21 + pathe: 2.0.3 + picomatch: 4.0.7 + std-env: 3.10.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.17 + tinypool: 1.1.1 + tinyrainbow: 2.0.0 + vite: 5.4.21(@types/node@20.19.27)(lightningcss@1.31.1)(terser@5.51.2) + vite-node: 3.2.4(@types/node@20.19.27)(lightningcss@1.31.1)(terser@5.51.2) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/debug': 4.1.12 + '@types/node': 20.19.27 + jsdom: 30.0.1(@noble/hashes@2.0.1) + transitivePeerDependencies: + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + vitest@3.2.7(@types/debug@4.1.12)(@types/node@22.15.3)(jsdom@30.0.1(@noble/hashes@2.0.1))(lightningcss@1.31.1)(terser@5.51.2): + dependencies: + '@types/chai': 5.2.3 + '@vitest/expect': 3.2.7 + '@vitest/mocker': 3.2.7(vite@5.4.21(@types/node@22.15.3)(lightningcss@1.31.1)(terser@5.51.2)) + '@vitest/pretty-format': 3.2.7 + '@vitest/runner': 3.2.7 + '@vitest/snapshot': 3.2.7 + '@vitest/spy': 3.2.7 + '@vitest/utils': 3.2.7 + chai: 5.3.3 + debug: 4.4.3(supports-color@5.5.0) + expect-type: 1.4.0 + magic-string: 0.30.21 + pathe: 2.0.3 + picomatch: 4.0.7 + std-env: 3.10.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.17 + tinypool: 1.1.1 + tinyrainbow: 2.0.0 + vite: 5.4.21(@types/node@22.15.3)(lightningcss@1.31.1)(terser@5.51.2) + vite-node: 3.2.4(@types/node@22.15.3)(lightningcss@1.31.1)(terser@5.51.2) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/debug': 4.1.12 + '@types/node': 22.15.3 + jsdom: 30.0.1(@noble/hashes@2.0.1) + transitivePeerDependencies: + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + w3c-keyname@2.2.8: {} w3c-xmlserializer@5.0.0: @@ -22239,6 +22675,11 @@ snapshots: dependencies: isexe: 2.0.0 + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + widest-line@3.1.0: dependencies: string-width: 4.2.3 diff --git a/turbo.json b/turbo.json index 9174cba..3f979ff 100644 --- a/turbo.json +++ b/turbo.json @@ -18,6 +18,9 @@ "check-types": { "dependsOn": ["^check-types"] }, + "test": { + "dependsOn": ["^test"] + }, "dev": { "cache": false, "persistent": true