@venturekit-pro/tenancy 0.0.50 → 0.0.52

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.
@@ -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;AAChE,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"}
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"}
@@ -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;AAChE,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"}
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;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;IAElC,QAAQ,EAAE,MAAM;IAChB,QAAQ,EAAE,MAAM;IAChB,OAAO,EAAE,MAAM;IACf,KAAK,EAAE,MAAM;gBAHb,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM;CAKvB;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"}
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;;GAEG;AACH,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAElC;IACA;IACA;IACA;IAJT,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;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
+ {"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
- * Takes no options: the scope is derived entirely from `ctx.tenant`,
8
- * and "no tenant" is not configurable because inheriting a stale scope
9
- * is never the safe choice.
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":"AAoDA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAEtE;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,yBAAyB,IAAI,UAAU,CAAC,cAAc,CAAC,CAStE"}
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
- * Takes no options: the scope is derived entirely from `ctx.tenant`,
59
- * and "no tenant" is not configurable because inheriting a stale scope
60
- * is never the safe choice.
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
- return runWithTenant(tenantId, next);
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AACH,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAGnE;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,UAAU,yBAAyB;IACvC,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,OAAO,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACvC,CAAC;KACF,CAAC;AACJ,CAAC"}
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
- * Tenant not found error
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
- export declare class TenantNotFoundError extends Error {
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 Error {
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 Error {
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,KAAK;IACzB,QAAQ,EAAE,MAAM;gBAAhB,QAAQ,EAAE,MAAM;CAIpC;AAED;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;IAC1B,QAAQ,EAAE,MAAM;gBAAhB,QAAQ,EAAE,MAAM;CAIpC;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;IACzB,QAAQ,EAAE,MAAM;IAAS,MAAM,EAAE,MAAM;gBAAvC,QAAQ,EAAE,MAAM,EAAS,MAAM,EAAE,MAAM;CAI3D"}
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
- * Tenant not found error
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
- export class TenantNotFoundError extends Error {
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 Error {
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 Error {
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,KAAK;IACzB;IAAnB,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,KAAK;IAC1B;IAAnB,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,KAAK;IACzB;IAAyB;IAA5C,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"}
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.50",
3
+ "version": "0.0.52",
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.50"
33
+ "@venturekit/core": "0.0.52"
34
34
  },
35
35
  "peerDependencies": {
36
- "@venturekit/data": "0.0.50",
37
- "@venturekit/runtime": "0.0.50"
36
+ "@venturekit/data": "0.0.52",
37
+ "@venturekit/runtime": "0.0.52"
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",
50
- "@venturekit/runtime": "0.0.50",
49
+ "@venturekit/data": "0.0.52",
50
+ "@venturekit/runtime": "0.0.52",
51
51
  "typescript": "^5.3.0"
52
52
  },
53
53
  "scripts": {