@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.
Files changed (124) hide show
  1. package/dist/ai/ui/chat/chatInput/store/input.js +1 -1
  2. package/dist/app/AppDefaults.js +1 -1
  3. package/dist/app/DefaultApp.js +1 -1
  4. package/dist/app/cookieColorSchemeManager.js +1 -1
  5. package/dist/app/defaultTheme.d.ts +1 -1
  6. package/dist/app/index.d.ts +0 -1
  7. package/dist/app/index.js +0 -1
  8. package/dist/betterAuth/client/getAuthClient.d.ts +3050 -0
  9. package/dist/betterAuth/client/getAuthClient.js +18 -0
  10. package/dist/betterAuth/client/index.d.ts +1 -0
  11. package/dist/betterAuth/client/index.js +1 -0
  12. package/dist/betterAuth/index.d.ts +3 -0
  13. package/dist/betterAuth/index.js +3 -0
  14. package/dist/betterAuth/server/auth.test.d.ts +1 -0
  15. package/dist/betterAuth/server/auth.test.js +71 -0
  16. package/dist/betterAuth/server/getAuthServer.d.ts +8 -0
  17. package/dist/betterAuth/server/getAuthServer.js +69 -0
  18. package/dist/betterAuth/server/getDBSession.d.ts +2 -0
  19. package/dist/betterAuth/server/getDBSession.js +85 -0
  20. package/dist/betterAuth/server/getSessionToken.d.ts +1 -0
  21. package/dist/betterAuth/server/getSessionToken.js +13 -0
  22. package/dist/betterAuth/server/getSessionUser.d.ts +1 -0
  23. package/dist/betterAuth/server/getSessionUser.js +21 -0
  24. package/dist/betterAuth/server/index.d.ts +9 -0
  25. package/dist/betterAuth/server/index.js +10 -0
  26. package/dist/betterAuth/server/surrealDbAdapter/adapter.d.ts +8 -0
  27. package/dist/betterAuth/server/surrealDbAdapter/adapter.js +64 -0
  28. package/dist/betterAuth/server/surrealDbAdapter/adapter.test.d.ts +1 -0
  29. package/dist/betterAuth/server/surrealDbAdapter/adapter.test.js +84 -0
  30. package/dist/betterAuth/server/surrealDbAdapter/db/getDB.d.ts +2 -0
  31. package/dist/betterAuth/server/surrealDbAdapter/db/getDB.js +31 -0
  32. package/dist/betterAuth/server/surrealDbAdapter/db/index.d.ts +1 -0
  33. package/dist/betterAuth/server/surrealDbAdapter/db/index.js +1 -0
  34. package/dist/betterAuth/server/surrealDbAdapter/index.d.ts +1 -0
  35. package/dist/betterAuth/server/surrealDbAdapter/index.js +1 -0
  36. package/dist/betterAuth/server/surrealDbAdapter/methods/count.d.ts +2 -0
  37. package/dist/betterAuth/server/surrealDbAdapter/methods/count.js +17 -0
  38. package/dist/betterAuth/server/surrealDbAdapter/methods/create.d.ts +2 -0
  39. package/dist/betterAuth/server/surrealDbAdapter/methods/create.js +21 -0
  40. package/dist/betterAuth/server/surrealDbAdapter/methods/delete.d.ts +2 -0
  41. package/dist/betterAuth/server/surrealDbAdapter/methods/delete.js +18 -0
  42. package/dist/betterAuth/server/surrealDbAdapter/methods/deleteMany.d.ts +2 -0
  43. package/dist/betterAuth/server/surrealDbAdapter/methods/deleteMany.js +19 -0
  44. package/dist/betterAuth/server/surrealDbAdapter/methods/findMany.d.ts +2 -0
  45. package/dist/betterAuth/server/surrealDbAdapter/methods/findMany.js +51 -0
  46. package/dist/betterAuth/server/surrealDbAdapter/methods/findOne.d.ts +2 -0
  47. package/dist/betterAuth/server/surrealDbAdapter/methods/findOne.js +42 -0
  48. package/dist/betterAuth/server/surrealDbAdapter/methods/index.d.ts +8 -0
  49. package/dist/betterAuth/server/surrealDbAdapter/methods/index.js +8 -0
  50. package/dist/betterAuth/server/surrealDbAdapter/methods/types.d.ts +56 -0
  51. package/dist/betterAuth/server/surrealDbAdapter/methods/types.js +0 -0
  52. package/dist/betterAuth/server/surrealDbAdapter/methods/update.d.ts +2 -0
  53. package/dist/betterAuth/server/surrealDbAdapter/methods/update.js +25 -0
  54. package/dist/betterAuth/server/surrealDbAdapter/methods/updateMany.d.ts +2 -0
  55. package/dist/betterAuth/server/surrealDbAdapter/methods/updateMany.js +21 -0
  56. package/dist/betterAuth/server/surrealDbAdapter/types.d.ts +2 -0
  57. package/dist/betterAuth/server/surrealDbAdapter/types.js +0 -0
  58. package/dist/betterAuth/server/surrealDbAdapter/utils/applyJoinMappings.d.ts +2 -0
  59. package/dist/betterAuth/server/surrealDbAdapter/utils/applyJoinMappings.js +31 -0
  60. package/dist/betterAuth/server/surrealDbAdapter/utils/buildExpression.d.ts +3 -0
  61. package/dist/betterAuth/server/surrealDbAdapter/utils/buildExpression.js +58 -0
  62. package/dist/betterAuth/server/surrealDbAdapter/utils/buildJoinPlan.d.ts +9 -0
  63. package/dist/betterAuth/server/surrealDbAdapter/utils/buildJoinPlan.js +46 -0
  64. package/dist/betterAuth/server/surrealDbAdapter/utils/buildSelectFields.d.ts +1 -0
  65. package/dist/betterAuth/server/surrealDbAdapter/utils/buildSelectFields.js +5 -0
  66. package/dist/betterAuth/server/surrealDbAdapter/utils/index.d.ts +6 -0
  67. package/dist/betterAuth/server/surrealDbAdapter/utils/index.js +6 -0
  68. package/dist/betterAuth/server/surrealDbAdapter/utils/normalizeOutputRecordIds.d.ts +2 -0
  69. package/dist/betterAuth/server/surrealDbAdapter/utils/normalizeOutputRecordIds.js +43 -0
  70. package/dist/betterAuth/server/surrealDbAdapter/utils/normalizeRecordIds.d.ts +2 -0
  71. package/dist/betterAuth/server/surrealDbAdapter/utils/normalizeRecordIds.js +38 -0
  72. package/dist/betterAuth/server/surrealDbAdapter/utils/normalizeWhereValue.d.ts +2 -0
  73. package/dist/betterAuth/server/surrealDbAdapter/utils/normalizeWhereValue.js +33 -0
  74. package/dist/betterAuth/server/surrealDbAdapter/utils/types.d.ts +34 -0
  75. package/dist/betterAuth/server/surrealDbAdapter/utils/types.js +0 -0
  76. package/dist/betterAuth/useSessionUser.d.ts +1 -0
  77. package/dist/betterAuth/useSessionUser.js +8 -0
  78. package/dist/surrealDB/deafaultCrud.d.ts +2 -0
  79. package/dist/{tanstackFunctions/surreal → surrealDB}/deafaultCrud.js +6 -5
  80. package/dist/surrealDB/getDBInstance.d.ts +3 -0
  81. package/dist/surrealDB/getDBInstance.js +34 -0
  82. package/dist/surrealDB/getDBInstanceTanstack.d.ts +3 -0
  83. package/dist/{tanstackFunctions/surreal/connection.js → surrealDB/getDBInstanceTanstack.js} +3 -7
  84. package/dist/surrealDB/index.d.ts +6 -0
  85. package/dist/surrealDB/index.js +6 -0
  86. package/dist/{tanstackFunctions/surreal/connection.d.ts → surrealDB/types.d.ts} +3 -3
  87. package/dist/surrealDB/types.js +0 -0
  88. package/dist/{tanstackFunctions → tanstack}/index.d.ts +1 -1
  89. package/dist/{tanstackFunctions → tanstack}/index.js +1 -1
  90. package/dist/{app/defaultRequestMiddlewares.d.ts → tanstack/middlewares/index.d.ts} +2 -0
  91. package/dist/tanstack/middlewares/index.js +5 -0
  92. package/dist/tanstack/middlewares/locale.d.ts +4 -0
  93. package/dist/{app/defaultRequestMiddlewares.js → tanstack/middlewares/locale.js} +2 -5
  94. package/dist/ui/JsonInput.js +1 -1
  95. package/dist/ui/form/index.d.ts +0 -1
  96. package/dist/ui/form/index.js +1 -2
  97. package/dist/{ui/form/fieldsSchema.d.ts → zodSchemas.d.ts} +1 -1
  98. package/dist/{ui/form/fieldsSchema.js → zodSchemas.js} +2 -2
  99. package/package.json +17 -15
  100. package/dist/index.d.ts +0 -5
  101. package/dist/index.js +0 -5
  102. package/dist/tanstackFunctions/surreal/deafaultCrud.d.ts +0 -2
  103. package/dist/tanstackFunctions/surreal/index.d.ts +0 -4
  104. package/dist/tanstackFunctions/surreal/index.js +0 -4
  105. /package/dist/{tanstackFunctions/surreal → surrealDB}/deserialize.d.ts +0 -0
  106. /package/dist/{tanstackFunctions/surreal → surrealDB}/deserialize.js +0 -0
  107. /package/dist/{tanstackFunctions/surreal → surrealDB}/encryption.d.ts +0 -0
  108. /package/dist/{tanstackFunctions/surreal → surrealDB}/encryption.js +0 -0
  109. /package/dist/{tanstackFunctions → tanstack}/cookie/getCookie.d.ts +0 -0
  110. /package/dist/{tanstackFunctions → tanstack}/cookie/getCookie.js +0 -0
  111. /package/dist/{tanstackFunctions → tanstack}/cookie/index.d.ts +0 -0
  112. /package/dist/{tanstackFunctions → tanstack}/cookie/index.js +0 -0
  113. /package/dist/{tanstackFunctions → tanstack}/cookie/setCookie.d.ts +0 -0
  114. /package/dist/{tanstackFunctions → tanstack}/cookie/setCookie.js +0 -0
  115. /package/dist/{tanstackFunctions → tanstack}/cookie/setCookies.d.ts +0 -0
  116. /package/dist/{tanstackFunctions → tanstack}/cookie/setCookies.js +0 -0
  117. /package/dist/{tanstackFunctions → tanstack}/s3/getS3Client.d.ts +0 -0
  118. /package/dist/{tanstackFunctions → tanstack}/s3/getS3Client.js +0 -0
  119. /package/dist/{tanstackFunctions → tanstack}/s3/getSignedFileUrlFn.d.ts +0 -0
  120. /package/dist/{tanstackFunctions → tanstack}/s3/getSignedFileUrlFn.js +0 -0
  121. /package/dist/{tanstackFunctions → tanstack}/s3/index.d.ts +0 -0
  122. /package/dist/{tanstackFunctions → tanstack}/s3/index.js +0 -0
  123. /package/dist/{tanstackFunctions → tanstack}/s3/uploadRequest.d.ts +0 -0
  124. /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,3 @@
