glasswork 1.0.1 → 1.1.0

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.
Files changed (194) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +34 -2
  3. package/dist/audit/audit-logger.d.ts +22 -0
  4. package/dist/audit/audit-logger.d.ts.map +1 -0
  5. package/dist/audit/audit-logger.js +44 -0
  6. package/dist/audit/audit-logger.js.map +1 -0
  7. package/dist/audit/context.d.ts +13 -0
  8. package/dist/audit/context.d.ts.map +1 -0
  9. package/dist/audit/context.js +66 -0
  10. package/dist/audit/context.js.map +1 -0
  11. package/dist/audit/index.d.ts +8 -0
  12. package/dist/audit/index.d.ts.map +1 -0
  13. package/dist/audit/index.js +7 -0
  14. package/dist/audit/index.js.map +1 -0
  15. package/dist/audit/types.d.ts +74 -0
  16. package/dist/audit/types.d.ts.map +1 -0
  17. package/dist/audit/types.js +2 -0
  18. package/dist/audit/types.js.map +1 -0
  19. package/dist/auth/abilities.d.ts +1 -1
  20. package/dist/auth/abilities.d.ts.map +1 -1
  21. package/dist/auth/abilities.js.map +1 -1
  22. package/dist/auth/better-auth-provider.d.ts +6 -3
  23. package/dist/auth/better-auth-provider.d.ts.map +1 -1
  24. package/dist/auth/better-auth-provider.js +1 -3
  25. package/dist/auth/better-auth-provider.js.map +1 -1
  26. package/dist/auth/index.d.ts +2 -2
  27. package/dist/auth/index.d.ts.map +1 -1
  28. package/dist/auth/index.js.map +1 -1
  29. package/dist/auth/middleware.d.ts +9 -7
  30. package/dist/auth/middleware.d.ts.map +1 -1
  31. package/dist/auth/middleware.js +9 -1
  32. package/dist/auth/middleware.js.map +1 -1
  33. package/dist/auth/types.d.ts +7 -0
  34. package/dist/auth/types.d.ts.map +1 -1
  35. package/dist/config/config-service.d.ts.map +1 -1
  36. package/dist/config/config-service.js.map +1 -1
  37. package/dist/config/providers.js.map +1 -1
  38. package/dist/core/bootstrap.js.map +1 -1
  39. package/dist/email/compiler/compiler.js +3 -3
  40. package/dist/email/compiler/compiler.js.map +1 -1
  41. package/dist/email/email-service.d.ts.map +1 -1
  42. package/dist/email/template-registry.d.ts.map +1 -1
  43. package/dist/email/templated-email-service.d.ts.map +1 -1
  44. package/dist/email/transports/mock-transport.d.ts.map +1 -1
  45. package/dist/email/transports/ses-transport.d.ts.map +1 -1
  46. package/dist/email/webhooks/handler-factory.js.map +1 -1
  47. package/dist/email/webhooks/signature-verification.js.map +1 -1
  48. package/dist/email/webhooks/subscription-handler.js.map +1 -1
  49. package/dist/hono-context.d.ts +1 -1
  50. package/dist/hono-context.d.ts.map +1 -1
  51. package/dist/http/error-handler.js.map +1 -1
  52. package/dist/http/errors.d.ts.map +1 -1
  53. package/dist/http/errors.js.map +1 -1
  54. package/dist/http/route-authorization.d.ts +1 -2
  55. package/dist/http/route-authorization.d.ts.map +1 -1
  56. package/dist/http/route-authorization.js.map +1 -1
  57. package/dist/http/route-context.d.ts +4 -2
  58. package/dist/http/route-context.d.ts.map +1 -1
  59. package/dist/http/route-context.js +7 -2
  60. package/dist/http/route-context.js.map +1 -1
  61. package/dist/http/route-helpers.d.ts +3 -3
  62. package/dist/http/route-helpers.d.ts.map +1 -1
  63. package/dist/http/route-helpers.js.map +1 -1
  64. package/dist/http/route-openapi.d.ts +1 -1
  65. package/dist/http/route-openapi.d.ts.map +1 -1
  66. package/dist/http/route-openapi.js.map +1 -1
  67. package/dist/http/route-types.d.ts +26 -23
  68. package/dist/http/route-types.d.ts.map +1 -1
  69. package/dist/jobs/drivers/eventbridge-scheduler-driver.d.ts.map +1 -1
  70. package/dist/jobs/drivers/eventbridge-scheduler-driver.js.map +1 -1
  71. package/dist/jobs/drivers/mock-driver.d.ts.map +1 -1
  72. package/dist/jobs/drivers/mock-driver.js.map +1 -1
  73. package/dist/jobs/drivers/sqs-driver.d.ts.map +1 -1
  74. package/dist/jobs/drivers/sqs-driver.js.map +1 -1
  75. package/dist/jobs/errors.d.ts.map +1 -1
  76. package/dist/jobs/job-registry.d.ts.map +1 -1
  77. package/dist/jobs/job-registry.js.map +1 -1
  78. package/dist/jobs/job-service.d.ts.map +1 -1
  79. package/dist/jobs/job-service.js.map +1 -1
  80. package/dist/jobs/observability/client.d.ts +26 -0
  81. package/dist/jobs/observability/client.d.ts.map +1 -0
  82. package/dist/jobs/observability/client.js +286 -0
  83. package/dist/jobs/observability/client.js.map +1 -0
  84. package/dist/jobs/observability/dashboard.d.ts +19 -0
  85. package/dist/jobs/observability/dashboard.d.ts.map +1 -0
  86. package/dist/jobs/observability/dashboard.js +144 -0
  87. package/dist/jobs/observability/dashboard.js.map +1 -0
  88. package/dist/jobs/observability/emf.d.ts +24 -0
  89. package/dist/jobs/observability/emf.d.ts.map +1 -0
  90. package/dist/jobs/observability/emf.js +100 -0
  91. package/dist/jobs/observability/emf.js.map +1 -0
  92. package/dist/jobs/observability/index.d.ts +5 -0
  93. package/dist/jobs/observability/index.d.ts.map +1 -0
  94. package/dist/jobs/observability/index.js +4 -0
  95. package/dist/jobs/observability/index.js.map +1 -0
  96. package/dist/jobs/observability/types.d.ts +234 -0
  97. package/dist/jobs/observability/types.d.ts.map +1 -0
  98. package/dist/jobs/observability/types.js +2 -0
  99. package/dist/jobs/observability/types.js.map +1 -0
  100. package/dist/jobs/worker.d.ts +1 -1
  101. package/dist/jobs/worker.d.ts.map +1 -1
  102. package/dist/list-query/builder.d.ts +11 -2
  103. package/dist/list-query/builder.d.ts.map +1 -1
  104. package/dist/list-query/builder.js +24 -4
  105. package/dist/list-query/builder.js.map +1 -1
  106. package/dist/list-query/filter-mapping.d.ts +89 -0
  107. package/dist/list-query/filter-mapping.d.ts.map +1 -0
  108. package/dist/list-query/filter-mapping.js +254 -0
  109. package/dist/list-query/filter-mapping.js.map +1 -0
  110. package/dist/list-query/filter-value-schemas.d.ts +3 -3
  111. package/dist/list-query/filter-value-schemas.d.ts.map +1 -1
  112. package/dist/list-query/filter-value-schemas.js +13 -3
  113. package/dist/list-query/filter-value-schemas.js.map +1 -1
  114. package/dist/list-query/index.d.ts +4 -2
  115. package/dist/list-query/index.d.ts.map +1 -1
  116. package/dist/list-query/index.js +3 -1
  117. package/dist/list-query/index.js.map +1 -1
  118. package/dist/list-query/parse-filter-values.d.ts.map +1 -1
  119. package/dist/list-query/parse-filter-values.js +2 -2
  120. package/dist/list-query/parse-filter-values.js.map +1 -1
  121. package/dist/list-query/parser.d.ts +3 -2
  122. package/dist/list-query/parser.d.ts.map +1 -1
  123. package/dist/list-query/parser.js.map +1 -1
  124. package/dist/list-query/prisma-executor.d.ts +44 -29
  125. package/dist/list-query/prisma-executor.d.ts.map +1 -1
  126. package/dist/list-query/prisma-executor.js +48 -33
  127. package/dist/list-query/prisma-executor.js.map +1 -1
  128. package/dist/list-query/query-schema.d.ts +8 -13
  129. package/dist/list-query/query-schema.d.ts.map +1 -1
  130. package/dist/list-query/query-schema.js +11 -12
  131. package/dist/list-query/query-schema.js.map +1 -1
  132. package/dist/list-query/schema-helpers.d.ts +17 -17
  133. package/dist/list-query/schema-helpers.d.ts.map +1 -1
  134. package/dist/list-query/schema-helpers.js +11 -11
  135. package/dist/list-query/schema-helpers.js.map +1 -1
  136. package/dist/list-query/sort-mapping.d.ts +37 -0
  137. package/dist/list-query/sort-mapping.d.ts.map +1 -0
  138. package/dist/list-query/sort-mapping.js +88 -0
  139. package/dist/list-query/sort-mapping.js.map +1 -0
  140. package/dist/list-query/types.d.ts +3 -10
  141. package/dist/list-query/types.d.ts.map +1 -1
  142. package/dist/list-query/validator.d.ts.map +1 -1
  143. package/dist/list-query/validator.js +28 -10
  144. package/dist/list-query/validator.js.map +1 -1
  145. package/dist/observability/exception-tracking.d.ts.map +1 -1
  146. package/dist/observability/exception-tracking.js.map +1 -1
  147. package/dist/observability/index.d.ts +1 -1
  148. package/dist/observability/index.d.ts.map +1 -1
  149. package/dist/observability/index.js +1 -1
  150. package/dist/observability/index.js.map +1 -1
  151. package/dist/observability/pino-logger.d.ts +0 -28
  152. package/dist/observability/pino-logger.d.ts.map +1 -1
  153. package/dist/observability/pino-logger.js +21 -12
  154. package/dist/observability/pino-logger.js.map +1 -1
  155. package/dist/observability/request-context.d.ts +36 -1
  156. package/dist/observability/request-context.d.ts.map +1 -1
  157. package/dist/observability/request-context.js +43 -0
  158. package/dist/observability/request-context.js.map +1 -1
  159. package/dist/rls/configuration.d.ts +3 -0
  160. package/dist/rls/configuration.d.ts.map +1 -0
  161. package/dist/rls/configuration.js +13 -0
  162. package/dist/rls/configuration.js.map +1 -0
  163. package/dist/rls/context.d.ts +37 -0
  164. package/dist/rls/context.d.ts.map +1 -0
  165. package/dist/rls/context.js +56 -0
  166. package/dist/rls/context.js.map +1 -0
  167. package/dist/rls/extension.d.ts +7 -0
  168. package/dist/rls/extension.d.ts.map +1 -0
  169. package/dist/rls/extension.js +91 -0
  170. package/dist/rls/extension.js.map +1 -0
  171. package/dist/rls/generator.d.ts +17 -0
  172. package/dist/rls/generator.d.ts.map +1 -0
  173. package/dist/rls/generator.js +47 -0
  174. package/dist/rls/generator.js.map +1 -0
  175. package/dist/rls/index.d.ts +7 -0
  176. package/dist/rls/index.d.ts.map +1 -0
  177. package/dist/rls/index.js +7 -0
  178. package/dist/rls/index.js.map +1 -0
  179. package/dist/rls/middleware.d.ts +17 -0
  180. package/dist/rls/middleware.d.ts.map +1 -0
  181. package/dist/rls/middleware.js +51 -0
  182. package/dist/rls/middleware.js.map +1 -0
  183. package/dist/rls/testing.d.ts +24 -0
  184. package/dist/rls/testing.d.ts.map +1 -0
  185. package/dist/rls/testing.js +31 -0
  186. package/dist/rls/testing.js.map +1 -0
  187. package/dist/rls/types.d.ts +51 -0
  188. package/dist/rls/types.d.ts.map +1 -0
  189. package/dist/rls/types.js +16 -0
  190. package/dist/rls/types.js.map +1 -0
  191. package/dist/uploads/uploads.service.d.ts.map +1 -1
  192. package/dist/uploads/validators.d.ts.map +1 -1
  193. package/dist/utils/serialize-prisma-types.js.map +1 -1
  194. package/package.json +47 -34
