@convex-dev/better-auth 0.6.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 (181) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +44 -0
  3. package/dist/commonjs/client/adapter.d.ts +4 -0
  4. package/dist/commonjs/client/adapter.d.ts.map +1 -0
  5. package/dist/commonjs/client/adapter.js +189 -0
  6. package/dist/commonjs/client/adapter.js.map +1 -0
  7. package/dist/commonjs/client/cors.d.ts +72 -0
  8. package/dist/commonjs/client/cors.d.ts.map +1 -0
  9. package/dist/commonjs/client/cors.js +281 -0
  10. package/dist/commonjs/client/cors.js.map +1 -0
  11. package/dist/commonjs/client/index.d.ts +302 -0
  12. package/dist/commonjs/client/index.d.ts.map +1 -0
  13. package/dist/commonjs/client/index.js +232 -0
  14. package/dist/commonjs/client/index.js.map +1 -0
  15. package/dist/commonjs/client/plugins/index.d.ts +3 -0
  16. package/dist/commonjs/client/plugins/index.d.ts.map +1 -0
  17. package/dist/commonjs/client/plugins/index.js +3 -0
  18. package/dist/commonjs/client/plugins/index.js.map +1 -0
  19. package/dist/commonjs/component/_generated/api.d.ts +12 -0
  20. package/dist/commonjs/component/_generated/api.d.ts.map +1 -0
  21. package/dist/commonjs/component/_generated/api.js +22 -0
  22. package/dist/commonjs/component/_generated/api.js.map +1 -0
  23. package/dist/commonjs/component/_generated/server.d.ts +64 -0
  24. package/dist/commonjs/component/_generated/server.d.ts.map +1 -0
  25. package/dist/commonjs/component/_generated/server.js +74 -0
  26. package/dist/commonjs/component/_generated/server.js.map +1 -0
  27. package/dist/commonjs/component/convex.config.d.ts +3 -0
  28. package/dist/commonjs/component/convex.config.d.ts.map +1 -0
  29. package/dist/commonjs/component/convex.config.js +4 -0
  30. package/dist/commonjs/component/convex.config.js.map +1 -0
  31. package/dist/commonjs/component/lib.d.ts +584 -0
  32. package/dist/commonjs/component/lib.d.ts.map +1 -0
  33. package/dist/commonjs/component/lib.js +323 -0
  34. package/dist/commonjs/component/lib.js.map +1 -0
  35. package/dist/commonjs/component/schema.d.ts +116 -0
  36. package/dist/commonjs/component/schema.d.ts.map +1 -0
  37. package/dist/commonjs/component/schema.js +68 -0
  38. package/dist/commonjs/component/schema.js.map +1 -0
  39. package/dist/commonjs/component/util.d.ts +394 -0
  40. package/dist/commonjs/component/util.d.ts.map +1 -0
  41. package/dist/commonjs/component/util.js +4 -0
  42. package/dist/commonjs/component/util.js.map +1 -0
  43. package/dist/commonjs/nextjs/index.d.ts +10 -0
  44. package/dist/commonjs/nextjs/index.d.ts.map +1 -0
  45. package/dist/commonjs/nextjs/index.js +23 -0
  46. package/dist/commonjs/nextjs/index.js.map +1 -0
  47. package/dist/commonjs/package.json +3 -0
  48. package/dist/commonjs/plugins/convex/client.d.ts +6 -0
  49. package/dist/commonjs/plugins/convex/client.d.ts.map +1 -0
  50. package/dist/commonjs/plugins/convex/client.js +7 -0
  51. package/dist/commonjs/plugins/convex/client.js.map +1 -0
  52. package/dist/commonjs/plugins/convex/index.d.ts +280 -0
  53. package/dist/commonjs/plugins/convex/index.d.ts.map +1 -0
  54. package/dist/commonjs/plugins/convex/index.js +253 -0
  55. package/dist/commonjs/plugins/convex/index.js.map +1 -0
  56. package/dist/commonjs/plugins/cross-domain/client.d.ts +123 -0
  57. package/dist/commonjs/plugins/cross-domain/client.d.ts.map +1 -0
  58. package/dist/commonjs/plugins/cross-domain/client.js +164 -0
  59. package/dist/commonjs/plugins/cross-domain/client.js.map +1 -0
  60. package/dist/commonjs/plugins/cross-domain/index.d.ts +81 -0
  61. package/dist/commonjs/plugins/cross-domain/index.d.ts.map +1 -0
  62. package/dist/commonjs/plugins/cross-domain/index.js +135 -0
  63. package/dist/commonjs/plugins/cross-domain/index.js.map +1 -0
  64. package/dist/commonjs/plugins/index.d.ts +3 -0
  65. package/dist/commonjs/plugins/index.d.ts.map +1 -0
  66. package/dist/commonjs/plugins/index.js +3 -0
  67. package/dist/commonjs/plugins/index.js.map +1 -0
  68. package/dist/commonjs/react/client.d.ts +31 -0
  69. package/dist/commonjs/react/client.d.ts.map +1 -0
  70. package/dist/commonjs/react/client.js +102 -0
  71. package/dist/commonjs/react/client.js.map +1 -0
  72. package/dist/commonjs/react/index.d.ts +9 -0
  73. package/dist/commonjs/react/index.d.ts.map +1 -0
  74. package/dist/commonjs/react/index.js +15 -0
  75. package/dist/commonjs/react/index.js.map +1 -0
  76. package/dist/commonjs/react-start/index.d.ts +10 -0
  77. package/dist/commonjs/react-start/index.d.ts.map +1 -0
  78. package/dist/commonjs/react-start/index.js +32 -0
  79. package/dist/commonjs/react-start/index.js.map +1 -0
  80. package/dist/esm/client/adapter.d.ts +4 -0
  81. package/dist/esm/client/adapter.d.ts.map +1 -0
  82. package/dist/esm/client/adapter.js +189 -0
  83. package/dist/esm/client/adapter.js.map +1 -0
  84. package/dist/esm/client/cors.d.ts +72 -0
  85. package/dist/esm/client/cors.d.ts.map +1 -0
  86. package/dist/esm/client/cors.js +281 -0
  87. package/dist/esm/client/cors.js.map +1 -0
  88. package/dist/esm/client/index.d.ts +302 -0
  89. package/dist/esm/client/index.d.ts.map +1 -0
  90. package/dist/esm/client/index.js +232 -0
  91. package/dist/esm/client/index.js.map +1 -0
  92. package/dist/esm/client/plugins/index.d.ts +3 -0
  93. package/dist/esm/client/plugins/index.d.ts.map +1 -0
  94. package/dist/esm/client/plugins/index.js +3 -0
  95. package/dist/esm/client/plugins/index.js.map +1 -0
  96. package/dist/esm/component/_generated/api.d.ts +12 -0
  97. package/dist/esm/component/_generated/api.d.ts.map +1 -0
  98. package/dist/esm/component/_generated/api.js +22 -0
  99. package/dist/esm/component/_generated/api.js.map +1 -0
  100. package/dist/esm/component/_generated/server.d.ts +64 -0
  101. package/dist/esm/component/_generated/server.d.ts.map +1 -0
  102. package/dist/esm/component/_generated/server.js +74 -0
  103. package/dist/esm/component/_generated/server.js.map +1 -0
  104. package/dist/esm/component/convex.config.d.ts +3 -0
  105. package/dist/esm/component/convex.config.d.ts.map +1 -0
  106. package/dist/esm/component/convex.config.js +4 -0
  107. package/dist/esm/component/convex.config.js.map +1 -0
  108. package/dist/esm/component/lib.d.ts +584 -0
  109. package/dist/esm/component/lib.d.ts.map +1 -0
  110. package/dist/esm/component/lib.js +323 -0
  111. package/dist/esm/component/lib.js.map +1 -0
  112. package/dist/esm/component/schema.d.ts +116 -0
  113. package/dist/esm/component/schema.d.ts.map +1 -0
  114. package/dist/esm/component/schema.js +68 -0
  115. package/dist/esm/component/schema.js.map +1 -0
  116. package/dist/esm/component/util.d.ts +394 -0
  117. package/dist/esm/component/util.d.ts.map +1 -0
  118. package/dist/esm/component/util.js +4 -0
  119. package/dist/esm/component/util.js.map +1 -0
  120. package/dist/esm/nextjs/index.d.ts +10 -0
  121. package/dist/esm/nextjs/index.d.ts.map +1 -0
  122. package/dist/esm/nextjs/index.js +23 -0
  123. package/dist/esm/nextjs/index.js.map +1 -0
  124. package/dist/esm/package.json +3 -0
  125. package/dist/esm/plugins/convex/client.d.ts +6 -0
  126. package/dist/esm/plugins/convex/client.d.ts.map +1 -0
  127. package/dist/esm/plugins/convex/client.js +7 -0
  128. package/dist/esm/plugins/convex/client.js.map +1 -0
  129. package/dist/esm/plugins/convex/index.d.ts +280 -0
  130. package/dist/esm/plugins/convex/index.d.ts.map +1 -0
  131. package/dist/esm/plugins/convex/index.js +253 -0
  132. package/dist/esm/plugins/convex/index.js.map +1 -0
  133. package/dist/esm/plugins/cross-domain/client.d.ts +123 -0
  134. package/dist/esm/plugins/cross-domain/client.d.ts.map +1 -0
  135. package/dist/esm/plugins/cross-domain/client.js +164 -0
  136. package/dist/esm/plugins/cross-domain/client.js.map +1 -0
  137. package/dist/esm/plugins/cross-domain/index.d.ts +81 -0
  138. package/dist/esm/plugins/cross-domain/index.d.ts.map +1 -0
  139. package/dist/esm/plugins/cross-domain/index.js +135 -0
  140. package/dist/esm/plugins/cross-domain/index.js.map +1 -0
  141. package/dist/esm/plugins/index.d.ts +3 -0
  142. package/dist/esm/plugins/index.d.ts.map +1 -0
  143. package/dist/esm/plugins/index.js +3 -0
  144. package/dist/esm/plugins/index.js.map +1 -0
  145. package/dist/esm/react/client.d.ts +31 -0
  146. package/dist/esm/react/client.d.ts.map +1 -0
  147. package/dist/esm/react/client.js +102 -0
  148. package/dist/esm/react/client.js.map +1 -0
  149. package/dist/esm/react/index.d.ts +9 -0
  150. package/dist/esm/react/index.d.ts.map +1 -0
  151. package/dist/esm/react/index.js +15 -0
  152. package/dist/esm/react/index.js.map +1 -0
  153. package/dist/esm/react-start/index.d.ts +10 -0
  154. package/dist/esm/react-start/index.d.ts.map +1 -0
  155. package/dist/esm/react-start/index.js +32 -0
  156. package/dist/esm/react-start/index.js.map +1 -0
  157. package/package.json +161 -0
  158. package/plugins/package.json +5 -0
  159. package/react/package.json +5 -0
  160. package/src/client/adapter.ts +236 -0
  161. package/src/client/cors.ts +403 -0
  162. package/src/client/index.ts +381 -0
  163. package/src/client/plugins/index.ts +2 -0
  164. package/src/component/_generated/api.d.ts +313 -0
  165. package/src/component/_generated/api.js +23 -0
  166. package/src/component/_generated/dataModel.d.ts +60 -0
  167. package/src/component/_generated/server.d.ts +149 -0
  168. package/src/component/_generated/server.js +90 -0
  169. package/src/component/convex.config.ts +5 -0
  170. package/src/component/lib.ts +391 -0
  171. package/src/component/schema.ts +74 -0
  172. package/src/component/util.ts +4 -0
  173. package/src/nextjs/index.ts +30 -0
  174. package/src/plugins/convex/client.ts +9 -0
  175. package/src/plugins/convex/index.ts +296 -0
  176. package/src/plugins/cross-domain/client.ts +209 -0
  177. package/src/plugins/cross-domain/index.ts +156 -0
  178. package/src/plugins/index.ts +2 -0
  179. package/src/react/client.tsx +184 -0
  180. package/src/react/index.tsx +38 -0
  181. package/src/react-start/index.ts +51 -0
