@dbx-tools/tunnel 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.
@@ -117,6 +117,13 @@ export function loginPageHtml(options) {
117
117
  return { ok: res.ok, status: res.status, data: data };
118
118
  }
119
119
 
120
+ function errorText(data, fallback) {
121
+ // better-auth error shape: { message } or { error: { message } }.
122
+ if (data && data.error && data.error.message) return data.error.message;
123
+ if (data && data.message) return data.message;
124
+ return fallback;
125
+ }
126
+
120
127
  emailForm.addEventListener("submit", async function (e) {
121
128
  e.preventDefault();
122
129
  email = emailInput.value.trim();
@@ -125,14 +132,15 @@ export function loginPageHtml(options) {
125
132
  submit.disabled = true;
126
133
  say("Sending…");
127
134
  try {
128
- var r = await post("/request", { email: email });
129
- if (r.ok && r.data.ok) {
135
+ // better-auth emailOTP native endpoint.
136
+ var r = await post("/email-otp/send-verification-otp", { email: email, type: "sign-in" });
137
+ if (r.ok) {
130
138
  emailForm.classList.add("hidden");
131
139
  codeForm.classList.remove("hidden");
132
140
  codeInput.focus();
133
141
  say("We emailed a code to " + email + ".");
134
142
  } else {
135
- say(r.data.error || "Could not send a code. Check the address and try again.", true);
143
+ say(errorText(r.data, "Could not send a code. Check the address and try again."), true);
136
144
  }
137
145
  } catch (_e) {
138
146
  say("Network error. Try again.", true);
@@ -149,14 +157,19 @@ export function loginPageHtml(options) {
149
157
  submit.disabled = true;
150
158
  say("Verifying…");
151
159
  try {
152
- var r = await post("/verify", { email: email, code: code });
153
- if (r.ok && r.data.ok) {
160
+ // better-auth sign-in with the OTP; sets the session cookie on success.
161
+ var r = await post("/sign-in/email-otp", {
162
+ email: email,
163
+ otp: code,
164
+ name: email.split("@")[0],
165
+ });
166
+ if (r.ok) {
154
167
  say("Signed in. Loading…");
155
168
  // The session cookie is set; reload so the now-authenticated request
156
169
  // reaches the app.
157
170
  window.location.reload();
158
171
  } else {
159
- say(r.data.error || "That code was not accepted. Try again.", true);
172
+ say(errorText(r.data, "That code was not accepted. Try again."), true);
160
173
  submit.disabled = false;
161
174
  }
162
175
  } catch (_e) {
@@ -187,4 +200,4 @@ const HTML_ESCAPES = {
187
200
  function escapeHtml(value) {
188
201
  return value.replace(/[&<>"']/g, (ch) => HTML_ESCAPES[ch] ?? ch);
189
202
  }
190
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naW4tcGFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sb2dpbi1wYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBRUgsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQU94QyxxRkFBcUY7QUFDckYsTUFBTSxVQUFVLGFBQWEsQ0FBQyxPQUF5QjtJQUNyRCxNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzVDLDZFQUE2RTtJQUM3RSwwREFBMEQ7SUFDMUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUMzQyxPQUFPOzs7OzttQkFLVSxLQUFLOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7cUJBNkNILEtBQUs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztpQkFxQlQsTUFBTTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O1FBb0ZmLENBQUM7QUFDVCxDQUFDO0FBRUQsTUFBTSxZQUFZLEdBQTJCO0lBQzNDLEdBQUcsRUFBRSxPQUFPO0lBQ1osR0FBRyxFQUFFLE1BQU07SUFDWCxHQUFHLEVBQUUsTUFBTTtJQUNYLEdBQUcsRUFBRSxRQUFRO0lBQ2IsR0FBRyxFQUFFLE9BQU87Q0FDYixDQUFDO0FBRUYsU0FBUyxVQUFVLENBQUMsS0FBYTtJQUMvQixPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7QUFDbkUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQSBzZWxmLWNvbnRhaW5lZCBIVE1MIGxvZ2luIHBhZ2UgdGhlIHR1bm5lbCBzZXJ2ZXMgaW4gZnJvbnQgb2YgYW4gYXBwIHRoYXRcbiAqIGRvZXMgbm90IGVtYmVkIHRoZSBgPEF1dGhHYXRlPmAgUmVhY3QgY29tcG9uZW50IChlLmcuIGEgV2ViU29ja2V0IGFwcCBmcm9udGVkXG4gKiBieSB0aGUgQ0xJIHByb3h5KS5cbiAqXG4gKiBJdCBzcGVha3MgdGhlIHNhbWUgY29tcGF0aWJpbGl0eSBlbmRwb2ludHMgdW5kZXIge0BsaW5rIEFVVEhfUFJFRklYfSB0aGF0IHRoZVxuICogUmVhY3QgY2xpZW50IHVzZXMg4oCUIGBQT1NUIC9yZXF1ZXN0YCB0byBlbWFpbCBhIGNvZGUsIGBQT1NUIC92ZXJpZnlgIHRvXG4gKiBleGNoYW5nZSBpdCBmb3IgdGhlIGBkYngtdG9vbHMtYXV0aGAgc2Vzc2lvbiBjb29raWUg4oCUIHdpdGggcGxhaW4gYGZldGNoYCwgbm9cbiAqIGJ1aWxkIHN0ZXAgYW5kIG5vIGRlcGVuZGVuY3kuIFBhc3NrZXlzIGFyZSBpbnRlbnRpb25hbGx5IG9taXR0ZWQ6IHRoZSBXZWJBdXRoblxuICogY2VyZW1vbnkgbmVlZHMgdGhlIGJldHRlci1hdXRoIGNsaWVudCBsaWJyYXJ5LCBzbyBwYXNza2V5IGVucm9sbG1lbnQgaGFwcGVuc1xuICogaW5zaWRlIHRoZSBhcHAgYWZ0ZXIgdGhpcyBlbWFpbC1PVFAgc2lnbi1pbi4gT24gc3VjY2VzcyB0aGUgcGFnZSByZWxvYWRzLCBhbmRcbiAqIHRoZSBub3ctYXV0aGVudGljYXRlZCByZXF1ZXN0IHJlYWNoZXMgdGhlIGFwcC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgQVVUSF9QUkVGSVggfSBmcm9tIFwiLi9nYXRlLnRzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9naW5QYWdlT3B0aW9ucyB7XG4gIC8qKiBQcm9kdWN0L2JyYW5kIG5hbWUgc2hvd24gaW4gdGhlIGhlYWRpbmcuICovXG4gIGJyYW5kTmFtZTogc3RyaW5nO1xufVxuXG4vKiogVGhlIGxvZ2luIHBhZ2UgSFRNTCBmb3IgYSBgdGV4dC9odG1sYCByZXF1ZXN0IHRvIGEgZ2F0ZWQgcGF0aCB3aXRoIG5vIHNlc3Npb24uICovXG5leHBvcnQgZnVuY3Rpb24gbG9naW5QYWdlSHRtbChvcHRpb25zOiBMb2dpblBhZ2VPcHRpb25zKTogc3RyaW5nIHtcbiAgY29uc3QgYnJhbmQgPSBlc2NhcGVIdG1sKG9wdGlvbnMuYnJhbmROYW1lKTtcbiAgLy8gQVVUSF9QUkVGSVggaXMgYSBmaXhlZCBjb25zdGFudCwgbm90IHVzZXIgaW5wdXQsIGJ1dCBKU09OLWVuY29kZSBpdCBzbyB0aGVcbiAgLy8gaW5saW5lZCBzY3JpcHQgaXMgYWx3YXlzIHZhbGlkIHJlZ2FyZGxlc3Mgb2YgaXRzIHZhbHVlLlxuICBjb25zdCBwcmVmaXggPSBKU09OLnN0cmluZ2lmeShBVVRIX1BSRUZJWCk7XG4gIHJldHVybiBgPCFkb2N0eXBlIGh0bWw+XG48aHRtbCBsYW5nPVwiZW5cIj5cbjxoZWFkPlxuPG1ldGEgY2hhcnNldD1cInV0Zi04XCI+XG48bWV0YSBuYW1lPVwidmlld3BvcnRcIiBjb250ZW50PVwid2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTFcIj5cbjx0aXRsZT5TaWduIGluIOKAlCAke2JyYW5kfTwvdGl0bGU+XG48c3R5bGU+XG4gIDpyb290IHtcbiAgICBjb2xvci1zY2hlbWU6IGxpZ2h0IGRhcms7XG4gICAgLS1iZzogI2ZmZmZmZjsgLS1mZzogIzFiMWIxZjsgLS1tdXRlZDogIzZiNzI4MDsgLS1ib3JkZXI6ICNkOWRjZTE7XG4gICAgLS1hY2NlbnQ6ICMxYTczZTg7IC0tYWNjZW50LWZnOiAjZmZmZmZmOyAtLWVycm9yOiAjYzUyMjFmOyAtLWZpZWxkOiAjZmZmZmZmO1xuICB9XG4gIEBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspIHtcbiAgICA6cm9vdCB7XG4gICAgICAtLWJnOiAjMTYxODFkOyAtLWZnOiAjZThlNmRmOyAtLW11dGVkOiAjOWFhMGFhOyAtLWJvcmRlcjogIzJjMmYzNjtcbiAgICAgIC0tYWNjZW50OiAjNGM4ZGZmOyAtLWFjY2VudC1mZzogIzBiMGYxOTsgLS1lcnJvcjogI2ZmNmI2MDsgLS1maWVsZDogIzFlMjEyODtcbiAgICB9XG4gIH1cbiAgKiB7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IH1cbiAgYm9keSB7XG4gICAgbWFyZ2luOiAwOyBtaW4taGVpZ2h0OiAxMDB2aDsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBjb2xvcjogdmFyKC0tZmcpO1xuICAgIGZvbnQtZmFtaWx5OiBzeXN0ZW0tdWksIC1hcHBsZS1zeXN0ZW0sIFwiU2Vnb2UgVUlcIiwgc2Fucy1zZXJpZjsgcGFkZGluZzogMjRweDtcbiAgfVxuICAuY2FyZCB7XG4gICAgd2lkdGg6IDEwMCU7IG1heC13aWR0aDogMzYwcHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XG4gICAgYm9yZGVyLXJhZGl1czogMTRweDsgcGFkZGluZzogMjhweDsgYmFja2dyb3VuZDogdmFyKC0tYmcpO1xuICB9XG4gIGgxIHsgZm9udC1zaXplOiAxOHB4OyBtYXJnaW46IDAgMCA0cHg7IH1cbiAgcC5zdWIgeyBtYXJnaW46IDAgMCAyMHB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBmb250LXNpemU6IDEzcHg7IH1cbiAgbGFiZWwgeyBkaXNwbGF5OiBibG9jazsgZm9udC1zaXplOiAxMnB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW46IDAgMCA2cHg7IH1cbiAgaW5wdXQge1xuICAgIHdpZHRoOiAxMDAlOyBwYWRkaW5nOiAxMHB4IDEycHg7IGZvbnQtc2l6ZTogMTVweDsgYm9yZGVyLXJhZGl1czogOXB4O1xuICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJhY2tncm91bmQ6IHZhcigtLWZpZWxkKTsgY29sb3I6IHZhcigtLWZnKTtcbiAgfVxuICBpbnB1dDpmb2N1cyB7IG91dGxpbmU6IDJweCBzb2xpZCB2YXIoLS1hY2NlbnQpOyBvdXRsaW5lLW9mZnNldDogLTFweDsgfVxuICBidXR0b24ge1xuICAgIHdpZHRoOiAxMDAlOyBtYXJnaW4tdG9wOiAxNnB4OyBwYWRkaW5nOiAxMHB4IDEycHg7IGZvbnQtc2l6ZTogMTVweDtcbiAgICBmb250LXdlaWdodDogNjAwOyBib3JkZXI6IDA7IGJvcmRlci1yYWRpdXM6IDlweDsgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50KTtcbiAgICBjb2xvcjogdmFyKC0tYWNjZW50LWZnKTsgY3Vyc29yOiBwb2ludGVyO1xuICB9XG4gIGJ1dHRvbjpkaXNhYmxlZCB7IG9wYWNpdHk6IDAuNjsgY3Vyc29yOiBkZWZhdWx0OyB9XG4gIC5tc2cgeyBtYXJnaW4tdG9wOiAxNHB4OyBmb250LXNpemU6IDEzcHg7IG1pbi1oZWlnaHQ6IDE4cHg7IH1cbiAgLm1zZy5lcnJvciB7IGNvbG9yOiB2YXIoLS1lcnJvcik7IH1cbiAgLmhpZGRlbiB7IGRpc3BsYXk6IG5vbmU7IH1cbiAgLmJhY2sgeyBiYWNrZ3JvdW5kOiBub25lOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBmb250LXdlaWdodDogNDAwOyBtYXJnaW4tdG9wOiA4cHg7IH1cbjwvc3R5bGU+XG48L2hlYWQ+XG48Ym9keT5cbiAgPG1haW4gY2xhc3M9XCJjYXJkXCI+XG4gICAgPGgxPlNpZ24gaW4gdG8gJHticmFuZH08L2gxPlxuICAgIDxwIGNsYXNzPVwic3ViXCI+RW50ZXIgeW91ciBlbWFpbCB0byByZWNlaXZlIGEgb25lLXRpbWUgY29kZS48L3A+XG5cbiAgICA8Zm9ybSBpZD1cImVtYWlsLWZvcm1cIj5cbiAgICAgIDxsYWJlbCBmb3I9XCJlbWFpbFwiPkVtYWlsPC9sYWJlbD5cbiAgICAgIDxpbnB1dCBpZD1cImVtYWlsXCIgbmFtZT1cImVtYWlsXCIgdHlwZT1cImVtYWlsXCIgYXV0b2NvbXBsZXRlPVwiZW1haWxcIiByZXF1aXJlZCBhdXRvZm9jdXM+XG4gICAgICA8YnV0dG9uIGlkPVwiZW1haWwtc3VibWl0XCIgdHlwZT1cInN1Ym1pdFwiPlNlbmQgY29kZTwvYnV0dG9uPlxuICAgIDwvZm9ybT5cblxuICAgIDxmb3JtIGlkPVwiY29kZS1mb3JtXCIgY2xhc3M9XCJoaWRkZW5cIj5cbiAgICAgIDxsYWJlbCBmb3I9XCJjb2RlXCI+VmVyaWZpY2F0aW9uIGNvZGU8L2xhYmVsPlxuICAgICAgPGlucHV0IGlkPVwiY29kZVwiIG5hbWU9XCJjb2RlXCIgaW5wdXRtb2RlPVwibnVtZXJpY1wiIGF1dG9jb21wbGV0ZT1cIm9uZS10aW1lLWNvZGVcIiByZXF1aXJlZD5cbiAgICAgIDxidXR0b24gaWQ9XCJjb2RlLXN1Ym1pdFwiIHR5cGU9XCJzdWJtaXRcIj5WZXJpZnk8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gaWQ9XCJiYWNrXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYmFja1wiPlVzZSBhIGRpZmZlcmVudCBlbWFpbDwvYnV0dG9uPlxuICAgIDwvZm9ybT5cblxuICAgIDxkaXYgaWQ9XCJtc2dcIiBjbGFzcz1cIm1zZ1wiIHJvbGU9XCJzdGF0dXNcIiBhcmlhLWxpdmU9XCJwb2xpdGVcIj48L2Rpdj5cbiAgPC9tYWluPlxuXG48c2NyaXB0PlxuKGZ1bmN0aW9uICgpIHtcbiAgdmFyIFBSRUZJWCA9ICR7cHJlZml4fTtcbiAgdmFyIGVtYWlsRm9ybSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiZW1haWwtZm9ybVwiKTtcbiAgdmFyIGNvZGVGb3JtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJjb2RlLWZvcm1cIik7XG4gIHZhciBlbWFpbElucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJlbWFpbFwiKTtcbiAgdmFyIGNvZGVJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiY29kZVwiKTtcbiAgdmFyIGJhY2sgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImJhY2tcIik7XG4gIHZhciBtc2cgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIm1zZ1wiKTtcbiAgdmFyIGVtYWlsID0gXCJcIjtcblxuICBmdW5jdGlvbiBzYXkodGV4dCwgaXNFcnJvcikge1xuICAgIG1zZy50ZXh0Q29udGVudCA9IHRleHQgfHwgXCJcIjtcbiAgICBtc2cuY2xhc3NOYW1lID0gXCJtc2dcIiArIChpc0Vycm9yID8gXCIgZXJyb3JcIiA6IFwiXCIpO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gcG9zdChwYXRoLCBib2R5KSB7XG4gICAgdmFyIHJlcyA9IGF3YWl0IGZldGNoKFBSRUZJWCArIHBhdGgsIHtcbiAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICBjcmVkZW50aWFsczogXCJpbmNsdWRlXCIsXG4gICAgICBoZWFkZXJzOiB7IFwiY29udGVudC10eXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSxcbiAgICB9KTtcbiAgICB2YXIgZGF0YSA9IHt9O1xuICAgIHRyeSB7IGRhdGEgPSBhd2FpdCByZXMuanNvbigpOyB9IGNhdGNoIChfZSkgeyAvKiBub24tSlNPTiAqLyB9XG4gICAgcmV0dXJuIHsgb2s6IHJlcy5vaywgc3RhdHVzOiByZXMuc3RhdHVzLCBkYXRhOiBkYXRhIH07XG4gIH1cblxuICBlbWFpbEZvcm0uYWRkRXZlbnRMaXN0ZW5lcihcInN1Ym1pdFwiLCBhc3luYyBmdW5jdGlvbiAoZSkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBlbWFpbCA9IGVtYWlsSW5wdXQudmFsdWUudHJpbSgpO1xuICAgIGlmICghZW1haWwpIHJldHVybjtcbiAgICB2YXIgc3VibWl0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJlbWFpbC1zdWJtaXRcIik7XG4gICAgc3VibWl0LmRpc2FibGVkID0gdHJ1ZTtcbiAgICBzYXkoXCJTZW5kaW5n4oCmXCIpO1xuICAgIHRyeSB7XG4gICAgICB2YXIgciA9IGF3YWl0IHBvc3QoXCIvcmVxdWVzdFwiLCB7IGVtYWlsOiBlbWFpbCB9KTtcbiAgICAgIGlmIChyLm9rICYmIHIuZGF0YS5vaykge1xuICAgICAgICBlbWFpbEZvcm0uY2xhc3NMaXN0LmFkZChcImhpZGRlblwiKTtcbiAgICAgICAgY29kZUZvcm0uY2xhc3NMaXN0LnJlbW92ZShcImhpZGRlblwiKTtcbiAgICAgICAgY29kZUlucHV0LmZvY3VzKCk7XG4gICAgICAgIHNheShcIldlIGVtYWlsZWQgYSBjb2RlIHRvIFwiICsgZW1haWwgKyBcIi5cIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzYXkoci5kYXRhLmVycm9yIHx8IFwiQ291bGQgbm90IHNlbmQgYSBjb2RlLiBDaGVjayB0aGUgYWRkcmVzcyBhbmQgdHJ5IGFnYWluLlwiLCB0cnVlKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChfZSkge1xuICAgICAgc2F5KFwiTmV0d29yayBlcnJvci4gVHJ5IGFnYWluLlwiLCB0cnVlKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc3VibWl0LmRpc2FibGVkID0gZmFsc2U7XG4gICAgfVxuICB9KTtcblxuICBjb2RlRm9ybS5hZGRFdmVudExpc3RlbmVyKFwic3VibWl0XCIsIGFzeW5jIGZ1bmN0aW9uIChlKSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHZhciBjb2RlID0gY29kZUlucHV0LnZhbHVlLnRyaW0oKTtcbiAgICBpZiAoIWNvZGUpIHJldHVybjtcbiAgICB2YXIgc3VibWl0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJjb2RlLXN1Ym1pdFwiKTtcbiAgICBzdWJtaXQuZGlzYWJsZWQgPSB0cnVlO1xuICAgIHNheShcIlZlcmlmeWluZ+KAplwiKTtcbiAgICB0cnkge1xuICAgICAgdmFyIHIgPSBhd2FpdCBwb3N0KFwiL3ZlcmlmeVwiLCB7IGVtYWlsOiBlbWFpbCwgY29kZTogY29kZSB9KTtcbiAgICAgIGlmIChyLm9rICYmIHIuZGF0YS5vaykge1xuICAgICAgICBzYXkoXCJTaWduZWQgaW4uIExvYWRpbmfigKZcIik7XG4gICAgICAgIC8vIFRoZSBzZXNzaW9uIGNvb2tpZSBpcyBzZXQ7IHJlbG9hZCBzbyB0aGUgbm93LWF1dGhlbnRpY2F0ZWQgcmVxdWVzdFxuICAgICAgICAvLyByZWFjaGVzIHRoZSBhcHAuXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNheShyLmRhdGEuZXJyb3IgfHwgXCJUaGF0IGNvZGUgd2FzIG5vdCBhY2NlcHRlZC4gVHJ5IGFnYWluLlwiLCB0cnVlKTtcbiAgICAgICAgc3VibWl0LmRpc2FibGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoX2UpIHtcbiAgICAgIHNheShcIk5ldHdvcmsgZXJyb3IuIFRyeSBhZ2Fpbi5cIiwgdHJ1ZSk7XG4gICAgICBzdWJtaXQuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICB9XG4gIH0pO1xuXG4gIGJhY2suYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uICgpIHtcbiAgICBjb2RlRm9ybS5jbGFzc0xpc3QuYWRkKFwiaGlkZGVuXCIpO1xuICAgIGVtYWlsRm9ybS5jbGFzc0xpc3QucmVtb3ZlKFwiaGlkZGVuXCIpO1xuICAgIGNvZGVJbnB1dC52YWx1ZSA9IFwiXCI7XG4gICAgc2F5KFwiXCIpO1xuICAgIGVtYWlsSW5wdXQuZm9jdXMoKTtcbiAgfSk7XG59KSgpO1xuPC9zY3JpcHQ+XG48L2JvZHk+XG48L2h0bWw+YDtcbn1cblxuY29uc3QgSFRNTF9FU0NBUEVTOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICBcIiZcIjogXCImYW1wO1wiLFxuICBcIjxcIjogXCImbHQ7XCIsXG4gIFwiPlwiOiBcIiZndDtcIixcbiAgJ1wiJzogXCImcXVvdDtcIixcbiAgXCInXCI6IFwiJiMzOTtcIixcbn07XG5cbmZ1bmN0aW9uIGVzY2FwZUh0bWwodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB2YWx1ZS5yZXBsYWNlKC9bJjw+XCInXS9nLCAoY2gpID0+IEhUTUxfRVNDQVBFU1tjaF0gPz8gY2gpO1xufVxuIl19
203
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naW4tcGFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sb2dpbi1wYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBRUgsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQU94QyxxRkFBcUY7QUFDckYsTUFBTSxVQUFVLGFBQWEsQ0FBQyxPQUF5QjtJQUNyRCxNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzVDLDZFQUE2RTtJQUM3RSwwREFBMEQ7SUFDMUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUMzQyxPQUFPOzs7OzttQkFLVSxLQUFLOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7cUJBNkNILEtBQUs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztpQkFxQlQsTUFBTTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztRQWlHZixDQUFDO0FBQ1QsQ0FBQztBQUVELE1BQU0sWUFBWSxHQUEyQjtJQUMzQyxHQUFHLEVBQUUsT0FBTztJQUNaLEdBQUcsRUFBRSxNQUFNO0lBQ1gsR0FBRyxFQUFFLE1BQU07SUFDWCxHQUFHLEVBQUUsUUFBUTtJQUNiLEdBQUcsRUFBRSxPQUFPO0NBQ2IsQ0FBQztBQUVGLFNBQVMsVUFBVSxDQUFDLEtBQWE7SUFDL0IsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQ25FLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEEgc2VsZi1jb250YWluZWQgSFRNTCBsb2dpbiBwYWdlIHRoZSB0dW5uZWwgc2VydmVzIGluIGZyb250IG9mIGFuIGFwcCB0aGF0XG4gKiBkb2VzIG5vdCBlbWJlZCB0aGUgYDxBdXRoR2F0ZT5gIFJlYWN0IGNvbXBvbmVudCAoZS5nLiBhIFdlYlNvY2tldCBhcHAgZnJvbnRlZFxuICogYnkgdGhlIENMSSBwcm94eSkuXG4gKlxuICogSXQgc3BlYWtzIHRoZSBzYW1lIGNvbXBhdGliaWxpdHkgZW5kcG9pbnRzIHVuZGVyIHtAbGluayBBVVRIX1BSRUZJWH0gdGhhdCB0aGVcbiAqIFJlYWN0IGNsaWVudCB1c2VzIOKAlCBgUE9TVCAvcmVxdWVzdGAgdG8gZW1haWwgYSBjb2RlLCBgUE9TVCAvdmVyaWZ5YCB0b1xuICogZXhjaGFuZ2UgaXQgZm9yIHRoZSBgZGJ4LXRvb2xzLWF1dGhgIHNlc3Npb24gY29va2llIOKAlCB3aXRoIHBsYWluIGBmZXRjaGAsIG5vXG4gKiBidWlsZCBzdGVwIGFuZCBubyBkZXBlbmRlbmN5LiBQYXNza2V5cyBhcmUgaW50ZW50aW9uYWxseSBvbWl0dGVkOiB0aGUgV2ViQXV0aG5cbiAqIGNlcmVtb255IG5lZWRzIHRoZSBiZXR0ZXItYXV0aCBjbGllbnQgbGlicmFyeSwgc28gcGFzc2tleSBlbnJvbGxtZW50IGhhcHBlbnNcbiAqIGluc2lkZSB0aGUgYXBwIGFmdGVyIHRoaXMgZW1haWwtT1RQIHNpZ24taW4uIE9uIHN1Y2Nlc3MgdGhlIHBhZ2UgcmVsb2FkcywgYW5kXG4gKiB0aGUgbm93LWF1dGhlbnRpY2F0ZWQgcmVxdWVzdCByZWFjaGVzIHRoZSBhcHAuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IEFVVEhfUFJFRklYIH0gZnJvbSBcIi4vZ2F0ZS50c1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIExvZ2luUGFnZU9wdGlvbnMge1xuICAvKiogUHJvZHVjdC9icmFuZCBuYW1lIHNob3duIGluIHRoZSBoZWFkaW5nLiAqL1xuICBicmFuZE5hbWU6IHN0cmluZztcbn1cblxuLyoqIFRoZSBsb2dpbiBwYWdlIEhUTUwgZm9yIGEgYHRleHQvaHRtbGAgcmVxdWVzdCB0byBhIGdhdGVkIHBhdGggd2l0aCBubyBzZXNzaW9uLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvZ2luUGFnZUh0bWwob3B0aW9uczogTG9naW5QYWdlT3B0aW9ucyk6IHN0cmluZyB7XG4gIGNvbnN0IGJyYW5kID0gZXNjYXBlSHRtbChvcHRpb25zLmJyYW5kTmFtZSk7XG4gIC8vIEFVVEhfUFJFRklYIGlzIGEgZml4ZWQgY29uc3RhbnQsIG5vdCB1c2VyIGlucHV0LCBidXQgSlNPTi1lbmNvZGUgaXQgc28gdGhlXG4gIC8vIGlubGluZWQgc2NyaXB0IGlzIGFsd2F5cyB2YWxpZCByZWdhcmRsZXNzIG9mIGl0cyB2YWx1ZS5cbiAgY29uc3QgcHJlZml4ID0gSlNPTi5zdHJpbmdpZnkoQVVUSF9QUkVGSVgpO1xuICByZXR1cm4gYDwhZG9jdHlwZSBodG1sPlxuPGh0bWwgbGFuZz1cImVuXCI+XG48aGVhZD5cbjxtZXRhIGNoYXJzZXQ9XCJ1dGYtOFwiPlxuPG1ldGEgbmFtZT1cInZpZXdwb3J0XCIgY29udGVudD1cIndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xXCI+XG48dGl0bGU+U2lnbiBpbiDigJQgJHticmFuZH08L3RpdGxlPlxuPHN0eWxlPlxuICA6cm9vdCB7XG4gICAgY29sb3Itc2NoZW1lOiBsaWdodCBkYXJrO1xuICAgIC0tYmc6ICNmZmZmZmY7IC0tZmc6ICMxYjFiMWY7IC0tbXV0ZWQ6ICM2YjcyODA7IC0tYm9yZGVyOiAjZDlkY2UxO1xuICAgIC0tYWNjZW50OiAjMWE3M2U4OyAtLWFjY2VudC1mZzogI2ZmZmZmZjsgLS1lcnJvcjogI2M1MjIxZjsgLS1maWVsZDogI2ZmZmZmZjtcbiAgfVxuICBAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSB7XG4gICAgOnJvb3Qge1xuICAgICAgLS1iZzogIzE2MTgxZDsgLS1mZzogI2U4ZTZkZjsgLS1tdXRlZDogIzlhYTBhYTsgLS1ib3JkZXI6ICMyYzJmMzY7XG4gICAgICAtLWFjY2VudDogIzRjOGRmZjsgLS1hY2NlbnQtZmc6ICMwYjBmMTk7IC0tZXJyb3I6ICNmZjZiNjA7IC0tZmllbGQ6ICMxZTIxMjg7XG4gICAgfVxuICB9XG4gICogeyBib3gtc2l6aW5nOiBib3JkZXItYm94OyB9XG4gIGJvZHkge1xuICAgIG1hcmdpbjogMDsgbWluLWhlaWdodDogMTAwdmg7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgY29sb3I6IHZhcigtLWZnKTtcbiAgICBmb250LWZhbWlseTogc3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBcIlNlZ29lIFVJXCIsIHNhbnMtc2VyaWY7IHBhZGRpbmc6IDI0cHg7XG4gIH1cbiAgLmNhcmQge1xuICAgIHdpZHRoOiAxMDAlOyBtYXgtd2lkdGg6IDM2MHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1xuICAgIGJvcmRlci1yYWRpdXM6IDE0cHg7IHBhZGRpbmc6IDI4cHg7IGJhY2tncm91bmQ6IHZhcigtLWJnKTtcbiAgfVxuICBoMSB7IGZvbnQtc2l6ZTogMThweDsgbWFyZ2luOiAwIDAgNHB4OyB9XG4gIHAuc3ViIHsgbWFyZ2luOiAwIDAgMjBweDsgY29sb3I6IHZhcigtLW11dGVkKTsgZm9udC1zaXplOiAxM3B4OyB9XG4gIGxhYmVsIHsgZGlzcGxheTogYmxvY2s7IGZvbnQtc2l6ZTogMTJweDsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luOiAwIDAgNnB4OyB9XG4gIGlucHV0IHtcbiAgICB3aWR0aDogMTAwJTsgcGFkZGluZzogMTBweCAxMnB4OyBmb250LXNpemU6IDE1cHg7IGJvcmRlci1yYWRpdXM6IDlweDtcbiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBiYWNrZ3JvdW5kOiB2YXIoLS1maWVsZCk7IGNvbG9yOiB2YXIoLS1mZyk7XG4gIH1cbiAgaW5wdXQ6Zm9jdXMgeyBvdXRsaW5lOiAycHggc29saWQgdmFyKC0tYWNjZW50KTsgb3V0bGluZS1vZmZzZXQ6IC0xcHg7IH1cbiAgYnV0dG9uIHtcbiAgICB3aWR0aDogMTAwJTsgbWFyZ2luLXRvcDogMTZweDsgcGFkZGluZzogMTBweCAxMnB4OyBmb250LXNpemU6IDE1cHg7XG4gICAgZm9udC13ZWlnaHQ6IDYwMDsgYm9yZGVyOiAwOyBib3JkZXItcmFkaXVzOiA5cHg7IGJhY2tncm91bmQ6IHZhcigtLWFjY2VudCk7XG4gICAgY29sb3I6IHZhcigtLWFjY2VudC1mZyk7IGN1cnNvcjogcG9pbnRlcjtcbiAgfVxuICBidXR0b246ZGlzYWJsZWQgeyBvcGFjaXR5OiAwLjY7IGN1cnNvcjogZGVmYXVsdDsgfVxuICAubXNnIHsgbWFyZ2luLXRvcDogMTRweDsgZm9udC1zaXplOiAxM3B4OyBtaW4taGVpZ2h0OiAxOHB4OyB9XG4gIC5tc2cuZXJyb3IgeyBjb2xvcjogdmFyKC0tZXJyb3IpOyB9XG4gIC5oaWRkZW4geyBkaXNwbGF5OiBub25lOyB9XG4gIC5iYWNrIHsgYmFja2dyb3VuZDogbm9uZTsgY29sb3I6IHZhcigtLW11dGVkKTsgZm9udC13ZWlnaHQ6IDQwMDsgbWFyZ2luLXRvcDogOHB4OyB9XG48L3N0eWxlPlxuPC9oZWFkPlxuPGJvZHk+XG4gIDxtYWluIGNsYXNzPVwiY2FyZFwiPlxuICAgIDxoMT5TaWduIGluIHRvICR7YnJhbmR9PC9oMT5cbiAgICA8cCBjbGFzcz1cInN1YlwiPkVudGVyIHlvdXIgZW1haWwgdG8gcmVjZWl2ZSBhIG9uZS10aW1lIGNvZGUuPC9wPlxuXG4gICAgPGZvcm0gaWQ9XCJlbWFpbC1mb3JtXCI+XG4gICAgICA8bGFiZWwgZm9yPVwiZW1haWxcIj5FbWFpbDwvbGFiZWw+XG4gICAgICA8aW5wdXQgaWQ9XCJlbWFpbFwiIG5hbWU9XCJlbWFpbFwiIHR5cGU9XCJlbWFpbFwiIGF1dG9jb21wbGV0ZT1cImVtYWlsXCIgcmVxdWlyZWQgYXV0b2ZvY3VzPlxuICAgICAgPGJ1dHRvbiBpZD1cImVtYWlsLXN1Ym1pdFwiIHR5cGU9XCJzdWJtaXRcIj5TZW5kIGNvZGU8L2J1dHRvbj5cbiAgICA8L2Zvcm0+XG5cbiAgICA8Zm9ybSBpZD1cImNvZGUtZm9ybVwiIGNsYXNzPVwiaGlkZGVuXCI+XG4gICAgICA8bGFiZWwgZm9yPVwiY29kZVwiPlZlcmlmaWNhdGlvbiBjb2RlPC9sYWJlbD5cbiAgICAgIDxpbnB1dCBpZD1cImNvZGVcIiBuYW1lPVwiY29kZVwiIGlucHV0bW9kZT1cIm51bWVyaWNcIiBhdXRvY29tcGxldGU9XCJvbmUtdGltZS1jb2RlXCIgcmVxdWlyZWQ+XG4gICAgICA8YnV0dG9uIGlkPVwiY29kZS1zdWJtaXRcIiB0eXBlPVwic3VibWl0XCI+VmVyaWZ5PC9idXR0b24+XG4gICAgICA8YnV0dG9uIGlkPVwiYmFja1wiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJhY2tcIj5Vc2UgYSBkaWZmZXJlbnQgZW1haWw8L2J1dHRvbj5cbiAgICA8L2Zvcm0+XG5cbiAgICA8ZGl2IGlkPVwibXNnXCIgY2xhc3M9XCJtc2dcIiByb2xlPVwic3RhdHVzXCIgYXJpYS1saXZlPVwicG9saXRlXCI+PC9kaXY+XG4gIDwvbWFpbj5cblxuPHNjcmlwdD5cbihmdW5jdGlvbiAoKSB7XG4gIHZhciBQUkVGSVggPSAke3ByZWZpeH07XG4gIHZhciBlbWFpbEZvcm0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImVtYWlsLWZvcm1cIik7XG4gIHZhciBjb2RlRm9ybSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiY29kZS1mb3JtXCIpO1xuICB2YXIgZW1haWxJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiZW1haWxcIik7XG4gIHZhciBjb2RlSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImNvZGVcIik7XG4gIHZhciBiYWNrID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJiYWNrXCIpO1xuICB2YXIgbXNnID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJtc2dcIik7XG4gIHZhciBlbWFpbCA9IFwiXCI7XG5cbiAgZnVuY3Rpb24gc2F5KHRleHQsIGlzRXJyb3IpIHtcbiAgICBtc2cudGV4dENvbnRlbnQgPSB0ZXh0IHx8IFwiXCI7XG4gICAgbXNnLmNsYXNzTmFtZSA9IFwibXNnXCIgKyAoaXNFcnJvciA/IFwiIGVycm9yXCIgOiBcIlwiKTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHBvc3QocGF0aCwgYm9keSkge1xuICAgIHZhciByZXMgPSBhd2FpdCBmZXRjaChQUkVGSVggKyBwYXRoLCB7XG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgY3JlZGVudGlhbHM6IFwiaW5jbHVkZVwiLFxuICAgICAgaGVhZGVyczogeyBcImNvbnRlbnQtdHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gICAgfSk7XG4gICAgdmFyIGRhdGEgPSB7fTtcbiAgICB0cnkgeyBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTsgfSBjYXRjaCAoX2UpIHsgLyogbm9uLUpTT04gKi8gfVxuICAgIHJldHVybiB7IG9rOiByZXMub2ssIHN0YXR1czogcmVzLnN0YXR1cywgZGF0YTogZGF0YSB9O1xuICB9XG5cbiAgZnVuY3Rpb24gZXJyb3JUZXh0KGRhdGEsIGZhbGxiYWNrKSB7XG4gICAgLy8gYmV0dGVyLWF1dGggZXJyb3Igc2hhcGU6IHsgbWVzc2FnZSB9IG9yIHsgZXJyb3I6IHsgbWVzc2FnZSB9IH0uXG4gICAgaWYgKGRhdGEgJiYgZGF0YS5lcnJvciAmJiBkYXRhLmVycm9yLm1lc3NhZ2UpIHJldHVybiBkYXRhLmVycm9yLm1lc3NhZ2U7XG4gICAgaWYgKGRhdGEgJiYgZGF0YS5tZXNzYWdlKSByZXR1cm4gZGF0YS5tZXNzYWdlO1xuICAgIHJldHVybiBmYWxsYmFjaztcbiAgfVxuXG4gIGVtYWlsRm9ybS5hZGRFdmVudExpc3RlbmVyKFwic3VibWl0XCIsIGFzeW5jIGZ1bmN0aW9uIChlKSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGVtYWlsID0gZW1haWxJbnB1dC52YWx1ZS50cmltKCk7XG4gICAgaWYgKCFlbWFpbCkgcmV0dXJuO1xuICAgIHZhciBzdWJtaXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImVtYWlsLXN1Ym1pdFwiKTtcbiAgICBzdWJtaXQuZGlzYWJsZWQgPSB0cnVlO1xuICAgIHNheShcIlNlbmRpbmfigKZcIik7XG4gICAgdHJ5IHtcbiAgICAgIC8vIGJldHRlci1hdXRoIGVtYWlsT1RQIG5hdGl2ZSBlbmRwb2ludC5cbiAgICAgIHZhciByID0gYXdhaXQgcG9zdChcIi9lbWFpbC1vdHAvc2VuZC12ZXJpZmljYXRpb24tb3RwXCIsIHsgZW1haWw6IGVtYWlsLCB0eXBlOiBcInNpZ24taW5cIiB9KTtcbiAgICAgIGlmIChyLm9rKSB7XG4gICAgICAgIGVtYWlsRm9ybS5jbGFzc0xpc3QuYWRkKFwiaGlkZGVuXCIpO1xuICAgICAgICBjb2RlRm9ybS5jbGFzc0xpc3QucmVtb3ZlKFwiaGlkZGVuXCIpO1xuICAgICAgICBjb2RlSW5wdXQuZm9jdXMoKTtcbiAgICAgICAgc2F5KFwiV2UgZW1haWxlZCBhIGNvZGUgdG8gXCIgKyBlbWFpbCArIFwiLlwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNheShlcnJvclRleHQoci5kYXRhLCBcIkNvdWxkIG5vdCBzZW5kIGEgY29kZS4gQ2hlY2sgdGhlIGFkZHJlc3MgYW5kIHRyeSBhZ2Fpbi5cIiksIHRydWUpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKF9lKSB7XG4gICAgICBzYXkoXCJOZXR3b3JrIGVycm9yLiBUcnkgYWdhaW4uXCIsIHRydWUpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBzdWJtaXQuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICB9XG4gIH0pO1xuXG4gIGNvZGVGb3JtLmFkZEV2ZW50TGlzdGVuZXIoXCJzdWJtaXRcIiwgYXN5bmMgZnVuY3Rpb24gKGUpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgdmFyIGNvZGUgPSBjb2RlSW5wdXQudmFsdWUudHJpbSgpO1xuICAgIGlmICghY29kZSkgcmV0dXJuO1xuICAgIHZhciBzdWJtaXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImNvZGUtc3VibWl0XCIpO1xuICAgIHN1Ym1pdC5kaXNhYmxlZCA9IHRydWU7XG4gICAgc2F5KFwiVmVyaWZ5aW5n4oCmXCIpO1xuICAgIHRyeSB7XG4gICAgICAvLyBiZXR0ZXItYXV0aCBzaWduLWluIHdpdGggdGhlIE9UUDsgc2V0cyB0aGUgc2Vzc2lvbiBjb29raWUgb24gc3VjY2Vzcy5cbiAgICAgIHZhciByID0gYXdhaXQgcG9zdChcIi9zaWduLWluL2VtYWlsLW90cFwiLCB7XG4gICAgICAgIGVtYWlsOiBlbWFpbCxcbiAgICAgICAgb3RwOiBjb2RlLFxuICAgICAgICBuYW1lOiBlbWFpbC5zcGxpdChcIkBcIilbMF0sXG4gICAgICB9KTtcbiAgICAgIGlmIChyLm9rKSB7XG4gICAgICAgIHNheShcIlNpZ25lZCBpbi4gTG9hZGluZ+KAplwiKTtcbiAgICAgICAgLy8gVGhlIHNlc3Npb24gY29va2llIGlzIHNldDsgcmVsb2FkIHNvIHRoZSBub3ctYXV0aGVudGljYXRlZCByZXF1ZXN0XG4gICAgICAgIC8vIHJlYWNoZXMgdGhlIGFwcC5cbiAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2F5KGVycm9yVGV4dChyLmRhdGEsIFwiVGhhdCBjb2RlIHdhcyBub3QgYWNjZXB0ZWQuIFRyeSBhZ2Fpbi5cIiksIHRydWUpO1xuICAgICAgICBzdWJtaXQuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChfZSkge1xuICAgICAgc2F5KFwiTmV0d29yayBlcnJvci4gVHJ5IGFnYWluLlwiLCB0cnVlKTtcbiAgICAgIHN1Ym1pdC5kaXNhYmxlZCA9IGZhbHNlO1xuICAgIH1cbiAgfSk7XG5cbiAgYmFjay5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24gKCkge1xuICAgIGNvZGVGb3JtLmNsYXNzTGlzdC5hZGQoXCJoaWRkZW5cIik7XG4gICAgZW1haWxGb3JtLmNsYXNzTGlzdC5yZW1vdmUoXCJoaWRkZW5cIik7XG4gICAgY29kZUlucHV0LnZhbHVlID0gXCJcIjtcbiAgICBzYXkoXCJcIik7XG4gICAgZW1haWxJbnB1dC5mb2N1cygpO1xuICB9KTtcbn0pKCk7XG48L3NjcmlwdD5cbjwvYm9keT5cbjwvaHRtbD5gO1xufVxuXG5jb25zdCBIVE1MX0VTQ0FQRVM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gIFwiJlwiOiBcIiZhbXA7XCIsXG4gIFwiPFwiOiBcIiZsdDtcIixcbiAgXCI+XCI6IFwiJmd0O1wiLFxuICAnXCInOiBcIiZxdW90O1wiLFxuICBcIidcIjogXCImIzM5O1wiLFxufTtcblxuZnVuY3Rpb24gZXNjYXBlSHRtbCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoL1smPD5cIiddL2csIChjaCkgPT4gSFRNTF9FU0NBUEVTW2NoXSA/PyBjaCk7XG59XG4iXX0=
package/package.json CHANGED
@@ -18,21 +18,21 @@
18
18
  "projen": "projen"
19
19
  },
20
20
  "devDependencies": {
21
- "@dbx-tools/email": "0.6.97",
21
+ "@dbx-tools/email": "0.6.98",
22
22
  "@types/bun": "^1.3.14",
23
23
  "@types/node": "^24.6.0",
24
24
  "typescript": "^5.9.3"
25
25
  },
26
26
  "peerDependencies": {
27
- "@dbx-tools/email": "0.6.97"
27
+ "@dbx-tools/email": "0.6.98"
28
28
  },
29
29
  "dependencies": {
30
30
  "@databricks/appkit": "^0.43.0",
31
- "@dbx-tools/appkit": "0.6.97",
32
- "@dbx-tools/auth": "0.6.97",
33
- "@dbx-tools/core": "0.6.97",
34
- "@dbx-tools/shared-auth": "0.6.97",
35
- "@dbx-tools/shared-core": "0.6.97"
31
+ "@dbx-tools/appkit": "0.6.98",
32
+ "@dbx-tools/auth": "0.6.98",
33
+ "@dbx-tools/core": "0.6.98",
34
+ "@dbx-tools/shared-auth": "0.6.98",
35
+ "@dbx-tools/shared-core": "0.6.98"
36
36
  },
37
37
  "main": "./lib/index.js",
38
38
  "license": "UNLICENSED",
@@ -48,7 +48,7 @@
48
48
  "./package.json": "./package.json"
49
49
  }
50
50
  },
51
- "version": "0.6.97",
51
+ "version": "0.6.98",
52
52
  "types": "./lib/index.d.ts",
53
53
  "type": "module",
54
54
  "exports": {
package/src/login-page.ts CHANGED
@@ -124,6 +124,13 @@ export function loginPageHtml(options: LoginPageOptions): string {
124
124
  return { ok: res.ok, status: res.status, data: data };
125
125
  }
126
126
 
127
+ function errorText(data, fallback) {
128
+ // better-auth error shape: { message } or { error: { message } }.
129
+ if (data && data.error && data.error.message) return data.error.message;
130
+ if (data && data.message) return data.message;
131
+ return fallback;
132
+ }
133
+
127
134
  emailForm.addEventListener("submit", async function (e) {
128
135
  e.preventDefault();
129
136
  email = emailInput.value.trim();
@@ -132,14 +139,15 @@ export function loginPageHtml(options: LoginPageOptions): string {
132
139
  submit.disabled = true;
133
140
  say("Sending…");
134
141
  try {
135
- var r = await post("/request", { email: email });
136
- if (r.ok && r.data.ok) {
142
+ // better-auth emailOTP native endpoint.
143
+ var r = await post("/email-otp/send-verification-otp", { email: email, type: "sign-in" });
144
+ if (r.ok) {
137
145
  emailForm.classList.add("hidden");
138
146
  codeForm.classList.remove("hidden");
139
147
  codeInput.focus();
140
148
  say("We emailed a code to " + email + ".");
141
149
  } else {
142
- say(r.data.error || "Could not send a code. Check the address and try again.", true);
150
+ say(errorText(r.data, "Could not send a code. Check the address and try again."), true);
143
151
  }
144
152
  } catch (_e) {
145
153
  say("Network error. Try again.", true);
@@ -156,14 +164,19 @@ export function loginPageHtml(options: LoginPageOptions): string {
156
164
  submit.disabled = true;
157
165
  say("Verifying…");
158
166
  try {
159
- var r = await post("/verify", { email: email, code: code });
160
- if (r.ok && r.data.ok) {
167
+ // better-auth sign-in with the OTP; sets the session cookie on success.
168
+ var r = await post("/sign-in/email-otp", {
169
+ email: email,
170
+ otp: code,
171
+ name: email.split("@")[0],
172
+ });
173
+ if (r.ok) {
161
174
  say("Signed in. Loading…");
162
175
  // The session cookie is set; reload so the now-authenticated request
163
176
  // reaches the app.
164
177
  window.location.reload();
165
178
  } else {
166
- say(r.data.error || "That code was not accepted. Try again.", true);
179
+ say(errorText(r.data, "That code was not accepted. Try again."), true);
167
180
  submit.disabled = false;
168
181
  }
169
182
  } catch (_e) {