@vexcms/better-auth 0.0.20 → 0.1.0-alpha.2

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.
@@ -0,0 +1,103 @@
1
+ import type { MutationBuilder, QueryBuilder, GenericDataModel, FunctionReference, GenericActionCtx } from "convex/server";
2
+ /**
3
+ * The DB operation function signatures — typed as `FunctionReference` to match
4
+ * `internal.auth.db.*` in the user's project. These are the "registered"
5
+ * mutation/query types that `ctx.runMutation` and `ctx.runQuery` accept.
6
+ *
7
+ * Follows the same pattern as `VexFindRef`, `VexCreateRef`, etc. in
8
+ * `@vexcms/core/src/convex/index.ts`.
9
+ */
10
+ export type BetterAuthDbHandlers = {
11
+ dbCreate: FunctionReference<"mutation", "internal", {
12
+ betterAuthSchema: string;
13
+ data: unknown;
14
+ model: string;
15
+ select?: string[];
16
+ }, unknown>;
17
+ dbFindOne: FunctionReference<"query", "internal", {
18
+ betterAuthSchema: string;
19
+ model: string;
20
+ select?: string[];
21
+ where: unknown[];
22
+ }, unknown>;
23
+ dbFindMany: FunctionReference<"query", "internal", {
24
+ betterAuthSchema: string;
25
+ model: string;
26
+ limit?: number;
27
+ sortBy?: {
28
+ direction: "asc" | "desc";
29
+ field: string;
30
+ };
31
+ where?: unknown[];
32
+ }, unknown[]>;
33
+ dbCount: FunctionReference<"query", "internal", {
34
+ betterAuthSchema: string;
35
+ model: string;
36
+ where?: unknown[];
37
+ }, number>;
38
+ dbUpdate: FunctionReference<"mutation", "internal", {
39
+ betterAuthSchema: string;
40
+ model: string;
41
+ update: unknown;
42
+ where: unknown[];
43
+ }, unknown>;
44
+ dbUpdateMany: FunctionReference<"mutation", "internal", {
45
+ betterAuthSchema: string;
46
+ model: string;
47
+ update: unknown;
48
+ where: unknown[];
49
+ }, number>;
50
+ dbDelete: FunctionReference<"mutation", "internal", {
51
+ betterAuthSchema: string;
52
+ model: string;
53
+ where: unknown[];
54
+ }, void>;
55
+ dbDeleteMany: FunctionReference<"mutation", "internal", {
56
+ betterAuthSchema: string;
57
+ model: string;
58
+ where: unknown[];
59
+ }, number>;
60
+ };
61
+ /**
62
+ * Arguments to `createBetterAuthAdapter` — follows the same pattern as
63
+ * `queryApi` and `mutationApi` in `@vexcms/core/src/convex/server.ts`.
64
+ *
65
+ * The factory accepts the user's Convex `internalMutation`/`internalQuery`
66
+ * builders so this package can create the DB mutations/queries without
67
+ * hardcoding paths. Visibility is always `"internal"` for better-auth.
68
+ *
69
+ * @typeParam DataModel - The user's Convex DataModel (from `_generated/dataModel`).
70
+ */
71
+ export type CreateBetterAuthAdapterArgs<DataModel extends GenericDataModel> = {
72
+ /** The user's `internalMutation` from `convex/_generated/server`. */
73
+ internalMutation: MutationBuilder<DataModel, "internal">;
74
+ /** The user's `internalQuery` from `convex/_generated/server`. */
75
+ internalQuery: QueryBuilder<DataModel, "internal">;
76
+ };
77
+ /**
78
+ * Return value from `createBetterAuthAdapter`.
79
+ *
80
+ * Export `db` so `ctx.runMutation(internal.auth.db.dbX, ...)` call sites
81
+ * continue to work — the adapter calls these via `ctx.runMutation` and
82
+ * `ctx.runQuery`.
83
+ */
84
+ export type CreateBetterAuthAdapterResult = {
85
+ /** The Better Auth database adapter. Pass to `betterAuth({ database: adapter })`. */
86
+ adapter: any;
87
+ /** DB operations typed as `FunctionReference<"mutation" | "query", "internal">`. */
88
+ db: BetterAuthDbHandlers;
89
+ };
90
+ /**
91
+ * Factory function signature — follows the same pattern as `queryApi` in
92
+ * `@vexcms/core/src/convex/server.ts`.
93
+ *
94
+ * @typeParam DataModel - The user's Convex DataModel (from `_generated/dataModel`).
95
+ * @param ctx - The Convex action context.
96
+ * @param args.internalMutation - The user's `internalMutation` from `convex/_generated/server`.
97
+ * @param args.internalQuery - The user's `internalQuery` from `convex/_generated/server`.
98
+ * @returns `{ adapter, db }` — export `db` so internal.auth.db.* call sites work.
99
+ */
100
+ export interface CreateBetterAuthAdapter {
101
+ <DataModel extends GenericDataModel>(ctx: GenericActionCtx<DataModel>, args: CreateBetterAuthAdapterArgs<DataModel>): CreateBetterAuthAdapterResult;
102
+ }
103
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/convex/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ import type { BetterAuthDBSchema } from "better-auth/db";
2
+ import type { DocumentByName, GenericDataModel, GenericQueryCtx, PaginationOptions, PaginationResult, SchemaDefinition, TableNamesInDataModel } from "convex/server";
3
+ export type QueryArgs = {
4
+ limit?: number;
5
+ model: string;
6
+ offset?: number;
7
+ select?: string[];
8
+ sortBy?: {
9
+ direction: "asc" | "desc";
10
+ field: string;
11
+ };
12
+ where?: WhereClause[];
13
+ };
14
+ export type WhereClause = {
15
+ connector?: "AND" | "OR";
16
+ field: string;
17
+ operator?: "contains" | "ends_with" | "eq" | "gt" | "gte" | "in" | "lt" | "lte" | "ne" | "not_in" | "starts_with";
18
+ value: boolean | null | number | number[] | string | string[];
19
+ };
20
+ export declare const isUniqueField: (betterAuthSchema: BetterAuthDBSchema, model: string, field: string) => boolean;
21
+ export declare const hasUniqueFields: (betterAuthSchema: BetterAuthDBSchema, model: string, input: Record<string, any>) => boolean;
22
+ export declare const findIndex: (schema: SchemaDefinition<any, any>, args: QueryArgs) => {
23
+ indexFields: (string | number | boolean | string[] | number[] | null)[];
24
+ boundField?: undefined;
25
+ index?: undefined;
26
+ sortField?: undefined;
27
+ values?: undefined;
28
+ } | {
29
+ boundField: string;
30
+ index: {
31
+ fields: any[];
32
+ indexDescriptor: any;
33
+ };
34
+ sortField: string | undefined;
35
+ values: {
36
+ eq: (string | number | boolean | string[] | number[] | null)[];
37
+ gt: string | number | boolean | string[] | number[] | null | undefined;
38
+ gte: string | number | boolean | string[] | number[] | null | undefined;
39
+ lt: string | number | boolean | string[] | number[] | null | undefined;
40
+ lte: string | number | boolean | string[] | number[] | null | undefined;
41
+ };
42
+ indexFields?: undefined;
43
+ } | undefined;
44
+ export declare const checkUniqueFields: <Schema extends SchemaDefinition<any, any>>(ctx: GenericQueryCtx<GenericDataModel>, schema: Schema, betterAuthSchema: BetterAuthDBSchema, table: string, input: Record<string, any>, doc?: Record<string, any>) => Promise<void>;
45
+ export declare const selectFields: <T extends TableNamesInDataModel<GenericDataModel>, D extends DocumentByName<GenericDataModel, T>>(doc: D | null, select?: string[]) => D | null;
46
+ export declare const filterByWhere: <T extends TableNamesInDataModel<GenericDataModel>, D extends DocumentByName<GenericDataModel, T>>(doc: D | null, where?: WhereClause[], filterWhere?: (w: WhereClause) => any) => boolean;
47
+ export declare const paginate: <Doc extends DocumentByName<GenericDataModel, T>, T extends TableNamesInDataModel<GenericDataModel>>(ctx: GenericQueryCtx<GenericDataModel>, schema: SchemaDefinition<any, any>, betterAuthSchema: BetterAuthDBSchema, args: QueryArgs & {
48
+ paginationOpts: PaginationOptions;
49
+ }) => Promise<PaginationResult<Doc>>;
50
+ export declare const listOne: <Doc extends DocumentByName<GenericDataModel, T>, T extends TableNamesInDataModel<GenericDataModel>>(ctx: GenericQueryCtx<GenericDataModel>, schema: SchemaDefinition<any, any>, betterAuthSchema: BetterAuthDBSchema, args: QueryArgs) => Promise<Doc | null>;
51
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/convex/utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,KAAK,EACV,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,qBAAqB,EACtB,MAAM,eAAe,CAAC;AAMvB,MAAM,MAAM,SAAS,GAAG;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,CAAC,EAAE;QACP,SAAS,EAAE,KAAK,GAAG,MAAM,CAAC;QAC1B,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,KAAK,CAAC,EAAE,WAAW,EAAE,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,SAAS,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EACL,UAAU,GACV,WAAW,GACX,IAAI,GACJ,IAAI,GACJ,KAAK,GACL,IAAI,GACJ,IAAI,GACJ,KAAK,GACL,IAAI,GACJ,QAAQ,GACR,aAAa,CAAC;IAClB,KAAK,EAAE,OAAO,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,MAAM,GAAG,MAAM,EAAE,CAAC;CAC/D,CAAC;AAEF,eAAO,MAAM,aAAa,GACxB,kBAAkB,kBAAkB,EACpC,OAAO,MAAM,EACb,OAAO,MAAM,KACZ,OASF,CAAC;AAEF,eAAO,MAAM,eAAe,GAC1B,kBAAkB,kBAAkB,EACpC,OAAO,MAAM,EACb,OAAO,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KACzB,OAOF,CAAC;AAEF,eAAO,MAAM,SAAS,GACpB,QAAQ,gBAAgB,CAAC,GAAG,EAAE,GAAG,CAAC,EAClC,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;aA6HhB,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAC5B,MAAM,SAAS,gBAAgB,CAAC,GAAG,EAAE,GAAG,CAAC,EAEzC,KAAK,eAAe,CAAC,gBAAgB,CAAC,EACtC,QAAQ,MAAM,EACd,kBAAkB,kBAAkB,EACpC,OAAO,MAAM,EACb,OAAO,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC1B,MAAM,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,kBAyB1B,CAAC;AAEF,eAAO,MAAM,YAAY,GACvB,CAAC,SAAS,qBAAqB,CAAC,gBAAgB,CAAC,EACjD,CAAC,SAAS,cAAc,CAAC,gBAAgB,EAAE,CAAC,CAAC,EAE7C,KAAK,CAAC,GAAG,IAAI,EACb,SAAS,MAAM,EAAE,KAChB,CAAC,GAAG,IAWN,CAAC;AAEF,eAAO,MAAM,aAAa,GACxB,CAAC,SAAS,qBAAqB,CAAC,gBAAgB,CAAC,EACjD,CAAC,SAAS,cAAc,CAAC,gBAAgB,EAAE,CAAC,CAAC,EAE7C,KAAK,CAAC,GAAG,IAAI,EACb,QAAQ,WAAW,EAAE,EAErB,cAAc,CAAC,CAAC,EAAE,WAAW,KAAK,GAAG,KACpC,OAwEF,CAAC;AAuEF,eAAO,MAAM,QAAQ,GACnB,GAAG,SAAS,cAAc,CAAC,gBAAgB,EAAE,CAAC,CAAC,EAC/C,CAAC,SAAS,qBAAqB,CAAC,gBAAgB,CAAC,EAEjD,KAAK,eAAe,CAAC,gBAAgB,CAAC,EACtC,QAAQ,gBAAgB,CAAC,GAAG,EAAE,GAAG,CAAC,EAClC,kBAAkB,kBAAkB,EACpC,MAAM,SAAS,GAAG;IAChB,cAAc,EAAE,iBAAiB,CAAC;CACnC,KACA,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,CA0J/B,CAAC;AAEF,eAAO,MAAM,OAAO,GAClB,GAAG,SAAS,cAAc,CAAC,gBAAgB,EAAE,CAAC,CAAC,EAC/C,CAAC,SAAS,qBAAqB,CAAC,gBAAgB,CAAC,EAEjD,KAAK,eAAe,CAAC,gBAAgB,CAAC,EACtC,QAAQ,gBAAgB,CAAC,GAAG,EAAE,GAAG,CAAC,EAClC,kBAAkB,kBAAkB,EACpC,MAAM,SAAS,KACd,OAAO,CAAC,GAAG,GAAG,IAAI,CAUpB,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,51 +1,45 @@
1
- import { VexAuthAdapter } from '@vexcms/core';
2
- import { BetterAuthOptions } from 'better-auth';
3
-
4
- interface VexBetterAuthOptions {
5
- config?: BetterAuthOptions;
6
- }
7
- type UserFields = "name" | "email" | "emailVerified" | "image" | "createdAt" | "updatedAt";
8
- type SessionFields = "expiresAt" | "token" | "createdAt" | "updatedAt" | "ipAddress" | "userAgent" | "userId";
9
- type AccountFields = "accountId" | "providerId" | "userId" | "accessToken" | "refreshToken" | "accessTokenExpiresAt" | "refreshTokenExpiresAt" | "scope" | "password" | "createdAt" | "updatedAt";
10
- type VerificationFields = "identifier" | "value" | "expiresAt" | "createdAt" | "updatedAt";
11
1
  /**
12
- * Type-level map from collection slug to field key union.
13
- * Base fields are always present; plugin-added fields work at runtime
14
- * but don't get autocomplete.
15
- */
16
- type BetterAuthFieldKeyMap = {
17
- user: UserFields;
18
- session: SessionFields;
19
- account: AccountFields;
20
- verification: VerificationFields;
21
- };
22
- /**
23
- * The typed adapter returned by `vexBetterAuth()`.
24
- * Base field keys are preserved as string literals
25
- * for autocomplete in `defineCollection`.
26
- */
27
- type BetterAuthAdapter = VexAuthAdapter<BetterAuthFieldKeyMap>;
28
- /**
29
- * Creates a VexAuthAdapter from a BetterAuthOptions config.
2
+ * @vexcms/better-auth package entry point.
30
3
  *
31
- * Accepts the same config object you pass to betterAuth() on the server.
32
- * Only reads schema-affecting properties (modelNames, additionalFields, plugins).
33
- * Runtime options (database, secret, baseURL, etc.) are ignored.
4
+ * Integrates [Better Auth](https://better-auth.com/) with VexCMS as the auth backend.
5
+ * Call `betterAuthAdapter()` in `vex.config.ts` to register Better Auth collections
6
+ * as VexCMS collections. Use `authDbApi()` and `createBetterAuthAdapter()` in your
7
+ * Convex schema to wire the DB adapter.
34
8
  *
35
9
  * @example
36
10
  * ```ts
37
- * import { vexBetterAuth } from "@vexcms/better-auth";
38
- * import { admin } from "better-auth/plugins";
11
+ * // vex.config.ts
12
+ * import { betterAuthAdapter } from "@vexcms/better-auth";
13
+ * import { authOptions } from "~/auth/options";
39
14
  *
40
15
  * export default defineConfig({
41
- * auth: vexBetterAuth({
42
- * user: { modelName: "users" },
43
- * plugins: [admin()],
44
- * }),
45
- * // ...
16
+ * auth: betterAuthAdapter({ config: authOptions }),
17
+ * collections: [posts],
46
18
  * });
47
19
  * ```
20
+ *
21
+ * @example
22
+ * ```ts
23
+ * // convex/auth/db.ts — wire the DB adapter into Convex
24
+ * import { authDbApi } from "@vexcms/better-auth/convex";
25
+ * import { internalMutation, internalQuery } from "convex/_generated/server";
26
+ * import schema from "../schema";
27
+ *
28
+ * export const {
29
+ * dbCreate,
30
+ * dbFindOne,
31
+ * dbFindMany,
32
+ * dbCount,
33
+ * dbUpdate,
34
+ * dbUpdateMany,
35
+ * dbDelete,
36
+ * dbDeleteMany,
37
+ * } = authDbApi({ schema, internalQuery, internalMutation });
38
+ * ```
39
+ *
40
+ * @see {@link betterAuthAdapter} for the main Vex auth adapter function
41
+ * @see {@link authDbApi} for wiring the Convex DB operations
48
42
  */
49
- declare function vexBetterAuth(props?: VexBetterAuthOptions): BetterAuthAdapter;
50
-
51
- export { type BetterAuthAdapter, vexBetterAuth };
43
+ export { betterAuthAdapter, type BetterAuthAdapterOptions } from "./adapter";
44
+ export { authDbApi, createBetterAuthAdapter, convexAdapter, createGetAuth, type CreateBetterAuthAdapterArgs, type CreateBetterAuthAdapterResult, } from "./convex";
45
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,OAAO,EAAE,iBAAiB,EAAE,KAAK,wBAAwB,EAAE,MAAM,WAAW,CAAC;AAC7E,OAAO,EACL,SAAS,EACT,uBAAuB,EACvB,aAAa,EACb,aAAa,EACb,KAAK,2BAA2B,EAChC,KAAK,6BAA6B,GACnC,MAAM,UAAU,CAAC"}