@stratal/framework 0.0.18 → 0.0.20

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 (54) hide show
  1. package/dist/access-control/index.d.mts +180 -0
  2. package/dist/access-control/index.d.mts.map +1 -0
  3. package/dist/access-control/index.mjs +71 -0
  4. package/dist/access-control/index.mjs.map +1 -0
  5. package/dist/access.service-BjYVtUJw.mjs +145 -0
  6. package/dist/access.service-BjYVtUJw.mjs.map +1 -0
  7. package/dist/auth/index.d.mts +131 -6
  8. package/dist/auth/index.d.mts.map +1 -1
  9. package/dist/auth/index.mjs +341 -67
  10. package/dist/auth/index.mjs.map +1 -1
  11. package/dist/auth-context-6Li1JkIq.mjs +85 -0
  12. package/dist/auth-context-6Li1JkIq.mjs.map +1 -0
  13. package/dist/auth-context-B44CDZCt.d.mts +86 -0
  14. package/dist/auth-context-B44CDZCt.d.mts.map +1 -0
  15. package/dist/context/index.d.mts +2 -2
  16. package/dist/context/index.mjs +2 -2
  17. package/dist/database/index.d.mts +3 -3
  18. package/dist/database/index.mjs +54 -46
  19. package/dist/database/index.mjs.map +1 -1
  20. package/dist/{decorate-C12QolJF.mjs → decorate-CdfCRvAc.mjs} +1 -1
  21. package/dist/{decorateMetadata-rWbWGUuO.mjs → decorateMetadata-CqtSx3_1.mjs} +1 -1
  22. package/dist/decorateParam-Dc5DGEpb.mjs +18 -0
  23. package/dist/decorateParam-Dc5DGEpb.mjs.map +1 -0
  24. package/dist/{errors-C_KIIU1v.mjs → errors-B1vVXc1T.mjs} +1 -1
  25. package/dist/{errors-C_KIIU1v.mjs.map → errors-B1vVXc1T.mjs.map} +1 -1
  26. package/dist/factory/index.d.mts +1 -1
  27. package/dist/guards/index.d.mts +7 -6
  28. package/dist/guards/index.d.mts.map +1 -1
  29. package/dist/guards/index.mjs +38 -29
  30. package/dist/guards/index.mjs.map +1 -1
  31. package/dist/{index-B1iGBJcO.d.mts → index-CCDPF-1Y.d.mts} +30 -42
  32. package/dist/index-CCDPF-1Y.d.mts.map +1 -0
  33. package/dist/index.d.mts +2 -2
  34. package/dist/insufficient-permissions.error-CRnOHYvq.mjs +23 -0
  35. package/dist/insufficient-permissions.error-CRnOHYvq.mjs.map +1 -0
  36. package/dist/types-BLyu9dAd.d.mts +11 -0
  37. package/dist/types-BLyu9dAd.d.mts.map +1 -0
  38. package/dist/types-BZlcRR2M.d.mts +92 -0
  39. package/dist/types-BZlcRR2M.d.mts.map +1 -0
  40. package/package.json +23 -22
  41. package/dist/auth-context-BD2ApWg1.d.mts +0 -38
  42. package/dist/auth-context-BD2ApWg1.d.mts.map +0 -1
  43. package/dist/auth-context-BfekHvM9.mjs +0 -55
  44. package/dist/auth-context-BfekHvM9.mjs.map +0 -1
  45. package/dist/decorateParam-WGqsyT5s.mjs +0 -8
  46. package/dist/index-B1iGBJcO.d.mts.map +0 -1
  47. package/dist/rbac/index.d.mts +0 -206
  48. package/dist/rbac/index.d.mts.map +0 -1
  49. package/dist/rbac/index.mjs +0 -346
  50. package/dist/rbac/index.mjs.map +0 -1
  51. package/dist/tokens-Di1ofovy.mjs +0 -32
  52. package/dist/tokens-Di1ofovy.mjs.map +0 -1
  53. package/dist/types-Gjk0d2qB.d.mts +0 -47
  54. package/dist/types-Gjk0d2qB.d.mts.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insufficient-permissions.error-CRnOHYvq.mjs","names":[],"sources":["../src/access-control/errors/insufficient-permissions.error.ts"],"sourcesContent":["import { ApplicationError, ERROR_CODES } from 'stratal/errors'\n\n/**\n * InsufficientPermissionsError\n *\n * Thrown when a user attempts to perform an action without the required permissions.\n * Used by AuthGuard after an authorization check fails.\n *\n * HTTP Status: 403 Forbidden\n */\nexport class InsufficientPermissionsError extends ApplicationError {\n constructor(requiredPermissions: string | string[], userId?: string) {\n const summary = Array.isArray(requiredPermissions)\n ? requiredPermissions.join(', ')\n : requiredPermissions\n super('errors.insufficientPermissions', ERROR_CODES.AUTHZ.INSUFFICIENT_PERMISSIONS, {\n requiredPermissions: summary,\n userId: userId ?? 'unknown',\n })\n }\n}\n"],"mappings":";;;;;;;;;;AAUA,IAAa,+BAAb,cAAkD,iBAAiB;CACjE,YAAY,qBAAwC,QAAiB;EACnE,MAAM,UAAU,MAAM,QAAQ,oBAAoB,GAC9C,oBAAoB,KAAK,KAAK,GAC9B;AACJ,QAAM,kCAAkC,YAAY,MAAM,0BAA0B;GAClF,qBAAqB;GACrB,QAAQ,UAAU;GACnB,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { AccessControl, Role, Statements } from "better-auth/plugins/access";