@@ -0,0 +1,37 @@
1
+ import { type TenantContext } from './types.js';
2
+ /**
3
+ * Run an asynchronous function within a specific tenant context.
4
+ *
5
+ * @param context - The TenantContext to bind.
6
+ * @param fn - The asynchronous callback function.
7
+ * @returns The resolved return value of `fn`.
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * const result = await runWithTenant({ tenantId: 'tenant_123' }, async () => {
12
+ * return await prisma.poll.findMany();
13
+ * });
14
+ * ```
15
+ */
16
+ export declare function runWithTenant<T>(context: TenantContext | undefined, fn: () => T | PromiseLike<T>): Promise<T>;
17
+ /**
18
+ * Run trusted system code with an explicit bypass.
19
+ *
20
+ * Only tables with a matching bypass policy allow access across tenants.
21
+ */
22
+ export declare function runWithBypass<T>(fn: () => T | PromiseLike<T>): Promise<T>;
23
+ /**
24
+ * Get the current active TenantContext, or undefined if outside a tenant execution boundary.
25
+ */
26
+ export declare function getTenantContext(): Readonly<TenantContext> | undefined;
27
+ /**
28
+ * Get the current active tenant ID, or undefined if outside a tenant boundary.
29
+ */
30
+ export declare function getTenantId(): string | undefined;
31
+ /**
32
+ * Get the current active tenant ID, throwing `MissingTenantContextException` if not present.
33
+ *
34
+ * @param modelName - Optional model name for descriptive error reporting.
35
+ */
36
+ export declare function requireTenantId(modelName?: string): string;
37
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/rls/context.ts"],"names":[],"mappings":"AACA,OAAO,EAAiC,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAO/E;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAC7B,OAAO,EAAE,aAAa,GAAG,SAAS,EAClC,EAAE,EAAE,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,GAC3B,OAAO,CAAC,CAAC,CAAC,CAEZ;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAEzE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,QAAQ,CAAC,aAAa,CAAC,GAAG,SAAS,CAEtE;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,MAAM,GAAG,SAAS,CAEhD;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAM1D"}
@@ -0,0 +1,56 @@
1
+ import { AsyncLocalStorage } from 'node:async_hooks';
2
+ import { MissingTenantContextException } from './types.js';
3
+ /**
4
+ * AsyncLocalStorage instance holding the active TenantContext for the current execution chain.
5
+ */
6
+ const tenantContextStorage = new AsyncLocalStorage();
7
+ /**
8
+ * Run an asynchronous function within a specific tenant context.
9
+ *
10
+ * @param context - The TenantContext to bind.
11
+ * @param fn - The asynchronous callback function.
12
+ * @returns The resolved return value of `fn`.
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * const result = await runWithTenant({ tenantId: 'tenant_123' }, async () => {
17
+ * return await prisma.poll.findMany();
18
+ * });
19
+ * ```
20
+ */
21
+ export function runWithTenant(context, fn) {
22
+ return tenantContextStorage.run(context && Object.freeze({ ...context }), async () => await fn());
23
+ }
24
+ /**
25
+ * Run trusted system code with an explicit bypass.
26
+ *
27
+ * Only tables with a matching bypass policy allow access across tenants.
28
+ */
29
+ export function runWithBypass(fn) {
30
+ return runWithTenant({ bypass: true }, fn);
31
+ }
32
+ /**
33
+ * Get the current active TenantContext, or undefined if outside a tenant execution boundary.
34
+ */
35
+ export function getTenantContext() {
36
+ return tenantContextStorage.getStore();
37
+ }
38
+ /**
39
+ * Get the current active tenant ID, or undefined if outside a tenant boundary.
40
+ */
41
+ export function getTenantId() {
42
+ return tenantContextStorage.getStore()?.tenantId;
43
+ }
44
+ /**
45
+ * Get the current active tenant ID, throwing `MissingTenantContextException` if not present.
46
+ *
47
+ * @param modelName - Optional model name for descriptive error reporting.
48
+ */
49
+ export function requireTenantId(modelName) {
50
+ const context = getTenantContext();
51
+ if (!context?.tenantId) {
52
+ throw new MissingTenantContextException(modelName);
53
+ }
54
+ return context.tenantId;
55
+ }
56
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/rls/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,6BAA6B,EAAsB,MAAM,YAAY,CAAC;AAE/E;;GAEG;AACH,MAAM,oBAAoB,GAAG,IAAI,iBAAiB,EAAuC,CAAC;AAE1F;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,aAAa,CAC3B,OAAkC,EAClC,EAA4B;IAE5B,OAAO,oBAAoB,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACpG,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAI,EAA4B;IAC3D,OAAO,aAAa,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;AAC7C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO,oBAAoB,CAAC,QAAQ,EAAE,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO,oBAAoB,CAAC,QAAQ,EAAE,EAAE,QAAQ,CAAC;AACnD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,SAAkB;IAChD,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAC;IACnC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC;QACvB,MAAM,IAAI,6BAA6B,CAAC,SAAS,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,OAAO,CAAC,QAAQ,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { type RLSExtensionOptions, type RLSTransactionClient, type RLSTransactionOptions, type TenantContext } from './types.js';
2
+ /** Prisma extension for transaction-scoped PostgreSQL RLS. Apply this extension last. */
3
+ export declare function createRLSExtension(options?: RLSExtensionOptions): (client: any) => import("@prisma/client/extension").PrismaClientExtends<import("@prisma/client/runtime/client").InternalArgs<{}, {}, {}, {
4
+ $transaction<TClient, TResult>(this: TClient, fn: (tx: RLSTransactionClient<TClient>) => Promise<TResult>, transactionOptions?: RLSTransactionOptions): Promise<TResult>;
5
+ $withTenant<TClient, TResult>(this: TClient, context: TenantContext, fn: (tx: RLSTransactionClient<TClient>) => Promise<TResult>, transactionOptions?: RLSTransactionOptions): Promise<TResult>;
6
+ }> & import("@prisma/client/runtime/client").DefaultArgs>;
7
+ //# sourceMappingURL=extension.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension.d.ts","sourceRoot":"","sources":["../../src/rls/extension.ts"],"names":[],"mappings":"AAGA,OAAO,EAGL,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAC1B,KAAK,aAAa,EACnB,MAAM,YAAY,CAAC;AAQpB,yFAAyF;AACzF,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,mBAAwB;iBA6E/C,OAAO,EAAE,OAAO,QACrB,OAAO,MACT,CAAC,EAAE,EAAE,oBAAoB,CAAC,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,uBACtC,qBAAqB;gBAIhC,OAAO,EAAE,OAAO,QACpB,OAAO,WACJ,aAAa,MAClB,CAAC,EAAE,EAAE,oBAAoB,CAAC,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,uBACtC,qBAAqB;0DAqBnD"}
@@ -0,0 +1,91 @@
1
+ import { Prisma } from '@prisma/client/extension';
2
+ import { validateSessionVariables } from './configuration.js';
3
+ import { getTenantContext, runWithTenant } from './context.js';
4
+ import { MissingTenantContextException, RLSConfigurationException, } from './types.js';
5
+ /** Prisma extension for transaction-scoped PostgreSQL RLS. Apply this extension last. */
6
+ export function createRLSExtension(options = {}) {
7
+ const { sessionVariable = 'app.current_tenant_id', bypassVariable, models, missingContextBehavior = 'throw', } = options;
8
+ validateSessionVariables(sessionVariable, bypassVariable);
9
+ function resolveContext(model) {
10
+ const context = getTenantContext();
11
+ if (context?.bypass && !bypassVariable) {
12
+ throw new RLSConfigurationException('This RLS extension does not allow bypass.');
13
+ }
14
+ if (context?.tenantId || context?.bypass)
15
+ return context;
16
+ if (missingContextBehavior === 'throw' &&
17
+ (!models || (model !== undefined && models.includes(model)))) {
18
+ throw new MissingTenantContextException(model);
19
+ }
20
+ return undefined;
21
+ }
22
+ return Prisma.defineExtension((base) => {
23
+ function sessionConfig(context) {
24
+ const tenantId = context.tenantId ?? '';
25
+ // Set or clear both settings each time; values remain parameterized.
26
+ return bypassVariable
27
+ ? [
28
+ 'SELECT set_config($1, $2, true), set_config($3, $4, true)',
29
+ sessionVariable,
30
+ tenantId,
31
+ bypassVariable,
32
+ context.bypass ? 'true' : '',
33
+ ]
34
+ : ['SELECT set_config($1, $2, true)', sessionVariable, tenantId];
35
+ }
36
+ async function transact(fn, transactionOptions) {
37
+ if (typeof fn !== 'function') {
38
+ throw new RLSConfigurationException('Use the callback form of $transaction for RLS.');
39
+ }
40
+ const context = resolveContext();
41
+ if (!context)
42
+ throw new MissingTenantContextException();
43
+ // A separate extension keeps Prisma's query callback on the transaction client.
44
+ // No private Prisma transaction fields or global client redirection are needed.
45
+ const transactional = base.$extends({
46
+ name: 'glasswork-rls-transaction',
47
+ query: {
48
+ async $allOperations({ model, args, query }) {
49
+ const active = resolveContext(model);
50
+ if (active?.tenantId !== context.tenantId || active?.bypass !== context.bypass) {
51
+ throw new RLSConfigurationException('The RLS context cannot change within a transaction.');
52
+ }
53
+ return query(args);
54
+ },
55
+ },
56
+ });
57
+ return transactional.$transaction(async (tx) => {
58
+ await tx.$executeRawUnsafe(...sessionConfig(context));
59
+ // Prisma preserves the model delegates and previously applied extensions.
60
+ return fn(tx);
61
+ }, transactionOptions);
62
+ }
63
+ return base.$extends({
64
+ name: 'glasswork-rls',
65
+ client: {
66
+ $transaction(fn, transactionOptions) {
67
+ return transact(fn, transactionOptions);
68
+ },
69
+ $withTenant(context, fn, transactionOptions) {
70
+ return runWithTenant(context, () => transact(fn, transactionOptions));
71
+ },
72
+ },
73
+ query: {
74
+ async $allOperations({ model, args, query }) {
75
+ const context = resolveContext(model);
76
+ if (!context)
77
+ return query(args);
78
+ // A batch binds the original PrismaPromise to the same connection.
79
+ // Global models can also load tenant relations: scope every query.
80
+ const operation = query(args);
81
+ const [, result] = await base.$transaction([
82
+ base.$executeRawUnsafe(...sessionConfig(context)),
83
+ operation,
84
+ ]);
85
+ return result;
86
+ },
87
+ },
88
+ });
89
+ });
90
+ }
91
+ //# sourceMappingURL=extension.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension.js","sourceRoot":"","sources":["../../src/rls/extension.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { GenerateRLSPoliciesOptions } from './types.js';
2
+ /**
3
+ * Generate PostgreSQL Row Level Security DDL statements for a list of tables.
4
+ *
5
+ * @param options - Configuration options for policy generation.
6
+ * @returns Formatted SQL migration string containing DDL statements.
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * const sql = generateRLSPolicies({
11
+ * models: ['Poll', 'MemberProfile'],
12
+ * tenantField: 'tenantId',
13
+ * });
14
+ * ```
15
+ */
16
+ export declare function generateRLSPolicies(options: GenerateRLSPoliciesOptions): string;
17
+ //# sourceMappingURL=generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../src/rls/generator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAY7D;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,0BAA0B,GAAG,MAAM,CA0C/E"}
@@ -0,0 +1,47 @@
1
+ import { validateSessionVariables } from './configuration.js';
2
+ /**
3
+ * Escape a PostgreSQL identifier (table name or column name) by wrapping in double quotes.
4
+ */
5
+ function quoteIdentifier(identifier) {
6
+ if (!identifier.trim()) {
7
+ throw new Error('Identifier cannot be empty');
8
+ }
9
+ return `"${identifier.replaceAll('"', '""')}"`;
10
+ }
11
+ /**
12
+ * Generate PostgreSQL Row Level Security DDL statements for a list of tables.
13
+ *
14
+ * @param options - Configuration options for policy generation.
15
+ * @returns Formatted SQL migration string containing DDL statements.
16
+ *
17
+ * @example
18
+ * ```typescript
19
+ * const sql = generateRLSPolicies({
20
+ * models: ['Poll', 'MemberProfile'],
21
+ * tenantField: 'tenantId',
22
+ * });
23
+ * ```
24
+ */
25
+ export function generateRLSPolicies(options) {
26
+ const { models, tenantField = 'tenantId', sessionVariable = 'app.current_tenant_id', bypassVariable, forceRLS = true, } = options;
27
+ if (!models || models.length === 0) {
28
+ return '';
29
+ }
30
+ const quotedTenantField = quoteIdentifier(tenantField);
31
+ validateSessionVariables(sessionVariable, bypassVariable);
32
+ const policyStatements = models.map((model) => {
33
+ const quotedTable = quoteIdentifier(model);
34
+ const policyName = quoteIdentifier(`tenant_isolation_${model}`);
35
+ const condition = bypassVariable
36
+ ? `current_setting('${bypassVariable}', true) = 'true' OR ${quotedTenantField} = NULLIF(current_setting('${sessionVariable}', true), '')`
37
+ : `${quotedTenantField} = NULLIF(current_setting('${sessionVariable}', true), '')`;
38
+ const lines = [`ALTER TABLE ${quotedTable} ENABLE ROW LEVEL SECURITY;`];
39
+ if (forceRLS) {
40
+ lines.push(`ALTER TABLE ${quotedTable} FORCE ROW LEVEL SECURITY;`);
41
+ }
42
+ lines.push(`DROP POLICY IF EXISTS ${policyName} ON ${quotedTable};`, `CREATE POLICY ${policyName} ON ${quotedTable}`, ' FOR ALL', ` USING (${condition})`, ` WITH CHECK (${condition});`);
43
+ return lines.join('\n');
44
+ });
45
+ return policyStatements.join('\n\n');
46
+ }
47
+ //# sourceMappingURL=generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../src/rls/generator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAG9D;;GAEG;AACH,SAAS,eAAe,CAAC,UAAkB;IACzC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,IAAI,UAAU,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC;AACjD,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAmC;IACrE,MAAM,EACJ,MAAM,EACN,WAAW,GAAG,UAAU,EACxB,eAAe,GAAG,uBAAuB,EACzC,cAAc,EACd,QAAQ,GAAG,IAAI,GAChB,GAAG,OAAO,CAAC;IAEZ,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,iBAAiB,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;IACvD,wBAAwB,CAAC,eAAe,EAAE,cAAc,CAAC,CAAC;IAE1D,MAAM,gBAAgB,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAC5C,MAAM,WAAW,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;QAC3C,MAAM,UAAU,GAAG,eAAe,CAAC,oBAAoB,KAAK,EAAE,CAAC,CAAC;QAEhE,MAAM,SAAS,GAAG,cAAc;YAC9B,CAAC,CAAC,oBAAoB,cAAc,wBAAwB,iBAAiB,8BAA8B,eAAe,eAAe;YACzI,CAAC,CAAC,GAAG,iBAAiB,8BAA8B,eAAe,eAAe,CAAC;QAErF,MAAM,KAAK,GAAa,CAAC,eAAe,WAAW,6BAA6B,CAAC,CAAC;QAElF,IAAI,QAAQ,EAAE,CAAC;YACb,KAAK,CAAC,IAAI,CAAC,eAAe,WAAW,4BAA4B,CAAC,CAAC;QACrE,CAAC;QAED,KAAK,CAAC,IAAI,CACR,yBAAyB,UAAU,OAAO,WAAW,GAAG,EACxD,iBAAiB,UAAU,OAAO,WAAW,EAAE,EAC/C,WAAW,EACX,YAAY,SAAS,GAAG,EACxB,iBAAiB,SAAS,IAAI,CAC/B,CAAC;QAEF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,OAAO,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACvC,CAAC"}
@@ -0,0 +1,7 @@
1
+ export { getTenantContext, getTenantId, requireTenantId, runWithBypass, runWithTenant, } from './context.js';
2
+ export { createRLSExtension } from './extension.js';
3
+ export { generateRLSPolicies } from './generator.js';
4
+ export { createRLSMiddleware } from './middleware.js';
5
+ export { withBypass, withTenant } from './testing.js';
6
+ export { type GenerateRLSPoliciesOptions, MissingTenantContextException, RLSConfigurationException, type RLSExtensionOptions, type RLSMiddlewareOptions, type RLSTransactionClient, type RLSTransactionOptions, type TenantContext, type TenantContextExtractor, } from './types.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rls/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,WAAW,EACX,eAAe,EACf,aAAa,EACb,aAAa,GACd,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EACL,KAAK,0BAA0B,EAC/B,6BAA6B,EAC7B,yBAAyB,EACzB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAC1B,KAAK,aAAa,EAClB,KAAK,sBAAsB,GAC5B,MAAM,YAAY,CAAC"}
@@ -0,0 +1,7 @@
1
+ export { getTenantContext, getTenantId, requireTenantId, runWithBypass, runWithTenant, } from './context.js';
2
+ export { createRLSExtension } from './extension.js';
3
+ export { generateRLSPolicies } from './generator.js';
4
+ export { createRLSMiddleware } from './middleware.js';
5
+ export { withBypass, withTenant } from './testing.js';
6
+ export { MissingTenantContextException, RLSConfigurationException, } from './types.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rls/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,WAAW,EACX,eAAe,EACf,aAAa,EACb,aAAa,GACd,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAEL,6BAA6B,EAC7B,yBAAyB,GAO1B,MAAM,YAAY,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { MiddlewareHandler } from 'hono';
2
+ import { type RLSMiddlewareOptions } from './types.js';
3
+ /**
4
+ * Create Hono middleware that resolves the active TenantContext and binds it to AsyncLocalStorage.
5
+ *
6
+ * @param options - Configuration options for tenant extraction and unauthenticated behavior.
7
+ * @returns Hono middleware handler.
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * app.use('*', createRLSMiddleware({
12
+ * allowUnauthenticated: true,
13
+ * }));
14
+ * ```
15
+ */
16
+ export declare function createRLSMiddleware(options?: RLSMiddlewareOptions): MiddlewareHandler;
17
+ //# sourceMappingURL=middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/rls/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAEvD,OAAO,EAEL,KAAK,oBAAoB,EAE1B,MAAM,YAAY,CAAC;AA2BpB;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,oBAAyB,GAAG,iBAAiB,CAezF"}
@@ -0,0 +1,51 @@
1
+ import { runWithTenant } from './context.js';
2
+ import { MissingTenantContextException, } from './types.js';
3
+ /**
4
+ * Default tenant extractor that checks for `tenantId` in `c.get('user')` or `c.get('auth')`.
5
+ */
6
+ function defaultTenantExtractor(c) {
7
+ const user = c.get('user');
8
+ if (user && typeof user.tenantId === 'string' && user.tenantId.length > 0) {
9
+ return {
10
+ tenantId: user.tenantId,
11
+ userId: typeof user.id === 'string' ? user.id : undefined,
12
+ role: typeof user.role === 'string' ? user.role : undefined,
13
+ };
14
+ }
15
+ const auth = c.get('auth');
16
+ if (auth && typeof auth.tenantId === 'string' && auth.tenantId.length > 0) {
17
+ return {
18
+ tenantId: auth.tenantId,
19
+ userId: typeof auth.userId === 'string' ? auth.userId : undefined,
20
+ role: typeof auth.role === 'string' ? auth.role : undefined,
21
+ };
22
+ }
23
+ return undefined;
24
+ }
25
+ /**
26
+ * Create Hono middleware that resolves the active TenantContext and binds it to AsyncLocalStorage.
27
+ *
28
+ * @param options - Configuration options for tenant extraction and unauthenticated behavior.
29
+ * @returns Hono middleware handler.
30
+ *
31
+ * @example
32
+ * ```typescript
33
+ * app.use('*', createRLSMiddleware({
34
+ * allowUnauthenticated: true,
35
+ * }));
36
+ * ```
37
+ */
38
+ export function createRLSMiddleware(options = {}) {
39
+ const { extractTenant = defaultTenantExtractor, allowUnauthenticated = true } = options;
40
+ return async (c, next) => {
41
+ const context = await Promise.resolve(extractTenant(c));
42
+ if (!context?.tenantId) {
43
+ if (allowUnauthenticated) {
44
+ return runWithTenant(undefined, () => next());
45
+ }
46
+ throw new MissingTenantContextException();
47
+ }
48
+ return runWithTenant(context, () => next());
49
+ };
50
+ }
51
+ //# sourceMappingURL=middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../src/rls/middleware.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EACL,6BAA6B,GAG9B,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,SAAS,sBAAsB,CAAC,CAAU;IACxC,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAwC,CAAC;IAClE,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1E,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,MAAM,EAAE,OAAO,IAAI,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;YACzD,IAAI,EAAE,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;SAC5D,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAwC,CAAC;IAClE,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1E,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,MAAM,EAAE,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;YACjE,IAAI,EAAE,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;SAC5D,CAAC;IACJ,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAO,GAAyB,EAAE;IACpE,MAAM,EAAE,aAAa,GAAG,sBAAsB,EAAE,oBAAoB,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IAExF,OAAO,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;QACvB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;QAExD,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC;YACvB,IAAI,oBAAoB,EAAE,CAAC;gBACzB,OAAO,aAAa,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;YAChD,CAAC;YACD,MAAM,IAAI,6BAA6B,EAAE,CAAC;QAC5C,CAAC;QAED,OAAO,aAAa,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9C,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,24 @@
1
+ import type { TenantContext } from './types.js';
2
+ /**
3
+ * Run a test or seed function within a specific tenant context.
4
+ *
5
+ * @param tenantId - The tenant identifier.
6
+ * @param fn - The test function.
7
+ * @returns The resolved return value of `fn`.
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * await withTenant('tenant_cwz', async () => {
12
+ * const polls = await pollService.list();
13
+ * expect(polls).toHaveLength(1);
14
+ * });
15
+ * ```
16
+ */
17
+ export declare function withTenant<T>(tenantId: string, fn: () => T | PromiseLike<T>, options?: Omit<TenantContext, 'tenantId'>): Promise<T>;
18
+ /**
19
+ * Run a test with explicit bypass context.
20
+ *
21
+ * @param fn - The test function.
22
+ */
23
+ export declare function withBypass<T>(fn: () => T | PromiseLike<T>): Promise<T>;
24
+ //# sourceMappingURL=testing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../../src/rls/testing.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAC1B,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,EAC5B,OAAO,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,GACxC,OAAO,CAAC,CAAC,CAAC,CAQZ;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAEtE"}
@@ -0,0 +1,31 @@
1
+ import { runWithBypass, runWithTenant } from './context.js';
2
+ /**
3
+ * Run a test or seed function within a specific tenant context.
4
+ *
5
+ * @param tenantId - The tenant identifier.
6
+ * @param fn - The test function.
7
+ * @returns The resolved return value of `fn`.
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * await withTenant('tenant_cwz', async () => {
12
+ * const polls = await pollService.list();
13
+ * expect(polls).toHaveLength(1);
14
+ * });
15
+ * ```
16
+ */
17
+ export function withTenant(tenantId, fn, options) {
18
+ return runWithTenant({
19
+ tenantId,
20
+ ...options,
21
+ }, fn);
22
+ }
23
+ /**
24
+ * Run a test with explicit bypass context.
25
+ *
26
+ * @param fn - The test function.
27
+ */
28
+ export function withBypass(fn) {
29
+ return runWithBypass(fn);
30
+ }
31
+ //# sourceMappingURL=testing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing.js","sourceRoot":"","sources":["../../src/rls/testing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAG5D;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,UAAU,CACxB,QAAgB,EAChB,EAA4B,EAC5B,OAAyC;IAEzC,OAAO,aAAa,CAClB;QACE,QAAQ;QACR,GAAG,OAAO;KACX,EACD,EAAE,CACH,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAI,EAA4B;IACxD,OAAO,aAAa,CAAC,EAAE,CAAC,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,51 @@
1
+ import type { Context } from 'hono';
2
+ import { type DomainExceptionOptions, ForbiddenException } from '../http/errors.js';
3
+ /** Trusted server context; bypass is an explicit permission, not a secret. */
4
+ export interface TenantContext {
5
+ tenantId?: string;
6
+ userId?: string;
7
+ role?: string;
8
+ bypass?: boolean;
9
+ metadata?: Record<string, unknown>;
10
+ }
11
+ export interface RLSExtensionOptions {
12
+ /** PostgreSQL tenant setting. Default: app.current_tenant_id. */
13
+ sessionVariable?: string;
14
+ /** Optional bypass setting. Only the value 'true' activates matching policies. */
15
+ bypassVariable?: string;
16
+ /** Prisma model names that require context. Default: all models. */
17
+ models?: readonly string[];
18
+ /** Defaults to 'throw'. With 'ignore', PostgreSQL remains responsible for denying access. */
19
+ missingContextBehavior?: 'throw' | 'ignore';
20
+ }
21
+ /** Public Prisma transaction options. */
22
+ export interface RLSTransactionOptions {
23
+ maxWait?: number;
24
+ timeout?: number;
25
+ isolationLevel?: 'ReadUncommitted' | 'ReadCommitted' | 'RepeatableRead' | 'Serializable';
26
+ }
27
+ export type RLSTransactionClient<TClient> = Omit<TClient, '$connect' | '$disconnect' | '$on' | '$transaction' | '$extends' | '$withTenant'>;
28
+ export type TenantContextExtractor = (context: Context) => TenantContext | undefined | Promise<TenantContext | undefined>;
29
+ export interface RLSMiddlewareOptions {
30
+ extractTenant?: TenantContextExtractor;
31
+ /** Allow public requests without a tenant. Default: true. */
32
+ allowUnauthenticated?: boolean;
33
+ }
34
+ export interface GenerateRLSPoliciesOptions {
35
+ /** SQL table names, respecting Prisma @@map. */
36
+ models: readonly string[];
37
+ /** SQL column name, respecting Prisma @map. Default: tenantId. */
38
+ tenantField?: string;
39
+ sessionVariable?: string;
40
+ /** Only specify for tables that explicitly allow bypass. */
41
+ bypassVariable?: string;
42
+ /** Enforce RLS for the table owner as well. Default: true. */
43
+ forceRLS?: boolean;
44
+ }
45
+ export declare class MissingTenantContextException extends ForbiddenException {
46
+ constructor(modelName?: string, options?: DomainExceptionOptions);
47
+ }
48
+ export declare class RLSConfigurationException extends Error {
49
+ constructor(message: string);
50
+ }
51
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/rls/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,EAAE,KAAK,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEpF,8EAA8E;AAC9E,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,mBAAmB;IAClC,iEAAiE;IACjE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kFAAkF;IAClF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oEAAoE;IACpE,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,6FAA6F;IAC7F,sBAAsB,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;CAC7C;AAED,yCAAyC;AACzC,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,iBAAiB,GAAG,eAAe,GAAG,gBAAgB,GAAG,cAAc,CAAC;CAC1F;AAED,MAAM,MAAM,oBAAoB,CAAC,OAAO,IAAI,IAAI,CAC9C,OAAO,EACP,UAAU,GAAG,aAAa,GAAG,KAAK,GAAG,cAAc,GAAG,UAAU,GAAG,aAAa,CACjF,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG,CACnC,OAAO,EAAE,OAAO,KACb,aAAa,GAAG,SAAS,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAAC;AAEpE,MAAM,WAAW,oBAAoB;IACnC,aAAa,CAAC,EAAE,sBAAsB,CAAC;IACvC,6DAA6D;IAC7D,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,MAAM,WAAW,0BAA0B;IACzC,gDAAgD;IAChD,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,kEAAkE;IAClE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,4DAA4D;IAC5D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,qBAAa,6BAA8B,SAAQ,kBAAkB;IACnE,YAAY,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,sBAAsB,EAQ/D;CACF;AAED,qBAAa,yBAA0B,SAAQ,KAAK;IAClD,YAAY,OAAO,EAAE,MAAM,EAG1B;CACF"}
@@ -0,0 +1,16 @@
1
+ import { ForbiddenException } from '../http/errors.js';
2
+ export class MissingTenantContextException extends ForbiddenException {
3
+ constructor(modelName, options) {
4
+ super(modelName
5
+ ? `Missing tenant context for tenant-scoped model "${modelName}". Operation rejected by RLS guard.`
6
+ : 'Missing tenant context. Operation rejected by RLS guard.', options);
7
+ this.name = 'MissingTenantContextException';
8
+ }
9
+ }
10
+ export class RLSConfigurationException extends Error {
11
+ constructor(message) {
12
+ super(message);
13
+ this.name = 'RLSConfigurationException';
14
+ }
15
+ }
16
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/rls/types.ts"],"names":[],"mappings":"AACA,OAAO,EAA+B,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAwDpF,MAAM,OAAO,6BAA8B,SAAQ,kBAAkB;IACnE,YAAY,SAAkB,EAAE,OAAgC;QAC9D,KAAK,CACH,SAAS;YACP,CAAC,CAAC,mDAAmD,SAAS,qCAAqC;YACnG,CAAC,CAAC,0DAA0D,EAC9D,OAAO,CACR,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,+BAA+B,CAAC;IAC9C,CAAC;CACF;AAED,MAAM,OAAO,yBAA0B,SAAQ,KAAK;IAClD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAC;IAC1C,CAAC;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"uploads.service.d.ts","sourceRoot":"","sources":["../../src/uploads/uploads.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAe5C,MAAM,WAAW,gBAAgB;IAC/B,2EAA2E;IAC3E,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,8CAA8C;IAC9C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,iBAAiB;IAChC,2CAA2C;IAC3C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,iFAAiF;IACjF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,gDAAgD;IAChD,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,yBAAyB;IACxC,6CAA6C;IAC7C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,gDAAgD;IAChD,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,2CAA2C;IAC3C,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,4BAA4B;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,gCAAgC;IAChC,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5C;AAED,MAAM,WAAW,oBAAoB;IACnC,qCAAqC;IACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,qBAAqB;IACrB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,0DAA0D;IAC1D,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AAaD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAW;IAClC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;gBAE3B,MAAM,EAAE,oBAAoB;IAMxC;;;OAGG;IACG,kBAAkB,CAAC,UAAU,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAgBlF;;;;;;OAMG;IACG,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAsB7D;;;;;;OAMG;IACG,oBAAoB,CACxB,QAAQ,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,yBAAyB,CAAC;IAgBrC;;OAEG;IACG,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASjD;;OAEG;IACH,OAAO,CAAC,YAAY;CAGrB"}
1
+ {"version":3,"file":"uploads.service.d.ts","sourceRoot":"","sources":["../../src/uploads/uploads.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAe5C,MAAM,WAAW,gBAAgB;IAC/B,2EAA2E;IAC3E,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,8CAA8C;IAC9C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,iBAAiB;IAChC,2CAA2C;IAC3C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,iFAAiF;IACjF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,gDAAgD;IAChD,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,yBAAyB;IACxC,6CAA6C;IAC7C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,gDAAgD;IAChD,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,2CAA2C;IAC3C,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,4BAA4B;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,gCAAgC;IAChC,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5C;AAED,MAAM,WAAW,oBAAoB;IACnC,qCAAqC;IACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,qBAAqB;IACrB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,0DAA0D;IAC1D,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AAaD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAW;IAClC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IAEvC,YAAY,MAAM,EAAE,oBAAoB,EAIvC;IAED;;;OAGG;IACG,kBAAkB,CAAC,UAAU,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAcjF;IAED;;;;;;OAMG;IACG,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAoB5D;IAED;;;;;;OAMG;IACG,oBAAoB,CACxB,QAAQ,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,yBAAyB,CAAC,CAcpC;IAED;;OAEG;IACG,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAOhD;IAED;;OAEG;IACH,OAAO,CAAC,YAAY;CAGrB"}
@@ -1 +1 @@
1
- {"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../src/uploads/validators.ts"],"names":[],"mappings":"AAmBA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,iBAAiB,GAAI,mBAAmB,SAAS,MAAM,EAAE,EAAE,eAAe,MAAM,6LAwC1F,CAAC;AAEJ;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,qBAAqB,GAChC,mBAAmB,SAAS,MAAM,EAAE,EACpC,eAAe,MAAM,0IAoBpB,CAAC"}
1
+ {"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../src/uploads/validators.ts"],"names":[],"mappings":"AAmBA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,iBAAiB,sBAAuB,SAAS,MAAM,EAAE,iBAAiB,MAAM,6LAwC1F,CAAC;AAEJ;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,qBAAqB,sBACb,SAAS,MAAM,EAAE,iBACrB,MAAM,0IAoBpB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"serialize-prisma-types.js","sourceRoot":"","sources":["../../src/utils/serialize-prisma-types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"serialize-prisma-types.js","sourceRoot":"","sources":["../../src/utils/serialize-prisma-types.ts"],"names":[],"mappings":"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"}