glasswork 1.0.0 → 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 (198) hide show
  1. package/CHANGELOG.md +23 -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 +29 -5
  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 +16 -0
  111. package/dist/list-query/filter-value-schemas.d.ts.map +1 -0
  112. package/dist/list-query/filter-value-schemas.js +56 -0
  113. package/dist/list-query/filter-value-schemas.js.map +1 -0
  114. package/dist/list-query/index.d.ts +5 -2
  115. package/dist/list-query/index.d.ts.map +1 -1
  116. package/dist/list-query/index.js +5 -2
  117. package/dist/list-query/index.js.map +1 -1
  118. package/dist/list-query/parse-filter-values.d.ts +21 -0
  119. package/dist/list-query/parse-filter-values.d.ts.map +1 -0
  120. package/dist/list-query/parse-filter-values.js +177 -0
  121. package/dist/list-query/parse-filter-values.js.map +1 -0
  122. package/dist/list-query/parser.d.ts +3 -2
  123. package/dist/list-query/parser.d.ts.map +1 -1
  124. package/dist/list-query/parser.js.map +1 -1
  125. package/dist/list-query/prisma-builder.d.ts.map +1 -1
  126. package/dist/list-query/prisma-builder.js +3 -50
  127. package/dist/list-query/prisma-builder.js.map +1 -1
  128. package/dist/list-query/prisma-executor.d.ts +44 -29
  129. package/dist/list-query/prisma-executor.d.ts.map +1 -1
  130. package/dist/list-query/prisma-executor.js +48 -33
  131. package/dist/list-query/prisma-executor.js.map +1 -1
  132. package/dist/list-query/query-schema.d.ts +8 -13
  133. package/dist/list-query/query-schema.d.ts.map +1 -1
  134. package/dist/list-query/query-schema.js +11 -12
  135. package/dist/list-query/query-schema.js.map +1 -1
  136. package/dist/list-query/schema-helpers.d.ts +34 -31
  137. package/dist/list-query/schema-helpers.d.ts.map +1 -1
  138. package/dist/list-query/schema-helpers.js +47 -37
  139. package/dist/list-query/schema-helpers.js.map +1 -1
  140. package/dist/list-query/sort-mapping.d.ts +37 -0
  141. package/dist/list-query/sort-mapping.d.ts.map +1 -0
  142. package/dist/list-query/sort-mapping.js +88 -0
  143. package/dist/list-query/sort-mapping.js.map +1 -0
  144. package/dist/list-query/types.d.ts +3 -10
  145. package/dist/list-query/types.d.ts.map +1 -1
  146. package/dist/list-query/validator.d.ts.map +1 -1
  147. package/dist/list-query/validator.js +28 -10
  148. package/dist/list-query/validator.js.map +1 -1
  149. package/dist/observability/exception-tracking.d.ts.map +1 -1
  150. package/dist/observability/exception-tracking.js.map +1 -1
  151. package/dist/observability/index.d.ts +1 -1
  152. package/dist/observability/index.d.ts.map +1 -1
  153. package/dist/observability/index.js +1 -1
  154. package/dist/observability/index.js.map +1 -1
  155. package/dist/observability/pino-logger.d.ts +0 -28
  156. package/dist/observability/pino-logger.d.ts.map +1 -1
  157. package/dist/observability/pino-logger.js +21 -12
  158. package/dist/observability/pino-logger.js.map +1 -1
  159. package/dist/observability/request-context.d.ts +36 -1
  160. package/dist/observability/request-context.d.ts.map +1 -1
  161. package/dist/observability/request-context.js +43 -0
  162. package/dist/observability/request-context.js.map +1 -1
  163. package/dist/rls/configuration.d.ts +3 -0
  164. package/dist/rls/configuration.d.ts.map +1 -0
  165. package/dist/rls/configuration.js +13 -0
  166. package/dist/rls/configuration.js.map +1 -0
  167. package/dist/rls/context.d.ts +37 -0
  168. package/dist/rls/context.d.ts.map +1 -0
  169. package/dist/rls/context.js +56 -0
  170. package/dist/rls/context.js.map +1 -0
  171. package/dist/rls/extension.d.ts +7 -0
  172. package/dist/rls/extension.d.ts.map +1 -0
  173. package/dist/rls/extension.js +91 -0
  174. package/dist/rls/extension.js.map +1 -0
  175. package/dist/rls/generator.d.ts +17 -0
  176. package/dist/rls/generator.d.ts.map +1 -0
  177. package/dist/rls/generator.js +47 -0
  178. package/dist/rls/generator.js.map +1 -0
  179. package/dist/rls/index.d.ts +7 -0
  180. package/dist/rls/index.d.ts.map +1 -0
  181. package/dist/rls/index.js +7 -0
  182. package/dist/rls/index.js.map +1 -0
  183. package/dist/rls/middleware.d.ts +17 -0
  184. package/dist/rls/middleware.d.ts.map +1 -0
  185. package/dist/rls/middleware.js +51 -0
  186. package/dist/rls/middleware.js.map +1 -0
  187. package/dist/rls/testing.d.ts +24 -0
  188. package/dist/rls/testing.d.ts.map +1 -0
  189. package/dist/rls/testing.js +31 -0
  190. package/dist/rls/testing.js.map +1 -0
  191. package/dist/rls/types.d.ts +51 -0
  192. package/dist/rls/types.d.ts.map +1 -0
  193. package/dist/rls/types.js +16 -0
  194. package/dist/rls/types.js.map +1 -0
  195. package/dist/uploads/uploads.service.d.ts.map +1 -1
  196. package/dist/uploads/validators.d.ts.map +1 -1
  197. package/dist/utils/serialize-prisma-types.js.map +1 -1
  198. package/package.json +47 -34
