@convex-dev/better-auth 0.9.5 → 0.9.7-alpha.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 (38) hide show
  1. package/README.md +0 -41
  2. package/dist/commonjs/client/adapter.d.ts.map +1 -1
  3. package/dist/commonjs/client/adapter.js +1 -0
  4. package/dist/commonjs/client/adapter.js.map +1 -1
  5. package/dist/commonjs/client/adapterUtils.d.ts +6 -6
  6. package/dist/commonjs/client/createSchema.d.ts +2 -2
  7. package/dist/commonjs/client/createSchema.d.ts.map +1 -1
  8. package/dist/commonjs/client/createSchema.js +10 -5
  9. package/dist/commonjs/client/createSchema.js.map +1 -1
  10. package/dist/commonjs/client/index.d.ts +18 -15
  11. package/dist/commonjs/client/index.d.ts.map +1 -1
  12. package/dist/commonjs/client/index.js.map +1 -1
  13. package/dist/commonjs/component/adapter.d.ts +6 -6
  14. package/dist/commonjs/react-start/index.d.ts +17 -0
  15. package/dist/commonjs/react-start/index.d.ts.map +1 -1
  16. package/dist/commonjs/react-start/index.js +44 -0
  17. package/dist/commonjs/react-start/index.js.map +1 -1
  18. package/dist/esm/client/adapter.d.ts.map +1 -1
  19. package/dist/esm/client/adapter.js +1 -0
  20. package/dist/esm/client/adapter.js.map +1 -1
  21. package/dist/esm/client/adapterUtils.d.ts +6 -6
  22. package/dist/esm/client/createSchema.d.ts +2 -2
  23. package/dist/esm/client/createSchema.d.ts.map +1 -1
  24. package/dist/esm/client/createSchema.js +10 -5
  25. package/dist/esm/client/createSchema.js.map +1 -1
  26. package/dist/esm/client/index.d.ts +18 -15
  27. package/dist/esm/client/index.d.ts.map +1 -1
  28. package/dist/esm/client/index.js.map +1 -1
  29. package/dist/esm/component/adapter.d.ts +6 -6
  30. package/dist/esm/react-start/index.d.ts +17 -0
  31. package/dist/esm/react-start/index.d.ts.map +1 -1
  32. package/dist/esm/react-start/index.js +44 -0
  33. package/dist/esm/react-start/index.js.map +1 -1
  34. package/package.json +3 -2
  35. package/src/client/adapter.ts +1 -0
  36. package/src/client/createSchema.ts +18 -11
  37. package/src/client/index.ts +22 -15
  38. package/src/react-start/index.ts +61 -0
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/react-start/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EACjB,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,UAAU,EAAiB,MAAM,WAAW,CAAC;AAEtD,eAAO,MAAM,aAAa,GAAI,SAAS,SAAS,gBAAgB,EAC9D,YAAY,UAAU,CAAC,SAAS,CAAC,WAKlC,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAU,SAAS,SAAS,gBAAgB,EACvE,YAAY,UAAU,CAAC,SAAS,CAAC,EACjC,WAAW,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS;eAa3C,KAAK,SAAS,iBAAiB,CAAC,OAAO,CAAC,EACxC,OAAO,SAAS,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC,SAEpC,KAAK,QACN,OAAO,CAAC,OAAO,CAAC,GACrB,OAAO,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;kBAInC,QAAQ,SAAS,iBAAiB,CAAC,UAAU,CAAC,oBAC9B,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC,YAEjC,QAAQ,QACZ,SAAO,CAAC,OAAO,CAAC,GACrB,OAAO,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;gBAItC,MAAM,SAAS,iBAAiB,CAAC,QAAQ,CAAC,oBAC1B,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC,UAEnC,MAAM,QACR,SAAO,CAAC,OAAO,CAAC,GACrB,OAAO,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;EAIzC,CAAC;AAEF,eAAO,MAAM,YAAY,GACvB,CAAC,SAAS,CAAC,GAAG,EAAE,gBAAgB,CAAC,GAAG,CAAC,KAAK,UAAU,CAAC,OAAO,UAAU,CAAC,EAEvE,SAAS,OAAO,EAChB,OAAO;IACL,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;;EAuBF,CAAC;AAEF,eAAO,MAAM,OAAO,GAAU,SAAS,SAAS,gBAAgB,EAC9D,SAAS,OAAO,EAChB,WAAW,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,EAC/C,YAAY,UAAU,CAAC,SAAS,CAAC,EACjC,OAAO;IAAE,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE;;;EASlC,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAC5B,SAAS,OAAO,EAChB,OAAO;IAAE,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,sBAkBrD,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/react-start/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAIzC,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EACjB,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,UAAU,EAAiB,MAAM,WAAW,CAAC;AAEtD,eAAO,MAAM,aAAa,GAAI,SAAS,SAAS,gBAAgB,EAC9D,YAAY,UAAU,CAAC,SAAS,CAAC,WAKlC,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,SAAS,SAAS,gBAAgB,EAC/D,YAAY,UAAU,CAAC,SAAS,CAAC;;;CAOlC,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAU,SAAS,SAAS,gBAAgB,EACvE,YAAY,UAAU,CAAC,SAAS,CAAC,EACjC,WAAW,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS;eAa3C,KAAK,SAAS,iBAAiB,CAAC,OAAO,CAAC,EACxC,OAAO,SAAS,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC,SAEpC,KAAK,QACN,OAAO,CAAC,OAAO,CAAC,GACrB,OAAO,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;kBAInC,QAAQ,SAAS,iBAAiB,CAAC,UAAU,CAAC,oBAC9B,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC,YAEjC,QAAQ,QACZ,SAAO,CAAC,OAAO,CAAC,GACrB,OAAO,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;gBAItC,MAAM,SAAS,iBAAiB,CAAC,QAAQ,CAAC,oBAC1B,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC,UAEnC,MAAM,QACR,SAAO,CAAC,OAAO,CAAC,GACrB,OAAO,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;EAIzC,CAAC;AAEF,eAAO,MAAM,YAAY,GACvB,CAAC,SAAS,CAAC,GAAG,EAAE,gBAAgB,CAAC,GAAG,CAAC,KAAK,UAAU,CAAC,OAAO,UAAU,CAAC,EAEvE,SAAS,OAAO,EAChB,OAAO;IACL,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;;EAuBF,CAAC;AAEF,eAAO,MAAM,SAAS,GACpB,SAAS,OAAO,EAChB,OAAO;IACL,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;;;cA0BF,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAC5B,SAAS,MAAM,EACf,gBAAoB;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO;;;aAahD,CAAC;AAEF,eAAO,MAAM,OAAO,GAAU,SAAS,SAAS,gBAAgB,EAC9D,SAAS,OAAO,EAChB,WAAW,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,EAC/C,YAAY,UAAU,CAAC,SAAS,CAAC,EACjC,OAAO;IAAE,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE;;;EASlC,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAC5B,SAAS,OAAO,EAChB,OAAO;IAAE,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,sBAkBrD,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import { createCookieGetter } from "better-auth/cookies";
2
2
  import { betterFetch } from "@better-fetch/fetch";
