PageSourceSearch

https://lesslikely.com/js/account-auth.js

js lesslikely.com collected 2026-10-03 19:50:06 UTC 45,065 bytes, 1,397 lines download raw bytes

1var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
2  get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
3}) : x)(function(x) {
4  if (typeof require !== "undefined") return require.apply(this, arguments);
5  throw Error('Dynamic require of "' + x + '" is not supported');
6});
7
vendor: 12,928 bytes, lines 8-452
8// node_modules/gotrue-js/lib/index.js
9var HTTPError = class extends Error {
10  constructor(response) {
11    super(response.statusText);
12    this.name = "HTTPError";
13    this.status = response.status;
14  }
15};
16var TextHTTPError = class extends HTTPError {
17  constructor(response, data) {
18    super(response);
19    this.name = "TextHTTPError";
20    this.data = data;
21  }
22};
23var JSONHTTPError = class extends HTTPError {
24  constructor(response, json) {
25    super(response);
26    this.name = "JSONHTTPError";
27    this.json = json;
28  }
29};
30var API = class _API {
31  constructor(apiURL, options) {
32    this.apiURL = apiURL || "";
33    this._sameOrigin = /^\/(?!\/)/.test(this.apiURL);
34    this.defaultHeaders = options?.defaultHeaders || {};
35  }
36  headers(headers = {}) {
37    return {
38      ...this.defaultHeaders,
39      "Content-Type": "application/json",
40      ...headers
41    };
42  }
43  static async parseJsonResponse(response) {
44    const json = await response.json();
45    if (!response.ok) {
46      throw new JSONHTTPError(response, json);
47    }
48    return json;
49  }
50  async request(path, options = {}) {
51    const headers = this.headers(options.headers || {});
52    if (!options.body) {
53      delete headers["Content-Type"];
54    }
55    const fetchOptions = {
56      ...options,
57      headers
58    };
59    if (this._sameOrigin) {
60      fetchOptions.credentials = options.credentials || "same-origin";
61    }
62    const response = await fetch(this.apiURL + path, fetchOptions);
63    const contentType = response.headers.get("Content-Type");
64    if (contentType?.includes("json")) {
65      return _API.parseJsonResponse(response);
66    }
67    const data = await response.text();
68    if (!response.ok) {
69      throw new TextHTTPError(response, data);
70    }
71    return data;
72  }
73};
74var Admin = class {
75  constructor(user) {
76    this.user = user;
77  }
78  listUsers(aud) {
79    return this.user._request("/admin/users", {
80      method: "GET",
81      audience: aud
82    });
83  }
84  getUser(user) {
85    return this.user._request(`/admin/users/${user.id}`);
86  }
87  updateUser(user, attributes = {}) {
88    return this.user._request(`/admin/users/${user.id}`, {
89      method: "PUT",
90      body: JSON.stringify(attributes)
91    });
92  }
93  createUser(email2, password2, attributes = {}) {
94    attributes.email = email2;
95    attributes.password = password2;
96    return this.user._request("/admin/users", {
97      method: "POST",
98      body: JSON.stringify(attributes)
99    });
100  }
101  deleteUser(user) {
102    return this.user._request(`/admin/users/${user.id}`, {
103      method: "DELETE"
104    });
105  }
106};
107var ExpiryMargin = 60 * 1e3;
108var storageKey = "gotrue.user";
109var refreshPromises = {};
110var currentUser = null;
111var forbiddenUpdateAttributes = { api: 1, token: 1, audience: 1, url: 1 };
112var forbiddenSaveAttributes = { api: 1 };
113var isBrowser = () => typeof window !== "undefined";
114var storageListenerActive = false;
115function ensureStorageListener() {
116  if (!storageListenerActive && isBrowser()) {
117    storageListenerActive = true;
118    window.addEventListener("storage", (event) => {
119      if (event.key === storageKey) {
120        currentUser = null;
121      }
122    });
123  }
124}
125var User = class _User {
126  constructor(api, tokenResponse, audience) {
127    this.token = null;
128    this.api = api;
129    this.url = api.apiURL;
130    this.audience = audience;
131    this._processTokenResponse(tokenResponse);
132    currentUser = this;
133    ensureStorageListener();
134  }
135  static removeSavedSession() {
136    isBrowser() && localStorage.removeItem(storageKey);
137  }
138  static recoverSession(apiInstance) {
139    ensureStorageListener();
140    if (currentUser) {
141      return currentUser;
142    }
143    const json = isBrowser() && localStorage.getItem(storageKey);
144    if (json) {
145      try {
146        const data = JSON.parse(json);
147        const { url, token, audience } = data;
148        if (!url || !token) {
149          return null;
150        }
151        const api = apiInstance || new API(url, {});
152        return new _User(api, token, audience)._saveUserData(data, true);
153      } catch (error) {
154        console.error(new Error(`Gotrue-js: Error recovering session: ${error}`));
155        return null;
156      }
157    }
158    return null;
159  }
160  get admin() {
161    return new Admin(this);
162  }
163  async update(attributes) {
164    const response = await this._request("/user", {
165      method: "PUT",
166      body: JSON.stringify(attributes)
167    });
168    return this._saveUserData(response)._refreshSavedSession();
169  }
170  jwt(forceRefresh) {
171    const token = this.tokenDetails();
172    if (token === null || token === void 0) {
173      return Promise.reject(new Error(`Gotrue-js: failed getting jwt access token`));
174    }
175    const { expires_at, refresh_token, access_token } = token;
176    if (forceRefresh || expires_at - ExpiryMargin < Date.now()) {
177      return this._refreshToken(refresh_token);
178    }
179    return Promise.resolve(access_token);
180  }
181  logout() {
182    return this._request("/logout", { method: "POST" }).then(this.clearSession.bind(this)).catch(this.clearSession.bind(this));
183  }
184  _refreshToken(refresh_token) {
185    const existingPromise = refreshPromises[refresh_token];
186    if (existingPromise) {
187      return existingPromise;
188    }
189    const refreshRequest = this.api.request("/token", {
190      method: "POST",
191      headers: { "Content-Type": "application/x-www-form-urlencoded" },
192      body: `grant_type=refresh_token&refresh_token=${refresh_token}`
193    });
194    const timeoutPromise = new Promise((_resolve, reject) => {
195      setTimeout(() => reject(new Error("Token refresh timeout")), 3e4);
196    });
197    const promise = Promise.race([refreshRequest, timeoutPromise]).then((response) => {
198      delete refreshPromises[refresh_token];
199      this._processTokenResponse(response);
200      this._refreshSavedSession();
201      if (!this.token) {
202        throw new Error("Gotrue-js: Token not set after refresh");
203      }
204      return this.token.access_token;
205    }).catch((error) => {
206      delete refreshPromises[refresh_token];
207      this.clearSession();
208      throw error;
209    });
210    refreshPromises[refresh_token] = promise;
211    return promise;
212  }
213  async _request(path, options = {}) {
214    options.headers = options.headers || {};
215    const aud = options.audience || this.audience;
216    if (aud) {
217      options.headers["X-JWT-AUD"] = aud;
218    }
219    try {
220      const token = await this.jwt();
221      return await this.api.request(path, {
222        headers: Object.assign(options.headers, {
223          Authorization: `Bearer ${token}`
224        }),
225        ...options
226      });
227    } catch (error) {
228      if (error instanceof JSONHTTPError && error.json) {
229        if (error.json.msg) {
230          error.message = error.json.msg;
231        } else if (error.json.error) {
232          error.message = `${error.json.error}: ${error.json.error_description}`;
233        }
234      }
235      throw error;
236    }
237  }
238  async getUserData() {
239    const response = await this._request("/user");
240    return this._saveUserData(response)._refreshSavedSession();
241  }
242  _saveUserData(attributes, fromStorage) {
243    for (const key in attributes) {
244      if (key in _User.prototype || key in forbiddenUpdateAttributes) {
245        continue;
246      }
247      this[key] = attributes[key];
248    }
249    if (fromStorage) {
250      this._fromStorage = true;
251    }
252    return this;
253  }
254  _processTokenResponse(tokenResponse) {
255    this.token = tokenResponse;
256    try {
257      const claims = JSON.parse(urlBase64Decode(tokenResponse.access_token.split(".")[1]));
258      this.token.expires_at = claims.exp * 1e3;
259    } catch (error) {
260      console.error(new Error(`Gotrue-js: Failed to parse tokenResponse claims: ${error}`));
261    }
262  }
263  _refreshSavedSession() {
264    if (isBrowser() && localStorage.getItem(storageKey)) {
265      this._saveSession();
266    }
267    return this;
268  }
269  get _details() {
270    const userCopy = {};
271    for (const key in this) {
272      if (key in _User.prototype || key in forbiddenSaveAttributes) {
273        continue;
274      }
275      userCopy[key] = this[key];
276    }
277    return userCopy;
278  }
279  _saveSession() {
280    isBrowser() && localStorage.setItem(storageKey, JSON.stringify(this._details));
281    return this;
282  }
283  tokenDetails() {
284    return this.token;
285  }
286  clearSession() {
287    _User.removeSavedSession();
288    this.token = null;
289    currentUser = null;
290  }
291};
292function base64Decode(base64) {
293  if (typeof atob === "function") {
294    return atob(base64);
295  }
296  return Buffer.from(base64, "base64").toString("binary");
297}
298function urlBase64Decode(str) {
299  let output = str.replace(/-/g, "+").replace(/_/g, "/");
300  switch (output.length % 4) {
301    case 0:
302      break;
303    case 2:
304      output += "==";
305      break;
306    case 3:
307      output += "=";
308      break;
309    default:
310      throw new Error("Illegal base64url string!");
311  }
312  const binaryString = base64Decode(output);
313  try {
314    const bytes = Uint8Array.from(binaryString, (char) => char.codePointAt(0) ?? 0);
315    return new TextDecoder().decode(bytes);
316  } catch {
317    return binaryString;
318  }
319}
320var HTTPRegexp = /^http:\/\//;
321var defaultApiURL = `/.netlify/identity`;
322var GoTrue = class {
323  constructor({
324    APIUrl = defaultApiURL,
325    audience = "",
326    setCookie = false,
327    clientName = "gotrue-js"
328  } = {}) {
329    if (HTTPRegexp.test(APIUrl)) {
330      console.warn(
331        "Warning:\n\nDO NOT USE HTTP IN PRODUCTION FOR GOTRUE EVER!\nGoTrue REQUIRES HTTPS to work securely."
332      );
333    }
334    if (audience) {
335      this.audience = audience;
336    }
337    this.setCookie = setCookie;
338    this.api = new API(APIUrl, { defaultHeaders: { "X-Nf-Client": clientName } });
339  }
340  async _request(path, options = {}) {
341    options.headers = options.headers || {};
342    const aud = options.audience || this.audience;
343    if (aud) {
344      options.headers["X-JWT-AUD"] = aud;
345    }
346    try {
347      return await this.api.request(path, options);
348    } catch (error) {
349      if (error instanceof JSONHTTPError && error.json) {
350        if (error.json.msg) {
351          error.message = error.json.msg;
352        } else if (error.json.error) {
353          error.message = `${error.json.error}: ${error.json.error_description}`;
354        }
355      }
356      throw error;
357    }
358  }
359  settings() {
360    return this._request("/settings");
361  }
362  signup(email2, password2, data) {
363    return this._request("/signup", {
364      method: "POST",
365      body: JSON.stringify({ email: email2, password: password2, data })
366    });
367  }
368  login(email2, password2, remember) {
369    this._setRememberHeaders(remember);
370    return this._request("/token", {
371      method: "POST",
372      headers: { "Content-Type": "application/x-www-form-urlencoded" },
373      body: `grant_type=password&username=${encodeURIComponent(
374        email2
375      )}&password=${encodeURIComponent(password2)}`
376    }).then((response) => {
377      User.removeSavedSession();
378      return this.createUser(response, remember);
379    });
380  }
381  loginExternalUrl(provider) {
382    return `${this.api.apiURL}/authorize?provider=${provider}`;
383  }
384  confirm(token, remember) {
385    this._setRememberHeaders(remember);
386    return this.verify("signup", token, remember);
387  }
388  requestPasswordRecovery(email2) {
389    return this._request("/recover", {
390      method: "POST",
391      body: JSON.stringify({ email: email2 })
392    });
393  }
394  recover(token, remember) {
395    this._setRememberHeaders(remember);
396    return this.verify("recovery", token, remember);
397  }
398  acceptInvite(token, password2, remember) {
399    this._setRememberHeaders(remember);
400    return this._request("/verify", {
401      method: "POST",
402      body: JSON.stringify({ token, password: password2, type: "signup" })
403    }).then((response) => this.createUser(response, remember));
404  }
405  acceptInviteExternalUrl(provider, token) {
406    return `${this.api.apiURL}/authorize?provider=${provider}&invite_token=${token}`;
407  }
408  createUser(tokenResponse, remember = false) {
409    this._setRememberHeaders(remember);
410    const user = new User(this.api, tokenResponse, this.audience || "");
411    return user.getUserData().then((userData) => {
412      if (remember) {
413        userData._saveSession();
414      }
415      return userData;
416    });
417  }
418  currentUser() {
419    const user = User.recoverSession(this.api);
420    user && this._setRememberHeaders(user._fromStorage);
421    return user;
422  }
423  async validateCurrentSession() {
424    const user = this.currentUser();
425    if (!user) {
426      return null;
427    }
428    try {
429      return await user.getUserData();
430    } catch {
431      user.clearSession();
432      return null;
433    }
434  }
435  verify(type, token, remember) {
436    this._setRememberHeaders(remember);
437    return this._request("/verify", {
438      method: "POST",
439      body: JSON.stringify({ token, type })
440    }).then((response) => this.createUser(response, remember));
441  }
442  _setRememberHeaders(remember) {
443    if (this.setCookie) {
444      this.api.defaultHeaders = this.api.defaultHeaders || {};
445      this.api.defaultHeaders["X-Use-Cookie"] = remember ? "1" : "session";
446    }
447  }
448};
449if (typeof window !== "undefined") {
450  window.GoTrue = GoTrue;
451}
452
vendor: 24,118 bytes, lines 453-1190
453// node_modules/@netlify/identity/dist/main.js
454var __require2 = /* @__PURE__ */ ((x) => typeof __require !== "undefined" ? __require : typeof Proxy !== "undefined" ? new Proxy(x, {
455  get: (a, b) => (typeof __require !== "undefined" ? __require : a)[b]
456}) : x)(function(x) {
457  if (typeof __require !== "undefined") return __require.apply(this, arguments);
458  throw Error('Dynamic require of "' + x + '" is not supported');
459});
460var AUTH_PROVIDERS = ["google", "github", "gitlab", "bitbucket", "facebook", "email"];
461var AuthError = class _AuthError extends Error {
462  constructor(message, status2, options) {
463    super(message);
464    this.name = "AuthError";
465    this.status = status2;
466    if (options && "cause" in options) {
467      this.cause = options.cause;
468    }
469  }
470  static from(error) {
471    if (error instanceof _AuthError) return error;
472    const message = error instanceof Error ? error.message : String(error);
473    return new _AuthError(message, void 0, { cause: error });
474  }
475};
476var MissingIdentityError = class extends Error {
477  constructor(message = "Netlify Identity is not available.") {
478    super(message);
479    this.name = "MissingIdentityError";
480  }
481};
482var IDENTITY_PATH = "/.netlify/identity";
483var goTrueClient = null;
484var cachedApiUrl;
485var warnedMissingUrl = false;
486var isBrowser2 = () => typeof window !== "undefined" && typeof window.location !== "undefined";
487var discoverApiUrl = () => {
488  if (cachedApiUrl !== void 0) return cachedApiUrl;
489  if (isBrowser2()) {
490    cachedApiUrl = `${window.location.origin}${IDENTITY_PATH}`;
491  } else {
492    const identityContext = getIdentityContext();
493    if (identityContext?.url) {
494      cachedApiUrl = identityContext.url;
495    } else if (globalThis.Netlify?.context?.url) {
496      cachedApiUrl = new URL(IDENTITY_PATH, globalThis.Netlify.context.url).href;
497    } else if (typeof process !== "undefined" && process.env?.URL) {
498      cachedApiUrl = new URL(IDENTITY_PATH, process.env.URL).href;
499    }
500  }
501  return cachedApiUrl ?? null;
502};
503var getGoTrueClient = () => {
504  if (goTrueClient) return goTrueClient;
505  const apiUrl = discoverApiUrl();
506  if (!apiUrl) {
507    if (!warnedMissingUrl) {
508      console.warn(
509        "@netlify/identity: Could not determine the Identity endpoint URL. Make sure your site has Netlify Identity enabled, or run your app with `netlify dev`."
510      );
511      warnedMissingUrl = true;
512    }
513    return null;
514  }
515  goTrueClient = new GoTrue({ APIUrl: apiUrl, setCookie: false });
516  return goTrueClient;
517};
518var getClient = () => {
519  const client = getGoTrueClient();
520  if (!client) throw new MissingIdentityError();
521  return client;
522};
523var getIdentityContext = () => {
524  const identityContext = globalThis.netlifyIdentityContext;
525  if (identityContext?.url) {
526    return {
527      url: identityContext.url,
528      token: identityContext.token
529    };
530  }
531  if (globalThis.Netlify?.context?.url) {
532    return { url: new URL(IDENTITY_PATH, globalThis.Netlify.context.url).href };
533  }
534  const siteUrl = typeof process !== "undefined" ? process.env?.URL : void 0;
535  if (siteUrl) {
536    return { url: new URL(IDENTITY_PATH, siteUrl).href };
537  }
538  return null;
539};
540var NF_JWT_COOKIE = "nf_jwt";
541var NF_REFRESH_COOKIE = "nf_refresh";
542var getCookie = (name2) => {
543  if (typeof document === "undefined") return null;
544  const match = new RegExp(`(?:^|; )${name2.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}=([^;]*)`).exec(document.cookie);
545  if (!match) return null;
546  try {
547    return decodeURIComponent(match[1]);
548  } catch {
549    return match[1];
550  }
551};
552var setAuthCookies = (cookies, accessToken, refreshToken) => {
553  cookies.set({
554    name: NF_JWT_COOKIE,
555    value: accessToken,
556    httpOnly: false,
557    secure: true,
558    path: "/",
559    sameSite: "Lax"
560  });
561  if (refreshToken) {
562    cookies.set({
563      name: NF_REFRESH_COOKIE,
564      value: refreshToken,
565      httpOnly: false,
566      secure: true,
567      path: "/",
568      sameSite: "Lax"
569    });
570  }
571};
572var deleteAuthCookies = (cookies) => {
573  cookies.delete(NF_JWT_COOKIE);
574  cookies.delete(NF_REFRESH_COOKIE);
575};
576var setBrowserAuthCookies = (accessToken, refreshToken) => {
577  if (typeof document === "undefined") return;
578  document.cookie = `${NF_JWT_COOKIE}=${encodeURIComponent(accessToken)}; path=/; secure; samesite=lax`;
579  if (refreshToken) {
580    document.cookie = `${NF_REFRESH_COOKIE}=${encodeURIComponent(refreshToken)}; path=/; secure; samesite=lax`;
581  }
582};
583var deleteBrowserAuthCookies = () => {
584  if (typeof document === "undefined") return;
585  document.cookie = `${NF_JWT_COOKIE}=; path=/; secure; samesite=lax; expires=Thu, 01 Jan 1970 00:00:00 GMT`;
586  document.cookie = `${NF_REFRESH_COOKIE}=; path=/; secure; samesite=lax; expires=Thu, 01 Jan 1970 00:00:00 GMT`;
587};
588var getServerCookie = (name2) => {
589  const cookies = globalThis.Netlify?.context?.cookies;
590  if (!cookies || typeof cookies.get !== "function") return null;
591  return cookies.get(name2) ?? null;
592};
593var nextHeadersFn;
594var triggerNextjsDynamic = () => {
595  if (nextHeadersFn === null) return;
596  if (nextHeadersFn === void 0) {
597    try {
598      if (typeof __require2 === "undefined") {
599        nextHeadersFn = null;
600        return;
601      }
602      const mod = __require2("next/headers");
603      nextHeadersFn = mod.headers;
604    } catch {
605      nextHeadersFn = null;
606      return;
607    }
608  }
609  const fn = nextHeadersFn;
610  if (!fn) return;
611  try {
612    fn();
613  } catch (e) {
614    if (e instanceof Error && ("digest" in e || /bail\s*out.*prerende/i.test(e.message))) {
615      throw e;
616    }
617  }
618};
619var DEFAULT_TIMEOUT_MS = 5e3;
620var fetchWithTimeout = async (url, options = {}, timeoutMs = DEFAULT_TIMEOUT_MS) => {
621  const controller = new AbortController();
622  const timer = setTimeout(() => {
623    controller.abort();
624  }, timeoutMs);
625  try {
626    return await fetch(url, { ...options, signal: controller.signal });
627  } catch (error) {
628    if (error instanceof Error && error.name === "AbortError") {
629      const pathname = new URL(url).pathname;
630      throw new AuthError(`Identity request to ${pathname} timed out after ${String(timeoutMs)}ms`);
631    }
632    throw error;
633  } finally {
634    clearTimeout(timer);
635  }
636};
637var AUTH_EVENTS = {
638  LOGIN: "login",
639  LOGOUT: "logout",
640  TOKEN_REFRESH: "token_refresh",
641  USER_UPDATED: "user_updated",
642  RECOVERY: "recovery"
643};
644var GOTRUE_STORAGE_KEY = "gotrue.user";
645var listeners = /* @__PURE__ */ new Set();
646var emitAuthEvent = (event, user) => {
647  for (const listener of listeners) {
648    try {
649      listener(event, user);
650    } catch {
651    }
652  }
653};
654var storageListenerAttached = false;
655var attachStorageListener = () => {
656  if (storageListenerAttached || !isBrowser2()) return;
657  storageListenerAttached = true;
658  window.addEventListener("storage", (event) => {
659    if (event.key !== GOTRUE_STORAGE_KEY) return;
660    if (event.newValue) {
661      const client = getGoTrueClient();
662      const currentUser2 = client?.currentUser();
663      emitAuthEvent(AUTH_EVENTS.LOGIN, currentUser2 ? toUser(currentUser2) : null);
664    } else {
665      emitAuthEvent(AUTH_EVENTS.LOGOUT, null);
666    }
667  });
668};
669var onAuthChange = (callback) => {
670  if (!isBrowser2()) {
671    return () => {
672    };
673  }
674  listeners.add(callback);
675  attachStorageListener();
676  return () => {
677    listeners.delete(callback);
678  };
679};
680var REFRESH_MARGIN_S = 60;
681var refreshTimer = null;
682var startTokenRefresh = () => {
683  if (!isBrowser2()) return;
684  stopTokenRefresh();
685  const client = getGoTrueClient();
686  const user = client?.currentUser();
687  if (!user) return;
688  const token = user.tokenDetails();
689  if (!token?.expires_at) return;
690  const nowS = Math.floor(Date.now() / 1e3);
691  const expiresAtS = typeof token.expires_at === "number" && token.expires_at > 1e12 ? Math.floor(token.expires_at / 1e3) : token.expires_at;
692  const delayMs = Math.max(0, expiresAtS - nowS - REFRESH_MARGIN_S) * 1e3;
693  refreshTimer = setTimeout(() => {
694    void (async () => {
695      try {
696        const freshJwt = await user.jwt(true);
697        const freshDetails = user.tokenDetails();
698        setBrowserAuthCookies(freshJwt, freshDetails?.refresh_token);
699        emitAuthEvent(AUTH_EVENTS.TOKEN_REFRESH, toUser(user));
700        startTokenRefresh();
701      } catch {
702        stopTokenRefresh();
703      }
704    })();
705  }, delayMs);
706};
707var stopTokenRefresh = () => {
708  if (refreshTimer !== null) {
709    clearTimeout(refreshTimer);
710    refreshTimer = null;
711  }
712};
713var getCookies = () => {
714  const cookies = globalThis.Netlify?.context?.cookies;
715  if (!cookies) {
716    throw new AuthError("Server-side auth requires Netlify Functions runtime");
717  }
718  return cookies;
719};
720var getServerIdentityUrl = () => {
721  const ctx = getIdentityContext();
722  if (!ctx?.url) {
723    throw new AuthError("Could not determine the Identity endpoint URL on the server");
724  }
725  return ctx.url;
726};
727var persistSession = true;
728var login = async (email2, password2) => {
729  if (!isBrowser2()) {
730    const identityUrl = getServerIdentityUrl();
731    const cookies = getCookies();
732    const body = new URLSearchParams({
733      grant_type: "password",
734      username: email2,
735      password: password2
736    });
737    let res;
738    try {
739      res = await fetchWithTimeout(`${identityUrl}/token`, {
740        method: "POST",
741        headers: { "Content-Type": "application/x-www-form-urlencoded" },
742        body: body.toString()
743      });
744    } catch (error) {
745      throw AuthError.from(error);
746    }
747    if (!res.ok) {
748      const errorBody = await res.json().catch(() => ({}));
749      throw new AuthError(
750        errorBody.msg ?? errorBody.error_description ?? `Login failed (${String(res.status)})`,
751        res.status
752      );
753    }
754    const data = await res.json();
755    const accessToken = data.access_token;
756    let userRes;
757    try {
758      userRes = await fetchWithTimeout(`${identityUrl}/user`, {
759        headers: { Authorization: `Bearer ${accessToken}` }
760      });
761    } catch (error) {
762      throw AuthError.from(error);
763    }
764    if (!userRes.ok) {
765      const errorBody = await userRes.json().catch(() => ({}));
766      throw new AuthError(errorBody.msg ?? `Failed to fetch user data (${String(userRes.status)})`, userRes.status);
767    }
768    const userData = await userRes.json();
769    const user = toUser(userData);
770    setAuthCookies(cookies, accessToken, data.refresh_token);
771    return user;
772  }
773  const client = getClient();
774  try {
775    const gotrueUser = await client.login(email2, password2, persistSession);
776    const jwt = await gotrueUser.jwt();
777    setBrowserAuthCookies(jwt, gotrueUser.tokenDetails()?.refresh_token);
778    const user = toUser(gotrueUser);
779    startTokenRefresh();
780    emitAuthEvent(AUTH_EVENTS.LOGIN, user);
781    return user;
782  } catch (error) {
783    throw AuthError.from(error);
784  }
785};
786var signup = async (email2, password2, data) => {
787  if (!isBrowser2()) {
788    const identityUrl = getServerIdentityUrl();
789    const cookies = getCookies();
790    let res;
791    try {
792      res = await fetchWithTimeout(`${identityUrl}/signup`, {
793        method: "POST",
794        headers: { "Content-Type": "application/json" },
795        body: JSON.stringify({ email: email2, password: password2, data })
796      });
797    } catch (error) {
798      throw AuthError.from(error);
799    }
800    if (!res.ok) {
801      const errorBody = await res.json().catch(() => ({}));
802      throw new AuthError(errorBody.msg ?? `Signup failed (${String(res.status)})`, res.status);
803    }
804    const responseData = await res.json();
805    const user = toUser(responseData);
806    if (responseData.confirmed_at) {
807      const accessToken = responseData.access_token;
808      if (accessToken) {
809        setAuthCookies(cookies, accessToken, responseData.refresh_token);
810      }
811    }
812    return user;
813  }
814  const client = getClient();
815  try {
816    const response = await client.signup(email2, password2, data);
817    const user = toUser(response);
818    if (response.confirmed_at) {
819      const jwt = await response.jwt?.();
820      if (jwt) {
821        const refreshToken = response.tokenDetails?.()?.refresh_token;
822        setBrowserAuthCookies(jwt, refreshToken);
823      }
824      startTokenRefresh();
825      emitAuthEvent(AUTH_EVENTS.LOGIN, user);
826    }
827    return user;
828  } catch (error) {
829    throw AuthError.from(error);
830  }
831};
832var logout = async () => {
833  if (!isBrowser2()) {
834    const identityUrl = getServerIdentityUrl();
835    const cookies = getCookies();
836    const jwt = cookies.get(NF_JWT_COOKIE);
837    if (jwt) {
838      try {
839        await fetchWithTimeout(`${identityUrl}/logout`, {
840          method: "POST",
841          headers: { Authorization: `Bearer ${jwt}` }
842        });
843      } catch {
844      }
845    }
846    deleteAuthCookies(cookies);
847    return;
848  }
849  const client = getClient();
850  try {
851    const currentUser2 = client.currentUser();
852    if (currentUser2) {
853      await currentUser2.logout();
854    }
855    deleteBrowserAuthCookies();
856    stopTokenRefresh();
857    emitAuthEvent(AUTH_EVENTS.LOGOUT, null);
858  } catch (error) {
859    throw AuthError.from(error);
860  }
861};
862var oauthLogin = (provider) => {
863  if (!isBrowser2()) {
864    throw new AuthError("oauthLogin() is only available in the browser");
865  }
866  const client = getClient();
867  window.location.href = client.loginExternalUrl(provider);
868  throw new AuthError("Redirecting to OAuth provider");
869};
870var handleAuthCallback = async () => {
871  if (!isBrowser2()) return null;
872  const hash = window.location.hash.substring(1);
873  if (!hash) return null;
874  const client = getClient();
875  const params = new URLSearchParams(hash);
876  try {
877    const accessToken = params.get("access_token");
878    if (accessToken) return await handleOAuthCallback(client, params, accessToken);
879    const confirmationToken = params.get("confirmation_token");
880    if (confirmationToken) return await handleConfirmationCallback(client, confirmationToken);
881    const recoveryToken = params.get("recovery_token");
882    if (recoveryToken) return await handleRecoveryCallback(client, recoveryToken);
883    const inviteToken2 = params.get("invite_token");
884    if (inviteToken2) return handleInviteCallback(inviteToken2);
885    const emailChangeToken = params.get("email_change_token");
886    if (emailChangeToken) return await handleEmailChangeCallback(client, emailChangeToken);
887    return null;
888  } catch (error) {
889    if (error instanceof AuthError) throw error;
890    throw AuthError.from(error);
891  }
892};
893var handleOAuthCallback = async (client, params, accessToken) => {
894  const refreshToken = params.get("refresh_token") ?? "";
895  const expiresIn = parseInt(params.get("expires_in") ?? "", 10);
896  const expiresAt = parseInt(params.get("expires_at") ?? "", 10);
897  const gotrueUser = await client.createUser(
898    {
899      access_token: accessToken,
900      token_type: params.get("token_type") ?? "bearer",
901      expires_in: isFinite(expiresIn) ? expiresIn : 3600,
902      expires_at: isFinite(expiresAt) ? expiresAt : Math.floor(Date.now() / 1e3) + 3600,
903      refresh_token: refreshToken
904    },
905    persistSession
906  );
907  setBrowserAuthCookies(accessToken, refreshToken || void 0);
908  const user = toUser(gotrueUser);
909  startTokenRefresh();
910  clearHash();
911  emitAuthEvent(AUTH_EVENTS.LOGIN, user);
912  return { type: "oauth", user };
913};
914var handleConfirmationCallback = async (client, token) => {
915  const gotrueUser = await client.confirm(token, persistSession);
916  const jwt = await gotrueUser.jwt();
917  setBrowserAuthCookies(jwt, gotrueUser.tokenDetails()?.refresh_token);
918  const user = toUser(gotrueUser);
919  startTokenRefresh();
920  clearHash();
921  emitAuthEvent(AUTH_EVENTS.LOGIN, user);
922  return { type: "confirmation", user };
923};
924var handleRecoveryCallback = async (client, token) => {
925  const gotrueUser = await client.recover(token, persistSession);
926  const jwt = await gotrueUser.jwt();
927  setBrowserAuthCookies(jwt, gotrueUser.tokenDetails()?.refresh_token);
928  const user = toUser(gotrueUser);
929  startTokenRefresh();
930  clearHash();
931  emitAuthEvent(AUTH_EVENTS.RECOVERY, user);
932  return { type: "recovery", user };
933};
934var handleInviteCallback = (token) => {
935  clearHash();
936  return { type: "invite", user: null, token };
937};
938var handleEmailChangeCallback = async (client, emailChangeToken) => {
939  const currentUser2 = client.currentUser();
940  if (!currentUser2) {
941    throw new AuthError("Email change verification requires an active browser session");
942  }
943  const jwt = await currentUser2.jwt();
944  const identityUrl = `${window.location.origin}${IDENTITY_PATH}`;
945  const emailChangeRes = await fetch(`${identityUrl}/user`, {
946    method: "PUT",
947    headers: {
948      "Content-Type": "application/json",
949      Authorization: `Bearer ${jwt}`
950    },
951    body: JSON.stringify({ email_change_token: emailChangeToken })
952  });
953  if (!emailChangeRes.ok) {
954    const errorBody = await emailChangeRes.json().catch(() => ({}));
955    throw new AuthError(
956      errorBody.msg ?? `Email change verification failed (${String(emailChangeRes.status)})`,
957      emailChangeRes.status
958    );
959  }
960  const emailChangeData = await emailChangeRes.json();
961  const user = toUser(emailChangeData);
962  clearHash();
963  emitAuthEvent(AUTH_EVENTS.USER_UPDATED, user);
964  return { type: "email_change", user };
965};
966var clearHash = () => {
967  history.replaceState(null, "", window.location.pathname + window.location.search);
968};
969var hydrateSession = async () => {
970  if (!isBrowser2()) return null;
971  const client = getClient();
972  const currentUser2 = client.currentUser();
973  if (currentUser2) {
974    startTokenRefresh();
975    return toUser(currentUser2);
976  }
977  const accessToken = getCookie(NF_JWT_COOKIE);
978  if (!accessToken) return null;
979  const refreshToken = getCookie(NF_REFRESH_COOKIE) ?? "";
980  const decoded = decodeJwtPayload(accessToken);
981  const expiresAt = decoded?.exp ?? Math.floor(Date.now() / 1e3) + 3600;
982  const expiresIn = Math.max(0, expiresAt - Math.floor(Date.now() / 1e3));
983  let gotrueUser;
984  try {
985    gotrueUser = await client.createUser(
986      {
987        access_token: accessToken,
988        token_type: "bearer",
989        expires_in: expiresIn,
990        expires_at: expiresAt,
991        refresh_token: refreshToken
992      },
993      persistSession
994    );
995  } catch {
996    deleteBrowserAuthCookies();
997    return null;
998  }
999  const user = toUser(gotrueUser);
1000  startTokenRefresh();
1001  emitAuthEvent(AUTH_EVENTS.LOGIN, user);
1002  return user;
1003};
1004var toAuthProvider = (value) => typeof value === "string" && AUTH_PROVIDERS.includes(value) ? value : void 0;
1005var toOptionalString = (value) => typeof value === "string" && value !== "" ? value : void 0;
1006var toRoles = (appMeta) => {
1007  const roles = appMeta.roles;
1008  if (Array.isArray(roles) && roles.every((r) => typeof r === "string")) {
1009    return roles;
1010  }
1011  return void 0;
1012};
1013var toUser = (userData) => {
1014  const userMeta = userData.user_metadata ?? {};
1015  const appMeta = userData.app_metadata ?? {};
1016  const name2 = userMeta.full_name ?? userMeta.name;
1017  const pictureUrl = userMeta.avatar_url;
1018  return {
1019    id: userData.id,
1020    email: userData.email,
1021    confirmedAt: toOptionalString(userData.confirmed_at),
1022    createdAt: userData.created_at,
1023    updatedAt: userData.updated_at,
1024    role: toOptionalString(userData.role),
1025    provider: toAuthProvider(appMeta.provider),
1026    name: typeof name2 === "string" ? name2 : void 0,
1027    pictureUrl: typeof pictureUrl === "string" ? pictureUrl : void 0,
1028    roles: toRoles(appMeta),
1029    invitedAt: toOptionalString(userData.invited_at),
1030    confirmationSentAt: toOptionalString(userData.confirmation_sent_at),
1031    recoverySentAt: toOptionalString(userData.recovery_sent_at),
1032    pendingEmail: toOptionalString(userData.new_email),
1033    emailChangeSentAt: toOptionalString(userData.email_change_sent_at),
1034    lastSignInAt: toOptionalString(userData.last_sign_in_at),
1035    userMetadata: userMeta,
1036    appMetadata: appMeta
1037  };
1038};
1039var claimsToUser = (claims) => {
1040  const appMeta = claims.app_metadata ?? {};
1041  const userMeta = claims.user_metadata ?? {};
1042  const name2 = userMeta.full_name ?? userMeta.name;
1043  const pictureUrl = userMeta.avatar_url;
1044  return {
1045    id: claims.sub ?? "",
1046    email: claims.email,
1047    provider: toAuthProvider(appMeta.provider),
1048    name: typeof name2 === "string" ? name2 : void 0,
1049    pictureUrl: typeof pictureUrl === "string" ? pictureUrl : void 0,
1050    roles: toRoles(appMeta),
1051    userMetadata: userMeta,
1052    appMetadata: appMeta
1053  };
1054};
1055var decodeJwtPayload = (token) => {
1056  try {
1057    const parts = token.split(".");
1058    if (parts.length !== 3) return null;
1059    const payload = atob(parts[1].replace(/-/g, "+").replace(/_/g, "/"));
1060    return JSON.parse(payload);
1061  } catch {
1062    return null;
1063  }
1064};
1065var fetchFullUser = async (identityUrl, jwt) => {
1066  try {
1067    const res = await fetchWithTimeout(`${identityUrl}/user`, {
1068      headers: { Authorization: `Bearer ${jwt}` }
1069    });
1070    if (!res.ok) return null;
1071    const userData = await res.json();
1072    return toUser(userData);
1073  } catch {
1074    return null;
1075  }
1076};
1077var resolveIdentityUrl = () => {
1078  const identityContext = getIdentityContext();
1079  if (identityContext?.url) return identityContext.url;
1080  if (globalThis.Netlify?.context?.url) {
1081    return new URL(IDENTITY_PATH, globalThis.Netlify.context.url).href;
1082  }
1083  const siteUrl = typeof process !== "undefined" ? process.env?.URL : void 0;
1084  if (siteUrl) {
1085    return new URL(IDENTITY_PATH, siteUrl).href;
1086  }
1087  return null;
1088};
1089var getUser = async () => {
1090  if (isBrowser2()) {
1091    const client = getGoTrueClient();
1092    const currentUser2 = client?.currentUser() ?? null;
1093    if (currentUser2) {
1094      const jwt2 = getCookie(NF_JWT_COOKIE);
1095      if (!jwt2) {
1096        try {
1097          currentUser2.clearSession();
1098        } catch {
1099        }
1100        return null;
1101      }
1102      startTokenRefresh();
1103      return toUser(currentUser2);
1104    }
1105    const jwt = getCookie(NF_JWT_COOKIE);
1106    if (!jwt) return null;
1107    const claims2 = decodeJwtPayload(jwt);
1108    if (!claims2) return null;
1109    const hydrated = await hydrateSession();
1110    return hydrated ?? null;
1111  }
1112  triggerNextjsDynamic();
1113  const identityContext = globalThis.netlifyIdentityContext;
1114  const serverJwt = identityContext?.token ?? getServerCookie(NF_JWT_COOKIE);
1115  if (serverJwt) {
1116    const identityUrl = resolveIdentityUrl();
1117    if (identityUrl) {
1118      const fullUser = await fetchFullUser(identityUrl, serverJwt);
1119      if (fullUser) return fullUser;
1120    }
1121  }
1122  const claims = identityContext?.user ?? null;
1123  return claims ? claimsToUser(claims) : null;
1124};
1125var getSettings = async () => {
1126  const client = getClient();
1127  try {
1128    const raw = await client.settings();
1129    const external = raw.external ?? {};
1130    return {
1131      autoconfirm: raw.autoconfirm,
1132      disableSignup: raw.disable_signup,
1133      providers: {
1134        google: external.google ?? false,
1135        github: external.github ?? false,
1136        gitlab: external.gitlab ?? false,
1137        bitbucket: external.bitbucket ?? false,
1138        facebook: external.facebook ?? false,
1139        email: external.email ?? false
1140      }
1141    };
1142  } catch (err) {
1143    throw new AuthError(err instanceof Error ? err.message : "Failed to fetch identity settings", 502, { cause: err });
1144  }
1145};
1146var resolveCurrentUser = async () => {
1147  const client = getClient();
1148  let currentUser2 = client.currentUser();
1149  if (!currentUser2 && isBrowser2()) {
1150    try {
1151      await hydrateSession();
1152    } catch {
1153    }
1154    currentUser2 = client.currentUser();
1155  }
1156  if (!currentUser2) throw new AuthError("No user is currently logged in");
1157  return currentUser2;
1158};
1159var requestPasswordRecovery = async (email2) => {
1160  const client = getClient();
1161  try {
1162    await client.requestPasswordRecovery(email2);
1163  } catch (error) {
1164    throw AuthError.from(error);
1165  }
1166};
1167var acceptInvite = async (token, password2) => {
1168  const client = getClient();
1169  try {
1170    const gotrueUser = await client.acceptInvite(token, password2, persistSession);
1171    const user = toUser(gotrueUser);
1172    startTokenRefresh();
1173    emitAuthEvent(AUTH_EVENTS.LOGIN, user);
1174    return user;
1175  } catch (error) {
1176    throw AuthError.from(error);
1177  }
1178};
1179var updateUser = async (updates) => {
1180  const currentUser2 = await resolveCurrentUser();
1181  try {
1182    const updatedUser = await currentUser2.update(updates);
1183    const user = toUser(updatedUser);
1184    emitAuthEvent(AUTH_EVENTS.USER_UPDATED, user);
1185    return user;
1186  } catch (error) {
1187    throw AuthError.from(error);
1188  }
1189};
1190
1191// src/account-auth.js
1192var form = document.querySelector("[data-auth-form]");
1193var status = document.querySelector("[data-auth-status]");
1194var heading = document.querySelector("[data-auth-heading]");
1195var email = document.querySelector("#auth-email");
1196var name = document.querySelector("#auth-name");
1197var password = document.querySelector("#auth-password");
1198var submit = document.querySelector("[data-auth-submit]");
1199var tabs = document.querySelectorAll("[data-auth-mode]");
1200var oauthList = document.querySelector("[data-auth-oauth]");
1201var userPanel = document.querySelector("[data-auth-user]");
1202var userEmail = document.querySelector("[data-auth-user-email]");
1203var signOut = document.querySelector("[data-auth-logout]");
1204var recovery = document.querySelector("[data-auth-recovery]");
1205var back = document.querySelector("[data-auth-back]");
1206var signedOutOnly = document.querySelectorAll("[data-auth-signed-out]");
1207var mode = "login";
1208var inviteToken;
1209function setStatus(message, tone = "neutral") {
1210  status.textContent = message;
1211  status.dataset.tone = tone;
1212}
1213function authMessage(error, fallback) {
1214  if (error instanceof AuthError) {
1215    if (error.status === 401) return "The email or password did not match an account.";
1216    if (error.status === 403) return "This sign-in method is not enabled for this site.";
1217    if (error.status === 422) return "Check the email address and password requirements.";
1218    return error.message;
1219  }
1220  return fallback;
1221}
1222function showMode(nextMode) {
1223  mode = nextMode;
1224  form.hidden = false;
1225  userPanel.hidden = true;
1226  signedOutOnly.forEach((element) => {
1227    element.hidden = element === oauthList ? oauthList.children.length === 0 : false;
1228  });
1229  tabs.forEach((tab) => {
1230    const selected = tab.dataset.authMode === mode;
1231    tab.setAttribute("aria-selected", String(selected));
1232    tab.tabIndex = selected ? 0 : -1;
1233  });
1234  const isSignup = mode === "signup";
1235  const isRecover = mode === "recover";
1236  const isInvite = mode === "invite";
1237  const isReset = mode === "reset";
1238  heading.textContent = {
1239    login: "Sign in",
1240    signup: "Create account",
1241    recover: "Recover account",
1242    invite: "Accept invitation",
1243    reset: "Set new password"
1244  }[mode];
1245  name.closest("label").hidden = !isSignup;
1246  email.closest("label").hidden = isInvite || isReset;
1247  password.closest("label").hidden = isRecover;
1248  email.disabled = isInvite || isReset;
1249  password.disabled = isRecover;
1250  password.required = !isRecover;
1251  password.minLength = isSignup || isInvite || isReset ? 12 : 1;
1252  password.autocomplete = mode === "login" ? "current-password" : "new-password";
1253  submit.textContent = {
1254    login: "Sign in",
1255    signup: "Create account",
1256    recover: "Send recovery email",
1257    invite: "Set password",
1258    reset: "Save password"
1259  }[mode];
1260  recovery.hidden = mode !== "login";
1261  back.hidden = mode === "login" || mode === "signup";
1262  password.value = "";
1263}
1264async function showUser(user) {
1265  form.hidden = true;
1266  userPanel.hidden = false;
1267  signedOutOnly.forEach((element) => {
1268    element.hidden = true;
1269  });
1270  userEmail.textContent = user.email ?? "Signed-in user";
1271  try {
1272    const response = await fetch("/api/auth/user", { cache: "no-store", credentials: "same-origin" });
1273    if (response.ok) {
1274      setStatus("You are signed in. The server can also verify your Identity session.", "success");
1275    } else {
1276      setStatus("You are signed in, but the server could not verify the session yet.", "warning");
1277    }
1278  } catch {
1279    setStatus("You are signed in. Server verification is unavailable from this page load.", "warning");
1280  }
1281}
1282function showOAuthButtons(settings) {
1283  const providers = ["google", "github", "gitlab", "bitbucket", "facebook"];
1284  oauthList.replaceChildren();
1285  providers.forEach((provider) => {
1286    if (!settings.providers?.[provider]) return;
1287    const button = document.createElement("button");
1288    button.type = "button";
1289    button.textContent = `Continue with ${provider[0].toUpperCase()}${provider.slice(1)}`;
1290    button.addEventListener("click", () => oauthLogin(provider));
1291    oauthList.append(button);
1292  });
1293  oauthList.hidden = oauthList.children.length === 0;
1294}
1295async function refresh() {
1296  const user = await getUser();
1297  if (user) await showUser(user);
1298}
1299tabs.forEach((tab) => {
1300  tab.addEventListener("click", () => {
1301    showMode(tab.dataset.authMode);
1302    setStatus(mode === "signup" ? "Create an account with email and password." : "Sign in with email and password.");
1303  });
1304});
1305recovery.addEventListener("click", () => {
1306  showMode("recover");
1307  setStatus("Enter the email address on your account.");
1308  email.focus();
1309});
1310back.addEventListener("click", () => {
1311  showMode("login");
1312  setStatus("Sign in with email and password.");
1313});
1314signOut.addEventListener("click", async () => {
1315  signOut.disabled = true;
1316  try {
1317    await logout();
1318    showMode("login");
1319    setStatus("Signed out.", "success");
1320  } catch (error) {
1321    setStatus(authMessage(error, "Sign-out failed. Try again."), "error");
1322  } finally {
1323    signOut.disabled = false;
1324  }
1325});
1326form.addEventListener("submit", async (event) => {
1327  event.preventDefault();
1328  submit.disabled = true;
1329  try {
1330    if (mode === "login") {
1331      await login(email.value.trim(), password.value);
1332      await refresh();
1333    } else if (mode === "signup") {
1334      const user = await signup(email.value.trim(), password.value, { full_name: name.value.trim() });
1335      if (user.emailVerified) await showUser(user);
1336      else setStatus("Account created. Check your email to confirm it before signing in.", "success");
1337    } else if (mode === "recover") {
1338      await requestPasswordRecovery(email.value.trim());
1339      setStatus("If that address has an account, a recovery email is on its way.", "success");
1340      showMode("login");
1341    } else if (mode === "invite") {
1342      await acceptInvite(inviteToken, password.value);
1343      inviteToken = void 0;
1344      await refresh();
1345    } else if (mode === "reset") {
1346      await updateUser({ password: password.value });
1347      await refresh();
1348    }
1349  } catch (error) {
1350    setStatus(authMessage(error, "Authentication failed. Check the form and try again."), "error");
1351  } finally {
1352    password.value = "";
1353    submit.disabled = false;
1354  }
1355});
1356onAuthChange((_event, user) => {
1357  if (user) showUser(user);
1358});
1359async function start() {
1360  try {
1361    const callback = await handleAuthCallback();
1362    const settings = await getSettings();
1363    showOAuthButtons(settings);
1364    if (callback?.type === "invite") {
1365      inviteToken = callback.token;
1366      showMode("invite");
1367      setStatus("Choose a password with at least 12 characters.");
1368      return;
1369    }
1370    if (callback?.type === "recovery") {
1371      showMode("reset");
1372      setStatus("Choose a new password with at least 12 characters.");
1373      return;
1374    }
1375    if (callback?.type === "confirmation") {
1376      setStatus("Email confirmed. You are signed in.", "success");
1377    } else if (callback?.type === "oauth") {
1378      setStatus("OAuth sign-in complete.", "success");
1379    } else if (callback?.type === "email_change") {
1380      setStatus("Email address updated.", "success");
1381    }
1382    const user = await getUser();
1383    if (user) await showUser(user);
1384    else if (settings.providers?.email) showMode("login");
1385    else {
1386      form.hidden = true;
1387      setStatus("Email sign-in is disabled. Enable an OAuth provider in Netlify Identity.", "warning");
1388    }
1389    if (settings.disableSignup) {
1390      document.querySelector("[data-auth-mode='signup']").hidden = true;
1391    }
1392  } catch (error) {
1393    setStatus(authMessage(error, "Identity is not configured for this deploy yet."), "error");
1394    form.hidden = true;
1395  }
1396}
1397start();

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.