@venturekit-pro/tenancy 0.0.50 → 0.0.51
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/middleware/index.d.ts +2 -1
- package/dist/middleware/index.d.ts.map +1 -1
- package/dist/middleware/index.js +1 -1
- package/dist/middleware/index.js.map +1 -1
- package/dist/middleware/quota-middleware.d.ts +9 -1
- package/dist/middleware/quota-middleware.d.ts.map +1 -1
- package/dist/middleware/quota-middleware.js +10 -1
- package/dist/middleware/quota-middleware.js.map +1 -1
- package/dist/middleware/rls-middleware.d.ts +31 -6
- package/dist/middleware/rls-middleware.d.ts.map +1 -1
- package/dist/middleware/rls-middleware.js +53 -8
- package/dist/middleware/rls-middleware.js.map +1 -1
- package/dist/middleware/tenant-middleware.d.ts +25 -6
- package/dist/middleware/tenant-middleware.d.ts.map +1 -1
- package/dist/middleware/tenant-middleware.js +22 -6
- package/dist/middleware/tenant-middleware.js.map +1 -1
- package/package.json +6 -6
|
@@ -5,7 +5,8 @@ export { createTenantMiddleware, TenantNotFoundError, TenantSuspendedError, Tena
|
|
|
5
5
|
export { createQuotaMiddleware, QuotaExceededError, checkQuotas } from './quota-middleware.js';
|
|
6
6
|
export { createRuntimeTenantMiddleware, hostPrefixDomainResolver, } from './runtime-tenant-middleware.js';
|
|
7
7
|
export type { RuntimeTenantResolver, RuntimeTenantMiddlewareOptions, HostPrefixDomainResolverOptions, } from './runtime-tenant-middleware.js';
|
|
8
|
-
export { createTenantRlsMiddleware } from './rls-middleware.js';
|
|
8
|
+
export { createTenantRlsMiddleware, createPlatformScopeMiddleware } from './rls-middleware.js';
|
|
9
|
+
export type { TenantRlsAccessCheck, TenantRlsOptions } from './rls-middleware.js';
|
|
9
10
|
export { createTenantUserScopesMiddleware, getTenantUser, requireTenantUser, } from './tenant-user-scopes-middleware.js';
|
|
10
11
|
export type { TenantUserWithRole, TenantUserResolver, TenantUserScopesMiddlewareOptions, RoleScopesLookup, } from './tenant-user-scopes-middleware.js';
|
|
11
12
|
export { TENANT_ROLES_CLAIM, TENANT_ROLES_MAX_LENGTH, packTenantRoles, unpackTenantRoles, } from './tenant-roles-claim.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/middleware/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAC/F,OAAO,EACL,6BAA6B,EAC7B,wBAAwB,GACzB,MAAM,gCAAgC,CAAC;AACxC,YAAY,EACV,qBAAqB,EACrB,8BAA8B,EAC9B,+BAA+B,GAChC,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/middleware/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAC/F,OAAO,EACL,6BAA6B,EAC7B,wBAAwB,GACzB,MAAM,gCAAgC,CAAC;AACxC,YAAY,EACV,qBAAqB,EACrB,8BAA8B,EAC9B,+BAA+B,GAChC,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,yBAAyB,EAAE,6BAA6B,EAAE,MAAM,qBAAqB,CAAC;AAC/F,YAAY,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAClF,OAAO,EACL,gCAAgC,EAChC,aAAa,EACb,iBAAiB,GAClB,MAAM,oCAAoC,CAAC;AAC5C,YAAY,EACV,kBAAkB,EAClB,kBAAkB,EAClB,iCAAiC,EACjC,gBAAgB,GACjB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACL,kBAAkB,EAClB,uBAAuB,EACvB,eAAe,EACf,iBAAiB,GAClB,MAAM,yBAAyB,CAAC;AACjC,YAAY,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EACL,4BAA4B,EAC5B,oBAAoB,GACrB,MAAM,wBAAwB,CAAC;AAChC,YAAY,EACV,qBAAqB,EACrB,6BAA6B,GAC9B,MAAM,wBAAwB,CAAC"}
|
package/dist/middleware/index.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
export { createTenantMiddleware, TenantNotFoundError, TenantSuspendedError, TenantInactiveError, } from './tenant-middleware.js';
|
|
5
5
|
export { createQuotaMiddleware, QuotaExceededError, checkQuotas } from './quota-middleware.js';
|
|
6
6
|
export { createRuntimeTenantMiddleware, hostPrefixDomainResolver, } from './runtime-tenant-middleware.js';
|
|
7
|
-
export { createTenantRlsMiddleware } from './rls-middleware.js';
|
|
7
|
+
export { createTenantRlsMiddleware, createPlatformScopeMiddleware } from './rls-middleware.js';
|
|
8
8
|
export { createTenantUserScopesMiddleware, getTenantUser, requireTenantUser, } from './tenant-user-scopes-middleware.js';
|
|
9
9
|
export { TENANT_ROLES_CLAIM, TENANT_ROLES_MAX_LENGTH, packTenantRoles, unpackTenantRoles, } from './tenant-roles-claim.js';
|
|
10
10
|
export { createTenantHandoffAuthorize, normalizeHandoffHost, } from './handoff-authorize.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/middleware/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAC/F,OAAO,EACL,6BAA6B,EAC7B,wBAAwB,GACzB,MAAM,gCAAgC,CAAC;AAMxC,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/middleware/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAC/F,OAAO,EACL,6BAA6B,EAC7B,wBAAwB,GACzB,MAAM,gCAAgC,CAAC;AAMxC,OAAO,EAAE,yBAAyB,EAAE,6BAA6B,EAAE,MAAM,qBAAqB,CAAC;AAE/F,OAAO,EACL,gCAAgC,EAChC,aAAa,EACb,iBAAiB,GAClB,MAAM,oCAAoC,CAAC;AAO5C,OAAO,EACL,kBAAkB,EAClB,uBAAuB,EACvB,eAAe,EACf,iBAAiB,GAClB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,4BAA4B,EAC5B,oBAAoB,GACrB,MAAM,wBAAwB,CAAC"}
|
|
@@ -26,15 +26,22 @@ export interface QuotaMiddlewareOptions {
|
|
|
26
26
|
* Create quota enforcement middleware
|
|
27
27
|
*/
|
|
28
28
|
export declare function createQuotaMiddleware(options: QuotaMiddlewareOptions): <T>(next: () => Promise<T>) => Promise<T>;
|
|
29
|
+
/** Same value as `@venturekit/runtime`'s `VENTURE_ERROR_MARKER` — the handler's error boundary renders marked errors. */
|
|
30
|
+
declare const VENTURE_ERROR_MARKER: unique symbol;
|
|
29
31
|
/**
|
|
30
|
-
* Quota exceeded error
|
|
32
|
+
* Quota exceeded error. Rendered by the runtime's error boundary as a 403
|
|
33
|
+
* `QUOTA_EXCEEDED` with `{ quotaKey, current, limit }` details.
|
|
31
34
|
*/
|
|
32
35
|
export declare class QuotaExceededError extends Error {
|
|
33
36
|
tenantId: string;
|
|
34
37
|
quotaKey: string;
|
|
35
38
|
current: number;
|
|
36
39
|
limit: number;
|
|
40
|
+
readonly [VENTURE_ERROR_MARKER]: true;
|
|
41
|
+
readonly code = "QUOTA_EXCEEDED";
|
|
42
|
+
readonly statusCode = 403;
|
|
37
43
|
constructor(tenantId: string, quotaKey: string, current: number, limit: number);
|
|
44
|
+
get details(): Record<string, unknown>;
|
|
38
45
|
}
|
|
39
46
|
/**
|
|
40
47
|
* Check multiple quotas at once
|
|
@@ -45,4 +52,5 @@ export declare function checkQuotas(tenantId: string, quotas: TenantQuotas, chec
|
|
|
45
52
|
limit: number;
|
|
46
53
|
exceeded: boolean;
|
|
47
54
|
}[]>;
|
|
55
|
+
export {};
|
|
48
56
|
//# sourceMappingURL=quota-middleware.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quota-middleware.d.ts","sourceRoot":"","sources":["../../src/middleware/quota-middleware.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGtD;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;IACvE,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,sCAAsC;IACtC,UAAU,EAAE,UAAU,CAAC;IAEvB,yBAAyB;IACzB,QAAQ,EAAE,MAAM,YAAY,CAAC;IAE7B,iCAAiC;IACjC,eAAe,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9E;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,sBAAsB,IAG7B,CAAC,EAAE,MAAM,MAAM,OAAO,CAAC,CAAC,CAAC,KAAG,OAAO,CAAC,CAAC,CAAC,CAmB7E;AAED
|
|
1
|
+
{"version":3,"file":"quota-middleware.d.ts","sourceRoot":"","sources":["../../src/middleware/quota-middleware.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGtD;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;IACvE,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,sCAAsC;IACtC,UAAU,EAAE,UAAU,CAAC;IAEvB,yBAAyB;IACzB,QAAQ,EAAE,MAAM,YAAY,CAAC;IAE7B,iCAAiC;IACjC,eAAe,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9E;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,sBAAsB,IAG7B,CAAC,EAAE,MAAM,MAAM,OAAO,CAAC,CAAC,CAAC,KAAG,OAAO,CAAC,CAAC,CAAC,CAmB7E;AAED,yHAAyH;AACzH,QAAA,MAAM,oBAAoB,EAAE,OAAO,MAAuC,CAAC;AAE3E;;;GAGG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;IAKlC,QAAQ,EAAE,MAAM;IAChB,QAAQ,EAAE,MAAM;IAChB,OAAO,EAAE,MAAM;IACf,KAAK,EAAE,MAAM;IAPtB,QAAQ,CAAC,CAAC,oBAAoB,CAAC,EAAG,IAAI,CAAU;IAChD,QAAQ,CAAC,IAAI,oBAAoB;IACjC,QAAQ,CAAC,UAAU,OAAO;gBAEjB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM;IAMtB,IAAI,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAErC;CACF;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,YAAY,EACpB,UAAU,EAAE,UAAU,GACrB,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,EAAE,CAAC,CAgB/E"}
|
|
@@ -25,14 +25,20 @@ export function createQuotaMiddleware(options) {
|
|
|
25
25
|
return next();
|
|
26
26
|
};
|
|
27
27
|
}
|
|
28
|
+
/** Same value as `@venturekit/runtime`'s `VENTURE_ERROR_MARKER` — the handler's error boundary renders marked errors. */
|
|
29
|
+
const VENTURE_ERROR_MARKER = Symbol.for('venturekit.error');
|
|
28
30
|
/**
|
|
29
|
-
* Quota exceeded error
|
|
31
|
+
* Quota exceeded error. Rendered by the runtime's error boundary as a 403
|
|
32
|
+
* `QUOTA_EXCEEDED` with `{ quotaKey, current, limit }` details.
|
|
30
33
|
*/
|
|
31
34
|
export class QuotaExceededError extends Error {
|
|
32
35
|
tenantId;
|
|
33
36
|
quotaKey;
|
|
34
37
|
current;
|
|
35
38
|
limit;
|
|
39
|
+
[VENTURE_ERROR_MARKER] = true;
|
|
40
|
+
code = 'QUOTA_EXCEEDED';
|
|
41
|
+
statusCode = 403;
|
|
36
42
|
constructor(tenantId, quotaKey, current, limit) {
|
|
37
43
|
super(`Quota exceeded for ${quotaKey}: ${current}/${limit}`);
|
|
38
44
|
this.tenantId = tenantId;
|
|
@@ -41,6 +47,9 @@ export class QuotaExceededError extends Error {
|
|
|
41
47
|
this.limit = limit;
|
|
42
48
|
this.name = 'QuotaExceededError';
|
|
43
49
|
}
|
|
50
|
+
get details() {
|
|
51
|
+
return { quotaKey: this.quotaKey, current: this.current, limit: this.limit };
|
|
52
|
+
}
|
|
44
53
|
}
|
|
45
54
|
/**
|
|
46
55
|
* Check multiple quotas at once
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quota-middleware.js","sourceRoot":"","sources":["../../src/middleware/quota-middleware.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAwB7D;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAA+B;IACnE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC;IAE1D,OAAO,KAAK,UAAU,eAAe,CAAI,IAAsB;QAC7D,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC;QAExC,sBAAsB;QACtB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;QAED,sBAAsB;QACtB,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,EAAE,EAAE,QAAkB,CAAC,CAAC;QAEpE,IAAI,OAAO,IAAI,KAAK,EAAE,CAAC;YACrB,eAAe,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;YAC7C,MAAM,IAAI,kBAAkB,CAAC,MAAM,CAAC,EAAE,EAAE,QAAkB,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;QAC9E,CAAC;QAED,OAAO,IAAI,EAAE,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"quota-middleware.js","sourceRoot":"","sources":["../../src/middleware/quota-middleware.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAwB7D;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAA+B;IACnE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC;IAE1D,OAAO,KAAK,UAAU,eAAe,CAAI,IAAsB;QAC7D,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC;QAExC,sBAAsB;QACtB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;QAED,sBAAsB;QACtB,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,EAAE,EAAE,QAAkB,CAAC,CAAC;QAEpE,IAAI,OAAO,IAAI,KAAK,EAAE,CAAC;YACrB,eAAe,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;YAC7C,MAAM,IAAI,kBAAkB,CAAC,MAAM,CAAC,EAAE,EAAE,QAAkB,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;QAC9E,CAAC;QAED,OAAO,IAAI,EAAE,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC;AAED,yHAAyH;AACzH,MAAM,oBAAoB,GAAkB,MAAM,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;AAE3E;;;GAGG;AACH,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAKlC;IACA;IACA;IACA;IAPA,CAAC,oBAAoB,CAAC,GAAG,IAAa,CAAC;IACvC,IAAI,GAAG,gBAAgB,CAAC;IACxB,UAAU,GAAG,GAAG,CAAC;IAC1B,YACS,QAAgB,EAChB,QAAgB,EAChB,OAAe,EACf,KAAa;QAEpB,KAAK,CAAC,sBAAsB,QAAQ,KAAK,OAAO,IAAI,KAAK,EAAE,CAAC,CAAC;QALtD,aAAQ,GAAR,QAAQ,CAAQ;QAChB,aAAQ,GAAR,QAAQ,CAAQ;QAChB,YAAO,GAAP,OAAO,CAAQ;QACf,UAAK,GAAL,KAAK,CAAQ;QAGpB,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;IAED,IAAI,OAAO;QACT,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;IAC/E,CAAC;CACF;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,QAAgB,EAChB,MAAoB,EACpB,UAAsB;IAEtB,MAAM,OAAO,GAAG,EAAE,CAAC;IAEnB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS;QAElC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,UAAU,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QACpD,OAAO,CAAC,IAAI,CAAC;YACX,GAAG;YACH,OAAO;YACP,KAAK;YACL,QAAQ,EAAE,OAAO,IAAI,KAAK;SAC3B,CAAC,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -1,12 +1,22 @@
|
|
|
1
1
|
import type { Middleware, RequestContext } from '@venturekit/runtime';
|
|
2
|
+
/** May this request see the resolved tenant's rows? */
|
|
3
|
+
export type TenantRlsAccessCheck = (ctx: RequestContext) => boolean | Promise<boolean>;
|
|
4
|
+
export interface TenantRlsOptions {
|
|
5
|
+
/**
|
|
6
|
+
* REQUIRED — who enters the resolved tenant's RLS scope: a per-request
|
|
7
|
+
* {@link TenantRlsAccessCheck}, or `'resolved-tenant'` for every request
|
|
8
|
+
* resolved to the tenant (see the module docs before choosing it).
|
|
9
|
+
*/
|
|
10
|
+
access: TenantRlsAccessCheck | 'resolved-tenant';
|
|
11
|
+
}
|
|
2
12
|
/**
|
|
3
13
|
* Build the middleware that opens a `@venturekit/data` tenant scope for
|
|
4
14
|
* the resolved `ctx.tenant`, so Postgres RLS policies apply to every
|
|
5
|
-
* query in the request.
|
|
15
|
+
* query in the request — for requests the `access` decision admits.
|
|
6
16
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
17
|
+
* "No tenant" is not configurable: inheriting a stale scope from a pooled
|
|
18
|
+
* connection is never the safe choice, so such requests always run
|
|
19
|
+
* through `runWithoutTenant()`.
|
|
10
20
|
*
|
|
11
21
|
* @example
|
|
12
22
|
* ```ts
|
|
@@ -17,12 +27,27 @@ import type { Middleware, RequestContext } from '@venturekit/runtime';
|
|
|
17
27
|
* } from '@venturekit-pro/tenancy';
|
|
18
28
|
*
|
|
19
29
|
* const tenancy = createRuntimeTenantMiddleware({ resolver });
|
|
20
|
-
* const rls = createTenantRlsMiddleware(
|
|
30
|
+
* const rls = createTenantRlsMiddleware({
|
|
31
|
+
* // Members see their tenant; everyone else sees none of its rows.
|
|
32
|
+
* access: async (ctx) => ctx.user !== null && (await isMember(ctx.tenant!.id, ctx.user.id)),
|
|
33
|
+
* });
|
|
21
34
|
*
|
|
22
35
|
* export const main = handler(async () => listPosts(), {
|
|
23
36
|
* middleware: [tenancy, rls],
|
|
24
37
|
* });
|
|
25
38
|
* ```
|
|
26
39
|
*/
|
|
27
|
-
export declare function createTenantRlsMiddleware(): Middleware<RequestContext>;
|
|
40
|
+
export declare function createTenantRlsMiddleware(options: TenantRlsOptions): Middleware<RequestContext>;
|
|
41
|
+
/**
|
|
42
|
+
* Run the whole request as the PLATFORM (`@venturekit/data`
|
|
43
|
+
* `runAsPlatform`) — for entry points that are cross-tenant by design:
|
|
44
|
+
* an operator console, sign-in that looks the account up in every tenant,
|
|
45
|
+
* onboarding that creates a tenant, an account switcher.
|
|
46
|
+
*
|
|
47
|
+
* Deployed functions connect as a least-privilege login that row-level
|
|
48
|
+
* security filters everywhere, so such routes must say they need more —
|
|
49
|
+
* and saying it in the route's handler factory keeps the list reviewable.
|
|
50
|
+
* A `runWithTenant` opened inside still narrows to that tenant.
|
|
51
|
+
*/
|
|
52
|
+
export declare function createPlatformScopeMiddleware(): Middleware<RequestContext>;
|
|
28
53
|
//# sourceMappingURL=rls-middleware.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rls-middleware.d.ts","sourceRoot":"","sources":["../../src/middleware/rls-middleware.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"rls-middleware.d.ts","sourceRoot":"","sources":["../../src/middleware/rls-middleware.ts"],"names":[],"mappings":"AAoEA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAEtE,uDAAuD;AACvD,MAAM,MAAM,oBAAoB,GAAG,CAAC,GAAG,EAAE,cAAc,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAEvF,MAAM,WAAW,gBAAgB;IAC/B;;;;OAIG;IACH,MAAM,EAAE,oBAAoB,GAAG,iBAAiB,CAAC;CAClD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,gBAAgB,GAAG,UAAU,CAAC,cAAc,CAAC,CAmB/F;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,6BAA6B,IAAI,UAAU,CAAC,cAAc,CAAC,CAK1E"}
|
|
@@ -44,20 +44,36 @@
|
|
|
44
44
|
* sweeps over every tenant) belongs on a database role that bypasses
|
|
45
45
|
* RLS, not on an ambient scope left over from another request.
|
|
46
46
|
*
|
|
47
|
+
* # Who enters the scope is a decision, not a side effect of resolution
|
|
48
|
+
*
|
|
49
|
+
* Resolution only says which tenant a request NAMES — by host, but also
|
|
50
|
+
* by a header, a query parameter or a path segment the client chose.
|
|
51
|
+
* Opening that tenant's scope for every request would let any caller read
|
|
52
|
+
* the tenant-scoped rows of any tenant through any route that does not
|
|
53
|
+
* check membership itself. So the middleware requires an explicit
|
|
54
|
+
* {@link TenantRlsOptions.access} decision:
|
|
55
|
+
*
|
|
56
|
+
* - a predicate — evaluated INSIDE the tenant's scope (so it can read the
|
|
57
|
+
* caller's membership row); a refused request runs with no tenant scope
|
|
58
|
+
* at all, i.e. sees none of the tenant's rows;
|
|
59
|
+
* - `'resolved-tenant'` — every request the resolver attributes to the
|
|
60
|
+
* tenant enters. Choose it only when the app authorizes each route on
|
|
61
|
+
* its own (membership-derived scopes), and say so where you choose it.
|
|
62
|
+
*
|
|
47
63
|
* Like `tenant-user-scopes-middleware.ts`, this module imports VALUES
|
|
48
64
|
* from an optional peer (`@venturekit/data`). That is deliberate and
|
|
49
65
|
* consistent: an RLS bridge is meaningless unless the app's data layer
|
|
50
66
|
* is the one publishing the GUC.
|
|
51
67
|
*/
|
|
52
|
-
import { runWithTenant, runWithoutTenant } from '@venturekit/data';
|
|
68
|
+
import { runAsPlatform, runWithTenant, runWithoutTenant } from '@venturekit/data';
|
|
53
69
|
/**
|
|
54
70
|
* Build the middleware that opens a `@venturekit/data` tenant scope for
|
|
55
71
|
* the resolved `ctx.tenant`, so Postgres RLS policies apply to every
|
|
56
|
-
* query in the request.
|
|
72
|
+
* query in the request — for requests the `access` decision admits.
|
|
57
73
|
*
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
*
|
|
74
|
+
* "No tenant" is not configurable: inheriting a stale scope from a pooled
|
|
75
|
+
* connection is never the safe choice, so such requests always run
|
|
76
|
+
* through `runWithoutTenant()`.
|
|
61
77
|
*
|
|
62
78
|
* @example
|
|
63
79
|
* ```ts
|
|
@@ -68,22 +84,51 @@ import { runWithTenant, runWithoutTenant } from '@venturekit/data';
|
|
|
68
84
|
* } from '@venturekit-pro/tenancy';
|
|
69
85
|
*
|
|
70
86
|
* const tenancy = createRuntimeTenantMiddleware({ resolver });
|
|
71
|
-
* const rls = createTenantRlsMiddleware(
|
|
87
|
+
* const rls = createTenantRlsMiddleware({
|
|
88
|
+
* // Members see their tenant; everyone else sees none of its rows.
|
|
89
|
+
* access: async (ctx) => ctx.user !== null && (await isMember(ctx.tenant!.id, ctx.user.id)),
|
|
90
|
+
* });
|
|
72
91
|
*
|
|
73
92
|
* export const main = handler(async () => listPosts(), {
|
|
74
93
|
* middleware: [tenancy, rls],
|
|
75
94
|
* });
|
|
76
95
|
* ```
|
|
77
96
|
*/
|
|
78
|
-
export function createTenantRlsMiddleware() {
|
|
97
|
+
export function createTenantRlsMiddleware(options) {
|
|
98
|
+
// Enforced at runtime too: a JavaScript caller (or a stale call site)
|
|
99
|
+
// must not fall back to trusting whatever tenant the request named.
|
|
100
|
+
if (!options || (options.access !== 'resolved-tenant' && typeof options.access !== 'function')) {
|
|
101
|
+
throw new Error("[venturekit-pro/tenancy] createTenantRlsMiddleware requires an explicit `access` decision: a predicate, or 'resolved-tenant'");
|
|
102
|
+
}
|
|
103
|
+
const { access } = options;
|
|
79
104
|
return {
|
|
80
105
|
name: 'tenant-rls',
|
|
81
106
|
fn: async (ctx, next) => {
|
|
82
107
|
const tenantId = ctx.tenant?.id;
|
|
83
108
|
if (!tenantId)
|
|
84
109
|
return runWithoutTenant(next);
|
|
85
|
-
|
|
110
|
+
if (access === 'resolved-tenant')
|
|
111
|
+
return runWithTenant(tenantId, next);
|
|
112
|
+
const admitted = await runWithTenant(tenantId, async () => access(ctx));
|
|
113
|
+
return admitted ? runWithTenant(tenantId, next) : runWithoutTenant(next);
|
|
86
114
|
},
|
|
87
115
|
};
|
|
88
116
|
}
|
|
117
|
+
/**
|
|
118
|
+
* Run the whole request as the PLATFORM (`@venturekit/data`
|
|
119
|
+
* `runAsPlatform`) — for entry points that are cross-tenant by design:
|
|
120
|
+
* an operator console, sign-in that looks the account up in every tenant,
|
|
121
|
+
* onboarding that creates a tenant, an account switcher.
|
|
122
|
+
*
|
|
123
|
+
* Deployed functions connect as a least-privilege login that row-level
|
|
124
|
+
* security filters everywhere, so such routes must say they need more —
|
|
125
|
+
* and saying it in the route's handler factory keeps the list reviewable.
|
|
126
|
+
* A `runWithTenant` opened inside still narrows to that tenant.
|
|
127
|
+
*/
|
|
128
|
+
export function createPlatformScopeMiddleware() {
|
|
129
|
+
return {
|
|
130
|
+
name: 'platform-scope',
|
|
131
|
+
fn: async (_ctx, next) => runAsPlatform(next),
|
|
132
|
+
};
|
|
133
|
+
}
|
|
89
134
|
//# sourceMappingURL=rls-middleware.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rls-middleware.js","sourceRoot":"","sources":["../../src/middleware/rls-middleware.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"rls-middleware.js","sourceRoot":"","sources":["../../src/middleware/rls-middleware.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkEG;AACH,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAelF;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,UAAU,yBAAyB,CAAC,OAAyB;IACjE,sEAAsE;IACtE,oEAAoE;IACpE,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,iBAAiB,IAAI,OAAO,OAAO,CAAC,MAAM,KAAK,UAAU,CAAC,EAAE,CAAC;QAC/F,MAAM,IAAI,KAAK,CACb,8HAA8H,CAC/H,CAAC;IACJ,CAAC;IACD,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAC3B,OAAO;QACL,IAAI,EAAE,YAAY;QAClB,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;YACtB,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;YAChC,IAAI,CAAC,QAAQ;gBAAE,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC;YAC7C,IAAI,MAAM,KAAK,iBAAiB;gBAAE,OAAO,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YACvE,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YACxE,OAAO,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAC3E,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,6BAA6B;IAC3C,OAAO;QACL,IAAI,EAAE,gBAAgB;QACtB,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC;KAC9C,CAAC;AACJ,CAAC"}
|
|
@@ -26,26 +26,45 @@ export interface TenantMiddlewareOptions {
|
|
|
26
26
|
* Create tenant middleware
|
|
27
27
|
*/
|
|
28
28
|
export declare function createTenantMiddleware(options: TenantMiddlewareOptions): <T>(request: TenantRequest, next: () => Promise<T>) => Promise<T>;
|
|
29
|
+
/** Same value as `@venturekit/runtime`'s `VENTURE_ERROR_MARKER` — the handler's error boundary renders marked errors. */
|
|
30
|
+
declare const VENTURE_ERROR_MARKER: unique symbol;
|
|
29
31
|
/**
|
|
30
|
-
*
|
|
32
|
+
* Base of the tenant-resolution errors. Rendered by `@venturekit/runtime`'s
|
|
33
|
+
* error boundary as `{ error: { code, message } }` with `statusCode`,
|
|
34
|
+
* instead of an opaque 500.
|
|
31
35
|
*/
|
|
32
|
-
|
|
36
|
+
declare abstract class TenantResolutionError extends Error {
|
|
37
|
+
readonly [VENTURE_ERROR_MARKER]: true;
|
|
38
|
+
abstract readonly code: string;
|
|
39
|
+
abstract readonly statusCode: number;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Tenant not found error (404)
|
|
43
|
+
*/
|
|
44
|
+
export declare class TenantNotFoundError extends TenantResolutionError {
|
|
33
45
|
tenantId: string;
|
|
46
|
+
readonly code = "TENANT_NOT_FOUND";
|
|
47
|
+
readonly statusCode = 404;
|
|
34
48
|
constructor(tenantId: string);
|
|
35
49
|
}
|
|
36
50
|
/**
|
|
37
|
-
* Tenant suspended error
|
|
51
|
+
* Tenant suspended error (403)
|
|
38
52
|
*/
|
|
39
|
-
export declare class TenantSuspendedError extends
|
|
53
|
+
export declare class TenantSuspendedError extends TenantResolutionError {
|
|
40
54
|
tenantId: string;
|
|
55
|
+
readonly code = "TENANT_SUSPENDED";
|
|
56
|
+
readonly statusCode = 403;
|
|
41
57
|
constructor(tenantId: string);
|
|
42
58
|
}
|
|
43
59
|
/**
|
|
44
|
-
* Tenant inactive error
|
|
60
|
+
* Tenant inactive error (403)
|
|
45
61
|
*/
|
|
46
|
-
export declare class TenantInactiveError extends
|
|
62
|
+
export declare class TenantInactiveError extends TenantResolutionError {
|
|
47
63
|
tenantId: string;
|
|
48
64
|
status: string;
|
|
65
|
+
readonly code = "TENANT_INACTIVE";
|
|
66
|
+
readonly statusCode = 403;
|
|
49
67
|
constructor(tenantId: string, status: string);
|
|
50
68
|
}
|
|
69
|
+
export {};
|
|
51
70
|
//# sourceMappingURL=tenant-middleware.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tenant-middleware.d.ts","sourceRoot":"","sources":["../../src/middleware/tenant-middleware.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAiB,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAGtE;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;AAExE;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,uBAAuB;IACvB,MAAM,EAAE,eAAe,CAAC;IAExB,sCAAsC;IACtC,YAAY,EAAE,YAAY,CAAC;IAE3B,mCAAmC;IACnC,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAE9C,sCAAsC;IACtC,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9C;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,uBAAuB,IAG9B,CAAC,EACtC,SAAS,aAAa,EACtB,MAAM,MAAM,OAAO,CAAC,CAAC,CAAC,KACrB,OAAO,CAAC,CAAC,CAAC,CA+Bd;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,
|
|
1
|
+
{"version":3,"file":"tenant-middleware.d.ts","sourceRoot":"","sources":["../../src/middleware/tenant-middleware.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAiB,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAGtE;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;AAExE;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,uBAAuB;IACvB,MAAM,EAAE,eAAe,CAAC;IAExB,sCAAsC;IACtC,YAAY,EAAE,YAAY,CAAC;IAE3B,mCAAmC;IACnC,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAE9C,sCAAsC;IACtC,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9C;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,uBAAuB,IAG9B,CAAC,EACtC,SAAS,aAAa,EACtB,MAAM,MAAM,OAAO,CAAC,CAAC,CAAC,KACrB,OAAO,CAAC,CAAC,CAAC,CA+Bd;AAED,yHAAyH;AACzH,QAAA,MAAM,oBAAoB,EAAE,OAAO,MAAuC,CAAC;AAE3E;;;;GAIG;AACH,uBAAe,qBAAsB,SAAQ,KAAK;IAChD,QAAQ,CAAC,CAAC,oBAAoB,CAAC,EAAG,IAAI,CAAU;IAChD,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CACtC;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,qBAAqB;IAGzC,QAAQ,EAAE,MAAM;IAFnC,QAAQ,CAAC,IAAI,sBAAsB;IACnC,QAAQ,CAAC,UAAU,OAAO;gBACP,QAAQ,EAAE,MAAM;CAIpC;AAED;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,qBAAqB;IAG1C,QAAQ,EAAE,MAAM;IAFnC,QAAQ,CAAC,IAAI,sBAAsB;IACnC,QAAQ,CAAC,UAAU,OAAO;gBACP,QAAQ,EAAE,MAAM;CAIpC;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,qBAAqB;IAGzC,QAAQ,EAAE,MAAM;IAAS,MAAM,EAAE,MAAM;IAF1D,QAAQ,CAAC,IAAI,qBAAqB;IAClC,QAAQ,CAAC,UAAU,OAAO;gBACP,QAAQ,EAAE,MAAM,EAAS,MAAM,EAAE,MAAM;CAI3D"}
|
|
@@ -36,11 +36,23 @@ export function createTenantMiddleware(options) {
|
|
|
36
36
|
return withTenantContext(context, next);
|
|
37
37
|
};
|
|
38
38
|
}
|
|
39
|
+
/** Same value as `@venturekit/runtime`'s `VENTURE_ERROR_MARKER` — the handler's error boundary renders marked errors. */
|
|
40
|
+
const VENTURE_ERROR_MARKER = Symbol.for('venturekit.error');
|
|
39
41
|
/**
|
|
40
|
-
*
|
|
42
|
+
* Base of the tenant-resolution errors. Rendered by `@venturekit/runtime`'s
|
|
43
|
+
* error boundary as `{ error: { code, message } }` with `statusCode`,
|
|
44
|
+
* instead of an opaque 500.
|
|
41
45
|
*/
|
|
42
|
-
|
|
46
|
+
class TenantResolutionError extends Error {
|
|
47
|
+
[VENTURE_ERROR_MARKER] = true;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Tenant not found error (404)
|
|
51
|
+
*/
|
|
52
|
+
export class TenantNotFoundError extends TenantResolutionError {
|
|
43
53
|
tenantId;
|
|
54
|
+
code = 'TENANT_NOT_FOUND';
|
|
55
|
+
statusCode = 404;
|
|
44
56
|
constructor(tenantId) {
|
|
45
57
|
super(`Tenant not found: ${tenantId}`);
|
|
46
58
|
this.tenantId = tenantId;
|
|
@@ -48,10 +60,12 @@ export class TenantNotFoundError extends Error {
|
|
|
48
60
|
}
|
|
49
61
|
}
|
|
50
62
|
/**
|
|
51
|
-
* Tenant suspended error
|
|
63
|
+
* Tenant suspended error (403)
|
|
52
64
|
*/
|
|
53
|
-
export class TenantSuspendedError extends
|
|
65
|
+
export class TenantSuspendedError extends TenantResolutionError {
|
|
54
66
|
tenantId;
|
|
67
|
+
code = 'TENANT_SUSPENDED';
|
|
68
|
+
statusCode = 403;
|
|
55
69
|
constructor(tenantId) {
|
|
56
70
|
super(`Tenant suspended: ${tenantId}`);
|
|
57
71
|
this.tenantId = tenantId;
|
|
@@ -59,11 +73,13 @@ export class TenantSuspendedError extends Error {
|
|
|
59
73
|
}
|
|
60
74
|
}
|
|
61
75
|
/**
|
|
62
|
-
* Tenant inactive error
|
|
76
|
+
* Tenant inactive error (403)
|
|
63
77
|
*/
|
|
64
|
-
export class TenantInactiveError extends
|
|
78
|
+
export class TenantInactiveError extends TenantResolutionError {
|
|
65
79
|
tenantId;
|
|
66
80
|
status;
|
|
81
|
+
code = 'TENANT_INACTIVE';
|
|
82
|
+
statusCode = 403;
|
|
67
83
|
constructor(tenantId, status) {
|
|
68
84
|
super(`Tenant inactive (${status}): ${tenantId}`);
|
|
69
85
|
this.tenantId = tenantId;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tenant-middleware.js","sourceRoot":"","sources":["../../src/middleware/tenant-middleware.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,aAAa,EAAiB,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAwBtF;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAgC;IACrE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,GAAG,OAAO,CAAC;IAE9E,OAAO,KAAK,UAAU,gBAAgB,CACpC,OAAsB,EACtB,IAAsB;QAEtB,iCAAiC;QACjC,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAEtD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,+CAA+C;YAC/C,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;QAED,gBAAgB;QAChB,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;QAE5C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,gBAAgB,EAAE,CAAC,QAAQ,CAAC,CAAC;YAC7B,MAAM,IAAI,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QAC1C,CAAC;QAED,sBAAsB;QACtB,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YAClC,iBAAiB,EAAE,CAAC,MAAM,CAAC,CAAC;YAC5B,MAAM,IAAI,oBAAoB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC5C,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/B,MAAM,IAAI,mBAAmB,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAC1D,CAAC;QAED,iCAAiC;QACjC,MAAM,OAAO,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAC5C,OAAO,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC1C,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,mBAAoB,SAAQ,
|
|
1
|
+
{"version":3,"file":"tenant-middleware.js","sourceRoot":"","sources":["../../src/middleware/tenant-middleware.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,aAAa,EAAiB,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAwBtF;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAgC;IACrE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,GAAG,OAAO,CAAC;IAE9E,OAAO,KAAK,UAAU,gBAAgB,CACpC,OAAsB,EACtB,IAAsB;QAEtB,iCAAiC;QACjC,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAEtD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,+CAA+C;YAC/C,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;QAED,gBAAgB;QAChB,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;QAE5C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,gBAAgB,EAAE,CAAC,QAAQ,CAAC,CAAC;YAC7B,MAAM,IAAI,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QAC1C,CAAC;QAED,sBAAsB;QACtB,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YAClC,iBAAiB,EAAE,CAAC,MAAM,CAAC,CAAC;YAC5B,MAAM,IAAI,oBAAoB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC5C,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/B,MAAM,IAAI,mBAAmB,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAC1D,CAAC;QAED,iCAAiC;QACjC,MAAM,OAAO,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAC5C,OAAO,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC1C,CAAC,CAAC;AACJ,CAAC;AAED,yHAAyH;AACzH,MAAM,oBAAoB,GAAkB,MAAM,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;AAE3E;;;;GAIG;AACH,MAAe,qBAAsB,SAAQ,KAAK;IACvC,CAAC,oBAAoB,CAAC,GAAG,IAAa,CAAC;CAGjD;AAED;;GAEG;AACH,MAAM,OAAO,mBAAoB,SAAQ,qBAAqB;IAGzC;IAFV,IAAI,GAAG,kBAAkB,CAAC;IAC1B,UAAU,GAAG,GAAG,CAAC;IAC1B,YAAmB,QAAgB;QACjC,KAAK,CAAC,qBAAqB,QAAQ,EAAE,CAAC,CAAC;QADtB,aAAQ,GAAR,QAAQ,CAAQ;QAEjC,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,oBAAqB,SAAQ,qBAAqB;IAG1C;IAFV,IAAI,GAAG,kBAAkB,CAAC;IAC1B,UAAU,GAAG,GAAG,CAAC;IAC1B,YAAmB,QAAgB;QACjC,KAAK,CAAC,qBAAqB,QAAQ,EAAE,CAAC,CAAC;QADtB,aAAQ,GAAR,QAAQ,CAAQ;QAEjC,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,mBAAoB,SAAQ,qBAAqB;IAGzC;IAAyB;IAFnC,IAAI,GAAG,iBAAiB,CAAC;IACzB,UAAU,GAAG,GAAG,CAAC;IAC1B,YAAmB,QAAgB,EAAS,MAAc;QACxD,KAAK,CAAC,oBAAoB,MAAM,MAAM,QAAQ,EAAE,CAAC,CAAC;QADjC,aAAQ,GAAR,QAAQ,CAAQ;QAAS,WAAM,GAAN,MAAM,CAAQ;QAExD,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@venturekit-pro/tenancy",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.51",
|
|
4
4
|
"description": "Multi-tenant utilities for VentureKit",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -30,11 +30,11 @@
|
|
|
30
30
|
}
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
|
-
"@venturekit/core": "0.0.
|
|
33
|
+
"@venturekit/core": "0.0.51"
|
|
34
34
|
},
|
|
35
35
|
"peerDependencies": {
|
|
36
|
-
"@venturekit/data": "0.0.
|
|
37
|
-
"@venturekit/runtime": "0.0.
|
|
36
|
+
"@venturekit/data": "0.0.51",
|
|
37
|
+
"@venturekit/runtime": "0.0.51"
|
|
38
38
|
},
|
|
39
39
|
"peerDependenciesMeta": {
|
|
40
40
|
"@venturekit/data": {
|
|
@@ -46,8 +46,8 @@
|
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
|
48
48
|
"@types/node": "^26.5.1",
|
|
49
|
-
"@venturekit/data": "0.0.
|
|
50
|
-
"@venturekit/runtime": "0.0.
|
|
49
|
+
"@venturekit/data": "0.0.51",
|
|
50
|
+
"@venturekit/runtime": "0.0.51",
|
|
51
51
|
"typescript": "^5.3.0"
|
|
52
52
|
},
|
|
53
53
|
"scripts": {
|