@stratal/framework 0.0.13 → 0.0.15
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,202 @@
|
|
|
1
|
+
import { AsyncModuleOptions, DynamicModule } from "stratal/module";
|
|
2
|
+
import { ApplicationError } from "stratal/errors";
|
|
3
|
+
import { Auth, BetterAuthOptions } from "better-auth";
|
|
4
|
+
import { APIError } from "better-auth/api";
|
|
5
|
+
import { MiddlewareConfigurable, MiddlewareConsumer } from "stratal/middleware";
|
|
6
|
+
import { Middleware, RouterContext } from "stratal/router";
|
|
7
|
+
|
|
8
|
+
//#region src/auth/auth.module.d.ts
|
|
9
|
+
declare class AuthModule implements MiddlewareConfigurable {
|
|
10
|
+
/**
|
|
11
|
+
* Configure auth middleware.
|
|
12
|
+
*
|
|
13
|
+
* Registers middlewares in order:
|
|
14
|
+
* 1. AuthContextMiddleware - Creates and registers AuthContext in request container
|
|
15
|
+
* 2. SessionVerificationMiddleware - Verifies session and populates AuthContext with userId
|
|
16
|
+
*/
|
|
17
|
+
configure(consumer: MiddlewareConsumer): void;
|
|
18
|
+
/**
|
|
19
|
+
* Configure AuthModule with async options factory
|
|
20
|
+
*/
|
|
21
|
+
static forRootAsync<TOptions extends BetterAuthOptions>(options: AsyncModuleOptions<TOptions>): DynamicModule;
|
|
22
|
+
}
|
|
23
|
+
//#endregion
|
|
24
|
+
//#region src/auth/auth.tokens.d.ts
|
|
25
|
+
/** Token for AuthService - core authentication service */
|
|
26
|
+
declare const AUTH_SERVICE: unique symbol;
|
|
27
|
+
/** Token for Better Auth options configuration */
|
|
28
|
+
declare const AUTH_OPTIONS: unique symbol;
|
|
29
|
+
//#endregion
|
|
30
|
+
//#region src/auth/errors/auth-errors.d.ts
|
|
31
|
+
declare class UserNotFoundError extends ApplicationError {
|
|
32
|
+
constructor(email?: string);
|
|
33
|
+
}
|
|
34
|
+
declare class InvalidCredentialsError extends ApplicationError {
|
|
35
|
+
constructor();
|
|
36
|
+
}
|
|
37
|
+
declare class InvalidPasswordError extends ApplicationError {
|
|
38
|
+
constructor();
|
|
39
|
+
}
|
|
40
|
+
declare class InvalidEmailError extends ApplicationError {
|
|
41
|
+
constructor(email?: string);
|
|
42
|
+
}
|
|
43
|
+
declare class SessionExpiredError extends ApplicationError {
|
|
44
|
+
constructor();
|
|
45
|
+
}
|
|
46
|
+
declare class EmailNotVerifiedError extends ApplicationError {
|
|
47
|
+
constructor(email?: string);
|
|
48
|
+
}
|
|
49
|
+
declare class PasswordTooShortError extends ApplicationError {
|
|
50
|
+
constructor(minLength: number);
|
|
51
|
+
}
|
|
52
|
+
declare class PasswordTooLongError extends ApplicationError {
|
|
53
|
+
constructor(maxLength: number);
|
|
54
|
+
}
|
|
55
|
+
declare class AccountAlreadyExistsError extends ApplicationError {
|
|
56
|
+
constructor(email?: string);
|
|
57
|
+
}
|
|
58
|
+
declare class FailedToCreateUserError extends ApplicationError {
|
|
59
|
+
constructor(reason?: string);
|
|
60
|
+
}
|
|
61
|
+
declare class FailedToCreateSessionError extends ApplicationError {
|
|
62
|
+
constructor(reason?: string);
|
|
63
|
+
}
|
|
64
|
+
declare class FailedToUpdateUserError extends ApplicationError {
|
|
65
|
+
constructor(reason?: string);
|
|
66
|
+
}
|
|
67
|
+
declare class SocialAccountLinkedError extends ApplicationError {
|
|
68
|
+
constructor(provider?: string);
|
|
69
|
+
}
|
|
70
|
+
declare class CannotUnlinkLastAccountError extends ApplicationError {
|
|
71
|
+
constructor();
|
|
72
|
+
}
|
|
73
|
+
declare class ProviderNotFoundError extends ApplicationError {
|
|
74
|
+
constructor(provider?: string);
|
|
75
|
+
}
|
|
76
|
+
declare class UserEmailNotFoundError extends ApplicationError {
|
|
77
|
+
constructor();
|
|
78
|
+
}
|
|
79
|
+
declare class AccountNotFoundError extends ApplicationError {
|
|
80
|
+
constructor();
|
|
81
|
+
}
|
|
82
|
+
declare class CredentialAccountNotFoundError extends ApplicationError {
|
|
83
|
+
constructor();
|
|
84
|
+
}
|
|
85
|
+
declare class UserAlreadyHasPasswordError extends ApplicationError {
|
|
86
|
+
constructor();
|
|
87
|
+
}
|
|
88
|
+
declare class EmailCannotBeUpdatedError extends ApplicationError {
|
|
89
|
+
constructor(reason?: string);
|
|
90
|
+
}
|
|
91
|
+
declare class FailedToGetSessionError extends ApplicationError {
|
|
92
|
+
constructor(reason?: string);
|
|
93
|
+
}
|
|
94
|
+
declare class FailedToGetUserInfoError extends ApplicationError {
|
|
95
|
+
constructor(reason?: string);
|
|
96
|
+
}
|
|
97
|
+
declare class IdTokenNotSupportedError extends ApplicationError {
|
|
98
|
+
constructor();
|
|
99
|
+
}
|
|
100
|
+
declare class TokenExpiredError extends ApplicationError {
|
|
101
|
+
constructor();
|
|
102
|
+
}
|
|
103
|
+
//#endregion
|
|
104
|
+
//#region src/auth/errors/invalid-token.error.d.ts
|
|
105
|
+
declare class InvalidTokenError extends ApplicationError {
|
|
106
|
+
constructor();
|
|
107
|
+
}
|
|
108
|
+
//#endregion
|
|
109
|
+
//#region src/auth/errors/token-required.error.d.ts
|
|
110
|
+
declare class TokenRequiredError extends ApplicationError {
|
|
111
|
+
constructor();
|
|
112
|
+
}
|
|
113
|
+
//#endregion
|
|
114
|
+
//#region src/auth/errors/verification-failed.error.d.ts
|
|
115
|
+
declare class VerificationFailedError extends ApplicationError {
|
|
116
|
+
constructor();
|
|
117
|
+
}
|
|
118
|
+
//#endregion
|
|
119
|
+
//#region src/auth/middleware/auth-context.middleware.d.ts
|
|
120
|
+
/**
|
|
121
|
+
* Auth Context Middleware
|
|
122
|
+
*
|
|
123
|
+
* Registers AuthContext in the request container at the start of each request.
|
|
124
|
+
* This MUST run before SessionVerificationMiddleware and any other middleware
|
|
125
|
+
* that depends on AuthContext.
|
|
126
|
+
*/
|
|
127
|
+
declare class AuthContextMiddleware implements Middleware {
|
|
128
|
+
handle(ctx: RouterContext, next: () => Promise<void>): Promise<void>;
|
|
129
|
+
}
|
|
130
|
+
//#endregion
|
|
131
|
+
//#region src/auth/services/auth.service.d.ts
|
|
132
|
+
/**
|
|
133
|
+
* AuthService
|
|
134
|
+
*
|
|
135
|
+
* Base authentication service using Better Auth.
|
|
136
|
+
* Configured via AuthModule.forRootAsync() from the application layer.
|
|
137
|
+
*
|
|
138
|
+
* **Extensibility:**
|
|
139
|
+
* Extend this class in application layer to add custom methods.
|
|
140
|
+
*
|
|
141
|
+
* @example
|
|
142
|
+
* ```typescript
|
|
143
|
+
* @Transient(AUTH_SERVICE)
|
|
144
|
+
* export class AppAuthService extends AuthService<AuthOptions> {
|
|
145
|
+
* async signInMagicLink(email: string) {
|
|
146
|
+
* return wrapBetterAuth(async () => {
|
|
147
|
+
* return this.auth.api.signInMagicLink({ body: { email }, headers: new Headers() })
|
|
148
|
+
* })
|
|
149
|
+
* }
|
|
150
|
+
* }
|
|
151
|
+
* ```
|
|
152
|
+
*/
|
|
153
|
+
declare class AuthService<TOptions extends BetterAuthOptions = BetterAuthOptions> {
|
|
154
|
+
protected readonly options: TOptions;
|
|
155
|
+
private authInstance;
|
|
156
|
+
constructor(options: TOptions);
|
|
157
|
+
/**
|
|
158
|
+
* Get the Better Auth instance
|
|
159
|
+
*/
|
|
160
|
+
get auth(): Auth<TOptions>;
|
|
161
|
+
}
|
|
162
|
+
//#endregion
|
|
163
|
+
//#region src/auth/middleware/session-verification.middleware.d.ts
|
|
164
|
+
/**
|
|
165
|
+
* Session Verification Middleware
|
|
166
|
+
*
|
|
167
|
+
* Verifies user session via Better Auth and populates AuthContext with userId.
|
|
168
|
+
*
|
|
169
|
+
* **Responsibilities:**
|
|
170
|
+
* - Calls Better Auth's getSession() API
|
|
171
|
+
* - Populates AuthContext with userId if session is valid
|
|
172
|
+
* - Continues request chain regardless of session status
|
|
173
|
+
*/
|
|
174
|
+
declare class SessionVerificationMiddleware implements Middleware {
|
|
175
|
+
private readonly authService;
|
|
176
|
+
constructor(authService: AuthService);
|
|
177
|
+
handle(ctx: RouterContext, next: () => Promise<void>): Promise<void>;
|
|
178
|
+
}
|
|
179
|
+
//#endregion
|
|
180
|
+
//#region src/auth/utils/auth-helpers.d.ts
|
|
181
|
+
/**
|
|
182
|
+
* Get shared Better Auth error handler configuration.
|
|
183
|
+
* Use this in Better Auth config's onAPIError option.
|
|
184
|
+
*/
|
|
185
|
+
declare function getErrorHandlerConfig(): BetterAuthOptions['onAPIError'];
|
|
186
|
+
/**
|
|
187
|
+
* Wrap a Better Auth function in a try/catch block and map errors to ApplicationError.
|
|
188
|
+
*/
|
|
189
|
+
declare const wrapBetterAuth: <T>(fn: () => Promise<T>) => Promise<T>;
|
|
190
|
+
//#endregion
|
|
191
|
+
//#region src/auth/utils/better-auth-error-handler.d.ts
|
|
192
|
+
/**
|
|
193
|
+
* Maps Better Auth API error codes to ApplicationError instances.
|
|
194
|
+
*/
|
|
195
|
+
declare function mapBetterAuthError(error: APIError): ApplicationError;
|
|
196
|
+
/**
|
|
197
|
+
* Type guard to check if an error is a Better Auth APIError
|
|
198
|
+
*/
|
|
199
|
+
declare function isAPIError(error: unknown): error is APIError;
|
|
200
|
+
//#endregion
|
|
201
|
+
export { AUTH_OPTIONS, AUTH_SERVICE, AccountAlreadyExistsError, AccountNotFoundError, AuthContextMiddleware, AuthModule, AuthService, CannotUnlinkLastAccountError, CredentialAccountNotFoundError, EmailCannotBeUpdatedError, EmailNotVerifiedError, FailedToCreateSessionError, FailedToCreateUserError, FailedToGetSessionError, FailedToGetUserInfoError, FailedToUpdateUserError, IdTokenNotSupportedError, InvalidCredentialsError, InvalidEmailError, InvalidPasswordError, InvalidTokenError, PasswordTooLongError, PasswordTooShortError, ProviderNotFoundError, SessionExpiredError, SessionVerificationMiddleware, SocialAccountLinkedError, TokenExpiredError, TokenRequiredError, UserAlreadyHasPasswordError, UserEmailNotFoundError, UserNotFoundError, VerificationFailedError, getErrorHandlerConfig, isAPIError, mapBetterAuthError, wrapBetterAuth };
|
|
202
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/auth/auth.module.ts","../../src/auth/auth.tokens.ts","../../src/auth/errors/auth-errors.ts","../../src/auth/errors/invalid-token.error.ts","../../src/auth/errors/token-required.error.ts","../../src/auth/errors/verification-failed.error.ts","../../src/auth/middleware/auth-context.middleware.ts","../../src/auth/services/auth.service.ts","../../src/auth/middleware/session-verification.middleware.ts","../../src/auth/utils/auth-helpers.ts","../../src/auth/utils/better-auth-error-handler.ts"],"mappings":"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"}
|
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
import "../errors-C_KIIU1v.mjs";
|
|
2
|
+
import { t as __decorate } from "../decorate-RSane8dy.mjs";
|
|
3
|
+
import { t as AuthContext } from "../auth-context-CV3Ko1ew.mjs";
|
|
4
|
+
import { t as __decorateMetadata } from "../decorateMetadata-CETItPez.mjs";
|
|
5
|
+
import { t as __decorateParam } from "../decorateParam-CcTvpNsw.mjs";
|
|
6
|
+
import { Module } from "stratal/module";
|
|
7
|
+
import { DI_TOKENS, Transient } from "stratal/di";
|
|
8
|
+
import { ApplicationError, ERROR_CODES, InternalError } from "stratal/errors";
|
|
9
|
+
import { inject } from "tsyringe";
|
|
10
|
+
import { betterAuth } from "better-auth";
|
|
11
|
+
import { APIError } from "better-auth/api";
|
|
12
|
+
//#region src/auth/auth.tokens.ts
|
|
13
|
+
/** Token for AuthService - core authentication service */
|
|
14
|
+
const AUTH_SERVICE = Symbol.for("stratal:auth:service");
|
|
15
|
+
/** Token for Better Auth options configuration */
|
|
16
|
+
const AUTH_OPTIONS = Symbol.for("stratal:auth:options");
|
|
17
|
+
//#endregion
|
|
18
|
+
//#region src/auth/middleware/auth-context.middleware.ts
|
|
19
|
+
let AuthContextMiddleware = class AuthContextMiddleware {
|
|
20
|
+
async handle(ctx, next) {
|
|
21
|
+
const requestContainer = ctx.getContainer();
|
|
22
|
+
const authContext = new AuthContext();
|
|
23
|
+
requestContainer.registerValue(DI_TOKENS.AuthContext, authContext);
|
|
24
|
+
await next();
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
AuthContextMiddleware = __decorate([Transient()], AuthContextMiddleware);
|
|
28
|
+
//#endregion
|
|
29
|
+
//#region src/auth/middleware/session-verification.middleware.ts
|
|
30
|
+
let SessionVerificationMiddleware = class SessionVerificationMiddleware {
|
|
31
|
+
constructor(authService) {
|
|
32
|
+
this.authService = authService;
|
|
33
|
+
}
|
|
34
|
+
async handle(ctx, next) {
|
|
35
|
+
const session = await this.authService.auth.api.getSession({ headers: ctx.c.req.raw.headers });
|
|
36
|
+
if (session) ctx.getContainer().resolve(DI_TOKENS.AuthContext).setAuthContext({ userId: session.user.id });
|
|
37
|
+
await next();
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
SessionVerificationMiddleware = __decorate([
|
|
41
|
+
Transient(),
|
|
42
|
+
__decorateParam(0, inject(AUTH_SERVICE)),
|
|
43
|
+
__decorateMetadata("design:paramtypes", [Object])
|
|
44
|
+
], SessionVerificationMiddleware);
|
|
45
|
+
//#endregion
|
|
46
|
+
//#region src/auth/errors/auth-errors.ts
|
|
47
|
+
var UserNotFoundError = class extends ApplicationError {
|
|
48
|
+
constructor(email) {
|
|
49
|
+
super("errors.auth.userNotFound", ERROR_CODES.RESOURCE.NOT_FOUND, email ? { email } : void 0);
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
var InvalidCredentialsError = class extends ApplicationError {
|
|
53
|
+
constructor() {
|
|
54
|
+
super("errors.auth.invalidCredentials", ERROR_CODES.AUTH.INVALID_CREDENTIALS);
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
var InvalidPasswordError = class extends ApplicationError {
|
|
58
|
+
constructor() {
|
|
59
|
+
super("errors.auth.invalidPassword", ERROR_CODES.AUTH.INVALID_CREDENTIALS);
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
var InvalidEmailError = class extends ApplicationError {
|
|
63
|
+
constructor(email) {
|
|
64
|
+
super("errors.auth.invalidEmail", ERROR_CODES.VALIDATION.INVALID_FORMAT, email ? { email } : void 0);
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
var SessionExpiredError = class extends ApplicationError {
|
|
68
|
+
constructor() {
|
|
69
|
+
super("errors.auth.sessionExpired", ERROR_CODES.AUTH.SESSION_EXPIRED);
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
var EmailNotVerifiedError = class extends ApplicationError {
|
|
73
|
+
constructor(email) {
|
|
74
|
+
super("errors.auth.emailNotVerified", ERROR_CODES.AUTH.EMAIL_NOT_VERIFIED, email ? { email } : void 0);
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
var PasswordTooShortError = class extends ApplicationError {
|
|
78
|
+
constructor(minLength) {
|
|
79
|
+
super("errors.auth.passwordTooShort", ERROR_CODES.AUTH.PASSWORD_TOO_SHORT, { minLength });
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
var PasswordTooLongError = class extends ApplicationError {
|
|
83
|
+
constructor(maxLength) {
|
|
84
|
+
super("errors.auth.passwordTooLong", ERROR_CODES.AUTH.PASSWORD_TOO_LONG, { maxLength });
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
var AccountAlreadyExistsError = class extends ApplicationError {
|
|
88
|
+
constructor(email) {
|
|
89
|
+
super("errors.auth.accountAlreadyExists", ERROR_CODES.AUTH.ACCOUNT_ALREADY_EXISTS, email ? { email } : void 0);
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
var FailedToCreateUserError = class extends ApplicationError {
|
|
93
|
+
constructor(reason) {
|
|
94
|
+
super("errors.auth.failedToCreateUser", ERROR_CODES.AUTH.FAILED_TO_CREATE_USER, reason ? { reason } : void 0);
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
var FailedToCreateSessionError = class extends ApplicationError {
|
|
98
|
+
constructor(reason) {
|
|
99
|
+
super("errors.auth.failedToCreateSession", ERROR_CODES.AUTH.FAILED_TO_CREATE_SESSION, reason ? { reason } : void 0);
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
var FailedToUpdateUserError = class extends ApplicationError {
|
|
103
|
+
constructor(reason) {
|
|
104
|
+
super("errors.auth.failedToUpdateUser", ERROR_CODES.AUTH.FAILED_TO_UPDATE_USER, reason ? { reason } : void 0);
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
var SocialAccountLinkedError = class extends ApplicationError {
|
|
108
|
+
constructor(provider) {
|
|
109
|
+
super("errors.auth.socialAccountLinked", ERROR_CODES.AUTH.SOCIAL_ACCOUNT_LINKED, provider ? { provider } : void 0);
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
var CannotUnlinkLastAccountError = class extends ApplicationError {
|
|
113
|
+
constructor() {
|
|
114
|
+
super("errors.auth.cannotUnlinkLastAccount", ERROR_CODES.AUTH.CANNOT_UNLINK_LAST_ACCOUNT);
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
var ProviderNotFoundError = class extends ApplicationError {
|
|
118
|
+
constructor(provider) {
|
|
119
|
+
super("errors.auth.providerNotFound", ERROR_CODES.RESOURCE.NOT_FOUND, provider ? { provider } : void 0);
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
var UserEmailNotFoundError = class extends ApplicationError {
|
|
123
|
+
constructor() {
|
|
124
|
+
super("errors.auth.userEmailNotFound", ERROR_CODES.RESOURCE.NOT_FOUND);
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
var AccountNotFoundError = class extends ApplicationError {
|
|
128
|
+
constructor() {
|
|
129
|
+
super("errors.auth.accountNotFound", ERROR_CODES.RESOURCE.NOT_FOUND);
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
var CredentialAccountNotFoundError = class extends ApplicationError {
|
|
133
|
+
constructor() {
|
|
134
|
+
super("errors.auth.credentialAccountNotFound", ERROR_CODES.RESOURCE.NOT_FOUND);
|
|
135
|
+
}
|
|
136
|
+
};
|
|
137
|
+
var UserAlreadyHasPasswordError = class extends ApplicationError {
|
|
138
|
+
constructor() {
|
|
139
|
+
super("errors.auth.userAlreadyHasPassword", ERROR_CODES.RESOURCE.CONFLICT);
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
var EmailCannotBeUpdatedError = class extends ApplicationError {
|
|
143
|
+
constructor(reason) {
|
|
144
|
+
super("errors.auth.emailCannotBeUpdated", ERROR_CODES.VALIDATION.GENERIC, reason ? { reason } : void 0);
|
|
145
|
+
}
|
|
146
|
+
};
|
|
147
|
+
var FailedToGetSessionError = class extends ApplicationError {
|
|
148
|
+
constructor(reason) {
|
|
149
|
+
super("errors.auth.failedToGetSession", ERROR_CODES.SYSTEM.INTERNAL_ERROR, reason ? { reason } : void 0);
|
|
150
|
+
}
|
|
151
|
+
};
|
|
152
|
+
var FailedToGetUserInfoError = class extends ApplicationError {
|
|
153
|
+
constructor(reason) {
|
|
154
|
+
super("errors.auth.failedToGetUserInfo", ERROR_CODES.SYSTEM.INTERNAL_ERROR, reason ? { reason } : void 0);
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
var IdTokenNotSupportedError = class extends ApplicationError {
|
|
158
|
+
constructor() {
|
|
159
|
+
super("errors.auth.invalidToken", ERROR_CODES.VALIDATION.GENERIC);
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
var TokenExpiredError = class extends ApplicationError {
|
|
163
|
+
constructor() {
|
|
164
|
+
super("errors.auth.tokenExpired", ERROR_CODES.VALIDATION.GENERIC);
|
|
165
|
+
}
|
|
166
|
+
};
|
|
167
|
+
//#endregion
|
|
168
|
+
//#region src/auth/errors/invalid-token.error.ts
|
|
169
|
+
var InvalidTokenError = class extends ApplicationError {
|
|
170
|
+
constructor() {
|
|
171
|
+
super("errors.auth.invalidToken", ERROR_CODES.AUTH.INVALID_TOKEN);
|
|
172
|
+
}
|
|
173
|
+
};
|
|
174
|
+
//#endregion
|
|
175
|
+
//#region src/auth/errors/token-required.error.ts
|
|
176
|
+
var TokenRequiredError = class extends ApplicationError {
|
|
177
|
+
constructor() {
|
|
178
|
+
super("errors.auth.tokenRequired", ERROR_CODES.VALIDATION.REQUIRED_FIELD, { field: "token" });
|
|
179
|
+
}
|
|
180
|
+
};
|
|
181
|
+
//#endregion
|
|
182
|
+
//#region src/auth/errors/verification-failed.error.ts
|
|
183
|
+
var VerificationFailedError = class extends ApplicationError {
|
|
184
|
+
constructor() {
|
|
185
|
+
super("errors.auth.verificationFailed", ERROR_CODES.AUTH.INVALID_CREDENTIALS);
|
|
186
|
+
}
|
|
187
|
+
};
|
|
188
|
+
//#endregion
|
|
189
|
+
//#region src/auth/utils/better-auth-error-handler.ts
|
|
190
|
+
/**
|
|
191
|
+
* Maps Better Auth API error codes to ApplicationError instances.
|
|
192
|
+
*/
|
|
193
|
+
function mapBetterAuthError(error) {
|
|
194
|
+
const errorCode = error.body?.code;
|
|
195
|
+
if (error.status === "FOUND") {
|
|
196
|
+
if (error.headers.get("location")?.includes("INVALID_TOKEN")) return new InvalidTokenError();
|
|
197
|
+
}
|
|
198
|
+
if (!errorCode) return new InternalError({
|
|
199
|
+
originalError: `Better Auth error: ${error.message}`,
|
|
200
|
+
stack: error.stack
|
|
201
|
+
});
|
|
202
|
+
if (errorCode === "USER_NOT_FOUND") return new UserNotFoundError();
|
|
203
|
+
if (errorCode === "USER_EMAIL_NOT_FOUND") return new UserEmailNotFoundError();
|
|
204
|
+
if (errorCode === "INVALID_EMAIL_OR_PASSWORD") return new InvalidCredentialsError();
|
|
205
|
+
if (errorCode === "INVALID_PASSWORD") return new InvalidPasswordError();
|
|
206
|
+
if (errorCode === "INVALID_EMAIL") return new InvalidEmailError();
|
|
207
|
+
if (errorCode === "SESSION_EXPIRED") return new SessionExpiredError();
|
|
208
|
+
if (errorCode === "FAILED_TO_CREATE_SESSION") return new FailedToCreateSessionError();
|
|
209
|
+
if (errorCode === "FAILED_TO_GET_SESSION") return new FailedToGetSessionError();
|
|
210
|
+
if (errorCode === "EMAIL_NOT_VERIFIED") return new EmailNotVerifiedError();
|
|
211
|
+
if (errorCode === "EMAIL_CAN_NOT_BE_UPDATED") return new EmailCannotBeUpdatedError();
|
|
212
|
+
if (errorCode === "PASSWORD_TOO_SHORT") return new PasswordTooShortError(8);
|
|
213
|
+
if (errorCode === "PASSWORD_TOO_LONG") return new PasswordTooLongError(128);
|
|
214
|
+
if (errorCode === "USER_ALREADY_EXISTS" || errorCode === "USER_ALREADY_EXISTS_USE_ANOTHER_EMAIL") return new AccountAlreadyExistsError();
|
|
215
|
+
if (errorCode === "ACCOUNT_NOT_FOUND") return new AccountNotFoundError();
|
|
216
|
+
if (errorCode === "CREDENTIAL_ACCOUNT_NOT_FOUND") return new CredentialAccountNotFoundError();
|
|
217
|
+
if (errorCode === "FAILED_TO_UNLINK_LAST_ACCOUNT") return new CannotUnlinkLastAccountError();
|
|
218
|
+
if (errorCode === "FAILED_TO_CREATE_USER") return new FailedToCreateUserError();
|
|
219
|
+
if (errorCode === "FAILED_TO_UPDATE_USER") return new FailedToUpdateUserError();
|
|
220
|
+
if (errorCode === "FAILED_TO_GET_USER_INFO") return new FailedToGetUserInfoError();
|
|
221
|
+
if (errorCode === "SOCIAL_ACCOUNT_ALREADY_LINKED") return new SocialAccountLinkedError();
|
|
222
|
+
if (errorCode === "PROVIDER_NOT_FOUND") return new ProviderNotFoundError();
|
|
223
|
+
if (errorCode === "ID_TOKEN_NOT_SUPPORTED") return new IdTokenNotSupportedError();
|
|
224
|
+
if (errorCode === "INVALID_TOKEN") return new IdTokenNotSupportedError();
|
|
225
|
+
if (errorCode === "TOKEN_EXPIRED") return new TokenExpiredError();
|
|
226
|
+
if (errorCode === "USER_ALREADY_HAS_PASSWORD") return new UserAlreadyHasPasswordError();
|
|
227
|
+
return new InternalError({
|
|
228
|
+
originalError: `Better Auth error [${errorCode}]: ${error.message}`,
|
|
229
|
+
stack: error.stack
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Type guard to check if an error is a Better Auth APIError
|
|
234
|
+
*/
|
|
235
|
+
function isAPIError(error) {
|
|
236
|
+
return error instanceof APIError;
|
|
237
|
+
}
|
|
238
|
+
//#endregion
|
|
239
|
+
//#region src/auth/utils/auth-helpers.ts
|
|
240
|
+
/**
|
|
241
|
+
* Get shared Better Auth error handler configuration.
|
|
242
|
+
* Use this in Better Auth config's onAPIError option.
|
|
243
|
+
*/
|
|
244
|
+
function getErrorHandlerConfig() {
|
|
245
|
+
return {
|
|
246
|
+
throw: false,
|
|
247
|
+
onError: (error) => {
|
|
248
|
+
if (isAPIError(error)) throw mapBetterAuthError(error);
|
|
249
|
+
throw error;
|
|
250
|
+
}
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Wrap a Better Auth function in a try/catch block and map errors to ApplicationError.
|
|
255
|
+
*/
|
|
256
|
+
const wrapBetterAuth = async (fn) => {
|
|
257
|
+
try {
|
|
258
|
+
return await fn();
|
|
259
|
+
} catch (error) {
|
|
260
|
+
if (isAPIError(error)) throw mapBetterAuthError(error);
|
|
261
|
+
throw error;
|
|
262
|
+
}
|
|
263
|
+
};
|
|
264
|
+
//#endregion
|
|
265
|
+
//#region src/auth/services/auth.service.ts
|
|
266
|
+
let AuthService = class AuthService {
|
|
267
|
+
authInstance;
|
|
268
|
+
constructor(options) {
|
|
269
|
+
this.options = options;
|
|
270
|
+
this.authInstance = betterAuth({
|
|
271
|
+
...this.options,
|
|
272
|
+
onAPIError: getErrorHandlerConfig()
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Get the Better Auth instance
|
|
277
|
+
*/
|
|
278
|
+
get auth() {
|
|
279
|
+
return this.authInstance;
|
|
280
|
+
}
|
|
281
|
+
};
|
|
282
|
+
AuthService = __decorate([
|
|
283
|
+
Transient(AUTH_SERVICE),
|
|
284
|
+
__decorateParam(0, inject(AUTH_OPTIONS)),
|
|
285
|
+
__decorateMetadata("design:paramtypes", [Object])
|
|
286
|
+
], AuthService);
|
|
287
|
+
//#endregion
|
|
288
|
+
//#region src/auth/auth.module.ts
|
|
289
|
+
var _AuthModule;
|
|
290
|
+
let AuthModule = _AuthModule = class AuthModule {
|
|
291
|
+
/**
|
|
292
|
+
* Configure auth middleware.
|
|
293
|
+
*
|
|
294
|
+
* Registers middlewares in order:
|
|
295
|
+
* 1. AuthContextMiddleware - Creates and registers AuthContext in request container
|
|
296
|
+
* 2. SessionVerificationMiddleware - Verifies session and populates AuthContext with userId
|
|
297
|
+
*/
|
|
298
|
+
configure(consumer) {
|
|
299
|
+
consumer.apply(AuthContextMiddleware).forRoutes("*");
|
|
300
|
+
consumer.apply(SessionVerificationMiddleware).forRoutes("*");
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Configure AuthModule with async options factory
|
|
304
|
+
*/
|
|
305
|
+
static forRootAsync(options) {
|
|
306
|
+
return {
|
|
307
|
+
module: _AuthModule,
|
|
308
|
+
providers: [{
|
|
309
|
+
provide: AUTH_OPTIONS,
|
|
310
|
+
useFactory: options.useFactory,
|
|
311
|
+
inject: options.inject
|
|
312
|
+
}, {
|
|
313
|
+
provide: AUTH_SERVICE,
|
|
314
|
+
useClass: AuthService
|
|
315
|
+
}]
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
};
|
|
319
|
+
AuthModule = _AuthModule = __decorate([Module({ providers: [] })], AuthModule);
|
|
320
|
+
//#endregion
|
|
321
|
+
export { AUTH_OPTIONS, AUTH_SERVICE, AccountAlreadyExistsError, AccountNotFoundError, AuthContextMiddleware, AuthModule, AuthService, CannotUnlinkLastAccountError, CredentialAccountNotFoundError, EmailCannotBeUpdatedError, EmailNotVerifiedError, FailedToCreateSessionError, FailedToCreateUserError, FailedToGetSessionError, FailedToGetUserInfoError, FailedToUpdateUserError, IdTokenNotSupportedError, InvalidCredentialsError, InvalidEmailError, InvalidPasswordError, InvalidTokenError, PasswordTooLongError, PasswordTooShortError, ProviderNotFoundError, SessionExpiredError, SessionVerificationMiddleware, SocialAccountLinkedError, TokenExpiredError, TokenRequiredError, UserAlreadyHasPasswordError, UserEmailNotFoundError, UserNotFoundError, VerificationFailedError, getErrorHandlerConfig, isAPIError, mapBetterAuthError, wrapBetterAuth };
|
|
322
|
+
|
|
323
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../../src/auth/auth.tokens.ts","../../src/auth/middleware/auth-context.middleware.ts","../../src/auth/middleware/session-verification.middleware.ts","../../src/auth/errors/auth-errors.ts","../../src/auth/errors/invalid-token.error.ts","../../src/auth/errors/token-required.error.ts","../../src/auth/errors/verification-failed.error.ts","../../src/auth/utils/better-auth-error-handler.ts","../../src/auth/utils/auth-helpers.ts","../../src/auth/services/auth.service.ts","../../src/auth/auth.module.ts"],"sourcesContent":["/** Token for AuthService - core authentication service */\nexport const AUTH_SERVICE = Symbol.for('stratal:auth:service')\n\n/** Token for Better Auth options configuration */\nexport const AUTH_OPTIONS = Symbol.for('stratal:auth:options')\n","import { Transient, DI_TOKENS } from 'stratal/di'\nimport type { Middleware, RouterContext } from 'stratal/router'\nimport { AuthContext } from '../../context/auth-context'\n\n/**\n * Auth Context Middleware\n *\n * Registers AuthContext in the request container at the start of each request.\n * This MUST run before SessionVerificationMiddleware and any other middleware\n * that depends on AuthContext.\n */\n@Transient()\nexport class AuthContextMiddleware implements Middleware {\n async handle(ctx: RouterContext, next: () => Promise<void>): Promise<void> {\n const requestContainer = ctx.getContainer()\n\n const authContext = new AuthContext()\n requestContainer.registerValue(DI_TOKENS.AuthContext, authContext)\n\n await next()\n }\n}\n","import { inject } from 'tsyringe'\nimport { Transient, DI_TOKENS } from 'stratal/di'\nimport type { Middleware, RouterContext } from 'stratal/router'\nimport { AuthContext } from '../../context/auth-context'\nimport { AUTH_SERVICE } from '../auth.tokens'\nimport type { AuthService } from '../services/auth.service'\n\n/**\n * Session Verification Middleware\n *\n * Verifies user session via Better Auth and populates AuthContext with userId.\n *\n * **Responsibilities:**\n * - Calls Better Auth's getSession() API\n * - Populates AuthContext with userId if session is valid\n * - Continues request chain regardless of session status\n */\n@Transient()\nexport class SessionVerificationMiddleware implements Middleware {\n constructor(\n @inject(AUTH_SERVICE)\n private readonly authService: AuthService\n ) {}\n\n async handle(ctx: RouterContext, next: () => Promise<void>): Promise<void> {\n const session = await this.authService.auth.api.getSession({\n headers: ctx.c.req.raw.headers\n })\n\n if (session) {\n const authContext = ctx.getContainer().resolve<AuthContext>(DI_TOKENS.AuthContext)\n authContext.setAuthContext({ userId: session.user.id })\n }\n\n await next()\n }\n}\n","import { ApplicationError, ERROR_CODES } from 'stratal/errors'\n\nexport class UserNotFoundError extends ApplicationError {\n constructor(email?: string) {\n super('errors.auth.userNotFound', ERROR_CODES.RESOURCE.NOT_FOUND, email ? { email } : undefined)\n }\n}\n\nexport class InvalidCredentialsError extends ApplicationError {\n constructor() {\n super('errors.auth.invalidCredentials', ERROR_CODES.AUTH.INVALID_CREDENTIALS)\n }\n}\n\nexport class InvalidPasswordError extends ApplicationError {\n constructor() {\n super('errors.auth.invalidPassword', ERROR_CODES.AUTH.INVALID_CREDENTIALS)\n }\n}\n\nexport class InvalidEmailError extends ApplicationError {\n constructor(email?: string) {\n super('errors.auth.invalidEmail', ERROR_CODES.VALIDATION.INVALID_FORMAT, email ? { email } : undefined)\n }\n}\n\nexport class SessionExpiredError extends ApplicationError {\n constructor() {\n super('errors.auth.sessionExpired', ERROR_CODES.AUTH.SESSION_EXPIRED)\n }\n}\n\nexport class EmailNotVerifiedError extends ApplicationError {\n constructor(email?: string) {\n super('errors.auth.emailNotVerified', ERROR_CODES.AUTH.EMAIL_NOT_VERIFIED, email ? { email } : undefined)\n }\n}\n\nexport class PasswordTooShortError extends ApplicationError {\n constructor(minLength: number) {\n super('errors.auth.passwordTooShort', ERROR_CODES.AUTH.PASSWORD_TOO_SHORT, { minLength })\n }\n}\n\nexport class PasswordTooLongError extends ApplicationError {\n constructor(maxLength: number) {\n super('errors.auth.passwordTooLong', ERROR_CODES.AUTH.PASSWORD_TOO_LONG, { maxLength })\n }\n}\n\nexport class AccountAlreadyExistsError extends ApplicationError {\n constructor(email?: string) {\n super('errors.auth.accountAlreadyExists', ERROR_CODES.AUTH.ACCOUNT_ALREADY_EXISTS, email ? { email } : undefined)\n }\n}\n\nexport class FailedToCreateUserError extends ApplicationError {\n constructor(reason?: string) {\n super('errors.auth.failedToCreateUser', ERROR_CODES.AUTH.FAILED_TO_CREATE_USER, reason ? { reason } : undefined)\n }\n}\n\nexport class FailedToCreateSessionError extends ApplicationError {\n constructor(reason?: string) {\n super('errors.auth.failedToCreateSession', ERROR_CODES.AUTH.FAILED_TO_CREATE_SESSION, reason ? { reason } : undefined)\n }\n}\n\nexport class FailedToUpdateUserError extends ApplicationError {\n constructor(reason?: string) {\n super('errors.auth.failedToUpdateUser', ERROR_CODES.AUTH.FAILED_TO_UPDATE_USER, reason ? { reason } : undefined)\n }\n}\n\nexport class SocialAccountLinkedError extends ApplicationError {\n constructor(provider?: string) {\n super('errors.auth.socialAccountLinked', ERROR_CODES.AUTH.SOCIAL_ACCOUNT_LINKED, provider ? { provider } : undefined)\n }\n}\n\nexport class CannotUnlinkLastAccountError extends ApplicationError {\n constructor() {\n super('errors.auth.cannotUnlinkLastAccount', ERROR_CODES.AUTH.CANNOT_UNLINK_LAST_ACCOUNT)\n }\n}\n\nexport class ProviderNotFoundError extends ApplicationError {\n constructor(provider?: string) {\n super('errors.auth.providerNotFound', ERROR_CODES.RESOURCE.NOT_FOUND, provider ? { provider } : undefined)\n }\n}\n\nexport class UserEmailNotFoundError extends ApplicationError {\n constructor() {\n super('errors.auth.userEmailNotFound', ERROR_CODES.RESOURCE.NOT_FOUND)\n }\n}\n\nexport class AccountNotFoundError extends ApplicationError {\n constructor() {\n super('errors.auth.accountNotFound', ERROR_CODES.RESOURCE.NOT_FOUND)\n }\n}\n\nexport class CredentialAccountNotFoundError extends ApplicationError {\n constructor() {\n super('errors.auth.credentialAccountNotFound', ERROR_CODES.RESOURCE.NOT_FOUND)\n }\n}\n\nexport class UserAlreadyHasPasswordError extends ApplicationError {\n constructor() {\n super('errors.auth.userAlreadyHasPassword', ERROR_CODES.RESOURCE.CONFLICT)\n }\n}\n\nexport class EmailCannotBeUpdatedError extends ApplicationError {\n constructor(reason?: string) {\n super('errors.auth.emailCannotBeUpdated', ERROR_CODES.VALIDATION.GENERIC, reason ? { reason } : undefined)\n }\n}\n\nexport class FailedToGetSessionError extends ApplicationError {\n constructor(reason?: string) {\n super('errors.auth.failedToGetSession', ERROR_CODES.SYSTEM.INTERNAL_ERROR, reason ? { reason } : undefined)\n }\n}\n\nexport class FailedToGetUserInfoError extends ApplicationError {\n constructor(reason?: string) {\n super('errors.auth.failedToGetUserInfo', ERROR_CODES.SYSTEM.INTERNAL_ERROR, reason ? { reason } : undefined)\n }\n}\n\nexport class IdTokenNotSupportedError extends ApplicationError {\n constructor() {\n super('errors.auth.invalidToken', ERROR_CODES.VALIDATION.GENERIC)\n }\n}\n\nexport class TokenExpiredError extends ApplicationError {\n constructor() {\n super('errors.auth.tokenExpired', ERROR_CODES.VALIDATION.GENERIC)\n }\n}\n","import { ApplicationError, ERROR_CODES } from 'stratal/errors'\n\nexport class InvalidTokenError extends ApplicationError {\n constructor() {\n super('errors.auth.invalidToken', ERROR_CODES.AUTH.INVALID_TOKEN)\n }\n}\n","import { ApplicationError, ERROR_CODES } from 'stratal/errors'\n\nexport class TokenRequiredError extends ApplicationError {\n constructor() {\n super('errors.auth.tokenRequired', ERROR_CODES.VALIDATION.REQUIRED_FIELD, { field: 'token' })\n }\n}\n","import { ApplicationError, ERROR_CODES } from 'stratal/errors'\n\nexport class VerificationFailedError extends ApplicationError {\n constructor() {\n super('errors.auth.verificationFailed', ERROR_CODES.AUTH.INVALID_CREDENTIALS)\n }\n}\n","import { type BASE_ERROR_CODES } from '@better-auth/core/error'\nimport { APIError } from 'better-auth/api'\nimport type { ApplicationError } from 'stratal/errors'\nimport { InternalError } from 'stratal/errors'\nimport {\n AccountAlreadyExistsError,\n AccountNotFoundError,\n CannotUnlinkLastAccountError,\n CredentialAccountNotFoundError,\n EmailCannotBeUpdatedError,\n EmailNotVerifiedError,\n FailedToCreateSessionError,\n FailedToCreateUserError,\n FailedToGetSessionError,\n FailedToGetUserInfoError,\n FailedToUpdateUserError,\n IdTokenNotSupportedError,\n InvalidCredentialsError,\n InvalidEmailError,\n InvalidPasswordError,\n InvalidTokenError,\n PasswordTooLongError,\n PasswordTooShortError,\n ProviderNotFoundError,\n SessionExpiredError,\n SocialAccountLinkedError,\n TokenExpiredError,\n UserAlreadyHasPasswordError,\n UserEmailNotFoundError,\n UserNotFoundError,\n} from '../errors'\n\n/**\n * Maps Better Auth API error codes to ApplicationError instances.\n */\nexport function mapBetterAuthError(error: APIError): ApplicationError {\n const errorCode = error.body?.code as keyof typeof BASE_ERROR_CODES | 'TOKEN_EXPIRED' | undefined\n\n if (error.status === 'FOUND') {\n const headers = error.headers as Headers\n const hasInvalidToken = headers.get('location')?.includes('INVALID_TOKEN')\n\n if (hasInvalidToken) {\n return new InvalidTokenError()\n }\n }\n\n if (!errorCode) {\n return new InternalError({\n originalError: `Better Auth error: ${error.message}`,\n stack: error.stack,\n })\n }\n\n // User errors\n if (errorCode === 'USER_NOT_FOUND') return new UserNotFoundError()\n if (errorCode === 'USER_EMAIL_NOT_FOUND') return new UserEmailNotFoundError()\n\n // Credential errors\n if (errorCode === 'INVALID_EMAIL_OR_PASSWORD') return new InvalidCredentialsError()\n if (errorCode === 'INVALID_PASSWORD') return new InvalidPasswordError()\n if (errorCode === 'INVALID_EMAIL') return new InvalidEmailError()\n\n // Session errors\n if (errorCode === 'SESSION_EXPIRED') return new SessionExpiredError()\n if (errorCode === 'FAILED_TO_CREATE_SESSION') return new FailedToCreateSessionError()\n if (errorCode === 'FAILED_TO_GET_SESSION') return new FailedToGetSessionError()\n\n // Email verification\n if (errorCode === 'EMAIL_NOT_VERIFIED') return new EmailNotVerifiedError()\n if (errorCode === 'EMAIL_CAN_NOT_BE_UPDATED') return new EmailCannotBeUpdatedError()\n\n // Password validation\n if (errorCode === 'PASSWORD_TOO_SHORT') return new PasswordTooShortError(8)\n if (errorCode === 'PASSWORD_TOO_LONG') return new PasswordTooLongError(128)\n\n // Account errors\n if (errorCode === 'USER_ALREADY_EXISTS' || errorCode === 'USER_ALREADY_EXISTS_USE_ANOTHER_EMAIL') {\n return new AccountAlreadyExistsError()\n }\n if (errorCode === 'ACCOUNT_NOT_FOUND') return new AccountNotFoundError()\n if (errorCode === 'CREDENTIAL_ACCOUNT_NOT_FOUND') return new CredentialAccountNotFoundError()\n if (errorCode === 'FAILED_TO_UNLINK_LAST_ACCOUNT') return new CannotUnlinkLastAccountError()\n\n // User creation/update errors\n if (errorCode === 'FAILED_TO_CREATE_USER') return new FailedToCreateUserError()\n if (errorCode === 'FAILED_TO_UPDATE_USER') return new FailedToUpdateUserError()\n if (errorCode === 'FAILED_TO_GET_USER_INFO') return new FailedToGetUserInfoError()\n\n // Social account errors\n if (errorCode === 'SOCIAL_ACCOUNT_ALREADY_LINKED') return new SocialAccountLinkedError()\n if (errorCode === 'PROVIDER_NOT_FOUND') return new ProviderNotFoundError()\n\n // Token errors\n if (errorCode === 'ID_TOKEN_NOT_SUPPORTED') return new IdTokenNotSupportedError()\n if (errorCode === 'INVALID_TOKEN') return new IdTokenNotSupportedError()\n if (errorCode === 'TOKEN_EXPIRED') return new TokenExpiredError()\n\n // Password management\n if (errorCode === 'USER_ALREADY_HAS_PASSWORD') return new UserAlreadyHasPasswordError()\n\n // Unknown error code\n return new InternalError({\n originalError: `Better Auth error [${errorCode}]: ${error.message}`,\n stack: error.stack,\n })\n}\n\n/**\n * Type guard to check if an error is a Better Auth APIError\n */\nexport function isAPIError(error: unknown): error is APIError {\n return error instanceof APIError\n}\n","import type { BetterAuthOptions } from 'better-auth'\nimport { isAPIError, mapBetterAuthError } from './better-auth-error-handler'\n\n/**\n * Get shared Better Auth error handler configuration.\n * Use this in Better Auth config's onAPIError option.\n */\nexport function getErrorHandlerConfig(): BetterAuthOptions['onAPIError'] {\n return {\n throw: false,\n onError: (error) => {\n if (isAPIError(error)) {\n throw mapBetterAuthError(error)\n }\n throw error\n },\n }\n}\n\n/**\n * Wrap a Better Auth function in a try/catch block and map errors to ApplicationError.\n */\nexport const wrapBetterAuth = async <T>(fn: () => Promise<T>): Promise<T> => {\n try {\n return await fn()\n } catch (error) {\n if (isAPIError(error)) {\n throw mapBetterAuthError(error)\n }\n throw error\n }\n}\n","import type { Auth, BetterAuthOptions } from 'better-auth'\nimport { betterAuth } from 'better-auth'\nimport { inject } from 'tsyringe'\nimport { Transient } from 'stratal/di'\nimport { AUTH_OPTIONS, AUTH_SERVICE } from '../auth.tokens'\nimport { getErrorHandlerConfig } from '../utils'\n\n/**\n * AuthService\n *\n * Base authentication service using Better Auth.\n * Configured via AuthModule.forRootAsync() from the application layer.\n *\n * **Extensibility:**\n * Extend this class in application layer to add custom methods.\n *\n * @example\n * ```typescript\n * @Transient(AUTH_SERVICE)\n * export class AppAuthService extends AuthService<AuthOptions> {\n * async signInMagicLink(email: string) {\n * return wrapBetterAuth(async () => {\n * return this.auth.api.signInMagicLink({ body: { email }, headers: new Headers() })\n * })\n * }\n * }\n * ```\n */\n@Transient(AUTH_SERVICE)\nexport class AuthService<TOptions extends BetterAuthOptions = BetterAuthOptions> {\n private authInstance: Auth<TOptions>\n\n constructor(\n @inject(AUTH_OPTIONS) protected readonly options: TOptions\n ) {\n this.authInstance = betterAuth({\n ...this.options,\n onAPIError: getErrorHandlerConfig()\n }) as Auth<TOptions>\n }\n\n /**\n * Get the Better Auth instance\n */\n get auth(): Auth<TOptions> {\n return this.authInstance\n }\n}\n","/**\n * Auth Module\n *\n * Provides configurable authentication using Better Auth.\n * Use `forRootAsync` to configure Better Auth options from the application layer.\n *\n * @example\n * ```typescript\n * @Module({\n * imports: [\n * AuthModule.forRootAsync({\n * inject: [DI_TOKENS.Database, CONFIG_TOKENS.ConfigService],\n * useFactory: (db, config) => createAuthOptions(db, config)\n * })\n * ]\n * })\n * export class AppModule {}\n * ```\n */\n\nimport type { BetterAuthOptions } from 'better-auth'\nimport type { MiddlewareConfigurable, MiddlewareConsumer } from 'stratal/middleware'\nimport { Module } from 'stratal/module'\nimport type { AsyncModuleOptions, DynamicModule } from 'stratal/module'\nimport { AUTH_OPTIONS, AUTH_SERVICE } from './auth.tokens'\nimport { AuthContextMiddleware } from './middleware/auth-context.middleware'\nimport { SessionVerificationMiddleware } from './middleware/session-verification.middleware'\nimport { AuthService } from './services/auth.service'\n\n@Module({\n providers: []\n})\nexport class AuthModule implements MiddlewareConfigurable {\n /**\n * Configure auth middleware.\n *\n * Registers middlewares in order:\n * 1. AuthContextMiddleware - Creates and registers AuthContext in request container\n * 2. SessionVerificationMiddleware - Verifies session and populates AuthContext with userId\n */\n configure(consumer: MiddlewareConsumer): void {\n consumer\n .apply(AuthContextMiddleware)\n .forRoutes('*')\n\n consumer\n .apply(SessionVerificationMiddleware)\n .forRoutes('*')\n }\n\n /**\n * Configure AuthModule with async options factory\n */\n static forRootAsync<TOptions extends BetterAuthOptions>(\n options: AsyncModuleOptions<TOptions>\n ): DynamicModule {\n return {\n module: AuthModule,\n providers: [\n {\n provide: AUTH_OPTIONS,\n useFactory: options.useFactory,\n inject: options.inject\n },\n {\n provide: AUTH_SERVICE,\n useClass: AuthService\n }\n ]\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|