@stratal/framework 0.0.12 → 0.0.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/auth/index.d.mts +202 -0
- package/dist/auth/index.d.mts.map +1 -0
- package/dist/auth/index.mjs +323 -0
- package/dist/auth/index.mjs.map +1 -0
- package/dist/auth-context-BD2ApWg1.d.mts +38 -0
- package/dist/auth-context-BD2ApWg1.d.mts.map +1 -0
- package/dist/auth-context-CV3Ko1ew.mjs +55 -0
- package/dist/auth-context-CV3Ko1ew.mjs.map +1 -0
- package/dist/context/index.d.mts +20 -0
- package/dist/context/index.d.mts.map +1 -0
- package/dist/context/index.mjs +3 -0
- package/dist/database/index.d.mts +3 -0
- package/dist/database/index.mjs +374 -0
- package/dist/database/index.mjs.map +1 -0
- package/dist/decorate-RSane8dy.mjs +9 -0
- package/dist/decorateMetadata-CETItPez.mjs +6 -0
- package/dist/decorateParam-CcTvpNsw.mjs +8 -0
- package/dist/errors-C_KIIU1v.mjs +25 -0
- package/dist/errors-C_KIIU1v.mjs.map +1 -0
- package/dist/factory/index.d.mts +99 -0
- package/dist/factory/index.d.mts.map +1 -0
- package/dist/factory/index.mjs +138 -0
- package/dist/factory/index.mjs.map +1 -0
- package/dist/guards/{auth.guard.d.ts → index.d.mts} +7 -3
- package/dist/guards/index.d.mts.map +1 -0
- package/dist/guards/index.mjs +93 -0
- package/dist/guards/index.mjs.map +1 -0
- package/dist/index-Dlg8mNjq.d.mts +386 -0
- package/dist/index-Dlg8mNjq.d.mts.map +1 -0
- package/dist/index.d.mts +3 -0
- package/dist/index.mjs +1 -0
- package/dist/rbac/index.d.mts +206 -0
- package/dist/rbac/index.d.mts.map +1 -0
- package/dist/rbac/index.mjs +346 -0
- package/dist/rbac/index.mjs.map +1 -0
- package/dist/tokens-Di1ofovy.mjs +32 -0
- package/dist/tokens-Di1ofovy.mjs.map +1 -0
- package/dist/{database/types.d.ts → types-Gjk0d2qB.d.mts} +18 -15
- package/dist/types-Gjk0d2qB.d.mts.map +1 -0
- package/package.json +25 -24
- package/dist/auth/auth.module.d.ts +0 -37
- package/dist/auth/auth.module.d.ts.map +0 -1
- package/dist/auth/auth.module.js +0 -74
- package/dist/auth/auth.module.js.map +0 -1
- package/dist/auth/auth.tokens.d.ts +0 -5
- package/dist/auth/auth.tokens.d.ts.map +0 -1
- package/dist/auth/auth.tokens.js +0 -5
- package/dist/auth/auth.tokens.js.map +0 -1
- package/dist/auth/errors/auth-errors.d.ts +0 -74
- package/dist/auth/errors/auth-errors.d.ts.map +0 -1
- package/dist/auth/errors/auth-errors.js +0 -122
- package/dist/auth/errors/auth-errors.js.map +0 -1
- package/dist/auth/errors/index.d.ts +0 -5
- package/dist/auth/errors/index.d.ts.map +0 -1
- package/dist/auth/errors/index.js +0 -5
- package/dist/auth/errors/index.js.map +0 -1
- package/dist/auth/errors/invalid-token.error.d.ts +0 -5
- package/dist/auth/errors/invalid-token.error.d.ts.map +0 -1
- package/dist/auth/errors/invalid-token.error.js +0 -7
- package/dist/auth/errors/invalid-token.error.js.map +0 -1
- package/dist/auth/errors/token-required.error.d.ts +0 -5
- package/dist/auth/errors/token-required.error.d.ts.map +0 -1
- package/dist/auth/errors/token-required.error.js +0 -7
- package/dist/auth/errors/token-required.error.js.map +0 -1
- package/dist/auth/errors/verification-failed.error.d.ts +0 -5
- package/dist/auth/errors/verification-failed.error.d.ts.map +0 -1
- package/dist/auth/errors/verification-failed.error.js +0 -7
- package/dist/auth/errors/verification-failed.error.js.map +0 -1
- package/dist/auth/index.d.ts +0 -7
- package/dist/auth/index.d.ts.map +0 -1
- package/dist/auth/index.js +0 -7
- package/dist/auth/index.js.map +0 -1
- package/dist/auth/middleware/auth-context.middleware.d.ts +0 -12
- package/dist/auth/middleware/auth-context.middleware.d.ts.map +0 -1
- package/dist/auth/middleware/auth-context.middleware.js +0 -28
- package/dist/auth/middleware/auth-context.middleware.js.map +0 -1
- package/dist/auth/middleware/index.d.ts +0 -3
- package/dist/auth/middleware/index.d.ts.map +0 -1
- package/dist/auth/middleware/index.js +0 -3
- package/dist/auth/middleware/index.js.map +0 -1
- package/dist/auth/middleware/session-verification.middleware.d.ts +0 -18
- package/dist/auth/middleware/session-verification.middleware.d.ts.map +0 -1
- package/dist/auth/middleware/session-verification.middleware.js +0 -48
- package/dist/auth/middleware/session-verification.middleware.js.map +0 -1
- package/dist/auth/services/auth.service.d.ts +0 -32
- package/dist/auth/services/auth.service.d.ts.map +0 -1
- package/dist/auth/services/auth.service.js +0 -62
- package/dist/auth/services/auth.service.js.map +0 -1
- package/dist/auth/services/index.d.ts +0 -2
- package/dist/auth/services/index.d.ts.map +0 -1
- package/dist/auth/services/index.js +0 -2
- package/dist/auth/services/index.js.map +0 -1
- package/dist/auth/utils/auth-helpers.d.ts +0 -11
- package/dist/auth/utils/auth-helpers.d.ts.map +0 -1
- package/dist/auth/utils/auth-helpers.js +0 -31
- package/dist/auth/utils/auth-helpers.js.map +0 -1
- package/dist/auth/utils/better-auth-error-handler.d.ts +0 -11
- package/dist/auth/utils/better-auth-error-handler.d.ts.map +0 -1
- package/dist/auth/utils/better-auth-error-handler.js +0 -95
- package/dist/auth/utils/better-auth-error-handler.js.map +0 -1
- package/dist/auth/utils/index.d.ts +0 -3
- package/dist/auth/utils/index.d.ts.map +0 -1
- package/dist/auth/utils/index.js +0 -3
- package/dist/auth/utils/index.js.map +0 -1
- package/dist/context/auth-context.d.ts +0 -35
- package/dist/context/auth-context.d.ts.map +0 -1
- package/dist/context/auth-context.js +0 -65
- package/dist/context/auth-context.js.map +0 -1
- package/dist/context/errors/context-not-initialized.error.d.ts +0 -5
- package/dist/context/errors/context-not-initialized.error.d.ts.map +0 -1
- package/dist/context/errors/context-not-initialized.error.js +0 -7
- package/dist/context/errors/context-not-initialized.error.js.map +0 -1
- package/dist/context/errors/index.d.ts +0 -4
- package/dist/context/errors/index.d.ts.map +0 -1
- package/dist/context/errors/index.js +0 -4
- package/dist/context/errors/index.js.map +0 -1
- package/dist/context/errors/user-not-authenticated.error.d.ts +0 -5
- package/dist/context/errors/user-not-authenticated.error.d.ts.map +0 -1
- package/dist/context/errors/user-not-authenticated.error.js +0 -7
- package/dist/context/errors/user-not-authenticated.error.js.map +0 -1
- package/dist/context/errors/user-not-authorized.error.d.ts +0 -5
- package/dist/context/errors/user-not-authorized.error.d.ts.map +0 -1
- package/dist/context/errors/user-not-authorized.error.js +0 -7
- package/dist/context/errors/user-not-authorized.error.js.map +0 -1
- package/dist/context/index.d.ts +0 -3
- package/dist/context/index.d.ts.map +0 -1
- package/dist/context/index.js +0 -3
- package/dist/context/index.js.map +0 -1
- package/dist/database/custom-pg-types.d.ts +0 -21
- package/dist/database/custom-pg-types.d.ts.map +0 -1
- package/dist/database/custom-pg-types.js +0 -41
- package/dist/database/custom-pg-types.js.map +0 -1
- package/dist/database/database.helpers.d.ts +0 -15
- package/dist/database/database.helpers.d.ts.map +0 -1
- package/dist/database/database.helpers.js +0 -47
- package/dist/database/database.helpers.js.map +0 -1
- package/dist/database/database.module.d.ts +0 -22
- package/dist/database/database.module.d.ts.map +0 -1
- package/dist/database/database.module.js +0 -54
- package/dist/database/database.module.js.map +0 -1
- package/dist/database/database.service.d.ts +0 -18
- package/dist/database/database.service.d.ts.map +0 -1
- package/dist/database/database.service.js +0 -2
- package/dist/database/database.service.js.map +0 -1
- package/dist/database/database.tokens.d.ts +0 -7
- package/dist/database/database.tokens.d.ts.map +0 -1
- package/dist/database/database.tokens.js +0 -8
- package/dist/database/database.tokens.js.map +0 -1
- package/dist/database/decorators/inject-db.decorator.d.ts +0 -3
- package/dist/database/decorators/inject-db.decorator.d.ts.map +0 -1
- package/dist/database/decorators/inject-db.decorator.js +0 -6
- package/dist/database/decorators/inject-db.decorator.js.map +0 -1
- package/dist/database/errors/database-config.error.d.ts +0 -5
- package/dist/database/errors/database-config.error.d.ts.map +0 -1
- package/dist/database/errors/database-config.error.js +0 -8
- package/dist/database/errors/database-config.error.js.map +0 -1
- package/dist/database/errors/database-error.d.ts +0 -14
- package/dist/database/errors/database-error.d.ts.map +0 -1
- package/dist/database/errors/database-error.js +0 -20
- package/dist/database/errors/database-error.js.map +0 -1
- package/dist/database/errors/foreign-key-constraint.error.d.ts +0 -14
- package/dist/database/errors/foreign-key-constraint.error.d.ts.map +0 -1
- package/dist/database/errors/foreign-key-constraint.error.js +0 -19
- package/dist/database/errors/foreign-key-constraint.error.js.map +0 -1
- package/dist/database/errors/from-zenstack-error.d.ts +0 -22
- package/dist/database/errors/from-zenstack-error.d.ts.map +0 -1
- package/dist/database/errors/from-zenstack-error.js +0 -114
- package/dist/database/errors/from-zenstack-error.js.map +0 -1
- package/dist/database/errors/index.d.ts +0 -8
- package/dist/database/errors/index.d.ts.map +0 -1
- package/dist/database/errors/index.js +0 -8
- package/dist/database/errors/index.js.map +0 -1
- package/dist/database/errors/invalid-error-code-range.error.d.ts +0 -12
- package/dist/database/errors/invalid-error-code-range.error.d.ts.map +0 -1
- package/dist/database/errors/invalid-error-code-range.error.js +0 -14
- package/dist/database/errors/invalid-error-code-range.error.js.map +0 -1
- package/dist/database/errors/record-not-found.error.d.ts +0 -15
- package/dist/database/errors/record-not-found.error.d.ts.map +0 -1
- package/dist/database/errors/record-not-found.error.js +0 -20
- package/dist/database/errors/record-not-found.error.js.map +0 -1
- package/dist/database/errors/unique-constraint.error.d.ts +0 -15
- package/dist/database/errors/unique-constraint.error.d.ts.map +0 -1
- package/dist/database/errors/unique-constraint.error.js +0 -20
- package/dist/database/errors/unique-constraint.error.js.map +0 -1
- package/dist/database/event-types.d.ts +0 -137
- package/dist/database/event-types.d.ts.map +0 -1
- package/dist/database/event-types.js +0 -13
- package/dist/database/event-types.js.map +0 -1
- package/dist/database/i18n/en.d.ts +0 -15
- package/dist/database/i18n/en.d.ts.map +0 -1
- package/dist/database/i18n/en.js +0 -10
- package/dist/database/i18n/en.js.map +0 -1
- package/dist/database/i18n/index.d.ts +0 -2
- package/dist/database/i18n/index.d.ts.map +0 -1
- package/dist/database/i18n/index.js +0 -2
- package/dist/database/i18n/index.js.map +0 -1
- package/dist/database/index.d.ts +0 -11
- package/dist/database/index.d.ts.map +0 -1
- package/dist/database/index.js +0 -11
- package/dist/database/index.js.map +0 -1
- package/dist/database/plugins/error-handler.plugin.d.ts +0 -21
- package/dist/database/plugins/error-handler.plugin.d.ts.map +0 -1
- package/dist/database/plugins/error-handler.plugin.js +0 -24
- package/dist/database/plugins/error-handler.plugin.js.map +0 -1
- package/dist/database/plugins/event-emitter.plugin.d.ts +0 -37
- package/dist/database/plugins/event-emitter.plugin.d.ts.map +0 -1
- package/dist/database/plugins/event-emitter.plugin.js +0 -43
- package/dist/database/plugins/event-emitter.plugin.js.map +0 -1
- package/dist/database/plugins/index.d.ts +0 -4
- package/dist/database/plugins/index.d.ts.map +0 -1
- package/dist/database/plugins/index.js +0 -4
- package/dist/database/plugins/index.js.map +0 -1
- package/dist/database/plugins/schema-switcher.plugin.d.ts +0 -32
- package/dist/database/plugins/schema-switcher.plugin.d.ts.map +0 -1
- package/dist/database/plugins/schema-switcher.plugin.js +0 -27
- package/dist/database/plugins/schema-switcher.plugin.js.map +0 -1
- package/dist/database/types.d.ts.map +0 -1
- package/dist/database/types.js +0 -2
- package/dist/database/types.js.map +0 -1
- package/dist/factory/factory.d.ts +0 -56
- package/dist/factory/factory.d.ts.map +0 -1
- package/dist/factory/factory.js +0 -86
- package/dist/factory/factory.js.map +0 -1
- package/dist/factory/index.d.ts +0 -3
- package/dist/factory/index.d.ts.map +0 -1
- package/dist/factory/index.js +0 -3
- package/dist/factory/index.js.map +0 -1
- package/dist/factory/sequence.d.ts +0 -38
- package/dist/factory/sequence.d.ts.map +0 -1
- package/dist/factory/sequence.js +0 -54
- package/dist/factory/sequence.js.map +0 -1
- package/dist/guards/auth.guard.d.ts.map +0 -1
- package/dist/guards/auth.guard.js +0 -99
- package/dist/guards/auth.guard.js.map +0 -1
- package/dist/guards/index.d.ts +0 -3
- package/dist/guards/index.d.ts.map +0 -1
- package/dist/guards/index.js +0 -5
- package/dist/guards/index.js.map +0 -1
- package/dist/index.d.ts +0 -3
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -2
- package/dist/index.js.map +0 -1
- package/dist/rbac/adapters/custom-zenstack-adapter.d.ts +0 -61
- package/dist/rbac/adapters/custom-zenstack-adapter.d.ts.map +0 -1
- package/dist/rbac/adapters/custom-zenstack-adapter.js +0 -159
- package/dist/rbac/adapters/custom-zenstack-adapter.js.map +0 -1
- package/dist/rbac/adapters/index.d.ts +0 -2
- package/dist/rbac/adapters/index.d.ts.map +0 -1
- package/dist/rbac/adapters/index.js +0 -2
- package/dist/rbac/adapters/index.js.map +0 -1
- package/dist/rbac/constants.d.ts +0 -8
- package/dist/rbac/constants.d.ts.map +0 -1
- package/dist/rbac/constants.js +0 -8
- package/dist/rbac/constants.js.map +0 -1
- package/dist/rbac/errors/index.d.ts +0 -2
- package/dist/rbac/errors/index.d.ts.map +0 -1
- package/dist/rbac/errors/index.js +0 -2
- package/dist/rbac/errors/index.js.map +0 -1
- package/dist/rbac/errors/insufficient-permissions.error.d.ts +0 -14
- package/dist/rbac/errors/insufficient-permissions.error.d.ts.map +0 -1
- package/dist/rbac/errors/insufficient-permissions.error.js +0 -19
- package/dist/rbac/errors/insufficient-permissions.error.js.map +0 -1
- package/dist/rbac/index.d.ts +0 -9
- package/dist/rbac/index.d.ts.map +0 -1
- package/dist/rbac/index.js +0 -8
- package/dist/rbac/index.js.map +0 -1
- package/dist/rbac/rbac.module.d.ts +0 -26
- package/dist/rbac/rbac.module.d.ts.map +0 -1
- package/dist/rbac/rbac.module.js +0 -62
- package/dist/rbac/rbac.module.js.map +0 -1
- package/dist/rbac/services/casbin-enforcer.service.d.ts +0 -37
- package/dist/rbac/services/casbin-enforcer.service.d.ts.map +0 -1
- package/dist/rbac/services/casbin-enforcer.service.js +0 -86
- package/dist/rbac/services/casbin-enforcer.service.js.map +0 -1
- package/dist/rbac/services/casbin.service.d.ts +0 -37
- package/dist/rbac/services/casbin.service.d.ts.map +0 -1
- package/dist/rbac/services/casbin.service.js +0 -174
- package/dist/rbac/services/casbin.service.js.map +0 -1
- package/dist/rbac/services/index.d.ts +0 -3
- package/dist/rbac/services/index.d.ts.map +0 -1
- package/dist/rbac/services/index.js +0 -3
- package/dist/rbac/services/index.js.map +0 -1
- package/dist/rbac/tokens.d.ts +0 -10
- package/dist/rbac/tokens.d.ts.map +0 -1
- package/dist/rbac/tokens.js +0 -10
- package/dist/rbac/tokens.js.map +0 -1
- package/dist/rbac/types.d.ts +0 -12
- package/dist/rbac/types.d.ts.map +0 -1
- package/dist/rbac/types.js +0 -2
- package/dist/rbac/types.js.map +0 -1
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { n as UserNotAuthenticatedError, r as ContextNotInitializedError } from "./errors-C_KIIU1v.mjs";
|
|
2
|
+
import { t as __decorate } from "./decorate-RSane8dy.mjs";
|
|
3
|
+
import { DI_TOKENS, Transient } from "stratal/di";
|
|
4
|
+
//#region src/context/auth-context.ts
|
|
5
|
+
let AuthContext = class AuthContext {
|
|
6
|
+
userId;
|
|
7
|
+
/**
|
|
8
|
+
* Set authentication context.
|
|
9
|
+
* This should be called once per request with user information.
|
|
10
|
+
*/
|
|
11
|
+
setAuthContext(info) {
|
|
12
|
+
this.userId = info.userId;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Get user ID if available.
|
|
16
|
+
* Returns undefined if no user is authenticated.
|
|
17
|
+
*/
|
|
18
|
+
getUserId() {
|
|
19
|
+
return this.userId;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Get user ID or throw if not authenticated.
|
|
23
|
+
* Use this when authentication is required.
|
|
24
|
+
*/
|
|
25
|
+
requireUserId() {
|
|
26
|
+
const userId = this.getUserId();
|
|
27
|
+
if (!userId) throw new UserNotAuthenticatedError();
|
|
28
|
+
return userId;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Get full authentication context or throw if not initialized.
|
|
32
|
+
*/
|
|
33
|
+
getAuthContext() {
|
|
34
|
+
if (!this.userId) throw new ContextNotInitializedError("Authentication");
|
|
35
|
+
return { userId: this.userId };
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Check if user is authenticated.
|
|
39
|
+
*/
|
|
40
|
+
isAuthenticated() {
|
|
41
|
+
return !!this.userId;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Clear authentication context.
|
|
45
|
+
* Useful for testing or cleanup.
|
|
46
|
+
*/
|
|
47
|
+
clearAuthContext() {
|
|
48
|
+
this.userId = void 0;
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
AuthContext = __decorate([Transient(DI_TOKENS.AuthContext)], AuthContext);
|
|
52
|
+
//#endregion
|
|
53
|
+
export { AuthContext as t };
|
|
54
|
+
|
|
55
|
+
//# sourceMappingURL=auth-context-CV3Ko1ew.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-context-CV3Ko1ew.mjs","names":[],"sources":["../src/context/auth-context.ts"],"sourcesContent":["import { Transient, DI_TOKENS } from 'stratal/di'\nimport {\n ContextNotInitializedError,\n UserNotAuthenticatedError\n} from './errors'\n\nexport interface AuthInfo {\n userId?: string\n}\n\n@Transient(DI_TOKENS.AuthContext)\nexport class AuthContext {\n protected userId?: string\n\n /**\n * Set authentication context.\n * This should be called once per request with user information.\n */\n setAuthContext(info: AuthInfo): void {\n this.userId = info.userId\n }\n\n /**\n * Get user ID if available.\n * Returns undefined if no user is authenticated.\n */\n getUserId(): string | undefined {\n return this.userId\n }\n\n /**\n * Get user ID or throw if not authenticated.\n * Use this when authentication is required.\n */\n requireUserId(): string {\n const userId = this.getUserId()\n if (!userId) {\n throw new UserNotAuthenticatedError()\n }\n return userId\n }\n\n /**\n * Get full authentication context or throw if not initialized.\n */\n getAuthContext(): AuthInfo {\n if (!this.userId) {\n throw new ContextNotInitializedError('Authentication')\n }\n return {\n userId: this.userId\n }\n }\n\n /**\n * Check if user is authenticated.\n */\n isAuthenticated(): boolean {\n return !!this.userId\n }\n\n /**\n * Clear authentication context.\n * Useful for testing or cleanup.\n */\n clearAuthContext(): void {\n this.userId = undefined\n }\n}\n"],"mappings":";;;;AAWO,IAAA,cAAA,MAAM,YAAY;CACvB;;;;;CAMA,eAAe,MAAsB;AACnC,OAAK,SAAS,KAAK;;;;;;CAOrB,YAAgC;AAC9B,SAAO,KAAK;;;;;;CAOd,gBAAwB;EACtB,MAAM,SAAS,KAAK,WAAW;AAC/B,MAAI,CAAC,OACH,OAAM,IAAI,2BAA2B;AAEvC,SAAO;;;;;CAMT,iBAA2B;AACzB,MAAI,CAAC,KAAK,OACR,OAAM,IAAI,2BAA2B,iBAAiB;AAExD,SAAO,EACL,QAAQ,KAAK,QACd;;;;;CAMH,kBAA2B;AACzB,SAAO,CAAC,CAAC,KAAK;;;;;;CAOhB,mBAAyB;AACvB,OAAK,SAAS,KAAA;;;0BAxDjB,UAAU,UAAU,YAAY,CAAA,EAAA,YAAA"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { n as AuthInfo, t as AuthContext } from "../auth-context-BD2ApWg1.mjs";
|
|
2
|
+
import { ApplicationError } from "stratal/errors";
|
|
3
|
+
|
|
4
|
+
//#region src/context/errors/context-not-initialized.error.d.ts
|
|
5
|
+
declare class ContextNotInitializedError extends ApplicationError {
|
|
6
|
+
constructor(contextType?: string);
|
|
7
|
+
}
|
|
8
|
+
//#endregion
|
|
9
|
+
//#region src/context/errors/user-not-authenticated.error.d.ts
|
|
10
|
+
declare class UserNotAuthenticatedError extends ApplicationError {
|
|
11
|
+
constructor();
|
|
12
|
+
}
|
|
13
|
+
//#endregion
|
|
14
|
+
//#region src/context/errors/user-not-authorized.error.d.ts
|
|
15
|
+
declare class UserNotAuthorizedError extends ApplicationError {
|
|
16
|
+
constructor();
|
|
17
|
+
}
|
|
18
|
+
//#endregion
|
|
19
|
+
export { AuthContext, AuthInfo, ContextNotInitializedError, UserNotAuthenticatedError, UserNotAuthorizedError };
|
|
20
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/context/errors/context-not-initialized.error.ts","../../src/context/errors/user-not-authenticated.error.ts","../../src/context/errors/user-not-authorized.error.ts"],"mappings":";;;;cAEa,0BAAA,SAAmC,gBAAA;cAClC,WAAA;AAAA;;;cCDD,yBAAA,SAAkC,gBAAA;EAAA,WAAA,CAAA;AAAA;;;cCAlC,sBAAA,SAA+B,gBAAA;EAAA,WAAA,CAAA;AAAA"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { n as UserNotAuthenticatedError, r as ContextNotInitializedError, t as UserNotAuthorizedError } from "../errors-C_KIIU1v.mjs";
|
|
2
|
+
import { t as AuthContext } from "../auth-context-CV3Ko1ew.mjs";
|
|
3
|
+
export { AuthContext, ContextNotInitializedError, UserNotAuthenticatedError, UserNotAuthorizedError };
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { a as InternalDatabaseEventContext, i as InferConnectionSchema, n as DefaultConnectionName, o as StratalDatabase, r as InferAnySchema, t as ConnectionName } from "../types-Gjk0d2qB.mjs";
|
|
2
|
+
import { C as DATABASE_TOKENS, D as DatabaseModuleConfig, E as DatabaseModule, O as DatabaseService, S as InjectDB, T as DatabaseConnectionConfig, _ as EventPhase, a as EventEmitterPluginOptions, b as ModelName, c as UniqueConstraintError, d as ForeignKeyConstraintError, f as DatabaseConfigError, g as DatabaseOperation, h as DatabaseEvents, i as EventEmitterPlugin, l as RecordNotFoundError, m as DatabaseEventName, n as SchemaSwitcherPlugin, o as ErrorHandlerPlugin, p as DatabaseError, r as SchemaSwitcherPluginOptions, s as fromZenStackError, t as databaseI18n, u as InvalidErrorCodeRangeError, v as GetData, w as connectionSymbol, x as ParseEvent, y as GetResult } from "../index-Dlg8mNjq.mjs";
|
|
3
|
+
export { ConnectionName, DATABASE_TOKENS, DatabaseConfigError, DatabaseConnectionConfig, DatabaseError, DatabaseEventName, DatabaseEvents, DatabaseModule, DatabaseModuleConfig, DatabaseOperation, DatabaseService, DefaultConnectionName, ErrorHandlerPlugin, EventEmitterPlugin, EventEmitterPluginOptions, EventPhase, ForeignKeyConstraintError, GetData, GetResult, InferAnySchema, InferConnectionSchema, InjectDB, InternalDatabaseEventContext, InvalidErrorCodeRangeError, ModelName, ParseEvent, RecordNotFoundError, SchemaSwitcherPlugin, SchemaSwitcherPluginOptions, StratalDatabase, UniqueConstraintError, connectionSymbol, databaseI18n, fromZenStackError };
|
|
@@ -0,0 +1,374 @@
|
|
|
1
|
+
import { t as __decorate } from "../decorate-RSane8dy.mjs";
|
|
2
|
+
import { t as __decorateMetadata } from "../decorateMetadata-CETItPez.mjs";
|
|
3
|
+
import { Module } from "stratal/module";
|
|
4
|
+
import { DI_TOKENS, Scope, Transient, delay } from "stratal/di";
|
|
5
|
+
import { ApplicationError, ERROR_CODES } from "stratal/errors";
|
|
6
|
+
import { inject } from "tsyringe";
|
|
7
|
+
import { ORMError, ORMErrorReason, ZenStackClient } from "@zenstackhq/orm";
|
|
8
|
+
import { withI18n, z } from "stratal/validation";
|
|
9
|
+
//#region src/database/errors/invalid-error-code-range.error.ts
|
|
10
|
+
/**
|
|
11
|
+
* InvalidErrorCodeRangeError
|
|
12
|
+
*
|
|
13
|
+
* Thrown when a DatabaseError subclass is constructed with an error code
|
|
14
|
+
* outside the valid database error range (2000-2999).
|
|
15
|
+
* This is a developer-facing error to enforce error code conventions.
|
|
16
|
+
*/
|
|
17
|
+
var InvalidErrorCodeRangeError = class extends ApplicationError {
|
|
18
|
+
constructor(code, expectedRange) {
|
|
19
|
+
super("errors.invalidErrorCodeRange", ERROR_CODES.SYSTEM.INVALID_ERROR_CODE_RANGE, {
|
|
20
|
+
code,
|
|
21
|
+
expectedRange
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
//#endregion
|
|
26
|
+
//#region src/database/errors/database-error.ts
|
|
27
|
+
/**
|
|
28
|
+
* DatabaseError
|
|
29
|
+
*
|
|
30
|
+
* Generic database error thrown when a database operation fails
|
|
31
|
+
* and doesn't fit into a more specific error category.
|
|
32
|
+
*
|
|
33
|
+
* This is the base class for all database-related errors.
|
|
34
|
+
*/
|
|
35
|
+
var DatabaseError = class extends ApplicationError {
|
|
36
|
+
constructor(messageKey = "errors.databaseGeneric", code = ERROR_CODES.DATABASE.GENERIC, metadata) {
|
|
37
|
+
if (code < 2e3 || code >= 3e3) throw new InvalidErrorCodeRangeError(code, "2000-2999");
|
|
38
|
+
super(messageKey, code, metadata);
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
//#endregion
|
|
42
|
+
//#region src/database/errors/database-config.error.ts
|
|
43
|
+
var DatabaseConfigError = class extends DatabaseError {
|
|
44
|
+
constructor(details) {
|
|
45
|
+
super("errors.databaseGeneric", ERROR_CODES.DATABASE.GENERIC, { details });
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
//#endregion
|
|
49
|
+
//#region src/database/errors/foreign-key-constraint.error.ts
|
|
50
|
+
/**
|
|
51
|
+
* ForeignKeyConstraintError
|
|
52
|
+
*
|
|
53
|
+
* Thrown when a database foreign key constraint is violated.
|
|
54
|
+
* This typically occurs when:
|
|
55
|
+
* - Trying to insert a record with a foreign key that doesn't exist
|
|
56
|
+
* - Trying to delete a record that is referenced by other records
|
|
57
|
+
* - Trying to update a foreign key to a non-existent value
|
|
58
|
+
*/
|
|
59
|
+
var ForeignKeyConstraintError = class extends DatabaseError {
|
|
60
|
+
constructor(field) {
|
|
61
|
+
super("errors.databaseForeignKeyConstraint", ERROR_CODES.DATABASE.FOREIGN_KEY_CONSTRAINT, { field });
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
//#endregion
|
|
65
|
+
//#region src/database/errors/record-not-found.error.ts
|
|
66
|
+
/**
|
|
67
|
+
* RecordNotFoundError
|
|
68
|
+
*
|
|
69
|
+
* Generic error thrown when a database record is not found.
|
|
70
|
+
* This is typically thrown when a findUnique or findFirst operation
|
|
71
|
+
* returns null, or when a required record doesn't exist.
|
|
72
|
+
*
|
|
73
|
+
* Services should catch this and optionally refine it to a more specific
|
|
74
|
+
* domain error (e.g., NoteNotFoundError, UserNotFoundError).
|
|
75
|
+
*/
|
|
76
|
+
var RecordNotFoundError = class extends DatabaseError {
|
|
77
|
+
constructor(details) {
|
|
78
|
+
super("errors.databaseRecordNotFound", ERROR_CODES.DATABASE.RECORD_NOT_FOUND, { details });
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
//#endregion
|
|
82
|
+
//#region src/database/errors/unique-constraint.error.ts
|
|
83
|
+
/**
|
|
84
|
+
* UniqueConstraintError
|
|
85
|
+
*
|
|
86
|
+
* Thrown when a database unique constraint is violated.
|
|
87
|
+
* This typically occurs when trying to insert or update a record
|
|
88
|
+
* with a value that already exists in a unique column.
|
|
89
|
+
*
|
|
90
|
+
* Services should catch this and optionally refine it to a more specific
|
|
91
|
+
* domain error (e.g., UserEmailAlreadyExistsError).
|
|
92
|
+
*/
|
|
93
|
+
var UniqueConstraintError = class extends DatabaseError {
|
|
94
|
+
constructor(fields) {
|
|
95
|
+
super("errors.databaseUniqueConstraint", ERROR_CODES.DATABASE.UNIQUE_CONSTRAINT, { fields });
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
//#endregion
|
|
99
|
+
//#region src/database/errors/from-zenstack-error.ts
|
|
100
|
+
/**
|
|
101
|
+
* Transform ZenStack ORM errors into ApplicationError instances
|
|
102
|
+
*
|
|
103
|
+
* This function maps ORMError codes to generic database error classes.
|
|
104
|
+
* Services can catch these generic errors and optionally refine them to
|
|
105
|
+
* more specific domain errors if needed.
|
|
106
|
+
*
|
|
107
|
+
* @param error - The error thrown by ZenStack ORM
|
|
108
|
+
* @returns An ApplicationError instance
|
|
109
|
+
*
|
|
110
|
+
* @example
|
|
111
|
+
* ```typescript
|
|
112
|
+
* try {
|
|
113
|
+
* await db.user.create({ data: { email: 'existing@example.com' } })
|
|
114
|
+
* } catch (error) {
|
|
115
|
+
* throw fromZenStackError(error) // Becomes UniqueConstraintError or other
|
|
116
|
+
* }
|
|
117
|
+
* ```
|
|
118
|
+
*/
|
|
119
|
+
function fromZenStackError(error) {
|
|
120
|
+
if (error instanceof ORMError) {
|
|
121
|
+
const ormError = error;
|
|
122
|
+
switch (ormError.reason) {
|
|
123
|
+
case ORMErrorReason.NOT_FOUND: return new RecordNotFoundError(ormError.model);
|
|
124
|
+
case ORMErrorReason.DB_QUERY_ERROR: return parseDatabaseError(ormError);
|
|
125
|
+
case ORMErrorReason.INVALID_INPUT: return new DatabaseError("errors.databaseInvalidQuery", ERROR_CODES.DATABASE.GENERIC, { message: ormError.message });
|
|
126
|
+
case ORMErrorReason.CONFIG_ERROR: return new DatabaseError("errors.databaseConnectionFailed", ERROR_CODES.DATABASE.CONNECTION_FAILED, { message: ormError.message });
|
|
127
|
+
case ORMErrorReason.NOT_SUPPORTED: return new DatabaseError("errors.databaseGeneric", ERROR_CODES.DATABASE.GENERIC, {
|
|
128
|
+
message: ormError.message,
|
|
129
|
+
reason: "Operation not supported"
|
|
130
|
+
});
|
|
131
|
+
case ORMErrorReason.INTERNAL_ERROR: return new DatabaseError("errors.databaseGeneric", ERROR_CODES.DATABASE.GENERIC, { message: ormError.message });
|
|
132
|
+
default: return new DatabaseError("errors.databaseGeneric", ERROR_CODES.DATABASE.GENERIC, {
|
|
133
|
+
message: ormError.message,
|
|
134
|
+
reason: ormError.reason
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return new DatabaseError("errors.databaseGeneric", ERROR_CODES.DATABASE.GENERIC, { originalError: String(error) });
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Parse database-specific errors from the dbErrorCode field
|
|
142
|
+
*/
|
|
143
|
+
function parseDatabaseError(error) {
|
|
144
|
+
const dbErrorCode = error.dbErrorCode;
|
|
145
|
+
if (dbErrorCode) {
|
|
146
|
+
if (dbErrorCode === "23505") return new UniqueConstraintError([error.model ?? "unknown"]);
|
|
147
|
+
if (dbErrorCode === "23503") return new ForeignKeyConstraintError(error.model ?? "unknown");
|
|
148
|
+
if (dbErrorCode === "23502") return new DatabaseError("errors.databaseNullConstraint", ERROR_CODES.DATABASE.NULL_CONSTRAINT, {
|
|
149
|
+
dbErrorCode,
|
|
150
|
+
message: error.dbErrorMessage
|
|
151
|
+
});
|
|
152
|
+
if (dbErrorCode === "23514") return new DatabaseError("errors.databaseConstraintFailed", ERROR_CODES.DATABASE.GENERIC, {
|
|
153
|
+
dbErrorCode,
|
|
154
|
+
message: error.dbErrorMessage
|
|
155
|
+
});
|
|
156
|
+
if (dbErrorCode.startsWith("42")) {
|
|
157
|
+
if (dbErrorCode === "42P01") return new DatabaseError("errors.databaseTableNotFound", ERROR_CODES.DATABASE.GENERIC, {
|
|
158
|
+
dbErrorCode,
|
|
159
|
+
message: error.dbErrorMessage
|
|
160
|
+
});
|
|
161
|
+
if (dbErrorCode === "42703") return new DatabaseError("errors.databaseColumnNotFound", ERROR_CODES.DATABASE.GENERIC, {
|
|
162
|
+
dbErrorCode,
|
|
163
|
+
message: error.dbErrorMessage
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
if (dbErrorCode.startsWith("08")) return new DatabaseError("errors.databaseConnectionFailed", ERROR_CODES.DATABASE.CONNECTION_FAILED, {
|
|
167
|
+
dbErrorCode,
|
|
168
|
+
message: error.dbErrorMessage
|
|
169
|
+
});
|
|
170
|
+
if (dbErrorCode === "57014") return new DatabaseError("errors.databaseTimeout", ERROR_CODES.DATABASE.TIMEOUT, {
|
|
171
|
+
dbErrorCode,
|
|
172
|
+
message: error.dbErrorMessage
|
|
173
|
+
});
|
|
174
|
+
if (dbErrorCode.startsWith("40")) return new DatabaseError("errors.databaseTransactionConflict", ERROR_CODES.DATABASE.TRANSACTION_CONFLICT, {
|
|
175
|
+
dbErrorCode,
|
|
176
|
+
message: error.dbErrorMessage
|
|
177
|
+
});
|
|
178
|
+
if (dbErrorCode === "53300") return new DatabaseError("errors.databaseTooManyConnections", ERROR_CODES.DATABASE.TOO_MANY_CONNECTIONS, {
|
|
179
|
+
dbErrorCode,
|
|
180
|
+
message: error.dbErrorMessage
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
return new DatabaseError("errors.databaseGeneric", ERROR_CODES.DATABASE.GENERIC, {
|
|
184
|
+
dbErrorCode,
|
|
185
|
+
dbErrorMessage: error.dbErrorMessage,
|
|
186
|
+
sql: error.sql
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
//#endregion
|
|
190
|
+
//#region src/database/plugins/error-handler.plugin.ts
|
|
191
|
+
/**
|
|
192
|
+
* ZenStack runtime plugin that transforms ORM errors into ApplicationError instances.
|
|
193
|
+
*
|
|
194
|
+
* @example
|
|
195
|
+
* ```typescript
|
|
196
|
+
* super(schema, {
|
|
197
|
+
* dialect: new PostgresDialect({ pool }),
|
|
198
|
+
* plugins: [new ErrorHandlerPlugin()]
|
|
199
|
+
* })
|
|
200
|
+
* ```
|
|
201
|
+
*/
|
|
202
|
+
var ErrorHandlerPlugin = class {
|
|
203
|
+
id = "error-handler";
|
|
204
|
+
onQuery = async ({ args, proceed }) => {
|
|
205
|
+
try {
|
|
206
|
+
return await proceed(args);
|
|
207
|
+
} catch (error) {
|
|
208
|
+
throw fromZenStackError(error);
|
|
209
|
+
}
|
|
210
|
+
};
|
|
211
|
+
};
|
|
212
|
+
//#endregion
|
|
213
|
+
//#region src/database/plugins/event-emitter.plugin.ts
|
|
214
|
+
/**
|
|
215
|
+
* ZenStack runtime plugin that emits before/after events for database operations.
|
|
216
|
+
*
|
|
217
|
+
* Emits events in the format:
|
|
218
|
+
* - `before.{Model}.{operation}` - Before the database operation
|
|
219
|
+
* - `after.{Model}.{operation}` - After the database operation
|
|
220
|
+
*
|
|
221
|
+
* @example
|
|
222
|
+
* ```typescript
|
|
223
|
+
* super(schema, {
|
|
224
|
+
* dialect: new PostgresDialect({ pool }),
|
|
225
|
+
* plugins: [
|
|
226
|
+
* new EventEmitterPlugin({
|
|
227
|
+
* eventRegistry,
|
|
228
|
+
* })
|
|
229
|
+
* ]
|
|
230
|
+
* })
|
|
231
|
+
* ```
|
|
232
|
+
*/
|
|
233
|
+
var EventEmitterPlugin = class {
|
|
234
|
+
id = "event-emitter";
|
|
235
|
+
constructor(options) {
|
|
236
|
+
this.options = options;
|
|
237
|
+
}
|
|
238
|
+
onQuery = async ({ model, operation, args, proceed }) => {
|
|
239
|
+
const { eventRegistry } = this.options;
|
|
240
|
+
const eventBase = `${model}.${operation}`;
|
|
241
|
+
await eventRegistry.emit(`before.${eventBase}`, { data: args });
|
|
242
|
+
const result = await proceed(args);
|
|
243
|
+
await eventRegistry.emit(`after.${eventBase}`, {
|
|
244
|
+
data: args,
|
|
245
|
+
result
|
|
246
|
+
});
|
|
247
|
+
return result;
|
|
248
|
+
};
|
|
249
|
+
};
|
|
250
|
+
//#endregion
|
|
251
|
+
//#region src/database/plugins/schema-switcher.plugin.ts
|
|
252
|
+
/**
|
|
253
|
+
* ZenStack runtime plugin that sets PostgreSQL search_path before each query.
|
|
254
|
+
* Used for tenant isolation in multi-tenant applications.
|
|
255
|
+
*
|
|
256
|
+
* @example
|
|
257
|
+
* ```typescript
|
|
258
|
+
* super(schema, {
|
|
259
|
+
* dialect: new PostgresDialect({ pool }),
|
|
260
|
+
* plugins: [
|
|
261
|
+
* new SchemaSwitcherPlugin({ schemaName: `tenant_${tenantId}` })
|
|
262
|
+
* ]
|
|
263
|
+
* })
|
|
264
|
+
* ```
|
|
265
|
+
*/
|
|
266
|
+
var SchemaSwitcherPlugin = class {
|
|
267
|
+
id = "schema-switcher";
|
|
268
|
+
constructor(options) {
|
|
269
|
+
this.options = options;
|
|
270
|
+
}
|
|
271
|
+
onQuery = async ({ args, proceed, client }) => {
|
|
272
|
+
await client.$executeRawUnsafe(`SET search_path TO "${this.options.schemaName}"`);
|
|
273
|
+
return proceed(args);
|
|
274
|
+
};
|
|
275
|
+
};
|
|
276
|
+
//#endregion
|
|
277
|
+
//#region src/database/database.helpers.ts
|
|
278
|
+
const databaseConnectionSchema = z.object({
|
|
279
|
+
name: z.string().min(1, withI18n("database.connectionNameRequired")),
|
|
280
|
+
schema: z.object({}).loose(),
|
|
281
|
+
dialect: z.function(),
|
|
282
|
+
plugins: z.array(z.object({}).loose()).optional()
|
|
283
|
+
});
|
|
284
|
+
z.object({
|
|
285
|
+
default: z.string().min(1, withI18n("database.defaultConnectionRequired")),
|
|
286
|
+
connections: z.array(databaseConnectionSchema).min(1, withI18n("database.connectionRequired"))
|
|
287
|
+
}).refine((config) => {
|
|
288
|
+
const names = config.connections.map((c) => c.name);
|
|
289
|
+
return new Set(names).size === names.length;
|
|
290
|
+
}, withI18n("database.duplicateConnections")).refine((config) => config.connections.some((c) => c.name === config.default), withI18n("database.defaultConnectionNotFound"));
|
|
291
|
+
function createDatabaseService(conn, eventRegistry) {
|
|
292
|
+
const plugins = [
|
|
293
|
+
new ErrorHandlerPlugin(),
|
|
294
|
+
new EventEmitterPlugin({ eventRegistry }),
|
|
295
|
+
...conn.plugins ?? []
|
|
296
|
+
];
|
|
297
|
+
let DatabaseClient = class DatabaseClient extends ZenStackClient {
|
|
298
|
+
constructor() {
|
|
299
|
+
const dialect = conn.dialect();
|
|
300
|
+
super(conn.schema, {
|
|
301
|
+
dialect,
|
|
302
|
+
plugins
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
};
|
|
306
|
+
DatabaseClient = __decorate([Transient(), __decorateMetadata("design:paramtypes", [])], DatabaseClient);
|
|
307
|
+
return DatabaseClient;
|
|
308
|
+
}
|
|
309
|
+
//#endregion
|
|
310
|
+
//#region src/database/database.tokens.ts
|
|
311
|
+
const DATABASE_TOKENS = {
|
|
312
|
+
Options: Symbol.for("stratal:database:options"),
|
|
313
|
+
Services: Symbol.for("stratal:database:services")
|
|
314
|
+
};
|
|
315
|
+
function connectionSymbol(name) {
|
|
316
|
+
return Symbol.for(`stratal:database:connection:${name}`);
|
|
317
|
+
}
|
|
318
|
+
//#endregion
|
|
319
|
+
//#region src/database/database.module.ts
|
|
320
|
+
var _DatabaseModule;
|
|
321
|
+
let DatabaseModule = _DatabaseModule = class DatabaseModule {
|
|
322
|
+
static forRoot(config) {
|
|
323
|
+
return {
|
|
324
|
+
module: _DatabaseModule,
|
|
325
|
+
providers: [{
|
|
326
|
+
provide: DATABASE_TOKENS.Options,
|
|
327
|
+
useValue: config
|
|
328
|
+
}]
|
|
329
|
+
};
|
|
330
|
+
}
|
|
331
|
+
static forRootAsync(options) {
|
|
332
|
+
return {
|
|
333
|
+
module: _DatabaseModule,
|
|
334
|
+
providers: [{
|
|
335
|
+
provide: DATABASE_TOKENS.Options,
|
|
336
|
+
useFactory: options.useFactory,
|
|
337
|
+
inject: options.inject
|
|
338
|
+
}]
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
onInitialize(context) {
|
|
342
|
+
const config = context.container.resolve(DATABASE_TOKENS.Options);
|
|
343
|
+
const eventRegistry = context.container.resolve(DI_TOKENS.EventRegistry);
|
|
344
|
+
const container = context.container.getTsyringeContainer();
|
|
345
|
+
for (const conn of config.connections) {
|
|
346
|
+
const Service = createDatabaseService(conn, eventRegistry);
|
|
347
|
+
container.register(connectionSymbol(conn.name), delay(() => Service), { lifecycle: Scope.Request });
|
|
348
|
+
}
|
|
349
|
+
context.container.registerExisting(DI_TOKENS.Database, connectionSymbol(config.default));
|
|
350
|
+
context.logger.info("DatabaseModule initialized");
|
|
351
|
+
}
|
|
352
|
+
onShutdown(context) {
|
|
353
|
+
context.logger.info("DatabaseModule shutdown");
|
|
354
|
+
}
|
|
355
|
+
};
|
|
356
|
+
DatabaseModule = _DatabaseModule = __decorate([Module({})], DatabaseModule);
|
|
357
|
+
//#endregion
|
|
358
|
+
//#region src/database/decorators/inject-db.decorator.ts
|
|
359
|
+
function InjectDB(name) {
|
|
360
|
+
return inject(connectionSymbol(name));
|
|
361
|
+
}
|
|
362
|
+
//#endregion
|
|
363
|
+
//#region src/database/i18n/en.ts
|
|
364
|
+
const databaseI18n = { database: {
|
|
365
|
+
connectionNameRequired: "Connection name is required",
|
|
366
|
+
defaultConnectionRequired: "Default connection name is required",
|
|
367
|
+
connectionRequired: "At least one connection is required",
|
|
368
|
+
duplicateConnections: "Duplicate connection names found",
|
|
369
|
+
defaultConnectionNotFound: "Default connection not found in connections"
|
|
370
|
+
} };
|
|
371
|
+
//#endregion
|
|
372
|
+
export { DATABASE_TOKENS, DatabaseConfigError, DatabaseError, DatabaseModule, ErrorHandlerPlugin, EventEmitterPlugin, ForeignKeyConstraintError, InjectDB, InvalidErrorCodeRangeError, RecordNotFoundError, SchemaSwitcherPlugin, UniqueConstraintError, connectionSymbol, databaseI18n, fromZenStackError };
|
|
373
|
+
|
|
374
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../../src/database/errors/invalid-error-code-range.error.ts","../../src/database/errors/database-error.ts","../../src/database/errors/database-config.error.ts","../../src/database/errors/foreign-key-constraint.error.ts","../../src/database/errors/record-not-found.error.ts","../../src/database/errors/unique-constraint.error.ts","../../src/database/errors/from-zenstack-error.ts","../../src/database/plugins/error-handler.plugin.ts","../../src/database/plugins/event-emitter.plugin.ts","../../src/database/plugins/schema-switcher.plugin.ts","../../src/database/database.helpers.ts","../../src/database/database.tokens.ts","../../src/database/database.module.ts","../../src/database/decorators/inject-db.decorator.ts","../../src/database/i18n/en.ts"],"sourcesContent":["import { ApplicationError, ERROR_CODES } from 'stratal/errors'\n\n/**\n * InvalidErrorCodeRangeError\n *\n * Thrown when a DatabaseError subclass is constructed with an error code\n * outside the valid database error range (2000-2999).\n * This is a developer-facing error to enforce error code conventions.\n */\nexport class InvalidErrorCodeRangeError extends ApplicationError {\n constructor(code: number, expectedRange: string) {\n super(\n 'errors.invalidErrorCodeRange',\n ERROR_CODES.SYSTEM.INVALID_ERROR_CODE_RANGE,\n { code, expectedRange }\n )\n }\n}\n","import type { MessageKeys } from 'stratal/i18n'\nimport { ApplicationError, ERROR_CODES, type ErrorCode } from 'stratal/errors'\nimport { InvalidErrorCodeRangeError } from './invalid-error-code-range.error'\n\n/**\n * DatabaseError\n *\n * Generic database error thrown when a database operation fails\n * and doesn't fit into a more specific error category.\n *\n * This is the base class for all database-related errors.\n */\nexport class DatabaseError extends ApplicationError {\n constructor(\n messageKey: MessageKeys = 'errors.databaseGeneric',\n code: ErrorCode = ERROR_CODES.DATABASE.GENERIC,\n metadata?: Record<string, unknown>\n ) {\n // Validate that code is in the database error range\n if (code < 2000 || code >= 3000) {\n throw new InvalidErrorCodeRangeError(code, '2000-2999')\n }\n\n super(messageKey, code, metadata)\n }\n}\n","import { ERROR_CODES } from 'stratal/errors'\nimport { DatabaseError } from './database-error'\n\nexport class DatabaseConfigError extends DatabaseError {\n constructor(details: string) {\n super('errors.databaseGeneric', ERROR_CODES.DATABASE.GENERIC, { details })\n }\n}\n","import { ERROR_CODES } from 'stratal/errors'\nimport { DatabaseError } from './database-error'\n\n/**\n * ForeignKeyConstraintError\n *\n * Thrown when a database foreign key constraint is violated.\n * This typically occurs when:\n * - Trying to insert a record with a foreign key that doesn't exist\n * - Trying to delete a record that is referenced by other records\n * - Trying to update a foreign key to a non-existent value\n */\nexport class ForeignKeyConstraintError extends DatabaseError {\n constructor(field?: string) {\n super('errors.databaseForeignKeyConstraint', ERROR_CODES.DATABASE.FOREIGN_KEY_CONSTRAINT, {\n field,\n })\n }\n}\n","import { ERROR_CODES } from 'stratal/errors'\nimport { DatabaseError } from './database-error'\n\n/**\n * RecordNotFoundError\n *\n * Generic error thrown when a database record is not found.\n * This is typically thrown when a findUnique or findFirst operation\n * returns null, or when a required record doesn't exist.\n *\n * Services should catch this and optionally refine it to a more specific\n * domain error (e.g., NoteNotFoundError, UserNotFoundError).\n */\nexport class RecordNotFoundError extends DatabaseError {\n constructor(details?: string) {\n super('errors.databaseRecordNotFound', ERROR_CODES.DATABASE.RECORD_NOT_FOUND, {\n details,\n })\n }\n}\n","import { ERROR_CODES } from 'stratal/errors'\nimport { DatabaseError } from './database-error'\n\n/**\n * UniqueConstraintError\n *\n * Thrown when a database unique constraint is violated.\n * This typically occurs when trying to insert or update a record\n * with a value that already exists in a unique column.\n *\n * Services should catch this and optionally refine it to a more specific\n * domain error (e.g., UserEmailAlreadyExistsError).\n */\nexport class UniqueConstraintError extends DatabaseError {\n constructor(fields?: string[]) {\n super('errors.databaseUniqueConstraint', ERROR_CODES.DATABASE.UNIQUE_CONSTRAINT, {\n fields,\n })\n }\n}\n","import { ORMError, ORMErrorReason } from '@zenstackhq/orm'\nimport { ERROR_CODES } from 'stratal/errors'\nimport { DatabaseError } from './database-error'\nimport { ForeignKeyConstraintError } from './foreign-key-constraint.error'\nimport { RecordNotFoundError } from './record-not-found.error'\nimport { UniqueConstraintError } from './unique-constraint.error'\n\n/**\n * Transform ZenStack ORM errors into ApplicationError instances\n *\n * This function maps ORMError codes to generic database error classes.\n * Services can catch these generic errors and optionally refine them to\n * more specific domain errors if needed.\n *\n * @param error - The error thrown by ZenStack ORM\n * @returns An ApplicationError instance\n *\n * @example\n * ```typescript\n * try {\n * await db.user.create({ data: { email: 'existing@example.com' } })\n * } catch (error) {\n * throw fromZenStackError(error) // Becomes UniqueConstraintError or other\n * }\n * ```\n */\nexport function fromZenStackError(error: unknown): DatabaseError {\n // Handle ZenStack ORM Errors\n if (error instanceof ORMError) {\n const ormError = error\n\n switch (ormError.reason) {\n case ORMErrorReason.NOT_FOUND:\n return new RecordNotFoundError(ormError.model)\n\n case ORMErrorReason.DB_QUERY_ERROR:\n // Parse database-specific error codes\n return parseDatabaseError(ormError)\n\n case ORMErrorReason.INVALID_INPUT:\n return new DatabaseError(\n 'errors.databaseInvalidQuery',\n ERROR_CODES.DATABASE.GENERIC,\n { message: ormError.message }\n )\n\n case ORMErrorReason.CONFIG_ERROR:\n return new DatabaseError(\n 'errors.databaseConnectionFailed',\n ERROR_CODES.DATABASE.CONNECTION_FAILED,\n { message: ormError.message }\n )\n\n case ORMErrorReason.NOT_SUPPORTED:\n return new DatabaseError(\n 'errors.databaseGeneric',\n ERROR_CODES.DATABASE.GENERIC,\n { message: ormError.message, reason: 'Operation not supported' }\n )\n\n case ORMErrorReason.INTERNAL_ERROR:\n return new DatabaseError(\n 'errors.databaseGeneric',\n ERROR_CODES.DATABASE.GENERIC,\n { message: ormError.message }\n )\n\n default:\n return new DatabaseError(\n 'errors.databaseGeneric',\n ERROR_CODES.DATABASE.GENERIC,\n { message: ormError.message, reason: ormError.reason }\n )\n }\n }\n\n // Handle unknown errors\n return new DatabaseError(\n 'errors.databaseGeneric',\n ERROR_CODES.DATABASE.GENERIC,\n { originalError: String(error) }\n )\n}\n\n/**\n * Parse database-specific errors from the dbErrorCode field\n */\nfunction parseDatabaseError(error: ORMError): DatabaseError {\n // Cast dbErrorCode to string since ZenStack types it loosely\n const dbErrorCode = error.dbErrorCode as string | undefined\n\n // PostgreSQL error codes\n // https://www.postgresql.org/docs/current/errcodes-appendix.html\n if (dbErrorCode) {\n // Class 23 - Integrity Constraint Violation\n if (dbErrorCode === '23505') {\n // Unique violation\n return new UniqueConstraintError([error.model ?? 'unknown'])\n }\n\n if (dbErrorCode === '23503') {\n // Foreign key violation\n return new ForeignKeyConstraintError(error.model ?? 'unknown')\n }\n\n if (dbErrorCode === '23502') {\n // Not null violation\n return new DatabaseError(\n 'errors.databaseNullConstraint',\n ERROR_CODES.DATABASE.NULL_CONSTRAINT,\n { dbErrorCode, message: error.dbErrorMessage }\n )\n }\n\n if (dbErrorCode === '23514') {\n // Check constraint violation\n return new DatabaseError(\n 'errors.databaseConstraintFailed',\n ERROR_CODES.DATABASE.GENERIC,\n { dbErrorCode, message: error.dbErrorMessage }\n )\n }\n\n // Class 42 - Syntax Error or Access Rule Violation\n if (dbErrorCode.startsWith('42')) {\n if (dbErrorCode === '42P01') {\n // Undefined table\n return new DatabaseError(\n 'errors.databaseTableNotFound',\n ERROR_CODES.DATABASE.GENERIC,\n { dbErrorCode, message: error.dbErrorMessage }\n )\n }\n\n if (dbErrorCode === '42703') {\n // Undefined column\n return new DatabaseError(\n 'errors.databaseColumnNotFound',\n ERROR_CODES.DATABASE.GENERIC,\n { dbErrorCode, message: error.dbErrorMessage }\n )\n }\n }\n\n // Class 08 - Connection Exception\n if (dbErrorCode.startsWith('08')) {\n return new DatabaseError(\n 'errors.databaseConnectionFailed',\n ERROR_CODES.DATABASE.CONNECTION_FAILED,\n { dbErrorCode, message: error.dbErrorMessage }\n )\n }\n\n // Class 57 - Operator Intervention\n if (dbErrorCode === '57014') {\n // Query cancelled\n return new DatabaseError(\n 'errors.databaseTimeout',\n ERROR_CODES.DATABASE.TIMEOUT,\n { dbErrorCode, message: error.dbErrorMessage }\n )\n }\n\n // Class 40 - Transaction Rollback\n if (dbErrorCode.startsWith('40')) {\n return new DatabaseError(\n 'errors.databaseTransactionConflict',\n ERROR_CODES.DATABASE.TRANSACTION_CONFLICT,\n { dbErrorCode, message: error.dbErrorMessage }\n )\n }\n\n // Class 53 - Insufficient Resources\n if (dbErrorCode === '53300') {\n // Too many connections\n return new DatabaseError(\n 'errors.databaseTooManyConnections',\n ERROR_CODES.DATABASE.TOO_MANY_CONNECTIONS,\n { dbErrorCode, message: error.dbErrorMessage }\n )\n }\n }\n\n // Default database error\n return new DatabaseError(\n 'errors.databaseGeneric',\n ERROR_CODES.DATABASE.GENERIC,\n {\n dbErrorCode,\n dbErrorMessage: error.dbErrorMessage,\n sql: error.sql,\n }\n )\n}\n","import { type RuntimePlugin } from '@zenstackhq/orm'\nimport { type SchemaDef } from '@zenstackhq/orm/schema'\nimport { fromZenStackError } from '../errors'\n\n/**\n * ZenStack runtime plugin that transforms ORM errors into ApplicationError instances.\n *\n * @example\n * ```typescript\n * super(schema, {\n * dialect: new PostgresDialect({ pool }),\n * plugins: [new ErrorHandlerPlugin()]\n * })\n * ```\n */\nexport class ErrorHandlerPlugin implements RuntimePlugin<SchemaDef, Record<string, unknown>, Record<string, unknown>> {\n readonly id = 'error-handler'\n\n onQuery = async ({ args, proceed }: {\n args: Record<string, unknown> | undefined\n proceed: (args: Record<string, unknown> | undefined) => Promise<unknown>\n }): Promise<unknown> => {\n try {\n return await proceed(args)\n } catch (error) {\n throw fromZenStackError(error)\n }\n }\n}\n","import { type RuntimePlugin } from '@zenstackhq/orm'\nimport { type SchemaDef } from '@zenstackhq/orm/schema'\nimport type { EventName, IEventRegistry } from 'stratal/events'\n\nexport interface EventEmitterPluginOptions {\n eventRegistry: IEventRegistry\n}\n\n/**\n * ZenStack runtime plugin that emits before/after events for database operations.\n *\n * Emits events in the format:\n * - `before.{Model}.{operation}` - Before the database operation\n * - `after.{Model}.{operation}` - After the database operation\n *\n * @example\n * ```typescript\n * super(schema, {\n * dialect: new PostgresDialect({ pool }),\n * plugins: [\n * new EventEmitterPlugin({\n * eventRegistry,\n * })\n * ]\n * })\n * ```\n */\nexport class EventEmitterPlugin implements RuntimePlugin<SchemaDef, Record<string, unknown>, Record<string, unknown>> {\n readonly id = 'event-emitter'\n\n constructor(private options: EventEmitterPluginOptions) { }\n\n onQuery = async ({ model, operation, args, proceed }: {\n model: string\n operation: string\n args: Record<string, unknown> | undefined\n proceed: (args: Record<string, unknown> | undefined) => Promise<unknown>\n }): Promise<unknown> => {\n const { eventRegistry } = this.options\n const eventBase = `${model}.${operation}`\n\n // Emit BEFORE event\n await eventRegistry.emit(`before.${eventBase}` as EventName, {\n data: args,\n })\n\n // Execute the actual database operation\n const result = await proceed(args)\n\n // Emit AFTER event\n await eventRegistry.emit(`after.${eventBase}` as EventName, {\n data: args,\n result,\n })\n\n return result\n }\n}\n","import { type RuntimePlugin } from \"@zenstackhq/orm\"\nimport { type SchemaDef } from \"@zenstackhq/orm/schema\"\n\nexport interface SchemaSwitcherPluginOptions {\n schemaName: string\n}\n\n/**\n * ZenStack runtime plugin that sets PostgreSQL search_path before each query.\n * Used for tenant isolation in multi-tenant applications.\n *\n * @example\n * ```typescript\n * super(schema, {\n * dialect: new PostgresDialect({ pool }),\n * plugins: [\n * new SchemaSwitcherPlugin({ schemaName: `tenant_${tenantId}` })\n * ]\n * })\n * ```\n */\nexport class SchemaSwitcherPlugin implements RuntimePlugin<SchemaDef, Record<string, unknown>, Record<string, unknown>> {\n readonly id = 'schema-switcher'\n\n constructor(private options: SchemaSwitcherPluginOptions) { }\n\n onQuery = async ({ args, proceed, client }: {\n args: Record<string, unknown> | undefined\n proceed: (args: Record<string, unknown> | undefined) => Promise<unknown>\n client: { $executeRawUnsafe: (sql: string) => Promise<unknown> }\n }): Promise<unknown> => {\n // Set search_path before each query\n await client.$executeRawUnsafe(`SET search_path TO \"${this.options.schemaName}\"`)\n return proceed(args)\n }\n}\n","import { ZenStackClient, type AnyPlugin } from '@zenstackhq/orm'\nimport { Transient } from 'stratal/di'\nimport type { IEventRegistry } from 'stratal/events'\nimport { withI18n, z } from 'stratal/validation'\nimport type { DatabaseConnectionConfig } from './database.module'\nimport { ErrorHandlerPlugin, EventEmitterPlugin } from './plugins'\n\nconst databaseConnectionSchema = z.object({\n name: z.string().min(1, withI18n('database.connectionNameRequired')),\n schema: z.object({}).loose(),\n dialect: z.function(),\n plugins: z.array(z.object({}).loose()).optional(),\n})\n\nexport const databaseModuleConfigSchema = z.object({\n default: z.string().min(1, withI18n('database.defaultConnectionRequired')),\n connections: z.array(databaseConnectionSchema).min(1, withI18n('database.connectionRequired')),\n}).refine(\n (config) => {\n const names = config.connections.map(c => c.name)\n return new Set(names).size === names.length\n },\n withI18n('database.duplicateConnections')\n).refine(\n (config) => config.connections.some(c => c.name === config.default),\n withI18n('database.defaultConnectionNotFound')\n)\n\nexport function createDatabaseService(\n conn: DatabaseConnectionConfig,\n eventRegistry: IEventRegistry,\n): new () => InstanceType<typeof ZenStackClient> {\n const plugins: AnyPlugin[] = [\n new ErrorHandlerPlugin(),\n new EventEmitterPlugin({\n eventRegistry,\n }),\n ...(conn.plugins ?? []),\n ]\n\n @Transient()\n class DatabaseClient extends ZenStackClient<typeof conn.schema> {\n constructor() {\n const dialect = conn.dialect()\n super(conn.schema, { dialect, plugins })\n }\n }\n\n return DatabaseClient\n}\n","export const DATABASE_TOKENS = {\n Options: Symbol.for('stratal:database:options'),\n Services: Symbol.for('stratal:database:services'),\n} as const\n\nimport type { ConnectionName } from './types'\n\nexport function connectionSymbol(name: ConnectionName): symbol {\n return Symbol.for(`stratal:database:connection:${name}`)\n}\n","import type { AnyPlugin } from '@zenstackhq/orm'\nimport type { SchemaDef } from '@zenstackhq/schema'\nimport type { Dialect } from 'kysely'\nimport { DI_TOKENS, Scope, delay } from 'stratal/di'\nimport type { IEventRegistry } from 'stratal/events'\nimport {\n InjectionToken,\n Module,\n type AsyncModuleOptions,\n type DynamicModule,\n type ModuleContext,\n type OnInitialize,\n type OnShutdown,\n} from 'stratal/module'\nimport { createDatabaseService } from './database.helpers'\nimport { DATABASE_TOKENS, connectionSymbol } from './database.tokens'\nimport type { ConnectionName, DefaultConnectionName } from './types'\n\nexport interface DatabaseConnectionConfig<\n Schema extends SchemaDef = SchemaDef,\n Name extends ConnectionName = ConnectionName,\n> {\n name: Name\n schema: Schema\n dialect: () => Dialect\n plugins?: AnyPlugin[]\n}\n\nexport interface DatabaseModuleConfig {\n default: DefaultConnectionName\n connections: DatabaseConnectionConfig[]\n}\n\n@Module({})\nexport class DatabaseModule implements OnInitialize, OnShutdown {\n static forRoot(config: DatabaseModuleConfig): DynamicModule {\n return {\n module: DatabaseModule,\n providers: [\n { provide: DATABASE_TOKENS.Options, useValue: config as unknown as object },\n ],\n }\n }\n\n static forRootAsync(options: AsyncModuleOptions<DatabaseModuleConfig>): DynamicModule {\n return {\n module: DatabaseModule,\n providers: [\n {\n provide: DATABASE_TOKENS.Options,\n useFactory: options.useFactory,\n inject: options.inject,\n },\n ],\n }\n }\n\n onInitialize(context: ModuleContext): void {\n const config = context.container.resolve<DatabaseModuleConfig>(DATABASE_TOKENS.Options)\n const eventRegistry = context.container.resolve<IEventRegistry>(DI_TOKENS.EventRegistry)\n const container = context.container.getTsyringeContainer();\n\n for (const conn of config.connections) {\n const Service = createDatabaseService(conn, eventRegistry)\n\n container.register(connectionSymbol(conn.name) as InjectionToken<symbol>,\n // @ts-expect-error Overload error\n delay(() => Service),\n { lifecycle: Scope.Request })\n }\n\n context.container.registerExisting(DI_TOKENS.Database, connectionSymbol(config.default))\n\n context.logger.info('DatabaseModule initialized')\n }\n\n onShutdown(context: ModuleContext): void {\n context.logger.info('DatabaseModule shutdown')\n }\n}\n","import { inject } from 'tsyringe'\nimport type { ConnectionName } from '../types'\nimport { connectionSymbol } from '../database.tokens'\n\nexport function InjectDB(name: ConnectionName): ParameterDecorator {\n return inject(connectionSymbol(name))\n}\n","export const databaseI18n = {\n database: {\n connectionNameRequired: 'Connection name is required',\n defaultConnectionRequired: 'Default connection name is required',\n connectionRequired: 'At least one connection is required',\n duplicateConnections: 'Duplicate connection names found',\n defaultConnectionNotFound: 'Default connection not found in connections',\n },\n} as const\n\ndeclare module 'stratal/i18n' {\n interface AppMessages {\n database: typeof databaseI18n['database']\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
//#region \0@oxc-project+runtime@0.115.0/helpers/decorate.js
|
|
2
|
+
function __decorate(decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
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;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
}
|
|
8
|
+
//#endregion
|
|
9
|
+
export { __decorate as t };
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
//#region \0@oxc-project+runtime@0.115.0/helpers/decorateMetadata.js
|
|
2
|
+
function __decorateMetadata(k, v) {
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
4
|
+
}
|
|
5
|
+
//#endregion
|
|
6
|
+
export { __decorateMetadata as t };
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { ApplicationError, ERROR_CODES } from "stratal/errors";
|
|
2
|
+
//#region src/context/errors/context-not-initialized.error.ts
|
|
3
|
+
var ContextNotInitializedError = class extends ApplicationError {
|
|
4
|
+
constructor(contextType = "Context") {
|
|
5
|
+
super("errors.contextNotInitialized", ERROR_CODES.AUTH.CONTEXT_NOT_INITIALIZED, { contextType });
|
|
6
|
+
}
|
|
7
|
+
};
|
|
8
|
+
//#endregion
|
|
9
|
+
//#region src/context/errors/user-not-authenticated.error.ts
|
|
10
|
+
var UserNotAuthenticatedError = class extends ApplicationError {
|
|
11
|
+
constructor() {
|
|
12
|
+
super("errors.userNotAuthenticated", ERROR_CODES.AUTH.USER_NOT_AUTHENTICATED);
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
//#endregion
|
|
16
|
+
//#region src/context/errors/user-not-authorized.error.ts
|
|
17
|
+
var UserNotAuthorizedError = class extends ApplicationError {
|
|
18
|
+
constructor() {
|
|
19
|
+
super("errors.unauthorized", ERROR_CODES.AUTHZ.FORBIDDEN);
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
//#endregion
|
|
23
|
+
export { UserNotAuthenticatedError as n, ContextNotInitializedError as r, UserNotAuthorizedError as t };
|
|
24
|
+
|
|
25
|
+
//# sourceMappingURL=errors-C_KIIU1v.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors-C_KIIU1v.mjs","names":[],"sources":["../src/context/errors/context-not-initialized.error.ts","../src/context/errors/user-not-authenticated.error.ts","../src/context/errors/user-not-authorized.error.ts"],"sourcesContent":["import { ApplicationError, ERROR_CODES } from 'stratal/errors'\n\nexport class ContextNotInitializedError extends ApplicationError {\n constructor(contextType = 'Context') {\n super(\n 'errors.contextNotInitialized',\n ERROR_CODES.AUTH.CONTEXT_NOT_INITIALIZED,\n { contextType }\n )\n }\n}\n","import { ApplicationError, ERROR_CODES } from 'stratal/errors'\n\nexport class UserNotAuthenticatedError extends ApplicationError {\n constructor() {\n super(\n 'errors.userNotAuthenticated',\n ERROR_CODES.AUTH.USER_NOT_AUTHENTICATED\n )\n }\n}\n","import { ApplicationError, ERROR_CODES } from 'stratal/errors'\n\nexport class UserNotAuthorizedError extends ApplicationError {\n constructor() {\n super(\n 'errors.unauthorized',\n ERROR_CODES.AUTHZ.FORBIDDEN\n )\n }\n}\n"],"mappings":";;AAEA,IAAa,6BAAb,cAAgD,iBAAiB;CAC/D,YAAY,cAAc,WAAW;AACnC,QACE,gCACA,YAAY,KAAK,yBACjB,EAAE,aAAa,CAChB;;;;;ACNL,IAAa,4BAAb,cAA+C,iBAAiB;CAC9D,cAAc;AACZ,QACE,+BACA,YAAY,KAAK,uBAClB;;;;;ACLL,IAAa,yBAAb,cAA4C,iBAAiB;CAC3D,cAAc;AACZ,QACE,uBACA,YAAY,MAAM,UACnB"}
|