@dbx-tools/auth 0.6.97 → 0.6.98

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";
@@ -89,8 +89,15 @@ export async function createPasswordlessAuth(config) {
89
89
  if (type !== "sign-in")
90
90
  return;
91
91
  const address = normalizeEmail(email);
92
- if (!(await config.authorizeIdentity(address)))
92
+ if (!(await config.authorizeIdentity(address))) {
93
+ // Not on the allow-list: no code is sent. Log it so a "requested a
94
+ // code but got nothing" case is visible rather than silent.
95
+ logger.warn("verification code not sent: identity not authorized", {
96
+ email: address,
97
+ });
93
98
  return;
99
+ }
100
+ logger.info("sending verification code", { email: address });
94
101
  void config.sendCode(address, otp, emailOptions).catch((error) => {
95
102
  logger.error("verification email failed", { email: address, error });
96
103
  });
@@ -132,38 +139,10 @@ export async function createPasswordlessAuth(config) {
132
139
  passkeysEnabled: true,
133
140
  });
134
141
  }
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
- }
142
+ // OTP send + verify go straight to better-auth's native emailOTP endpoints
143
+ // (`/email-otp/send-verification-otp`, `/sign-in/email-otp`); there is no
144
+ // compatibility wrapper for them. Failures there are logged by the plugin's
145
+ // sendVerificationOTP hook, not swallowed behind an always-ok response.
167
146
  if (path === `${basePath}/logout` && request.method === "POST") {
168
147
  const response = await auth.api.signOut({
169
148
  headers: request.headers,
@@ -205,17 +184,6 @@ export function normalizeLogoutRedirectPath(value) {
205
184
  function normalizeEmail(email) {
206
185
  return email?.trim().toLowerCase() ?? "";
207
186
  }
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
187
  function jsonResponse(body, status = 200) {
220
188
  return new Response(JSON.stringify(body), {
221
189
  status,
@@ -234,4 +202,4 @@ function redirectResponse(response, location) {
234
202
  headers.append("set-cookie", cookie);
235
203
  return new Response(null, { status: 303, headers });
236
204
  }
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
205
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hdXRoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQy9DLE9BQU8sRUFBbUIsbUJBQW1CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM5RSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQTBCLE1BQU0sYUFBYSxDQUFDO0FBQzNFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUcvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRTNDLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7QUF1Q2xDLE1BQU0sQ0FBQyxLQUFLLFVBQVUsc0JBQXNCLENBQzFDLE1BQStCO0lBRS9CLE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDOUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDO0lBQ3RDLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLElBQUksV0FBVyxDQUFDO0lBQ2hELE1BQU0sa0JBQWtCLEdBQUcsMkJBQTJCLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDbEYsTUFBTSxZQUFZLEdBQXFCO1FBQ3JDLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxJQUFJLHdCQUF3QjtRQUNuRCxTQUFTLEVBQUUsTUFBTSxDQUFDLE9BQU87UUFDekIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLElBQUksNEJBQTRCO1FBQ3ZELGNBQWMsRUFBRSxNQUFNLENBQUMsY0FB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TUFBTSxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMzRixPQUFPLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7QUFDdEUsQ0FBQztBQUVELFNBQVMsZ0JBQWdCLENBQUMsUUFBa0IsRUFBRSxRQUFnQjtJQUM1RCxNQUFNLE9BQU8sR0FBRyxJQUFJLE9BQU8sQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDMUMsS0FBSyxNQUFNLE1BQU0sSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRTtRQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzNGLE9BQU8sSUFBSSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0FBQ3RELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEJldHRlciBBdXRoIHBhc3N3b3JkbGVzcyBydW50aW1lIHdpdGggZW1haWwgT1RQIGFuZCBwYXNza2V5cy5cbiAqXG4gKiBDYWxsZXJzIHByb3ZpZGUgYXV0aG9yaXphdGlvbiwgZGVsaXZlcnksIHN0b3JhZ2UsIG9yaWdpbiwgYW5kIHNlY3JldC4gQmV0dGVyXG4gKiBBdXRoIG93bnMgdXNlcnMsIE9UUCB2ZXJpZmljYXRpb24gcmVjb3Jkcywgc2Vzc2lvbnMsIHJhdGUgbGltaXRzLCBwYXNza2V5XG4gKiBjcmVkZW50aWFscywgYW5kIHRoZWlyIG5hdGl2ZSBIVFRQIHJvdXRlcy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgcGFzc2tleSB9IGZyb20gXCJAYmV0dGVyLWF1dGgvcGFzc2tleVwiO1xuaW1wb3J0IHsgdHlwZSBBdXRoU3RhdHVzLCBTRVNTSU9OX0NPT0tJRV9OQU1FIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWF1dGhcIjtcbmltcG9ydCB7IGxvZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBBUElFcnJvciwgYmV0dGVyQXV0aCwgdHlwZSBCZXR0ZXJBdXRoT3B0aW9ucyB9IGZyb20gXCJiZXR0ZXItYXV0aFwiO1xuaW1wb3J0IHsgZW1haWxPVFAgfSBmcm9tIFwiYmV0dGVyLWF1dGgvcGx1Z2luc1wiO1xuXG5pbXBvcnQgdHlwZSB7IEF1dGhTdG9yYWdlIH0gZnJvbSBcIi4vc3RvcmFnZS50c1wiO1xuaW1wb3J0IHsgbWlncmF0ZUF1dGggfSBmcm9tIFwiLi9zdG9yYWdlLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJhdXRoXCIpO1xuXG5leHBvcnQgdHlwZSBBdXRob3JpemVJZGVudGl0eSA9IChlbWFpbDogc3RyaW5nKSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPjtcblxuZXhwb3J0IGludGVyZmFjZSBBdXRoRW1haWxPcHRpb25zIHtcbiAgc3ViamVjdDogc3RyaW5nO1xuICBicmFuZE5hbWU6IHN0cmluZztcbiAgbWVzc2FnZTogc3RyaW5nO1xuICBjb2RlVHRsU2Vjb25kczogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhc3N3b3JkbGVzc0F1dGhPcHRpb25zIHtcbiAgc3RvcmFnZTogQXV0aFN0b3JhZ2U7XG4gIGJhc2VVUkw6IHN0cmluZztcbiAgYmFzZVBhdGg/OiBzdHJpbmc7XG4gIGFwcE5hbWU6IHN0cmluZztcbiAgc2VjcmV0OiBzdHJpbmc7XG4gIHNlc3Npb25Db29raWVOYW1lPzogc3RyaW5nO1xuICAvKiogU2FtZS1vcmlnaW4gcGF0aCByZXR1cm5lZCBhZnRlciBsb2dvdXQuIERlZmF1bHRzIHRvIGAvYC4gKi9cbiAgbG9nb3V0UmVkaXJlY3RQYXRoPzogc3RyaW5nO1xuICBzZXNzaW9uVHRsU2Vjb25kczogbnVtYmVyO1xuICBzZXNzaW9uQ3V0b2ZmTXM/OiBudW1iZXI7XG4gIGNvZGVUdGxTZWNvbmRzOiBudW1iZXI7XG4gIG1heEF0dGVtcHRzOiBudW1iZXI7XG4gIGF1dGhvcml6ZUlkZW50aXR5OiBBdXRob3JpemVJZGVudGl0eTtcbiAgc2VuZENvZGUoZW1haWw6IHN0cmluZywgY29kZTogc3RyaW5nLCBvcHRpb25zOiBBdXRoRW1haWxPcHRpb25zKTogUHJvbWlzZTx2b2lkPjtcbiAgc3ViamVjdD86IHN0cmluZztcbiAgbWVzc2FnZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYXNzd29yZGxlc3NBdXRoUnVudGltZSB7XG4gIHJlYWRvbmx5IGJhc2VQYXRoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBhc3NrZXlzRW5hYmxlZDogYm9vbGVhbjtcbiAgaGFuZGxlcihyZXF1ZXN0OiBSZXF1ZXN0KTogUHJvbWlzZTxSZXNwb25zZT47XG4gIHNlc3Npb24oaGVhZGVyczogSGVhZGVycyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPjtcbiAgc3RhdHVzKGhlYWRlcnM6IEhlYWRlcnMpOiBQcm9taXNlPEF1dGhTdGF0dXM+O1xuICBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlUGFzc3dvcmRsZXNzQXV0aChcbiAgY29uZmlnOiBQYXNzd29yZGxlc3NBdXRoT3B0aW9ucyxcbik6IFByb21pc2U8UGFzc3dvcmRsZXNzQXV0aFJ1bnRpbWU+IHtcbiAgY29uc3Qgb3JpZ2luID0gbmV3IFVSTChjb25maWcuYmFzZVVSTCkub3JpZ2luO1xuICBjb25zdCBycElEID0gbmV3IFVSTChvcmlnaW4pLmhvc3RuYW1lO1xuICBjb25zdCBiYXNlUGF0aCA9IGNvbmZpZy5iYXNlUGF0aCA/PyBcIi9hcGkvYXV0aFwiO1xuICBjb25zdCBsb2dvdXRSZWRpcmVjdFBhdGggPSBub3JtYWxpemVMb2dvdXRSZWRpcmVjdFBhdGgoY29uZmlnLmxvZ291dFJlZGlyZWN0UGF0aCk7XG4gIGNvbnN0IGVtYWlsT3B0aW9uczogQXV0aEVtYWlsT3B0aW9ucyA9IHtcbiAgICBzdWJqZWN0OiBjb25maWcuc3ViamVjdCA/PyBcIllvdXIgdmVyaWZpY2F0aW9uIGNvZGVcIixcbiAgICBicmFuZE5hbWU6IGNvbmZpZy5hcHBOYW1lLFxuICAgIG1lc3NhZ2U6IGNvbmZpZy5tZXNzYWdlID8/IFwiWW91ciB2ZXJpZmljYXRpb24gY29kZSBpczpcIixcbiAgICBjb2RlVHRsU2Vjb25kczogY29uZmlnLmNvZGVUdGxTZWNvbmRzLFxuICB9O1xuXG4gIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgYXBwTmFtZTogY29uZmlnLmFwcE5hbWUsXG4gICAgYmFzZVVSTDogb3JpZ2luLFxuICAgIGJhc2VQYXRoLFxuICAgIGRhdGFiYXNlOiBjb25maWcuc3RvcmFnZS5kYXRhYmFzZSxcbiAgICBzZWNyZXQ6IGNvbmZpZy5zZWNyZXQsXG4gICAgdHJ1c3RlZE9yaWdpbnM6IFtvcmlnaW5dLFxuICAgIHNlc3Npb246IHtcbiAgICAgIGV4cGlyZXNJbjogY29uZmlnLnNlc3Npb25UdGxTZWNvbmRzLFxuICAgICAgdXBkYXRlQWdlOiBNYXRoLm1pbigyNCAqIDYwICogNjAsIGNvbmZpZy5zZXNzaW9uVHRsU2Vjb25kcyksXG4gICAgfSxcbiAgICB2ZXJpZmljYXRpb246IHtcbiAgICAgIHN0b3JlSWRlbnRpZmllcjogXCJoYXNoZWRcIixcbiAgICAgIHN0b3JlSW5EYXRhYmFzZTogdHJ1ZSxcbiAgICB9LFxuICAgIHJhdGVMaW1pdDoge1xuICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgIHdpbmRvdzogMTUgKiA2MCxcbiAgICAgIG1heDogMTAsXG4gICAgICBjdXN0b21SdWxlczoge1xuICAgICAgICBcIi9lbWFpbC1vdHAvc2VuZC12ZXJpZmljYXRpb24tb3RwXCI6IHsgd2luZG93OiAxNSAqIDYwLCBtYXg6IDUgfSxcbiAgICAgICAgXCIvc2lnbi1pbi9lbWFpbC1vdHBcIjogeyB3aW5kb3c6IDE1ICogNjAsIG1heDogMTAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBhZHZhbmNlZDoge1xuICAgICAgdXNlU2VjdXJlQ29va2llczogb3JpZ2luLnN0YXJ0c1dpdGgoXCJodHRwczovL1wiKSxcbiAgICAgIGlwQWRkcmVzczoge1xuICAgICAgICBpcEFkZHJlc3NIZWFkZXJzOiBbXCJ4LXJlYWwtaXBcIl0sXG4gICAgICAgIGRpc2FibGVJcFRyYWNraW5nOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICBjb29raWVzOiB7XG4gICAgICAgIHNlc3Npb25fdG9rZW46IHtcbiAgICAgICAgICBuYW1lOiBjb25maWcuc2Vzc2lvbkNvb2tpZU5hbWUgPz8gU0VTU0lPTl9DT09LSUVfTkFNRSxcbiAgICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgICBodHRwT25seTogdHJ1ZSxcbiAgICAgICAgICAgIHNhbWVTaXRlOiBcImxheFwiLFxuICAgICAgICAgICAgc2VjdXJlOiBvcmlnaW4uc3RhcnRzV2l0aChcImh0dHBzOi8vXCIpLFxuICAgICAgICAgICAgcGF0aDogXCIvXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBkYXRhYmFzZUhvb2tzOiB7XG4gICAgICB1c2VyOiB7XG4gICAgICAgIGNyZWF0ZToge1xuICAgICAgICAgIGJlZm9yZTogYXN5bmMgKHVzZXI6IHsgZW1haWw6IHN0cmluZyB9KSA9PiB7XG4gICAgICAgICAgICBpZiAoIShhd2FpdCBjb25maWcuYXV0aG9yaXplSWRlbnRpdHkobm9ybWFsaXplRW1haWwodXNlci5lbWFpbCkpKSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgQVBJRXJyb3IoXCJGT1JCSURERU5cIiwgeyBtZXNzYWdlOiBcIklkZW50aXR5IGlzIG5vdCBhdXRob3JpemVkXCIgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyBkYXRhOiB1c2VyIH07XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBwbHVnaW5zOiBbXG4gICAgICBlbWFpbE9UUCh7XG4gICAgICAgIG90cExlbmd0aDogNixcbiAgICAgICAgZXhwaXJlc0luOiBjb25maWcuY29kZVR0bFNlY29uZHMsXG4gICAgICAgIGFsbG93ZWRBdHRlbXB0czogY29uZmlnLm1heEF0dGVtcHRzLFxuICAgICAgICBzdG9yZU9UUDogXCJoYXNoZWRcIixcbiAgICAgICAgYXN5bmMgc2VuZFZlcmlmaWNhdGlvbk9UUCh7IGVtYWlsLCBvdHAsIHR5cGUgfSkge1xuICAgICAgICAgIGlmICh0eXBlICE9PSBcInNpZ24taW5cIikgcmV0dXJuO1xuICAgICAgICAgIGNvbnN0IGFkZHJlc3MgPSBub3JtYWxpemVFbWFpbChlbWFpbCk7XG4gICAgICAgICAgaWYgKCEoYXdhaXQgY29uZmlnLmF1dGhvcml6ZUlkZW50aXR5KGFkZHJlc3MpKSkge1xuICAgICAgICAgICAgLy8gTm90IG9uIHRoZSBhbGxvdy1saXN0OiBubyBjb2RlIGlzIHNlbnQuIExvZyBpdCBzbyBhIFwicmVxdWVzdGVkIGFcbiAgICAgICAgICAgIC8vIGNvZGUgYnV0IGdvdCBub3RoaW5nXCIgY2FzZSBpcyB2aXNpYmxlIHJhdGhlciB0aGFuIHNpbGVudC5cbiAgICAgICAgICAgIGxvZ2dlci53YXJuKFwidmVyaWZpY2F0aW9uIGNvZGUgbm90IHNlbnQ6IGlkZW50aXR5IG5vdCBhdXRob3JpemVkXCIsIHtcbiAgICAgICAgICAgICAgZW1haWw6IGFkZHJlc3MsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgbG9nZ2VyLmluZm8oXCJzZW5kaW5nIHZlcmlmaWNhdGlvbiBjb2RlXCIsIHsgZW1haWw6IGFkZHJlc3MgfSk7XG4gICAgICAgICAgdm9pZCBjb25maWcuc2VuZENvZGUoYWRkcmVzcywgb3RwLCBlbWFpbE9wdGlvbnMpLmNhdGNoKChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFwidmVyaWZpY2F0aW9uIGVtYWlsIGZhaWxlZFwiLCB7IGVtYWlsOiBhZGRyZXNzLCBlcnJvciB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICAgcGFzc2tleSh7XG4gICAgICAgIHJwSUQsXG4gICAgICAgIHJwTmFtZTogY29uZmlnLmFwcE5hbWUsXG4gICAgICAgIG9yaWdpbixcbiAgICAgICAgYXV0aGVudGljYXRvclNlbGVjdGlvbjoge1xuICAgICAgICAgIHJlc2lkZW50S2V5OiBcInByZWZlcnJlZFwiLFxuICAgICAgICAgIHVzZXJWZXJpZmljYXRpb246IFwicHJlZmVycmVkXCIsXG4gICAgICAgIH0sXG4gICAgICAgIHJlZ2lzdHJhdGlvbjogeyByZXF1aXJlU2Vzc2lvbjogdHJ1ZSB9LFxuICAgICAgfSksXG4gICAgXSBhcyBjb25zdCxcbiAgfSBzYXRpc2ZpZXMgQmV0dGVyQXV0aE9wdGlvbnM7XG5cbiAgYXdhaXQgbWlncmF0ZUF1dGgob3B0aW9ucywgY29uZmlnLnN0b3JhZ2UpO1xuICBjb25zdCBhdXRoID0gYmV0dGVyQXV0aChvcHRpb25zKTtcblxuICBjb25zdCBzZXNzaW9uID0gYXN5bmMgKGhlYWRlcnM6IEhlYWRlcnMpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4gPT4ge1xuICAgIGNvbnN0IGN1cnJlbnQgPSBhd2FpdCBhdXRoLmFwaS5nZXRTZXNzaW9uKHsgaGVhZGVycyB9KTtcbiAgICBjb25zdCBlbWFpbCA9IG5vcm1hbGl6ZUVtYWlsKGN1cnJlbnQ/LnVzZXIuZW1haWwpO1xuICAgIGNvbnN0IGNyZWF0ZWRBdCA9IGN1cnJlbnQ/LnNlc3Npb24uY3JlYXRlZEF0O1xuICAgIGNvbnN0IGNyZWF0ZWRBdE1zID0gY3JlYXRlZEF0ID8gbmV3IERhdGUoY3JlYXRlZEF0KS5nZXRUaW1lKCkgOiBOdW1iZXIuTmFOO1xuICAgIGlmIChjb25maWcuc2Vzc2lvbkN1dG9mZk1zICYmICEoY3JlYXRlZEF0TXMgPj0gY29uZmlnLnNlc3Npb25DdXRvZmZNcykpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKCFlbWFpbCB8fCAhKGF3YWl0IGNvbmZpZy5hdXRob3JpemVJZGVudGl0eShlbWFpbCkpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiBlbWFpbDtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVDb21wYXRpYmlsaXR5Um91dGUgPSBhc3luYyAocmVxdWVzdDogUmVxdWVzdCk6IFByb21pc2U8UmVzcG9uc2UgfCB1bmRlZmluZWQ+ID0+IHtcbiAgICBjb25zdCBwYXRoID0gbmV3IFVSTChyZXF1ZXN0LnVybCkucGF0aG5hbWU7XG4gICAgaWYgKHBhdGggPT09IGAke2Jhc2VQYXRofS9zdGF0dXNgKSB7XG4gICAgICBjb25zdCBlbWFpbCA9IGF3YWl0IHNlc3Npb24ocmVxdWVzdC5oZWFkZXJzKTtcbiAgICAgIHJldHVybiBqc29uUmVzcG9uc2Uoe1xuICAgICAgICBhdXRoZW50aWNhdGVkOiBCb29sZWFuKGVtYWlsKSxcbiAgICAgICAgLi4uKGVtYWlsID8geyBlbWFpbCB9IDoge30pLFxuICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICBwYXNza2V5c0VuYWJsZWQ6IHRydWUsXG4gICAgICB9KTtcbiAgICB9XG4gICAgLy8gT1RQIHNlbmQgKyB2ZXJpZnkgZ28gc3RyYWlnaHQgdG8gYmV0dGVyLWF1dGgncyBuYXRpdmUgZW1haWxPVFAgZW5kcG9pbnRzXG4gICAgLy8gKGAvZW1haWwtb3RwL3NlbmQtdmVyaWZpY2F0aW9uLW90cGAsIGAvc2lnbi1pbi9lbWFpbC1vdHBgKTsgdGhlcmUgaXMgbm9cbiAgICAvLyBjb21wYXRpYmlsaXR5IHdyYXBwZXIgZm9yIHRoZW0uIEZhaWx1cmVzIHRoZXJlIGFyZSBsb2dnZWQgYnkgdGhlIHBsdWdpbidzXG4gICAgLy8gc2VuZFZlcmlmaWNhdGlvbk9UUCBob29rLCBub3Qgc3dhbGxvd2VkIGJlaGluZCBhbiBhbHdheXMtb2sgcmVzcG9uc2UuXG4gICAgaWYgKHBhdGggPT09IGAke2Jhc2VQYXRofS9sb2dvdXRgICYmIHJlcXVlc3QubWV0aG9kID09PSBcIlBPU1RcIikge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBhdXRoLmFwaS5zaWduT3V0KHtcbiAgICAgICAgaGVhZGVyczogcmVxdWVzdC5oZWFkZXJzLFxuICAgICAgICBhc1Jlc3BvbnNlOiB0cnVlLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gY29tcGF0aWJpbGl0eVJlc3BvbnNlKHJlc3BvbnNlLCB7IG9rOiByZXNwb25zZS5vaywgcmVkaXJlY3RUbzogbG9nb3V0UmVkaXJlY3RQYXRoIH0pO1xuICAgIH1cbiAgICBpZiAocGF0aCA9PT0gYCR7YmFzZVBhdGh9L2xvZ291dGAgJiYgcmVxdWVzdC5tZXRob2QgPT09IFwiR0VUXCIpIHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXV0aC5hcGkuc2lnbk91dCh7XG4gICAgICAgIGhlYWRlcnM6IHJlcXVlc3QuaGVhZGVycyxcbiAgICAgICAgYXNSZXNwb25zZTogdHJ1ZSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlZGlyZWN0UmVzcG9uc2UocmVzcG9uc2UsIGxvZ291dFJlZGlyZWN0UGF0aCk7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBiYXNlUGF0aCxcbiAgICBwYXNza2V5c0VuYWJsZWQ6IHRydWUsXG4gICAgaGFuZGxlcjogYXN5bmMgKHJlcXVlc3QpID0+IChhd2FpdCBoYW5kbGVDb21wYXRpYmlsaXR5Um91dGUocmVxdWVzdCkpID8/IGF1dGguaGFuZGxlcihyZXF1ZXN0KSxcbiAgICBzZXNzaW9uLFxuICAgIHN0YXR1czogYXN5bmMgKGhlYWRlcnMpID0+IHtcbiAgICAgIGNvbnN0IGVtYWlsID0gYXdhaXQgc2Vzc2lvbihoZWFkZXJzKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGF1dGhlbnRpY2F0ZWQ6IEJvb2xlYW4oZW1haWwpLFxuICAgICAgICAuLi4oZW1haWwgPyB7IGVtYWlsIH0gOiB7fSksXG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgIHBhc3NrZXlzRW5hYmxlZDogdHJ1ZSxcbiAgICAgIH07XG4gICAgfSxcbiAgICBjbG9zZTogKCkgPT4gY29uZmlnLnN0b3JhZ2UuY2xvc2UoKSxcbiAgfTtcbn1cblxuLyoqIFJlc3RyaWN0IGxvZ291dCByZWRpcmVjdHMgdG8gb25lIHNhbWUtb3JpZ2luIGFwcGxpY2F0aW9uIHBhdGguICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplTG9nb3V0UmVkaXJlY3RQYXRoKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICBjb25zdCBwYXRoID0gdmFsdWU/LnRyaW0oKTtcbiAgcmV0dXJuIHBhdGg/LnN0YXJ0c1dpdGgoXCIvXCIpICYmICFwYXRoLnN0YXJ0c1dpdGgoXCIvL1wiKSAmJiAhcGF0aC5pbmNsdWRlcyhcIlxcXFxcIikgPyBwYXRoIDogXCIvXCI7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUVtYWlsKGVtYWlsOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICByZXR1cm4gZW1haWw/LnRyaW0oKS50b0xvd2VyQ2FzZSgpID8/IFwiXCI7XG59XG5cbmZ1bmN0aW9uIGpzb25SZXNwb25zZShib2R5OiB1bmtub3duLCBzdGF0dXMgPSAyMDApOiBSZXNwb25zZSB7XG4gIHJldHVybiBuZXcgUmVzcG9uc2UoSlNPTi5zdHJpbmdpZnkoYm9keSksIHtcbiAgICBzdGF0dXMsXG4gICAgaGVhZGVyczogeyBcImNvbnRlbnQtdHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9LFxuICB9KTtcbn1cblxuZnVuY3Rpb24gY29tcGF0aWJpbGl0eVJlc3BvbnNlKHJlc3BvbnNlOiBSZXNwb25zZSwgYm9keTogdW5rbm93bik6IFJlc3BvbnNlIHtcbiAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKHsgXCJjb250ZW50LXR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgfSk7XG4gIGZvciAoY29uc3QgY29va2llIG9mIHJlc3BvbnNlLmhlYWRlcnMuZ2V0U2V0Q29va2llKCkpIGhlYWRlcnMuYXBwZW5kKFwic2V0LWNvb2tpZVwiLCBjb29raWUpO1xuICByZXR1cm4gbmV3IFJlc3BvbnNlKEpTT04uc3RyaW5naWZ5KGJvZHkpLCB7IHN0YXR1czogMjAwLCBoZWFkZXJzIH0pO1xufVxuXG5mdW5jdGlvbiByZWRpcmVjdFJlc3BvbnNlKHJlc3BvbnNlOiBSZXNwb25zZSwgbG9jYXRpb246IHN0cmluZyk6IFJlc3BvbnNlIHtcbiAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKHsgbG9jYXRpb24gfSk7XG4gIGZvciAoY29uc3QgY29va2llIG9mIHJlc3BvbnNlLmhlYWRlcnMuZ2V0U2V0Q29va2llKCkpIGhlYWRlcnMuYXBwZW5kKFwic2V0LWNvb2tpZVwiLCBjb29raWUpO1xuICByZXR1cm4gbmV3IFJlc3BvbnNlKG51bGwsIHsgc3RhdHVzOiAzMDMsIGhlYWRlcnMgfSk7XG59XG4iXX0=
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.98",
28
+ "@dbx-tools/postgres": "0.6.98",
29
+ "@dbx-tools/shared-auth": "0.6.98",
30
+ "@dbx-tools/shared-core": "0.6.98",
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.98",
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";
@@ -138,7 +133,15 @@ export async function createPasswordlessAuth(
138
133
  async sendVerificationOTP({ email, otp, type }) {
139
134
  if (type !== "sign-in") return;
140
135
  const address = normalizeEmail(email);
141
- if (!(await config.authorizeIdentity(address))) return;
136
+ if (!(await config.authorizeIdentity(address))) {
137
+ // Not on the allow-list: no code is sent. Log it so a "requested a
138
+ // code but got nothing" case is visible rather than silent.
139
+ logger.warn("verification code not sent: identity not authorized", {
140
+ email: address,
141
+ });
142
+ return;
143
+ }
144
+ logger.info("sending verification code", { email: address });
142
145
  void config.sendCode(address, otp, emailOptions).catch((error: unknown) => {
143
146
  logger.error("verification email failed", { email: address, error });
144
147
  });
@@ -181,36 +184,10 @@ export async function createPasswordlessAuth(
181
184
  passkeysEnabled: true,
182
185
  });
183
186
  }
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
- }
187
+ // OTP send + verify go straight to better-auth's native emailOTP endpoints
188
+ // (`/email-otp/send-verification-otp`, `/sign-in/email-otp`); there is no
189
+ // compatibility wrapper for them. Failures there are logged by the plugin's
190
+ // sendVerificationOTP hook, not swallowed behind an always-ok response.
214
191
  if (path === `${basePath}/logout` && request.method === "POST") {
215
192
  const response = await auth.api.signOut({
216
193
  headers: request.headers,
@@ -256,18 +233,6 @@ function normalizeEmail(email: string | undefined): string {
256
233
  return email?.trim().toLowerCase() ?? "";
257
234
  }
258
235
 
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
236
  function jsonResponse(body: unknown, status = 200): Response {
272
237
  return new Response(JSON.stringify(body), {
273
238
  status,