@rolder/kit 3.0.0-alpha.91 → 3.0.0-alpha.93
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/ai/ui/chat/chatInput/store/input.js +1 -1
- package/dist/app/AppDefaults.js +1 -1
- package/dist/app/DefaultApp.js +1 -1
- package/dist/app/cookieColorSchemeManager.js +1 -1
- package/dist/app/defaultTheme.d.ts +1 -1
- package/dist/app/index.d.ts +0 -1
- package/dist/app/index.js +0 -1
- package/dist/betterAuth/client/getAuthClient.d.ts +3050 -0
- package/dist/betterAuth/client/getAuthClient.js +18 -0
- package/dist/betterAuth/client/index.d.ts +1 -0
- package/dist/betterAuth/client/index.js +1 -0
- package/dist/betterAuth/index.d.ts +3 -0
- package/dist/betterAuth/index.js +3 -0
- package/dist/betterAuth/server/auth.test.d.ts +1 -0
- package/dist/betterAuth/server/auth.test.js +71 -0
- package/dist/betterAuth/server/getAuthServer.d.ts +8 -0
- package/dist/betterAuth/server/getAuthServer.js +69 -0
- package/dist/betterAuth/server/getDBSession.d.ts +2 -0
- package/dist/betterAuth/server/getDBSession.js +85 -0
- package/dist/betterAuth/server/getSessionToken.d.ts +1 -0
- package/dist/betterAuth/server/getSessionToken.js +13 -0
- package/dist/betterAuth/server/getSessionUser.d.ts +1 -0
- package/dist/betterAuth/server/getSessionUser.js +21 -0
- package/dist/betterAuth/server/index.d.ts +9 -0
- package/dist/betterAuth/server/index.js +10 -0
- package/dist/betterAuth/server/surrealDbAdapter/adapter.d.ts +8 -0
- package/dist/betterAuth/server/surrealDbAdapter/adapter.js +64 -0
- package/dist/betterAuth/server/surrealDbAdapter/adapter.test.d.ts +1 -0
- package/dist/betterAuth/server/surrealDbAdapter/adapter.test.js +84 -0
- package/dist/betterAuth/server/surrealDbAdapter/db/getDB.d.ts +2 -0
- package/dist/betterAuth/server/surrealDbAdapter/db/getDB.js +31 -0
- package/dist/betterAuth/server/surrealDbAdapter/db/index.d.ts +1 -0
- package/dist/betterAuth/server/surrealDbAdapter/db/index.js +1 -0
- package/dist/betterAuth/server/surrealDbAdapter/index.d.ts +1 -0
- package/dist/betterAuth/server/surrealDbAdapter/index.js +1 -0
- package/dist/betterAuth/server/surrealDbAdapter/methods/count.d.ts +2 -0
- package/dist/betterAuth/server/surrealDbAdapter/methods/count.js +17 -0
- package/dist/betterAuth/server/surrealDbAdapter/methods/create.d.ts +2 -0
- package/dist/betterAuth/server/surrealDbAdapter/methods/create.js +21 -0
- package/dist/betterAuth/server/surrealDbAdapter/methods/delete.d.ts +2 -0
- package/dist/betterAuth/server/surrealDbAdapter/methods/delete.js +18 -0
- package/dist/betterAuth/server/surrealDbAdapter/methods/deleteMany.d.ts +2 -0
- package/dist/betterAuth/server/surrealDbAdapter/methods/deleteMany.js +19 -0
- package/dist/betterAuth/server/surrealDbAdapter/methods/findMany.d.ts +2 -0
- package/dist/betterAuth/server/surrealDbAdapter/methods/findMany.js +51 -0
- package/dist/betterAuth/server/surrealDbAdapter/methods/findOne.d.ts +2 -0
- package/dist/betterAuth/server/surrealDbAdapter/methods/findOne.js +42 -0
- package/dist/betterAuth/server/surrealDbAdapter/methods/index.d.ts +8 -0
- package/dist/betterAuth/server/surrealDbAdapter/methods/index.js +8 -0
- package/dist/betterAuth/server/surrealDbAdapter/methods/types.d.ts +56 -0
- package/dist/betterAuth/server/surrealDbAdapter/methods/types.js +0 -0
- package/dist/betterAuth/server/surrealDbAdapter/methods/update.d.ts +2 -0
- package/dist/betterAuth/server/surrealDbAdapter/methods/update.js +25 -0
- package/dist/betterAuth/server/surrealDbAdapter/methods/updateMany.d.ts +2 -0
- package/dist/betterAuth/server/surrealDbAdapter/methods/updateMany.js +21 -0
- package/dist/betterAuth/server/surrealDbAdapter/types.d.ts +2 -0
- package/dist/betterAuth/server/surrealDbAdapter/types.js +0 -0
- package/dist/betterAuth/server/surrealDbAdapter/utils/applyJoinMappings.d.ts +2 -0
- package/dist/betterAuth/server/surrealDbAdapter/utils/applyJoinMappings.js +31 -0
- package/dist/betterAuth/server/surrealDbAdapter/utils/buildExpression.d.ts +3 -0
- package/dist/betterAuth/server/surrealDbAdapter/utils/buildExpression.js +58 -0
- package/dist/betterAuth/server/surrealDbAdapter/utils/buildJoinPlan.d.ts +9 -0
- package/dist/betterAuth/server/surrealDbAdapter/utils/buildJoinPlan.js +46 -0
- package/dist/betterAuth/server/surrealDbAdapter/utils/buildSelectFields.d.ts +1 -0
- package/dist/betterAuth/server/surrealDbAdapter/utils/buildSelectFields.js +5 -0
- package/dist/betterAuth/server/surrealDbAdapter/utils/index.d.ts +6 -0
- package/dist/betterAuth/server/surrealDbAdapter/utils/index.js +6 -0
- package/dist/betterAuth/server/surrealDbAdapter/utils/normalizeOutputRecordIds.d.ts +2 -0
- package/dist/betterAuth/server/surrealDbAdapter/utils/normalizeOutputRecordIds.js +43 -0
- package/dist/betterAuth/server/surrealDbAdapter/utils/normalizeRecordIds.d.ts +2 -0
- package/dist/betterAuth/server/surrealDbAdapter/utils/normalizeRecordIds.js +38 -0
- package/dist/betterAuth/server/surrealDbAdapter/utils/normalizeWhereValue.d.ts +2 -0
- package/dist/betterAuth/server/surrealDbAdapter/utils/normalizeWhereValue.js +33 -0
- package/dist/betterAuth/server/surrealDbAdapter/utils/types.d.ts +34 -0
- package/dist/betterAuth/server/surrealDbAdapter/utils/types.js +0 -0
- package/dist/betterAuth/useSessionUser.d.ts +1 -0
- package/dist/betterAuth/useSessionUser.js +8 -0
- package/dist/surrealDB/deafaultCrud.d.ts +2 -0
- package/dist/{tanstackFunctions/surreal → surrealDB}/deafaultCrud.js +6 -5
- package/dist/surrealDB/getDBInstance.d.ts +3 -0
- package/dist/surrealDB/getDBInstance.js +34 -0
- package/dist/surrealDB/getDBInstanceTanstack.d.ts +3 -0
- package/dist/{tanstackFunctions/surreal/connection.js → surrealDB/getDBInstanceTanstack.js} +3 -7
- package/dist/surrealDB/index.d.ts +6 -0
- package/dist/surrealDB/index.js +6 -0
- package/dist/{tanstackFunctions/surreal/connection.d.ts → surrealDB/types.d.ts} +3 -3
- package/dist/surrealDB/types.js +0 -0
- package/dist/{tanstackFunctions → tanstack}/index.d.ts +1 -1
- package/dist/{tanstackFunctions → tanstack}/index.js +1 -1
- package/dist/{app/defaultRequestMiddlewares.d.ts → tanstack/middlewares/index.d.ts} +2 -0
- package/dist/tanstack/middlewares/index.js +5 -0
- package/dist/tanstack/middlewares/locale.d.ts +4 -0
- package/dist/{app/defaultRequestMiddlewares.js → tanstack/middlewares/locale.js} +2 -5
- package/dist/ui/JsonInput.js +1 -1
- package/dist/ui/form/index.d.ts +0 -1
- package/dist/ui/form/index.js +1 -2
- package/dist/{ui/form/fieldsSchema.d.ts → zodSchemas.d.ts} +1 -1
- package/dist/{ui/form/fieldsSchema.js → zodSchemas.js} +2 -2
- package/package.json +17 -15
- package/dist/index.d.ts +0 -5
- package/dist/index.js +0 -5
- package/dist/tanstackFunctions/surreal/deafaultCrud.d.ts +0 -2
- package/dist/tanstackFunctions/surreal/index.d.ts +0 -4
- package/dist/tanstackFunctions/surreal/index.js +0 -4
- /package/dist/{tanstackFunctions/surreal → surrealDB}/deserialize.d.ts +0 -0
- /package/dist/{tanstackFunctions/surreal → surrealDB}/deserialize.js +0 -0
- /package/dist/{tanstackFunctions/surreal → surrealDB}/encryption.d.ts +0 -0
- /package/dist/{tanstackFunctions/surreal → surrealDB}/encryption.js +0 -0
- /package/dist/{tanstackFunctions → tanstack}/cookie/getCookie.d.ts +0 -0
- /package/dist/{tanstackFunctions → tanstack}/cookie/getCookie.js +0 -0
- /package/dist/{tanstackFunctions → tanstack}/cookie/index.d.ts +0 -0
- /package/dist/{tanstackFunctions → tanstack}/cookie/index.js +0 -0
- /package/dist/{tanstackFunctions → tanstack}/cookie/setCookie.d.ts +0 -0
- /package/dist/{tanstackFunctions → tanstack}/cookie/setCookie.js +0 -0
- /package/dist/{tanstackFunctions → tanstack}/cookie/setCookies.d.ts +0 -0
- /package/dist/{tanstackFunctions → tanstack}/cookie/setCookies.js +0 -0
- /package/dist/{tanstackFunctions → tanstack}/s3/getS3Client.d.ts +0 -0
- /package/dist/{tanstackFunctions → tanstack}/s3/getS3Client.js +0 -0
- /package/dist/{tanstackFunctions → tanstack}/s3/getSignedFileUrlFn.d.ts +0 -0
- /package/dist/{tanstackFunctions → tanstack}/s3/getSignedFileUrlFn.js +0 -0
- /package/dist/{tanstackFunctions → tanstack}/s3/index.d.ts +0 -0
- /package/dist/{tanstackFunctions → tanstack}/s3/index.js +0 -0
- /package/dist/{tanstackFunctions → tanstack}/s3/uploadRequest.d.ts +0 -0
- /package/dist/{tanstackFunctions → tanstack}/s3/uploadRequest.js +0 -0
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { adminClient, usernameClient } from "better-auth/client/plugins";
|
|
2
|
+
import { defaultRoles } from "better-auth/plugins/organization/access";
|
|
3
|
+
import { createAuthClient } from "better-auth/react";
|
|
4
|
+
const getAuthClient = (config)=>{
|
|
5
|
+
const roles = config?.roles || defaultRoles;
|
|
6
|
+
const betterAuthClientOptions = config?.betterAuthClientOptions;
|
|
7
|
+
return createAuthClient({
|
|
8
|
+
...betterAuthClientOptions,
|
|
9
|
+
plugins: [
|
|
10
|
+
adminClient({
|
|
11
|
+
roles
|
|
12
|
+
}),
|
|
13
|
+
usernameClient(),
|
|
14
|
+
...betterAuthClientOptions?.plugins || []
|
|
15
|
+
]
|
|
16
|
+
});
|
|
17
|
+
};
|
|
18
|
+
export { getAuthClient };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './getAuthClient';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./getAuthClient.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { beforeAll, describe, expect, it } from "vitest";
|
|
2
|
+
const ensureDbEnv = ()=>{
|
|
3
|
+
process.env.SURREALDB_DATABASE = 'tests';
|
|
4
|
+
};
|
|
5
|
+
const hasDbEnv = ()=>Boolean(process.env.SURREALDB_URL && process.env.SURREALDB_NAMESPACE && process.env.SURREALDB_USERNAME && process.env.SURREALDB_PASSWORD);
|
|
6
|
+
let auth;
|
|
7
|
+
const createUser = ()=>{
|
|
8
|
+
const id = crypto.randomUUID();
|
|
9
|
+
return {
|
|
10
|
+
name: 'Test User',
|
|
11
|
+
email: `test.user+${id}@example.com`,
|
|
12
|
+
password: 'password-123'
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
describe.skipIf(!hasDbEnv())('better auth', ()=>{
|
|
16
|
+
beforeAll(async ()=>{
|
|
17
|
+
ensureDbEnv();
|
|
18
|
+
auth = (await import("./index.js")).getAuthServer();
|
|
19
|
+
});
|
|
20
|
+
it('rejects protected endpoints without a session', async ()=>{
|
|
21
|
+
const request = new Request('http://localhost/api/auth/list-accounts');
|
|
22
|
+
const response = await auth.handler(request);
|
|
23
|
+
expect([
|
|
24
|
+
401,
|
|
25
|
+
403
|
|
26
|
+
]).toContain(response.status);
|
|
27
|
+
});
|
|
28
|
+
it('supports sign-up and sign-in with session retrieval', async ()=>{
|
|
29
|
+
const origin = 'http://localhost';
|
|
30
|
+
const user = createUser();
|
|
31
|
+
const signUpRequest = new Request('http://localhost/api/auth/sign-up/email', {
|
|
32
|
+
method: 'POST',
|
|
33
|
+
headers: {
|
|
34
|
+
'content-type': 'application/json',
|
|
35
|
+
origin
|
|
36
|
+
},
|
|
37
|
+
body: JSON.stringify({
|
|
38
|
+
name: user.name,
|
|
39
|
+
email: user.email,
|
|
40
|
+
password: user.password
|
|
41
|
+
})
|
|
42
|
+
});
|
|
43
|
+
const signUpResponse = await auth.handler(signUpRequest);
|
|
44
|
+
expect(signUpResponse.status).toBe(200);
|
|
45
|
+
const signInRequest = new Request('http://localhost/api/auth/sign-in/email', {
|
|
46
|
+
method: 'POST',
|
|
47
|
+
headers: {
|
|
48
|
+
'content-type': 'application/json',
|
|
49
|
+
origin
|
|
50
|
+
},
|
|
51
|
+
body: JSON.stringify({
|
|
52
|
+
email: user.email,
|
|
53
|
+
password: user.password
|
|
54
|
+
})
|
|
55
|
+
});
|
|
56
|
+
const signInResponse = await auth.handler(signInRequest);
|
|
57
|
+
expect(signInResponse.status).toBe(200);
|
|
58
|
+
const setCookie = signInResponse.headers.get('set-cookie');
|
|
59
|
+
expect(setCookie).toBeTruthy();
|
|
60
|
+
const cookie = setCookie?.split(';')[0];
|
|
61
|
+
const sessionRequest = new Request('http://localhost/api/auth/get-session', {
|
|
62
|
+
headers: cookie ? {
|
|
63
|
+
cookie
|
|
64
|
+
} : void 0
|
|
65
|
+
});
|
|
66
|
+
const sessionResponse = await auth.handler(sessionRequest);
|
|
67
|
+
expect(sessionResponse.status).toBe(200);
|
|
68
|
+
const sessionBody = await sessionResponse.json();
|
|
69
|
+
expect(sessionBody?.user?.email).toBe(user.email);
|
|
70
|
+
});
|
|
71
|
+
});
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { BetterAuthOptions } from 'better-auth';
|
|
2
|
+
import { betterAuth } from 'better-auth';
|
|
3
|
+
import { type Role } from 'better-auth/plugins';
|
|
4
|
+
export interface AuthServer<TRoles extends Record<string, Role>> {
|
|
5
|
+
betterAuthOptions?: Partial<BetterAuthOptions>;
|
|
6
|
+
roles?: TRoles;
|
|
7
|
+
}
|
|
8
|
+
export declare const getAuthServer: <TRoles extends Record<string, Role>>(config?: AuthServer<TRoles>) => ReturnType<typeof betterAuth>;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { betterAuth } from "better-auth";
|
|
2
|
+
import { admin, customSession, jwt, username } from "better-auth/plugins";
|
|
3
|
+
import { defaultRoles } from "better-auth/plugins/admin/access";
|
|
4
|
+
import { tanstackStartCookies } from "better-auth/tanstack-start";
|
|
5
|
+
import { surrealDbAdapter } from "./surrealDbAdapter/index.js";
|
|
6
|
+
const baseUrl = "/";
|
|
7
|
+
const getAuthServer = (config)=>{
|
|
8
|
+
const roles = config?.roles || defaultRoles;
|
|
9
|
+
const betterAuthOptions = config?.betterAuthOptions;
|
|
10
|
+
const resultOptions = {
|
|
11
|
+
baseURL: baseUrl,
|
|
12
|
+
secret: process.env.BETTER_AUTH_SECRET,
|
|
13
|
+
database: surrealDbAdapter(),
|
|
14
|
+
experimental: {
|
|
15
|
+
joins: true
|
|
16
|
+
},
|
|
17
|
+
emailAndPassword: {
|
|
18
|
+
enabled: true
|
|
19
|
+
},
|
|
20
|
+
...betterAuthOptions,
|
|
21
|
+
plugins: [
|
|
22
|
+
admin({
|
|
23
|
+
roles,
|
|
24
|
+
bannedUserMessage: 'Доступ к приложению заблокирован. Обратитесь к администратору.'
|
|
25
|
+
}),
|
|
26
|
+
username(),
|
|
27
|
+
...betterAuthOptions?.plugins || []
|
|
28
|
+
]
|
|
29
|
+
};
|
|
30
|
+
const auth = betterAuth({
|
|
31
|
+
...resultOptions,
|
|
32
|
+
plugins: [
|
|
33
|
+
...resultOptions.plugins,
|
|
34
|
+
customSession(async ({ user, session })=>({
|
|
35
|
+
user: {
|
|
36
|
+
...user,
|
|
37
|
+
role: user.role
|
|
38
|
+
},
|
|
39
|
+
session
|
|
40
|
+
}), resultOptions),
|
|
41
|
+
jwt({
|
|
42
|
+
jwks: {
|
|
43
|
+
keyPairConfig: {
|
|
44
|
+
alg: 'EdDSA',
|
|
45
|
+
crv: 'Ed25519'
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
jwt: {
|
|
49
|
+
issuer: baseUrl,
|
|
50
|
+
audience: baseUrl,
|
|
51
|
+
expirationTime: '15m',
|
|
52
|
+
definePayload: ({ user, session })=>({
|
|
53
|
+
id: user.id,
|
|
54
|
+
ns: process.env.SURREALDB_NAMESPACE || 'dev',
|
|
55
|
+
db: process.env.SURREALDB_DATABASE || 'data',
|
|
56
|
+
ac: 'better_auth_jwt',
|
|
57
|
+
email: user.email,
|
|
58
|
+
name: user.name,
|
|
59
|
+
role: user.role,
|
|
60
|
+
sessionId: session.id
|
|
61
|
+
})
|
|
62
|
+
}
|
|
63
|
+
}),
|
|
64
|
+
tanstackStartCookies()
|
|
65
|
+
]
|
|
66
|
+
});
|
|
67
|
+
return auth;
|
|
68
|
+
};
|
|
69
|
+
export { getAuthServer };
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { createServerOnlyFn } from "@tanstack/react-start";
|
|
2
|
+
import { getDBInstance } from "../../surrealDB/index.js";
|
|
3
|
+
import { getSessionToken } from "./getSessionToken.js";
|
|
4
|
+
function _ts_add_disposable_resource(env, value, async) {
|
|
5
|
+
if (null != value) {
|
|
6
|
+
if ("object" != typeof value && "function" != typeof value) throw new TypeError("Object expected.");
|
|
7
|
+
var dispose, inner;
|
|
8
|
+
if (async) {
|
|
9
|
+
if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
|
|
10
|
+
dispose = value[Symbol.asyncDispose];
|
|
11
|
+
}
|
|
12
|
+
if (void 0 === dispose) {
|
|
13
|
+
if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
|
|
14
|
+
dispose = value[Symbol.dispose];
|
|
15
|
+
if (async) inner = dispose;
|
|
16
|
+
}
|
|
17
|
+
if ("function" != typeof dispose) throw new TypeError("Object not disposable.");
|
|
18
|
+
if (inner) dispose = function() {
|
|
19
|
+
try {
|
|
20
|
+
inner.call(this);
|
|
21
|
+
} catch (e) {
|
|
22
|
+
return Promise.reject(e);
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
env.stack.push({
|
|
26
|
+
value: value,
|
|
27
|
+
dispose: dispose,
|
|
28
|
+
async: async
|
|
29
|
+
});
|
|
30
|
+
} else if (async) env.stack.push({
|
|
31
|
+
async: true
|
|
32
|
+
});
|
|
33
|
+
return value;
|
|
34
|
+
}
|
|
35
|
+
function getDBSession_ts_dispose_resources(env) {
|
|
36
|
+
var _SuppressedError = "function" == typeof SuppressedError ? SuppressedError : function(error, suppressed, message) {
|
|
37
|
+
var e = new Error(message);
|
|
38
|
+
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
39
|
+
};
|
|
40
|
+
return (getDBSession_ts_dispose_resources = function(env) {
|
|
41
|
+
function fail(e) {
|
|
42
|
+
env.error = env.hasError ? new _SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
|
|
43
|
+
env.hasError = true;
|
|
44
|
+
}
|
|
45
|
+
var r, s = 0;
|
|
46
|
+
function next() {
|
|
47
|
+
while(r = env.stack.pop())try {
|
|
48
|
+
if (!r.async && 1 === s) return s = 0, env.stack.push(r), Promise.resolve().then(next);
|
|
49
|
+
if (r.dispose) {
|
|
50
|
+
var result = r.dispose.call(r.value);
|
|
51
|
+
if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) {
|
|
52
|
+
fail(e);
|
|
53
|
+
return next();
|
|
54
|
+
});
|
|
55
|
+
} else s |= 1;
|
|
56
|
+
} catch (e) {
|
|
57
|
+
fail(e);
|
|
58
|
+
}
|
|
59
|
+
if (1 === s) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
|
|
60
|
+
if (env.hasError) throw env.error;
|
|
61
|
+
}
|
|
62
|
+
return next();
|
|
63
|
+
})(env);
|
|
64
|
+
}
|
|
65
|
+
const getDBSession = createServerOnlyFn(async (surrealDBProps = {})=>{
|
|
66
|
+
const env = {
|
|
67
|
+
stack: [],
|
|
68
|
+
error: void 0,
|
|
69
|
+
hasError: false
|
|
70
|
+
};
|
|
71
|
+
try {
|
|
72
|
+
const token = await getSessionToken();
|
|
73
|
+
const db = await getDBInstance(surrealDBProps);
|
|
74
|
+
const dbSession = _ts_add_disposable_resource(env, await db.newSession(), true);
|
|
75
|
+
if (token) await dbSession.authenticate(token);
|
|
76
|
+
return dbSession;
|
|
77
|
+
} catch (e) {
|
|
78
|
+
env.error = e;
|
|
79
|
+
env.hasError = true;
|
|
80
|
+
} finally{
|
|
81
|
+
const result = getDBSession_ts_dispose_resources(env);
|
|
82
|
+
if (result) await result;
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
export { getDBSession };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const getSessionToken: () => Promise<any>;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { getRequestHeaders } from "@tanstack/react-start/server";
|
|
2
|
+
const getSessionToken = async ()=>{
|
|
3
|
+
const headers = getRequestHeaders();
|
|
4
|
+
const tokenResponse = await fetch("//api/auth/token", {
|
|
5
|
+
headers: {
|
|
6
|
+
cookie: headers.get('cookie') || ''
|
|
7
|
+
}
|
|
8
|
+
});
|
|
9
|
+
if (!tokenResponse.ok) throw new Error('Failed to get JWT token');
|
|
10
|
+
const { token } = await tokenResponse.json();
|
|
11
|
+
return token;
|
|
12
|
+
};
|
|
13
|
+
export { getSessionToken };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function getSessionUser<TUser = unknown>(): Promise<TUser | undefined>;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { createServerFn } from "@tanstack/react-start";
|
|
2
|
+
import { getRequestHeaders } from "@tanstack/react-start/server";
|
|
3
|
+
const getSessionUserFn = createServerFn().handler(async ()=>{
|
|
4
|
+
try {
|
|
5
|
+
const headers = getRequestHeaders();
|
|
6
|
+
const sessionResponse = await fetch("//api/auth/get-session", {
|
|
7
|
+
headers: {
|
|
8
|
+
cookie: headers.get('cookie') || ''
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
if (!sessionResponse.ok) throw new Error('Failed to get auth session');
|
|
12
|
+
const session = await sessionResponse.json();
|
|
13
|
+
return session?.user;
|
|
14
|
+
} catch (_) {
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
async function getSessionUser() {
|
|
19
|
+
return await getSessionUserFn();
|
|
20
|
+
}
|
|
21
|
+
export { getSessionUser };
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { betterAuth } from 'better-auth';
|
|
2
|
+
export * from 'better-auth/client/plugins';
|
|
3
|
+
export * from 'better-auth/plugins';
|
|
4
|
+
export * from 'better-auth/plugins/admin/access';
|
|
5
|
+
export * from 'better-auth/react';
|
|
6
|
+
export { tanstackStartCookies } from 'better-auth/tanstack-start';
|
|
7
|
+
export * from './getAuthServer';
|
|
8
|
+
export * from './getDBSession';
|
|
9
|
+
export * from './getSessionUser';
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { betterAuth } from "better-auth";
|
|
2
|
+
import { tanstackStartCookies } from "better-auth/tanstack-start";
|
|
3
|
+
export * from "better-auth/client/plugins";
|
|
4
|
+
export * from "better-auth/plugins";
|
|
5
|
+
export * from "better-auth/plugins/admin/access";
|
|
6
|
+
export * from "better-auth/react";
|
|
7
|
+
export * from "./getAuthServer.js";
|
|
8
|
+
export * from "./getDBSession.js";
|
|
9
|
+
export * from "./getSessionUser.js";
|
|
10
|
+
export { betterAuth, tanstackStartCookies };
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type DBAdapterDebugLogOption } from 'better-auth/adapters';
|
|
2
|
+
import type { SurrealDBProps } from '../../../surrealDB/types';
|
|
3
|
+
type SurrealAdapterConfig = {
|
|
4
|
+
surrealDbProps?: SurrealDBProps;
|
|
5
|
+
debugLogs?: DBAdapterDebugLogOption | boolean;
|
|
6
|
+
};
|
|
7
|
+
export declare const surrealDbAdapter: ({ surrealDbProps, debugLogs, }?: SurrealAdapterConfig | undefined) => (options: Parameters<import("better-auth/adapters").AdapterFactory>[0]) => import("better-auth").DBAdapter<import("better-auth").BetterAuthOptions>;
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { createAdapterFactory } from "better-auth/adapters";
|
|
2
|
+
import { count, create, deleteFn, deleteMany, findMany, findOne, update, updateMany } from "./methods/index.js";
|
|
3
|
+
const surrealDbAdapter = ({ surrealDbProps, debugLogs } = {})=>{
|
|
4
|
+
const adapterCreator = createAdapterFactory({
|
|
5
|
+
config: {
|
|
6
|
+
adapterId: 'surrealdb',
|
|
7
|
+
adapterName: 'SurrealDB Adapter',
|
|
8
|
+
usePlural: false,
|
|
9
|
+
supportsJSON: true,
|
|
10
|
+
supportsArrays: true,
|
|
11
|
+
supportsDates: true,
|
|
12
|
+
supportsBooleans: true,
|
|
13
|
+
supportsUUIDs: true,
|
|
14
|
+
debugLogs: debugLogs ?? false
|
|
15
|
+
},
|
|
16
|
+
adapter: (a)=>({
|
|
17
|
+
create: (p)=>create({
|
|
18
|
+
...p,
|
|
19
|
+
...a,
|
|
20
|
+
surrealDbProps
|
|
21
|
+
}),
|
|
22
|
+
update: (p)=>update({
|
|
23
|
+
...p,
|
|
24
|
+
...a,
|
|
25
|
+
surrealDbProps
|
|
26
|
+
}),
|
|
27
|
+
updateMany: (p)=>updateMany({
|
|
28
|
+
...p,
|
|
29
|
+
...a,
|
|
30
|
+
surrealDbProps
|
|
31
|
+
}),
|
|
32
|
+
findOne: (p)=>findOne({
|
|
33
|
+
...p,
|
|
34
|
+
...a,
|
|
35
|
+
surrealDbProps
|
|
36
|
+
}),
|
|
37
|
+
findMany: (p)=>findMany({
|
|
38
|
+
...p,
|
|
39
|
+
...a,
|
|
40
|
+
surrealDbProps
|
|
41
|
+
}),
|
|
42
|
+
delete: (p)=>deleteFn({
|
|
43
|
+
...p,
|
|
44
|
+
...a,
|
|
45
|
+
surrealDbProps
|
|
46
|
+
}),
|
|
47
|
+
deleteMany: (p)=>deleteMany({
|
|
48
|
+
...p,
|
|
49
|
+
...a,
|
|
50
|
+
surrealDbProps
|
|
51
|
+
}),
|
|
52
|
+
count: (p)=>count({
|
|
53
|
+
...p,
|
|
54
|
+
...a,
|
|
55
|
+
surrealDbProps
|
|
56
|
+
})
|
|
57
|
+
})
|
|
58
|
+
});
|
|
59
|
+
return (options)=>{
|
|
60
|
+
const safeOptions = options ?? {};
|
|
61
|
+
return adapterCreator(safeOptions);
|
|
62
|
+
};
|
|
63
|
+
};
|
|
64
|
+
export { surrealDbAdapter };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import node_path from "node:path";
|
|
3
|
+
import { runAdapterTest } from "better-auth/adapters/test";
|
|
4
|
+
import { Table, surql } from "surrealdb";
|
|
5
|
+
import { afterAll, beforeAll, describe, expect, it } from "vitest";
|
|
6
|
+
import { getDBInstance } from "../../../surrealDB/index.js";
|
|
7
|
+
import { surrealDbAdapter } from "./adapter.js";
|
|
8
|
+
const hasDbEnv = ()=>Boolean(process.env.SURREALDB_URL && process.env.SURREALDB_NAMESPACE && process.env.SURREALDB_USERNAME && process.env.SURREALDB_PASSWORD);
|
|
9
|
+
afterAll(async ()=>{
|
|
10
|
+
const db = await getDBInstance({
|
|
11
|
+
database: 'test'
|
|
12
|
+
});
|
|
13
|
+
await db.query(surql`DELETE ${new Table('session')}`).collect();
|
|
14
|
+
await db.query(surql`DELETE ${new Table('account')}`).collect();
|
|
15
|
+
await db.query(surql`DELETE ${new Table('verification')}`).collect();
|
|
16
|
+
await db.query(surql`DELETE ${new Table('user')}`).collect();
|
|
17
|
+
await db.close();
|
|
18
|
+
});
|
|
19
|
+
describe.skipIf(!hasDbEnv())('surrealdb adapter', ()=>{
|
|
20
|
+
beforeAll(async ()=>{
|
|
21
|
+
const db = await getDBInstance({
|
|
22
|
+
database: 'test'
|
|
23
|
+
});
|
|
24
|
+
const schemaPath = node_path.resolve('src/back/auth/surrealdb/schema.surql');
|
|
25
|
+
const schema = await readFile(schemaPath, 'utf8');
|
|
26
|
+
await db.query(schema).collect();
|
|
27
|
+
await db.query(surql`DELETE ${new Table('session')}`).collect();
|
|
28
|
+
await db.query(surql`DELETE ${new Table('account')}`).collect();
|
|
29
|
+
await db.query(surql`DELETE ${new Table('verification')}`).collect();
|
|
30
|
+
await db.query(surql`DELETE ${new Table('user')}`).collect();
|
|
31
|
+
});
|
|
32
|
+
runAdapterTest({
|
|
33
|
+
testPrefix: 'surrealdb',
|
|
34
|
+
getAdapter: async (options)=>surrealDbAdapter()(options ?? {})
|
|
35
|
+
});
|
|
36
|
+
it('supports experimental joins via computed fields', async ()=>{
|
|
37
|
+
const adapter = surrealDbAdapter()({
|
|
38
|
+
experimental: {
|
|
39
|
+
joins: true
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
const user = await adapter.create({
|
|
43
|
+
model: 'user',
|
|
44
|
+
data: {
|
|
45
|
+
name: 'Join User',
|
|
46
|
+
email: `join-${Date.now()}@example.com`,
|
|
47
|
+
emailVerified: true,
|
|
48
|
+
createdAt: new Date(),
|
|
49
|
+
updatedAt: new Date()
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
const account = await adapter.create({
|
|
53
|
+
model: 'account',
|
|
54
|
+
data: {
|
|
55
|
+
userId: user.id,
|
|
56
|
+
accountId: `join-${Date.now()}`,
|
|
57
|
+
providerId: 'credential',
|
|
58
|
+
createdAt: new Date(),
|
|
59
|
+
updatedAt: new Date()
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
const joined = await adapter.findOne({
|
|
63
|
+
model: 'user',
|
|
64
|
+
where: [
|
|
65
|
+
{
|
|
66
|
+
field: 'id',
|
|
67
|
+
value: user.id
|
|
68
|
+
}
|
|
69
|
+
],
|
|
70
|
+
join: {
|
|
71
|
+
account: true
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
expect(joined?.account).toBeTruthy();
|
|
75
|
+
expect(Array.isArray(joined?.account)).toBe(true);
|
|
76
|
+
expect(joined?.account?.length).toBe(1);
|
|
77
|
+
expect(joined?.account?.[0]?.id).toBe(account.id);
|
|
78
|
+
const db = await getDBInstance({
|
|
79
|
+
database: 'test'
|
|
80
|
+
});
|
|
81
|
+
await db.query(surql`DELETE ${new Table('account')} WHERE id = ${account.id}`).collect();
|
|
82
|
+
await db.query(surql`DELETE ${new Table('user')} WHERE id = ${user.id}`).collect();
|
|
83
|
+
});
|
|
84
|
+
});
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import node_path from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { createServerOnlyFn } from "@tanstack/react-start";
|
|
5
|
+
import { getDBInstance } from "../../../../surrealDB/index.js";
|
|
6
|
+
const getDB_dirname = node_path.dirname(fileURLToPath(import.meta.url));
|
|
7
|
+
const authSchemaPath = node_path.resolve(getDB_dirname, './schema.surql');
|
|
8
|
+
let schemaApplied = false;
|
|
9
|
+
let schemaApplying = false;
|
|
10
|
+
const ensureAuthSchema = async (props = {})=>{
|
|
11
|
+
if (schemaApplied) return;
|
|
12
|
+
if (!schemaApplying) try {
|
|
13
|
+
schemaApplying = true;
|
|
14
|
+
const db = await getDBInstance(props);
|
|
15
|
+
const schema = await readFile(authSchemaPath, 'utf8');
|
|
16
|
+
const betterAuthUrl = "/";
|
|
17
|
+
const betterAuthJwksUrl = `${betterAuthUrl}/api/auth/jwks`;
|
|
18
|
+
await db.query(schema, {
|
|
19
|
+
BETTER_AUTH_JWKS_URL: betterAuthJwksUrl
|
|
20
|
+
});
|
|
21
|
+
schemaApplied = true;
|
|
22
|
+
} finally{
|
|
23
|
+
schemaApplying = false;
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
const getDb = createServerOnlyFn(async (props = {})=>{
|
|
27
|
+
const db = await getDBInstance(props);
|
|
28
|
+
await ensureAuthSchema(props);
|
|
29
|
+
return db;
|
|
30
|
+
});
|
|
31
|
+
export { getDb };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './getDB';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./getDB.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './adapter';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./adapter.js";
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Table, surql } from "surrealdb";
|
|
2
|
+
import { getDb } from "../db/index.js";
|
|
3
|
+
import { buildExpression } from "../utils/index.js";
|
|
4
|
+
const count = async ({ model, where, surrealDbProps, ...args })=>{
|
|
5
|
+
const db = await getDb(surrealDbProps);
|
|
6
|
+
const table = new Table(model);
|
|
7
|
+
const expression = buildExpression({
|
|
8
|
+
model,
|
|
9
|
+
where,
|
|
10
|
+
...args
|
|
11
|
+
});
|
|
12
|
+
const query = surql`SELECT count() AS count FROM ${table}`;
|
|
13
|
+
if (expression) query.append(surql` WHERE ${expression}`);
|
|
14
|
+
const [rows] = await db.query(query).json().collect();
|
|
15
|
+
return rows?.[0]?.count ?? 0;
|
|
16
|
+
};
|
|
17
|
+
export { count };
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { RecordId, Table, surql } from "surrealdb";
|
|
2
|
+
import { getDb } from "../db/index.js";
|
|
3
|
+
import { normalizeOutputRecordIds, normalizeRecordIds } from "../utils/index.js";
|
|
4
|
+
const create = async ({ model, data, surrealDbProps, ...args })=>{
|
|
5
|
+
const db = await getDb(surrealDbProps);
|
|
6
|
+
const { id, ...content } = data;
|
|
7
|
+
const normalized = normalizeRecordIds({
|
|
8
|
+
model,
|
|
9
|
+
data: content,
|
|
10
|
+
...args
|
|
11
|
+
});
|
|
12
|
+
const hasId = null != id;
|
|
13
|
+
const target = hasId ? new RecordId(model, String(id)) : new Table(model);
|
|
14
|
+
const [rows] = await db.query(surql`CREATE ${target} CONTENT ${normalized} RETURN AFTER`).json().collect();
|
|
15
|
+
return normalizeOutputRecordIds({
|
|
16
|
+
model,
|
|
17
|
+
data: rows?.[0] ?? null,
|
|
18
|
+
...args
|
|
19
|
+
});
|
|
20
|
+
};
|
|
21
|
+
export { create };
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Table, surql } from "surrealdb";
|
|
2
|
+
import { getDb } from "../db/index.js";
|
|
3
|
+
import { buildExpression } from "../utils/index.js";
|
|
4
|
+
const deleteFn = async ({ model, where, surrealDbProps, ...args })=>{
|
|
5
|
+
if (!where || 0 === where.length) throw new Error('Delete requires a where clause');
|
|
6
|
+
const db = await getDb(surrealDbProps);
|
|
7
|
+
const table = new Table(model);
|
|
8
|
+
const expression = buildExpression({
|
|
9
|
+
model,
|
|
10
|
+
where,
|
|
11
|
+
...args
|
|
12
|
+
});
|
|
13
|
+
const query = surql`DELETE FROM ${table}`;
|
|
14
|
+
if (expression) query.append(surql` WHERE ${expression}`);
|
|
15
|
+
query.append(surql` RETURN BEFORE`);
|
|
16
|
+
await db.query(query);
|
|
17
|
+
};
|
|
18
|
+
export { deleteFn };
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Table, surql } from "surrealdb";
|
|
2
|
+
import { getDb } from "../db/index.js";
|
|
3
|
+
import { buildExpression } from "../utils/index.js";
|
|
4
|
+
const deleteMany = async ({ model, where, surrealDbProps, ...args })=>{
|
|
5
|
+
if (!where || 0 === where.length) throw new Error('DeleteMany requires a where clause');
|
|
6
|
+
const db = await getDb(surrealDbProps);
|
|
7
|
+
const table = new Table(model);
|
|
8
|
+
const expression = buildExpression({
|
|
9
|
+
model,
|
|
10
|
+
where,
|
|
11
|
+
...args
|
|
12
|
+
});
|
|
13
|
+
const query = surql`DELETE FROM ${table}`;
|
|
14
|
+
if (expression) query.append(surql` WHERE ${expression}`);
|
|
15
|
+
query.append(surql` RETURN BEFORE`);
|
|
16
|
+
const [rows] = await db.query(query).json().collect();
|
|
17
|
+
return rows?.length ?? 0;
|
|
18
|
+
};
|
|
19
|
+
export { deleteMany };
|