@holeauth/rbac-drizzle 0.0.1-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Robert Kratz
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,29 @@
1
+ # @holeauth/rbac-drizzle
2
+
3
+ Drizzle adapter implementation of the `RbacAdapter` interface from `@holeauth/plugin-rbac`.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ pnpm add @holeauth/rbac-drizzle drizzle-orm
9
+ ```
10
+
11
+ ## Usage (Postgres)
12
+
13
+ ```ts
14
+ import { createRbacTables, createRbacAdapter } from '@holeauth/rbac-drizzle/pg';
15
+ import { users } from '@/db/schema';
16
+
17
+ export const rbac = createRbacTables({ usersTable: users });
18
+ // → tables.userGroups, tables.userPermissions, (tables.groups if persistGroups: true)
19
+
20
+ const rbacAdapter = createRbacAdapter({ db, tables: rbac.tables });
21
+ ```
22
+
23
+ Subpaths: `@holeauth/rbac-drizzle/pg | /mysql | /sqlite`.
24
+
25
+ ## Notes
26
+
27
+ - Groups themselves are defined in YAML via `@holeauth/rbac-yaml`; only user↔group assignments and user↔permission overrides are stored.
28
+ - Pass `persistGroups: true` to also create a `group` table for admin UIs that want to persist edits.
29
+ - Cascade-delete from your users table wipes assignments automatically.
package/dist/index.cjs ADDED
@@ -0,0 +1,4 @@
1
+ 'use strict';
2
+
3
+ //# sourceMappingURL=index.cjs.map
4
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.cjs"}
@@ -0,0 +1,2 @@
1
+
2
+ export { }
@@ -0,0 +1,2 @@
1
+
2
+ export { }
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+
2
+ //# sourceMappingURL=index.js.map
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
@@ -0,0 +1,99 @@
1
+ 'use strict';
2
+
3
+ var mysqlCore = require('drizzle-orm/mysql-core');
4
+ var drizzleOrm = require('drizzle-orm');
5
+
6
+ // src/mysql/index.ts
7
+ function createRbacTables(opts) {
8
+ const { usersTable, prefix = "holeauth_rbac_", persistGroups = false } = opts;
9
+ const p = (s) => `${prefix}${s}`;
10
+ const userGroups = mysqlCore.mysqlTable(
11
+ p("user_group"),
12
+ {
13
+ userId: mysqlCore.varchar("user_id", { length: 191 }).notNull().references(() => usersTable.id, { onDelete: "cascade" }),
14
+ groupId: mysqlCore.varchar("group_id", { length: 191 }).notNull(),
15
+ assignedAt: mysqlCore.timestamp("assigned_at", { fsp: 3 }).notNull().defaultNow()
16
+ },
17
+ (t) => ({
18
+ pk: mysqlCore.primaryKey({ columns: [t.userId, t.groupId] }),
19
+ groupIdx: mysqlCore.index(`${p("user_group")}_group_idx`).on(t.groupId)
20
+ })
21
+ );
22
+ const userPermissions = mysqlCore.mysqlTable(
23
+ p("user_permission"),
24
+ {
25
+ userId: mysqlCore.varchar("user_id", { length: 191 }).notNull().references(() => usersTable.id, { onDelete: "cascade" }),
26
+ node: mysqlCore.varchar("node", { length: 191 }).notNull(),
27
+ assignedAt: mysqlCore.timestamp("assigned_at", { fsp: 3 }).notNull().defaultNow()
28
+ },
29
+ (t) => ({ pk: mysqlCore.primaryKey({ columns: [t.userId, t.node] }) })
30
+ );
31
+ const userGroupsRelations = drizzleOrm.relations(userGroups, ({ one }) => ({
32
+ user: one(usersTable, { fields: [userGroups.userId], references: [usersTable.id] })
33
+ }));
34
+ const userPermissionsRelations = drizzleOrm.relations(userPermissions, ({ one }) => ({
35
+ user: one(usersTable, { fields: [userPermissions.userId], references: [usersTable.id] })
36
+ }));
37
+ const groups = persistGroups ? mysqlCore.mysqlTable(p("group"), {
38
+ id: mysqlCore.varchar("id", { length: 191 }).primaryKey(),
39
+ displayName: mysqlCore.varchar("display_name", { length: 191 }),
40
+ description: mysqlCore.varchar("description", { length: 512 }),
41
+ priority: mysqlCore.int("priority"),
42
+ isDefault: mysqlCore.boolean("is_default").notNull().default(false),
43
+ effective: mysqlCore.json("effective").$type().notNull(),
44
+ permissions: mysqlCore.json("permissions").$type().notNull()
45
+ }) : void 0;
46
+ return {
47
+ tables: {
48
+ userGroups,
49
+ userPermissions,
50
+ ...groups ? { groups } : {}
51
+ },
52
+ relations: { userGroupsRelations, userPermissionsRelations }
53
+ };
54
+ }
55
+ function createRbacAdapter(opts) {
56
+ const { db, tables } = opts;
57
+ const { userGroups, userPermissions } = tables;
58
+ return {
59
+ async listUserGroups(userId) {
60
+ const rows = await db.select({ groupId: userGroups.groupId }).from(userGroups).where(drizzleOrm.eq(userGroups.userId, userId));
61
+ return rows.map((r) => r.groupId);
62
+ },
63
+ async assignGroup(userId, groupId) {
64
+ await db.insert(userGroups).values({ userId, groupId }).onDuplicateKeyUpdate({ set: { groupId } });
65
+ },
66
+ async removeGroup(userId, groupId) {
67
+ await db.delete(userGroups).where(drizzleOrm.and(drizzleOrm.eq(userGroups.userId, userId), drizzleOrm.eq(userGroups.groupId, groupId)));
68
+ },
69
+ async listUserPermissions(userId) {
70
+ const rows = await db.select({ node: userPermissions.node }).from(userPermissions).where(drizzleOrm.eq(userPermissions.userId, userId));
71
+ return rows.map((r) => r.node);
72
+ },
73
+ async grantPermission(userId, node) {
74
+ await db.insert(userPermissions).values({ userId, node }).onDuplicateKeyUpdate({ set: { node } });
75
+ },
76
+ async revokePermission(userId, node) {
77
+ await db.delete(userPermissions).where(drizzleOrm.and(drizzleOrm.eq(userPermissions.userId, userId), drizzleOrm.eq(userPermissions.node, node)));
78
+ },
79
+ async listAllGroupAssignments() {
80
+ const rows = await db.select().from(userGroups);
81
+ return rows.map(
82
+ (r) => ({
83
+ userId: r.userId,
84
+ groupId: r.groupId,
85
+ assignedAt: r.assignedAt
86
+ })
87
+ );
88
+ },
89
+ async purgeUser(userId) {
90
+ await db.delete(userPermissions).where(drizzleOrm.eq(userPermissions.userId, userId));
91
+ await db.delete(userGroups).where(drizzleOrm.eq(userGroups.userId, userId));
92
+ }
93
+ };
94
+ }
95
+
96
+ exports.createRbacAdapter = createRbacAdapter;
97
+ exports.createRbacTables = createRbacTables;
98
+ //# sourceMappingURL=index.cjs.map
99
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/mysql/index.ts"],"names":["mysqlTable","varchar","timestamp","primaryKey","index","relations","int","boolean","json","eq","and"],"mappings":"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","file":"index.cjs","sourcesContent":["import {\n mysqlTable,\n varchar,\n timestamp,\n int,\n boolean,\n json,\n primaryKey,\n index,\n type MySqlTableWithColumns,\n} from 'drizzle-orm/mysql-core';\nimport { relations, eq, and } from 'drizzle-orm';\nimport type { RbacAdapter, UserGroupAssignment } from '@holeauth/plugin-rbac';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type MysqlUsersTable = MySqlTableWithColumns<any> & { id: any };\n\nexport interface CreateRbacTablesOptions<U extends MysqlUsersTable> {\n usersTable: U;\n prefix?: string;\n persistGroups?: boolean;\n}\n\nexport function createRbacTables<U extends MysqlUsersTable>(opts: CreateRbacTablesOptions<U>) {\n const { usersTable, prefix = 'holeauth_rbac_', persistGroups = false } = opts;\n const p = (s: string) => `${prefix}${s}`;\n\n const userGroups = mysqlTable(\n p('user_group'),\n {\n userId: varchar('user_id', { length: 191 })\n .notNull()\n .references(() => usersTable.id, { onDelete: 'cascade' }),\n groupId: varchar('group_id', { length: 191 }).notNull(),\n assignedAt: timestamp('assigned_at', { fsp: 3 }).notNull().defaultNow(),\n },\n (t) => ({\n pk: primaryKey({ columns: [t.userId, t.groupId] }),\n groupIdx: index(`${p('user_group')}_group_idx`).on(t.groupId),\n }),\n );\n\n const userPermissions = mysqlTable(\n p('user_permission'),\n {\n userId: varchar('user_id', { length: 191 })\n .notNull()\n .references(() => usersTable.id, { onDelete: 'cascade' }),\n node: varchar('node', { length: 191 }).notNull(),\n assignedAt: timestamp('assigned_at', { fsp: 3 }).notNull().defaultNow(),\n },\n (t) => ({ pk: primaryKey({ columns: [t.userId, t.node] }) }),\n );\n\n const userGroupsRelations = relations(userGroups, ({ one }) => ({\n user: one(usersTable, { fields: [userGroups.userId], references: [usersTable.id] }),\n }));\n const userPermissionsRelations = relations(userPermissions, ({ one }) => ({\n user: one(usersTable, { fields: [userPermissions.userId], references: [usersTable.id] }),\n }));\n\n const groups = persistGroups\n ? mysqlTable(p('group'), {\n id: varchar('id', { length: 191 }).primaryKey(),\n displayName: varchar('display_name', { length: 191 }),\n description: varchar('description', { length: 512 }),\n priority: int('priority'),\n isDefault: boolean('is_default').notNull().default(false),\n effective: json('effective').$type<string[]>().notNull(),\n permissions: json('permissions').$type<string[]>().notNull(),\n })\n : undefined;\n\n return {\n tables: {\n userGroups,\n userPermissions,\n ...(groups ? { groups } : {}),\n } as {\n userGroups: typeof userGroups;\n userPermissions: typeof userPermissions;\n groups?: NonNullable<typeof groups>;\n },\n relations: { userGroupsRelations, userPermissionsRelations },\n };\n}\n\ntype RbacTables = ReturnType<typeof createRbacTables>['tables'];\n\nexport interface CreateRbacAdapterOptions {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n db: any;\n tables: RbacTables;\n}\n\nexport function createRbacAdapter(opts: CreateRbacAdapterOptions): RbacAdapter {\n const { db, tables } = opts;\n const { userGroups, userPermissions } = tables;\n // MySQL uses onDuplicateKeyUpdate for idempotent inserts.\n return {\n async listUserGroups(userId) {\n const rows = await db\n .select({ groupId: userGroups.groupId })\n .from(userGroups)\n .where(eq(userGroups.userId, userId));\n return (rows as { groupId: string }[]).map((r) => r.groupId);\n },\n async assignGroup(userId, groupId) {\n await db\n .insert(userGroups)\n .values({ userId, groupId })\n .onDuplicateKeyUpdate({ set: { groupId } });\n },\n async removeGroup(userId, groupId) {\n await db\n .delete(userGroups)\n .where(and(eq(userGroups.userId, userId), eq(userGroups.groupId, groupId)));\n },\n async listUserPermissions(userId) {\n const rows = await db\n .select({ node: userPermissions.node })\n .from(userPermissions)\n .where(eq(userPermissions.userId, userId));\n return (rows as { node: string }[]).map((r) => r.node);\n },\n async grantPermission(userId, node) {\n await db\n .insert(userPermissions)\n .values({ userId, node })\n .onDuplicateKeyUpdate({ set: { node } });\n },\n async revokePermission(userId, node) {\n await db\n .delete(userPermissions)\n .where(and(eq(userPermissions.userId, userId), eq(userPermissions.node, node)));\n },\n async listAllGroupAssignments() {\n const rows = await db.select().from(userGroups);\n return (rows as { userId: string; groupId: string; assignedAt: Date }[]).map(\n (r): UserGroupAssignment => ({\n userId: r.userId,\n groupId: r.groupId,\n assignedAt: r.assignedAt,\n }),\n );\n },\n async purgeUser(userId) {\n await db.delete(userPermissions).where(eq(userPermissions.userId, userId));\n await db.delete(userGroups).where(eq(userGroups.userId, userId));\n },\n };\n}\n"]}
@@ -0,0 +1,275 @@
1
+ import * as drizzle_orm from 'drizzle-orm';
2
+ import * as drizzle_orm_mysql_core from 'drizzle-orm/mysql-core';
3
+ import { MySqlTableWithColumns } from 'drizzle-orm/mysql-core';
4
+ import { RbacAdapter } from '@holeauth/plugin-rbac';
5
+
6
+ type MysqlUsersTable = MySqlTableWithColumns<any> & {
7
+ id: any;
8
+ };
9
+ interface CreateRbacTablesOptions<U extends MysqlUsersTable> {
10
+ usersTable: U;
11
+ prefix?: string;
12
+ persistGroups?: boolean;
13
+ }
14
+ declare function createRbacTables<U extends MysqlUsersTable>(opts: CreateRbacTablesOptions<U>): {
15
+ tables: {
16
+ userGroups: MySqlTableWithColumns<{
17
+ name: string;
18
+ schema: undefined;
19
+ columns: {
20
+ userId: drizzle_orm_mysql_core.MySqlColumn<{
21
+ name: "user_id";
22
+ tableName: string;
23
+ dataType: "string";
24
+ columnType: "MySqlVarChar";
25
+ data: string;
26
+ driverParam: string | number;
27
+ notNull: true;
28
+ hasDefault: false;
29
+ isPrimaryKey: false;
30
+ isAutoincrement: false;
31
+ hasRuntimeDefault: false;
32
+ enumValues: [string, ...string[]];
33
+ baseColumn: never;
34
+ identity: undefined;
35
+ generated: undefined;
36
+ }, object>;
37
+ groupId: drizzle_orm_mysql_core.MySqlColumn<{
38
+ name: "group_id";
39
+ tableName: string;
40
+ dataType: "string";
41
+ columnType: "MySqlVarChar";
42
+ data: string;
43
+ driverParam: string | number;
44
+ notNull: true;
45
+ hasDefault: false;
46
+ isPrimaryKey: false;
47
+ isAutoincrement: false;
48
+ hasRuntimeDefault: false;
49
+ enumValues: [string, ...string[]];
50
+ baseColumn: never;
51
+ identity: undefined;
52
+ generated: undefined;
53
+ }, object>;
54
+ assignedAt: drizzle_orm_mysql_core.MySqlColumn<{
55
+ name: "assigned_at";
56
+ tableName: string;
57
+ dataType: "date";
58
+ columnType: "MySqlTimestamp";
59
+ data: Date;
60
+ driverParam: string | number;
61
+ notNull: true;
62
+ hasDefault: true;
63
+ isPrimaryKey: false;
64
+ isAutoincrement: false;
65
+ hasRuntimeDefault: false;
66
+ enumValues: undefined;
67
+ baseColumn: never;
68
+ identity: undefined;
69
+ generated: undefined;
70
+ }, object>;
71
+ };
72
+ dialect: "mysql";
73
+ }>;
74
+ userPermissions: MySqlTableWithColumns<{
75
+ name: string;
76
+ schema: undefined;
77
+ columns: {
78
+ userId: drizzle_orm_mysql_core.MySqlColumn<{
79
+ name: "user_id";
80
+ tableName: string;
81
+ dataType: "string";
82
+ columnType: "MySqlVarChar";
83
+ data: string;
84
+ driverParam: string | number;
85
+ notNull: true;
86
+ hasDefault: false;
87
+ isPrimaryKey: false;
88
+ isAutoincrement: false;
89
+ hasRuntimeDefault: false;
90
+ enumValues: [string, ...string[]];
91
+ baseColumn: never;
92
+ identity: undefined;
93
+ generated: undefined;
94
+ }, object>;
95
+ node: drizzle_orm_mysql_core.MySqlColumn<{
96
+ name: "node";
97
+ tableName: string;
98
+ dataType: "string";
99
+ columnType: "MySqlVarChar";
100
+ data: string;
101
+ driverParam: string | number;
102
+ notNull: true;
103
+ hasDefault: false;
104
+ isPrimaryKey: false;
105
+ isAutoincrement: false;
106
+ hasRuntimeDefault: false;
107
+ enumValues: [string, ...string[]];
108
+ baseColumn: never;
109
+ identity: undefined;
110
+ generated: undefined;
111
+ }, object>;
112
+ assignedAt: drizzle_orm_mysql_core.MySqlColumn<{
113
+ name: "assigned_at";
114
+ tableName: string;
115
+ dataType: "date";
116
+ columnType: "MySqlTimestamp";
117
+ data: Date;
118
+ driverParam: string | number;
119
+ notNull: true;
120
+ hasDefault: true;
121
+ isPrimaryKey: false;
122
+ isAutoincrement: false;
123
+ hasRuntimeDefault: false;
124
+ enumValues: undefined;
125
+ baseColumn: never;
126
+ identity: undefined;
127
+ generated: undefined;
128
+ }, object>;
129
+ };
130
+ dialect: "mysql";
131
+ }>;
132
+ groups?: NonNullable<MySqlTableWithColumns<{
133
+ name: string;
134
+ schema: undefined;
135
+ columns: {
136
+ id: drizzle_orm_mysql_core.MySqlColumn<{
137
+ name: "id";
138
+ tableName: string;
139
+ dataType: "string";
140
+ columnType: "MySqlVarChar";
141
+ data: string;
142
+ driverParam: string | number;
143
+ notNull: true;
144
+ hasDefault: false;
145
+ isPrimaryKey: true;
146
+ isAutoincrement: false;
147
+ hasRuntimeDefault: false;
148
+ enumValues: [string, ...string[]];
149
+ baseColumn: never;
150
+ identity: undefined;
151
+ generated: undefined;
152
+ }, object>;
153
+ displayName: drizzle_orm_mysql_core.MySqlColumn<{
154
+ name: "display_name";
155
+ tableName: string;
156
+ dataType: "string";
157
+ columnType: "MySqlVarChar";
158
+ data: string;
159
+ driverParam: string | number;
160
+ notNull: false;
161
+ hasDefault: false;
162
+ isPrimaryKey: false;
163
+ isAutoincrement: false;
164
+ hasRuntimeDefault: false;
165
+ enumValues: [string, ...string[]];
166
+ baseColumn: never;
167
+ identity: undefined;
168
+ generated: undefined;
169
+ }, object>;
170
+ description: drizzle_orm_mysql_core.MySqlColumn<{
171
+ name: "description";
172
+ tableName: string;
173
+ dataType: "string";
174
+ columnType: "MySqlVarChar";
175
+ data: string;
176
+ driverParam: string | number;
177
+ notNull: false;
178
+ hasDefault: false;
179
+ isPrimaryKey: false;
180
+ isAutoincrement: false;
181
+ hasRuntimeDefault: false;
182
+ enumValues: [string, ...string[]];
183
+ baseColumn: never;
184
+ identity: undefined;
185
+ generated: undefined;
186
+ }, object>;
187
+ priority: drizzle_orm_mysql_core.MySqlColumn<{
188
+ name: "priority";
189
+ tableName: string;
190
+ dataType: "number";
191
+ columnType: "MySqlInt";
192
+ data: number;
193
+ driverParam: string | number;
194
+ notNull: false;
195
+ hasDefault: false;
196
+ isPrimaryKey: false;
197
+ isAutoincrement: false;
198
+ hasRuntimeDefault: false;
199
+ enumValues: undefined;
200
+ baseColumn: never;
201
+ identity: undefined;
202
+ generated: undefined;
203
+ }, object>;
204
+ isDefault: drizzle_orm_mysql_core.MySqlColumn<{
205
+ name: "is_default";
206
+ tableName: string;
207
+ dataType: "boolean";
208
+ columnType: "MySqlBoolean";
209
+ data: boolean;
210
+ driverParam: number | boolean;
211
+ notNull: true;
212
+ hasDefault: true;
213
+ isPrimaryKey: false;
214
+ isAutoincrement: false;
215
+ hasRuntimeDefault: false;
216
+ enumValues: undefined;
217
+ baseColumn: never;
218
+ identity: undefined;
219
+ generated: undefined;
220
+ }, object>;
221
+ effective: drizzle_orm_mysql_core.MySqlColumn<{
222
+ name: "effective";
223
+ tableName: string;
224
+ dataType: "json";
225
+ columnType: "MySqlJson";
226
+ data: string[];
227
+ driverParam: string;
228
+ notNull: true;
229
+ hasDefault: false;
230
+ isPrimaryKey: false;
231
+ isAutoincrement: false;
232
+ hasRuntimeDefault: false;
233
+ enumValues: undefined;
234
+ baseColumn: never;
235
+ identity: undefined;
236
+ generated: undefined;
237
+ }, object>;
238
+ permissions: drizzle_orm_mysql_core.MySqlColumn<{
239
+ name: "permissions";
240
+ tableName: string;
241
+ dataType: "json";
242
+ columnType: "MySqlJson";
243
+ data: string[];
244
+ driverParam: string;
245
+ notNull: true;
246
+ hasDefault: false;
247
+ isPrimaryKey: false;
248
+ isAutoincrement: false;
249
+ hasRuntimeDefault: false;
250
+ enumValues: undefined;
251
+ baseColumn: never;
252
+ identity: undefined;
253
+ generated: undefined;
254
+ }, object>;
255
+ };
256
+ dialect: "mysql";
257
+ }> | undefined>;
258
+ };
259
+ relations: {
260
+ userGroupsRelations: drizzle_orm.Relations<string, {
261
+ user: drizzle_orm.One<U["_"]["name"], true>;
262
+ }>;
263
+ userPermissionsRelations: drizzle_orm.Relations<string, {
264
+ user: drizzle_orm.One<U["_"]["name"], true>;
265
+ }>;
266
+ };
267
+ };
268
+ type RbacTables = ReturnType<typeof createRbacTables>['tables'];
269
+ interface CreateRbacAdapterOptions {
270
+ db: any;
271
+ tables: RbacTables;
272
+ }
273
+ declare function createRbacAdapter(opts: CreateRbacAdapterOptions): RbacAdapter;
274
+
275
+ export { type CreateRbacAdapterOptions, type CreateRbacTablesOptions, type MysqlUsersTable, createRbacAdapter, createRbacTables };