@better-auth/sso 1.7.7 → 1.7.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/client.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { t as SSOPlugin } from "./index-sM6JWXeV.mjs";
1
+ import { t as SSOPlugin } from "./index-CuvoOoW_.mjs";
2
2
  import { DBFieldAttribute } from "better-auth/db";
3
3
 
4
4
  //#region src/client.d.ts
package/dist/client.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { t as PACKAGE_VERSION } from "./version-DFla2W8i.mjs";
1
+ import { t as PACKAGE_VERSION } from "./version-C76AN0VD.mjs";
2
2
  //#region src/client.ts
3
3
  const ssoClient = (options) => {
4
4
  return {
@@ -149,6 +149,9 @@ interface SAMLConfig {
149
149
  /**
150
150
  * Provider-level post-auth redirect URL for IdP-initiated or fallback SAML
151
151
  * flows when no RelayState callback URL is available.
152
+ *
153
+ * Not the Assertion Consumer Service (ACS) URL. To accept responses
154
+ * addressed to another ACS URL, list it in `spMetadata.metadata`.
152
155
  */
153
156
  callbackUrl?: string | undefined;
154
157
  /**
@@ -988,9 +991,9 @@ declare const updateSSOProvider: (options: SSOOptions) => _$better_call0.StrictE
988
991
  pkce: z.ZodOptional<z.ZodOptional<z.ZodDefault<z.ZodBoolean>>>;
989
992
  overrideUserInfo: z.ZodOptional<z.ZodOptional<z.ZodBoolean>>;
990
993
  mapping: z.ZodOptional<z.ZodOptional<z.ZodObject<{
991
- email: z.ZodString;
994
+ email: z.ZodOptional<z.ZodString>;
992
995
  emailVerified: z.ZodOptional<z.ZodString>;
993
- name: z.ZodString;
996
+ name: z.ZodOptional<z.ZodString>;
994
997
  image: z.ZodOptional<z.ZodString>;
995
998
  extraFields: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
996
999
  }, z.core.$strict>>>;
@@ -998,9 +1001,9 @@ declare const updateSSOProvider: (options: SSOOptions) => _$better_call0.StrictE
998
1001
  samlConfig: z.ZodOptional<z.ZodObject<{
999
1002
  audience: z.ZodOptional<z.ZodOptional<z.ZodString>>;
1000
1003
  mapping: z.ZodOptional<z.ZodOptional<z.ZodObject<{
1001
- email: z.ZodString;
1004
+ email: z.ZodOptional<z.ZodString>;
1002
1005
  emailVerified: z.ZodOptional<z.ZodString>;
1003
- name: z.ZodString;
1006
+ name: z.ZodOptional<z.ZodString>;
1004
1007
  firstName: z.ZodOptional<z.ZodString>;
1005
1008
  lastName: z.ZodOptional<z.ZodString>;
1006
1009
  extraFields: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
@@ -1320,7 +1323,6 @@ declare const registerSSOProvider: <O extends SSOOptions>(options: O) => _$bette
1320
1323
  description: string;
1321
1324
  };
1322
1325
  };
1323
- required: string[];
1324
1326
  };
1325
1327
  };
1326
1328
  required: string[];
package/dist/index.d.mts CHANGED
@@ -1,2 +1,2 @@
1
- import { A as SAMLIdentityProviderMetadata, B as SSOUserResolutionContext, C as deriveSAMLIdentityProviderEntityID, D as DEFAULT_MAX_SAML_RESPONSE_SIZE, E as DEFAULT_MAX_SAML_METADATA_SIZE, F as SSOProviderMutationGuardInput, G as DigestAlgorithm, H as AlgorithmValidationOptions, I as SSOProviderReference, K as KeyEncryptionAlgorithm, L as SSOProviderUserProfile, M as SSOOptions, N as SSOProvider, O as OIDCConfig, P as SSOProviderMutationGuardContext, R as SSOSAMLUserResolutionInput, S as SAMLServiceProviderPolicy, T as DEFAULT_CLOCK_SKEW_MS, U as DataEncryptionAlgorithm, V as SSOUserResolutionInput, W as DeprecatedAlgorithmBehavior, _ as REQUIRED_DISCOVERY_FIELDS, a as fetchDiscoveryDocument, b as TimestampValidationOptions, c as normalizeUrl, d as validateDiscoveryUrl, f as DiscoverOIDCConfigParams, g as OIDCDiscoveryDocument, h as HydratedOIDCConfig, i as discoverOIDCConfig, j as SSOOIDCUserResolutionInput, k as SAMLConfig, l as selectTokenEndpointAuthMethod, m as DiscoveryErrorCode, n as sso, o as needsRuntimeDiscovery, p as DiscoveryError, q as SignatureAlgorithm, r as computeDiscoveryUrl, s as normalizeDiscoveryUrls, t as SSOPlugin, u as validateDiscoveryDocument, v as RequiredDiscoveryField, w as deriveSAMLServiceProviderPolicy, x as validateSAMLTimestamp, y as SAMLConditions, z as SSOUserResolution } from "./index-sM6JWXeV.mjs";
1
+ import { A as SAMLIdentityProviderMetadata, B as SSOUserResolutionContext, C as deriveSAMLIdentityProviderEntityID, D as DEFAULT_MAX_SAML_RESPONSE_SIZE, E as DEFAULT_MAX_SAML_METADATA_SIZE, F as SSOProviderMutationGuardInput, G as DigestAlgorithm, H as AlgorithmValidationOptions, I as SSOProviderReference, K as KeyEncryptionAlgorithm, L as SSOProviderUserProfile, M as SSOOptions, N as SSOProvider, O as OIDCConfig, P as SSOProviderMutationGuardContext, R as SSOSAMLUserResolutionInput, S as SAMLServiceProviderPolicy, T as DEFAULT_CLOCK_SKEW_MS, U as DataEncryptionAlgorithm, V as SSOUserResolutionInput, W as DeprecatedAlgorithmBehavior, _ as REQUIRED_DISCOVERY_FIELDS, a as fetchDiscoveryDocument, b as TimestampValidationOptions, c as normalizeUrl, d as validateDiscoveryUrl, f as DiscoverOIDCConfigParams, g as OIDCDiscoveryDocument, h as HydratedOIDCConfig, i as discoverOIDCConfig, j as SSOOIDCUserResolutionInput, k as SAMLConfig, l as selectTokenEndpointAuthMethod, m as DiscoveryErrorCode, n as sso, o as needsRuntimeDiscovery, p as DiscoveryError, q as SignatureAlgorithm, r as computeDiscoveryUrl, s as normalizeDiscoveryUrls, t as SSOPlugin, u as validateDiscoveryDocument, v as RequiredDiscoveryField, w as deriveSAMLServiceProviderPolicy, x as validateSAMLTimestamp, y as SAMLConditions, z as SSOUserResolution } from "./index-CuvoOoW_.mjs";
2
2
  export { AlgorithmValidationOptions, DEFAULT_CLOCK_SKEW_MS, DEFAULT_MAX_SAML_METADATA_SIZE, DEFAULT_MAX_SAML_RESPONSE_SIZE, DataEncryptionAlgorithm, DeprecatedAlgorithmBehavior, DigestAlgorithm, DiscoverOIDCConfigParams, DiscoveryError, DiscoveryErrorCode, HydratedOIDCConfig, KeyEncryptionAlgorithm, OIDCConfig, OIDCDiscoveryDocument, REQUIRED_DISCOVERY_FIELDS, RequiredDiscoveryField, SAMLConditions, SAMLConfig, SAMLIdentityProviderMetadata, SAMLServiceProviderPolicy, SSOOIDCUserResolutionInput, SSOOptions, SSOPlugin, SSOProvider, SSOProviderMutationGuardContext, SSOProviderMutationGuardInput, SSOProviderReference, SSOProviderUserProfile, SSOSAMLUserResolutionInput, SSOUserResolution, SSOUserResolutionContext, SSOUserResolutionInput, SignatureAlgorithm, TimestampValidationOptions, computeDiscoveryUrl, deriveSAMLIdentityProviderEntityID, deriveSAMLServiceProviderPolicy, discoverOIDCConfig, fetchDiscoveryDocument, needsRuntimeDiscovery, normalizeDiscoveryUrls, normalizeUrl, selectTokenEndpointAuthMethod, sso, validateDiscoveryDocument, validateDiscoveryUrl, validateSAMLTimestamp };
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { t as PACKAGE_VERSION } from "./version-DFla2W8i.mjs";
1
+ import { t as PACKAGE_VERSION } from "./version-C76AN0VD.mjs";
2
2
  import { APIError, addOAuthServerContext, createAuthEndpoint, createAuthMiddleware, getSessionFromCtx, sessionMiddleware } from "better-auth/api";
3
3
  import { XMLParser, XMLValidator } from "fast-xml-parser";
4
4
  import { X509Certificate } from "node:crypto";
@@ -648,7 +648,7 @@ function validateDiscoveryDocument(doc, configuredIssuer) {
648
648
  const missingFields = [];
649
649
  for (const field of REQUIRED_DISCOVERY_FIELDS) if (!doc[field]) missingFields.push(field);
650
650
  if (missingFields.length > 0) throw new DiscoveryError("discovery_incomplete", `Discovery document is missing required fields: ${missingFields.join(", ")}`, { missingFields });
651
- if ((doc.issuer.endsWith("/") ? doc.issuer.slice(0, -1) : doc.issuer) !== (configuredIssuer.endsWith("/") ? configuredIssuer.slice(0, -1) : configuredIssuer)) throw new DiscoveryError("issuer_mismatch", `Discovered issuer "${doc.issuer}" does not match configured issuer "${configuredIssuer}"`, {
651
+ if (doc.issuer !== configuredIssuer) throw new DiscoveryError("issuer_mismatch", `Discovered issuer "${doc.issuer}" does not match configured issuer "${configuredIssuer}"`, {
652
652
  discovered: doc.issuer,
653
653
  configured: configuredIssuer
654
654
  });
@@ -1851,16 +1851,16 @@ function parseSSOProviderAdditionalFields(options, data, action) {
1851
1851
  });
1852
1852
  }
1853
1853
  const oidcMappingSchema = z.strictObject({
1854
- email: z.string().meta({ description: "Field mapping for email (defaults to 'email')" }),
1854
+ email: z.string().meta({ description: "Field mapping for email (defaults to 'email')" }).optional(),
1855
1855
  emailVerified: z.string().meta({ description: "Field mapping for email verification (defaults to 'email_verified')" }).optional(),
1856
- name: z.string().meta({ description: "Field mapping for name (defaults to 'name')" }),
1856
+ name: z.string().meta({ description: "Field mapping for name (defaults to 'name')" }).optional(),
1857
1857
  image: z.string().meta({ description: "Field mapping for image (defaults to 'picture')" }).optional(),
1858
1858
  extraFields: z.record(z.string(), z.any()).optional()
1859
1859
  }).optional();
1860
1860
  const samlMappingSchema = z.strictObject({
1861
- email: z.string().meta({ description: "Field mapping for email (defaults to 'email')" }),
1861
+ email: z.string().meta({ description: "Field mapping for email (defaults to 'email')" }).optional(),
1862
1862
  emailVerified: z.string().meta({ description: "Field mapping for email verification" }).optional(),
1863
- name: z.string().meta({ description: "Field mapping for name (defaults to 'displayName')" }),
1863
+ name: z.string().meta({ description: "Field mapping for name (defaults to 'displayName')" }).optional(),
1864
1864
  firstName: z.string().meta({ description: "Field mapping for first name (defaults to 'givenName')" }).optional(),
1865
1865
  lastName: z.string().meta({ description: "Field mapping for last name (defaults to 'surname')" }).optional(),
1866
1866
  extraFields: z.record(z.string(), z.any()).optional()
@@ -1977,7 +1977,7 @@ const OIDC_IDENTITY_BOUNDARY_FIELDS = [
1977
1977
  "tokenEndpoint",
1978
1978
  "userInfoEndpoint"
1979
1979
  ];
1980
- const SAML_IDENTITY_BOUNDARY_FIELDS = ["audience", "callbackUrl"];
1980
+ const SAML_IDENTITY_BOUNDARY_FIELDS = ["audience"];
1981
1981
  function isRecord(value) {
1982
1982
  return typeof value === "object" && value !== null && !Array.isArray(value);
1983
1983
  }
@@ -1995,7 +1995,13 @@ function hasChangedField(current, updated, fields) {
1995
1995
  function oidcIdentityBoundaryChanged(current, updated) {
1996
1996
  return hasChangedField(current, updated, OIDC_IDENTITY_BOUNDARY_FIELDS);
1997
1997
  }
1998
- function samlIdentityBoundaryChanged(current, updated) {
1998
+ /**
1999
+ * Signing certificates are reported apart from the identity boundary: they
2000
+ * change who can sign assertions, so the mutation guard treats them as an
2001
+ * authentication-boundary change, but they do not change which IdP identities
2002
+ * linked accounts belong to.
2003
+ */
2004
+ function samlBoundaryChanges(current, updated) {
1999
2005
  const currentIdentityProvider = createIdP(current).entityMeta;
2000
2006
  const updatedIdentityProvider = createIdP(updated).entityMeta;
2001
2007
  let currentServiceProvider;
@@ -2004,7 +2010,10 @@ function samlIdentityBoundaryChanged(current, updated) {
2004
2010
  currentServiceProvider = current.spMetadata?.metadata ? parseSAMLServiceProviderMetadata(current.spMetadata.metadata) : null;
2005
2011
  updatedServiceProvider = updated.spMetadata?.metadata ? parseSAMLServiceProviderMetadata(updated.spMetadata.metadata) : null;
2006
2012
  } catch {
2007
- return true;
2013
+ return {
2014
+ identity: true,
2015
+ trustAnchors: true
2016
+ };
2008
2017
  }
2009
2018
  const effectiveIdentityBoundary = (config) => {
2010
2019
  const identityProvider = config === current ? currentIdentityProvider : updatedIdentityProvider;
@@ -2015,7 +2024,7 @@ function samlIdentityBoundaryChanged(current, updated) {
2015
2024
  idpPostService: identityProvider.getSingleSignOnService("post"),
2016
2025
  spEntityId: serviceProvider?.entityID ?? config.spMetadata?.entityID ?? config.issuer,
2017
2026
  spNameIDFormat: serviceProvider?.nameIDFormats.at(0) ?? config.identifierFormat,
2018
- spPostServices: serviceProvider ? getSAMLPostAssertionConsumerServiceUrls(config.spMetadata?.metadata) : config.callbackUrl ? [config.callbackUrl] : [],
2027
+ spPostServices: serviceProvider ? getSAMLPostAssertionConsumerServiceUrls(config.spMetadata?.metadata) : [],
2019
2028
  wantAssertionsSigned: serviceProvider?.wantAssertionsSigned ?? config.wantAssertionsSigned === true
2020
2029
  };
2021
2030
  };
@@ -2023,18 +2032,27 @@ function samlIdentityBoundaryChanged(current, updated) {
2023
2032
  const certificates = identityProvider.getX509Certificate("signing");
2024
2033
  return (Array.isArray(certificates) ? certificates : certificates ? [certificates] : []).map((certificate) => normalizePem(certificate) ?? certificate).sort();
2025
2034
  };
2026
- return hasChangedField(current, updated, SAML_IDENTITY_BOUNDARY_FIELDS) || identityValueChanged(trustAnchors(currentIdentityProvider), trustAnchors(updatedIdentityProvider)) || identityValueChanged(effectiveIdentityBoundary(current), effectiveIdentityBoundary(updated));
2035
+ return {
2036
+ identity: hasChangedField(current, updated, SAML_IDENTITY_BOUNDARY_FIELDS) || identityValueChanged(effectiveIdentityBoundary(current), effectiveIdentityBoundary(updated)),
2037
+ trustAnchors: identityValueChanged(trustAnchors(currentIdentityProvider), trustAnchors(updatedIdentityProvider))
2038
+ };
2027
2039
  }
2028
2040
  function parseConfigSnapshot(config, configType) {
2029
2041
  if (!config) return;
2030
2042
  if (typeof config === "string") return parseAndValidateConfig(config, configType);
2031
2043
  return config;
2032
2044
  }
2033
- function ssoProviderIdentityBoundaryChanged(current, updated) {
2045
+ function ssoProviderAuthBoundaryChanged(current, updated) {
2034
2046
  if (identityValueChanged(current.issuer, updated.issuer)) return true;
2035
2047
  const currentSamlConfig = parseConfigSnapshot(current.samlConfig, "SAML");
2036
2048
  const updatedSamlConfig = parseConfigSnapshot(updated.samlConfig, "SAML");
2037
- if (currentSamlConfig && (!updatedSamlConfig || samlIdentityBoundaryChanged(currentSamlConfig, updatedSamlConfig))) return true;
2049
+ if (currentSamlConfig) {
2050
+ if (!updatedSamlConfig) return true;
2051
+ if (identityValueChanged(currentSamlConfig, updatedSamlConfig)) {
2052
+ const changes = samlBoundaryChanges(currentSamlConfig, updatedSamlConfig);
2053
+ if (changes.identity || changes.trustAnchors) return true;
2054
+ }
2055
+ }
2038
2056
  const currentOidcConfig = parseConfigSnapshot(current.oidcConfig, "OIDC");
2039
2057
  const updatedOidcConfig = parseConfigSnapshot(updated.oidcConfig, "OIDC");
2040
2058
  return Boolean(currentOidcConfig && (!updatedOidcConfig || oidcIdentityBoundaryChanged(currentOidcConfig, updatedOidcConfig)));
@@ -2104,7 +2122,7 @@ async function lockSSOProviderForAccountLink(ctx, provider) {
2104
2122
  code: "SSO_PROVIDER_CHANGED",
2105
2123
  message: "SSO provider changed while account linking was in progress"
2106
2124
  });
2107
- if (ssoProviderIdentityBoundaryChanged(provider, lockedProvider)) throw new APIError("CONFLICT", {
2125
+ if (ssoProviderAuthBoundaryChanged(provider, lockedProvider)) throw new APIError("CONFLICT", {
2108
2126
  code: "SSO_PROVIDER_CHANGED",
2109
2127
  message: "SSO provider changed while account linking was in progress"
2110
2128
  });
@@ -2356,7 +2374,7 @@ const updateSSOProvider = (options) => {
2356
2374
  metadata: { openapi: {
2357
2375
  operationId: "updateSSOProvider",
2358
2376
  summary: "Update SSO provider",
2359
- description: "Partially update an SSO provider. Only provided fields are updated. If domain changes, domainVerified is reset to false.",
2377
+ description: "Partially update an SSO provider. A supplied OIDC or SAML mapping replaces the entire previous mapping. If the domain changes, domainVerified is reset to false.",
2360
2378
  responses: {
2361
2379
  "200": { description: "SSO provider updated successfully. The `certificate` field is an array of parsed certificates for SAML providers, or absent when certs live inside `idpMetadata.metadata`." },
2362
2380
  "404": { description: "Provider not found" },
@@ -2379,6 +2397,7 @@ const updateSSOProvider = (options) => {
2379
2397
  if (!existingProvider) throw new APIError("NOT_FOUND", { message: "Provider not found" });
2380
2398
  const updateData = { ...additionalFields };
2381
2399
  let providerIdentityBoundaryChanged = body.issuer !== void 0 && body.issuer !== existingProvider.issuer;
2400
+ let trustAnchorsChanged = false;
2382
2401
  if (body.issuer !== void 0) updateData.issuer = body.issuer;
2383
2402
  if (body.domain !== void 0) {
2384
2403
  updateData.domain = body.domain;
@@ -2397,7 +2416,9 @@ const updateSSOProvider = (options) => {
2397
2416
  validateCertSources(updatedSamlConfig);
2398
2417
  assertSAMLIdentityProviderAuthority(updatedSamlConfig);
2399
2418
  assertSAMLServiceProviderMetadataPolicy(updatedSamlConfig);
2400
- if (samlIdentityBoundaryChanged(currentSamlConfig, updatedSamlConfig)) providerIdentityBoundaryChanged = true;
2419
+ const changes = samlBoundaryChanges(currentSamlConfig, updatedSamlConfig);
2420
+ if (changes.identity) providerIdentityBoundaryChanged = true;
2421
+ trustAnchorsChanged = changes.trustAnchors;
2401
2422
  updateData.samlConfig = JSON.stringify(updatedSamlConfig);
2402
2423
  }
2403
2424
  if (body.oidcConfig) {
@@ -2416,7 +2437,7 @@ const updateSSOProvider = (options) => {
2416
2437
  }
2417
2438
  await guardSSOProviderMutation(options, {
2418
2439
  action: "update",
2419
- isAuthenticationBoundaryChange: providerIdentityBoundaryChanged
2440
+ isAuthenticationBoundaryChange: providerIdentityBoundaryChanged || trustAnchorsChanged
2420
2441
  }, existingProvider, trx, ctx.context.logger);
2421
2442
  if (providerIdentityBoundaryChanged) {
2422
2443
  if (await trx.findOne({
@@ -3291,8 +3312,7 @@ const registerSSOProvider = (options) => {
3291
3312
  nullable: true,
3292
3313
  description: "Additional field mappings"
3293
3314
  }
3294
- },
3295
- required: ["email", "name"]
3315
+ }
3296
3316
  }
3297
3317
  },
3298
3318
  required: [
@@ -3888,6 +3908,7 @@ async function handleOIDCCallback(ctx, options, providerId, stateData, parsedPro
3888
3908
  const value = claims[claim];
3889
3909
  return typeof value === "string" && value.length > 0 ? value : void 0;
3890
3910
  };
3911
+ const readEmailClaim = (claims) => [claims[mapping.email || "email"]].flat().find((value) => typeof value === "string" && value.length > 0);
3891
3912
  let rawProfile;
3892
3913
  let verifiedIdToken = null;
3893
3914
  if (tokenResponse.idToken) {
@@ -3918,7 +3939,7 @@ async function handleOIDCCallback(ctx, options, providerId, stateData, parsedPro
3918
3939
  userInfo = {
3919
3940
  ...Object.fromEntries(Object.entries(mapping.extraFields || {}).map(([key, value]) => [key, rawUserInfo[value]])),
3920
3941
  id: readStringClaim(rawUserInfo, "sub"),
3921
- email: readStringClaim(rawUserInfo, mapping.email || "email"),
3942
+ email: readEmailClaim(rawUserInfo),
3922
3943
  emailVerified: options?.trustEmailVerified ? parseProviderEmailVerified(rawUserInfo[mapping.emailVerified || "email_verified"]) : false,
3923
3944
  name: readStringClaim(rawUserInfo, mapping.name || "name"),
3924
3945
  image: readStringClaim(rawUserInfo, mapping.image || "picture")
@@ -3929,7 +3950,7 @@ async function handleOIDCCallback(ctx, options, providerId, stateData, parsedPro
3929
3950
  userInfo = {
3930
3951
  ...Object.fromEntries(Object.entries(mapping.extraFields || {}).map(([key, value]) => [key, idToken[value]])),
3931
3952
  id: idToken.sub,
3932
- email: readStringClaim(idToken, mapping.email || "email"),
3953
+ email: readEmailClaim(idToken),
3933
3954
  emailVerified: options?.trustEmailVerified ? parseProviderEmailVerified(idToken[mapping.emailVerified || "email_verified"]) : false,
3934
3955
  name: readStringClaim(idToken, mapping.name || "name"),
3935
3956
  image: readStringClaim(idToken, mapping.image || "picture")
@@ -1,5 +1,5 @@
1
1
  //#endregion
2
2
  //#region src/version.ts
3
- const PACKAGE_VERSION = "1.7.7";
3
+ const PACKAGE_VERSION = "1.7.8";
4
4
  //#endregion
5
5
  export { PACKAGE_VERSION as t };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@better-auth/sso",
3
- "version": "1.7.7",
3
+ "version": "1.7.8",
4
4
  "description": "SSO plugin for Better Auth",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -66,22 +66,22 @@
66
66
  "devDependencies": {
67
67
  "@types/body-parser": "^1.19.6",
68
68
  "@types/express": "^5.0.6",
69
- "better-call": "1.4.0",
69
+ "better-call": "1.4.2",
70
70
  "body-parser": "^2.3.0",
71
71
  "express": "^5.2.1",
72
72
  "kysely": "^0.28.17 || ^0.29.0",
73
73
  "oauth2-mock-server": "^9.0.0",
74
74
  "tsdown": "0.21.10",
75
- "@better-auth/core": "1.7.7",
76
- "@better-auth/kysely-adapter": "1.7.7",
77
- "better-auth": "1.7.7"
75
+ "@better-auth/core": "1.7.8",
76
+ "@better-auth/kysely-adapter": "1.7.8",
77
+ "better-auth": "1.7.8"
78
78
  },
79
79
  "peerDependencies": {
80
- "@better-auth/utils": "0.4.2",
80
+ "@better-auth/utils": "^0.4.2 || ^0.5.0",
81
81
  "@better-fetch/fetch": "1.3.2",
82
- "better-call": "1.4.0",
83
- "@better-auth/core": "^1.7.7",
84
- "better-auth": "^1.7.7"
82
+ "better-call": "1.4.2",
83
+ "@better-auth/core": "^1.7.8",
84
+ "better-auth": "^1.7.8"
85
85
  },
86
86
  "scripts": {
87
87
  "build": "tsdown",