2
+
3
+ //#region src/access-control/types.d.ts
4
+ type RolePermissions<TStatements extends Statements> = { [K in keyof TStatements]?: readonly TStatements[K][number][] };
5
+ interface AccessControlOptions<TStatements extends Statements = Statements, TRoles extends Record<string, RolePermissions<TStatements>> = Record<string, RolePermissions<TStatements>>> {
6
+ ac: AccessControl;
7
+ roles: { [K in keyof TRoles]: Role };
8
+ }
9
+ //#endregion
10
+ export { RolePermissions as n, AccessControlOptions as t };
11
+ //# sourceMappingURL=types-BLyu9dAd.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types-BLyu9dAd.d.mts","names":[],"sources":["../src/access-control/types.ts"],"mappings":";;;KAEY,eAAA,qBAAoC,UAAA,kBAClC,WAAA,aAAwB,WAAA,CAAY,CAAA;AAAA,UAGjC,oBAAA,qBAAyC,UAAA,GAAa,UAAA,iBAA2B,MAAA,SAAe,eAAA,CAAgB,WAAA,KAAgB,MAAA,SAAe,eAAA,CAAgB,WAAA;EAC9K,EAAA,EAAI,aAAA;EACJ,KAAA,gBAAqB,MAAA,GAAS,IAAA;AAAA"}
@@ -0,0 +1,92 @@
1
+ import { RuntimePlugin } from "@zenstackhq/orm";
2
+ import { SchemaDef } from "@zenstackhq/schema";
3
+
4
+ //#region src/database/types.d.ts
5
+ /**
6
+ * Augment with per-connection schemas, default connection, and plugin types.
7
+ *
8
+ * Each property can be augmented in a separate file — TypeScript merges them.
9
+ *
10
+ * @example
11
+ * ```typescript
12
+ * // db/schema.ts
13
+ * declare module '@stratal/framework/database' {
14
+ * interface StratalDatabase {
15
+ * schemas: {
16
+ * main: typeof schema
17
+ * tenant: typeof tenantSchema
18
+ * }
19
+ * defaultConnection: 'main'
20
+ * }
21
+ * }
22
+ *
23
+ * // db/plugins.ts
24
+ * declare module '@stratal/framework/database' {
25
+ * interface StratalDatabase {
26
+ * plugins: {
27
+ * main: [typeof queryResultPlugin, typeof cachePlugin]
28
+ * }
29
+ * }
30
+ * }
31
+ * ```
32
+ */
33
+ interface StratalDatabase {}
34
+ /** Extract `ExtQueryArgs` from a `RuntimePlugin` */
35
+ type ExtractPluginQueryArgs<P> = P extends RuntimePlugin<infer _S, infer Q, infer _M, infer _R> ? Q : {};
36
+ /** Extract `ExtClientMembers` from a `RuntimePlugin` */
37
+ type ExtractPluginClientMembers<P> = P extends RuntimePlugin<infer _S, infer _Q, infer M, infer _R> ? M : {};
38
+ /** Extract `ExtResult` from a `RuntimePlugin` */
39
+ type ExtractPluginResult<P> = P extends RuntimePlugin<infer _S, infer _Q, infer _M, infer R> ? R : {};
40
+ /** Recursively intersect extension types from a tuple of plugins */
41
+ type MergePlugins<Plugins extends unknown[]> = Plugins extends [infer P, ...infer Rest] ? {
42
+ extQueryArgs: ExtractPluginQueryArgs<P> & MergePlugins<Rest>['extQueryArgs'];
43
+ extClientMembers: ExtractPluginClientMembers<P> & MergePlugins<Rest>['extClientMembers'];
44
+ extResult: ExtractPluginResult<P> & MergePlugins<Rest>['extResult'];
45
+ } : {
46
+ extQueryArgs: {};
47
+ extClientMembers: {};
48
+ extResult: {};
49
+ };
50
+ /** Infer merged plugin extensions for a connection */
51
+ type InferConnectionExtensions<K extends string> = StratalDatabase extends {
52
+ plugins: infer P;
53
+ } ? K extends keyof P ? P[K] extends unknown[] ? MergePlugins<P[K]> : {
54
+ extQueryArgs: {};
55
+ extClientMembers: {};
56
+ extResult: {};
57
+ } : {
58
+ extQueryArgs: {};
59
+ extClientMembers: {};
60
+ extResult: {};
61
+ } : {
62
+ extQueryArgs: {};
63
+ extClientMembers: {};
64
+ extResult: {};
65
+ };
66
+ /** Infer schema type for a specific connection */
67
+ type InferConnectionSchema<K extends string> = StratalDatabase extends {
68
+ schemas: infer R;
69
+ } ? K extends keyof R ? R[K] extends SchemaDef ? R[K] : SchemaDef : SchemaDef : SchemaDef;
70
+ /** Union of ALL schemas across connections (for events) */
71
+ type InferAnySchema = StratalDatabase extends {
72
+ schemas: infer R;
73
+ } ? R[keyof R] extends SchemaDef ? R[keyof R] : SchemaDef : SchemaDef;
74
+ /** Connection name — derived from schemas keys */
75
+ type ConnectionName = StratalDatabase extends {
76
+ schemas: infer R;
77
+ } ? keyof R extends never ? string : Extract<keyof R, string> : string;
78
+ /** Default connection name */
79
+ type DefaultConnectionName = StratalDatabase extends {
80
+ defaultConnection: infer N extends string;
81
+ } ? N : string;
82
+ /**
83
+ * Internal context used by database service for dynamic event emission
84
+ * @internal
85
+ */
86
+ interface InternalDatabaseEventContext {
87
+ data: unknown;
88
+ result?: unknown;
89
+ }
90
+ //#endregion
91
+ export { InferConnectionSchema as a, InferConnectionExtensions as i, DefaultConnectionName as n, InternalDatabaseEventContext as o, InferAnySchema as r, StratalDatabase as s, ConnectionName as t };
92
+ //# sourceMappingURL=types-BZlcRR2M.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types-BZlcRR2M.d.mts","names":[],"sources":["../src/database/types.ts"],"mappings":";;;;;;AA+BA;;;;;AAAmC;;;;;;;;;;;;;;AAIiC;;;;;;;UAJnD,eAAA;;KAGZ,sBAAA,MACH,CAAA,SAAU,aAAA,0CAAuD,CAAA;;KAG9D,0BAAA,MACH,CAAA,SAAU,aAAA,0CAAuD,CAAA;;KAG9D,mBAAA,MACH,CAAA,SAAU,aAAA,0CAAuD,CAAA;;KAG9D,YAAA,8BACH,OAAA;EAEM,YAAA,EAAc,sBAAA,CAAuB,CAAA,IAAK,YAAA,CAAa,IAAA;EACvD,gBAAA,EAAkB,0BAAA,CAA2B,CAAA,IAAK,YAAA,CAAa,IAAA;EAC/D,SAAA,EAAW,mBAAA,CAAoB,CAAA,IAAK,YAAA,CAAa,IAAA;AAAA;EAEjD,YAAA;EAAkB,gBAAA;EAAsB,SAAA;AAAA;;KAGpC,yBAAA,qBACV,eAAA;EAA0B,OAAA;AAAA,IACtB,CAAA,eAAgB,CAAA,GACd,CAAA,CAAE,CAAA,sBACA,YAAA,CAAa,CAAA,CAAE,CAAA;EACb,YAAA;EAAkB,gBAAA;EAAsB,SAAA;AAAA;EAC1C,YAAA;EAAkB,gBAAA;EAAsB,SAAA;AAAA;EAC1C,YAAA;EAAkB,gBAAA;EAAsB,SAAA;AAAA;;KAGpC,qBAAA,qBACV,eAAA;EAA0B,OAAA;AAAA,IACtB,CAAA,eAAgB,CAAA,GAAI,CAAA,CAAE,CAAA,UAAW,SAAA,GAAY,CAAA,CAAE,CAAA,IAAK,SAAA,GAAY,SAAA,GAChE,SAAA;;KAGM,cAAA,GACV,eAAA;EAA0B,OAAA;AAAA,IACtB,CAAA,OAAQ,CAAA,UAAW,SAAA,GAAY,CAAA,OAAQ,CAAA,IAAK,SAAA,GAC5C,SAAA;;KAGM,cAAA,GACV,eAAA;EAA0B,OAAA;AAAA,UAChB,CAAA,0BAA2B,OAAA,OAAc,CAAA;;KAIzC,qBAAA,GACV,eAAA;EAA0B,iBAAA;AAAA,IAA8C,CAAA;;;;;UAMzD,4BAAA;EACf,IAAA;EACA,MAAA;AAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stratal/framework",
3
- "version": "0.0.18",
3
+ "version": "0.0.20",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "author": "Temitayo Fadojutimi",
@@ -26,6 +26,10 @@
26
26
  "types": "./dist/index.d.mts",