@@ -0,0 +1,32 @@
1
+ import { createCookieGetter } from "better-auth/cookies";
2
+ import { betterFetch } from "@better-fetch/fetch";
3
+ export const getCookieName = async (createAuth) => {
4
+ const auth = createAuth({});
5
+ const createCookie = createCookieGetter(auth.options);
6
+ const cookie = createCookie("convex_jwt");
7
+ return cookie.name;
8
+ };
9
+ export const fetchSession = async (createAuth, request) => {
10
+ if (!request) {
11
+ throw new Error("No request found");
12
+ }
13
+ const baseURL = new URL(request.url).origin;
14
+ const { data: session } = await betterFetch("/api/auth/get-session", {
15
+ baseURL,
16
+ headers: {
17
+ cookie: request.headers.get("cookie") ?? "",
18
+ origin: baseURL,
19
+ },
20
+ });
21
+ return {
22
+ session,
23
+ };
24
+ };
25
+ export const reactStartHandler = (request, opts) => {
26
+ const convexSiteUrl = opts?.convexSiteUrl ?? process.env.CONVEX_SITE_URL;
27
+ const requestUrl = new URL(request.url);
28
+ const nextUrl = `${convexSiteUrl}${requestUrl.pathname}${requestUrl.search}`;
29
+ request.headers.set("accept-encoding", "application/json");
30
+ return fetch(nextUrl, new Request(request, { redirect: "manual" }));
31
+ };
32
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
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;AAGlD,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAChC,UAAyE,EACzE,EAAE;IACF,MAAM,IAAI,GAAG,UAAU,CAAC,EAAS,CAAC,CAAC;IACnC,MAAM,YAAY,GAAG,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;IAC1C,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAG/B,UAAa,EACb,OAAiB,EACjB,EAAE;IAGF,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACtC,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,WAAW,CACzC,uBAAuB,EACvB;QACE,OAAO;QACP,OAAO,EAAE;YACP,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE;YAC3C,MAAM,EAAE,OAAO;SAChB;KACF,CACF,CAAC;IACF,OAAO;QACL,OAAO;KACR,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,OAAgB,EAChB,IAAiC,EACjC,EAAE;IACF,MAAM,aAAa,GAAG,IAAI,EAAE,aAAa,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IACzE,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,GAAG,aAAa,GAAG,UAAU,CAAC,QAAQ,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC;IAC7E,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,kBAAkB,CAAC,CAAC;IAC3D,OAAO,KAAK,CAAC,OAAO,EAAE,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;AACtE,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { BetterAuth } from "./index.js";
2
+ import { GenericActionCtx, GenericMutationCtx, GenericQueryCtx } from "convex/server";
3
+ export declare const convexAdapter: <Ctx extends GenericQueryCtx<any> | GenericMutationCtx<any> | GenericActionCtx<any>>(ctx: Ctx, component: BetterAuth) => (options: import("better-auth").BetterAuthOptions) => import("better-auth").Adapter;
4
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/client/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAGrC,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EAChB,MAAM,eAAe,CAAC;AAEvB,eAAO,MAAM,aAAa,GACxB,GAAG,SACC,eAAe,CAAC,GAAG,CAAC,GACpB,kBAAkB,CAAC,GAAG,CAAC,GACvB,gBAAgB,CAAC,GAAG,CAAC,EAEzB,KAAK,GAAG,EACR,WAAW,UAAU,wFA2NnB,CAAC"}
@@ -0,0 +1,189 @@
1
+ import { transformInput } from "../component/lib.js";
2
+ import { createAdapter } from "better-auth/adapters";
3
+ export const convexAdapter = (ctx, component) => createAdapter({
4
+ config: {
5
+ adapterId: "convex",
6
+ adapterName: "Convex Adapter",
7
+ debugLogs: component.config.verbose ?? false,
8
+ disableIdGeneration: true,
9
+ },
10
+ adapter: ({ schema }) => {
11
+ return {
12
+ id: "convex",
13
+ create: async ({ model, data, select }) => {
14
+ if (!("runMutation" in ctx)) {
15
+ throw new Error("ctx is not an action ctx");
16
+ }
17
+ if (select) {
18
+ throw new Error("select is not supported");
19
+ }
20
+ const createFn = model === "user"
21
+ ? component.config.authFunctions.createUser
22
+ : model === "session"
23
+ ? component.config.authFunctions.createSession
24
+ : component.component.lib.create;
25
+ return ctx.runMutation(createFn, {
26
+ input: { table: model, ...transformInput(model, data) },
27
+ });
28
+ },
29
+ findOne: async ({ model, where }) => {
30
+ if (where.length === 1 && where[0].operator === "eq") {
31
+ const { value, field } = where[0];
32
+ const result = await ctx.runQuery(component.component.lib.getBy, {
33
+ table: model,
34
+ field,
35
+ unique: field === "id" ? true : schema[model].fields[field].unique,
36
+ value: value instanceof Date ? value.getTime() : value,
37
+ });
38
+ return result;
39
+ }
40
+ if (model === "account" &&
41
+ where.length === 2 &&
42
+ where[0].field === "accountId" &&
43
+ where[1].field === "providerId" &&
44
+ where[0].connector === "AND") {
45
+ return ctx.runQuery(component.component.lib.getAccountByAccountIdAndProviderId, {
46
+ accountId: where[0].value,
47
+ providerId: where[1].value,
48
+ });
49
+ }
50
+ throw new Error("where clause not supported");
51
+ },
52
+ findMany: async ({ model, where, sortBy, offset, limit, }) => {
53
+ if (offset) {
54
+ throw new Error("where clause not supported");
55
+ }
56
+ if (model === "jwks" &&
57
+ !where &&
58
+ (!sortBy ||
59
+ (sortBy?.field === "createdAt" && sortBy?.direction === "desc"))) {
60
+ return ctx.runQuery(component.component.lib.getJwks, { limit });
61
+ }
62
+ if (where?.length !== 1 || where[0].operator !== "eq") {
63
+ throw new Error("where clause not supported");
64
+ }
65
+ if (offset) {
66
+ throw new Error("offset not supported");
67
+ }
68
+ if (model === "account" && where[0].field === "userId") {
69
+ return ctx.runQuery(component.component.lib.getAccountsByUserId, {
70
+ userId: where[0].value,
71
+ limit,
72
+ });
73
+ }
74
+ if (model === "verification" && where[0].field === "identifier") {
75
+ return ctx.runQuery(component.component.lib.listVerificationsByIdentifier, {
76
+ identifier: where[0].value,
77
+ sortBy,
78
+ limit,
79
+ });
80
+ }
81
+ throw new Error("where clause not supported");
82
+ },
83
+ count: async ({ where }) => {
84
+ throw new Error("count not implemented");
85
+ // return 0;
86
+ },
87
+ update: async ({ model, where, update }) => {
88
+ if (!("runMutation" in ctx)) {
89
+ throw new Error("ctx is not an action ctx");
90
+ }
91
+ if (where?.length === 1 && where[0].operator === "eq") {
92
+ const { value, field } = where[0];
93
+ const updateFn = model === "user"
94
+ ? component.config.authFunctions.updateUser
95
+ : component.component.lib.update;
96
+ return ctx.runMutation(updateFn, {
97
+ input: {
98
+ table: model,
99
+ where: {
100
+ field,
101
+ value: value instanceof Date ? value.getTime() : value,
102
+ },
103
+ value: transformInput(model, update),
104
+ },
105
+ });
106
+ }
107
+ throw new Error("where clause not supported");
108
+ },
109
+ delete: async ({ model, where }) => {
110
+ if (!("runMutation" in ctx)) {
111
+ throw new Error("ctx is not an action ctx");
112
+ }
113
+ if (where?.length === 1 && where[0].operator === "eq") {
114
+ const { field, value } = where[0];
115
+ const deleteFn = model === "user"
116
+ ? component.config.authFunctions.deleteUser
117
+ : component.component.lib.deleteBy;
118
+ await ctx.runMutation(deleteFn, {
119
+ table: model,
120
+ field,
121
+ value: value instanceof Date ? value.getTime() : value,
122
+ });
123
+ return;
124
+ }
125
+ throw new Error("where clause not supported");
126
+ // return null
127
+ },
128
+ deleteMany: async ({ model, where }) => {
129
+ if (!("runAction" in ctx)) {
130
+ throw new Error("ctx is not an action ctx");
131
+ }
132
+ if (model === "verification" &&
133
+ where?.length === 1 &&
134
+ where[0].operator === "lt" &&
135
+ where[0].field === "expiresAt") {
136
+ return ctx.runAction(component.component.lib.deleteOldVerifications, {
137
+ currentTimestamp: Date.now(),
138
+ });
139
+ }
140
+ if (where?.length === 1 && where[0].field === "userId") {
141
+ return ctx.runAction(component.component.lib.deleteAllForUser, {
142
+ table: model,
143
+ userId: where[0].value,
144
+ });
145
+ }
146
+ throw new Error("where clause not supported");
147
+ // return count;
148
+ },
149
+ updateMany: async ({ model, where, update }) => {
150
+ if (!("runMutation" in ctx)) {
151
+ throw new Error("ctx is not an action ctx");
152
+ }
153
+ if (model === "twoFactor" &&
154
+ where?.length === 1 &&
155
+ where[0].operator === "eq" &&
156
+ where[0].field === "userId") {
157
+ return ctx.runMutation(component.component.lib.updateTwoFactor, {
158
+ userId: where[0].value,
159
+ update: transformInput(model, update),
160
+ });
161
+ }
162
+ if (model === "account" &&
163
+ where?.length === 2 &&
164
+ where[0].operator === "eq" &&
165
+ where[0].connector === "AND" &&
166
+ where[0].field === "userId" &&
167
+ where[1].field === "providerId") {
168
+ return ctx.runMutation(component.component.lib.updateUserProviderAccounts, {
169
+ userId: where[0].value,
170
+ providerId: where[1].value,
171
+ update: transformInput(model, update),
172
+ });
173
+ }
174
+ throw new Error("updateMany not implemented");
175
+ //return 0;
176
+ /*
177
+ const { model, where, update } = data;
178
+ const table = db[model];
179
+ const res = convertWhereClause(where, table, model);
180
+ res.forEach((record) => {
181
+ Object.assign(record, update);
182
+ });
183
+ return res[0] || null;
184
+ */
185
+ },
186
+ };
187
+ },
188
+ });
189
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/client/adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * This file defines a CorsHttpRouter class that extends Convex's HttpRouter.
3
+ * It provides CORS (Cross-Origin Resource Sharing) support for HTTP routes.
4
+ *
5
+ * The CorsHttpRouter:
6
+ * 1. Allows specifying allowed origins for CORS.
7
+ * 2. Overrides the route method to add CORS headers to all non-OPTIONS requests.
8
+ * 3. Automatically adds an OPTIONS route to handle CORS preflight requests.
9
+ * 4. Uses the handleCors helper function to apply CORS headers consistently.
10
+ *
11
+ * This router simplifies the process of making Convex HTTP endpoints
12
+ * accessible to web applications hosted on different domains while
13
+ * maintaining proper CORS configuration.
14
+ */
15
+ import { HttpRouter, RouteSpec } from "convex/server";
16
+ export declare const DEFAULT_EXPOSED_HEADERS: string[];
17
+ export type CorsConfig = {
18
+ /**
19
+ * Whether to allow credentials in the request.
20
+ * When true, the request can include cookies and authentication headers.
21
+ * @default false
22
+ */
23
+ allowCredentials?: boolean;
24
+ /**
25
+ * An array of allowed origins: what domains are allowed to make requests.
26
+ * For example, ["https://example.com"] would only allow requests from
27
+ * https://example.com.
28
+ * You can also use wildcards to allow all subdomains of a given domain.
29
+ * E.g. ["*.example.com"] would allow requests from:
30
+ * - https://subdomain.example.com
31
+ * - https://example.com
32
+ * @default ["*"]
33
+ */
34
+ allowedOrigins?: string[];
35
+ /**
36
+ * An array of allowed headers: what headers are allowed to be sent in
37
+ * the request.
38
+ * @default ["Content-Type"]
39
+ */
40
+ allowedHeaders?: string[];
41
+ /**
42
+ * An array of exposed headers: what headers are allowed to be sent in
43
+ * the response.
44
+ * Note: if you pass in an empty array, it will not expose any headers.
45
+ * If you want to extend the default exposed headers, you can do so by
46
+ * passing in [...DEFAULT_EXPOSED_HEADERS, ...yourHeaders].
47
+ * @default {@link DEFAULT_EXPOSED_HEADERS}
48
+ */
49
+ exposedHeaders?: string[];
50
+ /**
51
+ * The maximum age of the preflight request in seconds.
52
+ * @default 86400 (1 day)
53
+ */
54
+ browserCacheMaxAge?: number;
55
+ /**
56
+ * Whether to log verbose information about CORS requests.
57
+ * @default false
58
+ */
59
+ verbose?: boolean;
60
+ };
61
+ type RouteSpecWithCors = RouteSpec & CorsConfig;
62
+ /**
63
+ * Factory function to create a router that adds CORS support to routes.
64
+ * @param allowedOrigins An array of allowed origins for CORS.
65
+ * @returns A function to use instead of http.route when you want CORS.
66
+ */
67
+ export declare const corsRouter: (http: HttpRouter, corsConfig?: CorsConfig) => {
68
+ http: HttpRouter;
69
+ route: (routeSpec: RouteSpecWithCors) => void;
70
+ };
71
+ export default corsRouter;
72
+ //# sourceMappingURL=cors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cors.d.ts","sourceRoot":"","sources":["../../../src/client/cors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAIL,UAAU,EAEV,SAAS,EAGV,MAAM,eAAe,CAAC;AAEvB,eAAO,MAAM,uBAAuB,UAInC,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;;;;;;;OASG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B;;;;;;;OAOG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,KAAK,iBAAiB,GAAG,SAAS,GAAG,UAAU,CAAC;AAEhD;;;;GAIG;AACH,eAAO,MAAM,UAAU,GAAI,MAAM,UAAU,EAAE,aAAa,UAAU;;uBAK7C,iBAAiB,KAAG,IAAI;CAsD9C,CAAC;AA+DF,eAAe,UAAU,CAAC"}
@@ -0,0 +1,281 @@
1
+ /**
2
+ * This file defines a CorsHttpRouter class that extends Convex's HttpRouter.
3
+ * It provides CORS (Cross-Origin Resource Sharing) support for HTTP routes.
4
+ *
5
+ * The CorsHttpRouter:
6
+ * 1. Allows specifying allowed origins for CORS.
7
+ * 2. Overrides the route method to add CORS headers to all non-OPTIONS requests.
8
+ * 3. Automatically adds an OPTIONS route to handle CORS preflight requests.
9
+ * 4. Uses the handleCors helper function to apply CORS headers consistently.
10
+ *
11
+ * This router simplifies the process of making Convex HTTP endpoints
12
+ * accessible to web applications hosted on different domains while
13
+ * maintaining proper CORS configuration.
14
+ */
15
+ import { httpActionGeneric, httpRouter, } from "convex/server";
16
+ export const DEFAULT_EXPOSED_HEADERS = [
17
+ // For Range requests
18
+ "Content-Range",
19
+ "Accept-Ranges",
20
+ ];
21
+ /**
22
+ * Factory function to create a router that adds CORS support to routes.
23
+ * @param allowedOrigins An array of allowed origins for CORS.
24
+ * @returns A function to use instead of http.route when you want CORS.
25
+ */
26
+ export const corsRouter = (http, corsConfig) => {
27
+ const allowedExactMethodsByPath = new Map();
28
+ const allowedPrefixMethodsByPath = new Map();
29
+ return {
30
+ http,
31
+ route: (routeSpec) => {
32
+ const tempRouter = httpRouter();
33
+ tempRouter.exactRoutes = http.exactRoutes;
34
+ tempRouter.prefixRoutes = http.prefixRoutes;
35
+ const config = {
36
+ ...corsConfig,
37
+ ...routeSpec,
38
+ };
39
+ const httpCorsHandler = handleCors({
40
+ originalHandler: routeSpec.handler,
41
+ allowedMethods: [routeSpec.method],
42
+ ...config,
43
+ });
44
+ /**
45
+ * Figure out what kind of route we're adding: exact or prefix and handle
46
+ * accordingly.
47
+ */
48
+ if ("path" in routeSpec) {
49
+ let methods = allowedExactMethodsByPath.get(routeSpec.path);
50
+ if (!methods) {
51
+ methods = new Set();
52
+ allowedExactMethodsByPath.set(routeSpec.path, methods);
53
+ }
54
+ methods.add(routeSpec.method);
55
+ tempRouter.route({
56
+ path: routeSpec.path,
57
+ method: routeSpec.method,
58
+ handler: httpCorsHandler,
59
+ });
60
+ handleExactRoute(tempRouter, routeSpec, config, Array.from(methods));
61
+ }
62
+ else {
63
+ let methods = allowedPrefixMethodsByPath.get(routeSpec.pathPrefix);
64
+ if (!methods) {
65
+ methods = new Set();
66
+ allowedPrefixMethodsByPath.set(routeSpec.pathPrefix, methods);
67
+ }
68
+ methods.add(routeSpec.method);
69
+ tempRouter.route({
70
+ pathPrefix: routeSpec.pathPrefix,
71
+ method: routeSpec.method,
72
+ handler: httpCorsHandler,
73
+ });
74
+ handlePrefixRoute(tempRouter, routeSpec, config, Array.from(methods));
75
+ }
76
+ /**
77
+ * Copy the routes from the temporary router to the main router.
78
+ */
79
+ http.exactRoutes = new Map(tempRouter.exactRoutes);
80
+ http.prefixRoutes = new Map(tempRouter.prefixRoutes);
81
+ },
82
+ };
83
+ };
84
+ /**
85
+ * Handles exact route matching and adds OPTIONS handler.
86
+ * @param tempRouter Temporary router instance.
87
+ * @param routeSpec Route specification for exact matching.
88
+ */
89
+ function handleExactRoute(tempRouter, routeSpec, config, allowedMethods) {
90
+ const currentMethodsForPath = tempRouter.exactRoutes.get(routeSpec.path);
91
+ /**
92
+ * Add the OPTIONS handler for the given path
93
+ */
94
+ const optionsHandler = createOptionsHandlerForMethods(allowedMethods, config);
95
+ currentMethodsForPath?.set("OPTIONS", optionsHandler);
96
+ tempRouter.exactRoutes.set(routeSpec.path, new Map(currentMethodsForPath));
97
+ }
98
+ /**
99
+ * Handles prefix route matching and adds OPTIONS handler.
100
+ * @param tempRouter Temporary router instance.
101
+ * @param routeSpec Route specification for prefix matching.
102
+ */
103
+ function handlePrefixRoute(tempRouter, routeSpec, config, allowedMethods) {
104
+ /**
105
+ * prefixRoutes is structured differently than exactRoutes. It's defined as
106
+ * a Map<string, Map<string, PublicHttpAction>> where the KEY is the
107
+ * METHOD and the VALUE is a map of paths and handlers.
108
+ */
109
+ const optionsHandler = createOptionsHandlerForMethods(allowedMethods, config);
110
+ const optionsPrefixes = tempRouter.prefixRoutes.get("OPTIONS") ||
111
+ new Map();
112
+ optionsPrefixes.set(routeSpec.pathPrefix, optionsHandler);
113
+ tempRouter.prefixRoutes.set("OPTIONS", optionsPrefixes);
114
+ }
115
+ /**
116
+ * Creates an OPTIONS handler for the given HTTP methods.
117
+ * @param methods Array of HTTP methods to be allowed.
118
+ * @returns A CORS-enabled OPTIONS handler.
119
+ */
120
+ function createOptionsHandlerForMethods(methods, config) {
121
+ return handleCors({
122
+ ...config,
123
+ allowedMethods: methods,
124
+ });
125
+ }
126
+ export default corsRouter;
127
+ /**
128
+ * handleCors() is a higher-order function that wraps a Convex HTTP action handler to add CORS support.
129
+ * It allows for customization of allowed HTTP methods and origins for cross-origin requests.
130
+ *
131
+ * The function:
132
+ * 1. Validates and normalizes the allowed HTTP methods.
133
+ * 2. Generates appropriate CORS headers based on the provided configuration.
134
+ * 3. Handles preflight OPTIONS requests automatically.
135
+ * 4. Wraps the original handler to add CORS headers to its response.
136
+ *
137
+ * This helper simplifies the process of making Convex HTTP actions accessible
138
+ * to web applications hosted on different domains.
139
+ */
140
+ import { ROUTABLE_HTTP_METHODS } from "convex/server";
141
+ const SECONDS_IN_A_DAY = 60 * 60 * 24;
142
+ /**
143
+ * Example CORS origins:
144
+ * - "*" (allow all origins)
145
+ * - "https://example.com" (allow a specific domain)
146
+ * - "https://*.example.com" (allow all subdomains of example.com)
147
+ * - "https://example1.com, https://example2.com" (allow multiple specific domains)
148
+ * - "null" (allow requests from data URLs or local files)
149
+ */
150
+ const handleCors = ({ originalHandler, allowedMethods = ["OPTIONS"], allowedOrigins = ["*"], allowedHeaders = ["Content-Type"], exposedHeaders = DEFAULT_EXPOSED_HEADERS, allowCredentials = false, browserCacheMaxAge = SECONDS_IN_A_DAY, verbose = false, }) => {
151
+ const uniqueMethods = Array.from(new Set(allowedMethods.map((method) => method.toUpperCase())));
152
+ const filteredMethods = uniqueMethods.filter((method) => ROUTABLE_HTTP_METHODS.includes(method));
153
+ if (filteredMethods.length === 0) {
154
+ throw new Error("No valid HTTP methods provided");
155
+ }
156
+ /**
157
+ * Ensure OPTIONS is not duplicated if it was passed in
158
+ * E.g. if allowedMethods = ["GET", "OPTIONS"]
159
+ */
160
+ const allowMethods = filteredMethods.includes("OPTIONS")
161
+ ? filteredMethods.join(", ")
162
+ : [...filteredMethods].join(", ");
163
+ /**
164
+ * Build up the set of CORS headers
165
+ */
166
+ const commonHeaders = {
167
+ Vary: "Origin",
168
+ };
169
+ if (allowCredentials) {
170
+ commonHeaders["Access-Control-Allow-Credentials"] = "true";
171
+ }
172
+ if (exposedHeaders.length > 0) {
173
+ commonHeaders["Access-Control-Expose-Headers"] = exposedHeaders.join(", ");
174
+ }
175
+ // Helper function to check if origin is allowed (including wildcard subdomain matching)
176
+ function isAllowedOrigin(requestOrigin) {
177
+ return allowedOrigins.some((allowed) => {
178
+ if (allowed === "*")
179
+ return true;
180
+ if (allowed === requestOrigin)
181
+ return true;
182
+ if (allowed.startsWith("*.")) {
183
+ const wildcardDomain = allowed.slice(1); // ".bar.com"
184
+ const rootDomain = allowed.slice(2); // "bar.com"
185
+ try {
186
+ const url = new URL(requestOrigin);
187
+ return (url.protocol === "https:" &&
188
+ (url.hostname.endsWith(wildcardDomain) ||
189
+ url.hostname === rootDomain));
190
+ }
191
+ catch {
192
+ return false; // Invalid URL format
193
+ }
194
+ }
195
+ return false;
196
+ });
197
+ }
198
+ /**
199
+ * Return our modified HTTP action
200
+ */
201
+ return httpActionGeneric(async (ctx, request) => {
202
+ if (verbose) {
203
+ console.log("path", request.url);
204
+ console.log("origin", request.headers.get("origin"));
205
+ console.log("headers", request.headers);
206
+ }
207
+ const requestOriginRaw = request.headers.get("Origin") ??
208
+ request.headers.get("Referer") ??
209
+ request.headers.get("Expo-Origin");
210
+ const requestOrigin = typeof requestOriginRaw === "string" &&
211
+ requestOriginRaw.startsWith("http")
212
+ ? new URL(requestOriginRaw).origin
213
+ : requestOriginRaw;
214
+ // Handle origin matching
215
+ let allowOrigins = null;
216
+ if (allowedOrigins.includes("*") && !allowCredentials) {
217
+ allowOrigins = "*";
218
+ }
219
+ else if (requestOrigin) {
220
+ // Check if the request origin matches any of the allowed origins
221
+ // (including wildcard subdomain matching if configured)
222
+ if (isAllowedOrigin(requestOrigin)) {
223
+ allowOrigins = requestOrigin;
224
+ }
225
+ }
226
+ if (!allowOrigins) {
227
+ // Origin not allowed
228
+ console.error(`Request from origin ${requestOrigin} blocked, missing from allowed origins (${allowedOrigins.join()})`);
229
+ return new Response(null, { status: 403 });
230
+ }
231
+ /**
232
+ * OPTIONS has no handler and just returns headers
233
+ */
234
+ if (request.method === "OPTIONS") {
235
+ return new Response(null, {
236
+ status: 204,
237
+ headers: new Headers({
238
+ ...commonHeaders,
239
+ "Access-Control-Allow-Origin": allowOrigins,
240
+ "Access-Control-Allow-Methods": allowMethods,
241
+ "Access-Control-Allow-Headers": allowedHeaders.join(", "),
242
+ "Access-Control-Max-Age": browserCacheMaxAge.toString(),
243
+ }),
244
+ });
245
+ }
246
+ /**
247
+ * If the method is not OPTIONS, it must pass a handler
248
+ */
249
+ if (!originalHandler) {
250
+ throw new Error("No PublicHttpAction provider to CORS handler");
251
+ }
252
+ /**
253
+ * First, execute the original handler
254
+ */
255
+ const innerHandler = ("_handler" in originalHandler
256
+ ? originalHandler["_handler"]
257
+ : originalHandler);
258
+ const originalResponse = await innerHandler(ctx, request);
259
+ /**
260
+ * Second, get a copy of the original response's headers
261
+ */
262
+ const newHeaders = new Headers(originalResponse.headers);
263
+ newHeaders.set("Access-Control-Allow-Origin", allowOrigins);
264
+ /**
265
+ * Third, add or update our CORS headers
266
+ */
267
+ Object.entries(commonHeaders).forEach(([key, value]) => {
268
+ newHeaders.set(key, value);
269
+ });
270
+ /**
271
+ * Fourth, return the modified Response.
272
+ * A Response object is immutable, so we create a new one to return here.
273
+ */
274
+ return new Response(originalResponse.body, {
275
+ status: originalResponse.status,
276
+ statusText: originalResponse.statusText,
277
+ headers: newHeaders,
278
+ });
279
+ });
280
+ };
281
+ //# sourceMappingURL=cors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cors.js","sourceRoot":"","sources":["../../../src/client/cors.ts"],"names":[],"mappings":"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"}