3
+ import * as jose from "jose";
3
4
  import { JWT_COOKIE_NAME } from "../plugins/convex/index.js";
4
5
  import { ConvexHttpClient } from "convex/browser";
5
6
  import { getStaticAuth } from "../client/index.js";
@@ -8,6 +9,13 @@ export const getCookieName = (createAuth) => {
8
9
  const cookie = createCookie(JWT_COOKIE_NAME);
9
10
  return cookie.name;
10
11
  };
12
+ export const getCookieNames = (createAuth) => {
13
+ const createCookie = createCookieGetter(getStaticAuth(createAuth).options);
14
+ return {
15
+ convexJwt: createCookie(JWT_COOKIE_NAME).name,
16
+ sessionToken: createCookie("session_token").name,
17
+ };
18
+ };
11
19
  export const setupFetchClient = async (createAuth, getCookie) => {
12
20
  const createClient = () => {
13
21
  const sessionCookieName = getCookieName(createAuth);
@@ -48,6 +56,42 @@ export const fetchSession = async (request, opts) => {
48
56
  session,
49
57
  };
50
58
  };
59
+ export const fetchAuth = async (request, opts) => {
60
+ if (!request) {
61
+ throw new Error("No request found");
62
+ }
63
+ const convexSiteUrl = opts?.convexSiteUrl ?? process.env.VITE_CONVEX_SITE_URL;
64
+ if (!convexSiteUrl) {
65
+ throw new Error("VITE_CONVEX_SITE_URL is not set");
66
+ }
67
+ const { data } = await betterFetch("/api/auth/convex/token", {
68
+ baseURL: convexSiteUrl,
69
+ headers: {
70
+ cookie: request.headers.get("cookie") ?? "",
71
+ },
72
+ });
73
+ if (!data?.token) {
74
+ return;
75
+ }
76
+ const claims = jose.decodeJwt(data.token);
77
+ return {
78
+ token: data.token,
79
+ userId: claims.sub,
80
+ };
81
+ };
82
+ export const getAuthFromCookie = (cookie, { tolerance = 10 } = {}) => {
83
+ if (!cookie) {
84
+ return;
85
+ }
86
+ const claims = jose.decodeJwt(cookie);
87
+ const exp = claims?.exp;
88
+ const now = Math.floor(new Date().getTime() / 1000);
89
+ const isExpired = exp ? now > exp + tolerance : true;
90
+ if (isExpired) {
91
+ return;
92
+ }
93
+ return { userId: claims?.sub, token: cookie };
94
+ };
51
95
  export const getAuth = async (request, getCookie, createAuth, opts) => {
52
96
  const sessionCookieName = getCookieName(createAuth);
53
97
  const token = getCookie(sessionCookieName);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/react-start/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/react-start/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAO7B,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAc,aAAa,EAAE,MAAM,WAAW,CAAC;AAEtD,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,UAAiC,EACjC,EAAE;IACF,MAAM,YAAY,GAAG,kBAAkB,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC;IAC3E,MAAM,MAAM,GAAG,YAAY,CAAC,eAAe,CAAC,CAAC;IAC7C,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,UAAiC,EACjC,EAAE;IACF,MAAM,YAAY,GAAG,kBAAkB,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC;IAC3E,OAAO;QACL,SAAS,EAAE,YAAY,CAAC,eAAe,CAAC,CAAC,IAAI;QAC7C,YAAY,EAAE,YAAY,CAAC,eAAe,CAAC,CAAC,IAAI;KACjD,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,EACnC,UAAiC,EACjC,SAA+C,EAC/C,EAAE;IACF,MAAM,YAAY,GAAG,GAAG,EAAE;QACxB,MAAM,iBAAiB,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;QACpD,MAAM,KAAK,GAAG,SAAS,CAAC,iBAAiB,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,IAAI,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,eAAgB,CAAC,CAAC;QAClE,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACxB,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;IACF,OAAO;QACL,UAAU,CAIR,KAAY,EACZ,IAAsB;YAEtB,OAAO,YAAY,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC3C,CAAC;QACD,aAAa,CAIX,QAAkB,EAClB,IAAsB;YAEtB,OAAO,YAAY,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACjD,CAAC;QACD,WAAW,CAIT,MAAc,EACd,IAAsB;YAEtB,OAAO,YAAY,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC7C,CAAC;KACF,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAG/B,OAAgB,EAChB,IAGC,EACD,EAAE;IAGF,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACtC,CAAC;IACD,MAAM,aAAa,GAAG,IAAI,EAAE,aAAa,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;IAC9E,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACrD,CAAC;IACD,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,WAAW,CACzC,uBAAuB,EACvB;QACE,OAAO,EAAE,aAAa;QACtB,OAAO,EAAE;YACP,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE;SAC5C;KACF,CACF,CAAC;IACF,OAAO;QACL,OAAO;KACR,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,EAC5B,OAAgB,EAChB,IAGC,EACD,EAAE;IACF,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACtC,CAAC;IACD,MAAM,aAAa,GAAG,IAAI,EAAE,aAAa,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;IAC9E,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACrD,CAAC;IACD,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,WAAW,CAChC,wBAAwB,EACxB;QACE,OAAO,EAAE,aAAa;QACtB,OAAO,EAAE;YACP,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE;SAC5C;KACF,CACF,CAAC;IACF,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;QACjB,OAAO;IACT,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1C,OAAO;QACL,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,MAAM,EAAE,MAAM,CAAC,GAAG;KACnB,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,MAAe,EACf,EAAE,SAAS,GAAG,EAAE,KAA6B,EAAE,EAC/C,EAAE;IACF,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO;IACT,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACtC,MAAM,GAAG,GAAG,MAAM,EAAE,GAAG,CAAC;IACxB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;IACpD,MAAM,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;IACrD,IAAI,SAAS,EAAE,CAAC;QACd,OAAO;IACT,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AAChD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EAC1B,OAAgB,EAChB,SAA+C,EAC/C,UAAiC,EACjC,IAAiC,EACjC,EAAE;IACF,MAAM,iBAAiB,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG,SAAS,CAAC,iBAAiB,CAAC,CAAC;IAC3C,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACtD,OAAO;QACL,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE;QACxB,KAAK;KACN,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,OAAgB,EAChB,IAAoD,EACpD,EAAE;IACF,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,aAAa,GAAG,IAAI,EAAE,aAAa,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;IAC9E,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACrD,CAAC;IACD,MAAM,OAAO,GAAG,GAAG,aAAa,GAAG,UAAU,CAAC,QAAQ,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC;IAC7E,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,kBAAkB,CAAC,CAAC;IACnD,OAAO,KAAK,CAAC,OAAO,EAAE;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,OAAO;QACP,QAAQ,EAAE,QAAQ;QAClB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,qFAAqF;QACrF,MAAM,EAAE,MAAM;KACf,CAAC,CAAC;AACL,CAAC,CAAC"}
package/package.json CHANGED
@@ -6,7 +6,7 @@
6
6
  "bugs": {
7
7
  "url": "https://github.com/get-convex/better-auth/issues"
8
8
  },
9
- "version": "0.9.5",
9
+ "version": "0.9.7-alpha.0",
10
10
  "license": "Apache-2.0",
11
11
  "keywords": [
12
12
  "convex",
@@ -154,7 +154,7 @@
154
154
  },
155
155
  "peerDependencies": {
156
156
  "better-auth": "1.3.27",
157
- "convex": "^1.26.2",
157
+ "convex": "^1.28.0",
158
158
  "react": "^18.3.1 || ^19.0.0",
159
159
  "react-dom": "^18.3.1 || ^19.0.0"
160
160
  },
@@ -186,6 +186,7 @@
186
186
  "dependencies": {
187
187
  "common-tags": "^1.8.2",
188
188
  "convex-helpers": "^0.1.95",
189
+ "jose": "^6.1.0",
189
190
  "remeda": "^2.32.0",
190
191
  "semver": "^7.7.3",
191
192
  "type-fest": "^4.39.1",
@@ -122,6 +122,7 @@ export const convexAdapter = <
122
122
  disableIdGeneration: true,
123
123
  transaction: false,
124
124
  supportsNumericIds: false,
125
+ supportsJSON: false,
125
126
  usePlural: false,
126
127
  mapKeysTransformInput: {
127
128
  id: "_id",
@@ -1,4 +1,4 @@
1
- import { BetterAuthDbSchema, type FieldAttribute } from "better-auth/db";
1
+ import type { BetterAuthDBSchema, DBFieldAttribute } from "better-auth/db";
2
2
 
3
3
  // Manually add fields to index on for schema generation,
4
4
  // all fields in the schema specialFields are automatically indexed
@@ -13,14 +13,14 @@ export const indexFields = {
13
13
  };
14
14
 
15
15
  // Return map of unique, sortable, and reference fields
16
- const specialFields = (tables: BetterAuthDbSchema) =>
16
+ const specialFields = (tables: BetterAuthDBSchema) =>
17
17
  Object.fromEntries(
18
18
  Object.entries(tables)
19
19
  .map(([key, table]) => {
20
20
  const fields = Object.fromEntries(
21
21
  Object.entries(table.fields)
22
22
  .map(([fieldKey, field]) => [
23
- fieldKey,
23
+ field.fieldName ?? fieldKey,
24
24
  {
25
25
  ...(field.sortable ? { sortable: true } : {}),
26
26
  ...(field.unique ? { unique: true } : {}),
@@ -38,10 +38,15 @@ const specialFields = (tables: BetterAuthDbSchema) =>
38
38
  )
39
39
  );
40
40
 
41
- const mergedIndexFields = (tables: BetterAuthDbSchema) =>
41
+ const mergedIndexFields = (tables: BetterAuthDBSchema) =>
42
42
  Object.fromEntries(
43
- Object.entries(tables).map(([key]) => {
44
- const manualIndexes = indexFields[key as keyof typeof indexFields] || [];
43
+ Object.entries(tables).map(([key, table]) => {
44
+ const manualIndexes =
45
+ indexFields[key as keyof typeof indexFields]?.map((index) => {
46
+ return typeof index === "string"
47
+ ? table.fields[index]?.fieldName ?? index
48
+ : index.map((i) => table.fields[i]?.fieldName ?? i);
49
+ }) || [];
45
50
  const specialFieldIndexes = Object.keys(
46
51
  specialFields(tables)[key as keyof ReturnType<typeof specialFields>] ||
47
52
  {}
@@ -59,7 +64,7 @@ export const createSchema = async ({
59
64
  file,
60
65
  tables,
61
66
  }: {
62
- tables: BetterAuthDbSchema;
67
+ tables: BetterAuthDBSchema;
63
68
  file?: string;
64
69
  }) => {
65
70
  // stop convex esbuild from throwing over this import, only runs
@@ -94,12 +99,13 @@ export const tables = {
94
99
  Object.entries(table.fields).filter(([key]) => key !== "id")
95
100
  );
96
101
 
97
- function getType(name: string, field: FieldAttribute) {
102
+ function getType(name: string, field: DBFieldAttribute) {
98
103
  const type = field.type as
99
104
  | "string"
100
105
  | "number"
101
106
  | "boolean"
102
107
  | "date"
108
+ | "json"
103
109
  | `${"string" | "number"}[]`;
104
110
 
105
111
  const typeMap: Record<typeof type, string> = {
@@ -107,6 +113,7 @@ export const tables = {
107
113
  boolean: `v.boolean()`,
108
114
  number: `v.number()`,
109
115
  date: `v.number()`,
116
+ json: `v.string()`,
110
117
  "number[]": `v.array(v.number())`,
111
118
  "string[]": `v.array(v.string())`,
112
119
  } as const;
@@ -115,7 +122,7 @@ export const tables = {
115
122
 
116
123
  const indexes =
117
124
  mergedIndexFields(tables)[
118
- modelName as keyof typeof mergedIndexFields
125
+ tableKey as keyof typeof mergedIndexFields
119
126
  ]?.map((index) => {
120
127
  const indexArray = Array.isArray(index) ? index.sort() : [index];
121
128
  const indexName = indexArray.join("_");
@@ -126,12 +133,12 @@ export const tables = {
126
133
  ${Object.keys(fields)
127
134
  .map((field) => {
128
135
  const attr = fields[field]!;
129
- const type = getType(field, attr as FieldAttribute);
136
+ const type = getType(field, attr as DBFieldAttribute);
130
137
  const optional = (fieldSchema: string) =>
131
138
  attr.required
132
139
  ? fieldSchema
133
140
  : `v.optional(v.union(v.null(), ${fieldSchema}))`;
134
- return ` ${field}: ${optional(type)},`;
141
+ return ` ${attr.fieldName ?? field}: ${optional(type)},`;
135
142
  })
136
143
  .join("\n")}
137
144
  })${indexes.length > 0 ? `\n ${indexes.join("\n ")}` : ""},\n`;
@@ -19,7 +19,7 @@ import {
19
19
  } from "convex/server";
20
20
  import { type GenericId, Infer, v } from "convex/values";
21
21
  import { convexAdapter } from "./adapter";
22
- import { AdapterInstance, betterAuth } from "better-auth";
22
+ import { AdapterInstance, Auth, betterAuth } from "better-auth";
23
23
  import { asyncMap } from "convex-helpers";
24
24
  import { partial } from "convex-helpers/validators";
25
25
  import {
@@ -44,16 +44,19 @@ export type CreateAdapter = <Ctx extends GenericCtx<GenericDataModel>>(
44
44
  ctx: Ctx
45
45
  ) => AdapterInstance;
46
46
 
47
- export type CreateAuth<DataModel extends GenericDataModel> =
48
- | ((ctx: GenericCtx<DataModel>) => ReturnType<typeof betterAuth>)
49
- | ((
50
- ctx: GenericCtx<DataModel>,
51
- opts?: { optionsOnly?: boolean }
52
- ) => ReturnType<typeof betterAuth>);
47
+ export type CreateAuth<
48
+ DataModel extends GenericDataModel,
49
+ A extends ReturnType<typeof betterAuth> = Auth,
50
+ > =
51
+ | ((ctx: GenericCtx<DataModel>) => A)
52
+ | ((ctx: GenericCtx<DataModel>, opts?: { optionsOnly?: boolean }) => A);
53
53
 
54
- export const getStaticAuth = <DataModel extends GenericDataModel>(
55
- createAuth: CreateAuth<DataModel>
56
- ) => {
54
+ export const getStaticAuth = <
55
+ DataModel extends GenericDataModel,
56
+ Auth extends ReturnType<typeof betterAuth>,
57
+ >(
58
+ createAuth: CreateAuth<DataModel, Auth>
59
+ ): Auth => {
57
60
  return createAuth({} as any, { optionsOnly: true });
58
61
  };
59
62
 
@@ -417,11 +420,11 @@ export type Triggers<
417
420
  ) => Promise<void>;
418
421
  onUpdate?: <Ctx extends GenericMutationCtx<DataModel>>(
419
422
  ctx: Ctx,
420
- oldDoc: Infer<Schema["tables"][K]["validator"]> & {
423
+ newDoc: Infer<Schema["tables"][K]["validator"]> & {
421
424
  _id: string;
422
425
  _creationTime: number;
423
426
  },
424
- newDoc: Infer<Schema["tables"][K]["validator"]> & {
427
+ oldDoc: Infer<Schema["tables"][K]["validator"]> & {
425
428
  _id: string;
426
429
  _creationTime: number;
427
430
  }
@@ -451,10 +454,14 @@ export const createClient = <
451
454
  local?: {
452
455
  schema?: Schema;
453
456
  };
454
- authFunctions?: AuthFunctions;
455
457
  verbose?: boolean;
456
- triggers?: Triggers<DataModel, Schema>;
457
- }
458
+ } & (
459
+ | {
460
+ triggers: Triggers<DataModel, Schema>;
461
+ authFunctions: AuthFunctions;
462
+ }
463
+ | { triggers?: undefined }
464
+ )
458
465
  ) => {
459
466
  type BetterAuthDataModel = DataModelFromSchemaDefinition<Schema>;
460
467
 
@@ -1,6 +1,7 @@
1
1
  import { betterAuth } from "better-auth";
2
2
  import { createCookieGetter } from "better-auth/cookies";
3
3
  import { betterFetch } from "@better-fetch/fetch";
4
+ import * as jose from "jose";
4
5
  import {
5
6
  FunctionReference,
6
7
  FunctionReturnType,
@@ -19,6 +20,16 @@ export const getCookieName = <DataModel extends GenericDataModel>(
19
20
  return cookie.name;
20
21
  };
21
22
 
23
+ export const getCookieNames = <DataModel extends GenericDataModel>(
24
+ createAuth: CreateAuth<DataModel>
25
+ ) => {
26
+ const createCookie = createCookieGetter(getStaticAuth(createAuth).options);
27
+ return {
28
+ convexJwt: createCookie(JWT_COOKIE_NAME).name,
29
+ sessionToken: createCookie("session_token").name,
30
+ };
31
+ };
32
+
22
33
  export const setupFetchClient = async <DataModel extends GenericDataModel>(
23
34
  createAuth: CreateAuth<DataModel>,
24
35
  getCookie: (name: string) => string | undefined
@@ -95,6 +106,56 @@ export const fetchSession = async <
95
106
  };
96
107
  };
97
108
 
109
+ export const fetchAuth = async (
110
+ request: Request,
111
+ opts?: {
112
+ convexSiteUrl?: string;
113
+ verbose?: boolean;
114
+ }
115
+ ) => {
116
+ if (!request) {
117
+ throw new Error("No request found");
118
+ }
119
+ const convexSiteUrl = opts?.convexSiteUrl ?? process.env.VITE_CONVEX_SITE_URL;
120
+ if (!convexSiteUrl) {
121
+ throw new Error("VITE_CONVEX_SITE_URL is not set");
122
+ }
123
+ const { data } = await betterFetch<{ token: string }>(
124
+ "/api/auth/convex/token",
125
+ {
126
+ baseURL: convexSiteUrl,
127
+ headers: {
128
+ cookie: request.headers.get("cookie") ?? "",
129
+ },
130
+ }
131
+ );
132
+ if (!data?.token) {
133
+ return;
134
+ }
135
+ const claims = jose.decodeJwt(data.token);
136
+ return {
137
+ token: data.token,
138
+ userId: claims.sub,
139
+ };
140
+ };
141
+
142
+ export const getAuthFromCookie = (
143
+ cookie?: string,
144
+ { tolerance = 10 }: { tolerance?: number } = {}
145
+ ) => {
146
+ if (!cookie) {
147
+ return;
148
+ }
149
+ const claims = jose.decodeJwt(cookie);
150
+ const exp = claims?.exp;
151
+ const now = Math.floor(new Date().getTime() / 1000);
152
+ const isExpired = exp ? now > exp + tolerance : true;
153
+ if (isExpired) {
154
+ return;
155
+ }
156
+ return { userId: claims?.sub, token: cookie };
157
+ };
158
+
98
159
  export const getAuth = async <DataModel extends GenericDataModel>(
99
160
  request: Request,
100
161
  getCookie: (name: string) => string | undefined,