27
27
  "import": "./dist/index.mjs"
28
28
  },
29
+ "./access-control": {
30
+ "types": "./dist/access-control/index.d.mts",
31
+ "import": "./dist/access-control/index.mjs"
32
+ },
29
33
  "./auth": {
30
34
  "types": "./dist/auth/index.d.mts",
31
35
  "import": "./dist/auth/index.mjs"
@@ -46,10 +50,6 @@
46
50
  "types": "./dist/guards/index.d.mts",
47
51
  "import": "./dist/guards/index.mjs"
48
52
  },
49
- "./rbac": {
50
- "types": "./dist/rbac/index.d.mts",
51
- "import": "./dist/rbac/index.mjs"
52
- },
53
53
  "./package.json": "./package.json"
54
54
  },
55
55
  "scripts": {
@@ -67,36 +67,37 @@
67
67
  "lint:fix": "npx oxlint --fix ."
68
68
  },
69
69
  "dependencies": {
70
- "@better-auth/core": "^1.5.6",
70
+ "@better-auth/core": "^1.6.9",
71
71
  "@faker-js/faker": "^10.4.0",
72
- "@zenstackhq/cli": "^3.5.1",
73
- "@zenstackhq/orm": "^3.5.1",
74
- "better-auth": "^1.5.6",
75
- "casbin": "^5.49.0",
72
+ "@zenstackhq/cli": "^3.6.4",
73
+ "@zenstackhq/orm": "^3.6.4",
74
+ "better-auth": "^1.6.9",
75
+ "better-call": "1.3.5",
76
76
  "postgres-array": "^3.0.4"
77
77
  },