@@ -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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "glasswork",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "description": "A transparent, Lambda-optimized web framework for building OpenAPI-compliant REST APIs.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -51,6 +51,16 @@
51
51
  "import": "./dist/observability/index.js",
52
52
  "default": "./dist/observability/index.js"
53
53
  },
54
+ "./rls": {
55
+ "types": "./dist/rls/index.d.ts",
56
+ "import": "./dist/rls/index.js",
57
+ "default": "./dist/rls/index.js"
58
+ },
59
+ "./audit": {
60
+ "types": "./dist/audit/index.d.ts",
61
+ "import": "./dist/audit/index.js",
62
+ "default": "./dist/audit/index.js"
63
+ },
54
64
  "./package.json": "./package.json"
55
65
  },
56
66
  "files": [
@@ -88,15 +98,16 @@
88
98
  "homepage": "https://github.com/rolandboon/glasswork#readme",
89
99
  "scripts": {
90
100
  "build": "tsc",
101
+ "build:scripts": "tsc -p tsconfig.scripts.json",
91
102
  "dev": "tsc --watch",
92
- "test": "vitest run",
93
- "test:coverage": "vitest run --coverage",
103
+ "test": "prisma generate --schema test/rls/fixtures/schema.prisma && vitest run",
104
+ "test:coverage": "prisma generate --schema test/rls/fixtures/schema.prisma && vitest run --coverage",
94
105
  "lint": "biome check . --write",
95
106
  "lint:ci": "biome check .",
96
- "typecheck": "tsc --noEmit",
107
+ "typecheck": "prisma generate --schema test/rls/fixtures/schema.prisma && tsc --noEmit && tsc --noEmit -p tsconfig.rls-tests.json && tsc --noEmit -p tsconfig.scripts.json",
97
108
  "typecheck:strict": "tsc --noEmit -p tsconfig.strict.json",
98
- "smoke:pack": "node scripts/smoke-pack-consumer.mjs",
99
- "verify": "pnpm run typecheck && pnpm run lint:ci && pnpm run build && pnpm run test && pnpm run smoke:pack",
109
+ "smoke:pack": "npm run build:scripts && node .scripts/smoke-pack-consumer.js",
110
+ "verify": "npm run typecheck && npm run lint:ci && npm run build && npm run test && npm run smoke:pack",
100
111
  "prepublishOnly": "npm run verify",
101
112
  "docs:dev": "vitepress dev docs",
102
113
  "docs:build": "vitepress build docs",
@@ -174,43 +185,45 @@
174
185
  }
175
186
  },
