cauthy-auth 0.20.0 → 0.22.0

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.
Files changed (43) hide show
  1. package/dist/{cauthy-Bn3iv50y.d.ts → cauthy-DGAy45G2.d.ts} +1 -1
  2. package/dist/{cauthy-C29HCvag.d.mts → cauthy-XkIbG5gE.d.mts} +1 -1
  3. package/dist/client.d.mts +111 -2
  4. package/dist/client.d.ts +111 -2
  5. package/dist/client.js +25 -0
  6. package/dist/client.js.map +1 -1
  7. package/dist/client.mjs +25 -0
  8. package/dist/client.mjs.map +1 -1
  9. package/dist/express.d.mts +2 -2
  10. package/dist/express.d.ts +2 -2
  11. package/dist/fastify.d.mts +2 -2
  12. package/dist/fastify.d.ts +2 -2
  13. package/dist/hono.d.mts +2 -2
  14. package/dist/hono.d.ts +2 -2
  15. package/dist/index.d.mts +2 -2
  16. package/dist/index.d.ts +2 -2
  17. package/dist/index.js +133 -4
  18. package/dist/index.js.map +1 -1
  19. package/dist/index.mjs +133 -4
  20. package/dist/index.mjs.map +1 -1
  21. package/dist/next.d.mts +2 -2
  22. package/dist/next.d.ts +2 -2
  23. package/dist/react.d.mts +145 -1
  24. package/dist/react.d.ts +145 -1
  25. package/dist/react.js +200 -2
  26. package/dist/react.js.map +1 -1
  27. package/dist/react.mjs +199 -2
  28. package/dist/react.mjs.map +1 -1
  29. package/dist/svelte.d.mts +2 -2
  30. package/dist/svelte.d.ts +2 -2
  31. package/dist/svelte.js +25 -0
  32. package/dist/svelte.js.map +1 -1
  33. package/dist/svelte.mjs +25 -0
  34. package/dist/svelte.mjs.map +1 -1
  35. package/dist/{system-ZD_Wa8Bm.d.mts → system-BxMsSIu1.d.mts} +2 -0
  36. package/dist/{system-DhRr_WxR.d.ts → system-DTIeDXDP.d.ts} +2 -0
  37. package/dist/vue.d.mts +2 -2
  38. package/dist/vue.d.ts +2 -2
  39. package/dist/vue.js +25 -0
  40. package/dist/vue.js.map +1 -1
  41. package/dist/vue.mjs +25 -0
  42. package/dist/vue.mjs.map +1 -1
  43. package/package.json +1 -1
package/dist/index.mjs CHANGED
@@ -789,7 +789,8 @@ function createCauthy(given = {}) {
789
789
  emailVerified: b.email_verified === true,
790
790
  restricted: b.restricted === true,
791
791
  ...typeof b.email_verify_by === "string" ? { emailVerifyBy: b.email_verify_by } : {},
792
- ...typeof b.locale === "string" && b.locale !== "" ? { locale: b.locale } : {}
792
+ ...typeof b.locale === "string" && b.locale !== "" ? { locale: b.locale } : {},
793
+ ...b.anonymous === true ? { isAnonymous: true } : {}
793
794
  }
794
795
  };
795
796
  } catch {
@@ -998,6 +999,32 @@ function createCauthy(given = {}) {
998
999
  createdAt: String(d?.created_at ?? ""),
999
1000
  lastUsedAt: d?.last_used_at ? String(d.last_used_at) : null
1000
1001
  });
