convex-zen 0.0.1
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.
- package/dist/cli/generate.d.ts +14 -0
- package/dist/cli/generate.d.ts.map +1 -0
- package/dist/cli/generate.js +297 -0
- package/dist/cli/generate.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +111 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/client/index.d.ts +300 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +434 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/plugins/admin.d.ts +92 -0
- package/dist/client/plugins/admin.d.ts.map +1 -0
- package/dist/client/plugins/admin.js +165 -0
- package/dist/client/plugins/admin.js.map +1 -0
- package/dist/client/primitives.d.ts +57 -0
- package/dist/client/primitives.d.ts.map +1 -0
- package/dist/client/primitives.js +64 -0
- package/dist/client/primitives.js.map +1 -0
- package/dist/client/providers.d.ts +14 -0
- package/dist/client/providers.d.ts.map +1 -0
- package/dist/client/providers.js +25 -0
- package/dist/client/providers.js.map +1 -0
- package/dist/client/react.d.ts +23 -0
- package/dist/client/react.d.ts.map +1 -0
- package/dist/client/react.js +48 -0
- package/dist/client/react.js.map +1 -0
- package/dist/client/tanstack-start-client-plugins.d.ts +34 -0
- package/dist/client/tanstack-start-client-plugins.d.ts.map +1 -0
- package/dist/client/tanstack-start-client-plugins.js +32 -0
- package/dist/client/tanstack-start-client-plugins.js.map +1 -0
- package/dist/client/tanstack-start-client.d.ts +52 -0
- package/dist/client/tanstack-start-client.d.ts.map +1 -0
- package/dist/client/tanstack-start-client.js +130 -0
- package/dist/client/tanstack-start-client.js.map +1 -0
- package/dist/client/tanstack-start-plugins.d.ts +27 -0
- package/dist/client/tanstack-start-plugins.d.ts.map +1 -0
- package/dist/client/tanstack-start-plugins.js +145 -0
- package/dist/client/tanstack-start-plugins.js.map +1 -0
- package/dist/client/tanstack-start.d.ts +130 -0
- package/dist/client/tanstack-start.d.ts.map +1 -0
- package/dist/client/tanstack-start.js +331 -0
- package/dist/client/tanstack-start.js.map +1 -0
- package/dist/component/_generated/api.d.ts +50 -0
- package/dist/component/_generated/api.d.ts.map +1 -0
- package/dist/component/_generated/api.js +31 -0
- package/dist/component/_generated/api.js.map +1 -0
- package/dist/component/_generated/component.d.ts +92 -0
- package/dist/component/_generated/component.d.ts.map +1 -0
- package/dist/component/_generated/component.js +11 -0
- package/dist/component/_generated/component.js.map +1 -0
- package/dist/component/_generated/dataModel.d.ts +46 -0
- package/dist/component/_generated/dataModel.d.ts.map +1 -0
- package/dist/component/_generated/dataModel.js +11 -0
- package/dist/component/_generated/dataModel.js.map +1 -0
- package/dist/component/_generated/server.d.ts +121 -0
- package/dist/component/_generated/server.d.ts.map +1 -0
- package/dist/component/_generated/server.js +78 -0
- package/dist/component/_generated/server.js.map +1 -0
- package/dist/component/convex.config.d.ts +3 -0
- package/dist/component/convex.config.d.ts.map +1 -0
- package/dist/component/convex.config.js +4 -0
- package/dist/component/convex.config.js.map +1 -0
- package/dist/component/core/sessions.d.ts +33 -0
- package/dist/component/core/sessions.d.ts.map +1 -0
- package/dist/component/core/sessions.js +186 -0
- package/dist/component/core/sessions.js.map +1 -0
- package/dist/component/core/users.d.ts +19 -0
- package/dist/component/core/users.d.ts.map +1 -0
- package/dist/component/core/users.js +154 -0
- package/dist/component/core/users.js.map +1 -0
- package/dist/component/core/verifications.d.ts +34 -0
- package/dist/component/core/verifications.d.ts.map +1 -0
- package/dist/component/core/verifications.js +135 -0
- package/dist/component/core/verifications.js.map +1 -0
- package/dist/component/gateway.d.ts +16 -0
- package/dist/component/gateway.d.ts.map +1 -0
- package/dist/component/gateway.js +229 -0
- package/dist/component/gateway.js.map +1 -0
- package/dist/component/lib/crypto.d.ts +24 -0
- package/dist/component/lib/crypto.d.ts.map +1 -0
- package/dist/component/lib/crypto.js +57 -0
- package/dist/component/lib/crypto.js.map +1 -0
- package/dist/component/lib/rateLimit.d.ts +26 -0
- package/dist/component/lib/rateLimit.d.ts.map +1 -0
- package/dist/component/lib/rateLimit.js +96 -0
- package/dist/component/lib/rateLimit.js.map +1 -0
- package/dist/component/lib/validators.d.ts +19 -0
- package/dist/component/lib/validators.d.ts.map +1 -0
- package/dist/component/lib/validators.js +12 -0
- package/dist/component/lib/validators.js.map +1 -0
- package/dist/component/plugins/admin.d.ts +72 -0
- package/dist/component/plugins/admin.d.ts.map +1 -0
- package/dist/component/plugins/admin.js +152 -0
- package/dist/component/plugins/admin.js.map +1 -0
- package/dist/component/providers/emailPassword.d.ts +49 -0
- package/dist/component/providers/emailPassword.d.ts.map +1 -0
- package/dist/component/providers/emailPassword.js +316 -0
- package/dist/component/providers/emailPassword.js.map +1 -0
- package/dist/component/providers/oauth.d.ts +33 -0
- package/dist/component/providers/oauth.d.ts.map +1 -0
- package/dist/component/providers/oauth.js +256 -0
- package/dist/component/providers/oauth.js.map +1 -0
- package/dist/component/schema.d.ts +132 -0
- package/dist/component/schema.d.ts.map +1 -0
- package/dist/component/schema.js +82 -0
- package/dist/component/schema.js.map +1 -0
- package/dist/types.d.ts +67 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/package.json +121 -0
- package/src/cli/generate.ts +360 -0
- package/src/cli/index.ts +133 -0
- package/src/client/index.ts +707 -0
- package/src/client/plugins/admin.ts +205 -0
- package/src/client/primitives.ts +100 -0
- package/src/client/providers.ts +35 -0
- package/src/client/react.ts +97 -0
- package/src/client/tanstack-start-client-plugins.ts +113 -0
- package/src/client/tanstack-start-client.ts +259 -0
- package/src/client/tanstack-start-plugins.ts +203 -0
- package/src/client/tanstack-start.ts +535 -0
- package/src/component/_generated/api.ts +70 -0
- package/src/component/_generated/component.ts +184 -0
- package/src/component/_generated/dataModel.ts +60 -0
- package/src/component/_generated/server.ts +156 -0
- package/src/component/convex.config.ts +5 -0
- package/src/component/core/sessions.ts +228 -0
- package/src/component/core/users.ts +199 -0
- package/src/component/core/verifications.ts +173 -0
- package/src/component/gateway.ts +321 -0
- package/src/component/lib/crypto.ts +63 -0
- package/src/component/lib/internalApi.ts +66 -0
- package/src/component/lib/rateLimit.ts +111 -0
- package/src/component/lib/validators.ts +12 -0
- package/src/component/plugins/admin.ts +178 -0
- package/src/component/providers/emailPassword.ts +374 -0
- package/src/component/providers/oauth.ts +324 -0
- package/src/component/schema.ts +88 -0
- package/src/types.ts +68 -0
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Create an admin plugin configuration.
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* ```ts
|
|
6
|
+
* import { adminPlugin } from "convex-zen/plugins/admin";
|
|
7
|
+
*
|
|
8
|
+
* export const auth = new ConvexAuth(components.convexAuth, {
|
|
9
|
+
* plugins: [adminPlugin({ defaultRole: "user", adminRole: "admin" })],
|
|
10
|
+
* });
|
|
11
|
+
* ```
|
|
12
|
+
*/
|
|
13
|
+
export function adminPlugin(config) {
|
|
14
|
+
const plugin = {
|
|
15
|
+
id: "admin",
|
|
16
|
+
};
|
|
17
|
+
if (config?.defaultRole !== undefined) {
|
|
18
|
+
plugin.defaultRole = config.defaultRole;
|
|
19
|
+
}
|
|
20
|
+
if (config?.adminRole !== undefined) {
|
|
21
|
+
plugin.adminRole = config.adminRole;
|
|
22
|
+
}
|
|
23
|
+
return plugin;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* AdminPlugin client class — exposes admin operations as typed methods.
|
|
27
|
+
* Obtained via `auth.plugins.admin` after ConvexAuth is initialized with adminPlugin.
|
|
28
|
+
*/
|
|
29
|
+
export class AdminPlugin {
|
|
30
|
+
componentApi;
|
|
31
|
+
config;
|
|
32
|
+
constructor(componentApi, config) {
|
|
33
|
+
this.componentApi = componentApi;
|
|
34
|
+
this.config = config;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Resolve a nested component function reference from a path string.
|
|
38
|
+
* e.g. "plugins/admin:listUsers" → component.plugins.admin.listUsers
|
|
39
|
+
*/
|
|
40
|
+
fn(path) {
|
|
41
|
+
const [modulePath, funcName] = path.split(":");
|
|
42
|
+
if (!modulePath || !funcName) {
|
|
43
|
+
throw new Error(`Invalid function path: ${path}`);
|
|
44
|
+
}
|
|
45
|
+
const parts = modulePath.split("/");
|
|
46
|
+
let ref = this.componentApi;
|
|
47
|
+
for (const part of parts) {
|
|
48
|
+
const next = ref[part];
|
|
49
|
+
if (!next ||
|
|
50
|
+
typeof next !== "object" ||
|
|
51
|
+
Array.isArray(next)) {
|
|
52
|
+
throw new Error(`Invalid function path segment: ${part}`);
|
|
53
|
+
}
|
|
54
|
+
ref = next;
|
|
55
|
+
}
|
|
56
|
+
const resolved = ref[funcName];
|
|
57
|
+
if (!resolved) {
|
|
58
|
+
throw new Error(`Function not found: ${path}`);
|
|
59
|
+
}
|
|
60
|
+
return resolved;
|
|
61
|
+
}
|
|
62
|
+
getAdminToken(args) {
|
|
63
|
+
const token = args.adminToken ?? args.token;
|
|
64
|
+
if (!token) {
|
|
65
|
+
throw new Error("adminToken is required");
|
|
66
|
+
}
|
|
67
|
+
return token;
|
|
68
|
+
}
|
|
69
|
+
stringifyError(error) {
|
|
70
|
+
const errorObj = error;
|
|
71
|
+
return [
|
|
72
|
+
error instanceof Error ? error.message : "",
|
|
73
|
+
typeof errorObj?.message === "string" ? errorObj.message : "",
|
|
74
|
+
typeof errorObj?.data === "string"
|
|
75
|
+
? errorObj.data
|
|
76
|
+
: errorObj?.data
|
|
77
|
+
? JSON.stringify(errorObj.data)
|
|
78
|
+
: "",
|
|
79
|
+
String(error),
|
|
80
|
+
]
|
|
81
|
+
.filter(Boolean)
|
|
82
|
+
.join(" | ");
|
|
83
|
+
}
|
|
84
|
+
isRetryableGatewayShapeError(error) {
|
|
85
|
+
const details = this.stringifyError(error);
|
|
86
|
+
return (details.includes("Object contains extra field") ||
|
|
87
|
+
details.includes("ArgumentValidationError") ||
|
|
88
|
+
details.includes("Server Error"));
|
|
89
|
+
}
|
|
90
|
+
async runAdminGatewayAction(
|
|
91
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
92
|
+
ctx, path, args) {
|
|
93
|
+
const adminToken = this.getAdminToken(args);
|
|
94
|
+
const payload = { ...args };
|
|
95
|
+
delete payload.adminToken;
|
|
96
|
+
delete payload.token;
|
|
97
|
+
const attempts = [
|
|
98
|
+
{ ...payload, adminToken },
|
|
99
|
+
payload,
|
|
100
|
+
{ ...payload, token: adminToken },
|
|
101
|
+
];
|
|
102
|
+
let lastError = null;
|
|
103
|
+
for (let i = 0; i < attempts.length; i += 1) {
|
|
104
|
+
const attempt = attempts[i];
|
|
105
|
+
try {
|
|
106
|
+
return await ctx.runAction(this.fn(path), attempt);
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
const isLastAttempt = i === attempts.length - 1;
|
|
110
|
+
if (isLastAttempt || !this.isRetryableGatewayShapeError(error)) {
|
|
111
|
+
throw error;
|
|
112
|
+
}
|
|
113
|
+
lastError = error;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
throw lastError ?? new Error(`Failed to call admin action: ${path}`);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* List users with pagination.
|
|
120
|
+
*/
|
|
121
|
+
async listUsers(
|
|
122
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
123
|
+
ctx, args) {
|
|
124
|
+
return this.runAdminGatewayAction(ctx, "gateway:adminListUsers", args);
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Ban a user, invalidating all their sessions.
|
|
128
|
+
*/
|
|
129
|
+
async banUser(
|
|
130
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
131
|
+
ctx, args) {
|
|
132
|
+
return this.runAdminGatewayAction(ctx, "gateway:adminBanUser", args);
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Unban a user.
|
|
136
|
+
*/
|
|
137
|
+
async unbanUser(
|
|
138
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
139
|
+
ctx, args) {
|
|
140
|
+
return this.runAdminGatewayAction(ctx, "gateway:adminUnbanUser", args);
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Set a user's role.
|
|
144
|
+
*/
|
|
145
|
+
async setRole(
|
|
146
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
147
|
+
ctx, args) {
|
|
148
|
+
return this.runAdminGatewayAction(ctx, "gateway:adminSetRole", args);
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Permanently delete a user and all associated data.
|
|
152
|
+
*/
|
|
153
|
+
async deleteUser(
|
|
154
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
155
|
+
ctx, args) {
|
|
156
|
+
return this.runAdminGatewayAction(ctx, "gateway:adminDeleteUser", args);
|
|
157
|
+
}
|
|
158
|
+
get defaultRole() {
|
|
159
|
+
return this.config.defaultRole;
|
|
160
|
+
}
|
|
161
|
+
get adminRole() {
|
|
162
|
+
return this.config.adminRole;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=admin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin.js","sourceRoot":"","sources":["../../../src/client/plugins/admin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Framework-agnostic auth/session primitives.
|
|
3
|
+
*
|
|
4
|
+
* These helpers keep auth flow logic in one place so framework adapters
|
|
5
|
+
* (TanStack Start, Next.js, etc.) can stay thin.
|
|
6
|
+
*/
|
|
7
|
+
export interface SessionInfo {
|
|
8
|
+
userId: string;
|
|
9
|
+
sessionId: string;
|
|
10
|
+
}
|
|
11
|
+
export interface SignInInput {
|
|
12
|
+
email: string;
|
|
13
|
+
password: string;
|
|
14
|
+
ipAddress?: string;
|
|
15
|
+
userAgent?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface SignInOutput {
|
|
18
|
+
sessionToken: string;
|
|
19
|
+
userId: string;
|
|
20
|
+
}
|
|
21
|
+
export interface SessionTransport {
|
|
22
|
+
signIn: (input: SignInInput) => Promise<SignInOutput>;
|
|
23
|
+
validateSession: (token: string) => Promise<SessionInfo | null>;
|
|
24
|
+
signOut: (token: string) => Promise<void>;
|
|
25
|
+
}
|
|
26
|
+
export interface EstablishedSession {
|
|
27
|
+
sessionToken: string;
|
|
28
|
+
session: SessionInfo;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Shared auth/session operations that can be reused by all framework adapters.
|
|
32
|
+
*/
|
|
33
|
+
export declare class SessionPrimitives {
|
|
34
|
+
private readonly transport;
|
|
35
|
+
constructor(transport: SessionTransport);
|
|
36
|
+
/**
|
|
37
|
+
* Resolve session details from a raw token.
|
|
38
|
+
*/
|
|
39
|
+
getSessionFromToken(token: string | null | undefined): Promise<SessionInfo | null>;
|
|
40
|
+
/**
|
|
41
|
+
* Resolve and require a valid session from a raw token.
|
|
42
|
+
* Throws "Unauthorized" if missing/invalid.
|
|
43
|
+
*/
|
|
44
|
+
requireSessionFromToken(token: string | null | undefined): Promise<SessionInfo>;
|
|
45
|
+
/**
|
|
46
|
+
* Sign in and immediately verify the returned token.
|
|
47
|
+
* This mirrors common auth library behavior where sign-in returns a token,
|
|
48
|
+
* and the framework layer then stores the token in a cookie.
|
|
49
|
+
*/
|
|
50
|
+
signInAndResolveSession(input: SignInInput): Promise<EstablishedSession>;
|
|
51
|
+
/**
|
|
52
|
+
* Best-effort sign out by token.
|
|
53
|
+
*/
|
|
54
|
+
signOutByToken(token: string | null | undefined): Promise<void>;
|
|
55
|
+
}
|
|
56
|
+
export declare function createSessionPrimitives(transport: SessionTransport): SessionPrimitives;
|
|
57
|
+
//# sourceMappingURL=primitives.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"primitives.d.ts","sourceRoot":"","sources":["../../src/client/primitives.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;IACtD,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAChE,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3C;AAED,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,WAAW,CAAC;CACtB;AAED;;GAEG;AACH,qBAAa,iBAAiB;IAChB,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAAT,SAAS,EAAE,gBAAgB;IAExD;;OAEG;IACG,mBAAmB,CACvB,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC/B,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAO9B;;;OAGG;IACG,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS;IAQ9D;;;;OAIG;IACG,uBAAuB,CAC3B,KAAK,EAAE,WAAW,GACjB,OAAO,CAAC,kBAAkB,CAAC;IAc9B;;OAEG;IACG,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;CAMtE;AAED,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,gBAAgB,qBAElE"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Framework-agnostic auth/session primitives.
|
|
3
|
+
*
|
|
4
|
+
* These helpers keep auth flow logic in one place so framework adapters
|
|
5
|
+
* (TanStack Start, Next.js, etc.) can stay thin.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Shared auth/session operations that can be reused by all framework adapters.
|
|
9
|
+
*/
|
|
10
|
+
export class SessionPrimitives {
|
|
11
|
+
transport;
|
|
12
|
+
constructor(transport) {
|
|
13
|
+
this.transport = transport;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Resolve session details from a raw token.
|
|
17
|
+
*/
|
|
18
|
+
async getSessionFromToken(token) {
|
|
19
|
+
if (!token) {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
return this.transport.validateSession(token);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Resolve and require a valid session from a raw token.
|
|
26
|
+
* Throws "Unauthorized" if missing/invalid.
|
|
27
|
+
*/
|
|
28
|
+
async requireSessionFromToken(token) {
|
|
29
|
+
const session = await this.getSessionFromToken(token);
|
|
30
|
+
if (!session) {
|
|
31
|
+
throw new Error("Unauthorized");
|
|
32
|
+
}
|
|
33
|
+
return session;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Sign in and immediately verify the returned token.
|
|
37
|
+
* This mirrors common auth library behavior where sign-in returns a token,
|
|
38
|
+
* and the framework layer then stores the token in a cookie.
|
|
39
|
+
*/
|
|
40
|
+
async signInAndResolveSession(input) {
|
|
41
|
+
const result = await this.transport.signIn(input);
|
|
42
|
+
const session = await this.transport.validateSession(result.sessionToken);
|
|
43
|
+
if (!session) {
|
|
44
|
+
throw new Error("Could not validate newly created session");
|
|
45
|
+
}
|
|
46
|
+
return {
|
|
47
|
+
sessionToken: result.sessionToken,
|
|
48
|
+
session,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Best-effort sign out by token.
|
|
53
|
+
*/
|
|
54
|
+
async signOutByToken(token) {
|
|
55
|
+
if (!token) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
await this.transport.signOut(token);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
export function createSessionPrimitives(transport) {
|
|
62
|
+
return new SessionPrimitives(transport);
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=primitives.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"primitives.js","sourceRoot":"","sources":["../../src/client/primitives.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA8BH;;GAEG;AACH,MAAM,OAAO,iBAAiB;IACC;IAA7B,YAA6B,SAA2B;QAA3B,cAAS,GAAT,SAAS,CAAkB;IAAG,CAAC;IAE5D;;OAEG;IACH,KAAK,CAAC,mBAAmB,CACvB,KAAgC;QAEhC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,uBAAuB,CAAC,KAAgC;QAC5D,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;QACtD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,uBAAuB,CAC3B,KAAkB;QAElB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAClD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QAE1E,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC9D,CAAC;QAED,OAAO;YACL,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,OAAO;SACR,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAAC,KAAgC;QACnD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO;QACT,CAAC;QACD,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;CACF;AAED,MAAM,UAAU,uBAAuB,CAAC,SAA2B;IACjE,OAAO,IAAI,iBAAiB,CAAC,SAAS,CAAC,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { OAuthProviderConfig } from "../types";
|
|
2
|
+
/** Create a Google OAuth provider configuration. */
|
|
3
|
+
export declare function googleProvider(config: {
|
|
4
|
+
clientId: string;
|
|
5
|
+
clientSecret: string;
|
|
6
|
+
scopes?: string[];
|
|
7
|
+
}): OAuthProviderConfig;
|
|
8
|
+
/** Create a GitHub OAuth provider configuration. */
|
|
9
|
+
export declare function githubProvider(config: {
|
|
10
|
+
clientId: string;
|
|
11
|
+
clientSecret: string;
|
|
12
|
+
scopes?: string[];
|
|
13
|
+
}): OAuthProviderConfig;
|
|
14
|
+
//# sourceMappingURL=providers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../../src/client/providers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAEpD,oDAAoD;AACpD,wBAAgB,cAAc,CAAC,MAAM,EAAE;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB,GAAG,mBAAmB,CAUtB;AAED,oDAAoD;AACpD,wBAAgB,cAAc,CAAC,MAAM,EAAE;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB,GAAG,mBAAmB,CAUtB"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/** Create a Google OAuth provider configuration. */
|
|
2
|
+
export function googleProvider(config) {
|
|
3
|
+
return {
|
|
4
|
+
id: "google",
|
|
5
|
+
clientId: config.clientId,
|
|
6
|
+
clientSecret: config.clientSecret,
|
|
7
|
+
authorizationUrl: "https://accounts.google.com/o/oauth2/v2/auth",
|
|
8
|
+
tokenUrl: "https://oauth2.googleapis.com/token",
|
|
9
|
+
userInfoUrl: "https://www.googleapis.com/oauth2/v3/userinfo",
|
|
10
|
+
scopes: config.scopes ?? ["openid", "email", "profile"],
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
/** Create a GitHub OAuth provider configuration. */
|
|
14
|
+
export function githubProvider(config) {
|
|
15
|
+
return {
|
|
16
|
+
id: "github",
|
|
17
|
+
clientId: config.clientId,
|
|
18
|
+
clientSecret: config.clientSecret,
|
|
19
|
+
authorizationUrl: "https://github.com/login/oauth/authorize",
|
|
20
|
+
tokenUrl: "https://github.com/login/oauth/access_token",
|
|
21
|
+
userInfoUrl: "https://api.github.com/user",
|
|
22
|
+
scopes: config.scopes ?? ["read:user", "user:email"],
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=providers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"providers.js","sourceRoot":"","sources":["../../src/client/providers.ts"],"names":[],"mappings":"AAEA,oDAAoD;AACpD,MAAM,UAAU,cAAc,CAAC,MAI9B;IACC,OAAO;QACL,EAAE,EAAE,QAAQ;QACZ,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,gBAAgB,EAAE,8CAA8C;QAChE,QAAQ,EAAE,qCAAqC;QAC/C,WAAW,EAAE,+CAA+C;QAC5D,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC;KACxD,CAAC;AACJ,CAAC;AAED,oDAAoD;AACpD,MAAM,UAAU,cAAc,CAAC,MAI9B;IACC,OAAO;QACL,EAAE,EAAE,QAAQ;QACZ,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,gBAAgB,EAAE,0CAA0C;QAC5D,QAAQ,EAAE,6CAA6C;QACvD,WAAW,EAAE,6BAA6B;QAC1C,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC;KACrD,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
|
+
import type { SessionInfo } from "./primitives";
|
|
3
|
+
export type AuthStatus = "loading" | "authenticated" | "unauthenticated";
|
|
4
|
+
export type AuthSession = SessionInfo;
|
|
5
|
+
export interface ReactAuthClient {
|
|
6
|
+
getSession: () => Promise<AuthSession | null>;
|
|
7
|
+
}
|
|
8
|
+
export interface ConvexZenAuthContextValue {
|
|
9
|
+
status: AuthStatus;
|
|
10
|
+
session: AuthSession | null;
|
|
11
|
+
isAuthenticated: boolean;
|
|
12
|
+
refresh: () => Promise<AuthSession | null>;
|
|
13
|
+
}
|
|
14
|
+
export interface ConvexZenAuthProviderProps {
|
|
15
|
+
client: ReactAuthClient;
|
|
16
|
+
initialSession?: AuthSession | null;
|
|
17
|
+
children: ReactNode;
|
|
18
|
+
}
|
|
19
|
+
export declare function ConvexZenAuthProvider({ client, initialSession, children, }: ConvexZenAuthProviderProps): import("react").FunctionComponentElement<import("react").ProviderProps<ConvexZenAuthContextValue | null>>;
|
|
20
|
+
export declare function useConvexZenAuth(): ConvexZenAuthContextValue;
|
|
21
|
+
export declare const useAuth: typeof useConvexZenAuth;
|
|
22
|
+
export declare function useSession(): AuthSession | null;
|
|
23
|
+
//# sourceMappingURL=react.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../../src/client/react.ts"],"names":[],"mappings":"AAAA,OAAO,EAQL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,eAAe,GAAG,iBAAiB,CAAC;AAEzE,MAAM,MAAM,WAAW,GAAG,WAAW,CAAC;AAEtC,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;CAC/C;AAED,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;IAC5B,eAAe,EAAE,OAAO,CAAC;IACzB,OAAO,EAAE,MAAM,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,0BAA0B;IACzC,MAAM,EAAE,eAAe,CAAC;IACxB,cAAc,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IACpC,QAAQ,EAAE,SAAS,CAAC;CACrB;AAID,wBAAgB,qBAAqB,CAAC,EACpC,MAAM,EACN,cAAc,EACd,QAAQ,GACT,EAAE,0BAA0B,6GA2C5B;AAED,wBAAgB,gBAAgB,IAAI,yBAAyB,CAM5D;AAED,eAAO,MAAM,OAAO,yBAAmB,CAAC;AAExC,wBAAgB,UAAU,IAAI,WAAW,GAAG,IAAI,CAE/C"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { createContext, createElement, useCallback, useContext, useEffect, useMemo, useState, } from "react";
|
|
2
|
+
const AuthContext = createContext(null);
|
|
3
|
+
export function ConvexZenAuthProvider({ client, initialSession, children, }) {
|
|
4
|
+
const [session, setSession] = useState(initialSession ?? null);
|
|
5
|
+
const [status, setStatus] = useState(() => {
|
|
6
|
+
if (initialSession === undefined) {
|
|
7
|
+
return "loading";
|
|
8
|
+
}
|
|
9
|
+
return initialSession ? "authenticated" : "unauthenticated";
|
|
10
|
+
});
|
|
11
|
+
const refresh = useCallback(async () => {
|
|
12
|
+
setStatus("loading");
|
|
13
|
+
const next = await client.getSession();
|
|
14
|
+
setSession(next);
|
|
15
|
+
setStatus(next ? "authenticated" : "unauthenticated");
|
|
16
|
+
return next;
|
|
17
|
+
}, [client]);
|
|
18
|
+
useEffect(() => {
|
|
19
|
+
if (initialSession !== undefined) {
|
|
20
|
+
setSession(initialSession);
|
|
21
|
+
setStatus(initialSession ? "authenticated" : "unauthenticated");
|
|
22
|
+
}
|
|
23
|
+
}, [initialSession]);
|
|
24
|
+
useEffect(() => {
|
|
25
|
+
if (initialSession === undefined) {
|
|
26
|
+
void refresh();
|
|
27
|
+
}
|
|
28
|
+
}, [initialSession, refresh]);
|
|
29
|
+
const value = useMemo(() => ({
|
|
30
|
+
status,
|
|
31
|
+
session,
|
|
32
|
+
isAuthenticated: session !== null,
|
|
33
|
+
refresh,
|
|
34
|
+
}), [status, session, refresh]);
|
|
35
|
+
return createElement(AuthContext.Provider, { value }, children);
|
|
36
|
+
}
|
|
37
|
+
export function useConvexZenAuth() {
|
|
38
|
+
const context = useContext(AuthContext);
|
|
39
|
+
if (!context) {
|
|
40
|
+
throw new Error("useConvexZenAuth must be used within ConvexZenAuthProvider");
|
|
41
|
+
}
|
|
42
|
+
return context;
|
|
43
|
+
}
|
|
44
|
+
export const useAuth = useConvexZenAuth;
|
|
45
|
+
export function useSession() {
|
|
46
|
+
return useConvexZenAuth().session;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=react.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react.js","sourceRoot":"","sources":["../../src/client/react.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,aAAa,EACb,WAAW,EACX,UAAU,EACV,SAAS,EACT,OAAO,EACP,QAAQ,GAET,MAAM,OAAO,CAAC;AAwBf,MAAM,WAAW,GAAG,aAAa,CAAmC,IAAI,CAAC,CAAC;AAE1E,MAAM,UAAU,qBAAqB,CAAC,EACpC,MAAM,EACN,cAAc,EACd,QAAQ,GACmB;IAC3B,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CACpC,cAAc,IAAI,IAAI,CACvB,CAAC;IACF,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAa,GAAG,EAAE;QACpD,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;YACjC,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,cAAc,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,iBAAiB,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACrC,SAAS,CAAC,SAAS,CAAC,CAAC;QACrB,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;QACvC,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC;QACtD,OAAO,IAAI,CAAC;IACd,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;YACjC,UAAU,CAAC,cAAc,CAAC,CAAC;YAC3B,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC;QAClE,CAAC;IACH,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC;IAErB,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;YACjC,KAAK,OAAO,EAAE,CAAC;QACjB,CAAC;IACH,CAAC,EAAE,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC,CAAC;IAE9B,MAAM,KAAK,GAAG,OAAO,CACnB,GAAG,EAAE,CAAC,CAAC;QACL,MAAM;QACN,OAAO;QACP,eAAe,EAAE,OAAO,KAAK,IAAI;QACjC,OAAO;KACR,CAAC,EACF,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAC3B,CAAC;IAEF,OAAO,aAAa,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,EAAE,QAAQ,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,MAAM,OAAO,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;IACxC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,MAAM,OAAO,GAAG,gBAAgB,CAAC;AAExC,MAAM,UAAU,UAAU;IACxB,OAAO,gBAAgB,EAAE,CAAC,OAAO,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { TanStackStartAuthApiClientPlugin } from "./tanstack-start-client";
|
|
2
|
+
export interface TanStackStartAdminListUsersInput {
|
|
3
|
+
limit?: number;
|
|
4
|
+
cursor?: string;
|
|
5
|
+
}
|
|
6
|
+
export interface TanStackStartAdminBanUserInput {
|
|
7
|
+
userId: string;
|
|
8
|
+
reason?: string;
|
|
9
|
+
expiresAt?: number;
|
|
10
|
+
}
|
|
11
|
+
export interface TanStackStartAdminSetRoleInput {
|
|
12
|
+
userId: string;
|
|
13
|
+
role: string;
|
|
14
|
+
}
|
|
15
|
+
export interface TanStackStartAdminUserIdInput {
|
|
16
|
+
userId: string;
|
|
17
|
+
}
|
|
18
|
+
export interface TanStackStartAdminClientPluginShape<TListUsersOutput = unknown, TBanUserOutput = unknown, TSetRoleOutput = unknown, TUnbanUserOutput = unknown, TDeleteUserOutput = unknown> {
|
|
19
|
+
admin: {
|
|
20
|
+
listUsers: (input?: TanStackStartAdminListUsersInput) => Promise<TListUsersOutput>;
|
|
21
|
+
banUser: (input: TanStackStartAdminBanUserInput) => Promise<TBanUserOutput>;
|
|
22
|
+
setRole: (input: TanStackStartAdminSetRoleInput) => Promise<TSetRoleOutput>;
|
|
23
|
+
unbanUser: (input: TanStackStartAdminUserIdInput) => Promise<TUnbanUserOutput>;
|
|
24
|
+
deleteUser: (input: TanStackStartAdminUserIdInput) => Promise<TDeleteUserOutput>;
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
export interface TanStackStartAdminClientPluginOptions {
|
|
28
|
+
routePrefix?: string;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Adds `authClient.admin.*` methods to the TanStack auth API client.
|
|
32
|
+
*/
|
|
33
|
+
export declare function adminClient<TListUsersOutput = unknown, TBanUserOutput = unknown, TSetRoleOutput = unknown, TUnbanUserOutput = unknown, TDeleteUserOutput = unknown>(options?: TanStackStartAdminClientPluginOptions): TanStackStartAuthApiClientPlugin<TanStackStartAdminClientPluginShape<TListUsersOutput, TBanUserOutput, TSetRoleOutput, TUnbanUserOutput, TDeleteUserOutput>>;
|
|
34
|
+
//# sourceMappingURL=tanstack-start-client-plugins.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tanstack-start-client-plugins.d.ts","sourceRoot":"","sources":["../../src/client/tanstack-start-client-plugins.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,yBAAyB,CAAC;AAOhF,MAAM,WAAW,gCAAgC;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,8BAA8B;IAC7C,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,8BAA8B;IAC7C,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,6BAA6B;IAC5C,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,mCAAmC,CAClD,gBAAgB,GAAG,OAAO,EAC1B,cAAc,GAAG,OAAO,EACxB,cAAc,GAAG,OAAO,EACxB,gBAAgB,GAAG,OAAO,EAC1B,iBAAiB,GAAG,OAAO;IAE3B,KAAK,EAAE;QACL,SAAS,EAAE,CACT,KAAK,CAAC,EAAE,gCAAgC,KACrC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QAC/B,OAAO,EAAE,CAAC,KAAK,EAAE,8BAA8B,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;QAC5E,OAAO,EAAE,CAAC,KAAK,EAAE,8BAA8B,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;QAC5E,SAAS,EAAE,CAAC,KAAK,EAAE,6BAA6B,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAC;QAC/E,UAAU,EAAE,CACV,KAAK,EAAE,6BAA6B,KACjC,OAAO,CAAC,iBAAiB,CAAC,CAAC;KACjC,CAAC;CACH;AAED,MAAM,WAAW,qCAAqC;IACpD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,gBAAgB,GAAG,OAAO,EAC1B,cAAc,GAAG,OAAO,EACxB,cAAc,GAAG,OAAO,EACxB,gBAAgB,GAAG,OAAO,EAC1B,iBAAiB,GAAG,OAAO,EAE3B,OAAO,GAAE,qCAA0C,GAClD,gCAAgC,CACjC,mCAAmC,CACjC,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,iBAAiB,CAClB,CACF,CA0CA"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
function normalizeRoutePrefix(prefix) {
|
|
2
|
+
const trimmed = prefix.trim().replace(/^\/+|\/+$/g, "");
|
|
3
|
+
return trimmed.length > 0 ? trimmed : "admin";
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Adds `authClient.admin.*` methods to the TanStack auth API client.
|
|
7
|
+
*/
|
|
8
|
+
export function adminClient(options = {}) {
|
|
9
|
+
const routePrefix = normalizeRoutePrefix(options.routePrefix ?? "admin");
|
|
10
|
+
return {
|
|
11
|
+
id: "admin",
|
|
12
|
+
create: (context) => {
|
|
13
|
+
const post = async (path, input, fallback) => {
|
|
14
|
+
return context.requestJson(`${routePrefix}/${path}`, {
|
|
15
|
+
method: "POST",
|
|
16
|
+
headers: { "content-type": "application/json" },
|
|
17
|
+
body: JSON.stringify(input),
|
|
18
|
+
}, { fallback });
|
|
19
|
+
};
|
|
20
|
+
return {
|
|
21
|
+
admin: {
|
|
22
|
+
listUsers: async (input) => post("list-users", input ?? {}, "Could not list users"),
|
|
23
|
+
banUser: async (input) => post("ban-user", input, "Could not ban user"),
|
|
24
|
+
setRole: async (input) => post("set-role", input, "Could not set role"),
|
|
25
|
+
unbanUser: async (input) => post("unban-user", input, "Could not unban user"),
|
|
26
|
+
deleteUser: async (input) => post("delete-user", input, "Could not delete user"),
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=tanstack-start-client-plugins.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tanstack-start-client-plugins.js","sourceRoot":"","sources":["../../src/client/tanstack-start-client-plugins.ts"],"names":[],"mappings":"AAEA,SAAS,oBAAoB,CAAC,MAAc;IAC1C,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;IACxD,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;AAChD,CAAC;AA8CD;;GAEG;AACH,MAAM,UAAU,WAAW,CAOzB,UAAiD,EAAE;IAUnD,MAAM,WAAW,GAAG,oBAAoB,CAAC,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,CAAC;IAEzE,OAAO;QACL,EAAE,EAAE,OAAO;QACX,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE;YAClB,MAAM,IAAI,GAAG,KAAK,EAAK,IAAY,EAAE,KAAc,EAAE,QAAgB,EAAE,EAAE;gBACvE,OAAO,OAAO,CAAC,WAAW,CACxB,GAAG,WAAW,IAAI,IAAI,EAAE,EACxB;oBACE,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;oBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;iBAC5B,EACD,EAAE,QAAQ,EAAE,CACb,CAAC;YACJ,CAAC,CAAC;YAEF,OAAO;gBACL,KAAK,EAAE;oBACL,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CACzB,IAAI,CACF,YAAY,EACZ,KAAK,IAAI,EAAE,EACX,sBAAsB,CACvB;oBACH,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CACvB,IAAI,CAAiB,UAAU,EAAE,KAAK,EAAE,oBAAoB,CAAC;oBAC/D,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CACvB,IAAI,CAAiB,UAAU,EAAE,KAAK,EAAE,oBAAoB,CAAC;oBAC/D,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CACzB,IAAI,CAAmB,YAAY,EAAE,KAAK,EAAE,sBAAsB,CAAC;oBACrE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAC1B,IAAI,CACF,aAAa,EACb,KAAK,EACL,uBAAuB,CACxB;iBACJ;aACF,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { SessionInfo, SignInInput } from "./primitives";
|
|
2
|
+
import type { ReactAuthClient } from "./react";
|
|
3
|
+
export interface TanStackStartAuthServerFns {
|
|
4
|
+
getSession: () => Promise<SessionInfo | null>;
|
|
5
|
+
}
|
|
6
|
+
type UnionToIntersection<T> = (T extends unknown ? (arg: T) => void : never) extends (arg: infer I) => void ? I : never;
|
|
7
|
+
type Simplify<T> = {
|
|
8
|
+
[K in keyof T]: T[K];
|
|
9
|
+
} & {};
|
|
10
|
+
type PluginExtension<TPlugin> = TPlugin extends TanStackStartAuthApiClientPlugin<infer TExtension> ? TExtension : never;
|
|
11
|
+
type PluginExtensions<TPlugins extends readonly TanStackStartAuthApiClientPlugin<object>[]> = [TPlugins[number]] extends [never] ? {} : Simplify<UnionToIntersection<PluginExtension<TPlugins[number]>>>;
|
|
12
|
+
interface RequestFailureContext {
|
|
13
|
+
fallback: string;
|
|
14
|
+
}
|
|
15
|
+
export interface TanStackStartAuthApiClientPluginContext {
|
|
16
|
+
basePath: string;
|
|
17
|
+
credentials: RequestCredentials;
|
|
18
|
+
requestJson: <T>(path: string, init: RequestInit, failure: RequestFailureContext) => Promise<T>;
|
|
19
|
+
requestVoid: (path: string, init: RequestInit, failure: RequestFailureContext) => Promise<void>;
|
|
20
|
+
}
|
|
21
|
+
export interface TanStackStartAuthApiClientPlugin<TExtension extends object> {
|
|
22
|
+
id: string;
|
|
23
|
+
create: (context: TanStackStartAuthApiClientPluginContext) => TExtension;
|
|
24
|
+
}
|
|
25
|
+
export interface TanStackStartAuthApiClientOptions<TPlugins extends readonly TanStackStartAuthApiClientPlugin<object>[] = readonly TanStackStartAuthApiClientPlugin<object>[]> {
|
|
26
|
+
basePath?: string;
|
|
27
|
+
credentials?: RequestCredentials;
|
|
28
|
+
fetch?: (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>;
|
|
29
|
+
plugins?: TPlugins;
|
|
30
|
+
}
|
|
31
|
+
export interface TanStackStartAuthApiClient extends ReactAuthClient {
|
|
32
|
+
signInWithEmail: (input: SignInInput) => Promise<SessionInfo>;
|
|
33
|
+
signOut: () => Promise<void>;
|
|
34
|
+
signIn: {
|
|
35
|
+
email: (input: SignInInput) => Promise<SessionInfo>;
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
export type TanStackStartAuthApiClientWithPlugins<TPlugins extends readonly TanStackStartAuthApiClientPlugin<object>[]> = TanStackStartAuthApiClient & PluginExtensions<TPlugins>;
|
|
39
|
+
/**
|
|
40
|
+
* Build a ConvexZen React auth client from TanStack Start server functions.
|
|
41
|
+
*/
|
|
42
|
+
export declare function createTanStackStartReactAuthClient(serverFns: TanStackStartAuthServerFns): ReactAuthClient;
|
|
43
|
+
/**
|
|
44
|
+
* Build a browser auth client targeting TanStack Start auth API routes.
|
|
45
|
+
*
|
|
46
|
+
* Defaults to:
|
|
47
|
+
* - basePath: `/api/auth`
|
|
48
|
+
* - credentials: `same-origin`
|
|
49
|
+
*/
|
|
50
|
+
export declare function createTanStackStartAuthApiClient<TPlugins extends readonly TanStackStartAuthApiClientPlugin<object>[] = []>(options?: TanStackStartAuthApiClientOptions<TPlugins>): TanStackStartAuthApiClientWithPlugins<TPlugins>;
|
|
51
|
+
export {};
|
|
52
|
+
//# sourceMappingURL=tanstack-start-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tanstack-start-client.d.ts","sourceRoot":"","sources":["../../src/client/tanstack-start-client.ts"],"names":[],"mappings":"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"}
|