176
187
  "devDependencies": {
177
- "@aws-sdk/client-cloudwatch": "^3.1065.0",
178
- "@aws-sdk/client-dynamodb": "^3.1065.0",
179
- "@aws-sdk/client-s3": "^3.1065.0",
180
- "@aws-sdk/client-scheduler": "^3.1064.0",
181
- "@aws-sdk/client-sesv2": "^3.1064.0",
182
- "@aws-sdk/client-sqs": "^3.1064.0",
183
- "@aws-sdk/client-ssm": "^3.1064.0",
184
- "@aws-sdk/lib-dynamodb": "^3.1065.0",
185
- "@aws-sdk/s3-request-presigner": "^3.1065.0",
186
- "@biomejs/biome": "^2.4.16",
187
- "@casl/ability": "^7.0.0",
188
- "@casl/prisma": "^2.0.1",
188
+ "@aws-sdk/client-cloudwatch": "^3.1128.0",
189
+ "@aws-sdk/client-dynamodb": "^3.1128.0",
190
+ "@aws-sdk/client-s3": "^3.1128.0",
191
+ "@aws-sdk/client-scheduler": "^3.1128.0",
192
+ "@aws-sdk/client-sesv2": "^3.1128.0",
193
+ "@aws-sdk/client-sqs": "^3.1128.0",
194
+ "@aws-sdk/client-ssm": "^3.1128.0",
195
+ "@aws-sdk/lib-dynamodb": "^3.1128.0",
196
+ "@aws-sdk/s3-request-presigner": "^3.1128.0",
197
+ "@biomejs/biome": "^2.5.12",
198
+ "@casl/ability": "^7.0.1",
199
+ "@casl/prisma": "^2.0.2",
189
200
  "@hono/swagger-ui": "^0.6.1",
190
- "@prisma/client": "^7.8.0",
191
- "@types/aws-lambda": "^8.10.162",
192
- "@types/node": "^24.13.1",
193
- "@vitest/coverage-v8": "^4.1.8",
194
- "awilix": "^13.0.3",
201
+ "@prisma/adapter-pg": "7.10.0",
202
+ "@prisma/client": "^7.10.0",
203
+ "@types/aws-lambda": "^8.10.163",
204
+ "@types/node": "^26.5.0",
205
+ "@vitest/coverage-v8": "^4.1.11",
206
+ "awilix": "^13.0.5",
195
207
  "dotenv": "^17.4.2",
196
- "hono": "^4.12.25",
197
- "hono-openapi": "^1.3.0",
198
- "mermaid": "^11.15.0",
199
- "mjml": "^5.3.0",
200
- "typescript": "^5.9.3",
201
- "valibot": "^1.4.1",
208
+ "hono": "^4.13.7",
209
+ "hono-openapi": "^1.3.2",
210
+ "mermaid": "^11.17.2",
211
+ "mjml": "^5.4.0",
212
+ "prisma": "7.10.0",
213
+ "typescript": "^7.0.2",
214
+ "valibot": "^1.4.2",
202
215
  "vitepress": "^1.6.4",
203
- "vitepress-plugin-llms": "^1.13.1",
216
+ "vitepress-plugin-llms": "^1.13.5",
204
217
  "vitepress-plugin-mermaid": "^2.0.17",
205
- "vitest": "^4.1.8",
206
- "vue": "^3.5.35"
218
+ "vitest": "^4.1.11",
219
+ "vue": "^3.5.42"
207
220
  },
208
221
  "dependencies": {
209
- "@hono/standard-validator": "^0.2.2",
222
+ "@hono/standard-validator": "^0.2.3",
210
223
  "@hono/valibot-validator": "^0.6.1",
211
224
  "@valibot/to-json-schema": "^1.7.1",
212
225
  "deepmerge": "^4.3.1",
213
- "nanoid": "^5.1.11",
226
+ "nanoid": "^5.1.16",
214
227
  "openapi-types": "^12.1.3"
215
228
  }
216
229
  }