@permis/drizzle 0.0.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.
@@ -0,0 +1,352 @@
1
+ import * as _$drizzle_orm_sqlite_core0 from "drizzle-orm/sqlite-core";
2
+ import * as _$drizzle_orm_better_sqlite30 from "drizzle-orm/better-sqlite3";
3
+ import { PermisAdapter } from "@permis/core";
4
+
5
+ //#region src/schema.d.ts
6
+ interface PermisSchemaOptions {
7
+ tablePrefix?: string;
8
+ }
9
+ declare function createPermisSchema(options?: PermisSchemaOptions): {
10
+ roles: _$drizzle_orm_sqlite_core0.SQLiteTableWithColumns<{
11
+ name: `${string}roles`;
12
+ schema: undefined;
13
+ columns: {
14
+ name: _$drizzle_orm_sqlite_core0.SQLiteColumn<{
15
+ name: "name";
16
+ tableName: `${string}roles`;
17
+ dataType: "string";
18
+ columnType: "SQLiteText";
19
+ data: string;
20
+ driverParam: string;
21
+ notNull: true;
22
+ hasDefault: false;
23
+ isPrimaryKey: true;
24
+ isAutoincrement: false;
25
+ hasRuntimeDefault: false;
26
+ enumValues: [string, ...string[]];
27
+ baseColumn: never;
28
+ identity: undefined;
29
+ generated: undefined;
30
+ }, {}, {
31
+ length: number | undefined;
32
+ }>;
33
+ description: _$drizzle_orm_sqlite_core0.SQLiteColumn<{
34
+ name: "description";
35
+ tableName: `${string}roles`;
36
+ dataType: "string";
37
+ columnType: "SQLiteText";
38
+ data: string;
39
+ driverParam: string;
40
+ notNull: false;
41
+ hasDefault: false;
42
+ isPrimaryKey: false;
43
+ isAutoincrement: false;
44
+ hasRuntimeDefault: false;
45
+ enumValues: [string, ...string[]];
46
+ baseColumn: never;
47
+ identity: undefined;
48
+ generated: undefined;
49
+ }, {}, {
50
+ length: number | undefined;
51
+ }>;
52
+ condition: _$drizzle_orm_sqlite_core0.SQLiteColumn<{
53
+ name: "condition";
54
+ tableName: `${string}roles`;
55
+ dataType: "json";
56
+ columnType: "SQLiteTextJson";
57
+ data: unknown;
58
+ driverParam: string;
59
+ notNull: false;
60
+ hasDefault: false;
61
+ isPrimaryKey: false;
62
+ isAutoincrement: false;
63
+ hasRuntimeDefault: false;
64
+ enumValues: undefined;
65
+ baseColumn: never;
66
+ identity: undefined;
67
+ generated: undefined;
68
+ }, {}, {}>;
69
+ active: _$drizzle_orm_sqlite_core0.SQLiteColumn<{
70
+ name: "active";
71
+ tableName: `${string}roles`;
72
+ dataType: "boolean";
73
+ columnType: "SQLiteBoolean";
74
+ data: boolean;
75
+ driverParam: number;
76
+ notNull: false;
77
+ hasDefault: true;
78
+ isPrimaryKey: false;
79
+ isAutoincrement: false;
80
+ hasRuntimeDefault: false;
81
+ enumValues: undefined;
82
+ baseColumn: never;
83
+ identity: undefined;
84
+ generated: undefined;
85
+ }, {}, {}>;
86
+ created_at: _$drizzle_orm_sqlite_core0.SQLiteColumn<{
87
+ name: "created_at";
88
+ tableName: `${string}roles`;
89
+ dataType: "date";
90
+ columnType: "SQLiteTimestamp";
91
+ data: Date;
92
+ driverParam: number;
93
+ notNull: true;
94
+ hasDefault: true;
95
+ isPrimaryKey: false;
96
+ isAutoincrement: false;
97
+ hasRuntimeDefault: true;
98
+ enumValues: undefined;
99
+ baseColumn: never;
100
+ identity: undefined;
101
+ generated: undefined;
102
+ }, {}, {}>;
103
+ };
104
+ dialect: 'sqlite';
105
+ }>;
106
+ permissions: _$drizzle_orm_sqlite_core0.SQLiteTableWithColumns<{
107
+ name: `${string}permissions`;
108
+ schema: undefined;
109
+ columns: {
110
+ id: _$drizzle_orm_sqlite_core0.SQLiteColumn<{
111
+ name: "id";
112
+ tableName: `${string}permissions`;
113
+ dataType: "number";
114
+ columnType: "SQLiteInteger";
115
+ data: number;
116
+ driverParam: number;
117
+ notNull: true;
118
+ hasDefault: true;
119
+ isPrimaryKey: true;
120
+ isAutoincrement: false;
121
+ hasRuntimeDefault: false;
122
+ enumValues: undefined;
123
+ baseColumn: never;
124
+ identity: undefined;
125
+ generated: undefined;
126
+ }, {}, {}>;
127
+ action: _$drizzle_orm_sqlite_core0.SQLiteColumn<{
128
+ name: "action";
129
+ tableName: `${string}permissions`;
130
+ dataType: "string";
131
+ columnType: "SQLiteText";
132
+ data: string;
133
+ driverParam: string;
134
+ notNull: true;
135
+ hasDefault: false;
136
+ isPrimaryKey: false;
137
+ isAutoincrement: false;
138
+ hasRuntimeDefault: false;
139
+ enumValues: [string, ...string[]];
140
+ baseColumn: never;
141
+ identity: undefined;
142
+ generated: undefined;
143
+ }, {}, {
144
+ length: number | undefined;
145
+ }>;
146
+ resource: _$drizzle_orm_sqlite_core0.SQLiteColumn<{
147
+ name: "resource";
148
+ tableName: `${string}permissions`;
149
+ dataType: "string";
150
+ columnType: "SQLiteText";
151
+ data: string;
152
+ driverParam: string;
153
+ notNull: true;
154
+ hasDefault: false;
155
+ isPrimaryKey: false;
156
+ isAutoincrement: false;
157
+ hasRuntimeDefault: false;
158
+ enumValues: [string, ...string[]];
159
+ baseColumn: never;
160
+ identity: undefined;
161
+ generated: undefined;
162
+ }, {}, {
163
+ length: number | undefined;
164
+ }>;
165
+ fields: _$drizzle_orm_sqlite_core0.SQLiteColumn<{
166
+ name: "fields";
167
+ tableName: `${string}permissions`;
168
+ dataType: "json";
169
+ columnType: "SQLiteTextJson";
170
+ data: unknown;
171
+ driverParam: string;
172
+ notNull: false;
173
+ hasDefault: false;
174
+ isPrimaryKey: false;
175
+ isAutoincrement: false;
176
+ hasRuntimeDefault: false;
177
+ enumValues: undefined;
178
+ baseColumn: never;
179
+ identity: undefined;
180
+ generated: undefined;
181
+ }, {}, {}>;
182
+ condition: _$drizzle_orm_sqlite_core0.SQLiteColumn<{
183
+ name: "condition";
184
+ tableName: `${string}permissions`;
185
+ dataType: "json";
186
+ columnType: "SQLiteTextJson";
187
+ data: unknown;
188
+ driverParam: string;
189
+ notNull: false;
190
+ hasDefault: false;
191
+ isPrimaryKey: false;
192
+ isAutoincrement: false;
193
+ hasRuntimeDefault: false;
194
+ enumValues: undefined;
195
+ baseColumn: never;
196
+ identity: undefined;
197
+ generated: undefined;
198
+ }, {}, {}>;
199
+ description: _$drizzle_orm_sqlite_core0.SQLiteColumn<{
200
+ name: "description";
201
+ tableName: `${string}permissions`;
202
+ dataType: "string";
203
+ columnType: "SQLiteText";
204
+ data: string;
205
+ driverParam: string;
206
+ notNull: false;
207
+ hasDefault: false;
208
+ isPrimaryKey: false;
209
+ isAutoincrement: false;
210
+ hasRuntimeDefault: false;
211
+ enumValues: [string, ...string[]];
212
+ baseColumn: never;
213
+ identity: undefined;
214
+ generated: undefined;
215
+ }, {}, {
216
+ length: number | undefined;
217
+ }>;
218
+ };
219
+ dialect: 'sqlite';
220
+ }>;
221
+ rolePermissions: _$drizzle_orm_sqlite_core0.SQLiteTableWithColumns<{
222
+ name: `${string}role_permissions`;
223
+ schema: undefined;
224
+ columns: {
225
+ role_name: _$drizzle_orm_sqlite_core0.SQLiteColumn<{
226
+ name: "role_name";
227
+ tableName: `${string}role_permissions`;
228
+ dataType: "string";
229
+ columnType: "SQLiteText";
230
+ data: string;
231
+ driverParam: string;
232
+ notNull: true;
233
+ hasDefault: false;
234
+ isPrimaryKey: false;
235
+ isAutoincrement: false;
236
+ hasRuntimeDefault: false;
237
+ enumValues: [string, ...string[]];
238
+ baseColumn: never;
239
+ identity: undefined;
240
+ generated: undefined;
241
+ }, {}, {
242
+ length: number | undefined;
243
+ }>;
244
+ permission_id: _$drizzle_orm_sqlite_core0.SQLiteColumn<{
245
+ name: "permission_id";
246
+ tableName: `${string}role_permissions`;
247
+ dataType: "number";
248
+ columnType: "SQLiteInteger";
249
+ data: number;
250
+ driverParam: number;
251
+ notNull: true;
252
+ hasDefault: false;
253
+ isPrimaryKey: false;
254
+ isAutoincrement: false;
255
+ hasRuntimeDefault: false;
256
+ enumValues: undefined;
257
+ baseColumn: never;
258
+ identity: undefined;
259
+ generated: undefined;
260
+ }, {}, {}>;
261
+ };
262
+ dialect: 'sqlite';
263
+ }>;
264
+ subjectRoles: _$drizzle_orm_sqlite_core0.SQLiteTableWithColumns<{
265
+ name: `${string}subject_roles`;
266
+ schema: undefined;
267
+ columns: {
268
+ subject_id: _$drizzle_orm_sqlite_core0.SQLiteColumn<{
269
+ name: "subject_id";
270
+ tableName: `${string}subject_roles`;
271
+ dataType: "string";
272
+ columnType: "SQLiteText";
273
+ data: string;
274
+ driverParam: string;
275
+ notNull: true;
276
+ hasDefault: false;
277
+ isPrimaryKey: false;
278
+ isAutoincrement: false;
279
+ hasRuntimeDefault: false;
280
+ enumValues: [string, ...string[]];
281
+ baseColumn: never;
282
+ identity: undefined;
283
+ generated: undefined;
284
+ }, {}, {
285
+ length: number | undefined;
286
+ }>;
287
+ role_name: _$drizzle_orm_sqlite_core0.SQLiteColumn<{
288
+ name: "role_name";
289
+ tableName: `${string}subject_roles`;
290
+ dataType: "string";
291
+ columnType: "SQLiteText";
292
+ data: string;
293
+ driverParam: string;
294
+ notNull: true;
295
+ hasDefault: false;
296
+ isPrimaryKey: false;
297
+ isAutoincrement: false;
298
+ hasRuntimeDefault: false;
299
+ enumValues: [string, ...string[]];
300
+ baseColumn: never;
301
+ identity: undefined;
302
+ generated: undefined;
303
+ }, {}, {
304
+ length: number | undefined;
305
+ }>;
306
+ granted_at: _$drizzle_orm_sqlite_core0.SQLiteColumn<{
307
+ name: "granted_at";
308
+ tableName: `${string}subject_roles`;
309
+ dataType: "date";
310
+ columnType: "SQLiteTimestamp";
311
+ data: Date;
312
+ driverParam: number;
313
+ notNull: true;
314
+ hasDefault: true;
315
+ isPrimaryKey: false;
316
+ isAutoincrement: false;
317
+ hasRuntimeDefault: true;
318
+ enumValues: undefined;
319
+ baseColumn: never;
320
+ identity: undefined;
321
+ generated: undefined;
322
+ }, {}, {}>;
323
+ granted_by: _$drizzle_orm_sqlite_core0.SQLiteColumn<{
324
+ name: "granted_by";
325
+ tableName: `${string}subject_roles`;
326
+ dataType: "string";
327
+ columnType: "SQLiteText";
328
+ data: string;
329
+ driverParam: string;
330
+ notNull: false;
331
+ hasDefault: false;
332
+ isPrimaryKey: false;
333
+ isAutoincrement: false;
334
+ hasRuntimeDefault: false;
335
+ enumValues: [string, ...string[]];
336
+ baseColumn: never;
337
+ identity: undefined;
338
+ generated: undefined;
339
+ }, {}, {
340
+ length: number | undefined;
341
+ }>;
342
+ };
343
+ dialect: 'sqlite';
344
+ }>;
345
+ };
346
+ //#endregion
347
+ //#region src/adapter.d.ts
348
+ type Schema = ReturnType<typeof createPermisSchema>;
349
+ type DrizzleDb = ReturnType<typeof _$drizzle_orm_better_sqlite30.drizzle>;
350
+ declare function drizzleAdapter(db: DrizzleDb, schema: Schema): PermisAdapter;
351
+ //#endregion
352
+ export { type PermisSchemaOptions, createPermisSchema, drizzleAdapter };
package/dist/index.mjs ADDED
@@ -0,0 +1 @@
1
+ import{integer as e,sqliteTable as t,text as n}from"drizzle-orm/sqlite-core";import{and as r,eq as i}from"drizzle-orm";function a(r={}){let i=r.tablePrefix??`permis_`,a=t(`${i}roles`,{name:n(`name`).primaryKey(),description:n(`description`),condition:n(`condition`,{mode:`json`}),active:e(`active`,{mode:`boolean`}).default(!0),created_at:e(`created_at`,{mode:`timestamp`}).notNull().$defaultFn(()=>new Date)}),o=t(`${i}permissions`,{id:e(`id`).primaryKey({autoIncrement:!0}),action:n(`action`).notNull(),resource:n(`resource`).notNull(),fields:n(`fields`,{mode:`json`}),condition:n(`condition`,{mode:`json`}),description:n(`description`)});return{roles:a,permissions:o,rolePermissions:t(`${i}role_permissions`,{role_name:n(`role_name`).notNull().references(()=>a.name,{onDelete:`cascade`}),permission_id:e(`permission_id`).notNull().references(()=>o.id,{onDelete:`cascade`})}),subjectRoles:t(`${i}subject_roles`,{subject_id:n(`subject_id`).notNull(),role_name:n(`role_name`).notNull().references(()=>a.name,{onDelete:`cascade`}),granted_at:e(`granted_at`,{mode:`timestamp`}).notNull().$defaultFn(()=>new Date),granted_by:n(`granted_by`)})}}function o(e,t){let{permissions:n,rolePermissions:a,subjectRoles:o}=t,s={async getRolesForSubject(t){return e.select({roleName:o.role_name}).from(o).where(i(o.subject_id,t)).all().map(e=>e.roleName)},async getPermissionsForRole(t){return e.select({action:n.action,resource:n.resource,fields:n.fields,condition:n.condition,description:n.description}).from(a).innerJoin(n,i(a.permission_id,n.id)).where(i(a.role_name,t)).all().map(e=>{let t={action:e.action,resource:e.resource};if(e.fields)try{t.fields=JSON.parse(e.fields)}catch{}if(e.condition)try{let n=JSON.parse(e.condition);if(Array.isArray(n)){for(let e of n)if(e.operator===`matches`&&typeof e.value==`string`)try{e.value=new RegExp(e.value)}catch{}}t.conditions=n}catch{}return e.description&&(t.description=e.description),t})},async getPermissionsForSubject(t){let n=e.select({roleName:o.role_name}).from(o).where(i(o.subject_id,t)).all().map(e=>e.roleName);if(n.length===0)return[];let r=[];for(let e of n){let t=await s.getPermissionsForRole(e);r.push(...t)}return r},async resolveSubject(e){return{id:e}},async resolveResource(e,t){return{type:e,id:t}},async assignRole(t,n){e.select().from(o).where(r(i(o.subject_id,t),i(o.role_name,n))).all().length===0&&e.insert(o).values({subject_id:t,role_name:n,granted_at:new Date}).run()},async revokeRole(t,n){e.delete(o).where(r(i(o.subject_id,t),i(o.role_name,n))).run()},async grantPermission(t,r){let i=Array.isArray(r.action)?JSON.stringify(r.action):r.action,o=Array.isArray(r.resource)?JSON.stringify(r.resource):r.resource,s=null;if(r.conditions){let e=r.conditions.map(e=>e.operator===`matches`&&e.value instanceof RegExp?{...e,value:e.value.source}:e);s=JSON.stringify(e)}let c=e.insert(n).values({action:i,resource:o,fields:r.fields?JSON.stringify(r.fields):null,condition:s,description:r.description??null}).returning({id:n.id}).get();c&&e.insert(a).values({role_name:t,permission_id:c.id}).run()},async revokePermission(t,o,s){let c=e.select({id:n.id}).from(a).innerJoin(n,i(a.permission_id,n.id)).where(r(i(a.role_name,t),i(n.action,o),i(n.resource,s))).all();for(let t of c)e.delete(a).where(i(a.permission_id,t.id)).run(),e.delete(n).where(i(n.id,t.id)).run()}};return s}export{a as createPermisSchema,o as drizzleAdapter};
package/package.json ADDED
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "@permis/drizzle",
3
+ "version": "0.0.0",
4
+ "files": [
5
+ "dist"
6
+ ],
7
+ "type": "module",
8
+ "sideEffects": false,
9
+ "exports": {
10
+ ".": "./dist/index.mjs",
11
+ "./package.json": "./package.json"
12
+ },
13
+ "scripts": {
14
+ "build": "vp pack",
15
+ "dev": "vp pack --watch",
16
+ "test": "vp test",
17
+ "check": "vp check"
18
+ },
19
+ "dependencies": {
20
+ "@permis/core": "workspace:*"
21
+ },
22
+ "devDependencies": {
23
+ "@types/better-sqlite3": "^7.6.12",
24
+ "better-sqlite3": "^11.10.0",
25
+ "drizzle-orm": "^0.44.0"
26
+ },
27
+ "peerDependencies": {
28
+ "drizzle-orm": "^0.44.0"
29
+ }
30
+ }