78
78
  "peerDependencies": {
79
79
  "pg": "^8.0.0",
80
80
  "reflect-metadata": "^0.2.2",
81
- "stratal": "^0.0.18"
81
+ "stratal": "^0.0.20"
82
82
  },
83
83
  "devDependencies": {
84
- "@cloudflare/vitest-pool-workers": "^0.13.5",
85
- "@cloudflare/workers-types": "4.20260317.1",
84
+ "@cloudflare/vitest-pool-workers": "^0.15.2",
85
+ "@cloudflare/workers-types": "4.20260502.1",
86
86
  "@stratal/testing": "workspace:^",
87
- "@types/node": "^25.5.0",
87
+ "@types/node": "^25.6.0",
88
88
  "@types/pg": "^8.20.0",
89
- "@vitest/coverage-istanbul": "~4.1.2",
90
- "@vitest/runner": "~4.1.2",
91
- "@vitest/snapshot": "~4.1.2",
92
- "@zenstackhq/better-auth": "^3.5.1",
89
+ "@vitest/coverage-istanbul": "~4.1.5",
90
+ "@vitest/runner": "~4.1.5",
91
+ "@vitest/snapshot": "~4.1.5",
92
+ "@zenstackhq/better-auth": "^3.6.4",
93
93
  "dotenv-cli": "^11.0.0",
94
+ "kysely": "0.28.16",
94
95
  "pg": "^8.20.0",
95
96
  "reflect-metadata": "^0.2.2",
96
97
  "stratal": "workspace:*",
97
- "tsdown": "^0.21.6",
98
- "typescript": "^6.0.2",
99
- "vitest": "~4.1.2",
100
- "wrangler": "^4.78.0"
98
+ "tsdown": "^0.21.10",
99
+ "typescript": "^6.0.3",
100
+ "vitest": "~4.1.5",
101
+ "wrangler": "^4.87.0"
101
102
  }
