@forgebase/database 0.0.1

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 (219) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +470 -0
  3. package/dist/cjs/adapters/base.d.ts +20 -0
  4. package/dist/cjs/adapters/base.d.ts.map +1 -0
  5. package/dist/cjs/adapters/base.js +13 -0
  6. package/dist/cjs/adapters/base.js.map +1 -0
  7. package/dist/cjs/adapters/index.d.ts +6 -0
  8. package/dist/cjs/adapters/index.d.ts.map +1 -0
  9. package/dist/cjs/adapters/index.js +24 -0
  10. package/dist/cjs/adapters/index.js.map +1 -0
  11. package/dist/cjs/adapters/postgres.d.ts +13 -0
  12. package/dist/cjs/adapters/postgres.d.ts.map +1 -0
  13. package/dist/cjs/adapters/postgres.js +51 -0
  14. package/dist/cjs/adapters/postgres.js.map +1 -0
  15. package/dist/cjs/adapters/sqlite.d.ts +13 -0
  16. package/dist/cjs/adapters/sqlite.d.ts.map +1 -0
  17. package/dist/cjs/adapters/sqlite.js +47 -0
  18. package/dist/cjs/adapters/sqlite.js.map +1 -0
  19. package/dist/cjs/adapters/types.d.ts +8 -0
  20. package/dist/cjs/adapters/types.d.ts.map +1 -0
  21. package/dist/cjs/adapters/types.js +3 -0
  22. package/dist/cjs/adapters/types.js.map +1 -0
  23. package/dist/cjs/database.d.ts +73 -0
  24. package/dist/cjs/database.d.ts.map +1 -0
  25. package/dist/cjs/database.js +673 -0
  26. package/dist/cjs/database.js.map +1 -0
  27. package/dist/cjs/errors.d.ts +37 -0
  28. package/dist/cjs/errors.d.ts.map +1 -0
  29. package/dist/cjs/errors.js +64 -0
  30. package/dist/cjs/errors.js.map +1 -0
  31. package/dist/cjs/index.d.ts +16 -0
  32. package/dist/cjs/index.d.ts.map +1 -0
  33. package/dist/cjs/index.js +31 -0
  34. package/dist/cjs/index.js.map +1 -0
  35. package/dist/cjs/kysely-hooks.d.ts +45 -0
  36. package/dist/cjs/kysely-hooks.d.ts.map +1 -0
  37. package/dist/cjs/kysely-hooks.js +93 -0
  38. package/dist/cjs/kysely-hooks.js.map +1 -0
  39. package/dist/cjs/libsql/example.d.ts +2 -0
  40. package/dist/cjs/libsql/example.d.ts.map +1 -0
  41. package/dist/cjs/libsql/example.js +44 -0
  42. package/dist/cjs/libsql/example.js.map +1 -0
  43. package/dist/cjs/libsql/index.d.ts +36 -0
  44. package/dist/cjs/libsql/index.d.ts.map +1 -0
  45. package/dist/cjs/libsql/index.js +155 -0
  46. package/dist/cjs/libsql/index.js.map +1 -0
  47. package/dist/cjs/permissionService.d.ts +20 -0
  48. package/dist/cjs/permissionService.d.ts.map +1 -0
  49. package/dist/cjs/permissionService.js +107 -0
  50. package/dist/cjs/permissionService.js.map +1 -0
  51. package/dist/cjs/rlsFunctionRegistry.d.ts +43 -0
  52. package/dist/cjs/rlsFunctionRegistry.d.ts.map +1 -0
  53. package/dist/cjs/rlsFunctionRegistry.js +63 -0
  54. package/dist/cjs/rlsFunctionRegistry.js.map +1 -0
  55. package/dist/cjs/rlsManager.d.ts +23 -0
  56. package/dist/cjs/rlsManager.d.ts.map +1 -0
  57. package/dist/cjs/rlsManager.js +371 -0
  58. package/dist/cjs/rlsManager.js.map +1 -0
  59. package/dist/cjs/schema.d.ts +15 -0
  60. package/dist/cjs/schema.d.ts.map +1 -0
  61. package/dist/cjs/schema.js +119 -0
  62. package/dist/cjs/schema.js.map +1 -0
  63. package/dist/cjs/sdk/client.d.ts +324 -0
  64. package/dist/cjs/sdk/client.d.ts.map +1 -0
  65. package/dist/cjs/sdk/client.js +554 -0
  66. package/dist/cjs/sdk/client.js.map +1 -0
  67. package/dist/cjs/sdk/examples.d.ts +68 -0
  68. package/dist/cjs/sdk/examples.d.ts.map +1 -0
  69. package/dist/cjs/sdk/examples.js +232 -0
  70. package/dist/cjs/sdk/examples.js.map +1 -0
  71. package/dist/cjs/sdk/server.d.ts +115 -0
  72. package/dist/cjs/sdk/server.d.ts.map +1 -0
  73. package/dist/cjs/sdk/server.js +140 -0
  74. package/dist/cjs/sdk/server.js.map +1 -0
  75. package/dist/cjs/types.d.ts +217 -0
  76. package/dist/cjs/types.d.ts.map +1 -0
  77. package/dist/cjs/types.js +5 -0
  78. package/dist/cjs/types.js.map +1 -0
  79. package/dist/cjs/utils/column-utils.d.ts +8 -0
  80. package/dist/cjs/utils/column-utils.d.ts.map +1 -0
  81. package/dist/cjs/utils/column-utils.js +131 -0
  82. package/dist/cjs/utils/column-utils.js.map +1 -0
  83. package/dist/cjs/utils/db.d.ts +2 -0
  84. package/dist/cjs/utils/db.d.ts.map +1 -0
  85. package/dist/cjs/utils/db.js +6 -0
  86. package/dist/cjs/utils/db.js.map +1 -0
  87. package/dist/cjs/utils/inspector.d.ts +39 -0
  88. package/dist/cjs/utils/inspector.d.ts.map +1 -0
  89. package/dist/cjs/utils/inspector.js +164 -0
  90. package/dist/cjs/utils/inspector.js.map +1 -0
  91. package/dist/cjs/utils/permission-initializer.d.ts +15 -0
  92. package/dist/cjs/utils/permission-initializer.d.ts.map +1 -0
  93. package/dist/cjs/utils/permission-initializer.js +173 -0
  94. package/dist/cjs/utils/permission-initializer.js.map +1 -0
  95. package/dist/cjs/websocket/RealtimeAdapter.d.ts +22 -0
  96. package/dist/cjs/websocket/RealtimeAdapter.d.ts.map +1 -0
  97. package/dist/cjs/websocket/RealtimeAdapter.js +3 -0
  98. package/dist/cjs/websocket/RealtimeAdapter.js.map +1 -0
  99. package/dist/cjs/websocket/SSEManager.d.ts +40 -0
  100. package/dist/cjs/websocket/SSEManager.d.ts.map +1 -0
  101. package/dist/cjs/websocket/SSEManager.js +268 -0
  102. package/dist/cjs/websocket/SSEManager.js.map +1 -0
  103. package/dist/cjs/websocket/WebSocketManager.d.ts +28 -0
  104. package/dist/cjs/websocket/WebSocketManager.d.ts.map +1 -0
  105. package/dist/cjs/websocket/WebSocketManager.js +156 -0
  106. package/dist/cjs/websocket/WebSocketManager.js.map +1 -0
  107. package/dist/cjs/websocket/index.d.ts +4 -0
  108. package/dist/cjs/websocket/index.d.ts.map +1 -0
  109. package/dist/cjs/websocket/index.js +20 -0
  110. package/dist/cjs/websocket/index.js.map +1 -0
  111. package/dist/esm/adapters/base.d.ts +20 -0
  112. package/dist/esm/adapters/base.d.ts.map +1 -0
  113. package/dist/esm/adapters/base.js +10 -0
  114. package/dist/esm/adapters/base.js.map +1 -0
  115. package/dist/esm/adapters/index.d.ts +6 -0
  116. package/dist/esm/adapters/index.d.ts.map +1 -0
  117. package/dist/esm/adapters/index.js +19 -0
  118. package/dist/esm/adapters/index.js.map +1 -0
  119. package/dist/esm/adapters/postgres.d.ts +13 -0
  120. package/dist/esm/adapters/postgres.d.ts.map +1 -0
  121. package/dist/esm/adapters/postgres.js +47 -0
  122. package/dist/esm/adapters/postgres.js.map +1 -0
  123. package/dist/esm/adapters/sqlite.d.ts +13 -0
  124. package/dist/esm/adapters/sqlite.d.ts.map +1 -0
  125. package/dist/esm/adapters/sqlite.js +43 -0
  126. package/dist/esm/adapters/sqlite.js.map +1 -0
  127. package/dist/esm/adapters/types.d.ts +8 -0
  128. package/dist/esm/adapters/types.d.ts.map +1 -0
  129. package/dist/esm/adapters/types.js +2 -0
  130. package/dist/esm/adapters/types.js.map +1 -0
  131. package/dist/esm/database.d.ts +73 -0
  132. package/dist/esm/database.d.ts.map +1 -0
  133. package/dist/esm/database.js +668 -0
  134. package/dist/esm/database.js.map +1 -0
  135. package/dist/esm/errors.d.ts +37 -0
  136. package/dist/esm/errors.d.ts.map +1 -0
  137. package/dist/esm/errors.js +55 -0
  138. package/dist/esm/errors.js.map +1 -0
  139. package/dist/esm/index.d.ts +16 -0
  140. package/dist/esm/index.d.ts.map +1 -0
  141. package/dist/esm/index.js +15 -0
  142. package/dist/esm/index.js.map +1 -0
  143. package/dist/esm/kysely-hooks.d.ts +45 -0
  144. package/dist/esm/kysely-hooks.d.ts.map +1 -0
  145. package/dist/esm/kysely-hooks.js +86 -0
  146. package/dist/esm/kysely-hooks.js.map +1 -0
  147. package/dist/esm/libsql/example.d.ts +2 -0
  148. package/dist/esm/libsql/example.d.ts.map +1 -0
  149. package/dist/esm/libsql/example.js +42 -0
  150. package/dist/esm/libsql/example.js.map +1 -0
  151. package/dist/esm/libsql/index.d.ts +36 -0
  152. package/dist/esm/libsql/index.d.ts.map +1 -0
  153. package/dist/esm/libsql/index.js +116 -0
  154. package/dist/esm/libsql/index.js.map +1 -0
  155. package/dist/esm/permissionService.d.ts +20 -0
  156. package/dist/esm/permissionService.d.ts.map +1 -0
  157. package/dist/esm/permissionService.js +103 -0
  158. package/dist/esm/permissionService.js.map +1 -0
  159. package/dist/esm/rlsFunctionRegistry.d.ts +43 -0
  160. package/dist/esm/rlsFunctionRegistry.d.ts.map +1 -0
  161. package/dist/esm/rlsFunctionRegistry.js +60 -0
  162. package/dist/esm/rlsFunctionRegistry.js.map +1 -0
  163. package/dist/esm/rlsManager.d.ts +23 -0
  164. package/dist/esm/rlsManager.d.ts.map +1 -0
  165. package/dist/esm/rlsManager.js +366 -0
  166. package/dist/esm/rlsManager.js.map +1 -0
  167. package/dist/esm/schema.d.ts +15 -0
  168. package/dist/esm/schema.d.ts.map +1 -0
  169. package/dist/esm/schema.js +113 -0
  170. package/dist/esm/schema.js.map +1 -0
  171. package/dist/esm/sdk/client.d.ts +324 -0
  172. package/dist/esm/sdk/client.d.ts.map +1 -0
  173. package/dist/esm/sdk/client.js +550 -0
  174. package/dist/esm/sdk/client.js.map +1 -0
  175. package/dist/esm/sdk/examples.d.ts +68 -0
  176. package/dist/esm/sdk/examples.d.ts.map +1 -0
  177. package/dist/esm/sdk/examples.js +229 -0
  178. package/dist/esm/sdk/examples.js.map +1 -0
  179. package/dist/esm/sdk/server.d.ts +115 -0
  180. package/dist/esm/sdk/server.d.ts.map +1 -0
  181. package/dist/esm/sdk/server.js +136 -0
  182. package/dist/esm/sdk/server.js.map +1 -0
  183. package/dist/esm/types.d.ts +217 -0
  184. package/dist/esm/types.d.ts.map +1 -0
  185. package/dist/esm/types.js +2 -0
  186. package/dist/esm/types.js.map +1 -0
  187. package/dist/esm/utils/column-utils.d.ts +8 -0
  188. package/dist/esm/utils/column-utils.d.ts.map +1 -0
  189. package/dist/esm/utils/column-utils.js +127 -0
  190. package/dist/esm/utils/column-utils.js.map +1 -0
  191. package/dist/esm/utils/db.d.ts +2 -0
  192. package/dist/esm/utils/db.d.ts.map +1 -0
  193. package/dist/esm/utils/db.js +3 -0
  194. package/dist/esm/utils/db.js.map +1 -0
  195. package/dist/esm/utils/inspector.d.ts +39 -0
  196. package/dist/esm/utils/inspector.d.ts.map +1 -0
  197. package/dist/esm/utils/inspector.js +160 -0
  198. package/dist/esm/utils/inspector.js.map +1 -0
  199. package/dist/esm/utils/permission-initializer.d.ts +15 -0
  200. package/dist/esm/utils/permission-initializer.d.ts.map +1 -0
  201. package/dist/esm/utils/permission-initializer.js +137 -0
  202. package/dist/esm/utils/permission-initializer.js.map +1 -0
  203. package/dist/esm/websocket/RealtimeAdapter.d.ts +22 -0
  204. package/dist/esm/websocket/RealtimeAdapter.d.ts.map +1 -0
  205. package/dist/esm/websocket/RealtimeAdapter.js +2 -0
  206. package/dist/esm/websocket/RealtimeAdapter.js.map +1 -0
  207. package/dist/esm/websocket/SSEManager.d.ts +40 -0
  208. package/dist/esm/websocket/SSEManager.d.ts.map +1 -0
  209. package/dist/esm/websocket/SSEManager.js +231 -0
  210. package/dist/esm/websocket/SSEManager.js.map +1 -0
  211. package/dist/esm/websocket/WebSocketManager.d.ts +28 -0
  212. package/dist/esm/websocket/WebSocketManager.d.ts.map +1 -0
  213. package/dist/esm/websocket/WebSocketManager.js +152 -0
  214. package/dist/esm/websocket/WebSocketManager.js.map +1 -0
  215. package/dist/esm/websocket/index.d.ts +4 -0
  216. package/dist/esm/websocket/index.d.ts.map +1 -0
  217. package/dist/esm/websocket/index.js +4 -0
  218. package/dist/esm/websocket/index.js.map +1 -0
  219. package/package.json +67 -0
