better-auth 1.6.6 → 1.6.7

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.
@@ -98,16 +98,43 @@ function toAuthEndpoints(endpoints, ctx) {
98
98
  [ATTR_HTTP_ROUTE]: route,
99
99
  [ATTR_OPERATION_ID]: operationId
100
100
  }, () => endpoint(internalContext))).catch((e) => {
101
- if (isAPIError(e))
102
- /**
103
- * API Errors from response are caught
104
- * and returned to hooks
105
- */
106
- return {
107
- response: e,
108
- status: e.statusCode,
109
- headers: e.headers ? new Headers(e.headers) : null
110
- };
101
+ if (isAPIError(e)) {
102
+ /**
103
+ * API Errors from response are caught
104
+ * and returned to hooks.
105
+ *
106
+ * Headers come from two sources that must both
107
+ * survive:
108
+ * - `kAPIErrorHeaderSymbol`: ctx.responseHeaders
109
+ * accumulated via c.setCookie / c.setHeader
110
+ * before the throw.
111
+ * - `e.headers`: explicit headers on the APIError
112
+ * (e.g. `location` from c.redirect).
113
+ *
114
+ * Start from the accumulated ctx headers, then
115
+ * apply e.headers on top — appending `set-cookie`
116
+ * and setting others — so explicit APIError
117
+ * headers override while cookies accumulate.
118
+ */
119
+ const ctxHeaders = e[kAPIErrorHeaderSymbol];
120
+ const errHeaders = e.headers ? new Headers(e.headers) : null;
121
+ let headers = null;
122
+ if (ctxHeaders || errHeaders) {
123
+ headers = new Headers();
124
+ ctxHeaders?.forEach((value, key) => {
125
+ headers.append(key, value);
126
+ });
127
+ errHeaders?.forEach((value, key) => {
128
+ if (key.toLowerCase() === "set-cookie") headers.append(key, value);
129
+ else headers.set(key, value);
130
+ });
131
+ }
132
+ return {
133
+ response: e,
134
+ status: e.statusCode,
135
+ headers
136
+ };
137
+ }
111
138
  throw e;
112
139
  });
113
140
  if (result && result instanceof Response) return result;
@@ -116,7 +143,26 @@ function toAuthEndpoints(endpoints, ctx) {
116
143
  const after = await runAfterHooks(internalContext, afterHooks, endpoint, operationId);
117
144
  if (after.response) result.response = after.response;
118
145
  if (isAPIError(result.response) && shouldPublishLog(authContext.logger.level, "debug")) result.response.stack = result.response.errorStack;
119
- if (isAPIError(result.response) && !shouldReturnResponse) throw result.response;
146
+ if (isAPIError(result.response) && !shouldReturnResponse) {
147
+ /**
148
+ * Non-response path: we re-throw the raw APIError
149
+ * to callers of `auth.api.*`. `result.headers`
150
+ * holds the merged ctx + explicit headers (see
151
+ * catch block above) — rewrite
152
+ * `kAPIErrorHeaderSymbol` with the merged set so
153
+ * downstream pipelines (e.g. better-call's
154
+ * response builder, or an outer hook catch) see
155
+ * the same headers we'd have written on the
156
+ * response.
157
+ */
158
+ if (result.headers) Object.defineProperty(result.response, kAPIErrorHeaderSymbol, {
159
+ enumerable: false,
160
+ configurable: true,
161
+ writable: false,
162
+ value: result.headers
163
+ });
164
+ throw result.response;
165
+ }
120
166
  return shouldReturnResponse ? toResponse(result.response, {
121
167
  headers: result.headers,
122
168
  status: result.status
@@ -29,7 +29,7 @@ async function generateState(c, link, additionalData) {
29
29
  }
30
30
  }
31
31
  async function parseState(c) {
32
- const state = c.query.state || c.body.state;
32
+ const state = c.query.state || c.body?.state;
33
33
  const errorURL = c.context.options.onAPIError?.errorURL || `${c.context.baseURL}/error`;
34
34
  let parsedData;
35
35
  try {
package/dist/package.mjs CHANGED
@@ -1,4 +1,4 @@
1
1
  //#region package.json
2
- var version = "1.6.6";
2
+ var version = "1.6.7";
3
3
  //#endregion
4
4
  export { version };
@@ -312,6 +312,11 @@ const verifyPhoneNumber = (opts) => createAuthEndpoint("/phone-number/verify", {
312
312
  [opts.phoneNumber]: ctx.body.phoneNumber,
313
313
  [opts.phoneNumberVerified]: true
314
314
  });
315
+ if (!user) throw APIError.from("INTERNAL_SERVER_ERROR", BASE_ERROR_CODES.FAILED_TO_UPDATE_USER);
316
+ await opts?.callbackOnVerification?.({
317
+ phoneNumber: ctx.body.phoneNumber,
318
+ user
319
+ }, ctx);
315
320
  return ctx.json({
316
321
  status: true,
317
322
  token: session.session.token,
@@ -1,6 +1,2 @@
1
- import { APIError } from "@better-auth/core/error";
2
-
3
- //#region src/utils/is-api-error.d.ts
4
- declare function isAPIError(error: unknown): error is APIError;
5
- //#endregion
1
+ import { isAPIError } from "@better-auth/core/utils/is-api-error";
6
2
  export { isAPIError };
@@ -1,8 +1,2 @@
1
- import { APIError } from "@better-auth/core/error";
2
- import { APIError as APIError$1 } from "better-call";
3
- //#region src/utils/is-api-error.ts
4
- function isAPIError(error) {
5
- return error instanceof APIError$1 || error instanceof APIError || error?.name === "APIError";
6
- }
7
- //#endregion
1
+ import { isAPIError } from "@better-auth/core/utils/is-api-error";
8
2
  export { isAPIError };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "better-auth",
3
- "version": "1.6.6",
3
+ "version": "1.6.7",
4
4
  "description": "The most comprehensive authentication framework for TypeScript.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -489,13 +489,13 @@
489
489
  "kysely": "^0.28.14",
490
490
  "nanostores": "^1.1.1",
491
491
  "zod": "^4.3.6",
492
- "@better-auth/core": "1.6.6",
493
- "@better-auth/drizzle-adapter": "1.6.6",
494
- "@better-auth/kysely-adapter": "1.6.6",
495
- "@better-auth/memory-adapter": "1.6.6",
496
- "@better-auth/mongo-adapter": "1.6.6",
497
- "@better-auth/prisma-adapter": "1.6.6",
498
- "@better-auth/telemetry": "1.6.6"
492
+ "@better-auth/core": "1.6.7",
493
+ "@better-auth/drizzle-adapter": "1.6.7",
494
+ "@better-auth/kysely-adapter": "1.6.7",
495
+ "@better-auth/memory-adapter": "1.6.7",
496
+ "@better-auth/mongo-adapter": "1.6.7",
497
+ "@better-auth/prisma-adapter": "1.6.7",
498
+ "@better-auth/telemetry": "1.6.7"
499
499
  },
500
500
  "devDependencies": {
501
501
  "@lynx-js/react": "^0.116.3",