@stratal/framework 0.0.13 → 0.0.14
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/dist/auth/index.d.mts +202 -0
- package/dist/auth/index.d.mts.map +1 -0
- package/dist/auth/index.mjs +323 -0
- package/dist/auth/index.mjs.map +1 -0
- package/dist/auth-context-BD2ApWg1.d.mts +38 -0
- package/dist/auth-context-BD2ApWg1.d.mts.map +1 -0
- package/dist/auth-context-CV3Ko1ew.mjs +55 -0
- package/dist/auth-context-CV3Ko1ew.mjs.map +1 -0
- package/dist/context/index.d.mts +20 -0
- package/dist/context/index.d.mts.map +1 -0
- package/dist/context/index.mjs +3 -0
- package/dist/database/index.d.mts +3 -0
- package/dist/database/index.mjs +374 -0
- package/dist/database/index.mjs.map +1 -0
- package/dist/decorate-RSane8dy.mjs +9 -0
- package/dist/decorateMetadata-CETItPez.mjs +6 -0
- package/dist/decorateParam-CcTvpNsw.mjs +8 -0
- package/dist/errors-C_KIIU1v.mjs +25 -0
- package/dist/errors-C_KIIU1v.mjs.map +1 -0
- package/dist/factory/index.d.mts +99 -0
- package/dist/factory/index.d.mts.map +1 -0
- package/dist/factory/index.mjs +138 -0
- package/dist/factory/index.mjs.map +1 -0
- package/dist/guards/{auth.guard.d.ts → index.d.mts} +7 -3
- package/dist/guards/index.d.mts.map +1 -0
- package/dist/guards/index.mjs +93 -0
- package/dist/guards/index.mjs.map +1 -0
- package/dist/index-Dlg8mNjq.d.mts +386 -0
- package/dist/index-Dlg8mNjq.d.mts.map +1 -0
- package/dist/index.d.mts +3 -0
- package/dist/index.mjs +1 -0
- package/dist/rbac/index.d.mts +206 -0
- package/dist/rbac/index.d.mts.map +1 -0
- package/dist/rbac/index.mjs +346 -0
- package/dist/rbac/index.mjs.map +1 -0
- package/dist/tokens-Di1ofovy.mjs +32 -0
- package/dist/tokens-Di1ofovy.mjs.map +1 -0
- package/dist/{database/types.d.ts → types-Gjk0d2qB.d.mts} +18 -15
- package/dist/types-Gjk0d2qB.d.mts.map +1 -0
- package/package.json +25 -24
- package/dist/auth/auth.module.d.ts +0 -37
- package/dist/auth/auth.module.d.ts.map +0 -1
- package/dist/auth/auth.module.js +0 -74
- package/dist/auth/auth.module.js.map +0 -1
- package/dist/auth/auth.tokens.d.ts +0 -5
- package/dist/auth/auth.tokens.d.ts.map +0 -1
- package/dist/auth/auth.tokens.js +0 -5
- package/dist/auth/auth.tokens.js.map +0 -1
- package/dist/auth/errors/auth-errors.d.ts +0 -74
- package/dist/auth/errors/auth-errors.d.ts.map +0 -1
- package/dist/auth/errors/auth-errors.js +0 -122
- package/dist/auth/errors/auth-errors.js.map +0 -1
- package/dist/auth/errors/index.d.ts +0 -5
- package/dist/auth/errors/index.d.ts.map +0 -1
- package/dist/auth/errors/index.js +0 -5
- package/dist/auth/errors/index.js.map +0 -1
- package/dist/auth/errors/invalid-token.error.d.ts +0 -5
- package/dist/auth/errors/invalid-token.error.d.ts.map +0 -1
- package/dist/auth/errors/invalid-token.error.js +0 -7
- package/dist/auth/errors/invalid-token.error.js.map +0 -1
- package/dist/auth/errors/token-required.error.d.ts +0 -5
- package/dist/auth/errors/token-required.error.d.ts.map +0 -1
- package/dist/auth/errors/token-required.error.js +0 -7
- package/dist/auth/errors/token-required.error.js.map +0 -1
- package/dist/auth/errors/verification-failed.error.d.ts +0 -5
- package/dist/auth/errors/verification-failed.error.d.ts.map +0 -1
- package/dist/auth/errors/verification-failed.error.js +0 -7
- package/dist/auth/errors/verification-failed.error.js.map +0 -1
- package/dist/auth/index.d.ts +0 -7
- package/dist/auth/index.d.ts.map +0 -1
- package/dist/auth/index.js +0 -7
- package/dist/auth/index.js.map +0 -1
- package/dist/auth/middleware/auth-context.middleware.d.ts +0 -12
- package/dist/auth/middleware/auth-context.middleware.d.ts.map +0 -1
- package/dist/auth/middleware/auth-context.middleware.js +0 -28
- package/dist/auth/middleware/auth-context.middleware.js.map +0 -1
- package/dist/auth/middleware/index.d.ts +0 -3
- package/dist/auth/middleware/index.d.ts.map +0 -1
- package/dist/auth/middleware/index.js +0 -3
- package/dist/auth/middleware/index.js.map +0 -1
- package/dist/auth/middleware/session-verification.middleware.d.ts +0 -18
- package/dist/auth/middleware/session-verification.middleware.d.ts.map +0 -1
- package/dist/auth/middleware/session-verification.middleware.js +0 -48
- package/dist/auth/middleware/session-verification.middleware.js.map +0 -1
- package/dist/auth/services/auth.service.d.ts +0 -32
- package/dist/auth/services/auth.service.d.ts.map +0 -1
- package/dist/auth/services/auth.service.js +0 -62
- package/dist/auth/services/auth.service.js.map +0 -1
- package/dist/auth/services/index.d.ts +0 -2
- package/dist/auth/services/index.d.ts.map +0 -1
- package/dist/auth/services/index.js +0 -2
- package/dist/auth/services/index.js.map +0 -1
- package/dist/auth/utils/auth-helpers.d.ts +0 -11
- package/dist/auth/utils/auth-helpers.d.ts.map +0 -1
- package/dist/auth/utils/auth-helpers.js +0 -31
- package/dist/auth/utils/auth-helpers.js.map +0 -1
- package/dist/auth/utils/better-auth-error-handler.d.ts +0 -11
- package/dist/auth/utils/better-auth-error-handler.d.ts.map +0 -1
- package/dist/auth/utils/better-auth-error-handler.js +0 -95
- package/dist/auth/utils/better-auth-error-handler.js.map +0 -1
- package/dist/auth/utils/index.d.ts +0 -3
- package/dist/auth/utils/index.d.ts.map +0 -1
- package/dist/auth/utils/index.js +0 -3
- package/dist/auth/utils/index.js.map +0 -1
- package/dist/context/auth-context.d.ts +0 -35
- package/dist/context/auth-context.d.ts.map +0 -1
- package/dist/context/auth-context.js +0 -65
- package/dist/context/auth-context.js.map +0 -1
- package/dist/context/errors/context-not-initialized.error.d.ts +0 -5
- package/dist/context/errors/context-not-initialized.error.d.ts.map +0 -1
- package/dist/context/errors/context-not-initialized.error.js +0 -7
- package/dist/context/errors/context-not-initialized.error.js.map +0 -1
- package/dist/context/errors/index.d.ts +0 -4
- package/dist/context/errors/index.d.ts.map +0 -1
- package/dist/context/errors/index.js +0 -4
- package/dist/context/errors/index.js.map +0 -1
- package/dist/context/errors/user-not-authenticated.error.d.ts +0 -5
- package/dist/context/errors/user-not-authenticated.error.d.ts.map +0 -1
- package/dist/context/errors/user-not-authenticated.error.js +0 -7
- package/dist/context/errors/user-not-authenticated.error.js.map +0 -1
- package/dist/context/errors/user-not-authorized.error.d.ts +0 -5
- package/dist/context/errors/user-not-authorized.error.d.ts.map +0 -1
- package/dist/context/errors/user-not-authorized.error.js +0 -7
- package/dist/context/errors/user-not-authorized.error.js.map +0 -1
- package/dist/context/index.d.ts +0 -3
- package/dist/context/index.d.ts.map +0 -1
- package/dist/context/index.js +0 -3
- package/dist/context/index.js.map +0 -1
- package/dist/database/custom-pg-types.d.ts +0 -21
- package/dist/database/custom-pg-types.d.ts.map +0 -1
- package/dist/database/custom-pg-types.js +0 -41
- package/dist/database/custom-pg-types.js.map +0 -1
- package/dist/database/database.helpers.d.ts +0 -15
- package/dist/database/database.helpers.d.ts.map +0 -1
- package/dist/database/database.helpers.js +0 -47
- package/dist/database/database.helpers.js.map +0 -1
- package/dist/database/database.module.d.ts +0 -22
- package/dist/database/database.module.d.ts.map +0 -1
- package/dist/database/database.module.js +0 -54
- package/dist/database/database.module.js.map +0 -1
- package/dist/database/database.service.d.ts +0 -18
- package/dist/database/database.service.d.ts.map +0 -1
- package/dist/database/database.service.js +0 -2
- package/dist/database/database.service.js.map +0 -1
- package/dist/database/database.tokens.d.ts +0 -7
- package/dist/database/database.tokens.d.ts.map +0 -1
- package/dist/database/database.tokens.js +0 -8
- package/dist/database/database.tokens.js.map +0 -1
- package/dist/database/decorators/inject-db.decorator.d.ts +0 -3
- package/dist/database/decorators/inject-db.decorator.d.ts.map +0 -1
- package/dist/database/decorators/inject-db.decorator.js +0 -6
- package/dist/database/decorators/inject-db.decorator.js.map +0 -1
- package/dist/database/errors/database-config.error.d.ts +0 -5
- package/dist/database/errors/database-config.error.d.ts.map +0 -1
- package/dist/database/errors/database-config.error.js +0 -8
- package/dist/database/errors/database-config.error.js.map +0 -1
- package/dist/database/errors/database-error.d.ts +0 -14
- package/dist/database/errors/database-error.d.ts.map +0 -1
- package/dist/database/errors/database-error.js +0 -20
- package/dist/database/errors/database-error.js.map +0 -1
- package/dist/database/errors/foreign-key-constraint.error.d.ts +0 -14
- package/dist/database/errors/foreign-key-constraint.error.d.ts.map +0 -1
- package/dist/database/errors/foreign-key-constraint.error.js +0 -19
- package/dist/database/errors/foreign-key-constraint.error.js.map +0 -1
- package/dist/database/errors/from-zenstack-error.d.ts +0 -22
- package/dist/database/errors/from-zenstack-error.d.ts.map +0 -1
- package/dist/database/errors/from-zenstack-error.js +0 -114
- package/dist/database/errors/from-zenstack-error.js.map +0 -1
- package/dist/database/errors/index.d.ts +0 -8
- package/dist/database/errors/index.d.ts.map +0 -1
- package/dist/database/errors/index.js +0 -8
- package/dist/database/errors/index.js.map +0 -1
- package/dist/database/errors/invalid-error-code-range.error.d.ts +0 -12
- package/dist/database/errors/invalid-error-code-range.error.d.ts.map +0 -1
- package/dist/database/errors/invalid-error-code-range.error.js +0 -14
- package/dist/database/errors/invalid-error-code-range.error.js.map +0 -1
- package/dist/database/errors/record-not-found.error.d.ts +0 -15
- package/dist/database/errors/record-not-found.error.d.ts.map +0 -1
- package/dist/database/errors/record-not-found.error.js +0 -20
- package/dist/database/errors/record-not-found.error.js.map +0 -1
- package/dist/database/errors/unique-constraint.error.d.ts +0 -15
- package/dist/database/errors/unique-constraint.error.d.ts.map +0 -1
- package/dist/database/errors/unique-constraint.error.js +0 -20
- package/dist/database/errors/unique-constraint.error.js.map +0 -1
- package/dist/database/event-types.d.ts +0 -137
- package/dist/database/event-types.d.ts.map +0 -1
- package/dist/database/event-types.js +0 -13
- package/dist/database/event-types.js.map +0 -1
- package/dist/database/i18n/en.d.ts +0 -15
- package/dist/database/i18n/en.d.ts.map +0 -1
- package/dist/database/i18n/en.js +0 -10
- package/dist/database/i18n/en.js.map +0 -1
- package/dist/database/i18n/index.d.ts +0 -2
- package/dist/database/i18n/index.d.ts.map +0 -1
- package/dist/database/i18n/index.js +0 -2
- package/dist/database/i18n/index.js.map +0 -1
- package/dist/database/index.d.ts +0 -11
- package/dist/database/index.d.ts.map +0 -1
- package/dist/database/index.js +0 -11
- package/dist/database/index.js.map +0 -1
- package/dist/database/plugins/error-handler.plugin.d.ts +0 -21
- package/dist/database/plugins/error-handler.plugin.d.ts.map +0 -1
- package/dist/database/plugins/error-handler.plugin.js +0 -24
- package/dist/database/plugins/error-handler.plugin.js.map +0 -1
- package/dist/database/plugins/event-emitter.plugin.d.ts +0 -37
- package/dist/database/plugins/event-emitter.plugin.d.ts.map +0 -1
- package/dist/database/plugins/event-emitter.plugin.js +0 -43
- package/dist/database/plugins/event-emitter.plugin.js.map +0 -1
- package/dist/database/plugins/index.d.ts +0 -4
- package/dist/database/plugins/index.d.ts.map +0 -1
- package/dist/database/plugins/index.js +0 -4
- package/dist/database/plugins/index.js.map +0 -1
- package/dist/database/plugins/schema-switcher.plugin.d.ts +0 -32
- package/dist/database/plugins/schema-switcher.plugin.d.ts.map +0 -1
- package/dist/database/plugins/schema-switcher.plugin.js +0 -27
- package/dist/database/plugins/schema-switcher.plugin.js.map +0 -1
- package/dist/database/types.d.ts.map +0 -1
- package/dist/database/types.js +0 -2
- package/dist/database/types.js.map +0 -1
- package/dist/factory/factory.d.ts +0 -56
- package/dist/factory/factory.d.ts.map +0 -1
- package/dist/factory/factory.js +0 -86
- package/dist/factory/factory.js.map +0 -1
- package/dist/factory/index.d.ts +0 -3
- package/dist/factory/index.d.ts.map +0 -1
- package/dist/factory/index.js +0 -3
- package/dist/factory/index.js.map +0 -1
- package/dist/factory/sequence.d.ts +0 -38
- package/dist/factory/sequence.d.ts.map +0 -1
- package/dist/factory/sequence.js +0 -54
- package/dist/factory/sequence.js.map +0 -1
- package/dist/guards/auth.guard.d.ts.map +0 -1
- package/dist/guards/auth.guard.js +0 -99
- package/dist/guards/auth.guard.js.map +0 -1
- package/dist/guards/index.d.ts +0 -3
- package/dist/guards/index.d.ts.map +0 -1
- package/dist/guards/index.js +0 -5
- package/dist/guards/index.js.map +0 -1
- package/dist/index.d.ts +0 -3
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -2
- package/dist/index.js.map +0 -1
- package/dist/rbac/adapters/custom-zenstack-adapter.d.ts +0 -61
- package/dist/rbac/adapters/custom-zenstack-adapter.d.ts.map +0 -1
- package/dist/rbac/adapters/custom-zenstack-adapter.js +0 -159
- package/dist/rbac/adapters/custom-zenstack-adapter.js.map +0 -1
- package/dist/rbac/adapters/index.d.ts +0 -2
- package/dist/rbac/adapters/index.d.ts.map +0 -1
- package/dist/rbac/adapters/index.js +0 -2
- package/dist/rbac/adapters/index.js.map +0 -1
- package/dist/rbac/constants.d.ts +0 -8
- package/dist/rbac/constants.d.ts.map +0 -1
- package/dist/rbac/constants.js +0 -8
- package/dist/rbac/constants.js.map +0 -1
- package/dist/rbac/errors/index.d.ts +0 -2
- package/dist/rbac/errors/index.d.ts.map +0 -1
- package/dist/rbac/errors/index.js +0 -2
- package/dist/rbac/errors/index.js.map +0 -1
- package/dist/rbac/errors/insufficient-permissions.error.d.ts +0 -14
- package/dist/rbac/errors/insufficient-permissions.error.d.ts.map +0 -1
- package/dist/rbac/errors/insufficient-permissions.error.js +0 -19
- package/dist/rbac/errors/insufficient-permissions.error.js.map +0 -1
- package/dist/rbac/index.d.ts +0 -9
- package/dist/rbac/index.d.ts.map +0 -1
- package/dist/rbac/index.js +0 -8
- package/dist/rbac/index.js.map +0 -1
- package/dist/rbac/rbac.module.d.ts +0 -26
- package/dist/rbac/rbac.module.d.ts.map +0 -1
- package/dist/rbac/rbac.module.js +0 -62
- package/dist/rbac/rbac.module.js.map +0 -1
- package/dist/rbac/services/casbin-enforcer.service.d.ts +0 -37
- package/dist/rbac/services/casbin-enforcer.service.d.ts.map +0 -1
- package/dist/rbac/services/casbin-enforcer.service.js +0 -86
- package/dist/rbac/services/casbin-enforcer.service.js.map +0 -1
- package/dist/rbac/services/casbin.service.d.ts +0 -37
- package/dist/rbac/services/casbin.service.d.ts.map +0 -1
- package/dist/rbac/services/casbin.service.js +0 -174
- package/dist/rbac/services/casbin.service.js.map +0 -1
- package/dist/rbac/services/index.d.ts +0 -3
- package/dist/rbac/services/index.d.ts.map +0 -1
- package/dist/rbac/services/index.js +0 -3
- package/dist/rbac/services/index.js.map +0 -1
- package/dist/rbac/tokens.d.ts +0 -10
- package/dist/rbac/tokens.d.ts.map +0 -1
- package/dist/rbac/tokens.js +0 -10
- package/dist/rbac/tokens.js.map +0 -1
- package/dist/rbac/types.d.ts +0 -12
- package/dist/rbac/types.d.ts.map +0 -1
- package/dist/rbac/types.js +0 -2
- package/dist/rbac/types.js.map +0 -1
|
@@ -0,0 +1,386 @@
|
|
|
1
|
+
import { i as InferConnectionSchema, n as DefaultConnectionName, r as InferAnySchema, t as ConnectionName } from "./types-Gjk0d2qB.mjs";
|
|
2
|
+
import { AsyncModuleOptions, DynamicModule, ModuleContext, OnInitialize, OnShutdown } from "stratal/module";
|
|
3
|
+
import { ApplicationError, ErrorCode } from "stratal/errors";
|
|
4
|
+
import { AggregateArgs, AllCrudOperations, AnyPlugin, ClientContract, ClientOptions, CountArgs, CreateArgs, CreateManyArgs, DeleteArgs, DeleteManyArgs, FindFirstArgs, FindManyArgs, FindUniqueArgs, GroupByArgs, ModelResult, RuntimePlugin, UpdateArgs, UpdateManyArgs, UpsertArgs } from "@zenstackhq/orm";
|
|
5
|
+
import { SchemaDef } from "@zenstackhq/schema";
|
|
6
|
+
import { Dialect } from "kysely";
|
|
7
|
+
import { MessageKeys } from "stratal/i18n";
|
|
8
|
+
import { SchemaDef as SchemaDef$1 } from "@zenstackhq/orm/schema";
|
|
9
|
+
import { IEventRegistry } from "stratal/events";
|
|
10
|
+
|
|
11
|
+
//#region src/database/database.service.d.ts
|
|
12
|
+
/**
|
|
13
|
+
* DatabaseService type
|
|
14
|
+
*
|
|
15
|
+
* Each connection has its own schema. The service is typed to the connection's schema.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```typescript
|
|
19
|
+
* // Typed to default connection
|
|
20
|
+
* constructor(@inject(DI_TOKENS.Database) private db: DatabaseService) {}
|
|
21
|
+
*
|
|
22
|
+
* // Typed to a specific named connection
|
|
23
|
+
* constructor(@InjectDB('analytics') private analytics: DatabaseService<'analytics'>) {}
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
type DatabaseService<K extends ConnectionName = DefaultConnectionName> = ClientContract<InferConnectionSchema<K>, ClientOptions<InferConnectionSchema<K>>>;
|
|
27
|
+
//#endregion
|
|
28
|
+
//#region src/database/database.module.d.ts
|
|
29
|
+
interface DatabaseConnectionConfig<Schema extends SchemaDef = SchemaDef, Name extends ConnectionName = ConnectionName> {
|
|
30
|
+
name: Name;
|
|
31
|
+
schema: Schema;
|
|
32
|
+
dialect: () => Dialect;
|
|
33
|
+
plugins?: AnyPlugin[];
|
|
34
|
+
}
|
|
35
|
+
interface DatabaseModuleConfig {
|
|
36
|
+
default: DefaultConnectionName;
|
|
37
|
+
connections: DatabaseConnectionConfig[];
|
|
38
|
+
}
|
|
39
|
+
declare class DatabaseModule implements OnInitialize, OnShutdown {
|
|
40
|
+
static forRoot(config: DatabaseModuleConfig): DynamicModule;
|
|
41
|
+
static forRootAsync(options: AsyncModuleOptions<DatabaseModuleConfig>): DynamicModule;
|
|
42
|
+
onInitialize(context: ModuleContext): void;
|
|
43
|
+
onShutdown(context: ModuleContext): void;
|
|
44
|
+
}
|
|
45
|
+
//#endregion
|
|
46
|
+
//#region src/database/database.tokens.d.ts
|
|
47
|
+
declare const DATABASE_TOKENS: {
|
|
48
|
+
readonly Options: symbol;
|
|
49
|
+
readonly Services: symbol;
|
|
50
|
+
};
|
|
51
|
+
declare function connectionSymbol(name: ConnectionName): symbol;
|
|
52
|
+
//#endregion
|
|
53
|
+
//#region src/database/decorators/inject-db.decorator.d.ts
|
|
54
|
+
declare function InjectDB(name: ConnectionName): ParameterDecorator;
|
|
55
|
+
//#endregion
|
|
56
|
+
//#region src/database/event-types.d.ts
|
|
57
|
+
/**
|
|
58
|
+
* Event phase: before or after operation
|
|
59
|
+
*/
|
|
60
|
+
type EventPhase = 'before' | 'after';
|
|
61
|
+
/**
|
|
62
|
+
* All database operations that can trigger events
|
|
63
|
+
*/
|
|
64
|
+
type DatabaseOperation = AllCrudOperations;
|
|
65
|
+
/**
|
|
66
|
+
* Model names derived from the shared database schema.
|
|
67
|
+
* Falls back to `never` if no schema is registered.
|
|
68
|
+
*/
|
|
69
|
+
type ModelName = InferAnySchema extends {
|
|
70
|
+
models: infer M;
|
|
71
|
+
} ? Extract<keyof M, string> : never;
|
|
72
|
+
/**
|
|
73
|
+
* Database event names with all supported patterns.
|
|
74
|
+
*/
|
|
75
|
+
type DatabaseEventName = `${EventPhase}.${ModelName}.${DatabaseOperation}` | `${EventPhase}.${ModelName}` | `${EventPhase}.${DatabaseOperation}` | EventPhase;
|
|
76
|
+
/**
|
|
77
|
+
* Map operation name to ZenStack Args type for a given schema and model
|
|
78
|
+
*/
|
|
79
|
+
type OperationArgsMap<S extends SchemaDef, M extends Extract<keyof S['models'], string>, O extends DatabaseOperation> = O extends 'create' ? CreateArgs<S, M> : O extends 'createMany' ? CreateManyArgs<S, M> : O extends 'update' ? UpdateArgs<S, M> : O extends 'updateMany' ? UpdateManyArgs<S, M> : O extends 'delete' ? DeleteArgs<S, M> : O extends 'deleteMany' ? DeleteManyArgs<S, M> : O extends 'findUnique' ? FindUniqueArgs<S, M> : O extends 'findFirst' ? FindFirstArgs<S, M> : O extends 'findMany' ? FindManyArgs<S, M> : O extends 'upsert' ? UpsertArgs<S, M> : O extends 'count' ? CountArgs<S, M> : O extends 'aggregate' ? AggregateArgs<S, M> : O extends 'groupBy' ? GroupByArgs<S, M> : never;
|
|
80
|
+
/**
|
|
81
|
+
* Extract the data/where property from operation args.
|
|
82
|
+
*/
|
|
83
|
+
type GetData<M extends ModelName, O extends DatabaseOperation> = M extends Extract<keyof InferAnySchema['models'], string> ? OperationArgsMap<InferAnySchema, M, O> extends {
|
|
84
|
+
data: infer D;
|
|
85
|
+
} ? D : OperationArgsMap<InferAnySchema, M, O> extends {
|
|
86
|
+
where: infer W;
|
|
87
|
+
} ? W : OperationArgsMap<InferAnySchema, M, O> : unknown;
|
|
88
|
+
/**
|
|
89
|
+
* Extract result type for a model operation.
|
|
90
|
+
*/
|
|
91
|
+
type GetResult<M extends ModelName, O extends DatabaseOperation> = M extends Extract<keyof InferAnySchema['models'], string> ? O extends 'findMany' | 'createMany' | 'updateMany' | 'deleteMany' ? ModelResult<InferAnySchema, M>[] : O extends 'count' ? number : ModelResult<InferAnySchema, M> : unknown;
|
|
92
|
+
/**
|
|
93
|
+
* Parse event string into structured type for discriminated unions
|
|
94
|
+
*/
|
|
95
|
+
type ParseEvent<E extends string> = E extends `${infer Phase extends EventPhase}.${infer Model extends ModelName}.${infer Op extends DatabaseOperation}` ? {
|
|
96
|
+
phase: Phase;
|
|
97
|
+
model: Model;
|
|
98
|
+
operation: Op;
|
|
99
|
+
type: 'exact';
|
|
100
|
+
} : E extends `${infer Phase extends EventPhase}.${infer Second}` ? Second extends ModelName ? {
|
|
101
|
+
phase: Phase;
|
|
102
|
+
model: Second;
|
|
103
|
+
type: 'model-wildcard';
|
|
104
|
+
} : Second extends DatabaseOperation ? {
|
|
105
|
+
phase: Phase;
|
|
106
|
+
operation: Second;
|
|
107
|
+
type: 'operation-wildcard';
|
|
108
|
+
} : never : E extends EventPhase ? {
|
|
109
|
+
phase: E;
|
|
110
|
+
type: 'phase-wildcard';
|
|
111
|
+
} : never;
|
|
112
|
+
/** Base context fields present in all events */
|
|
113
|
+
interface BaseEventContext {}
|
|
114
|
+
/** Context for exact database events (e.g., "after.User.create") */
|
|
115
|
+
interface ExactDatabaseEventContext<M extends ModelName, O extends DatabaseOperation, Phase extends EventPhase> extends BaseEventContext {
|
|
116
|
+
data: Phase extends 'before' ? GetData<M, O> : Readonly<GetData<M, O>>;
|
|
117
|
+
result: Phase extends 'after' ? GetResult<M, O> : undefined;
|
|
118
|
+
}
|
|
119
|
+
/** Context for model wildcard events (e.g., "after.User") */
|
|
120
|
+
interface ModelWildcardEventContext<Phase extends EventPhase> extends BaseEventContext {
|
|
121
|
+
operation: DatabaseOperation;
|
|
122
|
+
data: Phase extends 'before' ? unknown : Readonly<unknown>;
|
|
123
|
+
result: Phase extends 'after' ? unknown : undefined;
|
|
124
|
+
}
|
|
125
|
+
/** Context for operation wildcard events (e.g., "after.create") */
|
|
126
|
+
interface OperationWildcardEventContext<Phase extends EventPhase> extends BaseEventContext {
|
|
127
|
+
model: ModelName;
|
|
128
|
+
data: Phase extends 'before' ? unknown : Readonly<unknown>;
|
|
129
|
+
result: Phase extends 'after' ? unknown : undefined;
|
|
130
|
+
}
|
|
131
|
+
/** Context for phase wildcard events (e.g., "after" or "before") */
|
|
132
|
+
interface PhaseWildcardEventContext<Phase extends EventPhase> extends BaseEventContext {
|
|
133
|
+
model: ModelName;
|
|
134
|
+
operation: DatabaseOperation;
|
|
135
|
+
data: Phase extends 'before' ? unknown : Readonly<unknown>;
|
|
136
|
+
result: Phase extends 'after' ? unknown : undefined;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Type-safe event context with discriminated unions.
|
|
140
|
+
*/
|
|
141
|
+
type DatabaseEventContext<E extends string> = ParseEvent<E> extends {
|
|
142
|
+
phase: infer P extends EventPhase;
|
|
143
|
+
model: infer M extends ModelName;
|
|
144
|
+
operation: infer O extends DatabaseOperation;
|
|
145
|
+
type: 'exact';
|
|
146
|
+
} ? ExactDatabaseEventContext<M, O, P> : ParseEvent<E> extends {
|
|
147
|
+
phase: infer P extends EventPhase;
|
|
148
|
+
model: infer _M extends ModelName;
|
|
149
|
+
type: 'model-wildcard';
|
|
150
|
+
} ? ModelWildcardEventContext<P> : ParseEvent<E> extends {
|
|
151
|
+
phase: infer P extends EventPhase;
|
|
152
|
+
operation: infer _O extends DatabaseOperation;
|
|
153
|
+
type: 'operation-wildcard';
|
|
154
|
+
} ? OperationWildcardEventContext<P> : ParseEvent<E> extends {
|
|
155
|
+
phase: infer P extends EventPhase;
|
|
156
|
+
type: 'phase-wildcard';
|
|
157
|
+
} ? PhaseWildcardEventContext<P> : BaseEventContext;
|
|
158
|
+
/**
|
|
159
|
+
* Mapped type that produces all database event name to context pairs.
|
|
160
|
+
*
|
|
161
|
+
* Used to augment core's `CustomEventRegistry`:
|
|
162
|
+
*
|
|
163
|
+
* @example
|
|
164
|
+
* ```typescript
|
|
165
|
+
* declare module 'stratal/events' {
|
|
166
|
+
* interface CustomEventRegistry extends DatabaseEvents {}
|
|
167
|
+
* }
|
|
168
|
+
* ```
|
|
169
|
+
*/
|
|
170
|
+
type DatabaseEvents = { [E in DatabaseEventName]: DatabaseEventContext<E> };
|
|
171
|
+
declare module 'stratal/events' {
|
|
172
|
+
interface CustomEventRegistry extends DatabaseEvents {}
|
|
173
|
+
}
|
|
174
|
+
//#endregion
|
|
175
|
+
//#region src/database/errors/database-error.d.ts
|
|
176
|
+
/**
|
|
177
|
+
* DatabaseError
|
|
178
|
+
*
|
|
179
|
+
* Generic database error thrown when a database operation fails
|
|
180
|
+
* and doesn't fit into a more specific error category.
|
|
181
|
+
*
|
|
182
|
+
* This is the base class for all database-related errors.
|
|
183
|
+
*/
|
|
184
|
+
declare class DatabaseError extends ApplicationError {
|
|
185
|
+
constructor(messageKey?: MessageKeys, code?: ErrorCode, metadata?: Record<string, unknown>);
|
|
186
|
+
}
|
|
187
|
+
//#endregion
|
|
188
|
+
//#region src/database/errors/database-config.error.d.ts
|
|
189
|
+
declare class DatabaseConfigError extends DatabaseError {
|
|
190
|
+
constructor(details: string);
|
|
191
|
+
}
|
|
192
|
+
//#endregion
|
|
193
|
+
//#region src/database/errors/foreign-key-constraint.error.d.ts
|
|
194
|
+
/**
|
|
195
|
+
* ForeignKeyConstraintError
|
|
196
|
+
*
|
|
197
|
+
* Thrown when a database foreign key constraint is violated.
|
|
198
|
+
* This typically occurs when:
|
|
199
|
+
* - Trying to insert a record with a foreign key that doesn't exist
|
|
200
|
+
* - Trying to delete a record that is referenced by other records
|
|
201
|
+
* - Trying to update a foreign key to a non-existent value
|
|
202
|
+
*/
|
|
203
|
+
declare class ForeignKeyConstraintError extends DatabaseError {
|
|
204
|
+
constructor(field?: string);
|
|
205
|
+
}
|
|
206
|
+
//#endregion
|
|
207
|
+
//#region src/database/errors/invalid-error-code-range.error.d.ts
|
|
208
|
+
/**
|
|
209
|
+
* InvalidErrorCodeRangeError
|
|
210
|
+
*
|
|
211
|
+
* Thrown when a DatabaseError subclass is constructed with an error code
|
|
212
|
+
* outside the valid database error range (2000-2999).
|
|
213
|
+
* This is a developer-facing error to enforce error code conventions.
|
|
214
|
+
*/
|
|
215
|
+
declare class InvalidErrorCodeRangeError extends ApplicationError {
|
|
216
|
+
constructor(code: number, expectedRange: string);
|
|
217
|
+
}
|
|
218
|
+
//#endregion
|
|
219
|
+
//#region src/database/errors/record-not-found.error.d.ts
|
|
220
|
+
/**
|
|
221
|
+
* RecordNotFoundError
|
|
222
|
+
*
|
|
223
|
+
* Generic error thrown when a database record is not found.
|
|
224
|
+
* This is typically thrown when a findUnique or findFirst operation
|
|
225
|
+
* returns null, or when a required record doesn't exist.
|
|
226
|
+
*
|
|
227
|
+
* Services should catch this and optionally refine it to a more specific
|
|
228
|
+
* domain error (e.g., NoteNotFoundError, UserNotFoundError).
|
|
229
|
+
*/
|
|
230
|
+
declare class RecordNotFoundError extends DatabaseError {
|
|
231
|
+
constructor(details?: string);
|
|
232
|
+
}
|
|
233
|
+
//#endregion
|
|
234
|
+
//#region src/database/errors/unique-constraint.error.d.ts
|
|
235
|
+
/**
|
|
236
|
+
* UniqueConstraintError
|
|
237
|
+
*
|
|
238
|
+
* Thrown when a database unique constraint is violated.
|
|
239
|
+
* This typically occurs when trying to insert or update a record
|
|
240
|
+
* with a value that already exists in a unique column.
|
|
241
|
+
*
|
|
242
|
+
* Services should catch this and optionally refine it to a more specific
|
|
243
|
+
* domain error (e.g., UserEmailAlreadyExistsError).
|
|
244
|
+
*/
|
|
245
|
+
declare class UniqueConstraintError extends DatabaseError {
|
|
246
|
+
constructor(fields?: string[]);
|
|
247
|
+
}
|
|
248
|
+
//#endregion
|
|
249
|
+
//#region src/database/errors/from-zenstack-error.d.ts
|
|
250
|
+
/**
|
|
251
|
+
* Transform ZenStack ORM errors into ApplicationError instances
|
|
252
|
+
*
|
|
253
|
+
* This function maps ORMError codes to generic database error classes.
|
|
254
|
+
* Services can catch these generic errors and optionally refine them to
|
|
255
|
+
* more specific domain errors if needed.
|
|
256
|
+
*
|
|
257
|
+
* @param error - The error thrown by ZenStack ORM
|
|
258
|
+
* @returns An ApplicationError instance
|
|
259
|
+
*
|
|
260
|
+
* @example
|
|
261
|
+
* ```typescript
|
|
262
|
+
* try {
|
|
263
|
+
* await db.user.create({ data: { email: 'existing@example.com' } })
|
|
264
|
+
* } catch (error) {
|
|
265
|
+
* throw fromZenStackError(error) // Becomes UniqueConstraintError or other
|
|
266
|
+
* }
|
|
267
|
+
* ```
|
|
268
|
+
*/
|
|
269
|
+
declare function fromZenStackError(error: unknown): DatabaseError;
|
|
270
|
+
//#endregion
|
|
271
|
+
//#region src/database/plugins/error-handler.plugin.d.ts
|
|
272
|
+
/**
|
|
273
|
+
* ZenStack runtime plugin that transforms ORM errors into ApplicationError instances.
|
|
274
|
+
*
|
|
275
|
+
* @example
|
|
276
|
+
* ```typescript
|
|
277
|
+
* super(schema, {
|
|
278
|
+
* dialect: new PostgresDialect({ pool }),
|
|
279
|
+
* plugins: [new ErrorHandlerPlugin()]
|
|
280
|
+
* })
|
|
281
|
+
* ```
|
|
282
|
+
*/
|
|
283
|
+
declare class ErrorHandlerPlugin implements RuntimePlugin<SchemaDef$1, Record<string, unknown>, Record<string, unknown>> {
|
|
284
|
+
readonly id = "error-handler";
|
|
285
|
+
onQuery: ({
|
|
286
|
+
args,
|
|
287
|
+
proceed
|
|
288
|
+
}: {
|
|
289
|
+
args: Record<string, unknown> | undefined;
|
|
290
|
+
proceed: (args: Record<string, unknown> | undefined) => Promise<unknown>;
|
|
291
|
+
}) => Promise<unknown>;
|
|
292
|
+
}
|
|
293
|
+
//#endregion
|
|
294
|
+
//#region src/database/plugins/event-emitter.plugin.d.ts
|
|
295
|
+
interface EventEmitterPluginOptions {
|
|
296
|
+
eventRegistry: IEventRegistry;
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* ZenStack runtime plugin that emits before/after events for database operations.
|
|
300
|
+
*
|
|
301
|
+
* Emits events in the format:
|
|
302
|
+
* - `before.{Model}.{operation}` - Before the database operation
|
|
303
|
+
* - `after.{Model}.{operation}` - After the database operation
|
|
304
|
+
*
|
|
305
|
+
* @example
|
|
306
|
+
* ```typescript
|
|
307
|
+
* super(schema, {
|
|
308
|
+
* dialect: new PostgresDialect({ pool }),
|
|
309
|
+
* plugins: [
|
|
310
|
+
* new EventEmitterPlugin({
|
|
311
|
+
* eventRegistry,
|
|
312
|
+
* })
|
|
313
|
+
* ]
|
|
314
|
+
* })
|
|
315
|
+
* ```
|
|
316
|
+
*/
|
|
317
|
+
declare class EventEmitterPlugin implements RuntimePlugin<SchemaDef$1, Record<string, unknown>, Record<string, unknown>> {
|
|
318
|
+
private options;
|
|
319
|
+
readonly id = "event-emitter";
|
|
320
|
+
constructor(options: EventEmitterPluginOptions);
|
|
321
|
+
onQuery: ({
|
|
322
|
+
model,
|
|
323
|
+
operation,
|
|
324
|
+
args,
|
|
325
|
+
proceed
|
|
326
|
+
}: {
|
|
327
|
+
model: string;
|
|
328
|
+
operation: string;
|
|
329
|
+
args: Record<string, unknown> | undefined;
|
|
330
|
+
proceed: (args: Record<string, unknown> | undefined) => Promise<unknown>;
|
|
331
|
+
}) => Promise<unknown>;
|
|
332
|
+
}
|
|
333
|
+
//#endregion
|
|
334
|
+
//#region src/database/plugins/schema-switcher.plugin.d.ts
|
|
335
|
+
interface SchemaSwitcherPluginOptions {
|
|
336
|
+
schemaName: string;
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* ZenStack runtime plugin that sets PostgreSQL search_path before each query.
|
|
340
|
+
* Used for tenant isolation in multi-tenant applications.
|
|
341
|
+
*
|
|
342
|
+
* @example
|
|
343
|
+
* ```typescript
|
|
344
|
+
* super(schema, {
|
|
345
|
+
* dialect: new PostgresDialect({ pool }),
|
|
346
|
+
* plugins: [
|
|
347
|
+
* new SchemaSwitcherPlugin({ schemaName: `tenant_${tenantId}` })
|
|
348
|
+
* ]
|
|
349
|
+
* })
|
|
350
|
+
* ```
|
|
351
|
+
*/
|
|
352
|
+
declare class SchemaSwitcherPlugin implements RuntimePlugin<SchemaDef$1, Record<string, unknown>, Record<string, unknown>> {
|
|
353
|
+
private options;
|
|
354
|
+
readonly id = "schema-switcher";
|
|
355
|
+
constructor(options: SchemaSwitcherPluginOptions);
|
|
356
|
+
onQuery: ({
|
|
357
|
+
args,
|
|
358
|
+
proceed,
|
|
359
|
+
client
|
|
360
|
+
}: {
|
|
361
|
+
args: Record<string, unknown> | undefined;
|
|
362
|
+
proceed: (args: Record<string, unknown> | undefined) => Promise<unknown>;
|
|
363
|
+
client: {
|
|
364
|
+
$executeRawUnsafe: (sql: string) => Promise<unknown>;
|
|
365
|
+
};
|
|
366
|
+
}) => Promise<unknown>;
|
|
367
|
+
}
|
|
368
|
+
//#endregion
|
|
369
|
+
//#region src/database/i18n/en.d.ts
|
|
370
|
+
declare const databaseI18n: {
|
|
371
|
+
readonly database: {
|
|
372
|
+
readonly connectionNameRequired: "Connection name is required";
|
|
373
|
+
readonly defaultConnectionRequired: "Default connection name is required";
|
|
374
|
+
readonly connectionRequired: "At least one connection is required";
|
|
375
|
+
readonly duplicateConnections: "Duplicate connection names found";
|
|
376
|
+
readonly defaultConnectionNotFound: "Default connection not found in connections";
|
|
377
|
+
};
|
|
378
|
+
};
|
|
379
|
+
declare module 'stratal/i18n' {
|
|
380
|
+
interface AppMessages {
|
|
381
|
+
database: typeof databaseI18n['database'];
|
|
382
|
+
}
|
|
383
|
+
} //# sourceMappingURL=en.d.ts.map
|
|
384
|
+
//#endregion
|
|
385
|
+
export { DATABASE_TOKENS as C, DatabaseModuleConfig as D, DatabaseModule as E, DatabaseService as O, InjectDB as S, DatabaseConnectionConfig as T, EventPhase as _, EventEmitterPluginOptions as a, ModelName as b, UniqueConstraintError as c, ForeignKeyConstraintError as d, DatabaseConfigError as f, DatabaseOperation as g, DatabaseEvents as h, EventEmitterPlugin as i, RecordNotFoundError as l, DatabaseEventName as m, SchemaSwitcherPlugin as n, ErrorHandlerPlugin as o, DatabaseError as p, SchemaSwitcherPluginOptions as r, fromZenStackError as s, databaseI18n as t, InvalidErrorCodeRangeError as u, GetData as v, connectionSymbol as w, ParseEvent as x, GetResult as y };
|
|
386
|
+
//# sourceMappingURL=index-Dlg8mNjq.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-Dlg8mNjq.d.mts","names":[],"sources":["../src/database/database.service.ts","../src/database/database.module.ts","../src/database/database.tokens.ts","../src/database/decorators/inject-db.decorator.ts","../src/database/event-types.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/plugins/error-handler.plugin.ts","../src/database/plugins/event-emitter.plugin.ts","../src/database/plugins/schema-switcher.plugin.ts","../src/database/i18n/en.ts"],"mappings":"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"}
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { i as InferConnectionSchema, n as DefaultConnectionName, o as StratalDatabase, r as InferAnySchema, t as ConnectionName } from "./types-Gjk0d2qB.mjs";
|
|
2
|
+
import { CustomEventRegistry, EventName } from "stratal/events";
|
|
3
|
+
export { type ConnectionName, type CustomEventRegistry, type DefaultConnectionName, type EventName, type InferAnySchema, type InferConnectionSchema, type StratalDatabase };
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,206 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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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"}
|