102
103
  }
@@ -1,38 +0,0 @@
1
- //#region src/context/auth-context.d.ts
2
- interface AuthInfo {
3
- userId?: string;
4
- }
5
- declare class AuthContext {
6
- protected userId?: string;
7
- /**
8
- * Set authentication context.
9
- * This should be called once per request with user information.
10
- */
11
- setAuthContext(info: AuthInfo): void;
12
- /**
13
- * Get user ID if available.
14
- * Returns undefined if no user is authenticated.
15
- */
16
- getUserId(): string | undefined;
17
- /**
18
- * Get user ID or throw if not authenticated.
19
- * Use this when authentication is required.
20
- */
21
- requireUserId(): string;
22
- /**
23
- * Get full authentication context or throw if not initialized.
24
- */
25
- getAuthContext(): AuthInfo;
26
- /**
27
- * Check if user is authenticated.
28
- */
29
- isAuthenticated(): boolean;
30
- /**
31
- * Clear authentication context.
32
- * Useful for testing or cleanup.
33
- */
34
- clearAuthContext(): void;
35
- }
36
- //#endregion
37
- export { AuthInfo as n, AuthContext as t };
38
- //# sourceMappingURL=auth-context-BD2ApWg1.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth-context-BD2ApWg1.d.mts","names":[],"sources":["../src/context/auth-context.ts"],"mappings":";UAMiB,QAAA;EACf,MAAA;AAAA;AAAA,cAIW,WAAA;EAAA,UACD,MAAA;EALJ;AAGR;;;EAQE,cAAA,CAAe,IAAA,EAAM,QAAA;EANX;;;;EAcV,SAAA,CAAA;EAQA;;;;EAAA,aAAA,CAAA;EA+BgB;;;EApBhB,cAAA,CAAA,GAAkB,QAAA;;;;EAYlB,eAAA,CAAA;;;;;EAQA,gBAAA,CAAA;AAAA"}
@@ -1,55 +0,0 @@
1
- import { n as UserNotAuthenticatedError, r as ContextNotInitializedError } from "./errors-C_KIIU1v.mjs";
2
- import { t as __decorate } from "./decorate-C12QolJF.mjs";
3
- import { DI_TOKENS, Transient } from "stratal/di";
4
- //#region src/context/auth-context.ts
5
- let AuthContext = class AuthContext {
6
- userId;
7
- /**
8
- * Set authentication context.
9
- * This should be called once per request with user information.
10
- */
11
- setAuthContext(info) {
12
- this.userId = info.userId;
13
- }
14
- /**
15
- * Get user ID if available.
16
- * Returns undefined if no user is authenticated.
17
- */
18
- getUserId() {
19
- return this.userId;
20
- }
21
- /**
22
- * Get user ID or throw if not authenticated.
23
- * Use this when authentication is required.
24
- */
25
- requireUserId() {
26
- const userId = this.getUserId();
27
- if (!userId) throw new UserNotAuthenticatedError();
28
- return userId;
29
- }
30
- /**
31
- * Get full authentication context or throw if not initialized.
32
- */
33
- getAuthContext() {
34
- if (!this.userId) throw new ContextNotInitializedError("Authentication");
35
- return { userId: this.userId };
36
- }
37
- /**
38
- * Check if user is authenticated.
39
- */
40
- isAuthenticated() {
41
- return !!this.userId;
42
- }
43
- /**
44
- * Clear authentication context.
45
- * Useful for testing or cleanup.
46
- */
47
- clearAuthContext() {
48
- this.userId = void 0;
49
- }
50
- };
51
- AuthContext = __decorate([Transient(DI_TOKENS.AuthContext)], AuthContext);
52
- //#endregion
53
- export { AuthContext as t };
54
-
55
- //# sourceMappingURL=auth-context-BfekHvM9.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth-context-BfekHvM9.mjs","names":[],"sources":["../src/context/auth-context.ts"],"sourcesContent":["import { Transient, DI_TOKENS } from 'stratal/di'\nimport {\n ContextNotInitializedError,\n UserNotAuthenticatedError\n} from './errors'\n\nexport interface AuthInfo {\n userId?: string\n}\n\n@Transient(DI_TOKENS.AuthContext)\nexport class AuthContext {\n protected userId?: string\n\n /**\n * Set authentication context.\n * This should be called once per request with user information.\n */\n setAuthContext(info: AuthInfo): void {\n this.userId = info.userId\n }\n\n /**\n * Get user ID if available.\n * Returns undefined if no user is authenticated.\n */\n getUserId(): string | undefined {\n return this.userId\n }\n\n /**\n * Get user ID or throw if not authenticated.\n * Use this when authentication is required.\n */\n requireUserId(): string {\n const userId = this.getUserId()\n if (!userId) {\n throw new UserNotAuthenticatedError()\n }\n return userId\n }\n\n /**\n * Get full authentication context or throw if not initialized.\n */\n getAuthContext(): AuthInfo {\n if (!this.userId) {\n throw new ContextNotInitializedError('Authentication')\n }\n return {\n userId: this.userId\n }\n }\n\n /**\n * Check if user is authenticated.\n */\n isAuthenticated(): boolean {\n return !!this.userId\n }\n\n /**\n * Clear authentication context.\n * Useful for testing or cleanup.\n */\n clearAuthContext(): void {\n this.userId = undefined\n }\n}\n"],"mappings":";;;;AAWO,IAAA,cAAA,MAAM,YAAY;CACvB;;;;;CAMA,eAAe,MAAsB;AACnC,OAAK,SAAS,KAAK;;;;;;CAOrB,YAAgC;AAC9B,SAAO,KAAK;;;;;;CAOd,gBAAwB;EACtB,MAAM,SAAS,KAAK,WAAW;AAC/B,MAAI,CAAC,OACH,OAAM,IAAI,2BAA2B;AAEvC,SAAO;;;;;CAMT,iBAA2B;AACzB,MAAI,CAAC,KAAK,OACR,OAAM,IAAI,2BAA2B,iBAAiB;AAExD,SAAO,EACL,QAAQ,KAAK,QACd;;;;;CAMH,kBAA2B;AACzB,SAAO,CAAC,CAAC,KAAK;;;;;;CAOhB,mBAAyB;AACvB,OAAK,SAAS,KAAA;;;0BAxDjB,UAAU,UAAU,YAAY,CAAA,EAAA,YAAA"}
@@ -1,8 +0,0 @@
1
- //#region \0@oxc-project+runtime@0.122.0/helpers/decorateParam.js
2
- function __decorateParam(paramIndex, decorator) {
3
- return function(target, key) {
4
- decorator(target, key, paramIndex);
5
- };
6
- }
7
- //#endregion
8
- export { __decorateParam as t };
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-B1iGBJcO.d.mts","names":[],"sources":["../src/database/database.module.ts","../src/database/database.service.ts","../src/database/database.tokens.ts","../src/database/decorators/inject-db.decorator.ts","../src/database/errors/database-error.ts","../src/database/errors/database-config.error.ts","../src/database/errors/foreign-key-constraint.error.ts","../src/database/errors/invalid-error-code-range.error.ts","../src/database/errors/record-not-found.error.ts","../src/database/errors/unique-constraint.error.ts","../src/database/errors/from-zenstack-error.ts","../src/database/event-types.ts","../src/database/i18n/en.ts","../src/database/plugins/error-handler.plugin.ts","../src/database/plugins/event-emitter.plugin.ts","../src/database/plugins/schema-switcher.plugin.ts","../src/database/commands/zenstack.command.ts","../src/database/commands/db-generate.command.ts","../src/database/commands/db-pull.command.ts","../src/database/commands/db-push.command.ts","../src/database/commands/migrate-deploy.command.ts","../src/database/commands/migrate-dev.command.ts","../src/database/commands/migrate-reset.command.ts","../src/database/commands/migrate-status.command.ts"],"mappings":"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"}
@@ -1,206 +0,0 @@
1
- import { t as AuthContext } from "../auth-context-BD2ApWg1.mjs";
2
- import { AsyncModuleOptions, DynamicModule } from "stratal/module";
3
- import { ApplicationError } from "stratal/errors";
4
- import { Adapter, Enforcer, Model } from "casbin";
5
-
6
- //#region src/rbac/constants.d.ts
7
- /**
8
- * RBAC Constants
9
- */
10
- declare const RBAC_CONTEXT_KEYS: {
11
- /** Key for storing required authorization scopes (permissions) in context */readonly AUTH_SCOPES: symbol;
12
- };
13
- //#endregion
14
- //#region src/rbac/errors/insufficient-permissions.error.d.ts
15
- /**
16
- * InsufficientPermissionsError
17
- *
18
- * Thrown when a user attempts to perform an action without the required permissions.
19
- * This error is used by the auth guard after authorization check fails.
20
- *
21
- * HTTP Status: 403 Forbidden
22
- * Error Code: 3102 (AUTHZ.INSUFFICIENT_PERMISSIONS)
23
- */
24
- declare class InsufficientPermissionsError extends ApplicationError {
25
- constructor(requiredScopes: string[], userId?: string);
26
- }
27
- //#endregion
28
- //#region src/rbac/adapters/custom-zenstack-adapter.d.ts
29
- /**
30
- * Minimal interface for the database client used by the adapter.
31
- * The actual DatabaseService extends ZenStackClient which provides these methods
32
- * when the schema includes a `casbinRule` model.
33
- */
34
- interface CasbinDbClient {
35
- casbinRule: {
36
- findMany(args?: {
37
- where?: Record<string, unknown>;
38
- }): Promise<unknown[]>;
39
- create(args: {
40
- data: CasbinRuleCreateInput;
41
- }): Promise<unknown>;
42
- createMany(args: {
43
- data: CasbinRuleCreateInput[];
44
- }): Promise<unknown>;
45
- deleteMany(args: {
46
- where: CasbinRuleCreateInput;
47
- }): Promise<{
48
- count: number;
49
- }>;
50
- };
51
- $executeRawUnsafe(query: string, ...values: unknown[]): Promise<unknown>;
52
- }
53
- interface CasbinRuleCreateInput {
54
- ptype: string;
55
- v0?: string | null;
56
- v1?: string | null;
57
- v2?: string | null;
58
- v3?: string | null;
59
- v4?: string | null;
60
- v5?: string | null;
61
- }
62
- /**
63
- * Custom ZenStack adapter for Casbin that works with Cloudflare Workers.
64
- *
65
- * Based on the original casbin-prisma-adapter but modified to:
66
- * - Work with ZenStack v3 ORM clients
67
- * - Avoid bundling errors in Cloudflare Workers
68
- * - Accept pre-connected ZenStack clients (request-scoped)
69
- */
70
- declare class CustomZenStackAdapter implements Adapter {
71
- #private;
72
- filtered: boolean;
73
- isFiltered(): boolean;
74
- enableFiltered(enabled: boolean): void;
75
- constructor(db: CasbinDbClient);
76
- loadPolicy(model: Model): Promise<void>;
77
- loadFilteredPolicy(model: Model, filter: Record<string, string[][]>): Promise<void>;
78
- savePolicy(model: Model): Promise<boolean>;
79
- addPolicy(_sec: string, ptype: string, rule: string[]): Promise<void>;
80
- addPolicies(_sec: string, ptype: string, rules: string[][]): Promise<void>;
81
- removePolicy(_sec: string, ptype: string, rule: string[]): Promise<void>;
82
- removePolicies(_sec: string, ptype: string, rules: string[][]): Promise<void>;
83
- removeFilteredPolicy(_sec: string, ptype: string, fieldIndex: number, ...fieldValues: string[]): Promise<void>;
84
- close(): Promise<void>;
85
- static newAdapter(db: CasbinDbClient): CustomZenStackAdapter;
86
- }
87
- //#endregion
88
- //#region src/rbac/types.d.ts
89
- /**
90
- * Configuration options for the RBAC module
91
- */
92
- interface RbacModuleOptions {
93
- /** Casbin PERM model string */
94
- model: string;
95
- /** Default policies: [role, resource, action][] */
96
- defaultPolicies?: readonly (readonly [string, string, string])[];
97
- /** Role hierarchy: [childRole, parentRole][] */
98
- roleHierarchy?: readonly (readonly [string, string])[];
99
- }
100
- //#endregion
101
- //#region src/rbac/services/casbin-enforcer.service.d.ts
102
- /**
103
- * CasbinEnforcerService
104
- *
105
- * Manages the Casbin enforcer instance for authorization.
106
- * Model, default policies, and role hierarchy are provided via DI options.
107
- */
108
- declare class CasbinEnforcerService {
109
- protected readonly db: CasbinDbClient;
110
- protected readonly options: RbacModuleOptions;
111
- protected enforcer: Enforcer | null;
112
- constructor(db: CasbinDbClient, options: RbacModuleOptions);
113
- /**
114
- * Get or create the enforcer instance
115
- */
116
- getEnforcer(): Promise<Enforcer>;
117
- /**
118
- * Create a new enforcer instance.
119
- * Can be overridden by subclasses to customize enforcer creation.
120
- */
121
- protected createEnforcer(): Promise<Enforcer>;
122
- /**
123
- * Seed default policies into database
124
- */
125
- seedPolicies(): Promise<void>;
126
- /**
127
- * Clear cached enforcer instance
128
- */
129
- clearCache(): void;
130
- /**
131
- * Seed role hierarchy into database
132
- */
133
- seedRoleHierarchy(): Promise<void>;
134
- }
135
- //#endregion
136
- //#region src/rbac/services/casbin.service.d.ts
137
- /**
138
- * CasbinService
139
- *
140
- * Request-scoped service that provides the full Casbin RBAC API.
141
- * Uses AuthContext to get the current user.
142
- */
143
- declare class CasbinService {
144
- protected readonly context: AuthContext;
145
- protected readonly enforcerService: CasbinEnforcerService;
146
- constructor(context: AuthContext, enforcerService: CasbinEnforcerService);
147
- protected getEnforcer(): Promise<Enforcer>;
148
- addRoleForUser(userId: string, role: string): Promise<boolean>;
149
- deleteRoleForUser(userId: string, role: string): Promise<boolean>;
150
- deleteRolesForUser(userId: string): Promise<boolean>;
151
- getRolesForUser(userId: string): Promise<string[]>;
152
- getImplicitRolesForUser(userId: string): Promise<string[]>;
153
- getUsersForRole(role: string): Promise<string[]>;
154
- getImplicitUsersForRole(role: string): Promise<string[]>;
155
- hasRoleForUser(userId: string, role: string): Promise<boolean>;
156
- addRoleInheritance(childRole: string, parentRole: string): Promise<boolean>;
157
- deleteRoleInheritance(childRole: string, parentRole: string): Promise<boolean>;
158
- deleteUser(userId: string): Promise<boolean>;
159
- deleteRole(role: string): Promise<boolean>;
160
- getCurrentUserRoles(): Promise<string[]>;
161
- currentUserHasRole(role: string): Promise<boolean>;
162
- setRolesForUser(userId: string, roles: string[]): Promise<void>;
163
- hasPermission(userId: string, scope: string, action: string): Promise<boolean>;
164
- currentUserHasPermission(scope: string, action: string): Promise<boolean>;
165
- hasAnyPermission(userId: string, scopes: string[], action: string): Promise<boolean>;
166
- currentUserHasAnyPermission(scopes: string[], action: string): Promise<boolean>;
167
- getPermissionsForUserAsCasbinJs(userId: string): Promise<Record<string, string[]>>;
168
- getCurrentUserPermissionsAsCasbinJs(): Promise<Record<string, string[]>>;
169
- }
170
- //#endregion
171
- //#region src/rbac/rbac.module.d.ts
172
- /**
173
- * RBAC Module
174
- *
175
- * Provides role-based access control using Casbin.
176
- * Fully configurable — no hardcoded roles, policies, or model.
177
- *
178
- * @example
179
- * ```typescript
180
- * @Module({
181
- * imports: [
182
- * RbacModule.forRoot({
183
- * model: MY_RBAC_MODEL,
184
- * defaultPolicies: [['admin', 'users:*', '.*']],
185
- * roleHierarchy: [['super_admin', 'admin']],
186
- * })
187
- * ]
188
- * })
189
- * ```
190
- */
191
- declare class RbacModule {
192
- static forRoot(options: RbacModuleOptions): DynamicModule;
193
- static forRootAsync(options: AsyncModuleOptions<RbacModuleOptions>): DynamicModule;
194
- }
195
- //#endregion
196
- //#region src/rbac/tokens.d.ts
197
- /**
198
- * RBAC DI Tokens
199
- */
200
- declare const RBAC_TOKENS: {
201
- /** Request-scoped Casbin service with auto context resolution */readonly CasbinService: symbol; /** RBAC module options (model, policies, hierarchy) */
202
- readonly Options: symbol;
203
- };
204
- //#endregion
205
- export { CasbinEnforcerService, CasbinService, CustomZenStackAdapter, InsufficientPermissionsError, RBAC_CONTEXT_KEYS, RBAC_TOKENS, RbacModule, type RbacModuleOptions };
206
- //# sourceMappingURL=index.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/rbac/constants.ts","../../src/rbac/errors/insufficient-permissions.error.ts","../../src/rbac/adapters/custom-zenstack-adapter.ts","../../src/rbac/types.ts","../../src/rbac/services/casbin-enforcer.service.ts","../../src/rbac/services/casbin.service.ts","../../src/rbac/rbac.module.ts","../../src/rbac/tokens.ts"],"mappings":"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"}