@zudojs/tenancy 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +36 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/context/contextManager.core.d.ts +46 -0
- package/dist/context/contextManager.core.d.ts.map +1 -0
- package/dist/context/contextManager.core.js +76 -0
- package/dist/context/contextManager.core.js.map +1 -0
- package/dist/context/contextStorage.core.d.ts +24 -0
- package/dist/context/contextStorage.core.d.ts.map +1 -0
- package/dist/context/contextStorage.core.js +38 -0
- package/dist/context/contextStorage.core.js.map +1 -0
- package/dist/context/index.d.ts +8 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/index.js +8 -0
- package/dist/context/index.js.map +1 -0
- package/dist/http/httpHelpers.d.ts +46 -0
- package/dist/http/httpHelpers.d.ts.map +1 -0
- package/dist/http/httpHelpers.js +40 -0
- package/dist/http/httpHelpers.js.map +1 -0
- package/dist/http/httpTypes.d.ts +39 -0
- package/dist/http/httpTypes.d.ts.map +1 -0
- package/dist/http/httpTypes.js +9 -0
- package/dist/http/httpTypes.js.map +1 -0
- package/dist/http/index.d.ts +12 -0
- package/dist/http/index.d.ts.map +1 -0
- package/dist/http/index.js +9 -0
- package/dist/http/index.js.map +1 -0
- package/dist/http/tenancyMiddleware.core.d.ts +48 -0
- package/dist/http/tenancyMiddleware.core.d.ts.map +1 -0
- package/dist/http/tenancyMiddleware.core.js +93 -0
- package/dist/http/tenancyMiddleware.core.js.map +1 -0
- package/dist/http/tenancyMiddleware.guard.d.ts +27 -0
- package/dist/http/tenancyMiddleware.guard.d.ts.map +1 -0
- package/dist/http/tenancyMiddleware.guard.js +43 -0
- package/dist/http/tenancyMiddleware.guard.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/repository/index.d.ts +8 -0
- package/dist/repository/index.d.ts.map +1 -0
- package/dist/repository/index.js +8 -0
- package/dist/repository/index.js.map +1 -0
- package/dist/repository/repository.core.d.ts +27 -0
- package/dist/repository/repository.core.d.ts.map +1 -0
- package/dist/repository/repository.core.js +65 -0
- package/dist/repository/repository.core.js.map +1 -0
- package/dist/repository/tenantManager.core.d.ts +46 -0
- package/dist/repository/tenantManager.core.d.ts.map +1 -0
- package/dist/repository/tenantManager.core.js +74 -0
- package/dist/repository/tenantManager.core.js.map +1 -0
- package/dist/resolver/index.d.ts +8 -0
- package/dist/resolver/index.d.ts.map +1 -0
- package/dist/resolver/index.js +8 -0
- package/dist/resolver/index.js.map +1 -0
- package/dist/resolver/resolverChain.core.d.ts +16 -0
- package/dist/resolver/resolverChain.core.d.ts.map +1 -0
- package/dist/resolver/resolverChain.core.js +48 -0
- package/dist/resolver/resolverChain.core.js.map +1 -0
- package/dist/resolver/resolvers/headerResolver.core.d.ts +21 -0
- package/dist/resolver/resolvers/headerResolver.core.d.ts.map +1 -0
- package/dist/resolver/resolvers/headerResolver.core.js +28 -0
- package/dist/resolver/resolvers/headerResolver.core.js.map +1 -0
- package/dist/resolver/resolvers/index.d.ts +10 -0
- package/dist/resolver/resolvers/index.d.ts.map +1 -0
- package/dist/resolver/resolvers/index.js +10 -0
- package/dist/resolver/resolvers/index.js.map +1 -0
- package/dist/resolver/resolvers/jwtResolver.core.d.ts +27 -0
- package/dist/resolver/resolvers/jwtResolver.core.d.ts.map +1 -0
- package/dist/resolver/resolvers/jwtResolver.core.js +31 -0
- package/dist/resolver/resolvers/jwtResolver.core.js.map +1 -0
- package/dist/resolver/resolvers/pathResolver.core.d.ts +24 -0
- package/dist/resolver/resolvers/pathResolver.core.d.ts.map +1 -0
- package/dist/resolver/resolvers/pathResolver.core.js +41 -0
- package/dist/resolver/resolvers/pathResolver.core.js.map +1 -0
- package/dist/resolver/resolvers/subdomainResolver.core.d.ts +24 -0
- package/dist/resolver/resolvers/subdomainResolver.core.d.ts.map +1 -0
- package/dist/resolver/resolvers/subdomainResolver.core.js +48 -0
- package/dist/resolver/resolvers/subdomainResolver.core.js.map +1 -0
- package/dist/security/guard.core.d.ts +33 -0
- package/dist/security/guard.core.d.ts.map +1 -0
- package/dist/security/guard.core.js +64 -0
- package/dist/security/guard.core.js.map +1 -0
- package/dist/security/index.d.ts +7 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +7 -0
- package/dist/security/index.js.map +1 -0
- package/dist/tenancyErrors/index.d.ts +8 -0
- package/dist/tenancyErrors/index.d.ts.map +1 -0
- package/dist/tenancyErrors/index.js +8 -0
- package/dist/tenancyErrors/index.js.map +1 -0
- package/dist/tenancyErrors/tenancyError.base.d.ts +17 -0
- package/dist/tenancyErrors/tenancyError.base.d.ts.map +1 -0
- package/dist/tenancyErrors/tenancyError.base.js +19 -0
- package/dist/tenancyErrors/tenancyError.base.js.map +1 -0
- package/dist/tenancyErrors/tenancyError.types.d.ts +68 -0
- package/dist/tenancyErrors/tenancyError.types.d.ts.map +1 -0
- package/dist/tenancyErrors/tenancyError.types.js +118 -0
- package/dist/tenancyErrors/tenancyError.types.js.map +1 -0
- package/dist/tenancyTypes/index.d.ts +11 -0
- package/dist/tenancyTypes/index.d.ts.map +1 -0
- package/dist/tenancyTypes/index.js +11 -0
- package/dist/tenancyTypes/index.js.map +1 -0
- package/dist/tenancyTypes/repositoryTypes.d.ts +40 -0
- package/dist/tenancyTypes/repositoryTypes.d.ts.map +1 -0
- package/dist/tenancyTypes/repositoryTypes.js +7 -0
- package/dist/tenancyTypes/repositoryTypes.js.map +1 -0
- package/dist/tenancyTypes/resolverTypes.d.ts +34 -0
- package/dist/tenancyTypes/resolverTypes.d.ts.map +1 -0
- package/dist/tenancyTypes/resolverTypes.js +7 -0
- package/dist/tenancyTypes/resolverTypes.js.map +1 -0
- package/dist/tenancyTypes/tenancyOptions.d.ts +37 -0
- package/dist/tenancyTypes/tenancyOptions.d.ts.map +1 -0
- package/dist/tenancyTypes/tenancyOptions.js +7 -0
- package/dist/tenancyTypes/tenancyOptions.js.map +1 -0
- package/dist/tenancyTypes/tenantIdentity.d.ts +21 -0
- package/dist/tenancyTypes/tenantIdentity.d.ts.map +1 -0
- package/dist/tenancyTypes/tenantIdentity.js +13 -0
- package/dist/tenancyTypes/tenantIdentity.js.map +1 -0
- package/dist/tenancyTypes/tenantInterface.d.ts +47 -0
- package/dist/tenancyTypes/tenantInterface.d.ts.map +1 -0
- package/dist/tenancyTypes/tenantInterface.js +7 -0
- package/dist/tenancyTypes/tenantInterface.js.map +1 -0
- package/dist/utils/index.d.ts +7 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +7 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/utils.helper.d.ts +24 -0
- package/dist/utils/utils.helper.d.ts.map +1 -0
- package/dist/utils/utils.helper.js +30 -0
- package/dist/utils/utils.helper.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tenant guard — validates tenant access and isolation.
|
|
3
|
+
*
|
|
4
|
+
* @module security/guard
|
|
5
|
+
*/
|
|
6
|
+
import type { TenantId } from "../tenancyTypes/tenantIdentity.js";
|
|
7
|
+
import type { Tenant, TenantResource } from "../tenancyTypes/tenantInterface.js";
|
|
8
|
+
import type { TenantResolutionSource, TenantTrustLevel } from "../tenancyTypes/tenantInterface.js";
|
|
9
|
+
/**
|
|
10
|
+
* Get the default trust level for a resolution source.
|
|
11
|
+
*/
|
|
12
|
+
export declare function getDefaultTrust(source: TenantResolutionSource): TenantTrustLevel;
|
|
13
|
+
/**
|
|
14
|
+
* Validate that a tenant is usable.
|
|
15
|
+
*/
|
|
16
|
+
export declare function assertTenantUsable(tenant: Tenant): void;
|
|
17
|
+
/**
|
|
18
|
+
* Validate tenant ownership of a resource.
|
|
19
|
+
*/
|
|
20
|
+
export declare function assertTenantOwnership(resource: TenantResource, tenantId: TenantId): void;
|
|
21
|
+
/**
|
|
22
|
+
* Validate that a trust level is sufficient.
|
|
23
|
+
*/
|
|
24
|
+
export declare function assertTrustLevel(actual: TenantTrustLevel, required: TenantTrustLevel, source: TenantResolutionSource): void;
|
|
25
|
+
/**
|
|
26
|
+
* Create a tenant key for scoped resources.
|
|
27
|
+
*/
|
|
28
|
+
export declare function tenantKey(tenantId: TenantId, key: string, separator?: string): string;
|
|
29
|
+
/**
|
|
30
|
+
* Create a tenant cache key.
|
|
31
|
+
*/
|
|
32
|
+
export declare function createTenantCacheKey(tenantId: TenantId, key: string): string;
|
|
33
|
+
//# sourceMappingURL=guard.core.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guard.core.d.ts","sourceRoot":"","sources":["../../src/security/guard.core.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AAClE,OAAO,KAAK,EACV,MAAM,EACN,cAAc,EACf,MAAM,oCAAoC,CAAC;AAC5C,OAAO,KAAK,EACV,sBAAsB,EACtB,gBAAgB,EACjB,MAAM,oCAAoC,CAAC;AAoB5C;;GAEG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,sBAAsB,GAC7B,gBAAgB,CAElB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAIvD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,cAAc,EACxB,QAAQ,EAAE,QAAQ,GACjB,IAAI,CAIN;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,gBAAgB,EACxB,QAAQ,EAAE,gBAAgB,EAC1B,MAAM,EAAE,sBAAsB,GAC7B,IAAI,CAUN;AAED;;GAEG;AACH,wBAAgB,SAAS,CACvB,QAAQ,EAAE,QAAQ,EAClB,GAAG,EAAE,MAAM,EACX,SAAS,GAAE,MAAY,GACtB,MAAM,CAER;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAE5E"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tenant guard — validates tenant access and isolation.
|
|
3
|
+
*
|
|
4
|
+
* @module security/guard
|
|
5
|
+
*/
|
|
6
|
+
import { TenantAccessDeniedError, TenantIsolationError, TenantUnavailableError, } from "../tenancyErrors/tenancyError.types.js";
|
|
7
|
+
/** Trust levels for resolution sources. */
|
|
8
|
+
const TRUST_MAP = {
|
|
9
|
+
jwt: "trusted",
|
|
10
|
+
"api-key": "trusted",
|
|
11
|
+
manual: "trusted",
|
|
12
|
+
system: "trusted",
|
|
13
|
+
header: "verified",
|
|
14
|
+
subdomain: "verified",
|
|
15
|
+
domain: "verified",
|
|
16
|
+
path: "untrusted",
|
|
17
|
+
custom: "untrusted",
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Get the default trust level for a resolution source.
|
|
21
|
+
*/
|
|
22
|
+
export function getDefaultTrust(source) {
|
|
23
|
+
return TRUST_MAP[source] ?? "untrusted";
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Validate that a tenant is usable.
|
|
27
|
+
*/
|
|
28
|
+
export function assertTenantUsable(tenant) {
|
|
29
|
+
if (tenant.status !== "active") {
|
|
30
|
+
throw new TenantUnavailableError(tenant.id, tenant.status);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Validate tenant ownership of a resource.
|
|
35
|
+
*/
|
|
36
|
+
export function assertTenantOwnership(resource, tenantId) {
|
|
37
|
+
if (resource.tenantId !== tenantId) {
|
|
38
|
+
throw new TenantIsolationError(tenantId, resource.tenantId);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Validate that a trust level is sufficient.
|
|
43
|
+
*/
|
|
44
|
+
export function assertTrustLevel(actual, required, source) {
|
|
45
|
+
const levels = ["untrusted", "verified", "trusted"];
|
|
46
|
+
const actualIdx = levels.indexOf(actual);
|
|
47
|
+
const requiredIdx = levels.indexOf(required);
|
|
48
|
+
if (actualIdx < requiredIdx) {
|
|
49
|
+
throw new TenantAccessDeniedError(`Insufficient trust level from "${source}": need ${required}, got ${actual}`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Create a tenant key for scoped resources.
|
|
54
|
+
*/
|
|
55
|
+
export function tenantKey(tenantId, key, separator = ":") {
|
|
56
|
+
return `tenant${separator}${tenantId}${separator}${key}`;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Create a tenant cache key.
|
|
60
|
+
*/
|
|
61
|
+
export function createTenantCacheKey(tenantId, key) {
|
|
62
|
+
return tenantKey(tenantId, key, ":");
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=guard.core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guard.core.js","sourceRoot":"","sources":["../../src/security/guard.core.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAWH,OAAO,EACL,uBAAuB,EACvB,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,wCAAwC,CAAC;AAEhD,2CAA2C;AAC3C,MAAM,SAAS,GAAqD;IAClE,GAAG,EAAE,SAAS;IACd,SAAS,EAAE,SAAS;IACpB,MAAM,EAAE,SAAS;IACjB,MAAM,EAAE,SAAS;IACjB,MAAM,EAAE,UAAU;IAClB,SAAS,EAAE,UAAU;IACrB,MAAM,EAAE,UAAU;IAClB,IAAI,EAAE,WAAW;IACjB,MAAM,EAAE,WAAW;CACpB,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,eAAe,CAC7B,MAA8B;IAE9B,OAAO,SAAS,CAAC,MAAM,CAAC,IAAI,WAAW,CAAC;AAC1C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAc;IAC/C,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,MAAM,IAAI,sBAAsB,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAC7D,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CACnC,QAAwB,EACxB,QAAkB;IAElB,IAAI,QAAQ,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACnC,MAAM,IAAI,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,MAAwB,EACxB,QAA0B,EAC1B,MAA8B;IAE9B,MAAM,MAAM,GAAuB,CAAC,WAAW,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;IACxE,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAE7C,IAAI,SAAS,GAAG,WAAW,EAAE,CAAC;QAC5B,MAAM,IAAI,uBAAuB,CAC/B,kCAAkC,MAAM,WAAW,QAAQ,SAAS,MAAM,EAAE,CAC7E,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CACvB,QAAkB,EAClB,GAAW,EACX,SAAS,GAAW,GAAG;IAEvB,OAAO,SAAS,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,GAAG,EAAE,CAAC;AAC3D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,QAAkB,EAAE,GAAW;IAClE,OAAO,SAAS,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tenant security — validation, isolation, and access control.
|
|
3
|
+
*
|
|
4
|
+
* @module security
|
|
5
|
+
*/
|
|
6
|
+
export { getDefaultTrust, assertTenantUsable, assertTenantOwnership, assertTrustLevel, tenantKey, createTenantCacheKey, } from "./guard.core.js";
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/security/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,qBAAqB,EACrB,gBAAgB,EAChB,SAAS,EACT,oBAAoB,GACrB,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tenant security — validation, isolation, and access control.
|
|
3
|
+
*
|
|
4
|
+
* @module security
|
|
5
|
+
*/
|
|
6
|
+
export { getDefaultTrust, assertTenantUsable, assertTenantOwnership, assertTrustLevel, tenantKey, createTenantCacheKey, } from "./guard.core.js";
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/security/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,qBAAqB,EACrB,gBAAgB,EAChB,SAAS,EACT,oBAAoB,GACrB,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tenancy error types.
|
|
3
|
+
*
|
|
4
|
+
* @module tenancyErrors
|
|
5
|
+
*/
|
|
6
|
+
export { TenantError } from "./tenancyError.base.js";
|
|
7
|
+
export { InvalidTenantIdError, TenantNotFoundError, TenantContextMissingError, TenantResolutionError, TenantResolutionConflictError, TenantUnavailableError, TenantAccessDeniedError, TenantAlreadyExistsError, TenantProvisioningError, TenantIsolationError, } from "./tenancyError.types.js";
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tenancyErrors/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,yBAAyB,EACzB,qBAAqB,EACrB,6BAA6B,EAC7B,sBAAsB,EACtB,uBAAuB,EACvB,wBAAwB,EACxB,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tenancy error types.
|
|
3
|
+
*
|
|
4
|
+
* @module tenancyErrors
|
|
5
|
+
*/
|
|
6
|
+
export { TenantError } from "./tenancyError.base.js";
|
|
7
|
+
export { InvalidTenantIdError, TenantNotFoundError, TenantContextMissingError, TenantResolutionError, TenantResolutionConflictError, TenantUnavailableError, TenantAccessDeniedError, TenantAlreadyExistsError, TenantProvisioningError, TenantIsolationError, } from "./tenancyError.types.js";
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tenancyErrors/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,yBAAyB,EACzB,qBAAqB,EACrB,6BAA6B,EAC7B,sBAAsB,EACtB,uBAAuB,EACvB,wBAAwB,EACxB,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base TenantError class.
|
|
3
|
+
*
|
|
4
|
+
* @module tenancyErrors/tenancyError
|
|
5
|
+
*/
|
|
6
|
+
import { AuthorizationError, ErrorCode, type ErrorMetadata } from "@zudojs/errors";
|
|
7
|
+
/**
|
|
8
|
+
* Base error for all tenancy-related failures.
|
|
9
|
+
*/
|
|
10
|
+
export declare class TenantError extends AuthorizationError {
|
|
11
|
+
constructor(message: string, options?: {
|
|
12
|
+
readonly code?: ErrorCode;
|
|
13
|
+
readonly metadata?: ErrorMetadata;
|
|
14
|
+
readonly cause?: unknown;
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=tenancyError.base.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenancyError.base.d.ts","sourceRoot":"","sources":["../../src/tenancyErrors/tenancyError.base.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,kBAAkB,EAClB,SAAS,EACT,KAAK,aAAa,EACnB,MAAM,gBAAgB,CAAC;AAExB;;GAEG;AACH,qBAAa,WAAY,SAAQ,kBAAkB;IACjD,YACE,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QACR,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC;QAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC;QAClC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;KAC1B,EAOF;CACF"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base TenantError class.
|
|
3
|
+
*
|
|
4
|
+
* @module tenancyErrors/tenancyError
|
|
5
|
+
*/
|
|
6
|
+
import { AuthorizationError, ErrorCode, } from "@zudojs/errors";
|
|
7
|
+
/**
|
|
8
|
+
* Base error for all tenancy-related failures.
|
|
9
|
+
*/
|
|
10
|
+
export class TenantError extends AuthorizationError {
|
|
11
|
+
constructor(message, options) {
|
|
12
|
+
super(message, {
|
|
13
|
+
code: options?.code ?? ErrorCode.FORBIDDEN,
|
|
14
|
+
metadata: options?.metadata,
|
|
15
|
+
cause: options?.cause,
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=tenancyError.base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenancyError.base.js","sourceRoot":"","sources":["../../src/tenancyErrors/tenancyError.base.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,kBAAkB,EAClB,SAAS,GAEV,MAAM,gBAAgB,CAAC;AAExB;;GAEG;AACH,MAAM,OAAO,WAAY,SAAQ,kBAAkB;IACjD,YACE,OAAe,EACf,OAIC;QAED,KAAK,CAAC,OAAO,EAAE;YACb,IAAI,EAAE,OAAO,EAAE,IAAI,IAAI,SAAS,CAAC,SAAS;YAC1C,QAAQ,EAAE,OAAO,EAAE,QAAQ;YAC3B,KAAK,EAAE,OAAO,EAAE,KAAK;SACtB,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Specific tenancy error subclasses.
|
|
3
|
+
*
|
|
4
|
+
* @module tenancyErrors/tenancyError.types
|
|
5
|
+
*/
|
|
6
|
+
import { TenantError } from "./tenancyError.base.js";
|
|
7
|
+
import type { TenantId, TenantStatus } from "../tenancyTypes/tenantIdentity.js";
|
|
8
|
+
/**
|
|
9
|
+
* The provided tenant ID is invalid.
|
|
10
|
+
*/
|
|
11
|
+
export declare class InvalidTenantIdError extends TenantError {
|
|
12
|
+
constructor(value: string);
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Tenant not found.
|
|
16
|
+
*/
|
|
17
|
+
export declare class TenantNotFoundError extends TenantError {
|
|
18
|
+
constructor(tenantId: string);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* No tenant context in current execution.
|
|
22
|
+
*/
|
|
23
|
+
export declare class TenantContextMissingError extends TenantError {
|
|
24
|
+
constructor();
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Tenant resolution failed.
|
|
28
|
+
*/
|
|
29
|
+
export declare class TenantResolutionError extends TenantError {
|
|
30
|
+
constructor(message: string, cause?: unknown);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Multiple resolvers returned different tenants.
|
|
34
|
+
*/
|
|
35
|
+
export declare class TenantResolutionConflictError extends TenantError {
|
|
36
|
+
constructor(candidates: readonly string[]);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Tenant is not in an usable state.
|
|
40
|
+
*/
|
|
41
|
+
export declare class TenantUnavailableError extends TenantError {
|
|
42
|
+
constructor(tenantId: TenantId, status: TenantStatus);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Tenant access denied.
|
|
46
|
+
*/
|
|
47
|
+
export declare class TenantAccessDeniedError extends TenantError {
|
|
48
|
+
constructor(tenantId: string);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Tenant already exists.
|
|
52
|
+
*/
|
|
53
|
+
export declare class TenantAlreadyExistsError extends TenantError {
|
|
54
|
+
constructor(identifier: string);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Tenant provisioning failed.
|
|
58
|
+
*/
|
|
59
|
+
export declare class TenantProvisioningError extends TenantError {
|
|
60
|
+
constructor(tenantId: string, cause?: unknown);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Tenant isolation violation detected.
|
|
64
|
+
*/
|
|
65
|
+
export declare class TenantIsolationError extends TenantError {
|
|
66
|
+
constructor(expected: string, actual: string);
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=tenancyError.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenancyError.types.d.ts","sourceRoot":"","sources":["../../src/tenancyErrors/tenancyError.types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAEhF;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,WAAW;IACnD,YAAY,KAAK,EAAE,MAAM,EAKxB;CACF;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,WAAW;IAClD,YAAY,QAAQ,EAAE,MAAM,EAK3B;CACF;AAED;;GAEG;AACH,qBAAa,yBAA0B,SAAQ,WAAW;IACxD,cAIC;CACF;AAED;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,WAAW;IACpD,YAAY,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,EAK3C;CACF;AAED;;GAEG;AACH,qBAAa,6BAA8B,SAAQ,WAAW;IAC5D,YAAY,UAAU,EAAE,SAAS,MAAM,EAAE,EAKxC;CACF;AAED;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,WAAW;IACrD,YAAY,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAKnD;CACF;AAED;;GAEG;AACH,qBAAa,uBAAwB,SAAQ,WAAW;IACtD,YAAY,QAAQ,EAAE,MAAM,EAK3B;CACF;AAED;;GAEG;AACH,qBAAa,wBAAyB,SAAQ,WAAW;IACvD,YAAY,UAAU,EAAE,MAAM,EAK7B;CACF;AAED;;GAEG;AACH,qBAAa,uBAAwB,SAAQ,WAAW;IACtD,YAAY,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,EAM5C;CACF;AAED;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,WAAW;IACnD,YAAY,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAQ3C;CACF"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Specific tenancy error subclasses.
|
|
3
|
+
*
|
|
4
|
+
* @module tenancyErrors/tenancyError.types
|
|
5
|
+
*/
|
|
6
|
+
import { ErrorCode } from "@zudojs/errors";
|
|
7
|
+
import { TenantError } from "./tenancyError.base.js";
|
|
8
|
+
/**
|
|
9
|
+
* The provided tenant ID is invalid.
|
|
10
|
+
*/
|
|
11
|
+
export class InvalidTenantIdError extends TenantError {
|
|
12
|
+
constructor(value) {
|
|
13
|
+
super(`Invalid tenant ID: "${value}"`, {
|
|
14
|
+
code: ErrorCode.VALIDATION_FAILED,
|
|
15
|
+
metadata: { value },
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Tenant not found.
|
|
21
|
+
*/
|
|
22
|
+
export class TenantNotFoundError extends TenantError {
|
|
23
|
+
constructor(tenantId) {
|
|
24
|
+
super(`Tenant not found: "${tenantId}"`, {
|
|
25
|
+
code: ErrorCode.NOT_FOUND,
|
|
26
|
+
metadata: { tenantId },
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* No tenant context in current execution.
|
|
32
|
+
*/
|
|
33
|
+
export class TenantContextMissingError extends TenantError {
|
|
34
|
+
constructor() {
|
|
35
|
+
super("Tenant context is required but none was found", {
|
|
36
|
+
code: ErrorCode.PRECONDITION_FAILED,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Tenant resolution failed.
|
|
42
|
+
*/
|
|
43
|
+
export class TenantResolutionError extends TenantError {
|
|
44
|
+
constructor(message, cause) {
|
|
45
|
+
super(message, {
|
|
46
|
+
code: ErrorCode.OPERATION_FAILED,
|
|
47
|
+
cause,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Multiple resolvers returned different tenants.
|
|
53
|
+
*/
|
|
54
|
+
export class TenantResolutionConflictError extends TenantError {
|
|
55
|
+
constructor(candidates) {
|
|
56
|
+
super(`Tenant resolution conflict: ${candidates.join(", ")}`, {
|
|
57
|
+
code: ErrorCode.CONFLICT,
|
|
58
|
+
metadata: { candidates: candidates.join(",") },
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Tenant is not in an usable state.
|
|
64
|
+
*/
|
|
65
|
+
export class TenantUnavailableError extends TenantError {
|
|
66
|
+
constructor(tenantId, status) {
|
|
67
|
+
super(`Tenant "${tenantId}" is not available (status: ${status})`, {
|
|
68
|
+
code: ErrorCode.FORBIDDEN,
|
|
69
|
+
metadata: { tenantId, status },
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Tenant access denied.
|
|
75
|
+
*/
|
|
76
|
+
export class TenantAccessDeniedError extends TenantError {
|
|
77
|
+
constructor(tenantId) {
|
|
78
|
+
super(`Access denied to tenant "${tenantId}"`, {
|
|
79
|
+
code: ErrorCode.ACCESS_DENIED,
|
|
80
|
+
metadata: { tenantId },
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Tenant already exists.
|
|
86
|
+
*/
|
|
87
|
+
export class TenantAlreadyExistsError extends TenantError {
|
|
88
|
+
constructor(identifier) {
|
|
89
|
+
super(`Tenant already exists: "${identifier}"`, {
|
|
90
|
+
code: ErrorCode.CONFLICT,
|
|
91
|
+
metadata: { identifier },
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Tenant provisioning failed.
|
|
97
|
+
*/
|
|
98
|
+
export class TenantProvisioningError extends TenantError {
|
|
99
|
+
constructor(tenantId, cause) {
|
|
100
|
+
super(`Provisioning failed for tenant "${tenantId}"`, {
|
|
101
|
+
code: ErrorCode.OPERATION_FAILED,
|
|
102
|
+
cause,
|
|
103
|
+
metadata: { tenantId },
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Tenant isolation violation detected.
|
|
109
|
+
*/
|
|
110
|
+
export class TenantIsolationError extends TenantError {
|
|
111
|
+
constructor(expected, actual) {
|
|
112
|
+
super(`Tenant isolation violation: expected "${expected}", got "${actual}"`, {
|
|
113
|
+
code: ErrorCode.ACCESS_DENIED,
|
|
114
|
+
metadata: { expected, actual },
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=tenancyError.types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenancyError.types.js","sourceRoot":"","sources":["../../src/tenancyErrors/tenancyError.types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core tenancy type definitions.
|
|
3
|
+
*
|
|
4
|
+
* @module tenancyTypes
|
|
5
|
+
*/
|
|
6
|
+
export { type TenantId, createTenantId, type TenantStatus, type TenantIsolationStrategy, type TenancyMode, } from "./tenantIdentity.js";
|
|
7
|
+
export { type Tenant, type TenantResolutionSource, type TenantTrustLevel, type TenantContext, type SystemContext, type TenantExecutionContext, type ExecutionTenantContext, type TenantRequirement, type TenantResource, } from "./tenantInterface.js";
|
|
8
|
+
export { type TenantResolution, type TenantResolutionResult, type TenantResolver, type ResolverChainOptions, } from "./resolverTypes.js";
|
|
9
|
+
export { type TenantRepository, type TenantCache, type TenantManager, type TenantProvisioner, type TenantIsolationConfig, type TenantConfigurationProvider, } from "./repositoryTypes.js";
|
|
10
|
+
export { type TenancyOptions, type TenantDomain, type TenantScopeOptions, } from "./tenancyOptions.js";
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tenancyTypes/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,KAAK,QAAQ,EACb,cAAc,EACd,KAAK,YAAY,EACjB,KAAK,uBAAuB,EAC5B,KAAK,WAAW,GACjB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,KAAK,MAAM,EACX,KAAK,sBAAsB,EAC3B,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,sBAAsB,EAC3B,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,EACtB,KAAK,cAAc,GACpB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC3B,KAAK,cAAc,EACnB,KAAK,oBAAoB,GAC1B,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,2BAA2B,GACjC,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,kBAAkB,GACxB,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core tenancy type definitions.
|
|
3
|
+
*
|
|
4
|
+
* @module tenancyTypes
|
|
5
|
+
*/
|
|
6
|
+
export { createTenantId, } from "./tenantIdentity.js";
|
|
7
|
+
export {} from "./tenantInterface.js";
|
|
8
|
+
export {} from "./resolverTypes.js";
|
|
9
|
+
export {} from "./repositoryTypes.js";
|
|
10
|
+
export {} from "./tenancyOptions.js";
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tenancyTypes/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAEL,cAAc,GAIf,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAUN,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAKN,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAON,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAIN,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Repository, cache, manager, and provisioner types.
|
|
3
|
+
*
|
|
4
|
+
* @module tenancyTypes/repositoryTypes
|
|
5
|
+
*/
|
|
6
|
+
import type { TenantId, TenantIsolationStrategy } from "./tenantIdentity.js";
|
|
7
|
+
import type { Tenant } from "./tenantInterface.js";
|
|
8
|
+
/** Repository for loading tenants. */
|
|
9
|
+
export interface TenantRepository {
|
|
10
|
+
findById(id: TenantId): Promise<Tenant | undefined>;
|
|
11
|
+
findBySlug?(slug: string): Promise<Tenant | undefined>;
|
|
12
|
+
findByDomain?(domain: string): Promise<Tenant | undefined>;
|
|
13
|
+
}
|
|
14
|
+
/** Cache for tenant data. */
|
|
15
|
+
export interface TenantCache {
|
|
16
|
+
get(id: TenantId): Promise<Tenant | undefined>;
|
|
17
|
+
set(tenant: Tenant): Promise<void>;
|
|
18
|
+
delete(id: TenantId): Promise<void>;
|
|
19
|
+
}
|
|
20
|
+
/** High-level tenant orchestration. */
|
|
21
|
+
export interface TenantManager {
|
|
22
|
+
resolve(context: unknown): Promise<Tenant | undefined>;
|
|
23
|
+
get(id: TenantId): Promise<Tenant | undefined>;
|
|
24
|
+
require(id: TenantId): Promise<Tenant>;
|
|
25
|
+
}
|
|
26
|
+
/** Handles tenant setup operations. */
|
|
27
|
+
export interface TenantProvisioner {
|
|
28
|
+
provision(tenant: Tenant): Promise<void>;
|
|
29
|
+
}
|
|
30
|
+
/** Isolation configuration for a tenant. */
|
|
31
|
+
export interface TenantIsolationConfig {
|
|
32
|
+
readonly strategy: TenantIsolationStrategy;
|
|
33
|
+
readonly identifier?: string;
|
|
34
|
+
}
|
|
35
|
+
/** Tenant configuration provider. */
|
|
36
|
+
export interface TenantConfigurationProvider {
|
|
37
|
+
get<T = unknown>(tenantId: TenantId, key: string): Promise<T | undefined>;
|
|
38
|
+
set<T = unknown>(tenantId: TenantId, key: string, value: T): Promise<void>;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=repositoryTypes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repositoryTypes.d.ts","sourceRoot":"","sources":["../../src/tenancyTypes/repositoryTypes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAC7E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAGnD,sCAAsC;AACtC,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACpD,UAAU,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACvD,YAAY,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;CAC5D;AAED,6BAA6B;AAC7B,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAC/C,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACrC;AAED,uCAAuC;AACvC,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACvD,GAAG,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACxC;AAED,uCAAuC;AACvC,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1C;AAED,4CAA4C;AAC5C,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,QAAQ,EAAE,uBAAuB,CAAC;IAC3C,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,qCAAqC;AACrC,MAAM,WAAW,2BAA2B;IAC1C,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IAC1E,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5E"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repositoryTypes.js","sourceRoot":"","sources":["../../src/tenancyTypes/repositoryTypes.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tenant resolver types.
|
|
3
|
+
*
|
|
4
|
+
* @module tenancyTypes/resolverTypes
|
|
5
|
+
*/
|
|
6
|
+
import type { TenantId } from "./tenantIdentity.js";
|
|
7
|
+
import type { TenantResolutionSource, TenantTrustLevel } from "./tenantInterface.js";
|
|
8
|
+
/** A tenant resolution result from a resolver. */
|
|
9
|
+
export interface TenantResolution {
|
|
10
|
+
readonly tenantId: TenantId;
|
|
11
|
+
readonly source: TenantResolutionSource;
|
|
12
|
+
readonly trust: TenantTrustLevel;
|
|
13
|
+
readonly metadata?: Readonly<Record<string, unknown>>;
|
|
14
|
+
}
|
|
15
|
+
/** Result of resolver chain execution with conflict detection. */
|
|
16
|
+
export interface TenantResolutionResult {
|
|
17
|
+
readonly resolution: TenantResolution | undefined;
|
|
18
|
+
readonly candidates: readonly TenantResolution[];
|
|
19
|
+
readonly conflict: boolean;
|
|
20
|
+
}
|
|
21
|
+
/** Interface for tenant resolvers. */
|
|
22
|
+
export interface TenantResolver<Context = unknown> {
|
|
23
|
+
readonly name: string;
|
|
24
|
+
readonly priority: number;
|
|
25
|
+
resolve(context: Context): Promise<TenantResolution | undefined>;
|
|
26
|
+
}
|
|
27
|
+
/** Options for resolver chain. */
|
|
28
|
+
export interface ResolverChainOptions {
|
|
29
|
+
/** Whether to detect conflicts between resolver results. */
|
|
30
|
+
readonly detectConflicts?: boolean;
|
|
31
|
+
/** Throw on conflict instead of using highest priority. */
|
|
32
|
+
readonly throwOnConflict?: boolean;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=resolverTypes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolverTypes.d.ts","sourceRoot":"","sources":["../../src/tenancyTypes/resolverTypes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,EACV,sBAAsB,EACtB,gBAAgB,EACjB,MAAM,sBAAsB,CAAC;AAE9B,kDAAkD;AAClD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,sBAAsB,CAAC;IACxC,QAAQ,CAAC,KAAK,EAAE,gBAAgB,CAAC;IACjC,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACvD;AAED,kEAAkE;AAClE,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,UAAU,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAClD,QAAQ,CAAC,UAAU,EAAE,SAAS,gBAAgB,EAAE,CAAC;IACjD,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B;AAED,sCAAsC;AACtC,MAAM,WAAW,cAAc,CAAC,OAAO,GAAG,OAAO;IAC/C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAAC;CAClE;AAED,kCAAkC;AAClC,MAAM,WAAW,oBAAoB;IACnC,4DAA4D;IAC5D,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;IACnC,2DAA2D;IAC3D,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;CACpC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolverTypes.js","sourceRoot":"","sources":["../../src/tenancyTypes/resolverTypes.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Options and guard types.
|
|
3
|
+
*
|
|
4
|
+
* @module tenancyTypes/tenancyOptions
|
|
5
|
+
*/
|
|
6
|
+
import type { TenantId } from "./tenantIdentity.js";
|
|
7
|
+
import type { TenantRequirement } from "./tenantInterface.js";
|
|
8
|
+
import type { TenantResolver } from "./resolverTypes.js";
|
|
9
|
+
import type { TenantRepository, TenantCache, TenantProvisioner, TenantConfigurationProvider } from "./repositoryTypes.js";
|
|
10
|
+
/** Options for creating a tenancy service. */
|
|
11
|
+
export interface TenancyOptions {
|
|
12
|
+
/** Resolvers for determining tenant from context. */
|
|
13
|
+
readonly resolvers?: readonly TenantResolver[];
|
|
14
|
+
/** Repository for loading tenants. */
|
|
15
|
+
readonly repository?: TenantRepository;
|
|
16
|
+
/** Cache for tenant data. */
|
|
17
|
+
readonly cache?: TenantCache;
|
|
18
|
+
/** Provisioner for tenant setup. */
|
|
19
|
+
readonly provisioner?: TenantProvisioner;
|
|
20
|
+
/** Configuration provider. */
|
|
21
|
+
readonly configuration?: TenantConfigurationProvider;
|
|
22
|
+
/** Default tenant requirement for routes. */
|
|
23
|
+
readonly defaultRequirement?: TenantRequirement;
|
|
24
|
+
/** Detect conflicts between resolvers. */
|
|
25
|
+
readonly detectConflicts?: boolean;
|
|
26
|
+
}
|
|
27
|
+
/** Tenant domain mapping. */
|
|
28
|
+
export interface TenantDomain {
|
|
29
|
+
readonly domain: string;
|
|
30
|
+
readonly tenantId: TenantId;
|
|
31
|
+
}
|
|
32
|
+
/** Options for tenant scoping. */
|
|
33
|
+
export interface TenantScopeOptions {
|
|
34
|
+
readonly prefix?: string;
|
|
35
|
+
readonly separator?: string;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=tenancyOptions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenancyOptions.d.ts","sourceRoot":"","sources":["../../src/tenancyTypes/tenancyOptions.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,EAAU,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,KAAK,EACV,gBAAgB,EAChB,WAAW,EACX,iBAAiB,EACjB,2BAA2B,EAC5B,MAAM,sBAAsB,CAAC;AAE9B,8CAA8C;AAC9C,MAAM,WAAW,cAAc;IAC7B,qDAAqD;IACrD,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;IAC/C,sCAAsC;IACtC,QAAQ,CAAC,UAAU,CAAC,EAAE,gBAAgB,CAAC;IACvC,6BAA6B;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC;IAC7B,oCAAoC;IACpC,QAAQ,CAAC,WAAW,CAAC,EAAE,iBAAiB,CAAC;IACzC,8BAA8B;IAC9B,QAAQ,CAAC,aAAa,CAAC,EAAE,2BAA2B,CAAC;IACrD,6CAA6C;IAC7C,QAAQ,CAAC,kBAAkB,CAAC,EAAE,iBAAiB,CAAC;IAChD,0CAA0C;IAC1C,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;CACpC;AAED,6BAA6B;AAC7B,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;CAC7B;AAED,kCAAkC;AAClC,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenancyOptions.js","sourceRoot":"","sources":["../../src/tenancyTypes/tenancyOptions.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tenant identity types.
|
|
3
|
+
*
|
|
4
|
+
* @module tenancyTypes/tenantIdentity
|
|
5
|
+
*/
|
|
6
|
+
/** Branded tenant ID type. */
|
|
7
|
+
declare const TenantIdBrand: unique symbol;
|
|
8
|
+
/** A unique, validated tenant identifier. */
|
|
9
|
+
export type TenantId = string & {
|
|
10
|
+
readonly [TenantIdBrand]: true;
|
|
11
|
+
};
|
|
12
|
+
/** Create a validated TenantId. */
|
|
13
|
+
export declare function createTenantId(value: string): TenantId;
|
|
14
|
+
/** Tenant lifecycle status. */
|
|
15
|
+
export type TenantStatus = "provisioning" | "active" | "inactive" | "suspended" | "deleting" | "deleted";
|
|
16
|
+
/** Database isolation strategy for tenant data. */
|
|
17
|
+
export type TenantIsolationStrategy = "shared" | "schema" | "database" | "hybrid";
|
|
18
|
+
/** Tenancy execution mode. */
|
|
19
|
+
export type TenancyMode = "tenant" | "system";
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=tenantIdentity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenantIdentity.d.ts","sourceRoot":"","sources":["../../src/tenancyTypes/tenantIdentity.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,8BAA8B;AAC9B,OAAO,CAAC,MAAM,aAAa,EAAE,OAAO,MAAM,CAAC;AAE3C,6CAA6C;AAC7C,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG;IAAE,QAAQ,CAAC,CAAC,aAAa,CAAC,EAAE,IAAI,CAAA;CAAE,CAAC;AAEnE,mCAAmC;AACnC,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,CAKtD;AAED,+BAA+B;AAC/B,MAAM,MAAM,YAAY,GACtB,cAAc,GAAG,QAAQ,GAAG,UAAU,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,CAAC;AAEhF,mDAAmD;AACnD,MAAM,MAAM,uBAAuB,GACjC,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,QAAQ,CAAC;AAE9C,8BAA8B;AAC9B,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tenant identity types.
|
|
3
|
+
*
|
|
4
|
+
* @module tenancyTypes/tenantIdentity
|
|
5
|
+
*/
|
|
6
|
+
/** Create a validated TenantId. */
|
|
7
|
+
export function createTenantId(value) {
|
|
8
|
+
if (!value || value.trim().length === 0) {
|
|
9
|
+
throw new Error("TenantId cannot be empty");
|
|
10
|
+
}
|
|
11
|
+
return value;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=tenantIdentity.js.map
|