1
+ export * from './client';
2
+ export * from './server';
3
+ export * from './useSessionUser';
@@ -0,0 +1,3 @@
1
+ export * from "./client/index.js";
2
+ export * from "./server/index.js";
3
+ export * from "./useSessionUser.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,2 @@
1
+ import type { SurrealDBProps } from '../../surrealDB/types';
2
+ export declare const getDBSession: (surrealDBProps?: SurrealDBProps) => Promise<import("surrealdb").SurrealSession>;
@@ -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,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,2 @@
1
+ import type { SurrealDBProps } from '../../../../surrealDB/types';
2
+ export declare const getDb: (props?: SurrealDBProps) => Promise<import("surrealdb").Surreal>;
@@ -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,2 @@
1
+ import type { Count } from './types';
2
+ export declare const count: ({ model, where, surrealDbProps, ...args }: Count) => Promise<number>;
@@ -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,2 @@
1
+ import type { Create } from './types';
2
+ export declare const create: <T extends Record<string, unknown>>({ model, data, surrealDbProps, ...args }: Create<T>) => Promise<T>;
@@ -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,2 @@
1
+ import type { Delete } from './types';
2
+ export declare const deleteFn: ({ model, where, surrealDbProps, ...args }: Delete) => Promise<void>;
@@ -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,2 @@
1
+ import type { DeleteMany } from './types';
2
+ export declare const deleteMany: ({ model, where, surrealDbProps, ...args }: DeleteMany) => Promise<number>;
@@ -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 };
@@ -0,0 +1,2 @@
1
+ import type { FindMany } from './types';
2
+ export declare const findMany: <T>({ model, where, limit, offset, sortBy, join, surrealDbProps, ...args }: FindMany) => Promise<T[]>;