@stratal/framework 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.
- package/LICENSE +21 -0
- package/README.md +88 -0
- package/dist/auth/auth.module.d.ts +37 -0
- package/dist/auth/auth.module.d.ts.map +1 -0
- package/dist/auth/auth.module.js +74 -0
- package/dist/auth/auth.module.js.map +1 -0
- package/dist/auth/auth.tokens.d.ts +5 -0
- package/dist/auth/auth.tokens.d.ts.map +1 -0
- package/dist/auth/auth.tokens.js +5 -0
- package/dist/auth/auth.tokens.js.map +1 -0
- package/dist/auth/errors/auth-errors.d.ts +74 -0
- package/dist/auth/errors/auth-errors.d.ts.map +1 -0
- package/dist/auth/errors/auth-errors.js +122 -0
- package/dist/auth/errors/auth-errors.js.map +1 -0
- package/dist/auth/errors/index.d.ts +5 -0
- package/dist/auth/errors/index.d.ts.map +1 -0
- package/dist/auth/errors/index.js +5 -0
- package/dist/auth/errors/index.js.map +1 -0
- package/dist/auth/errors/invalid-token.error.d.ts +5 -0
- package/dist/auth/errors/invalid-token.error.d.ts.map +1 -0
- package/dist/auth/errors/invalid-token.error.js +7 -0
- package/dist/auth/errors/invalid-token.error.js.map +1 -0
- package/dist/auth/errors/token-required.error.d.ts +5 -0
- package/dist/auth/errors/token-required.error.d.ts.map +1 -0
- package/dist/auth/errors/token-required.error.js +7 -0
- package/dist/auth/errors/token-required.error.js.map +1 -0
- package/dist/auth/errors/verification-failed.error.d.ts +5 -0
- package/dist/auth/errors/verification-failed.error.d.ts.map +1 -0
- package/dist/auth/errors/verification-failed.error.js +7 -0
- package/dist/auth/errors/verification-failed.error.js.map +1 -0
- package/dist/auth/index.d.ts +7 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +7 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/middleware/auth-context.middleware.d.ts +12 -0
- package/dist/auth/middleware/auth-context.middleware.d.ts.map +1 -0
- package/dist/auth/middleware/auth-context.middleware.js +28 -0
- package/dist/auth/middleware/auth-context.middleware.js.map +1 -0
- package/dist/auth/middleware/index.d.ts +3 -0
- package/dist/auth/middleware/index.d.ts.map +1 -0
- package/dist/auth/middleware/index.js +3 -0
- package/dist/auth/middleware/index.js.map +1 -0
- package/dist/auth/middleware/session-verification.middleware.d.ts +18 -0
- package/dist/auth/middleware/session-verification.middleware.d.ts.map +1 -0
- package/dist/auth/middleware/session-verification.middleware.js +48 -0
- package/dist/auth/middleware/session-verification.middleware.js.map +1 -0
- package/dist/auth/services/auth.service.d.ts +32 -0
- package/dist/auth/services/auth.service.d.ts.map +1 -0
- package/dist/auth/services/auth.service.js +62 -0
- package/dist/auth/services/auth.service.js.map +1 -0
- package/dist/auth/services/index.d.ts +2 -0
- package/dist/auth/services/index.d.ts.map +1 -0
- package/dist/auth/services/index.js +2 -0
- package/dist/auth/services/index.js.map +1 -0
- package/dist/auth/utils/auth-helpers.d.ts +11 -0
- package/dist/auth/utils/auth-helpers.d.ts.map +1 -0
- package/dist/auth/utils/auth-helpers.js +31 -0
- package/dist/auth/utils/auth-helpers.js.map +1 -0
- package/dist/auth/utils/better-auth-error-handler.d.ts +11 -0
- package/dist/auth/utils/better-auth-error-handler.d.ts.map +1 -0
- package/dist/auth/utils/better-auth-error-handler.js +95 -0
- package/dist/auth/utils/better-auth-error-handler.js.map +1 -0
- package/dist/auth/utils/index.d.ts +3 -0
- package/dist/auth/utils/index.d.ts.map +1 -0
- package/dist/auth/utils/index.js +3 -0
- package/dist/auth/utils/index.js.map +1 -0
- package/dist/context/auth-context.d.ts +35 -0
- package/dist/context/auth-context.d.ts.map +1 -0
- package/dist/context/auth-context.js +65 -0
- package/dist/context/auth-context.js.map +1 -0
- package/dist/context/errors/context-not-initialized.error.d.ts +5 -0
- package/dist/context/errors/context-not-initialized.error.d.ts.map +1 -0
- package/dist/context/errors/context-not-initialized.error.js +7 -0
- package/dist/context/errors/context-not-initialized.error.js.map +1 -0
- package/dist/context/errors/index.d.ts +4 -0
- package/dist/context/errors/index.d.ts.map +1 -0
- package/dist/context/errors/index.js +4 -0
- package/dist/context/errors/index.js.map +1 -0
- package/dist/context/errors/user-not-authenticated.error.d.ts +5 -0
- package/dist/context/errors/user-not-authenticated.error.d.ts.map +1 -0
- package/dist/context/errors/user-not-authenticated.error.js +7 -0
- package/dist/context/errors/user-not-authenticated.error.js.map +1 -0
- package/dist/context/errors/user-not-authorized.error.d.ts +5 -0
- package/dist/context/errors/user-not-authorized.error.d.ts.map +1 -0
- package/dist/context/errors/user-not-authorized.error.js +7 -0
- package/dist/context/errors/user-not-authorized.error.js.map +1 -0
- package/dist/context/index.d.ts +3 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/index.js +3 -0
- package/dist/context/index.js.map +1 -0
- package/dist/database/custom-pg-types.d.ts +21 -0
- package/dist/database/custom-pg-types.d.ts.map +1 -0
- package/dist/database/custom-pg-types.js +41 -0
- package/dist/database/custom-pg-types.js.map +1 -0
- package/dist/database/database.helpers.d.ts +18 -0
- package/dist/database/database.helpers.d.ts.map +1 -0
- package/dist/database/database.helpers.js +27 -0
- package/dist/database/database.helpers.js.map +1 -0
- package/dist/database/database.module.d.ts +21 -0
- package/dist/database/database.module.d.ts.map +1 -0
- package/dist/database/database.module.js +62 -0
- package/dist/database/database.module.js.map +1 -0
- package/dist/database/database.service.d.ts +18 -0
- package/dist/database/database.service.d.ts.map +1 -0
- package/dist/database/database.service.js +2 -0
- package/dist/database/database.service.js.map +1 -0
- package/dist/database/database.tokens.d.ts +6 -0
- package/dist/database/database.tokens.d.ts.map +1 -0
- package/dist/database/database.tokens.js +8 -0
- package/dist/database/database.tokens.js.map +1 -0
- package/dist/database/decorators/inject-db.decorator.d.ts +3 -0
- package/dist/database/decorators/inject-db.decorator.d.ts.map +1 -0
- package/dist/database/decorators/inject-db.decorator.js +6 -0
- package/dist/database/decorators/inject-db.decorator.js.map +1 -0
- package/dist/database/errors/database-config.error.d.ts +5 -0
- package/dist/database/errors/database-config.error.d.ts.map +1 -0
- package/dist/database/errors/database-config.error.js +8 -0
- package/dist/database/errors/database-config.error.js.map +1 -0
- package/dist/database/errors/database-error.d.ts +14 -0
- package/dist/database/errors/database-error.d.ts.map +1 -0
- package/dist/database/errors/database-error.js +20 -0
- package/dist/database/errors/database-error.js.map +1 -0
- package/dist/database/errors/foreign-key-constraint.error.d.ts +14 -0
- package/dist/database/errors/foreign-key-constraint.error.d.ts.map +1 -0
- package/dist/database/errors/foreign-key-constraint.error.js +19 -0
- package/dist/database/errors/foreign-key-constraint.error.js.map +1 -0
- package/dist/database/errors/from-zenstack-error.d.ts +22 -0
- package/dist/database/errors/from-zenstack-error.d.ts.map +1 -0
- package/dist/database/errors/from-zenstack-error.js +114 -0
- package/dist/database/errors/from-zenstack-error.js.map +1 -0
- package/dist/database/errors/index.d.ts +8 -0
- package/dist/database/errors/index.d.ts.map +1 -0
- package/dist/database/errors/index.js +8 -0
- package/dist/database/errors/index.js.map +1 -0
- package/dist/database/errors/invalid-error-code-range.error.d.ts +12 -0
- package/dist/database/errors/invalid-error-code-range.error.d.ts.map +1 -0
- package/dist/database/errors/invalid-error-code-range.error.js +14 -0
- package/dist/database/errors/invalid-error-code-range.error.js.map +1 -0
- package/dist/database/errors/record-not-found.error.d.ts +15 -0
- package/dist/database/errors/record-not-found.error.d.ts.map +1 -0
- package/dist/database/errors/record-not-found.error.js +20 -0
- package/dist/database/errors/record-not-found.error.js.map +1 -0
- package/dist/database/errors/unique-constraint.error.d.ts +15 -0
- package/dist/database/errors/unique-constraint.error.d.ts.map +1 -0
- package/dist/database/errors/unique-constraint.error.js +20 -0
- package/dist/database/errors/unique-constraint.error.js.map +1 -0
- package/dist/database/event-types.d.ts +144 -0
- package/dist/database/event-types.d.ts.map +1 -0
- package/dist/database/event-types.js +13 -0
- package/dist/database/event-types.js.map +1 -0
- package/dist/database/index.d.ts +10 -0
- package/dist/database/index.d.ts.map +1 -0
- package/dist/database/index.js +10 -0
- package/dist/database/index.js.map +1 -0
- package/dist/database/plugins/error-handler.plugin.d.ts +21 -0
- package/dist/database/plugins/error-handler.plugin.d.ts.map +1 -0
- package/dist/database/plugins/error-handler.plugin.js +24 -0
- package/dist/database/plugins/error-handler.plugin.js.map +1 -0
- package/dist/database/plugins/event-emitter.plugin.d.ts +37 -0
- package/dist/database/plugins/event-emitter.plugin.d.ts.map +1 -0
- package/dist/database/plugins/event-emitter.plugin.js +43 -0
- package/dist/database/plugins/event-emitter.plugin.js.map +1 -0
- package/dist/database/plugins/index.d.ts +4 -0
- package/dist/database/plugins/index.d.ts.map +1 -0
- package/dist/database/plugins/index.js +4 -0
- package/dist/database/plugins/index.js.map +1 -0
- package/dist/database/plugins/schema-switcher.plugin.d.ts +32 -0
- package/dist/database/plugins/schema-switcher.plugin.d.ts.map +1 -0
- package/dist/database/plugins/schema-switcher.plugin.js +27 -0
- package/dist/database/plugins/schema-switcher.plugin.js.map +1 -0
- package/dist/database/types.d.ts +51 -0
- package/dist/database/types.d.ts.map +1 -0
- package/dist/database/types.js +2 -0
- package/dist/database/types.js.map +1 -0
- package/dist/factory/factory.d.ts +56 -0
- package/dist/factory/factory.d.ts.map +1 -0
- package/dist/factory/factory.js +86 -0
- package/dist/factory/factory.js.map +1 -0
- package/dist/factory/index.d.ts +3 -0
- package/dist/factory/index.d.ts.map +1 -0
- package/dist/factory/index.js +3 -0
- package/dist/factory/index.js.map +1 -0
- package/dist/factory/sequence.d.ts +38 -0
- package/dist/factory/sequence.d.ts.map +1 -0
- package/dist/factory/sequence.js +54 -0
- package/dist/factory/sequence.js.map +1 -0
- package/dist/guards/auth.guard.d.ts +33 -0
- package/dist/guards/auth.guard.d.ts.map +1 -0
- package/dist/guards/auth.guard.js +99 -0
- package/dist/guards/auth.guard.js.map +1 -0
- package/dist/guards/index.d.ts +3 -0
- package/dist/guards/index.d.ts.map +1 -0
- package/dist/guards/index.js +5 -0
- package/dist/guards/index.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/rbac/adapters/custom-zenstack-adapter.d.ts +61 -0
- package/dist/rbac/adapters/custom-zenstack-adapter.d.ts.map +1 -0
- package/dist/rbac/adapters/custom-zenstack-adapter.js +159 -0
- package/dist/rbac/adapters/custom-zenstack-adapter.js.map +1 -0
- package/dist/rbac/adapters/index.d.ts +2 -0
- package/dist/rbac/adapters/index.d.ts.map +1 -0
- package/dist/rbac/adapters/index.js +2 -0
- package/dist/rbac/adapters/index.js.map +1 -0
- package/dist/rbac/constants.d.ts +8 -0
- package/dist/rbac/constants.d.ts.map +1 -0
- package/dist/rbac/constants.js +8 -0
- package/dist/rbac/constants.js.map +1 -0
- package/dist/rbac/errors/index.d.ts +2 -0
- package/dist/rbac/errors/index.d.ts.map +1 -0
- package/dist/rbac/errors/index.js +2 -0
- package/dist/rbac/errors/index.js.map +1 -0
- package/dist/rbac/errors/insufficient-permissions.error.d.ts +14 -0
- package/dist/rbac/errors/insufficient-permissions.error.d.ts.map +1 -0
- package/dist/rbac/errors/insufficient-permissions.error.js +19 -0
- package/dist/rbac/errors/insufficient-permissions.error.js.map +1 -0
- package/dist/rbac/index.d.ts +9 -0
- package/dist/rbac/index.d.ts.map +1 -0
- package/dist/rbac/index.js +8 -0
- package/dist/rbac/index.js.map +1 -0
- package/dist/rbac/rbac.module.d.ts +26 -0
- package/dist/rbac/rbac.module.d.ts.map +1 -0
- package/dist/rbac/rbac.module.js +62 -0
- package/dist/rbac/rbac.module.js.map +1 -0
- package/dist/rbac/services/casbin-enforcer.service.d.ts +37 -0
- package/dist/rbac/services/casbin-enforcer.service.d.ts.map +1 -0
- package/dist/rbac/services/casbin-enforcer.service.js +86 -0
- package/dist/rbac/services/casbin-enforcer.service.js.map +1 -0
- package/dist/rbac/services/casbin.service.d.ts +37 -0
- package/dist/rbac/services/casbin.service.d.ts.map +1 -0
- package/dist/rbac/services/casbin.service.js +174 -0
- package/dist/rbac/services/casbin.service.js.map +1 -0
- package/dist/rbac/services/index.d.ts +3 -0
- package/dist/rbac/services/index.d.ts.map +1 -0
- package/dist/rbac/services/index.js +3 -0
- package/dist/rbac/services/index.js.map +1 -0
- package/dist/rbac/tokens.d.ts +10 -0
- package/dist/rbac/tokens.d.ts.map +1 -0
- package/dist/rbac/tokens.js +10 -0
- package/dist/rbac/tokens.js.map +1 -0
- package/dist/rbac/types.d.ts +12 -0
- package/dist/rbac/types.d.ts.map +1 -0
- package/dist/rbac/types.js +2 -0
- package/dist/rbac/types.js.map +1 -0
- package/package.json +118 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { type Faker } from '@faker-js/faker';
|
|
2
|
+
import type { DatabaseService } from '../database';
|
|
3
|
+
/**
|
|
4
|
+
* Factory
|
|
5
|
+
*
|
|
6
|
+
* Abstract base class for creating test data.
|
|
7
|
+
* Integrates with Faker.js for data generation.
|
|
8
|
+
*
|
|
9
|
+
* @example Define a factory
|
|
10
|
+
* ```typescript
|
|
11
|
+
* import { Factory } from '@stratal/framework/factory'
|
|
12
|
+
* import type { User, UserCreateInput } from '@your-app/db'
|
|
13
|
+
*
|
|
14
|
+
* export class UserFactory extends Factory<User, UserCreateInput> {
|
|
15
|
+
* protected model = 'user'
|
|
16
|
+
*
|
|
17
|
+
* protected definition(): UserCreateInput {
|
|
18
|
+
* return {
|
|
19
|
+
* email: this.faker.internet.email(),
|
|
20
|
+
* firstName: this.faker.person.firstName(),
|
|
21
|
+
* lastName: this.faker.person.lastName(),
|
|
22
|
+
* emailVerified: true,
|
|
23
|
+
* }
|
|
24
|
+
* }
|
|
25
|
+
*
|
|
26
|
+
* admin() {
|
|
27
|
+
* return this.state(attrs => ({ ...attrs, role: 'admin' }))
|
|
28
|
+
* }
|
|
29
|
+
* }
|
|
30
|
+
* ```
|
|
31
|
+
*
|
|
32
|
+
* @example Usage
|
|
33
|
+
* ```typescript
|
|
34
|
+
* const user = await new UserFactory().create(ctx.db)
|
|
35
|
+
* const admin = await new UserFactory().admin().create(ctx.db)
|
|
36
|
+
* const users = await new UserFactory().count(10).createManyAndReturn(ctx.db)
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
export declare abstract class Factory<TModel, TCreateInput> {
|
|
40
|
+
protected readonly faker: Faker;
|
|
41
|
+
protected abstract model: string;
|
|
42
|
+
protected abstract definition(): TCreateInput;
|
|
43
|
+
private states;
|
|
44
|
+
private _count;
|
|
45
|
+
state(modifier: (attrs: TCreateInput) => Partial<TCreateInput>): this;
|
|
46
|
+
count(n: number): this;
|
|
47
|
+
make(): TCreateInput;
|
|
48
|
+
makeMany(count?: number): TCreateInput[];
|
|
49
|
+
create(db: DatabaseService): Promise<TModel>;
|
|
50
|
+
createMany(db: DatabaseService, count?: number): Promise<{
|
|
51
|
+
count: number;
|
|
52
|
+
}>;
|
|
53
|
+
createManyAndReturn(db: DatabaseService, count?: number): Promise<TModel[]>;
|
|
54
|
+
protected clone(): this;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/factory/factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,KAAK,EAAE,MAAM,iBAAiB,CAAA;AACnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAElD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,8BAAsB,OAAO,CAAC,MAAM,EAAE,YAAY;IAChD,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAQ;IACvC,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IAChC,SAAS,CAAC,QAAQ,CAAC,UAAU,IAAI,YAAY;IAE7C,OAAO,CAAC,MAAM,CAAyD;IACvE,OAAO,CAAC,MAAM,CAAI;IAElB,KAAK,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC,YAAY,CAAC,GAAG,IAAI;IAMrE,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAMtB,IAAI,IAAI,YAAY;IAQpB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,YAAY,EAAE;IAKlC,MAAM,CAAC,EAAE,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC;IAM5C,UAAU,CAAC,EAAE,EAAE,eAAe,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAM3E,mBAAmB,CAAC,EAAE,EAAE,eAAe,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAMjF,SAAS,CAAC,KAAK,IAAI,IAAI;CAOxB"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { faker } from '@faker-js/faker';
|
|
2
|
+
/**
|
|
3
|
+
* Factory
|
|
4
|
+
*
|
|
5
|
+
* Abstract base class for creating test data.
|
|
6
|
+
* Integrates with Faker.js for data generation.
|
|
7
|
+
*
|
|
8
|
+
* @example Define a factory
|
|
9
|
+
* ```typescript
|
|
10
|
+
* import { Factory } from '@stratal/framework/factory'
|
|
11
|
+
* import type { User, UserCreateInput } from '@your-app/db'
|
|
12
|
+
*
|
|
13
|
+
* export class UserFactory extends Factory<User, UserCreateInput> {
|
|
14
|
+
* protected model = 'user'
|
|
15
|
+
*
|
|
16
|
+
* protected definition(): UserCreateInput {
|
|
17
|
+
* return {
|
|
18
|
+
* email: this.faker.internet.email(),
|
|
19
|
+
* firstName: this.faker.person.firstName(),
|
|
20
|
+
* lastName: this.faker.person.lastName(),
|
|
21
|
+
* emailVerified: true,
|
|
22
|
+
* }
|
|
23
|
+
* }
|
|
24
|
+
*
|
|
25
|
+
* admin() {
|
|
26
|
+
* return this.state(attrs => ({ ...attrs, role: 'admin' }))
|
|
27
|
+
* }
|
|
28
|
+
* }
|
|
29
|
+
* ```
|
|
30
|
+
*
|
|
31
|
+
* @example Usage
|
|
32
|
+
* ```typescript
|
|
33
|
+
* const user = await new UserFactory().create(ctx.db)
|
|
34
|
+
* const admin = await new UserFactory().admin().create(ctx.db)
|
|
35
|
+
* const users = await new UserFactory().count(10).createManyAndReturn(ctx.db)
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
export class Factory {
|
|
39
|
+
faker = faker;
|
|
40
|
+
states = [];
|
|
41
|
+
_count = 1;
|
|
42
|
+
state(modifier) {
|
|
43
|
+
const clone = this.clone();
|
|
44
|
+
clone.states.push(modifier);
|
|
45
|
+
return clone;
|
|
46
|
+
}
|
|
47
|
+
count(n) {
|
|
48
|
+
const clone = this.clone();
|
|
49
|
+
clone._count = n;
|
|
50
|
+
return clone;
|
|
51
|
+
}
|
|
52
|
+
make() {
|
|
53
|
+
let attrs = this.definition();
|
|
54
|
+
for (const modifier of this.states) {
|
|
55
|
+
attrs = { ...attrs, ...modifier(attrs) };
|
|
56
|
+
}
|
|
57
|
+
return attrs;
|
|
58
|
+
}
|
|
59
|
+
makeMany(count) {
|
|
60
|
+
const n = count ?? this._count;
|
|
61
|
+
return Array.from({ length: n }, () => this.make());
|
|
62
|
+
}
|
|
63
|
+
async create(db) {
|
|
64
|
+
const data = this.make();
|
|
65
|
+
const model = db[this.model];
|
|
66
|
+
return model.create({ data });
|
|
67
|
+
}
|
|
68
|
+
async createMany(db, count) {
|
|
69
|
+
const data = this.makeMany(count);
|
|
70
|
+
const model = db[this.model];
|
|
71
|
+
return model.createMany({ data });
|
|
72
|
+
}
|
|
73
|
+
async createManyAndReturn(db, count) {
|
|
74
|
+
const data = this.makeMany(count);
|
|
75
|
+
const model = db[this.model];
|
|
76
|
+
return model.createManyAndReturn({ data });
|
|
77
|
+
}
|
|
78
|
+
clone() {
|
|
79
|
+
const FactoryClass = this.constructor;
|
|
80
|
+
const clone = new FactoryClass();
|
|
81
|
+
clone.states = [...this.states];
|
|
82
|
+
clone._count = this._count;
|
|
83
|
+
return clone;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/factory/factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAc,MAAM,iBAAiB,CAAA;AAGnD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,MAAM,OAAgB,OAAO;IACR,KAAK,GAAU,KAAK,CAAA;IAI/B,MAAM,GAAuD,EAAE,CAAA;IAC/D,MAAM,GAAG,CAAC,CAAA;IAElB,KAAK,CAAC,QAAwD;QAC5D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAA;QAC1B,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC3B,OAAO,KAAK,CAAA;IACd,CAAC;IAED,KAAK,CAAC,CAAS;QACb,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAA;QAC1B,KAAK,CAAC,MAAM,GAAG,CAAC,CAAA;QAChB,OAAO,KAAK,CAAA;IACd,CAAC;IAED,IAAI;QACF,IAAI,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,CAAA;QAC7B,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACnC,KAAK,GAAG,EAAE,GAAG,KAAK,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAA;QAC1C,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IAED,QAAQ,CAAC,KAAc;QACrB,MAAM,CAAC,GAAG,KAAK,IAAI,IAAI,CAAC,MAAM,CAAA;QAC9B,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;IACrD,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAmB;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;QACxB,MAAM,KAAK,GAAI,EAA+F,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC1H,OAAO,KAAK,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAA;IAC/B,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,EAAmB,EAAE,KAAc;QAClD,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;QACjC,MAAM,KAAK,GAAI,EAAgH,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC3I,OAAO,KAAK,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,CAAC,CAAA;IACnC,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,EAAmB,EAAE,KAAc;QAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;QACjC,MAAM,KAAK,GAAI,EAAgH,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC3I,OAAO,KAAK,CAAC,mBAAmB,CAAC,EAAE,IAAI,EAAE,CAAC,CAAA;IAC5C,CAAC;IAES,KAAK;QACb,MAAM,YAAY,GAAG,IAAI,CAAC,WAA6B,CAAA;QACvD,MAAM,KAAK,GAAG,IAAI,YAAY,EAAE,CAAA;QAChC,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAA;QAC/B,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;QAC1B,OAAO,KAAK,CAAA;IACd,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/factory/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/factory/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sequence
|
|
3
|
+
*
|
|
4
|
+
* Auto-incrementing sequence generator for creating unique values.
|
|
5
|
+
*
|
|
6
|
+
* @example Basic usage
|
|
7
|
+
* ```typescript
|
|
8
|
+
* const emailSeq = new Sequence((n) => `user${n}@example.com`)
|
|
9
|
+
*
|
|
10
|
+
* emailSeq.next() // 'user1@example.com'
|
|
11
|
+
* emailSeq.next() // 'user2@example.com'
|
|
12
|
+
* emailSeq.reset()
|
|
13
|
+
* emailSeq.next() // 'user1@example.com'
|
|
14
|
+
* ```
|
|
15
|
+
*
|
|
16
|
+
* @example With factory
|
|
17
|
+
* ```typescript
|
|
18
|
+
* const orderSeq = new Sequence((n) => `ORD-${String(n).padStart(6, '0')}`)
|
|
19
|
+
*
|
|
20
|
+
* export class OrderFactory extends Factory<Order, OrderCreateInput> {
|
|
21
|
+
* protected definition() {
|
|
22
|
+
* return {
|
|
23
|
+
* orderNumber: orderSeq.next(),
|
|
24
|
+
* // ...
|
|
25
|
+
* }
|
|
26
|
+
* }
|
|
27
|
+
* }
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export declare class Sequence<T = number> {
|
|
31
|
+
private readonly generator?;
|
|
32
|
+
private current;
|
|
33
|
+
constructor(generator?: ((n: number) => T) | undefined);
|
|
34
|
+
next(): T;
|
|
35
|
+
peek(): T;
|
|
36
|
+
reset(): void;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=sequence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sequence.d.ts","sourceRoot":"","sources":["../../src/factory/sequence.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,qBAAa,QAAQ,CAAC,CAAC,GAAG,MAAM;IAGlB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;IAFvC,OAAO,CAAC,OAAO,CAAI;gBAEU,SAAS,CAAC,GAAE,CAAC,CAAC,EAAE,MAAM,KAAK,CAAC,aAAA;IAEzD,IAAI,IAAI,CAAC;IAQT,IAAI,IAAI,CAAC;IAQT,KAAK,IAAI,IAAI;CAGd"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sequence
|
|
3
|
+
*
|
|
4
|
+
* Auto-incrementing sequence generator for creating unique values.
|
|
5
|
+
*
|
|
6
|
+
* @example Basic usage
|
|
7
|
+
* ```typescript
|
|
8
|
+
* const emailSeq = new Sequence((n) => `user${n}@example.com`)
|
|
9
|
+
*
|
|
10
|
+
* emailSeq.next() // 'user1@example.com'
|
|
11
|
+
* emailSeq.next() // 'user2@example.com'
|
|
12
|
+
* emailSeq.reset()
|
|
13
|
+
* emailSeq.next() // 'user1@example.com'
|
|
14
|
+
* ```
|
|
15
|
+
*
|
|
16
|
+
* @example With factory
|
|
17
|
+
* ```typescript
|
|
18
|
+
* const orderSeq = new Sequence((n) => `ORD-${String(n).padStart(6, '0')}`)
|
|
19
|
+
*
|
|
20
|
+
* export class OrderFactory extends Factory<Order, OrderCreateInput> {
|
|
21
|
+
* protected definition() {
|
|
22
|
+
* return {
|
|
23
|
+
* orderNumber: orderSeq.next(),
|
|
24
|
+
* // ...
|
|
25
|
+
* }
|
|
26
|
+
* }
|
|
27
|
+
* }
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export class Sequence {
|
|
31
|
+
generator;
|
|
32
|
+
current = 0;
|
|
33
|
+
constructor(generator) {
|
|
34
|
+
this.generator = generator;
|
|
35
|
+
}
|
|
36
|
+
next() {
|
|
37
|
+
this.current++;
|
|
38
|
+
if (this.generator) {
|
|
39
|
+
return this.generator(this.current);
|
|
40
|
+
}
|
|
41
|
+
return this.current;
|
|
42
|
+
}
|
|
43
|
+
peek() {
|
|
44
|
+
const value = this.current + 1;
|
|
45
|
+
if (this.generator) {
|
|
46
|
+
return this.generator(value);
|
|
47
|
+
}
|
|
48
|
+
return value;
|
|
49
|
+
}
|
|
50
|
+
reset() {
|
|
51
|
+
this.current = 0;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=sequence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sequence.js","sourceRoot":"","sources":["../../src/factory/sequence.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,OAAO,QAAQ;IAGU;IAFrB,OAAO,GAAG,CAAC,CAAA;IAEnB,YAA6B,SAA4B;QAA5B,cAAS,GAAT,SAAS,CAAmB;IAAG,CAAC;IAE7D,IAAI;QACF,IAAI,CAAC,OAAO,EAAE,CAAA;QACd,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACrC,CAAC;QACD,OAAO,IAAI,CAAC,OAAY,CAAA;IAC1B,CAAC;IAED,IAAI;QACF,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,GAAG,CAAC,CAAA;QAC9B,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;QAC9B,CAAC;QACD,OAAO,KAAU,CAAA;IACnB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,OAAO,GAAG,CAAC,CAAA;IAClB,CAAC;CACF"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { AuthGuardOptions, GuardClass } from 'stratal/guards';
|
|
2
|
+
/**
|
|
3
|
+
* AuthGuard Factory
|
|
4
|
+
*
|
|
5
|
+
* Creates a guard class that enforces authentication and optional authorization.
|
|
6
|
+
*
|
|
7
|
+
* **Authentication (no scopes):**
|
|
8
|
+
* - Checks if user is authenticated via AuthContext.isAuthenticated()
|
|
9
|
+
* - Throws UserNotAuthenticatedError (401) if not authenticated
|
|
10
|
+
*
|
|
11
|
+
* **Authorization (with scopes):**
|
|
12
|
+
* - First verifies authentication
|
|
13
|
+
* - Then checks permissions via CasbinService
|
|
14
|
+
* - Throws InsufficientPermissionsError (403) if unauthorized
|
|
15
|
+
*
|
|
16
|
+
* @param options - Configuration options
|
|
17
|
+
* @param options.scopes - Required permissions for authorization
|
|
18
|
+
* @returns Guard class for use with @UseGuards decorator
|
|
19
|
+
*
|
|
20
|
+
* @example Authentication only
|
|
21
|
+
* ```typescript
|
|
22
|
+
* @UseGuards(AuthGuard())
|
|
23
|
+
* export class ProfileController { }
|
|
24
|
+
* ```
|
|
25
|
+
*
|
|
26
|
+
* @example Authentication with permissions
|
|
27
|
+
* ```typescript
|
|
28
|
+
* @UseGuards(AuthGuard({ scopes: ['students:read'] }))
|
|
29
|
+
* export class StudentsController { }
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export declare function AuthGuard(options?: AuthGuardOptions): GuardClass;
|
|
33
|
+
//# sourceMappingURL=auth.guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.guard.d.ts","sourceRoot":"","sources":["../../src/guards/auth.guard.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAe,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAU/E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,SAAS,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,UAAU,CAsDhE"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
11
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
12
|
+
};
|
|
13
|
+
import { DI_TOKENS, Transient } from 'stratal/di';
|
|
14
|
+
import { LOGGER_TOKENS } from 'stratal/logger';
|
|
15
|
+
import { inject } from 'tsyringe';
|
|
16
|
+
import { UserNotAuthenticatedError } from '../context/errors';
|
|
17
|
+
import { InsufficientPermissionsError } from '../rbac/errors/insufficient-permissions.error';
|
|
18
|
+
import { RBAC_TOKENS } from '../rbac/tokens';
|
|
19
|
+
/**
|
|
20
|
+
* AuthGuard Factory
|
|
21
|
+
*
|
|
22
|
+
* Creates a guard class that enforces authentication and optional authorization.
|
|
23
|
+
*
|
|
24
|
+
* **Authentication (no scopes):**
|
|
25
|
+
* - Checks if user is authenticated via AuthContext.isAuthenticated()
|
|
26
|
+
* - Throws UserNotAuthenticatedError (401) if not authenticated
|
|
27
|
+
*
|
|
28
|
+
* **Authorization (with scopes):**
|
|
29
|
+
* - First verifies authentication
|
|
30
|
+
* - Then checks permissions via CasbinService
|
|
31
|
+
* - Throws InsufficientPermissionsError (403) if unauthorized
|
|
32
|
+
*
|
|
33
|
+
* @param options - Configuration options
|
|
34
|
+
* @param options.scopes - Required permissions for authorization
|
|
35
|
+
* @returns Guard class for use with @UseGuards decorator
|
|
36
|
+
*
|
|
37
|
+
* @example Authentication only
|
|
38
|
+
* ```typescript
|
|
39
|
+
* @UseGuards(AuthGuard())
|
|
40
|
+
* export class ProfileController { }
|
|
41
|
+
* ```
|
|
42
|
+
*
|
|
43
|
+
* @example Authentication with permissions
|
|
44
|
+
* ```typescript
|
|
45
|
+
* @UseGuards(AuthGuard({ scopes: ['students:read'] }))
|
|
46
|
+
* export class StudentsController { }
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
49
|
+
export function AuthGuard(options) {
|
|
50
|
+
const scopes = options?.scopes;
|
|
51
|
+
let ConfiguredAuthGuard = class ConfiguredAuthGuard {
|
|
52
|
+
authContext;
|
|
53
|
+
logger;
|
|
54
|
+
casbinService;
|
|
55
|
+
constructor(authContext, logger, casbinService) {
|
|
56
|
+
this.authContext = authContext;
|
|
57
|
+
this.logger = logger;
|
|
58
|
+
this.casbinService = casbinService;
|
|
59
|
+
}
|
|
60
|
+
async canActivate(context) {
|
|
61
|
+
if (!this.authContext.isAuthenticated()) {
|
|
62
|
+
this.logger.debug('Auth guard: User not authenticated');
|
|
63
|
+
throw new UserNotAuthenticatedError();
|
|
64
|
+
}
|
|
65
|
+
if (!scopes || scopes.length === 0) {
|
|
66
|
+
this.logger.debug('Auth guard: Authentication passed (no scopes required)');
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
const userId = this.authContext.getUserId();
|
|
70
|
+
if (!userId) {
|
|
71
|
+
this.logger.debug('Auth guard: No user ID in context');
|
|
72
|
+
throw new InsufficientPermissionsError(scopes, undefined);
|
|
73
|
+
}
|
|
74
|
+
const httpMethod = context.c.req.method.toLowerCase();
|
|
75
|
+
if (this.casbinService) {
|
|
76
|
+
const hasPermission = await this.casbinService.hasAnyPermission(userId, scopes, httpMethod);
|
|
77
|
+
this.logger.debug('Auth guard: Authorization check', {
|
|
78
|
+
userId,
|
|
79
|
+
scopes,
|
|
80
|
+
httpMethod,
|
|
81
|
+
hasPermission,
|
|
82
|
+
});
|
|
83
|
+
if (!hasPermission) {
|
|
84
|
+
throw new InsufficientPermissionsError(scopes, userId);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return true;
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
ConfiguredAuthGuard = __decorate([
|
|
91
|
+
Transient(),
|
|
92
|
+
__param(0, inject(DI_TOKENS.AuthContext)),
|
|
93
|
+
__param(1, inject(LOGGER_TOKENS.LoggerService)),
|
|
94
|
+
__param(2, inject(RBAC_TOKENS.CasbinService, { isOptional: true })),
|
|
95
|
+
__metadata("design:paramtypes", [Function, Function, Function])
|
|
96
|
+
], ConfiguredAuthGuard);
|
|
97
|
+
return ConfiguredAuthGuard;
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=auth.guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.guard.js","sourceRoot":"","sources":["../../src/guards/auth.guard.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAEjD,OAAO,EAAE,aAAa,EAAsB,MAAM,gBAAgB,CAAA;AAElE,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAEjC,OAAO,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAA;AAC7D,OAAO,EAAE,4BAA4B,EAAE,MAAM,+CAA+C,CAAA;AAE5F,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAE5C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,MAAM,UAAU,SAAS,CAAC,OAA0B;IAClD,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,CAAA;IAE9B,IACM,mBAAmB,GADzB,MACM,mBAAmB;QAE2B;QACM;QACoB;QAH5E,YACkD,WAAwB,EAClB,MAAqB,EACD,aAA6B;YAFvD,gBAAW,GAAX,WAAW,CAAa;YAClB,WAAM,GAAN,MAAM,CAAe;YACD,kBAAa,GAAb,aAAa,CAAgB;QACrG,CAAC;QAEL,KAAK,CAAC,WAAW,CAAC,OAAsB;YACtC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE,EAAE,CAAC;gBACxC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAA;gBACvD,MAAM,IAAI,yBAAyB,EAAE,CAAA;YACvC,CAAC;YAED,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACnC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAA;gBAC3E,OAAO,IAAI,CAAA;YACb,CAAC;YAED,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,CAAA;YAC3C,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAA;gBACtD,MAAM,IAAI,4BAA4B,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;YAC3D,CAAC;YAED,MAAM,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,CAAA;YAErD,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;gBACvB,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAC7D,MAAM,EACN,MAAM,EACN,UAAU,CACX,CAAA;gBAED,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,iCAAiC,EAAE;oBACnD,MAAM;oBACN,MAAM;oBACN,UAAU;oBACV,aAAa;iBACd,CAAC,CAAA;gBAEF,IAAI,CAAC,aAAa,EAAE,CAAC;oBACnB,MAAM,IAAI,4BAA4B,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;gBACxD,CAAC;YACH,CAAC;YAED,OAAO,IAAI,CAAA;QACb,CAAC;KACF,CAAA;IA/CK,mBAAmB;QADxB,SAAS,EAAE;QAGP,WAAA,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,CAAA;QAC7B,WAAA,MAAM,CAAC,aAAa,CAAC,aAAa,CAAC,CAAA;QACnC,WAAA,MAAM,CAAC,WAAW,CAAC,aAAa,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAA;;OAJtD,mBAAmB,CA+CxB;IAED,OAAO,mBAAmB,CAAA;AAC5B,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { UseGuards, getControllerGuards, getMethodGuards, GuardExecutionService, GUARD_METADATA_KEY, type CanActivate, type Guard, type GuardClass, type GuardMetadata, type AuthGuardOptions, } from 'stratal/guards';
|
|
2
|
+
export { AuthGuard } from './auth.guard';
|
|
3
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/guards/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,SAAS,EACT,mBAAmB,EACnB,eAAe,EACf,qBAAqB,EACrB,kBAAkB,EAClB,KAAK,WAAW,EAChB,KAAK,KAAK,EACV,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,gBAAgB,GACtB,MAAM,gBAAgB,CAAA;AAGvB,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// Re-export guard utilities from stratal core
|
|
2
|
+
export { UseGuards, getControllerGuards, getMethodGuards, GuardExecutionService, GUARD_METADATA_KEY, } from 'stratal/guards';
|
|
3
|
+
// Export framework-specific guards
|
|
4
|
+
export { AuthGuard } from './auth.guard';
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/guards/index.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAC9C,OAAO,EACL,SAAS,EACT,mBAAmB,EACnB,eAAe,EACf,qBAAqB,EACrB,kBAAkB,GAMnB,MAAM,gBAAgB,CAAA;AAEvB,mCAAmC;AACnC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export type { DatabaseSchemaRegistry, DefaultDatabaseConnection, ConnectionName, DefaultConnectionName, InferConnectionSchema, InferDatabaseSchema } from './database/types';
|
|
2
|
+
export type { CustomEventRegistry, EventName } from 'stratal/events';
|
|
3
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,cAAc,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AAC5K,YAAY,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { Adapter, Model } from 'casbin';
|
|
2
|
+
/**
|
|
3
|
+
* Minimal interface for the database client used by the adapter.
|
|
4
|
+
* The actual DatabaseService extends ZenStackClient which provides these methods
|
|
5
|
+
* when the schema includes a `casbinRule` model.
|
|
6
|
+
*/
|
|
7
|
+
export interface CasbinDbClient {
|
|
8
|
+
casbinRule: {
|
|
9
|
+
findMany(args?: {
|
|
10
|
+
where?: Record<string, unknown>;
|
|
11
|
+
}): Promise<unknown[]>;
|
|
12
|
+
create(args: {
|
|
13
|
+
data: CasbinRuleCreateInput;
|
|
14
|
+
}): Promise<unknown>;
|
|
15
|
+
createMany(args: {
|
|
16
|
+
data: CasbinRuleCreateInput[];
|
|
17
|
+
}): Promise<unknown>;
|
|
18
|
+
deleteMany(args: {
|
|
19
|
+
where: CasbinRuleCreateInput;
|
|
20
|
+
}): Promise<{
|
|
21
|
+
count: number;
|
|
22
|
+
}>;
|
|
23
|
+
};
|
|
24
|
+
$executeRawUnsafe(query: string, ...values: unknown[]): Promise<unknown>;
|
|
25
|
+
}
|
|
26
|
+
interface CasbinRuleCreateInput {
|
|
27
|
+
ptype: string;
|
|
28
|
+
v0?: string | null;
|
|
29
|
+
v1?: string | null;
|
|
30
|
+
v2?: string | null;
|
|
31
|
+
v3?: string | null;
|
|
32
|
+
v4?: string | null;
|
|
33
|
+
v5?: string | null;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Custom ZenStack adapter for Casbin that works with Cloudflare Workers.
|
|
37
|
+
*
|
|
38
|
+
* Based on the original casbin-prisma-adapter but modified to:
|
|
39
|
+
* - Work with ZenStack v3 ORM clients
|
|
40
|
+
* - Avoid bundling errors in Cloudflare Workers
|
|
41
|
+
* - Accept pre-connected ZenStack clients (request-scoped)
|
|
42
|
+
*/
|
|
43
|
+
export declare class CustomZenStackAdapter implements Adapter {
|
|
44
|
+
#private;
|
|
45
|
+
filtered: boolean;
|
|
46
|
+
isFiltered(): boolean;
|
|
47
|
+
enableFiltered(enabled: boolean): void;
|
|
48
|
+
constructor(db: CasbinDbClient);
|
|
49
|
+
loadPolicy(model: Model): Promise<void>;
|
|
50
|
+
loadFilteredPolicy(model: Model, filter: Record<string, string[][]>): Promise<void>;
|
|
51
|
+
savePolicy(model: Model): Promise<boolean>;
|
|
52
|
+
addPolicy(_sec: string, ptype: string, rule: string[]): Promise<void>;
|
|
53
|
+
addPolicies(_sec: string, ptype: string, rules: string[][]): Promise<void>;
|
|
54
|
+
removePolicy(_sec: string, ptype: string, rule: string[]): Promise<void>;
|
|
55
|
+
removePolicies(_sec: string, ptype: string, rules: string[][]): Promise<void>;
|
|
56
|
+
removeFilteredPolicy(_sec: string, ptype: string, fieldIndex: number, ...fieldValues: string[]): Promise<void>;
|
|
57
|
+
close(): Promise<void>;
|
|
58
|
+
static newAdapter(db: CasbinDbClient): CustomZenStackAdapter;
|
|
59
|
+
}
|
|
60
|
+
export {};
|
|
61
|
+
//# sourceMappingURL=custom-zenstack-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"custom-zenstack-adapter.d.ts","sourceRoot":"","sources":["../../../src/rbac/adapters/custom-zenstack-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAI5C;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE;QACV,QAAQ,CAAC,IAAI,CAAC,EAAE;YAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;SAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAA;QACxE,MAAM,CAAC,IAAI,EAAE;YAAE,IAAI,EAAE,qBAAqB,CAAA;SAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;QAC/D,UAAU,CAAC,IAAI,EAAE;YAAE,IAAI,EAAE,qBAAqB,EAAE,CAAA;SAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;QACrE,UAAU,CAAC,IAAI,EAAE;YAAE,KAAK,EAAE,qBAAqB,CAAA;SAAE,GAAG,OAAO,CAAC;YAAE,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAC/E,CAAA;IACD,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;CACzE;AAED,UAAU,qBAAqB;IAC7B,KAAK,EAAE,MAAM,CAAA;IACb,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAClB,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAClB,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAClB,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAClB,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAClB,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACnB;AAaD;;;;;;;GAOG;AACH,qBAAa,qBAAsB,YAAW,OAAO;;IAGnD,QAAQ,UAAQ;IAET,UAAU,IAAI,OAAO;IAIrB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;gBAIjC,EAAE,EAAE,cAAc;IAIxB,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;IAQvC,kBAAkB,CACtB,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,GACjC,OAAO,CAAC,IAAI,CAAC;IA0BV,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC;IAyB1C,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAKrE,WAAW,CACf,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EAAE,EAAE,GAChB,OAAO,CAAC,IAAI,CAAC;IAWV,YAAY,CAChB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EAAE,GACb,OAAO,CAAC,IAAI,CAAC;IAKV,cAAc,CAClB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EAAE,EAAE,GAChB,OAAO,CAAC,IAAI,CAAC;IAWV,oBAAoB,CACxB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,EAClB,GAAG,WAAW,EAAE,MAAM,EAAE,GACvB,OAAO,CAAC,IAAI,CAAC;IA0BV,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B,MAAM,CAAC,UAAU,CAAC,EAAE,EAAE,cAAc,GAAG,qBAAqB;CA0C7D"}
|