@dbx-tools/auth 0.6.97 → 0.6.99

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/lib/src/auth.js CHANGED
@@ -8,7 +8,7 @@
8
8
  * @module
9
9
  */
10
10
  import { passkey } from "@better-auth/passkey";
11
- import { authRequestSchema, authVerifySchema, SESSION_COOKIE_NAME, } from "@dbx-tools/shared-auth";
11
+ import { SESSION_COOKIE_NAME } from "@dbx-tools/shared-auth";
12
12
  import { log } from "@dbx-tools/shared-core";
13
13
  import { APIError, betterAuth } from "better-auth";
14
14
  import { emailOTP } from "better-auth/plugins";
@@ -31,7 +31,17 @@ export async function createPasswordlessAuth(config) {
31
31
  basePath,
32
32
  database: config.storage.database,
33
33
  secret: config.secret,
34
- trustedOrigins: [origin],
34
+ // The gate fronts the app on whatever interface address the tunnel binds
35
+ // (an overlay/LAN IP, localhost, or a public domain) — not just `baseURL`.
36
+ // Better Auth's origin check would reject every other host with
37
+ // INVALID_ORIGIN and block sign-in. Trust the request's own origin here:
38
+ // this endpoint sits behind the OTP gate and the tunnel preserves the
39
+ // browser's Host, so the fixed-origin CSRF check adds nothing while breaking
40
+ // legitimate access. Same-origin requests (no Origin header) are allowed too.
41
+ trustedOrigins: (request) => {
42
+ const requestOrigin = request?.headers.get("origin");
43
+ return requestOrigin ? [requestOrigin, origin] : [origin];
44
+ },
35
45
  session: {
36
46
  expiresIn: config.sessionTtlSeconds,
37
47
  updateAge: Math.min(24 * 60 * 60, config.sessionTtlSeconds),
@@ -89,8 +99,17 @@ export async function createPasswordlessAuth(config) {
89
99
  if (type !== "sign-in")
90
100
  return;
91
101
  const address = normalizeEmail(email);
92
- if (!(await config.authorizeIdentity(address)))
102
+ if (!(await config.authorizeIdentity(address))) {
103
+ // Accept any address and fail SILENTLY for one not on the allow-list:
104
+ // the request still returns 200 (so the gate never reveals who is
105
+ // allowed), and no code is sent. Logged at debug for diagnostics, not
106
+ // as a warning — an unknown address hitting the login page is normal.
107
+ logger.debug("verification code suppressed: identity not authorized", {
108
+ email: address,
109
+ });
93
110
  return;
111
+ }
112
+ logger.info("sending verification code", { email: address });
94
113
  void config.sendCode(address, otp, emailOptions).catch((error) => {
95
114
  logger.error("verification email failed", { email: address, error });
96
115
  });
@@ -132,38 +151,10 @@ export async function createPasswordlessAuth(config) {
132
151
  passkeysEnabled: true,
133
152
  });
134
153
  }
135
- if (path === `${basePath}/request` && request.method === "POST") {
136
- const parsed = authRequestSchema.safeParse(await requestJson(request));
137
- if (parsed.success) {
138
- await auth.api
139
- .sendVerificationOTP({
140
- body: { email: normalizeEmail(parsed.data.email), type: "sign-in" },
141
- headers: request.headers,
142
- })
143
- .catch(() => undefined);
144
- }
145
- return jsonResponse({ ok: true });
146
- }
147
- if (path === `${basePath}/verify` && request.method === "POST") {
148
- const parsed = authVerifySchema.safeParse(await requestJson(request));
149
- if (!parsed.success)
150
- return jsonResponse({ ok: false });
151
- try {
152
- const response = await auth.api.signInEmailOTP({
153
- body: {
154
- email: normalizeEmail(parsed.data.email),
155
- otp: parsed.data.code,
156
- name: displayName(parsed.data.email),
157
- },
158
- headers: request.headers,
159
- asResponse: true,
160
- });
161
- return compatibilityResponse(response, { ok: response.ok });
162
- }
163
- catch {
164
- return jsonResponse({ ok: false });
165
- }
166
- }
154
+ // OTP send + verify go straight to better-auth's native emailOTP endpoints
155
+ // (`/email-otp/send-verification-otp`, `/sign-in/email-otp`); there is no
156
+ // compatibility wrapper for them. Failures there are logged by the plugin's
157
+ // sendVerificationOTP hook, not swallowed behind an always-ok response.
167
158
  if (path === `${basePath}/logout` && request.method === "POST") {
168
159
  const response = await auth.api.signOut({
169
160
  headers: request.headers,
@@ -205,17 +196,6 @@ export function normalizeLogoutRedirectPath(value) {
205
196
  function normalizeEmail(email) {
206
197
  return email?.trim().toLowerCase() ?? "";
207
198
  }
208
- function displayName(email) {
209
- return normalizeEmail(email).split("@")[0] || "User";
210
- }
211
- async function requestJson(request) {
212
- try {
213
- return await request.json();
214
- }
215
- catch {
216
- return undefined;
217
- }
218
- }
219
199
  function jsonResponse(body, status = 200) {
220
200
  return new Response(JSON.stringify(body), {
221
201
  status,
@@ -234,4 +214,4 @@ function redirectResponse(response, location) {
234
214
  headers.append("set-cookie", cookie);
235
215
  return new Response(null, { status: 303, headers });
236
216
  }
237
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hdXRoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQy9DLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsZ0JBQWdCLEVBRWhCLG1CQUFtQixHQUNwQixNQUFNLHdCQUF3QixDQUFDO0FBQ2hDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBMEIsTUFBTSxhQUFhLENBQUM7QUFDM0UsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFM0MsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztBQXVDbEMsTUFBTSxDQUFDLEtBQUssVUFBVSxzQkFBc0IsQ0FDMUMsTUFBK0I7SUFFL0IsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUM5QyxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUM7SUFDdEMsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsSUFBSSxXQUFXLENBQUM7SUFDaEQsTUFBTSxrQkFBa0IsR0FBRywyQkFBMkIsQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUNsRixNQUFNLFlBQVksR0FBcUI7UUFDckMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLElBQUksd0JBQXdCO1FBQ25ELFNBQVMsRUFBRSxNQUFNLENBQUMsT0FBTztRQUN6QixPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sSUFBSSw0QkFBNEI7UUFD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ZSB3aXRoIGVtYWlsIE9UUCBhbmQgcGFzc2tleXMuXG4gKlxuICogQ2FsbGVycyBwcm92aWRlIGF1dGhvcml6YXRpb24sIGRlbGl2ZXJ5LCBzdG9yYWdlLCBvcmlnaW4sIGFuZCBzZWNyZXQuIEJldHRlclxuICogQXV0aCBvd25zIHVzZXJzLCBPVFAgdmVyaWZpY2F0aW9uIHJlY29yZHMsIHNlc3Npb25zLCByYXRlIGxpbWl0cywgcGFzc2tleVxuICogY3JlZGVudGlhbHMsIGFuZCB0aGVpciBuYXRpdmUgSFRUUCByb3V0ZXMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IHBhc3NrZXkgfSBmcm9tIFwiQGJldHRlci1hdXRoL3Bhc3NrZXlcIjtcbmltcG9ydCB7XG4gIGF1dGhSZXF1ZXN0U2NoZW1hLFxuICBhdXRoVmVyaWZ5U2NoZW1hLFxuICB0eXBlIEF1dGhTdGF0dXMsXG4gIFNFU1NJT05fQ09PS0lFX05BTUUsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1hdXRoXCI7XG5pbXBvcnQgeyBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgQVBJRXJyb3IsIGJldHRlckF1dGgsIHR5cGUgQmV0dGVyQXV0aE9wdGlvbnMgfSBmcm9tIFwiYmV0dGVyLWF1dGhcIjtcbmltcG9ydCB7IGVtYWlsT1RQIH0gZnJvbSBcImJldHRlci1hdXRoL3BsdWdpbnNcIjtcblxuaW1wb3J0IHR5cGUgeyBBdXRoU3RvcmFnZSB9IGZyb20gXCIuL3N0b3JhZ2UudHNcIjtcbmltcG9ydCB7IG1pZ3JhdGVBdXRoIH0gZnJvbSBcIi4vc3RvcmFnZS50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwiYXV0aFwiKTtcblxuZXhwb3J0IHR5cGUgQXV0aG9yaXplSWRlbnRpdHkgPSAoZW1haWw6IHN0cmluZykgPT4gYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj47XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aEVtYWlsT3B0aW9ucyB7XG4gIHN1YmplY3Q6IHN0cmluZztcbiAgYnJhbmROYW1lOiBzdHJpbmc7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgY29kZVR0bFNlY29uZHM6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYXNzd29yZGxlc3NBdXRoT3B0aW9ucyB7XG4gIHN0b3JhZ2U6IEF1dGhTdG9yYWdlO1xuICBiYXNlVVJMOiBzdHJpbmc7XG4gIGJhc2VQYXRoPzogc3RyaW5nO1xuICBhcHBOYW1lOiBzdHJpbmc7XG4gIHNlY3JldDogc3RyaW5nO1xuICBzZXNzaW9uQ29va2llTmFtZT86IHN0cmluZztcbiAgLyoqIFNhbWUtb3JpZ2luIHBhdGggcmV0dXJuZWQgYWZ0ZXIgbG9nb3V0LiBEZWZhdWx0cyB0byBgL2AuICovXG4gIGxvZ291dFJlZGlyZWN0UGF0aD86IHN0cmluZztcbiAgc2Vzc2lvblR0bFNlY29uZHM6IG51bWJlcjtcbiAgc2Vzc2lvbkN1dG9mZk1zPzogbnVtYmVyO1xuICBjb2RlVHRsU2Vjb25kczogbnVtYmVyO1xuICBtYXhBdHRlbXB0czogbnVtYmVyO1xuICBhdXRob3JpemVJZGVudGl0eTogQXV0aG9yaXplSWRlbnRpdHk7XG4gIHNlbmRDb2RlKGVtYWlsOiBzdHJpbmcsIGNvZGU6IHN0cmluZywgb3B0aW9uczogQXV0aEVtYWlsT3B0aW9ucyk6IFByb21pc2U8dm9pZD47XG4gIHN1YmplY3Q/OiBzdHJpbmc7XG4gIG1lc3NhZ2U/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFzc3dvcmRsZXNzQXV0aFJ1bnRpbWUge1xuICByZWFkb25seSBiYXNlUGF0aDogc3RyaW5nO1xuICByZWFkb25seSBwYXNza2V5c0VuYWJsZWQ6IGJvb2xlYW47XG4gIGhhbmRsZXIocmVxdWVzdDogUmVxdWVzdCk6IFByb21pc2U8UmVzcG9uc2U+O1xuICBzZXNzaW9uKGhlYWRlcnM6IEhlYWRlcnMpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD47XG4gIHN0YXR1cyhoZWFkZXJzOiBIZWFkZXJzKTogUHJvbWlzZTxBdXRoU3RhdHVzPjtcbiAgY2xvc2UoKTogUHJvbWlzZTx2b2lkPjtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVBhc3N3b3JkbGVzc0F1dGgoXG4gIGNvbmZpZzogUGFzc3dvcmRsZXNzQXV0aE9wdGlvbnMsXG4pOiBQcm9taXNlPFBhc3N3b3JkbGVzc0F1dGhSdW50aW1lPiB7XG4gIGNvbnN0IG9yaWdpbiA9IG5ldyBVUkwoY29uZmlnLmJhc2VVUkwpLm9yaWdpbjtcbiAgY29uc3QgcnBJRCA9IG5ldyBVUkwob3JpZ2luKS5ob3N0bmFtZTtcbiAgY29uc3QgYmFzZVBhdGggPSBjb25maWcuYmFzZVBhdGggPz8gXCIvYXBpL2F1dGhcIjtcbiAgY29uc3QgbG9nb3V0UmVkaXJlY3RQYXRoID0gbm9ybWFsaXplTG9nb3V0UmVkaXJlY3RQYXRoKGNvbmZpZy5sb2dvdXRSZWRpcmVjdFBhdGgpO1xuICBjb25zdCBlbWFpbE9wdGlvbnM6IEF1dGhFbWFpbE9wdGlvbnMgPSB7XG4gICAgc3ViamVjdDogY29uZmlnLnN1YmplY3QgPz8gXCJZb3VyIHZlcmlmaWNhdGlvbiBjb2RlXCIsXG4gICAgYnJhbmROYW1lOiBjb25maWcuYXBwTmFtZSxcbiAgICBtZXNzYWdlOiBjb25maWcubWVzc2FnZSA/PyBcIllvdXIgdmVyaWZpY2F0aW9uIGNvZGUgaXM6XCIsXG4gICAgY29kZVR0bFNlY29uZHM6IGNvbmZpZy5jb2RlVHRsU2Vjb25kcyxcbiAgfTtcblxuICBjb25zdCBvcHRpb25zID0ge1xuICAgIGFwcE5hbWU6IGNvbmZpZy5hcHBOYW1lLFxuICAgIGJhc2VVUkw6IG9yaWdpbixcbiAgICBiYXNlUGF0aCxcbiAgICBkYXRhYmFzZTogY29uZmlnLnN0b3JhZ2UuZGF0YWJhc2UsXG4gICAgc2VjcmV0OiBjb25maWcuc2VjcmV0LFxuICAgIHRydXN0ZWRPcmlnaW5zOiBbb3JpZ2luXSxcbiAgICBzZXNzaW9uOiB7XG4gICAgICBleHBpcmVzSW46IGNvbmZpZy5zZXNzaW9uVHRsU2Vjb25kcyxcbiAgICAgIHVwZGF0ZUFnZTogTWF0aC5taW4oMjQgKiA2MCAqIDYwLCBjb25maWcuc2Vzc2lvblR0bFNlY29uZHMpLFxuICAgIH0sXG4gICAgdmVyaWZpY2F0aW9uOiB7XG4gICAgICBzdG9yZUlkZW50aWZpZXI6IFwiaGFzaGVkXCIsXG4gICAgICBzdG9yZUluRGF0YWJhc2U6IHRydWUsXG4gICAgfSxcbiAgICByYXRlTGltaXQ6IHtcbiAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICB3aW5kb3c6IDE1ICogNjAsXG4gICAgICBtYXg6IDEwLFxuICAgICAgY3VzdG9tUnVsZXM6IHtcbiAgICAgICAgXCIvZW1haWwtb3RwL3NlbmQtdmVyaWZpY2F0aW9uLW90cFwiOiB7IHdpbmRvdzogMTUgKiA2MCwgbWF4OiA1IH0sXG4gICAgICAgIFwiL3NpZ24taW4vZW1haWwtb3RwXCI6IHsgd2luZG93OiAxNSAqIDYwLCBtYXg6IDEwIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgYWR2YW5jZWQ6IHtcbiAgICAgIHVzZVNlY3VyZUNvb2tpZXM6IG9yaWdpbi5zdGFydHNXaXRoKFwiaHR0cHM6Ly9cIiksXG4gICAgICBpcEFkZHJlc3M6IHtcbiAgICAgICAgaXBBZGRyZXNzSGVhZGVyczogW1wieC1yZWFsLWlwXCJdLFxuICAgICAgICBkaXNhYmxlSXBUcmFja2luZzogZmFsc2UsXG4gICAgICB9LFxuICAgICAgY29va2llczoge1xuICAgICAgICBzZXNzaW9uX3Rva2VuOiB7XG4gICAgICAgICAgbmFtZTogY29uZmlnLnNlc3Npb25Db29raWVOYW1lID8/IFNFU1NJT05fQ09PS0lFX05BTUUsXG4gICAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgICAgaHR0cE9ubHk6IHRydWUsXG4gICAgICAgICAgICBzYW1lU2l0ZTogXCJsYXhcIixcbiAgICAgICAgICAgIHNlY3VyZTogb3JpZ2luLnN0YXJ0c1dpdGgoXCJodHRwczovL1wiKSxcbiAgICAgICAgICAgIHBhdGg6IFwiL1wiLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgZGF0YWJhc2VIb29rczoge1xuICAgICAgdXNlcjoge1xuICAgICAgICBjcmVhdGU6IHtcbiAgICAgICAgICBiZWZvcmU6IGFzeW5jICh1c2VyOiB7IGVtYWlsOiBzdHJpbmcgfSkgPT4ge1xuICAgICAgICAgICAgaWYgKCEoYXdhaXQgY29uZmlnLmF1dGhvcml6ZUlkZW50aXR5KG5vcm1hbGl6ZUVtYWlsKHVzZXIuZW1haWwpKSkpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEFQSUVycm9yKFwiRk9SQklEREVOXCIsIHsgbWVzc2FnZTogXCJJZGVudGl0eSBpcyBub3QgYXV0aG9yaXplZFwiIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogdXNlciB9O1xuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgcGx1Z2luczogW1xuICAgICAgZW1haWxPVFAoe1xuICAgICAgICBvdHBMZW5ndGg6IDYsXG4gICAgICAgIGV4cGlyZXNJbjogY29uZmlnLmNvZGVUdGxTZWNvbmRzLFxuICAgICAgICBhbGxvd2VkQXR0ZW1wdHM6IGNvbmZpZy5tYXhBdHRlbXB0cyxcbiAgICAgICAgc3RvcmVPVFA6IFwiaGFzaGVkXCIsXG4gICAgICAgIGFzeW5jIHNlbmRWZXJpZmljYXRpb25PVFAoeyBlbWFpbCwgb3RwLCB0eXBlIH0pIHtcbiAgICAgICAgICBpZiAodHlwZSAhPT0gXCJzaWduLWluXCIpIHJldHVybjtcbiAgICAgICAgICBjb25zdCBhZGRyZXNzID0gbm9ybWFsaXplRW1haWwoZW1haWwpO1xuICAgICAgICAgIGlmICghKGF3YWl0IGNvbmZpZy5hdXRob3JpemVJZGVudGl0eShhZGRyZXNzKSkpIHJldHVybjtcbiAgICAgICAgICB2b2lkIGNvbmZpZy5zZW5kQ29kZShhZGRyZXNzLCBvdHAsIGVtYWlsT3B0aW9ucykuY2F0Y2goKGVycm9yOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoXCJ2ZXJpZmljYXRpb24gZW1haWwgZmFpbGVkXCIsIHsgZW1haWw6IGFkZHJlc3MsIGVycm9yIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgICBwYXNza2V5KHtcbiAgICAgICAgcnBJRCxcbiAgICAgICAgcnBOYW1lOiBjb25maWcuYXBwTmFtZSxcbiAgICAgICAgb3JpZ2luLFxuICAgICAgICBhdXRoZW50aWNhdG9yU2VsZWN0aW9uOiB7XG4gICAgICAgICAgcmVzaWRlbnRLZXk6IFwicHJlZmVycmVkXCIsXG4gICAgICAgICAgdXNlclZlcmlmaWNhdGlvbjogXCJwcmVmZXJyZWRcIixcbiAgICAgICAgfSxcbiAgICAgICAgcmVnaXN0cmF0aW9uOiB7IHJlcXVpcmVTZXNzaW9uOiB0cnVlIH0sXG4gICAgICB9KSxcbiAgICBdIGFzIGNvbnN0LFxuICB9IHNhdGlzZmllcyBCZXR0ZXJBdXRoT3B0aW9ucztcblxuICBhd2FpdCBtaWdyYXRlQXV0aChvcHRpb25zLCBjb25maWcuc3RvcmFnZSk7XG4gIGNvbnN0IGF1dGggPSBiZXR0ZXJBdXRoKG9wdGlvbnMpO1xuXG4gIGNvbnN0IHNlc3Npb24gPSBhc3luYyAoaGVhZGVyczogSGVhZGVycyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiA9PiB7XG4gICAgY29uc3QgY3VycmVudCA9IGF3YWl0IGF1dGguYXBpLmdldFNlc3Npb24oeyBoZWFkZXJzIH0pO1xuICAgIGNvbnN0IGVtYWlsID0gbm9ybWFsaXplRW1haWwoY3VycmVudD8udXNlci5lbWFpbCk7XG4gICAgY29uc3QgY3JlYXRlZEF0ID0gY3VycmVudD8uc2Vzc2lvbi5jcmVhdGVkQXQ7XG4gICAgY29uc3QgY3JlYXRlZEF0TXMgPSBjcmVhdGVkQXQgPyBuZXcgRGF0ZShjcmVhdGVkQXQpLmdldFRpbWUoKSA6IE51bWJlci5OYU47XG4gICAgaWYgKGNvbmZpZy5zZXNzaW9uQ3V0b2ZmTXMgJiYgIShjcmVhdGVkQXRNcyA+PSBjb25maWcuc2Vzc2lvbkN1dG9mZk1zKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAoIWVtYWlsIHx8ICEoYXdhaXQgY29uZmlnLmF1dGhvcml6ZUlkZW50aXR5KGVtYWlsKSkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGVtYWlsO1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZUNvbXBhdGliaWxpdHlSb3V0ZSA9IGFzeW5jIChyZXF1ZXN0OiBSZXF1ZXN0KTogUHJvbWlzZTxSZXNwb25zZSB8IHVuZGVmaW5lZD4gPT4ge1xuICAgIGNvbnN0IHBhdGggPSBuZXcgVVJMKHJlcXVlc3QudXJsKS5wYXRobmFtZTtcbiAgICBpZiAocGF0aCA9PT0gYCR7YmFzZVBhdGh9L3N0YXR1c2ApIHtcbiAgICAgIGNvbnN0IGVtYWlsID0gYXdhaXQgc2Vzc2lvbihyZXF1ZXN0LmhlYWRlcnMpO1xuICAgICAgcmV0dXJuIGpzb25SZXNwb25zZSh7XG4gICAgICAgIGF1dGhlbnRpY2F0ZWQ6IEJvb2xlYW4oZW1haWwpLFxuICAgICAgICAuLi4oZW1haWwgPyB7IGVtYWlsIH0gOiB7fSksXG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgIHBhc3NrZXlzRW5hYmxlZDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAocGF0aCA9PT0gYCR7YmFzZVBhdGh9L3JlcXVlc3RgICYmIHJlcXVlc3QubWV0aG9kID09PSBcIlBPU1RcIikge1xuICAgICAgY29uc3QgcGFyc2VkID0gYXV0aFJlcXVlc3RTY2hlbWEuc2FmZVBhcnNlKGF3YWl0IHJlcXVlc3RKc29uKHJlcXVlc3QpKTtcbiAgICAgIGlmIChwYXJzZWQuc3VjY2Vzcykge1xuICAgICAgICBhd2FpdCBhdXRoLmFwaVxuICAgICAgICAgIC5zZW5kVmVyaWZpY2F0aW9uT1RQKHtcbiAgICAgICAgICAgIGJvZHk6IHsgZW1haWw6IG5vcm1hbGl6ZUVtYWlsKHBhcnNlZC5kYXRhLmVtYWlsKSwgdHlwZTogXCJzaWduLWluXCIgfSxcbiAgICAgICAgICAgIGhlYWRlcnM6IHJlcXVlc3QuaGVhZGVycyxcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGpzb25SZXNwb25zZSh7IG9rOiB0cnVlIH0pO1xuICAgIH1cbiAgICBpZiAocGF0aCA9PT0gYCR7YmFzZVBhdGh9L3ZlcmlmeWAgJiYgcmVxdWVzdC5tZXRob2QgPT09IFwiUE9TVFwiKSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBhdXRoVmVyaWZ5U2NoZW1hLnNhZmVQYXJzZShhd2FpdCByZXF1ZXN0SnNvbihyZXF1ZXN0KSk7XG4gICAgICBpZiAoIXBhcnNlZC5zdWNjZXNzKSByZXR1cm4ganNvblJlc3BvbnNlKHsgb2s6IGZhbHNlIH0pO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBhdXRoLmFwaS5zaWduSW5FbWFpbE9UUCh7XG4gICAgICAgICAgYm9keToge1xuICAgICAgICAgICAgZW1haWw6IG5vcm1hbGl6ZUVtYWlsKHBhcnNlZC5kYXRhLmVtYWlsKSxcbiAgICAgICAgICAgIG90cDogcGFyc2VkLmRhdGEuY29kZSxcbiAgICAgICAgICAgIG5hbWU6IGRpc3BsYXlOYW1lKHBhcnNlZC5kYXRhLmVtYWlsKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGhlYWRlcnM6IHJlcXVlc3QuaGVhZGVycyxcbiAgICAgICAgICBhc1Jlc3BvbnNlOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGNvbXBhdGliaWxpdHlSZXNwb25zZShyZXNwb25zZSwgeyBvazogcmVzcG9uc2Uub2sgfSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIGpzb25SZXNwb25zZSh7IG9rOiBmYWxzZSB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHBhdGggPT09IGAke2Jhc2VQYXRofS9sb2dvdXRgICYmIHJlcXVlc3QubWV0aG9kID09PSBcIlBPU1RcIikge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBhdXRoLmFwaS5zaWduT3V0KHtcbiAgICAgICAgaGVhZGVyczogcmVxdWVzdC5oZWFkZXJzLFxuICAgICAgICBhc1Jlc3BvbnNlOiB0cnVlLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gY29tcGF0aWJpbGl0eVJlc3BvbnNlKHJlc3BvbnNlLCB7IG9rOiByZXNwb25zZS5vaywgcmVkaXJlY3RUbzogbG9nb3V0UmVkaXJlY3RQYXRoIH0pO1xuICAgIH1cbiAgICBpZiAocGF0aCA9PT0gYCR7YmFzZVBhdGh9L2xvZ291dGAgJiYgcmVxdWVzdC5tZXRob2QgPT09IFwiR0VUXCIpIHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXV0aC5hcGkuc2lnbk91dCh7XG4gICAgICAgIGhlYWRlcnM6IHJlcXVlc3QuaGVhZGVycyxcbiAgICAgICAgYXNSZXNwb25zZTogdHJ1ZSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlZGlyZWN0UmVzcG9uc2UocmVzcG9uc2UsIGxvZ291dFJlZGlyZWN0UGF0aCk7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBiYXNlUGF0aCxcbiAgICBwYXNza2V5c0VuYWJsZWQ6IHRydWUsXG4gICAgaGFuZGxlcjogYXN5bmMgKHJlcXVlc3QpID0+IChhd2FpdCBoYW5kbGVDb21wYXRpYmlsaXR5Um91dGUocmVxdWVzdCkpID8/IGF1dGguaGFuZGxlcihyZXF1ZXN0KSxcbiAgICBzZXNzaW9uLFxuICAgIHN0YXR1czogYXN5bmMgKGhlYWRlcnMpID0+IHtcbiAgICAgIGNvbnN0IGVtYWlsID0gYXdhaXQgc2Vzc2lvbihoZWFkZXJzKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGF1dGhlbnRpY2F0ZWQ6IEJvb2xlYW4oZW1haWwpLFxuICAgICAgICAuLi4oZW1haWwgPyB7IGVtYWlsIH0gOiB7fSksXG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgIHBhc3NrZXlzRW5hYmxlZDogdHJ1ZSxcbiAgICAgIH07XG4gICAgfSxcbiAgICBjbG9zZTogKCkgPT4gY29uZmlnLnN0b3JhZ2UuY2xvc2UoKSxcbiAgfTtcbn1cblxuLyoqIFJlc3RyaWN0IGxvZ291dCByZWRpcmVjdHMgdG8gb25lIHNhbWUtb3JpZ2luIGFwcGxpY2F0aW9uIHBhdGguICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplTG9nb3V0UmVkaXJlY3RQYXRoKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICBjb25zdCBwYXRoID0gdmFsdWU/LnRyaW0oKTtcbiAgcmV0dXJuIHBhdGg/LnN0YXJ0c1dpdGgoXCIvXCIpICYmICFwYXRoLnN0YXJ0c1dpdGgoXCIvL1wiKSAmJiAhcGF0aC5pbmNsdWRlcyhcIlxcXFxcIikgPyBwYXRoIDogXCIvXCI7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUVtYWlsKGVtYWlsOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICByZXR1cm4gZW1haWw/LnRyaW0oKS50b0xvd2VyQ2FzZSgpID8/IFwiXCI7XG59XG5cbmZ1bmN0aW9uIGRpc3BsYXlOYW1lKGVtYWlsOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gbm9ybWFsaXplRW1haWwoZW1haWwpLnNwbGl0KFwiQFwiKVswXSB8fCBcIlVzZXJcIjtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVxdWVzdEpzb24ocmVxdWVzdDogUmVxdWVzdCk6IFByb21pc2U8dW5rbm93bj4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCByZXF1ZXN0Lmpzb24oKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBqc29uUmVzcG9uc2UoYm9keTogdW5rbm93biwgc3RhdHVzID0gMjAwKTogUmVzcG9uc2Uge1xuICByZXR1cm4gbmV3IFJlc3BvbnNlKEpTT04uc3RyaW5naWZ5KGJvZHkpLCB7XG4gICAgc3RhdHVzLFxuICAgIGhlYWRlcnM6IHsgXCJjb250ZW50LXR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgfSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGNvbXBhdGliaWxpdHlSZXNwb25zZShyZXNwb25zZTogUmVzcG9uc2UsIGJvZHk6IHVua25vd24pOiBSZXNwb25zZSB7XG4gIGNvbnN0IGhlYWRlcnMgPSBuZXcgSGVhZGVycyh7IFwiY29udGVudC10eXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiIH0pO1xuICBmb3IgKGNvbnN0IGNvb2tpZSBvZiByZXNwb25zZS5oZWFkZXJzLmdldFNldENvb2tpZSgpKSBoZWFkZXJzLmFwcGVuZChcInNldC1jb29raWVcIiwgY29va2llKTtcbiAgcmV0dXJuIG5ldyBSZXNwb25zZShKU09OLnN0cmluZ2lmeShib2R5KSwgeyBzdGF0dXM6IDIwMCwgaGVhZGVycyB9KTtcbn1cblxuZnVuY3Rpb24gcmVkaXJlY3RSZXNwb25zZShyZXNwb25zZTogUmVzcG9uc2UsIGxvY2F0aW9uOiBzdHJpbmcpOiBSZXNwb25zZSB7XG4gIGNvbnN0IGhlYWRlcnMgPSBuZXcgSGVhZGVycyh7IGxvY2F0aW9uIH0pO1xuICBmb3IgKGNvbnN0IGNvb2tpZSBvZiByZXNwb25zZS5oZWFkZXJzLmdldFNldENvb2tpZSgpKSBoZWFkZXJzLmFwcGVuZChcInNldC1jb29raWVcIiwgY29va2llKTtcbiAgcmV0dXJuIG5ldyBSZXNwb25zZShudWxsLCB7IHN0YXR1czogMzAzLCBoZWFkZXJzIH0pO1xufVxuIl19
217
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hdXRoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQy9DLE9BQU8sRUFBbUIsbUJBQW1CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM5RSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQTBCLE1BQU0sYUFBYSxDQUFDO0FBQzNFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUcvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRTNDLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7QUF1Q2xDLE1BQU0sQ0FBQyxLQUFLLFVBQVUsc0JBQXNCLENBQzFDLE1BQStCO0lBRS9CLE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDOUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDO0lBQ3RDLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLElBQUksV0FBVyxDQUFDO0lBQ2hELE1BQU0sa0JBQWtCLEdBQUcsMkJBQTJCLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDbEYsTUFBTSxZQUFZLEdBQXFCO1FBQ3JDLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxJQUFJLHdCQUF3QjtRQUNuRCxTQUFTLEVBQUUsTUFBTSxDQUFDLE9BQU87UUFDekIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLElBQUksNEJBQTRCO1FBQ3ZELGNBQWMsRUFBRSxNQUFNLENBQUMsY0FB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LENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQ3hDLE1BQU07UUFDTixPQUFPLEVBQUUsRUFBRSxjQUFjLEVBQUUsa0JBQWtCLEVBQUU7S0FDaEQsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELFNBQVMscUJBQXFCLENBQUMsUUFBa0IsRUFBRSxJQUFhO0lBQzlELE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxDQUFDLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFLENBQUMsQ0FBQztJQUNwRSxLQUFLLE1BQU0sTUFBTSxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFO1FBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDM0YsT0FBTyxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0FBQ3RFLENBQUM7QUFFRCxTQUFTLGdCQUFnQixDQUFDLFFBQWtCLEVBQUUsUUFBZ0I7SUFDNUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxPQUFPLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQzFDLEtBQUssTUFBTSxNQUFNLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUU7UUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMzRixPQUFPLElBQUksUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztBQUN0RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCZXR0ZXIgQXV0aCBwYXNzd29yZGxlc3MgcnVudGltZSB3aXRoIGVtYWlsIE9UUCBhbmQgcGFzc2tleXMuXG4gKlxuICogQ2FsbGVycyBwcm92aWRlIGF1dGhvcml6YXRpb24sIGRlbGl2ZXJ5LCBzdG9yYWdlLCBvcmlnaW4sIGFuZCBzZWNyZXQuIEJldHRlclxuICogQXV0aCBvd25zIHVzZXJzLCBPVFAgdmVyaWZpY2F0aW9uIHJlY29yZHMsIHNlc3Npb25zLCByYXRlIGxpbWl0cywgcGFzc2tleVxuICogY3JlZGVudGlhbHMsIGFuZCB0aGVpciBuYXRpdmUgSFRUUCByb3V0ZXMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IHBhc3NrZXkgfSBmcm9tIFwiQGJldHRlci1hdXRoL3Bhc3NrZXlcIjtcbmltcG9ydCB7IHR5cGUgQXV0aFN0YXR1cywgU0VTU0lPTl9DT09LSUVfTkFNRSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1hdXRoXCI7XG5pbXBvcnQgeyBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgQVBJRXJyb3IsIGJldHRlckF1dGgsIHR5cGUgQmV0dGVyQXV0aE9wdGlvbnMgfSBmcm9tIFwiYmV0dGVyLWF1dGhcIjtcbmltcG9ydCB7IGVtYWlsT1RQIH0gZnJvbSBcImJldHRlci1hdXRoL3BsdWdpbnNcIjtcblxuaW1wb3J0IHR5cGUgeyBBdXRoU3RvcmFnZSB9IGZyb20gXCIuL3N0b3JhZ2UudHNcIjtcbmltcG9ydCB7IG1pZ3JhdGVBdXRoIH0gZnJvbSBcIi4vc3RvcmFnZS50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwiYXV0aFwiKTtcblxuZXhwb3J0IHR5cGUgQXV0aG9yaXplSWRlbnRpdHkgPSAoZW1haWw6IHN0cmluZykgPT4gYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj47XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aEVtYWlsT3B0aW9ucyB7XG4gIHN1YmplY3Q6IHN0cmluZztcbiAgYnJhbmROYW1lOiBzdHJpbmc7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgY29kZVR0bFNlY29uZHM6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYXNzd29yZGxlc3NBdXRoT3B0aW9ucyB7XG4gIHN0b3JhZ2U6IEF1dGhTdG9yYWdlO1xuICBiYXNlVVJMOiBzdHJpbmc7XG4gIGJhc2VQYXRoPzogc3RyaW5nO1xuICBhcHBOYW1lOiBzdHJpbmc7XG4gIHNlY3JldDogc3RyaW5nO1xuICBzZXNzaW9uQ29va2llTmFtZT86IHN0cmluZztcbiAgLyoqIFNhbWUtb3JpZ2luIHBhdGggcmV0dXJuZWQgYWZ0ZXIgbG9nb3V0LiBEZWZhdWx0cyB0byBgL2AuICovXG4gIGxvZ291dFJlZGlyZWN0UGF0aD86IHN0cmluZztcbiAgc2Vzc2lvblR0bFNlY29uZHM6IG51bWJlcjtcbiAgc2Vzc2lvbkN1dG9mZk1zPzogbnVtYmVyO1xuICBjb2RlVHRsU2Vjb25kczogbnVtYmVyO1xuICBtYXhBdHRlbXB0czogbnVtYmVyO1xuICBhdXRob3JpemVJZGVudGl0eTogQXV0aG9yaXplSWRlbnRpdHk7XG4gIHNlbmRDb2RlKGVtYWlsOiBzdHJpbmcsIGNvZGU6IHN0cmluZywgb3B0aW9uczogQXV0aEVtYWlsT3B0aW9ucyk6IFByb21pc2U8dm9pZD47XG4gIHN1YmplY3Q/OiBzdHJpbmc7XG4gIG1lc3NhZ2U/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFzc3dvcmRsZXNzQXV0aFJ1bnRpbWUge1xuICByZWFkb25seSBiYXNlUGF0aDogc3RyaW5nO1xuICByZWFkb25seSBwYXNza2V5c0VuYWJsZWQ6IGJvb2xlYW47XG4gIGhhbmRsZXIocmVxdWVzdDogUmVxdWVzdCk6IFByb21pc2U8UmVzcG9uc2U+O1xuICBzZXNzaW9uKGhlYWRlcnM6IEhlYWRlcnMpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD47XG4gIHN0YXR1cyhoZWFkZXJzOiBIZWFkZXJzKTogUHJvbWlzZTxBdXRoU3RhdHVzPjtcbiAgY2xvc2UoKTogUHJvbWlzZTx2b2lkPjtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVBhc3N3b3JkbGVzc0F1dGgoXG4gIGNvbmZpZzogUGFzc3dvcmRsZXNzQXV0aE9wdGlvbnMsXG4pOiBQcm9taXNlPFBhc3N3b3JkbGVzc0F1dGhSdW50aW1lPiB7XG4gIGNvbnN0IG9yaWdpbiA9IG5ldyBVUkwoY29uZmlnLmJhc2VVUkwpLm9yaWdpbjtcbiAgY29uc3QgcnBJRCA9IG5ldyBVUkwob3JpZ2luKS5ob3N0bmFtZTtcbiAgY29uc3QgYmFzZVBhdGggPSBjb25maWcuYmFzZVBhdGggPz8gXCIvYXBpL2F1dGhcIjtcbiAgY29uc3QgbG9nb3V0UmVkaXJlY3RQYXRoID0gbm9ybWFsaXplTG9nb3V0UmVkaXJlY3RQYXRoKGNvbmZpZy5sb2dvdXRSZWRpcmVjdFBhdGgpO1xuICBjb25zdCBlbWFpbE9wdGlvbnM6IEF1dGhFbWFpbE9wdGlvbnMgPSB7XG4gICAgc3ViamVjdDogY29uZmlnLnN1YmplY3QgPz8gXCJZb3VyIHZlcmlmaWNhdGlvbiBjb2RlXCIsXG4gICAgYnJhbmROYW1lOiBjb25maWcuYXBwTmFtZSxcbiAgICBtZXNzYWdlOiBjb25maWcubWVzc2FnZSA/PyBcIllvdXIgdmVyaWZpY2F0aW9uIGNvZGUgaXM6XCIsXG4gICAgY29kZVR0bFNlY29uZHM6IGNvbmZpZy5jb2RlVHRsU2Vjb25kcyxcbiAgfTtcblxuICBjb25zdCBvcHRpb25zID0ge1xuICAgIGFwcE5hbWU6IGNvbmZpZy5hcHBOYW1lLFxuICAgIGJhc2VVUkw6IG9yaWdpbixcbiAgICBiYXNlUGF0aCxcbiAgICBkYXRhYmFzZTogY29uZmlnLnN0b3JhZ2UuZGF0YWJhc2UsXG4gICAgc2VjcmV0OiBjb25maWcuc2VjcmV0LFxuICAgIC8vIFRoZSBnYXRlIGZyb250cyB0aGUgYXBwIG9uIHdoYXRldmVyIGludGVyZmFjZSBhZGRyZXNzIHRoZSB0dW5uZWwgYmluZHNcbiAgICAvLyAoYW4gb3ZlcmxheS9MQU4gSVAsIGxvY2FsaG9zdCwgb3IgYSBwdWJsaWMgZG9tYWluKSDigJQgbm90IGp1c3QgYGJhc2VVUkxgLlxuICAgIC8vIEJldHRlciBBdXRoJ3Mgb3JpZ2luIGNoZWNrIHdvdWxkIHJlamVjdCBldmVyeSBvdGhlciBob3N0IHdpdGhcbiAgICAvLyBJTlZBTElEX09SSUdJTiBhbmQgYmxvY2sgc2lnbi1pbi4gVHJ1c3QgdGhlIHJlcXVlc3QncyBvd24gb3JpZ2luIGhlcmU6XG4gICAgLy8gdGhpcyBlbmRwb2ludCBzaXRzIGJlaGluZCB0aGUgT1RQIGdhdGUgYW5kIHRoZSB0dW5uZWwgcHJlc2VydmVzIHRoZVxuICAgIC8vIGJyb3dzZXIncyBIb3N0LCBzbyB0aGUgZml4ZWQtb3JpZ2luIENTUkYgY2hlY2sgYWRkcyBub3RoaW5nIHdoaWxlIGJyZWFraW5nXG4gICAgLy8gbGVnaXRpbWF0ZSBhY2Nlc3MuIFNhbWUtb3JpZ2luIHJlcXVlc3RzIChubyBPcmlnaW4gaGVhZGVyKSBhcmUgYWxsb3dlZCB0b28uXG4gICAgdHJ1c3RlZE9yaWdpbnM6IChyZXF1ZXN0PzogUmVxdWVzdCkgPT4ge1xuICAgICAgY29uc3QgcmVxdWVzdE9yaWdpbiA9IHJlcXVlc3Q/LmhlYWRlcnMuZ2V0KFwib3JpZ2luXCIpO1xuICAgICAgcmV0dXJuIHJlcXVlc3RPcmlnaW4gPyBbcmVxdWVzdE9yaWdpbiwgb3JpZ2luXSA6IFtvcmlnaW5dO1xuICAgIH0sXG4gICAgc2Vzc2lvbjoge1xuICAgICAgZXhwaXJlc0luOiBjb25maWcuc2Vzc2lvblR0bFNlY29uZHMsXG4gICAgICB1cGRhdGVBZ2U6IE1hdGgubWluKDI0ICogNjAgKiA2MCwgY29uZmlnLnNlc3Npb25UdGxTZWNvbmRzKSxcbiAgICB9LFxuICAgIHZlcmlmaWNhdGlvbjoge1xuICAgICAgc3RvcmVJZGVudGlmaWVyOiBcImhhc2hlZFwiLFxuICAgICAgc3RvcmVJbkRhdGFiYXNlOiB0cnVlLFxuICAgIH0sXG4gICAgcmF0ZUxpbWl0OiB7XG4gICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgd2luZG93OiAxNSAqIDYwLFxuICAgICAgbWF4OiAxMCxcbiAgICAgIGN1c3RvbVJ1bGVzOiB7XG4gICAgICAgIFwiL2VtYWlsLW90cC9zZW5kLXZlcmlmaWNhdGlvbi1vdHBcIjogeyB3aW5kb3c6IDE1ICogNjAsIG1heDogNSB9LFxuICAgICAgICBcIi9zaWduLWluL2VtYWlsLW90cFwiOiB7IHdpbmRvdzogMTUgKiA2MCwgbWF4OiAxMCB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIGFkdmFuY2VkOiB7XG4gICAgICB1c2VTZWN1cmVDb29raWVzOiBvcmlnaW4uc3RhcnRzV2l0aChcImh0dHBzOi8vXCIpLFxuICAgICAgaXBBZGRyZXNzOiB7XG4gICAgICAgIGlwQWRkcmVzc0hlYWRlcnM6IFtcIngtcmVhbC1pcFwiXSxcbiAgICAgICAgZGlzYWJsZUlwVHJhY2tpbmc6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIGNvb2tpZXM6IHtcbiAgICAgICAgc2Vzc2lvbl90b2tlbjoge1xuICAgICAgICAgIG5hbWU6IGNvbmZpZy5zZXNzaW9uQ29va2llTmFtZSA/PyBTRVNTSU9OX0NPT0tJRV9OQU1FLFxuICAgICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICAgIGh0dHBPbmx5OiB0cnVlLFxuICAgICAgICAgICAgc2FtZVNpdGU6IFwibGF4XCIsXG4gICAgICAgICAgICBzZWN1cmU6IG9yaWdpbi5zdGFydHNXaXRoKFwiaHR0cHM6Ly9cIiksXG4gICAgICAgICAgICBwYXRoOiBcIi9cIixcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIGRhdGFiYXNlSG9va3M6IHtcbiAgICAgIHVzZXI6IHtcbiAgICAgICAgY3JlYXRlOiB7XG4gICAgICAgICAgYmVmb3JlOiBhc3luYyAodXNlcjogeyBlbWFpbDogc3RyaW5nIH0pID0+IHtcbiAgICAgICAgICAgIGlmICghKGF3YWl0IGNvbmZpZy5hdXRob3JpemVJZGVudGl0eShub3JtYWxpemVFbWFpbCh1c2VyLmVtYWlsKSkpKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBBUElFcnJvcihcIkZPUkJJRERFTlwiLCB7IG1lc3NhZ2U6IFwiSWRlbnRpdHkgaXMgbm90IGF1dGhvcml6ZWRcIiB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IHVzZXIgfTtcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIHBsdWdpbnM6IFtcbiAgICAgIGVtYWlsT1RQKHtcbiAgICAgICAgb3RwTGVuZ3RoOiA2LFxuICAgICAgICBleHBpcmVzSW46IGNvbmZpZy5jb2RlVHRsU2Vjb25kcyxcbiAgICAgICAgYWxsb3dlZEF0dGVtcHRzOiBjb25maWcubWF4QXR0ZW1wdHMsXG4gICAgICAgIHN0b3JlT1RQOiBcImhhc2hlZFwiLFxuICAgICAgICBhc3luYyBzZW5kVmVyaWZpY2F0aW9uT1RQKHsgZW1haWwsIG90cCwgdHlwZSB9KSB7XG4gICAgICAgICAgaWYgKHR5cGUgIT09IFwic2lnbi1pblwiKSByZXR1cm47XG4gICAgICAgICAgY29uc3QgYWRkcmVzcyA9IG5vcm1hbGl6ZUVtYWlsKGVtYWlsKTtcbiAgICAgICAgICBpZiAoIShhd2FpdCBjb25maWcuYXV0aG9yaXplSWRlbnRpdHkoYWRkcmVzcykpKSB7XG4gICAgICAgICAgICAvLyBBY2NlcHQgYW55IGFkZHJlc3MgYW5kIGZhaWwgU0lMRU5UTFkgZm9yIG9uZSBub3Qgb24gdGhlIGFsbG93LWxpc3Q6XG4gICAgICAgICAgICAvLyB0aGUgcmVxdWVzdCBzdGlsbCByZXR1cm5zIDIwMCAoc28gdGhlIGdhdGUgbmV2ZXIgcmV2ZWFscyB3aG8gaXNcbiAgICAgICAgICAgIC8vIGFsbG93ZWQpLCBhbmQgbm8gY29kZSBpcyBzZW50LiBMb2dnZWQgYXQgZGVidWcgZm9yIGRpYWdub3N0aWNzLCBub3RcbiAgICAgICAgICAgIC8vIGFzIGEgd2FybmluZyDigJQgYW4gdW5rbm93biBhZGRyZXNzIGhpdHRpbmcgdGhlIGxvZ2luIHBhZ2UgaXMgbm9ybWFsLlxuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKFwidmVyaWZpY2F0aW9uIGNvZGUgc3VwcHJlc3NlZDogaWRlbnRpdHkgbm90IGF1dGhvcml6ZWRcIiwge1xuICAgICAgICAgICAgICBlbWFpbDogYWRkcmVzcyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsb2dnZXIuaW5mbyhcInNlbmRpbmcgdmVyaWZpY2F0aW9uIGNvZGVcIiwgeyBlbWFpbDogYWRkcmVzcyB9KTtcbiAgICAgICAgICB2b2lkIGNvbmZpZy5zZW5kQ29kZShhZGRyZXNzLCBvdHAsIGVtYWlsT3B0aW9ucykuY2F0Y2goKGVycm9yOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoXCJ2ZXJpZmljYXRpb24gZW1haWwgZmFpbGVkXCIsIHsgZW1haWw6IGFkZHJlc3MsIGVycm9yIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgICBwYXNza2V5KHtcbiAgICAgICAgcnBJRCxcbiAgICAgICAgcnBOYW1lOiBjb25maWcuYXBwTmFtZSxcbiAgICAgICAgb3JpZ2luLFxuICAgICAgICBhdXRoZW50aWNhdG9yU2VsZWN0aW9uOiB7XG4gICAgICAgICAgcmVzaWRlbnRLZXk6IFwicHJlZmVycmVkXCIsXG4gICAgICAgICAgdXNlclZlcmlmaWNhdGlvbjogXCJwcmVmZXJyZWRcIixcbiAgICAgICAgfSxcbiAgICAgICAgcmVnaXN0cmF0aW9uOiB7IHJlcXVpcmVTZXNzaW9uOiB0cnVlIH0sXG4gICAgICB9KSxcbiAgICBdIGFzIGNvbnN0LFxuICB9IHNhdGlzZmllcyBCZXR0ZXJBdXRoT3B0aW9ucztcblxuICBhd2FpdCBtaWdyYXRlQXV0aChvcHRpb25zLCBjb25maWcuc3RvcmFnZSk7XG4gIGNvbnN0IGF1dGggPSBiZXR0ZXJBdXRoKG9wdGlvbnMpO1xuXG4gIGNvbnN0IHNlc3Npb24gPSBhc3luYyAoaGVhZGVyczogSGVhZGVycyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiA9PiB7XG4gICAgY29uc3QgY3VycmVudCA9IGF3YWl0IGF1dGguYXBpLmdldFNlc3Npb24oeyBoZWFkZXJzIH0pO1xuICAgIGNvbnN0IGVtYWlsID0gbm9ybWFsaXplRW1haWwoY3VycmVudD8udXNlci5lbWFpbCk7XG4gICAgY29uc3QgY3JlYXRlZEF0ID0gY3VycmVudD8uc2Vzc2lvbi5jcmVhdGVkQXQ7XG4gICAgY29uc3QgY3JlYXRlZEF0TXMgPSBjcmVhdGVkQXQgPyBuZXcgRGF0ZShjcmVhdGVkQXQpLmdldFRpbWUoKSA6IE51bWJlci5OYU47XG4gICAgaWYgKGNvbmZpZy5zZXNzaW9uQ3V0b2ZmTXMgJiYgIShjcmVhdGVkQXRNcyA+PSBjb25maWcuc2Vzc2lvbkN1dG9mZk1zKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAoIWVtYWlsIHx8ICEoYXdhaXQgY29uZmlnLmF1dGhvcml6ZUlkZW50aXR5KGVtYWlsKSkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGVtYWlsO1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZUNvbXBhdGliaWxpdHlSb3V0ZSA9IGFzeW5jIChyZXF1ZXN0OiBSZXF1ZXN0KTogUHJvbWlzZTxSZXNwb25zZSB8IHVuZGVmaW5lZD4gPT4ge1xuICAgIGNvbnN0IHBhdGggPSBuZXcgVVJMKHJlcXVlc3QudXJsKS5wYXRobmFtZTtcbiAgICBpZiAocGF0aCA9PT0gYCR7YmFzZVBhdGh9L3N0YXR1c2ApIHtcbiAgICAgIGNvbnN0IGVtYWlsID0gYXdhaXQgc2Vzc2lvbihyZXF1ZXN0LmhlYWRlcnMpO1xuICAgICAgcmV0dXJuIGpzb25SZXNwb25zZSh7XG4gICAgICAgIGF1dGhlbnRpY2F0ZWQ6IEJvb2xlYW4oZW1haWwpLFxuICAgICAgICAuLi4oZW1haWwgPyB7IGVtYWlsIH0gOiB7fSksXG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgIHBhc3NrZXlzRW5hYmxlZDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBPVFAgc2VuZCArIHZlcmlmeSBnbyBzdHJhaWdodCB0byBiZXR0ZXItYXV0aCdzIG5hdGl2ZSBlbWFpbE9UUCBlbmRwb2ludHNcbiAgICAvLyAoYC9lbWFpbC1vdHAvc2VuZC12ZXJpZmljYXRpb24tb3RwYCwgYC9zaWduLWluL2VtYWlsLW90cGApOyB0aGVyZSBpcyBub1xuICAgIC8vIGNvbXBhdGliaWxpdHkgd3JhcHBlciBmb3IgdGhlbS4gRmFpbHVyZXMgdGhlcmUgYXJlIGxvZ2dlZCBieSB0aGUgcGx1Z2luJ3NcbiAgICAvLyBzZW5kVmVyaWZpY2F0aW9uT1RQIGhvb2ssIG5vdCBzd2FsbG93ZWQgYmVoaW5kIGFuIGFsd2F5cy1vayByZXNwb25zZS5cbiAgICBpZiAocGF0aCA9PT0gYCR7YmFzZVBhdGh9L2xvZ291dGAgJiYgcmVxdWVzdC5tZXRob2QgPT09IFwiUE9TVFwiKSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF1dGguYXBpLnNpZ25PdXQoe1xuICAgICAgICBoZWFkZXJzOiByZXF1ZXN0LmhlYWRlcnMsXG4gICAgICAgIGFzUmVzcG9uc2U6IHRydWUsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBjb21wYXRpYmlsaXR5UmVzcG9uc2UocmVzcG9uc2UsIHsgb2s6IHJlc3BvbnNlLm9rLCByZWRpcmVjdFRvOiBsb2dvdXRSZWRpcmVjdFBhdGggfSk7XG4gICAgfVxuICAgIGlmIChwYXRoID09PSBgJHtiYXNlUGF0aH0vbG9nb3V0YCAmJiByZXF1ZXN0Lm1ldGhvZCA9PT0gXCJHRVRcIikge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBhdXRoLmFwaS5zaWduT3V0KHtcbiAgICAgICAgaGVhZGVyczogcmVxdWVzdC5oZWFkZXJzLFxuICAgICAgICBhc1Jlc3BvbnNlOiB0cnVlLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVkaXJlY3RSZXNwb25zZShyZXNwb25zZSwgbG9nb3V0UmVkaXJlY3RQYXRoKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIGJhc2VQYXRoLFxuICAgIHBhc3NrZXlzRW5hYmxlZDogdHJ1ZSxcbiAgICBoYW5kbGVyOiBhc3luYyAocmVxdWVzdCkgPT4gKGF3YWl0IGhhbmRsZUNvbXBhdGliaWxpdHlSb3V0ZShyZXF1ZXN0KSkgPz8gYXV0aC5oYW5kbGVyKHJlcXVlc3QpLFxuICAgIHNlc3Npb24sXG4gICAgc3RhdHVzOiBhc3luYyAoaGVhZGVycykgPT4ge1xuICAgICAgY29uc3QgZW1haWwgPSBhd2FpdCBzZXNzaW9uKGhlYWRlcnMpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYXV0aGVudGljYXRlZDogQm9vbGVhbihlbWFpbCksXG4gICAgICAgIC4uLihlbWFpbCA/IHsgZW1haWwgfSA6IHt9KSxcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgcGFzc2tleXNFbmFibGVkOiB0cnVlLFxuICAgICAgfTtcbiAgICB9LFxuICAgIGNsb3NlOiAoKSA9PiBjb25maWcuc3RvcmFnZS5jbG9zZSgpLFxuICB9O1xufVxuXG4vKiogUmVzdHJpY3QgbG9nb3V0IHJlZGlyZWN0cyB0byBvbmUgc2FtZS1vcmlnaW4gYXBwbGljYXRpb24gcGF0aC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVMb2dvdXRSZWRpcmVjdFBhdGgodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIGNvbnN0IHBhdGggPSB2YWx1ZT8udHJpbSgpO1xuICByZXR1cm4gcGF0aD8uc3RhcnRzV2l0aChcIi9cIikgJiYgIXBhdGguc3RhcnRzV2l0aChcIi8vXCIpICYmICFwYXRoLmluY2x1ZGVzKFwiXFxcXFwiKSA/IHBhdGggOiBcIi9cIjtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplRW1haWwoZW1haWw6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIHJldHVybiBlbWFpbD8udHJpbSgpLnRvTG93ZXJDYXNlKCkgPz8gXCJcIjtcbn1cblxuZnVuY3Rpb24ganNvblJlc3BvbnNlKGJvZHk6IHVua25vd24sIHN0YXR1cyA9IDIwMCk6IFJlc3BvbnNlIHtcbiAgcmV0dXJuIG5ldyBSZXNwb25zZShKU09OLnN0cmluZ2lmeShib2R5KSwge1xuICAgIHN0YXR1cyxcbiAgICBoZWFkZXJzOiB7IFwiY29udGVudC10eXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiIH0sXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjb21wYXRpYmlsaXR5UmVzcG9uc2UocmVzcG9uc2U6IFJlc3BvbnNlLCBib2R5OiB1bmtub3duKTogUmVzcG9uc2Uge1xuICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMoeyBcImNvbnRlbnQtdHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9KTtcbiAgZm9yIChjb25zdCBjb29raWUgb2YgcmVzcG9uc2UuaGVhZGVycy5nZXRTZXRDb29raWUoKSkgaGVhZGVycy5hcHBlbmQoXCJzZXQtY29va2llXCIsIGNvb2tpZSk7XG4gIHJldHVybiBuZXcgUmVzcG9uc2UoSlNPTi5zdHJpbmdpZnkoYm9keSksIHsgc3RhdHVzOiAyMDAsIGhlYWRlcnMgfSk7XG59XG5cbmZ1bmN0aW9uIHJlZGlyZWN0UmVzcG9uc2UocmVzcG9uc2U6IFJlc3BvbnNlLCBsb2NhdGlvbjogc3RyaW5nKTogUmVzcG9uc2Uge1xuICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMoeyBsb2NhdGlvbiB9KTtcbiAgZm9yIChjb25zdCBjb29raWUgb2YgcmVzcG9uc2UuaGVhZGVycy5nZXRTZXRDb29raWUoKSkgaGVhZGVycy5hcHBlbmQoXCJzZXQtY29va2llXCIsIGNvb2tpZSk7XG4gIHJldHVybiBuZXcgUmVzcG9uc2UobnVsbCwgeyBzdGF0dXM6IDMwMywgaGVhZGVycyB9KTtcbn1cbiJdfQ==
@@ -19,7 +19,7 @@ export interface ResolvedAuthStorageConfig {
19
19
  }
20
20
  export type AuthDatabase = NonNullable<BetterAuthOptions["database"]>;
21
21
  export interface AuthStorage {
22
- kind: "lakebase" | "sqlite";
22
+ kind: "lakebase" | "sqlite" | "memory";
23
23
  database: AuthDatabase;
24
24
  pool?: PgPoolLike;
25
25
  path?: string;
@@ -18,7 +18,9 @@ import { mkdirSync } from "node:fs";
18
18
  import { dirname, resolve } from "node:path";
19
19
  import { fileLock } from "@dbx-tools/core";
20
20
  import { advisoryLock } from "@dbx-tools/postgres";
21
+ import { log } from "@dbx-tools/shared-core";
21
22
  import envPaths from "env-paths";
23
+ const logger = log.logger("auth:storage");
22
24
  const MIGRATION_LOCK = ["auth", "better-auth", "migrations"];
23
25
  export function resolveAuthStorageConfig(config = {}) {
24
26
  const mode = config.storage ?? "auto";
@@ -52,18 +54,41 @@ export async function createAuthStorage(config, pool) {
52
54
  if (resolved.mode === "lakebase") {
53
55
  throw new Error("auth storage is lakebase but no Lakebase pool was supplied");
54
56
  }
55
- mkdirSync(dirname(resolved.sqlitePath), { recursive: true });
56
- const database = await openSqlite(resolved.sqlitePath);
57
- return {
58
- kind: "sqlite",
59
- database,
60
- path: resolved.sqlitePath,
61
- close: async () => {
62
- database.close();
63
- },
64
- };
57
+ // Prefer SQLite (durable, survives restarts) when a SQLite binding is present
58
+ // bun:sqlite in Bun, node:sqlite in Node. Both are optional runtime
59
+ // features, so fall back to an in-memory adapter when neither can be opened
60
+ // rather than failing the whole gate. Memory loses sessions/OTPs on restart
61
+ // but keeps sign-in working; an explicit `--auth-storage sqlite` still errors
62
+ // if SQLite is genuinely unavailable, so the fallback is auto-mode only.
63
+ try {
64
+ mkdirSync(dirname(resolved.sqlitePath), { recursive: true });
65
+ const database = await openSqlite(resolved.sqlitePath);
66
+ return {
67
+ kind: "sqlite",
68
+ database,
69
+ path: resolved.sqlitePath,
70
+ close: async () => {
71
+ database.close();
72
+ },
73
+ };
74
+ }
75
+ catch (error) {
76
+ if (resolved.mode === "sqlite")
77
+ throw error;
78
+ logger.warn("sqlite unavailable for auth storage; using in-memory adapter", { error });
79
+ const { memoryAdapter } = await import("better-auth/adapters/memory");
80
+ return {
81
+ kind: "memory",
82
+ database: memoryAdapter({}),
83
+ close: async () => undefined,
84
+ };
85
+ }
65
86
  }
66
87
  export async function migrateAuth(options, storage) {
88
+ // The in-memory adapter builds its schema in memory on init — there is no
89
+ // database to migrate.
90
+ if (storage.kind === "memory")
91
+ return;
67
92
  const run = async () => {
68
93
  const module = (await import(__rewriteRelativeImportExtension(migrationModuleUrl())));
69
94
  const migrations = await module.getMigrations(options);
@@ -92,4 +117,4 @@ function migrationModuleUrl() {
92
117
  const entry = import.meta.resolve("better-auth");
93
118
  return new URL("./db/get-migration.mjs", entry).href;
94
119
  }
95
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdG9yYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7O0dBT0c7Ozs7Ozs7OztBQUVILE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDcEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDN0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxZQUFZLEVBQW1CLE1BQU0scUJBQXFCLENBQUM7QUFFcEUsT0FBTyxRQUFRLE1BQU0sV0FBVyxDQUFDO0FBdUNqQyxNQUFNLGNBQWMsR0FBRyxDQUFDLE1BQU0sRUFBRSxhQUFhLEVBQUUsWUFBWSxDQUFVLENBQUM7QUFFdEUsTUFBTSxVQUFVLHdCQUF3QixDQUN0QyxTQUE0QixFQUFFO0lBRTlCLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxPQUFPLElBQUksTUFBTSxDQUFDO0lBQ3RDLElBQUksSUFBSSxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssVUFBVSxJQUFJLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUNoRSxNQUFNLElBQUksU0FBUyxDQUFDLHNEQUFzRCxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUNELE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDakUsT0FBTztRQUNMLElBQUk7UUFDSixVQUFVLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLElBQUksT0FBTyxDQUFDLGFBQWEsRUFBRSxNQUFNLEVBQUUsYUFBYSxDQUFDLENBQUM7S0FDeEYsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsU0FBNEIsRUFBRTtJQUM5RCxNQUFNLFFBQVEsR0FBRyx3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RSxZQUFZLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNyRCxNQUFNLFFBQVEsR0FBRyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN4QyxRQUFRLENBQUMsSUFBSSxDQUFDLHFEQUFxRCxDQUFDLENBQUM7SUFDckUsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQztBQUVELFNBQVMsa0JBQWtCO0lBQ3pCLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ2pELE9BQU8sSUFBSSxHQUFHLENBQUMsd0JBQXdCLEVBQUUsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQ3ZELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEJldHRlciBBdXRoIGRhdGFiYXNlIHNlbGVjdGlvbiBhbmQgbWlncmF0aW9uIGxvY2tpbmcuXG4gKlxuICogQ2FsbGVycyBwYXNzIGEgbmF0aXZlIEFwcEtpdCBMYWtlYmFzZSBwb29sIHdoZW4gYXZhaWxhYmxlLiBPdGhlcndpc2UgYXV0aFxuICogdXNlcyBTUUxpdGUgaW4gdGhlIG9wZXJhdGluZyBzeXN0ZW0ncyBhcHBsaWNhdGlvbi1kYXRhIGRpcmVjdG9yeS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgbWtkaXJTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IGRpcm5hbWUsIHJlc29sdmUgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBmaWxlTG9jayB9IGZyb20gXCJAZGJ4LXRvb2xzL2NvcmVcIjtcbmltcG9ydCB7IGFkdmlzb3J5TG9jaywgdHlwZSBQZ1Bvb2xMaWtlIH0gZnJvbSBcIkBkYngtdG9vbHMvcG9zdGdyZXNcIjtcbmltcG9ydCB0eXBlIHsgQmV0dGVyQXV0aE9wdGlvbnMgfSBmcm9tIFwiYmV0dGVyLWF1dGhcIjtcbmltcG9ydCBlbnZQYXRocyBmcm9tIFwiZW52LXBhdGhzXCI7XG5cbmV4cG9ydCB0eXBlIEF1dGhTdG9yYWdlTW9kZSA9IFwiYXV0b1wiIHwgXCJsYWtlYmFzZVwiIHwgXCJzcWxpdGVcIjtcblxuZXhwb3J0IGludGVyZmFjZSBBdXRoU3RvcmFnZUNvbmZpZyB7XG4gIHN0b3JhZ2U/OiBBdXRoU3RvcmFnZU1vZGU7XG4gIHNxbGl0ZVBhdGg/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRBdXRoU3RvcmFnZUNvbmZpZyB7XG4gIG1vZGU6IEF1dGhTdG9yYWdlTW9kZTtcbiAgc3FsaXRlUGF0aDogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBBdXRoRGF0YWJhc2UgPSBOb25OdWxsYWJsZTxCZXR0ZXJBdXRoT3B0aW9uc1tcImRhdGFiYXNlXCJdPjtcblxuZXhwb3J0IGludGVyZmFjZSBBdXRoU3RvcmFnZSB7XG4gIGtpbmQ6IFwibGFrZWJhc2VcIiB8IFwic3FsaXRlXCI7XG4gIGRhdGFiYXNlOiBBdXRoRGF0YWJhc2U7XG4gIHBvb2w/OiBQZ1Bvb2xMaWtlO1xuICBwYXRoPzogc3RyaW5nO1xuICBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+O1xufVxuXG50eXBlIE1pZ3JhdGlvbk1vZHVsZSA9IHtcbiAgZ2V0TWlncmF0aW9ucyhvcHRpb25zOiBCZXR0ZXJBdXRoT3B0aW9ucyk6IFByb21pc2U8e1xuICAgIHJ1bk1pZ3JhdGlvbnMoKTogUHJvbWlzZTx2b2lkPjtcbiAgfT47XG59O1xuXG5pbnRlcmZhY2UgU3FsaXRlRGF0YWJhc2Uge1xuICBleGVjKHNxbDogc3RyaW5nKTogdW5rbm93bjtcbiAgY2xvc2UoKTogdm9pZDtcbn1cblxuaW50ZXJmYWNlIEJ1blNxbGl0ZU1vZHVsZSB7XG4gIERhdGFiYXNlOiBuZXcgKHBhdGg6IHN0cmluZywgb3B0aW9ucz86IHsgY3JlYXRlPzogYm9vbGVhbjsgc3RyaWN0PzogYm9vbGVhbiB9KSA9PiBTcWxpdGVEYXRhYmFzZTtcbn1cblxuY29uc3QgTUlHUkFUSU9OX0xPQ0sgPSBbXCJhdXRoXCIsIFwiYmV0dGVyLWF1dGhcIiwgXCJtaWdyYXRpb25zXCJdIGFzIGNvbnN0O1xuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUF1dGhTdG9yYWdlQ29uZmlnKFxuICBjb25maWc6IEF1dGhTdG9yYWdlQ29uZmlnID0ge30sXG4pOiBSZXNvbHZlZEF1dGhTdG9yYWdlQ29uZmlnIHtcbiAgY29uc3QgbW9kZSA9IGNvbmZpZy5zdG9yYWdlID8/IFwiYXV0b1wiO1xuICBpZiAobW9kZSAhPT0gXCJhdXRvXCIgJiYgbW9kZSAhPT0gXCJsYWtlYmFzZVwiICYmIG1vZGUgIT09IFwic3FsaXRlXCIpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdhdXRoIHN0b3JhZ2UgbXVzdCBiZSBcImF1dG9cIiwgXCJsYWtlYmFzZVwiLCBvciBcInNxbGl0ZVwiJyk7XG4gIH1cbiAgY29uc3QgZGF0YURpcmVjdG9yeSA9IGVudlBhdGhzKFwiZGJ4LXRvb2xzXCIsIHsgc3VmZml4OiBcIlwiIH0pLmRhdGE7XG4gIHJldHVybiB7XG4gICAgbW9kZSxcbiAgICBzcWxpdGVQYXRoOiByZXNvbHZlKGNvbmZpZy5zcWxpdGVQYXRoID8/IHJlc29sdmUoZGF0YURpcmVjdG9yeSwgXCJhdXRoXCIsIFwiYXV0aC5zcWxpdGVcIikpLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkVXNlTGFrZWJhc2UoY29uZmlnOiBBdXRoU3RvcmFnZUNvbmZpZyA9IHt9KTogYm9vbGVhbiB7XG4gIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZUF1dGhTdG9yYWdlQ29uZmlnKGNvbmZpZyk7XG4gIGlmIChyZXNvbHZlZC5tb2RlID09PSBcImxha2ViYXNlXCIpIHJldHVybiB0cnVlO1xuICBpZiAocmVzb2x2ZWQubW9kZSA9PT0gXCJzcWxpdGVcIikgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gQm9vbGVhbihwcm9jZXNzLmVudi5MQUtFQkFTRV9FTkRQT0lOVCA/PyBwcm9jZXNzLmVudi5QR0hPU1QpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlQXV0aFN0b3JhZ2UoXG4gIGNvbmZpZzogQXV0aFN0b3JhZ2VDb25maWcsXG4gIHBvb2w/OiBQZ1Bvb2xMaWtlLFxuKTogUHJvbWlzZTxBdXRoU3RvcmFnZT4ge1xuICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmVBdXRoU3RvcmFnZUNvbmZpZyhjb25maWcpO1xuICBpZiAocG9vbCAmJiByZXNvbHZlZC5tb2RlICE9PSBcInNxbGl0ZVwiKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtpbmQ6IFwibGFrZWJhc2VcIixcbiAgICAgIGRhdGFiYXNlOiBwb29sLFxuICAgICAgcG9vbCxcbiAgICAgIGNsb3NlOiBhc3luYyAoKSA9PiB1bmRlZmluZWQsXG4gICAgfTtcbiAgfVxuICBpZiAocmVzb2x2ZWQubW9kZSA9PT0gXCJsYWtlYmFzZVwiKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiYXV0aCBzdG9yYWdlIGlzIGxha2ViYXNlIGJ1dCBubyBMYWtlYmFzZSBwb29sIHdhcyBzdXBwbGllZFwiKTtcbiAgfVxuXG4gIG1rZGlyU3luYyhkaXJuYW1lKHJlc29sdmVkLnNxbGl0ZVBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgY29uc3QgZGF0YWJhc2UgPSBhd2FpdCBvcGVuU3FsaXRlKHJlc29sdmVkLnNxbGl0ZVBhdGgpO1xuICByZXR1cm4ge1xuICAgIGtpbmQ6IFwic3FsaXRlXCIsXG4gICAgZGF0YWJhc2UsXG4gICAgcGF0aDogcmVzb2x2ZWQuc3FsaXRlUGF0aCxcbiAgICBjbG9zZTogYXN5bmMgKCkgPT4ge1xuICAgICAgZGF0YWJhc2UuY2xvc2UoKTtcbiAgICB9LFxuICB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbWlncmF0ZUF1dGgob3B0aW9uczogQmV0dGVyQXV0aE9wdGlvbnMsIHN0b3JhZ2U6IEF1dGhTdG9yYWdlKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJ1biA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBjb25zdCBtb2R1bGUgPSAoYXdhaXQgaW1wb3J0KG1pZ3JhdGlvbk1vZHVsZVVybCgpKSkgYXMgTWlncmF0aW9uTW9kdWxlO1xuICAgIGNvbnN0IG1pZ3JhdGlvbnMgPSBhd2FpdCBtb2R1bGUuZ2V0TWlncmF0aW9ucyhvcHRpb25zKTtcbiAgICBhd2FpdCBtaWdyYXRpb25zLnJ1bk1pZ3JhdGlvbnMoKTtcbiAgfTtcblxuICBpZiAoc3RvcmFnZS5raW5kID09PSBcImxha2ViYXNlXCIgJiYgc3RvcmFnZS5wb29sKSB7XG4gICAgYXdhaXQgYWR2aXNvcnlMb2NrLndpdGhBZHZpc29yeUxvY2soc3RvcmFnZS5wb29sLCBNSUdSQVRJT05fTE9DSywgcnVuKTtcbiAgICByZXR1cm47XG4gIH1cbiAgYXdhaXQgZmlsZUxvY2sud2l0aEZpbGVMb2NrKE1JR1JBVElPTl9MT0NLLCBydW4pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBvcGVuU3FsaXRlKHBhdGg6IHN0cmluZyk6IFByb21pc2U8QXV0aERhdGFiYXNlICYgeyBjbG9zZSgpOiB2b2lkIH0+IHtcbiAgaWYgKHByb2Nlc3MudmVyc2lvbnMuYnVuKSB7XG4gICAgY29uc3Qgc3BlY2lmaWVyID0gXCJidW46c3FsaXRlXCI7XG4gICAgY29uc3QgeyBEYXRhYmFzZSB9ID0gKGF3YWl0IGltcG9ydChzcGVjaWZpZXIpKSBhcyBCdW5TcWxpdGVNb2R1bGU7XG4gICAgY29uc3QgZGF0YWJhc2UgPSBuZXcgRGF0YWJhc2UocGF0aCwgeyBjcmVhdGU6IHRydWUsIHN0cmljdDogdHJ1ZSB9KTtcbiAgICBkYXRhYmFzZS5leGVjKFwiUFJBR01BIGpvdXJuYWxfbW9kZSA9IFdBTDsgUFJBR01BIGZvcmVpZ25fa2V5cyA9IE9OXCIpO1xuICAgIHJldHVybiBkYXRhYmFzZTtcbiAgfVxuICBjb25zdCB7IERhdGFiYXNlU3luYyB9ID0gYXdhaXQgaW1wb3J0KFwibm9kZTpzcWxpdGVcIik7XG4gIGNvbnN0IGRhdGFiYXNlID0gbmV3IERhdGFiYXNlU3luYyhwYXRoKTtcbiAgZGF0YWJhc2UuZXhlYyhcIlBSQUdNQSBqb3VybmFsX21vZGUgPSBXQUw7IFBSQUdNQSBmb3JlaWduX2tleXMgPSBPTlwiKTtcbiAgcmV0dXJuIGRhdGFiYXNlO1xufVxuXG5mdW5jdGlvbiBtaWdyYXRpb25Nb2R1bGVVcmwoKTogc3RyaW5nIHtcbiAgY29uc3QgZW50cnkgPSBpbXBvcnQubWV0YS5yZXNvbHZlKFwiYmV0dGVyLWF1dGhcIik7XG4gIHJldHVybiBuZXcgVVJMKFwiLi9kYi9nZXQtbWlncmF0aW9uLm1qc1wiLCBlbnRyeSkuaHJlZjtcbn1cbiJdfQ==
120
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdG9yYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7O0dBT0c7Ozs7Ozs7OztBQUVILE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDcEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDN0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxZQUFZLEVBQW1CLE1BQU0scUJBQXFCLENBQUM7QUFDcEUsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRTdDLE9BQU8sUUFBUSxNQUFNLFdBQVcsQ0FBQztBQUVqQyxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBdUMxQyxNQUFNLGNBQWMsR0FBRyxDQUFDLE1BQU0sRUFBRSxhQUFhLEVBQUUsWUFBWSxDQUFVLENBQUM7QUFFdEUsTUFBTSxVQUFVLHdCQUF3QixDQUN0QyxTQUE0QixFQUFFO0lBRTlCLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxPQUFPLElBQUksTUFBTSxDQUFDO0lBQ3RDLElBQUksSUFBSSxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssVUFBVSxJQUFJLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUNoRSxNQUFNLElBQUksU0FBUyxDQUFDLHNEQUFzRCxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUNELE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDakUsT0FBTztRQUNMLElBQUk7UUFDSixVQUFVLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLElBQUksT0FBTyxDQUFDLGFBQWEsRUFBRSxNQUFNLEVB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QUFFLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQztBQUN2RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCZXR0ZXIgQXV0aCBkYXRhYmFzZSBzZWxlY3Rpb24gYW5kIG1pZ3JhdGlvbiBsb2NraW5nLlxuICpcbiAqIENhbGxlcnMgcGFzcyBhIG5hdGl2ZSBBcHBLaXQgTGFrZWJhc2UgcG9vbCB3aGVuIGF2YWlsYWJsZS4gT3RoZXJ3aXNlIGF1dGhcbiAqIHVzZXMgU1FMaXRlIGluIHRoZSBvcGVyYXRpbmcgc3lzdGVtJ3MgYXBwbGljYXRpb24tZGF0YSBkaXJlY3RvcnkuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IG1rZGlyU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyBkaXJuYW1lLCByZXNvbHZlIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgZmlsZUxvY2sgfSBmcm9tIFwiQGRieC10b29scy9jb3JlXCI7XG5pbXBvcnQgeyBhZHZpc29yeUxvY2ssIHR5cGUgUGdQb29sTGlrZSB9IGZyb20gXCJAZGJ4LXRvb2xzL3Bvc3RncmVzXCI7XG5pbXBvcnQgeyBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBCZXR0ZXJBdXRoT3B0aW9ucyB9IGZyb20gXCJiZXR0ZXItYXV0aFwiO1xuaW1wb3J0IGVudlBhdGhzIGZyb20gXCJlbnYtcGF0aHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcImF1dGg6c3RvcmFnZVwiKTtcblxuZXhwb3J0IHR5cGUgQXV0aFN0b3JhZ2VNb2RlID0gXCJhdXRvXCIgfCBcImxha2ViYXNlXCIgfCBcInNxbGl0ZVwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhTdG9yYWdlQ29uZmlnIHtcbiAgc3RvcmFnZT86IEF1dGhTdG9yYWdlTW9kZTtcbiAgc3FsaXRlUGF0aD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZEF1dGhTdG9yYWdlQ29uZmlnIHtcbiAgbW9kZTogQXV0aFN0b3JhZ2VNb2RlO1xuICBzcWxpdGVQYXRoOiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIEF1dGhEYXRhYmFzZSA9IE5vbk51bGxhYmxlPEJldHRlckF1dGhPcHRpb25zW1wiZGF0YWJhc2VcIl0+O1xuXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhTdG9yYWdlIHtcbiAga2luZDogXCJsYWtlYmFzZVwiIHwgXCJzcWxpdGVcIiB8IFwibWVtb3J5XCI7XG4gIGRhdGFiYXNlOiBBdXRoRGF0YWJhc2U7XG4gIHBvb2w/OiBQZ1Bvb2xMaWtlO1xuICBwYXRoPzogc3RyaW5nO1xuICBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+O1xufVxuXG50eXBlIE1pZ3JhdGlvbk1vZHVsZSA9IHtcbiAgZ2V0TWlncmF0aW9ucyhvcHRpb25zOiBCZXR0ZXJBdXRoT3B0aW9ucyk6IFByb21pc2U8e1xuICAgIHJ1bk1pZ3JhdGlvbnMoKTogUHJvbWlzZTx2b2lkPjtcbiAgfT47XG59O1xuXG5pbnRlcmZhY2UgU3FsaXRlRGF0YWJhc2Uge1xuICBleGVjKHNxbDogc3RyaW5nKTogdW5rbm93bjtcbiAgY2xvc2UoKTogdm9pZDtcbn1cblxuaW50ZXJmYWNlIEJ1blNxbGl0ZU1vZHVsZSB7XG4gIERhdGFiYXNlOiBuZXcgKHBhdGg6IHN0cmluZywgb3B0aW9ucz86IHsgY3JlYXRlPzogYm9vbGVhbjsgc3RyaWN0PzogYm9vbGVhbiB9KSA9PiBTcWxpdGVEYXRhYmFzZTtcbn1cblxuY29uc3QgTUlHUkFUSU9OX0xPQ0sgPSBbXCJhdXRoXCIsIFwiYmV0dGVyLWF1dGhcIiwgXCJtaWdyYXRpb25zXCJdIGFzIGNvbnN0O1xuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUF1dGhTdG9yYWdlQ29uZmlnKFxuICBjb25maWc6IEF1dGhTdG9yYWdlQ29uZmlnID0ge30sXG4pOiBSZXNvbHZlZEF1dGhTdG9yYWdlQ29uZmlnIHtcbiAgY29uc3QgbW9kZSA9IGNvbmZpZy5zdG9yYWdlID8/IFwiYXV0b1wiO1xuICBpZiAobW9kZSAhPT0gXCJhdXRvXCIgJiYgbW9kZSAhPT0gXCJsYWtlYmFzZVwiICYmIG1vZGUgIT09IFwic3FsaXRlXCIpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdhdXRoIHN0b3JhZ2UgbXVzdCBiZSBcImF1dG9cIiwgXCJsYWtlYmFzZVwiLCBvciBcInNxbGl0ZVwiJyk7XG4gIH1cbiAgY29uc3QgZGF0YURpcmVjdG9yeSA9IGVudlBhdGhzKFwiZGJ4LXRvb2xzXCIsIHsgc3VmZml4OiBcIlwiIH0pLmRhdGE7XG4gIHJldHVybiB7XG4gICAgbW9kZSxcbiAgICBzcWxpdGVQYXRoOiByZXNvbHZlKGNvbmZpZy5zcWxpdGVQYXRoID8/IHJlc29sdmUoZGF0YURpcmVjdG9yeSwgXCJhdXRoXCIsIFwiYXV0aC5zcWxpdGVcIikpLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkVXNlTGFrZWJhc2UoY29uZmlnOiBBdXRoU3RvcmFnZUNvbmZpZyA9IHt9KTogYm9vbGVhbiB7XG4gIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZUF1dGhTdG9yYWdlQ29uZmlnKGNvbmZpZyk7XG4gIGlmIChyZXNvbHZlZC5tb2RlID09PSBcImxha2ViYXNlXCIpIHJldHVybiB0cnVlO1xuICBpZiAocmVzb2x2ZWQubW9kZSA9PT0gXCJzcWxpdGVcIikgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gQm9vbGVhbihwcm9jZXNzLmVudi5MQUtFQkFTRV9FTkRQT0lOVCA/PyBwcm9jZXNzLmVudi5QR0hPU1QpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlQXV0aFN0b3JhZ2UoXG4gIGNvbmZpZzogQXV0aFN0b3JhZ2VDb25maWcsXG4gIHBvb2w/OiBQZ1Bvb2xMaWtlLFxuKTogUHJvbWlzZTxBdXRoU3RvcmFnZT4ge1xuICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmVBdXRoU3RvcmFnZUNvbmZpZyhjb25maWcpO1xuICBpZiAocG9vbCAmJiByZXNvbHZlZC5tb2RlICE9PSBcInNxbGl0ZVwiKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtpbmQ6IFwibGFrZWJhc2VcIixcbiAgICAgIGRhdGFiYXNlOiBwb29sLFxuICAgICAgcG9vbCxcbiAgICAgIGNsb3NlOiBhc3luYyAoKSA9PiB1bmRlZmluZWQsXG4gICAgfTtcbiAgfVxuICBpZiAocmVzb2x2ZWQubW9kZSA9PT0gXCJsYWtlYmFzZVwiKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiYXV0aCBzdG9yYWdlIGlzIGxha2ViYXNlIGJ1dCBubyBMYWtlYmFzZSBwb29sIHdhcyBzdXBwbGllZFwiKTtcbiAgfVxuXG4gIC8vIFByZWZlciBTUUxpdGUgKGR1cmFibGUsIHN1cnZpdmVzIHJlc3RhcnRzKSB3aGVuIGEgU1FMaXRlIGJpbmRpbmcgaXMgcHJlc2VudFxuICAvLyDigJQgYnVuOnNxbGl0ZSBpbiBCdW4sIG5vZGU6c3FsaXRlIGluIE5vZGUuIEJvdGggYXJlIG9wdGlvbmFsIHJ1bnRpbWVcbiAgLy8gZmVhdHVyZXMsIHNvIGZhbGwgYmFjayB0byBhbiBpbi1tZW1vcnkgYWRhcHRlciB3aGVuIG5laXRoZXIgY2FuIGJlIG9wZW5lZFxuICAvLyByYXRoZXIgdGhhbiBmYWlsaW5nIHRoZSB3aG9sZSBnYXRlLiBNZW1vcnkgbG9zZXMgc2Vzc2lvbnMvT1RQcyBvbiByZXN0YXJ0XG4gIC8vIGJ1dCBrZWVwcyBzaWduLWluIHdvcmtpbmc7IGFuIGV4cGxpY2l0IGAtLWF1dGgtc3RvcmFnZSBzcWxpdGVgIHN0aWxsIGVycm9yc1xuICAvLyBpZiBTUUxpdGUgaXMgZ2VudWluZWx5IHVuYXZhaWxhYmxlLCBzbyB0aGUgZmFsbGJhY2sgaXMgYXV0by1tb2RlIG9ubHkuXG4gIHRyeSB7XG4gICAgbWtkaXJTeW5jKGRpcm5hbWUocmVzb2x2ZWQuc3FsaXRlUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGNvbnN0IGRhdGFiYXNlID0gYXdhaXQgb3BlblNxbGl0ZShyZXNvbHZlZC5zcWxpdGVQYXRoKTtcbiAgICByZXR1cm4ge1xuICAgICAga2luZDogXCJzcWxpdGVcIixcbiAgICAgIGRhdGFiYXNlLFxuICAgICAgcGF0aDogcmVzb2x2ZWQuc3FsaXRlUGF0aCxcbiAgICAgIGNsb3NlOiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGRhdGFiYXNlLmNsb3NlKCk7XG4gICAgICB9LFxuICAgIH07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKHJlc29sdmVkLm1vZGUgPT09IFwic3FsaXRlXCIpIHRocm93IGVycm9yO1xuICAgIGxvZ2dlci53YXJuKFwic3FsaXRlIHVuYXZhaWxhYmxlIGZvciBhdXRoIHN0b3JhZ2U7IHVzaW5nIGluLW1lbW9yeSBhZGFwdGVyXCIsIHsgZXJyb3IgfSk7XG4gICAgY29uc3QgeyBtZW1vcnlBZGFwdGVyIH0gPSBhd2FpdCBpbXBvcnQoXCJiZXR0ZXItYXV0aC9hZGFwdGVycy9tZW1vcnlcIik7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtpbmQ6IFwibWVtb3J5XCIsXG4gICAgICBkYXRhYmFzZTogbWVtb3J5QWRhcHRlcih7fSkgYXMgdW5rbm93biBhcyBBdXRoRGF0YWJhc2UsXG4gICAgICBjbG9zZTogYXN5bmMgKCkgPT4gdW5kZWZpbmVkLFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG1pZ3JhdGVBdXRoKG9wdGlvbnM6IEJldHRlckF1dGhPcHRpb25zLCBzdG9yYWdlOiBBdXRoU3RvcmFnZSk6IFByb21pc2U8dm9pZD4ge1xuICAvLyBUaGUgaW4tbWVtb3J5IGFkYXB0ZXIgYnVpbGRzIGl0cyBzY2hlbWEgaW4gbWVtb3J5IG9uIGluaXQg4oCUIHRoZXJlIGlzIG5vXG4gIC8vIGRhdGFiYXNlIHRvIG1pZ3JhdGUuXG4gIGlmIChzdG9yYWdlLmtpbmQgPT09IFwibWVtb3J5XCIpIHJldHVybjtcblxuICBjb25zdCBydW4gPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgY29uc3QgbW9kdWxlID0gKGF3YWl0IGltcG9ydChtaWdyYXRpb25Nb2R1bGVVcmwoKSkpIGFzIE1pZ3JhdGlvbk1vZHVsZTtcbiAgICBjb25zdCBtaWdyYXRpb25zID0gYXdhaXQgbW9kdWxlLmdldE1pZ3JhdGlvbnMob3B0aW9ucyk7XG4gICAgYXdhaXQgbWlncmF0aW9ucy5ydW5NaWdyYXRpb25zKCk7XG4gIH07XG5cbiAgaWYgKHN0b3JhZ2Uua2luZCA9PT0gXCJsYWtlYmFzZVwiICYmIHN0b3JhZ2UucG9vbCkge1xuICAgIGF3YWl0IGFkdmlzb3J5TG9jay53aXRoQWR2aXNvcnlMb2NrKHN0b3JhZ2UucG9vbCwgTUlHUkFUSU9OX0xPQ0ssIHJ1bik7XG4gICAgcmV0dXJuO1xuICB9XG4gIGF3YWl0IGZpbGVMb2NrLndpdGhGaWxlTG9jayhNSUdSQVRJT05fTE9DSywgcnVuKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gb3BlblNxbGl0ZShwYXRoOiBzdHJpbmcpOiBQcm9taXNlPEF1dGhEYXRhYmFzZSAmIHsgY2xvc2UoKTogdm9pZCB9PiB7XG4gIGlmIChwcm9jZXNzLnZlcnNpb25zLmJ1bikge1xuICAgIGNvbnN0IHNwZWNpZmllciA9IFwiYnVuOnNxbGl0ZVwiO1xuICAgIGNvbnN0IHsgRGF0YWJhc2UgfSA9IChhd2FpdCBpbXBvcnQoc3BlY2lmaWVyKSkgYXMgQnVuU3FsaXRlTW9kdWxlO1xuICAgIGNvbnN0IGRhdGFiYXNlID0gbmV3IERhdGFiYXNlKHBhdGgsIHsgY3JlYXRlOiB0cnVlLCBzdHJpY3Q6IHRydWUgfSk7XG4gICAgZGF0YWJhc2UuZXhlYyhcIlBSQUdNQSBqb3VybmFsX21vZGUgPSBXQUw7IFBSQUdNQSBmb3JlaWduX2tleXMgPSBPTlwiKTtcbiAgICByZXR1cm4gZGF0YWJhc2U7XG4gIH1cbiAgY29uc3QgeyBEYXRhYmFzZVN5bmMgfSA9IGF3YWl0IGltcG9ydChcIm5vZGU6c3FsaXRlXCIpO1xuICBjb25zdCBkYXRhYmFzZSA9IG5ldyBEYXRhYmFzZVN5bmMocGF0aCk7XG4gIGRhdGFiYXNlLmV4ZWMoXCJQUkFHTUEgam91cm5hbF9tb2RlID0gV0FMOyBQUkFHTUEgZm9yZWlnbl9rZXlzID0gT05cIik7XG4gIHJldHVybiBkYXRhYmFzZTtcbn1cblxuZnVuY3Rpb24gbWlncmF0aW9uTW9kdWxlVXJsKCk6IHN0cmluZyB7XG4gIGNvbnN0IGVudHJ5ID0gaW1wb3J0Lm1ldGEucmVzb2x2ZShcImJldHRlci1hdXRoXCIpO1xuICByZXR1cm4gbmV3IFVSTChcIi4vZGIvZ2V0LW1pZ3JhdGlvbi5tanNcIiwgZW50cnkpLmhyZWY7XG59XG4iXX0=
package/package.json CHANGED
@@ -24,10 +24,10 @@
24
24
  },
25
25
  "dependencies": {
26
26
  "@better-auth/passkey": "^1.6.25",
27
- "@dbx-tools/core": "0.6.97",
28
- "@dbx-tools/postgres": "0.6.97",
29
- "@dbx-tools/shared-auth": "0.6.97",
30
- "@dbx-tools/shared-core": "0.6.97",
27
+ "@dbx-tools/core": "0.6.99",
28
+ "@dbx-tools/postgres": "0.6.99",
29
+ "@dbx-tools/shared-auth": "0.6.99",
30
+ "@dbx-tools/shared-core": "0.6.99",
31
31
  "better-auth": "^1.6.25",
32
32
  "env-paths": "^4.0.0"
33
33
  },
@@ -45,7 +45,7 @@
45
45
  "./package.json": "./package.json"
46
46
  }
47
47
  },
48
- "version": "0.6.97",
48
+ "version": "0.6.99",
49
49
  "types": "./lib/index.d.ts",
50
50
  "type": "module",
51
51
  "exports": {
package/src/auth.ts CHANGED
@@ -9,12 +9,7 @@
9
9
  */
10
10
 
11
11
  import { passkey } from "@better-auth/passkey";
12
- import {
13
- authRequestSchema,
14
- authVerifySchema,
15
- type AuthStatus,
16
- SESSION_COOKIE_NAME,
17
- } from "@dbx-tools/shared-auth";
12
+ import { type AuthStatus, SESSION_COOKIE_NAME } from "@dbx-tools/shared-auth";
18
13
  import { log } from "@dbx-tools/shared-core";
19
14
  import { APIError, betterAuth, type BetterAuthOptions } from "better-auth";
20
15
  import { emailOTP } from "better-auth/plugins";
@@ -81,7 +76,17 @@ export async function createPasswordlessAuth(
81
76
  basePath,
82
77
  database: config.storage.database,
83
78
  secret: config.secret,
84
- trustedOrigins: [origin],
79
+ // The gate fronts the app on whatever interface address the tunnel binds
80
+ // (an overlay/LAN IP, localhost, or a public domain) — not just `baseURL`.
81
+ // Better Auth's origin check would reject every other host with
82
+ // INVALID_ORIGIN and block sign-in. Trust the request's own origin here:
83
+ // this endpoint sits behind the OTP gate and the tunnel preserves the
84
+ // browser's Host, so the fixed-origin CSRF check adds nothing while breaking
85
+ // legitimate access. Same-origin requests (no Origin header) are allowed too.
86
+ trustedOrigins: (request?: Request) => {
87
+ const requestOrigin = request?.headers.get("origin");
88
+ return requestOrigin ? [requestOrigin, origin] : [origin];
89
+ },
85
90
  session: {
86
91
  expiresIn: config.sessionTtlSeconds,
87
92
  updateAge: Math.min(24 * 60 * 60, config.sessionTtlSeconds),
@@ -138,7 +143,17 @@ export async function createPasswordlessAuth(
138
143
  async sendVerificationOTP({ email, otp, type }) {
139
144
  if (type !== "sign-in") return;
140
145
  const address = normalizeEmail(email);
141
- if (!(await config.authorizeIdentity(address))) return;
146
+ if (!(await config.authorizeIdentity(address))) {
147
+ // Accept any address and fail SILENTLY for one not on the allow-list:
148
+ // the request still returns 200 (so the gate never reveals who is
149
+ // allowed), and no code is sent. Logged at debug for diagnostics, not
150
+ // as a warning — an unknown address hitting the login page is normal.
151
+ logger.debug("verification code suppressed: identity not authorized", {
152
+ email: address,
153
+ });
154
+ return;
155
+ }
156
+ logger.info("sending verification code", { email: address });
142
157
  void config.sendCode(address, otp, emailOptions).catch((error: unknown) => {
143
158
  logger.error("verification email failed", { email: address, error });
144
159
  });
@@ -181,36 +196,10 @@ export async function createPasswordlessAuth(
181
196
  passkeysEnabled: true,
182
197
  });
183
198
  }
184
- if (path === `${basePath}/request` && request.method === "POST") {
185
- const parsed = authRequestSchema.safeParse(await requestJson(request));
186
- if (parsed.success) {
187
- await auth.api
188
- .sendVerificationOTP({
189
- body: { email: normalizeEmail(parsed.data.email), type: "sign-in" },
190
- headers: request.headers,
191
- })
192
- .catch(() => undefined);
193
- }
194
- return jsonResponse({ ok: true });
195
- }
196
- if (path === `${basePath}/verify` && request.method === "POST") {
197
- const parsed = authVerifySchema.safeParse(await requestJson(request));
198
- if (!parsed.success) return jsonResponse({ ok: false });
199
- try {
200
- const response = await auth.api.signInEmailOTP({
201
- body: {
202
- email: normalizeEmail(parsed.data.email),
203
- otp: parsed.data.code,
204
- name: displayName(parsed.data.email),
205
- },
206
- headers: request.headers,
207
- asResponse: true,
208
- });
209
- return compatibilityResponse(response, { ok: response.ok });
210
- } catch {
211
- return jsonResponse({ ok: false });
212
- }
213
- }
199
+ // OTP send + verify go straight to better-auth's native emailOTP endpoints
200
+ // (`/email-otp/send-verification-otp`, `/sign-in/email-otp`); there is no
201
+ // compatibility wrapper for them. Failures there are logged by the plugin's
202
+ // sendVerificationOTP hook, not swallowed behind an always-ok response.
214
203
  if (path === `${basePath}/logout` && request.method === "POST") {
215
204
  const response = await auth.api.signOut({
216
205
  headers: request.headers,
@@ -256,18 +245,6 @@ function normalizeEmail(email: string | undefined): string {
256
245
  return email?.trim().toLowerCase() ?? "";
257
246
  }
258
247
 
259
- function displayName(email: string): string {
260
- return normalizeEmail(email).split("@")[0] || "User";
261
- }
262
-
263
- async function requestJson(request: Request): Promise<unknown> {
264
- try {
265
- return await request.json();
266
- } catch {
267
- return undefined;
268
- }
269
- }
270
-
271
248
  function jsonResponse(body: unknown, status = 200): Response {
272
249
  return new Response(JSON.stringify(body), {
273
250
  status,
package/src/storage.ts CHANGED
@@ -11,9 +11,12 @@ import { mkdirSync } from "node:fs";
11
11
  import { dirname, resolve } from "node:path";
12
12
  import { fileLock } from "@dbx-tools/core";
13
13
  import { advisoryLock, type PgPoolLike } from "@dbx-tools/postgres";
14
+ import { log } from "@dbx-tools/shared-core";
14
15
  import type { BetterAuthOptions } from "better-auth";
15
16
  import envPaths from "env-paths";
16
17
 
18
+ const logger = log.logger("auth:storage");
19
+
17
20
  export type AuthStorageMode = "auto" | "lakebase" | "sqlite";
18
21
 
19
22
  export interface AuthStorageConfig {
@@ -29,7 +32,7 @@ export interface ResolvedAuthStorageConfig {
29
32
  export type AuthDatabase = NonNullable<BetterAuthOptions["database"]>;
30
33
 
31
34
  export interface AuthStorage {
32
- kind: "lakebase" | "sqlite";
35
+ kind: "lakebase" | "sqlite" | "memory";
33
36
  database: AuthDatabase;
34
37
  pool?: PgPoolLike;
35
38
  path?: string;
@@ -91,19 +94,40 @@ export async function createAuthStorage(
91
94
  throw new Error("auth storage is lakebase but no Lakebase pool was supplied");
92
95
  }
93
96
 
94
- mkdirSync(dirname(resolved.sqlitePath), { recursive: true });
95
- const database = await openSqlite(resolved.sqlitePath);
96
- return {
97
- kind: "sqlite",
98
- database,
99
- path: resolved.sqlitePath,
100
- close: async () => {
101
- database.close();
102
- },
103
- };
97
+ // Prefer SQLite (durable, survives restarts) when a SQLite binding is present
98
+ // bun:sqlite in Bun, node:sqlite in Node. Both are optional runtime
99
+ // features, so fall back to an in-memory adapter when neither can be opened
100
+ // rather than failing the whole gate. Memory loses sessions/OTPs on restart
101
+ // but keeps sign-in working; an explicit `--auth-storage sqlite` still errors
102
+ // if SQLite is genuinely unavailable, so the fallback is auto-mode only.
103
+ try {
104
+ mkdirSync(dirname(resolved.sqlitePath), { recursive: true });
105
+ const database = await openSqlite(resolved.sqlitePath);
106
+ return {
107
+ kind: "sqlite",
108
+ database,
109
+ path: resolved.sqlitePath,
110
+ close: async () => {
111
+ database.close();
112
+ },
113
+ };
114
+ } catch (error) {
115
+ if (resolved.mode === "sqlite") throw error;
116
+ logger.warn("sqlite unavailable for auth storage; using in-memory adapter", { error });
117
+ const { memoryAdapter } = await import("better-auth/adapters/memory");
118
+ return {
119
+ kind: "memory",
120
+ database: memoryAdapter({}) as unknown as AuthDatabase,
121
+ close: async () => undefined,
122
+ };
123
+ }
104
124
  }
105
125
 
106
126
  export async function migrateAuth(options: BetterAuthOptions, storage: AuthStorage): Promise<void> {
127
+ // The in-memory adapter builds its schema in memory on init — there is no
128
+ // database to migrate.
129
+ if (storage.kind === "memory") return;
130
+
107
131
  const run = async (): Promise<void> => {
108
132
  const module = (await import(migrationModuleUrl())) as MigrationModule;
109
133
  const migrations = await module.getMigrations(options);