1002
+ const UUID = /^[0-9a-f-]{36}$/i;
1003
+ const seatOf = (d) => ({
1004
+ id: String(d?.id ?? ""),
1005
+ system: String(d?.system ?? ""),
1006
+ name: String(d?.name ?? ""),
1007
+ kind: String(d?.kind ?? ""),
1008
+ role: String(d?.role ?? ""),
1009
+ can: { readMembers: d?.can?.read_members === true, manageMembers: d?.can?.manage_members === true }
1010
+ });
1011
+ const orgMemberOf = (d) => ({
1012
+ userId: String(d?.user_id ?? ""),
1013
+ email: String(d?.email ?? ""),
1014
+ name: String(d?.name ?? ""),
1015
+ role: String(d?.role ?? ""),
1016
+ status: String(d?.status ?? ""),
1017
+ invited: d?.invited === true,
1018
+ manager: d?.manager === true,
1019
+ you: d?.you === true,
1020
+ since: String(d?.since ?? "")
1021
+ });
1022
+ const orgRoleOf = (d) => ({
1023
+ role: String(d?.role ?? ""),
1024
+ name: String(d?.name ?? ""),
1025
+ description: String(d?.description ?? ""),
1026
+ manager: d?.manager === true
1027
+ });
1001
1028
  const agentOf = (d) => ({
1002
1029
  id: String(d?.id ?? ""),
1003
1030
  name: String(d?.agent?.name ?? ""),
@@ -1133,8 +1160,17 @@ function createCauthy(given = {}) {
1133
1160
  "/me/passkeys/add/finish",
1134
1161
  "/me/passkeys/remove",
1135
1162
  "/me/agents",
1136
- "/me/agents/disconnect"
1137
- ].includes(route) || route.startsWith("/sign-in/social/") || route.startsWith("/callback/") || route.startsWith("/me/identities/link/") || route === "/sign-in/sso" || route === "/sign-in/sso/discover" || route === "/sso/callback";
1163
+ "/me/agents/disconnect",
1164
+ "/sign-in/anonymous",
1165
+ "/me/upgrade",
1166
+ "/me/organizations",
1167
+ "/me/organizations/members",
1168
+ "/me/organizations/roles",
1169
+ "/me/organizations/members/add",
1170
+ "/me/organizations/members/role",
1171
+ "/me/organizations/members/remove",
1172
+ "/me/organizations/members/invite"
1173
+ ].includes(route) || route.startsWith("/sign-in/social/") || route.startsWith("/callback/") || route.startsWith("/me/identities/link/") || route.startsWith("/me/upgrade/social/") || route === "/sign-in/sso" || route === "/sign-in/sso/discover" || route === "/sso/callback";
1138
1174
  if (!own) return null;
1139
1175
  if (tenant === "") {
1140
1176
  return problem(500, "not_configured", "cauthy-auth: tenant (CAUTHY_TENANT) is required for the application's own sign-in screens");
@@ -1222,10 +1258,19 @@ function createCauthy(given = {}) {
1222
1258
  const clear = writeCookie(stepCookie, "", attrs(request, 0));
1223
1259
  const back = step?.returnTo ?? afterSignIn;
1224
1260
  const failedTo = (code2) => redirect(`${back}${back.includes("?") ? "&" : "?"}auth_error=${encodeURIComponent(code2)}`, [clear]);
1225
- if (step === null || step.kind !== "social" && step.kind !== "link" || step.provider !== provider || url.searchParams.get("state") !== step.token) return failedTo("state_mismatch");
1261
+ if (step === null || step.kind !== "social" && step.kind !== "link" && step.kind !== "upgrade" || step.provider !== provider || url.searchParams.get("state") !== step.token) return failedTo("state_mismatch");
1226
1262
  const code = url.searchParams.get("code");
1227
1263
  if (!code) return failedTo(url.searchParams.get("error") === "access_denied" ? "cancelled" : "provider_refused");
1228
1264
  const q = new URLSearchParams({ code, state: step.token, redirect_uri: `${originOf(request)}${basePath}/callback/${provider}` });
1265
+ if (step.kind === "upgrade") {
1266
+ const mine = await signedInAs(request);
1267
+ if ("response" in mine) return failedTo("unauthenticated");
1268
+ const done2 = await ask(request, "GET", `/v1/auth/anonymous/upgrade/${provider}/callback?${q}`, void 0, void 0, mine.token);
1269
+ if (done2.error) return failedTo(done2.error.code);
1270
+ const s2 = await stored(done2.data);
1271
+ if (s2 === null) return failedTo("unavailable");
1272
+ return redirect(back, [...await write(request, s2, readCookies(request.headers.get("cookie"))), clear]);
1273
+ }
1229
1274
  if (step.kind === "link") {
1230
1275
  const mine = await signedInAs(request);
1231
1276
  if ("response" in mine) return failedTo("unauthenticated");
@@ -1241,6 +1286,19 @@ function createCauthy(given = {}) {
1241
1286
  if (s === null) return failedTo("unavailable");
1242
1287
  return redirect(back, [...await write(request, s, readCookies(request.headers.get("cookie"))), clear]);
1243
1288
  }
1289
+ if (route.startsWith("/me/upgrade/social/") && !post) {
1290
+ const provider = providerIn(route.slice("/me/upgrade/social/".length));
1291
+ if (!PROVIDER_ID.test(provider)) return new Response("Not found", { status: 404 });
1292
+ const returnTo = localPath(url.searchParams.get("return_to"), afterSignIn);
1293
+ const failed2 = (code) => redirect(`${returnTo}${returnTo.includes("?") ? "&" : "?"}auth_error=${encodeURIComponent(code)}`);
1294
+ const mine = await signedInAs(request);
1295
+ if ("response" in mine) return failed2("unauthenticated");
1296
+ const callback2 = `${basePath}/callback/${provider}`;
1297
+ const started = await ask(request, "GET", `/v1/auth/anonymous/upgrade/${provider}?redirect_uri=${encodeURIComponent(`${originOf(request)}${callback2}`)}`, void 0, callback2, mine.token);
1298
+ if (started.error || typeof started.data?.redirect_url !== "string") return failed2(started.error?.code ?? "provider_unavailable");
1299
+ const step = { kind: "upgrade", token: String(started.data.state ?? ""), provider, returnTo };
1300
+ return redirect(started.data.redirect_url, [...mine.headers.getSetCookie(), writeCookie(stepCookie, await seal(step, await key), attrs(request, STEP_SECONDS))]);
1301
+ }
1244
1302
  if (route.startsWith("/me/identities/link/") && !post) {
1245
1303
  const provider = providerIn(route.slice("/me/identities/link/".length));
1246
1304
  if (!PROVIDER_ID.test(provider)) return new Response("Not found", { status: 404 });
@@ -1278,6 +1336,24 @@ function createCauthy(given = {}) {
1278
1336
  const list = Array.isArray(res.data) ? res.data : [];
1279
1337
  return json({ agents: list.map(agentOf) }, 200, mine.headers);
1280
1338
  }
1339
+ if ((route === "/me/organizations" || route === "/me/organizations/members" || route === "/me/organizations/roles") && !post) {
1340
+ const mine = await signedInAs(request);
1341
+ if ("response" in mine) return mine.response;
1342
+ let path = "/v1/auth/me/organizations";
1343
+ if (route !== "/me/organizations") {
1344
+ const id = url.searchParams.get("id") ?? "";
1345
+ if (!UUID.test(id)) return problem(400, "invalid_organization", "Say which organization.", void 0, mine.headers);
1346
+ path += `/${id}/${route.endsWith("/roles") ? "roles" : "members"}`;
1347
+ } else if (url.searchParams.get("system")) {
1348
+ path += `?system=${encodeURIComponent(url.searchParams.get("system"))}`;
1349
+ }
1350
+ const res = await ask(request, "GET", path, void 0, void 0, mine.token);
1351
+ if (res.error) return problem(res.status, res.error.code, res.error.message, void 0, mine.headers);
1352
+ const list = Array.isArray(res.data) ? res.data : [];
1353
+ if (route === "/me/organizations") return json({ organizations: list.map(seatOf) }, 200, mine.headers);
1354
+ if (route === "/me/organizations/roles") return json({ roles: list.map(orgRoleOf) }, 200, mine.headers);
1355
+ return json({ members: list.map(orgMemberOf) }, 200, mine.headers);
1356
+ }
1281
1357
  if (route === "/me/mfa/factors" && !post) {
1282
1358
  const mine = await signedInAs(request);
1283
1359
  if ("response" in mine) return mine.response;
@@ -1320,6 +1396,12 @@ function createCauthy(given = {}) {
1320
1396
  const c = res.data?.connection;
1321
1397
  return json(c ? { status: "found", connection: { id: String(c.slug ?? ""), name: String(c.display_name ?? ""), enforced: c.enforced === true } } : { status: "none" });
1322
1398
  }
1399
+ if (route === "/sign-in/anonymous") {
1400
+ if (!post) return new Response("Method not allowed", { status: 405, headers: { allow: "POST" } });
1401
+ const res = await ask(request, "POST", "/v1/auth/anonymous", {});
1402
+ if (res.error) return problem(res.status, res.error.code, res.error.message);
1403
+ return signedIn(request, res.data);
1404
+ }
1323
1405
  if (route === "/sign-in/email") {
1324
1406
  const bad = firstProblem(checkEmail(b.email), checkPassword(b.password));
1325
1407
  if (bad) return invalid(bad);
@@ -1483,6 +1565,53 @@ function createCauthy(given = {}) {
1483
1565
  if (res.error) return refused(res);
1484
1566
  return json({ status: "removed", id }, 200, mine.headers);
1485
1567
  }
1568
+ if (route === "/me/upgrade") {
1569
+ const bad = firstProblem(checkName(b.name), checkEmail(b.email), checkNewPassword(b.password));
1570
+ if (bad) return invalid(bad);
1571
+ const res = await as("/v1/auth/anonymous/upgrade", { email: String(b.email).trim(), password: b.password, display_name: typeof b.name === "string" ? b.name.trim() : "" });
1572
+ if (res.error) return refused(res, res.error.code === "weak_password" ? "password" : "email");
1573
+ return signedIn(request, res.data);
1574
+ }
1575
+ if (route.startsWith("/me/organizations/members/")) {
1576
+ const org = typeof b.organizationId === "string" ? b.organizationId : "";
1577
+ if (!UUID.test(org)) return problem(400, "invalid_organization", "Say which organization.", void 0, mine.headers);
1578
+ const base = `/v1/auth/me/organizations/${org}/members`;
1579
+ if (route === "/me/organizations/members/add") {
1580
+ const bad = checkEmail(b.email);
1581
+ if (bad) return invalid(bad);
1582
+ const role = typeof b.role === "string" ? b.role : "";
1583
+ if (role === "") return problem(400, "invalid_role", "Choose a role.", "role", mine.headers);
1584
+ const res = await as(base, {
1585
+ email: String(b.email).trim(),
1586
+ role,
1587
+ name: typeof b.name === "string" ? b.name.trim() : "",
1588
+ client_id: clientId,
1589
+ ...typeof b.locale === "string" && b.locale ? { locale: b.locale } : {}
1590
+ });
1591
+ if (res.error) return refused(res, res.error.code === "unknown_role" ? "role" : "email");
1592
+ return json({ status: "added", member: orgMemberOf(res.data) }, 200, mine.headers);
1593
+ }
1594
+ const user = typeof b.userId === "string" ? b.userId : "";
1595
+ if (!UUID.test(user)) return problem(400, "invalid_member", "Say which member.", void 0, mine.headers);
1596
+ if (route === "/me/organizations/members/role") {
1597
+ const role = typeof b.role === "string" ? b.role : "";
1598
+ if (role === "") return problem(400, "invalid_role", "Choose a role.", "role", mine.headers);
1599
+ const res = await as(`${base}/${user}`, { role }, "PUT");
1600
+ if (res.error) return refused(res, "role");
1601
+ return json({ status: "changed", userId: user, role }, 200, mine.headers);
1602
+ }
1603
+ if (route === "/me/organizations/members/remove") {
1604
+ const res = await as(`${base}/${user}`, void 0, "DELETE");
1605
+ if (res.error) return refused(res);
1606
+ orgCache.delete(mine.token);
1607
+ return json({ status: "removed", userId: user }, 200, mine.headers);
1608
+ }
1609
+ if (route === "/me/organizations/members/invite") {
1610
+ const res = await as(`${base}/${user}/invite`, { client_id: clientId, ...typeof b.locale === "string" && b.locale ? { locale: b.locale } : {} });
1611
+ if (res.error) return refused(res);
1612
+ return json({ status: "sent", userId: user }, 200, mine.headers);
1613
+ }
1614
+ }
1486
1615
  if (route === "/me/agents/disconnect") {
1487
1616
  const id = typeof b.id === "string" ? b.id : "";
1488
1617
  if (!/^[0-9a-f-]{36}$/i.test(id)) return problem(400, "invalid_agent", "Say which agent to disconnect.", void 0, mine.headers);