@@ -0,0 +1,103 @@
1
+ import { sql } from 'kysely';
2
+ import { FG_PERMISSION_TABLE } from './types';
3
+ import { LRUCache } from 'lru-cache';
4
+ export class PermissionService {
5
+ constructor(db) {
6
+ this.db = db;
7
+ this.cache = new LRUCache({
8
+ max: 500,
9
+ ttl: 5 * 60 * 1000, // 5 minutes TTL
10
+ allowStale: false,
11
+ updateAgeOnGet: true,
12
+ });
13
+ this.initPromise = this.initializeDatabase();
14
+ }
15
+ async ready() {
16
+ return this.initPromise;
17
+ }
18
+ async initializeDatabase() {
19
+ try {
20
+ const adapterName = this.db.getExecutor().adapter.constructor.name;
21
+ const isSqlite = adapterName.includes('Sqlite') || adapterName.includes('Libsql');
22
+ const now = isSqlite ? sql `CURRENT_TIMESTAMP` : sql `now()`;
23
+ await this.db.schema
24
+ .createTable(FG_PERMISSION_TABLE)
25
+ .ifNotExists()
26
+ .addColumn('table_name', 'varchar(255)', (col) => col.primaryKey().notNull())
27
+ .addColumn('permissions', 'json', (col) => col.notNull())
28
+ .addColumn('created_at', 'timestamp', (col) => col.defaultTo(now))
29
+ .addColumn('updated_at', 'timestamp', (col) => col.defaultTo(now))
30
+ .execute();
31
+ }
32
+ catch (e) {
33
+ console.warn('Permission table initialization warning:', e);
34
+ }
35
+ }
36
+ /**
37
+ * Sync-only lookup: returns cached permissions or undefined if not cached.
38
+ * Avoids async overhead when the permission is already in the LRU cache.
39
+ */
40
+ getPermissionsForTableSync(tableName) {
41
+ return this.cache.get(tableName);
42
+ }
43
+ async getPermissionsForTable(tableName, trx) {
44
+ const cachedPermissions = this.cache.get(tableName);
45
+ if (cachedPermissions) {
46
+ return cachedPermissions;
47
+ }
48
+ const executor = trx || this.db;
49
+ const result = await executor
50
+ .selectFrom(FG_PERMISSION_TABLE)
51
+ .where('table_name', '=', tableName)
52
+ .selectAll()
53
+ .executeTakeFirst();
54
+ if (!result)
55
+ return {};
56
+ let permissions = result.permissions;
57
+ if (typeof permissions === 'string') {
58
+ try {
59
+ permissions = JSON.parse(permissions);
60
+ }
61
+ catch (e) {
62
+ // ignore
63
+ }
64
+ }
65
+ this.cache.set(tableName, permissions);
66
+ return permissions;
67
+ }
68
+ async setPermissionsForTable(tableName, permissions, trx) {
69
+ const executor = trx || this.db;
70
+ const permissionsJson = JSON.stringify(permissions);
71
+ const adapterName = this.db.getExecutor().adapter.constructor.name;
72
+ const isSqlite = adapterName.includes('Sqlite') || adapterName.includes('Libsql');
73
+ const now = isSqlite ? sql `CURRENT_TIMESTAMP` : sql `now()`;
74
+ await executor
75
+ .insertInto(FG_PERMISSION_TABLE)
76
+ .values({
77
+ table_name: tableName,
78
+ permissions: permissionsJson,
79
+ updated_at: now,
80
+ })
81
+ .onConflict((oc) => oc.column('table_name').doUpdateSet({
82
+ permissions: permissionsJson,
83
+ updated_at: now,
84
+ }))
85
+ .execute();
86
+ this.cache.set(tableName, permissions);
87
+ return permissions;
88
+ }
89
+ async deletePermissionsForTable(tableName, trx) {
90
+ const executor = trx || this.db;
91
+ await executor
92
+ .deleteFrom(FG_PERMISSION_TABLE)
93
+ .where('table_name', '=', tableName)
94
+ .execute();
95
+ // Remove from cache
96
+ this.cache.delete(tableName);
97
+ }
98
+ // Method to clear the entire cache
99
+ clearCache() {
100
+ this.cache.clear();
101
+ }
102
+ }
103
+ //# sourceMappingURL=permissionService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissionService.js","sourceRoot":"","sources":["../../src/permissionService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import type { CustomRlsFunction } from './types';
2
+ /**
3
+ * Registry for custom RLS functions that can be used in permission rules
4
+ */
5
+ declare class RlsFunctionRegistry {
6
+ private functions;
7
+ /**
8
+ * Register a custom RLS function
9
+ * @param name Unique name for the function
10
+ * @param fn The function implementation
11
+ */
12
+ register(name: string, fn: CustomRlsFunction): void;
13
+ /**
14
+ * Get a registered RLS function by name
15
+ * @param name Name of the function to retrieve
16
+ * @returns The function or undefined if not found
17
+ */
18
+ get(name: string): CustomRlsFunction | undefined;
19
+ /**
20
+ * Check if a function with the given name exists
21
+ * @param name Name to check
22
+ * @returns True if the function exists
23
+ */
24
+ has(name: string): boolean;
25
+ /**
26
+ * Remove a function from the registry
27
+ * @param name Name of the function to remove
28
+ * @returns True if the function was removed
29
+ */
30
+ unregister(name: string): boolean;
31
+ /**
32
+ * Clear all registered functions
33
+ */
34
+ clear(): void;
35
+ /**
36
+ * Get all registered function names
37
+ * @returns Array of function names
38
+ */
39
+ getRegisteredFunctionNames(): string[];
40
+ }
41
+ declare const rlsFunctionRegistry: RlsFunctionRegistry;
42
+ export { rlsFunctionRegistry };
43
+ //# sourceMappingURL=rlsFunctionRegistry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rlsFunctionRegistry.d.ts","sourceRoot":"","sources":["../../src/rlsFunctionRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAEjD;;GAEG;AACH,cAAM,mBAAmB;IACvB,OAAO,CAAC,SAAS,CAA6C;IAE9D;;;;OAIG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,iBAAiB,GAAG,IAAI;IAOnD;;;;OAIG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS;IAIhD;;;;OAIG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B;;;;OAIG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIjC;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;;OAGG;IACH,0BAA0B,IAAI,MAAM,EAAE;CAGvC;AAGD,QAAA,MAAM,mBAAmB,qBAA4B,CAAC;AAEtD,OAAO,EAAE,mBAAmB,EAAE,CAAC"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Registry for custom RLS functions that can be used in permission rules
3
+ */
4
+ class RlsFunctionRegistry {
5
+ constructor() {
6
+ this.functions = new Map();
7
+ }
8
+ /**
9
+ * Register a custom RLS function
10
+ * @param name Unique name for the function
11
+ * @param fn The function implementation
12
+ */
13
+ register(name, fn) {
14
+ if (this.functions.has(name)) {
15
+ console.warn(`RLS function "${name}" is being overwritten`);
16
+ }
17
+ this.functions.set(name, fn);
18
+ }
19
+ /**
20
+ * Get a registered RLS function by name
21
+ * @param name Name of the function to retrieve
22
+ * @returns The function or undefined if not found
23
+ */
24
+ get(name) {
25
+ return this.functions.get(name);
26
+ }
27
+ /**
28
+ * Check if a function with the given name exists
29
+ * @param name Name to check
30
+ * @returns True if the function exists
31
+ */
32
+ has(name) {
33
+ return this.functions.has(name);
34
+ }
35
+ /**
36
+ * Remove a function from the registry
37
+ * @param name Name of the function to remove
38
+ * @returns True if the function was removed
39
+ */
40
+ unregister(name) {
41
+ return this.functions.delete(name);
42
+ }
43
+ /**
44
+ * Clear all registered functions
45
+ */
46
+ clear() {
47
+ this.functions.clear();
48
+ }
49
+ /**
50
+ * Get all registered function names
51
+ * @returns Array of function names
52
+ */
53
+ getRegisteredFunctionNames() {
54
+ return Array.from(this.functions.keys());
55
+ }
56
+ }
57
+ // Create a singleton instance
58
+ const rlsFunctionRegistry = new RlsFunctionRegistry();
59
+ export { rlsFunctionRegistry };
60
+ //# sourceMappingURL=rlsFunctionRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rlsFunctionRegistry.js","sourceRoot":"","sources":["../../src/rlsFunctionRegistry.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,mBAAmB;IAAzB;QACU,cAAS,GAAmC,IAAI,GAAG,EAAE,CAAC;IAuDhE,CAAC;IArDC;;;;OAIG;IACH,QAAQ,CAAC,IAAY,EAAE,EAAqB;QAC1C,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,IAAI,CAAC,iBAAiB,IAAI,wBAAwB,CAAC,CAAC;QAC9D,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC/B,CAAC;IAED;;;;OAIG;IACH,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAED;;;;OAIG;IACH,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAED;;;;OAIG;IACH,UAAU,CAAC,IAAY;QACrB,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC;IAED;;;OAGG;IACH,0BAA0B;QACxB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC;CACF;AAED,8BAA8B;AAC9B,MAAM,mBAAmB,GAAG,IAAI,mBAAmB,EAAE,CAAC;AAEtD,OAAO,EAAE,mBAAmB,EAAE,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { PermissionRule, UserContext } from './types';
2
+ import { PermissionService } from './permissionService';
3
+ import type { Kysely } from 'kysely';
4
+ export declare function evaluatePermission(rules: PermissionRule[], userContext: UserContext, row?: Record<string, unknown>, db?: Kysely<any>): Promise<boolean>;
5
+ /**
6
+ * Fast path: evaluate pre-extracted fieldCheck rules against a single row.
7
+ * Avoids the full enforcePermissions overhead (permission lookup, rule
8
+ * classification, array handling) when we already know we need a fieldCheck
9
+ * evaluation for one specific record.
10
+ */
11
+ export declare function evaluateFieldCheckForRow(fieldCheckRules: PermissionRule[], userContext: UserContext, row: Record<string, unknown>, db?: Kysely<any>): Promise<boolean>;
12
+ type Row = Record<string, unknown>;
13
+ export declare function enforcePermissions(tableName: string, operation: 'SELECT' | 'INSERT' | 'UPDATE' | 'DELETE', userContext: UserContext, permissionService: PermissionService, rows?: Row | Row[], db?: Kysely<any>): Promise<{
14
+ row?: Row | Row[];
15
+ status: boolean;
16
+ message?: string;
17
+ hasFieldCheck: boolean;
18
+ hasCustomFunction: boolean;
19
+ fieldCheckRules?: PermissionRule[];
20
+ customFunctionRules?: PermissionRule[];
21
+ }>;
22
+ export {};
23
+ //# sourceMappingURL=rlsManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rlsManager.d.ts","sourceRoot":"","sources":["../../src/rlsManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EAEd,WAAW,EAEZ,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAIrC,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,cAAc,EAAE,EACvB,WAAW,EAAE,WAAW,EACxB,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACjC,EAAE,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,GACf,OAAO,CAAC,OAAO,CAAC,CAiMlB;AAED;;;;;GAKG;AACH,wBAAsB,wBAAwB,CAC5C,eAAe,EAAE,cAAc,EAAE,EACjC,WAAW,EAAE,WAAW,EACxB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,EAAE,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,GACf,OAAO,CAAC,OAAO,CAAC,CAOlB;AAID,KAAK,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEnC,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,EACpD,WAAW,EAAE,WAAW,EACxB,iBAAiB,EAAE,iBAAiB,EACpC,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,EAAE,EAClB,EAAE,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,GACf,OAAO,CAAC;IACT,GAAG,CAAC,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,OAAO,CAAC;IACvB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,eAAe,CAAC,EAAE,cAAc,EAAE,CAAC;IACnC,mBAAmB,CAAC,EAAE,cAAc,EAAE,CAAC;CACxC,CAAC,CAwND"}
@@ -0,0 +1,366 @@
1
+ import { sql } from 'kysely';
2
+ import { rlsFunctionRegistry } from './rlsFunctionRegistry';
3
+ export async function evaluatePermission(rules, userContext, row = {}, db) {
4
+ for (const rule of rules) {
5
+ switch (rule.allow) {
6
+ case 'public':
7
+ return true;
8
+ case 'private':
9
+ return false;
10
+ case 'role':
11
+ if (!rule.roles || rule.roles.length === 0) {
12
+ // If no roles specified, continue to next rule
13
+ continue;
14
+ }
15
+ if (rule.roles &&
16
+ userContext.role &&
17
+ rule.roles?.includes(userContext.role)) {
18
+ return true;
19
+ }
20
+ // If we reach here, the role rule didn't match
21
+ // Continue to the next rule instead of returning false
22
+ continue;
23
+ case 'auth':
24
+ if (userContext.userId) {
25
+ return true;
26
+ }
27
+ // If we reach here, the auth rule didn't match
28
+ // Continue to the next rule instead of breaking
29
+ continue;
30
+ case 'guest':
31
+ if (!userContext.userId)
32
+ return true;
33
+ // If we reach here, the guest rule didn't match
34
+ // Continue to the next rule instead of breaking
35
+ continue;
36
+ case 'labels':
37
+ if (rule.labels !== undefined &&
38
+ userContext.labels.some((label) => rule.labels && rule.labels.includes(label))) {
39
+ return true;
40
+ }
41
+ // If we reach here, the labels rule didn't match
42
+ // Continue to the next rule instead of breaking
43
+ continue;
44
+ case 'teams':
45
+ if (rule.teams !== undefined &&
46
+ userContext.teams.some((team) => rule.teams && rule.teams.includes(team))) {
47
+ return true;
48
+ }
49
+ // If we reach here, the teams rule didn't match
50
+ // Continue to the next rule instead of breaking
51
+ continue;
52
+ case 'static':
53
+ if (typeof rule.static === 'boolean') {
54
+ return rule.static;
55
+ }
56
+ // If we reach here, the static rule didn't match
57
+ // Continue to the next rule instead of breaking
58
+ continue;
59
+ case 'fieldCheck':
60
+ if (rule.fieldCheck) {
61
+ const { field, operator, valueType, value } = rule.fieldCheck;
62
+ const dataValue = row[field];
63
+ // console.log('Data value:', dataValue);
64
+ const comparisonValue = valueType === 'userContext'
65
+ ? userContext[value]
66
+ : value;
67
+ switch (operator) {
68
+ case '===':
69
+ if (dataValue === comparisonValue)
70
+ return true;
71
+ break;
72
+ case '!==':
73
+ if (dataValue !== comparisonValue)
74
+ return true;
75
+ break;
76
+ case 'in':
77
+ if (Array.isArray(comparisonValue) &&
78
+ comparisonValue.includes(dataValue)) {
79
+ return true;
80
+ }
81
+ break;
82
+ case 'notIn':
83
+ if (Array.isArray(comparisonValue) &&
84
+ !comparisonValue.includes(dataValue)) {
85
+ return true;
86
+ }
87
+ break;
88
+ }
89
+ }
90
+ // If we reach here, the fieldCheck rule didn't match
91
+ // Continue to the next rule instead of breaking
92
+ continue;
93
+ case 'customSql':
94
+ if (rule.customSql && db) {
95
+ try {
96
+ // Replace placeholders with userContext values
97
+ const parsedSql = rule.customSql.replace(/:([a-zA-Z_]+)/g, (_match, key) => {
98
+ if (userContext[key] === undefined) {
99
+ throw new Error(`Missing context value for key: ${key}`);
100
+ }
101
+ // For SQL parameters, we need to handle different types appropriately
102
+ const value = userContext[key];
103
+ if (typeof value === 'string') {
104
+ return `'${value.replace(/'/g, "''")}'`; // Escape single quotes for SQL
105
+ }
106
+ else if (value === null) {
107
+ return 'NULL';
108
+ }
109
+ else if (Array.isArray(value)) {
110
+ // Convert array to SQL array format
111
+ return `(${value
112
+ .map((item) => {
113
+ if (typeof item === 'string')
114
+ return `'${item.replace(/'/g, "''")}'`;
115
+ return item;
116
+ })
117
+ .join(', ')})`;
118
+ }
119
+ return String(value);
120
+ });
121
+ // console.log(`Executing custom SQL: ${parsedSql}`);
122
+ // Execute the SQL query
123
+ // Kysely sql.raw returns a builder, we need to execute it.
124
+ const result = await sql.raw(parsedSql).execute(db);
125
+ const rows = result.rows;
126
+ // Check if the query returned any rows or a truthy value
127
+ // Kysely result.rows is array of rows
128
+ return rows.length > 0;
129
+ }
130
+ catch (error) {
131
+ console.error(`Error executing custom SQL:`, error);
132
+ return false;
133
+ }
134
+ }
135
+ // If we reach here, the customSql rule didn't match
136
+ // Continue to the next rule instead of breaking
137
+ continue;
138
+ case 'customFunction':
139
+ if (rule.customFunction) {
140
+ try {
141
+ // Get the function from the registry
142
+ const customFn = rlsFunctionRegistry.get(rule.customFunction);
143
+ if (!customFn) {
144
+ console.error(`Custom RLS function "${rule.customFunction}" not found in registry`);
145
+ return false;
146
+ }
147
+ // Execute the custom function with userContext and row data
148
+ const result = await Promise.resolve(customFn(userContext, row, db));
149
+ return !!result;
150
+ }
151
+ catch (error) {
152
+ console.error(`Error executing custom RLS function "${rule.customFunction}":`, error);
153
+ return false;
154
+ }
155
+ }
156
+ // If we reach here, the customFunction rule didn't match
157
+ // Continue to the next rule instead of breaking
158
+ continue;
159
+ }
160
+ }
161
+ return false;
162
+ }
163
+ /**
164
+ * Fast path: evaluate pre-extracted fieldCheck rules against a single row.
165
+ * Avoids the full enforcePermissions overhead (permission lookup, rule
166
+ * classification, array handling) when we already know we need a fieldCheck
167
+ * evaluation for one specific record.
168
+ */
169
+ export async function evaluateFieldCheckForRow(fieldCheckRules, userContext, row, db) {
170
+ for (const rule of fieldCheckRules) {
171
+ if (await evaluatePermission([rule], userContext, row, db)) {
172
+ return true;
173
+ }
174
+ }
175
+ return false;
176
+ }
177
+ const CHUNK_SIZE = 1000;
178
+ export async function enforcePermissions(tableName, operation, userContext, permissionService, rows, db) {
179
+ // Try sync cache lookup first to avoid async overhead on cache hits
180
+ const tablePermissions = (permissionService.getPermissionsForTableSync(tableName) ??
181
+ (await permissionService.getPermissionsForTable(tableName)));
182
+ if (!tablePermissions) {
183
+ return {
184
+ row: rows,
185
+ status: false,
186
+ message: `No permissions defined for table "${tableName}"`,
187
+ hasFieldCheck: false,
188
+ hasCustomFunction: false,
189
+ };
190
+ }
191
+ if (!tablePermissions?.operations?.[operation]) {
192
+ return {
193
+ row: rows,
194
+ status: false,
195
+ message: `No permissions defined for operation "${operation}" on table "${tableName}"`,
196
+ hasFieldCheck: false,
197
+ hasCustomFunction: false,
198
+ };
199
+ }
200
+ const rules = tablePermissions.operations[operation];
201
+ // Early return if no rules
202
+ if (!rules || rules.length === 0) {
203
+ return {
204
+ row: rows,
205
+ status: true,
206
+ hasFieldCheck: false,
207
+ hasCustomFunction: false,
208
+ };
209
+ }
210
+ // Single-pass rule classification (avoids 3× Array.filter)
211
+ const fieldCheckRules = [];
212
+ const customFunctionRules = [];
213
+ const simpleRules = [];
214
+ for (const rule of rules) {
215
+ if (rule.allow === 'fieldCheck')
216
+ fieldCheckRules.push(rule);
217
+ else if (rule.allow === 'customFunction')
218
+ customFunctionRules.push(rule);
219
+ else
220
+ simpleRules.push(rule);
221
+ }
222
+ // First check simple rules that don't need row data
223
+ if (simpleRules.length > 0) {
224
+ // Check each rule and find the first one that grants access
225
+ for (const rule of simpleRules) {
226
+ const hasAccess = await evaluatePermission([rule], userContext, {}, db);
227
+ if (hasAccess) {
228
+ return {
229
+ row: rows,
230
+ status: true,
231
+ hasFieldCheck: false,
232
+ hasCustomFunction: false,
233
+ };
234
+ }
235
+ }
236
+ }
237
+ // Check customFunction rules if no simple rules matched
238
+ // These need row data like fieldCheck rules
239
+ if (customFunctionRules.length > 0) {
240
+ // If no rows provided but we need to check with custom functions, return early
241
+ if (!rows) {
242
+ return {
243
+ row: undefined,
244
+ status: false,
245
+ hasFieldCheck: false,
246
+ hasCustomFunction: true,
247
+ fieldCheckRules,
248
+ customFunctionRules,
249
+ message: 'Custom function check required, please provide row data',
250
+ };
251
+ }
252
+ // Handle array of rows
253
+ if (Array.isArray(rows)) {
254
+ const result = [];
255
+ for (let i = 0; i < rows.length; i += CHUNK_SIZE) {
256
+ const chunk = rows.slice(i, i + CHUNK_SIZE);
257
+ // Filter rows based on custom function rules
258
+ const filteredChunk = [];
259
+ for (const row of chunk) {
260
+ // Check each row against all custom function rules
261
+ for (const rule of customFunctionRules) {
262
+ const hasAccess = await evaluatePermission([rule], userContext, row, db);
263
+ if (hasAccess) {
264
+ filteredChunk.push(row);
265
+ break; // Move to the next row once we find a rule that grants access
266
+ }
267
+ }
268
+ }
269
+ result.push(...filteredChunk);
270
+ }
271
+ // If any rows passed the custom function checks, return success
272
+ if (result.length > 0) {
273
+ return {
274
+ row: result,
275
+ status: true,
276
+ hasFieldCheck: false,
277
+ hasCustomFunction: false,
278
+ };
279
+ }
280
+ }
281
+ else {
282
+ // Handle single row
283
+ for (const rule of customFunctionRules) {
284
+ const hasAccess = await evaluatePermission([rule], userContext, rows, db);
285
+ if (hasAccess) {
286
+ return {
287
+ row: rows,
288
+ status: true,
289
+ hasFieldCheck: false,
290
+ hasCustomFunction: false,
291
+ };
292
+ }
293
+ }
294
+ }
295
+ }
296
+ // If we reach here, no non-fieldCheck rules passed
297
+ // Check if we have fieldCheck rules
298
+ if (fieldCheckRules.length > 0) {
299
+ // If no rows provided but we need to check fields, return early
300
+ if (!rows) {
301
+ return {
302
+ row: undefined,
303
+ status: false,
304
+ hasFieldCheck: true,
305
+ hasCustomFunction: false,
306
+ fieldCheckRules,
307
+ customFunctionRules,
308
+ message: 'Field-level check required, please provide row data',
309
+ };
310
+ }
311
+ // Handle array of rows
312
+ if (Array.isArray(rows)) {
313
+ const result = [];
314
+ for (let i = 0; i < rows.length; i += CHUNK_SIZE) {
315
+ const chunk = rows.slice(i, i + CHUNK_SIZE);
316
+ // Filter rows based on field check rules
317
+ const filteredChunk = [];
318
+ for (const row of chunk) {
319
+ // Check each row against all field check rules
320
+ for (const rule of fieldCheckRules) {
321
+ const hasAccess = await evaluatePermission([rule], userContext, row, db);
322
+ if (hasAccess) {
323
+ filteredChunk.push(row);
324
+ break; // Move to the next row once we find a rule that grants access
325
+ }
326
+ }
327
+ }
328
+ result.push(...filteredChunk);
329
+ }
330
+ return {
331
+ row: result,
332
+ status: result.length > 0,
333
+ hasFieldCheck: false,
334
+ hasCustomFunction: false,
335
+ message: result.length === 0
336
+ ? 'No rows matched the field-level permission rules'
337
+ : undefined,
338
+ };
339
+ }
340
+ // Handle single row
341
+ let hasFieldAccess = false;
342
+ for (const rule of fieldCheckRules) {
343
+ hasFieldAccess = await evaluatePermission([rule], userContext, rows, db);
344
+ if (hasFieldAccess)
345
+ break;
346
+ }
347
+ return {
348
+ row: rows,
349
+ status: hasFieldAccess,
350
+ hasFieldCheck: false,
351
+ hasCustomFunction: false,
352
+ message: !hasFieldAccess
353
+ ? `User does not have field-level permission to perform operation "${operation}" on table "${tableName}"`
354
+ : undefined,
355
+ };
356
+ }
357
+ // If we reach here, no rules passed
358
+ return {
359
+ row: rows,
360
+ status: false,
361
+ hasFieldCheck: false,
362
+ hasCustomFunction: false,
363
+ message: `User does not have permission to perform operation "${operation}" on table "${tableName}"`,
364
+ };
365
+ }
366
+ //# sourceMappingURL=rlsManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rlsManager.js","sourceRoot":"","sources":["../../src/rlsManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { type Kysely, type Transaction } from 'kysely';
2
+ import type { AddForeignKeyParams, DropForeignKeyParams, ModifySchemaParams } from './types';
3
+ export declare function addForeignKey(params: AddForeignKeyParams, db: Kysely<any>, trx?: Transaction<any>): Promise<{
4
+ message: string;
5
+ }>;
6
+ export declare function dropForeignKey(params: DropForeignKeyParams, db: Kysely<any>, trx?: Transaction<any>): Promise<{
7
+ message: string;
8
+ }>;
9
+ export declare function modifySchema(db: Kysely<any>, params: ModifySchemaParams, trx?: Transaction<any>): Promise<{
10
+ message: string;
11
+ }>;
12
+ export declare function truncateTable(tableName: string, db: Kysely<any>, trx?: Transaction<any>): Promise<{
13
+ message: string;
14
+ }>;
15
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,MAAM,EACX,KAAK,WAAW,EAGjB,MAAM,QAAQ,CAAC;AAChB,OAAO,KAAK,EACV,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAEnB,MAAM,SAAS,CAAC;AAGjB,wBAAsB,aAAa,CACjC,MAAM,EAAE,mBAAmB,EAC3B,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,EACf,GAAG,CAAC,EAAE,WAAW,CAAC,GAAG,CAAC;;GAmBvB;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,oBAAoB,EAC5B,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,EACf,GAAG,CAAC,EAAE,WAAW,CAAC,GAAG,CAAC;;GAwBvB;AAED,wBAAsB,YAAY,CAChC,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,EACf,MAAM,EAAE,kBAAkB,EAC1B,GAAG,CAAC,EAAE,WAAW,CAAC,GAAG,CAAC;;GA0EvB;AAED,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,EACf,GAAG,CAAC,EAAE,WAAW,CAAC,GAAG,CAAC;;GA0BvB"}