@geekmidas/constructs 0.1.0 → 0.2.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 (182) hide show
  1. package/dist/{AWSLambdaFunction-DCh1tOhB.d.mts → AWSLambdaFunction-D9RZhm0N.d.mts} +3 -3
  2. package/dist/{AWSLambdaSubscriberAdaptor-DtNZPMoV.d.mts → AWSLambdaSubscriberAdaptor-C0aZBU64.d.mts} +2 -2
  3. package/dist/{AmazonApiGatewayEndpointAdaptor-CPqlw2Rx.cjs → AmazonApiGatewayEndpointAdaptor-Bk6ssx3K.cjs} +38 -25
  4. package/dist/AmazonApiGatewayEndpointAdaptor-Bk6ssx3K.cjs.map +1 -0
  5. package/dist/{AmazonApiGatewayEndpointAdaptor-TP_hLNAa.d.cts → AmazonApiGatewayEndpointAdaptor-CbJqLU6I.d.cts} +2 -2
  6. package/dist/{AmazonApiGatewayEndpointAdaptor-BaTM2TNu.d.mts → AmazonApiGatewayEndpointAdaptor-DC3N7zY_.d.mts} +3 -3
  7. package/dist/{AmazonApiGatewayEndpointAdaptor-Cm4iD199.mjs → AmazonApiGatewayEndpointAdaptor-pEWzF2uY.mjs} +38 -25
  8. package/dist/AmazonApiGatewayEndpointAdaptor-pEWzF2uY.mjs.map +1 -0
  9. package/dist/{AmazonApiGatewayV1EndpointAdaptor-B2ZpUFiC.d.mts → AmazonApiGatewayV1EndpointAdaptor-BVxgQ-7J.d.mts} +4 -4
  10. package/dist/{AmazonApiGatewayV1EndpointAdaptor-CConfCqz.d.cts → AmazonApiGatewayV1EndpointAdaptor-CVwJ5k16.d.cts} +3 -3
  11. package/dist/{AmazonApiGatewayV1EndpointAdaptor-D38HuQa9.mjs → AmazonApiGatewayV1EndpointAdaptor-MJpRbIaQ.mjs} +2 -2
  12. package/dist/{AmazonApiGatewayV1EndpointAdaptor-D38HuQa9.mjs.map → AmazonApiGatewayV1EndpointAdaptor-MJpRbIaQ.mjs.map} +1 -1
  13. package/dist/{AmazonApiGatewayV1EndpointAdaptor-tjpvLBRb.cjs → AmazonApiGatewayV1EndpointAdaptor-uBp_4zLf.cjs} +2 -2
  14. package/dist/{AmazonApiGatewayV1EndpointAdaptor-tjpvLBRb.cjs.map → AmazonApiGatewayV1EndpointAdaptor-uBp_4zLf.cjs.map} +1 -1
  15. package/dist/{AmazonApiGatewayV2EndpointAdaptor-DurJvFwa.d.cts → AmazonApiGatewayV2EndpointAdaptor-1oBZdQH3.d.cts} +3 -3
  16. package/dist/{AmazonApiGatewayV2EndpointAdaptor-BwMQInBi.d.mts → AmazonApiGatewayV2EndpointAdaptor-C3H8Hpv7.d.mts} +4 -4
  17. package/dist/{AmazonApiGatewayV2EndpointAdaptor-ByYtiJtN.mjs → AmazonApiGatewayV2EndpointAdaptor-ChO8BlDz.mjs} +2 -2
  18. package/dist/{AmazonApiGatewayV2EndpointAdaptor-ByYtiJtN.mjs.map → AmazonApiGatewayV2EndpointAdaptor-ChO8BlDz.mjs.map} +1 -1
  19. package/dist/{AmazonApiGatewayV2EndpointAdaptor-DcJ_w3ro.cjs → AmazonApiGatewayV2EndpointAdaptor-I1W23Nvn.cjs} +2 -2
  20. package/dist/{AmazonApiGatewayV2EndpointAdaptor-DcJ_w3ro.cjs.map → AmazonApiGatewayV2EndpointAdaptor-I1W23Nvn.cjs.map} +1 -1
  21. package/dist/{Authorizer-D1w7MpK6.d.mts → Authorizer-Cpx59w_q.d.mts} +1 -1
  22. package/dist/{BaseFunctionBuilder-Oc2xmxmg.d.mts → BaseFunctionBuilder-CoV7J45W.d.mts} +2 -2
  23. package/dist/{Construct-DCPATqec.d.mts → Construct-jBKqb-Zi.d.mts} +1 -1
  24. package/dist/Construct.d.mts +1 -1
  25. package/dist/{Cron-DPEcDCDW.d.mts → Cron-JZkp_fHy.d.mts} +2 -2
  26. package/dist/{CronBuilder-CxKTiepV.d.mts → CronBuilder-BmFDO0Dm.d.mts} +4 -4
  27. package/dist/{Endpoint-DbPsw13b.mjs → Endpoint-B70_KKhu.mjs} +8 -2
  28. package/dist/Endpoint-B70_KKhu.mjs.map +1 -0
  29. package/dist/{Endpoint-CA-byrDr.cjs → Endpoint-BJo9Hhwm.cjs} +8 -2
  30. package/dist/Endpoint-BJo9Hhwm.cjs.map +1 -0
  31. package/dist/{Endpoint-DoY1Owv2.d.mts → Endpoint-C5djXyae.d.mts} +69 -6
  32. package/dist/{Endpoint-BJPJTGjV.d.cts → Endpoint-CC2RGjkl.d.cts} +66 -3
  33. package/dist/{EndpointBuilder-BJRkivxQ.d.mts → EndpointBuilder-CD8LkBda.d.mts} +42 -5
  34. package/dist/{EndpointBuilder-Bhyft7WY.cjs → EndpointBuilder-DeswNQdG.cjs} +55 -3
  35. package/dist/EndpointBuilder-DeswNQdG.cjs.map +1 -0
  36. package/dist/{EndpointBuilder-69uVrKZL.mjs → EndpointBuilder-FyyoFTJ5.mjs} +55 -3
  37. package/dist/{EndpointBuilder-Bhyft7WY.cjs.map → EndpointBuilder-FyyoFTJ5.mjs.map} +1 -1
  38. package/dist/{EndpointBuilder-CQ-jOXsD.d.cts → EndpointBuilder-vXk6eIJk.d.cts} +39 -2
  39. package/dist/{EndpointFactory-DgwmAR_8.d.cts → EndpointFactory-3g-7Rznt.d.cts} +30 -8
  40. package/dist/{EndpointFactory-BKEPcQgE.d.mts → EndpointFactory-DaFR9LQG.d.mts} +31 -9
  41. package/dist/{EndpointFactory-BcVbkrxf.cjs → EndpointFactory-DcT_g9M_.cjs} +63 -14
  42. package/dist/EndpointFactory-DcT_g9M_.cjs.map +1 -0
  43. package/dist/{EndpointFactory-ARUlRlyM.mjs → EndpointFactory-KJAjBWmO.mjs} +63 -14
  44. package/dist/EndpointFactory-KJAjBWmO.mjs.map +1 -0
  45. package/dist/{Function-Dthlh2Fb.d.mts → Function-Vh1t-Qjj.d.mts} +2 -2
  46. package/dist/{FunctionBuilder-CZFBLfdV.d.mts → FunctionBuilder-3jsoFffg.d.mts} +4 -4
  47. package/dist/{FunctionExecutionWrapper-CfuajSB5.d.mts → FunctionExecutionWrapper-CI3CaoCo.d.mts} +2 -2
  48. package/dist/{HonoEndpointAdaptor-sSG85VER.d.cts → HonoEndpointAdaptor-BJh4J-J9.d.cts} +2 -2
  49. package/dist/{HonoEndpointAdaptor-BmB4Sc7L.mjs → HonoEndpointAdaptor-CcvXzoYV.mjs} +41 -28
  50. package/dist/HonoEndpointAdaptor-CcvXzoYV.mjs.map +1 -0
  51. package/dist/{HonoEndpointAdaptor-CnqR6PSB.cjs → HonoEndpointAdaptor-DodwLM0-.cjs} +41 -28
  52. package/dist/HonoEndpointAdaptor-DodwLM0-.cjs.map +1 -0
  53. package/dist/{HonoEndpointAdaptor-DBjipl6Q.d.mts → HonoEndpointAdaptor-kb1ByjUL.d.mts} +5 -5
  54. package/dist/{Subscriber-DvOtIyWq.cjs → Subscriber-DOt3svUC.cjs} +1 -1
  55. package/dist/{Subscriber-DvOtIyWq.cjs.map → Subscriber-DOt3svUC.cjs.map} +1 -1
  56. package/dist/{Subscriber-BfxLwZpX.d.mts → Subscriber-aNr1qkxR.d.mts} +2 -2
  57. package/dist/{Subscriber-JzcFFi4p.mjs → Subscriber-kCHbH2fZ.mjs} +1 -1
  58. package/dist/{Subscriber-JzcFFi4p.mjs.map → Subscriber-kCHbH2fZ.mjs.map} +1 -1
  59. package/dist/{SubscriberBuilder-lTiTUS1o.d.mts → SubscriberBuilder-CWS4tdbp.d.mts} +2 -2
  60. package/dist/{SubscriberBuilder-DUuV207i.cjs → SubscriberBuilder-Cj2u9k5Q.cjs} +2 -2
  61. package/dist/{SubscriberBuilder-DUuV207i.cjs.map → SubscriberBuilder-Cj2u9k5Q.cjs.map} +1 -1
  62. package/dist/{SubscriberBuilder-tm4oVOt3.mjs → SubscriberBuilder-DmxMU89X.mjs} +2 -2
  63. package/dist/{SubscriberBuilder-tm4oVOt3.mjs.map → SubscriberBuilder-DmxMU89X.mjs.map} +1 -1
  64. package/dist/{TestEndpointAdaptor-o7JbNcL-.mjs → TestEndpointAdaptor-1pPixE6y.mjs} +2 -2
  65. package/dist/{TestEndpointAdaptor-o7JbNcL-.mjs.map → TestEndpointAdaptor-1pPixE6y.mjs.map} +1 -1
  66. package/dist/{TestEndpointAdaptor-CGQVysE0.d.mts → TestEndpointAdaptor-5-unBV8O.d.mts} +3 -3
  67. package/dist/{TestEndpointAdaptor-CJO-og9U.d.cts → TestEndpointAdaptor-Bm0UjDtV.d.cts} +2 -2
  68. package/dist/{TestEndpointAdaptor-BtLcw4JW.cjs → TestEndpointAdaptor-wA-fmq4v.cjs} +2 -2
  69. package/dist/{TestEndpointAdaptor-BtLcw4JW.cjs.map → TestEndpointAdaptor-wA-fmq4v.cjs.map} +1 -1
  70. package/dist/adaptors/aws.cjs +4 -4
  71. package/dist/adaptors/aws.d.cts +4 -4
  72. package/dist/adaptors/aws.d.mts +15 -15
  73. package/dist/adaptors/aws.mjs +4 -4
  74. package/dist/adaptors/hono.cjs +3 -3
  75. package/dist/adaptors/hono.d.cts +2 -2
  76. package/dist/adaptors/hono.d.mts +9 -9
  77. package/dist/adaptors/hono.mjs +3 -3
  78. package/dist/adaptors/testing.cjs +2 -2
  79. package/dist/adaptors/testing.d.cts +2 -2
  80. package/dist/adaptors/testing.d.mts +9 -9
  81. package/dist/adaptors/testing.mjs +2 -2
  82. package/dist/crons/Cron.d.mts +6 -6
  83. package/dist/crons/CronBuilder.d.mts +7 -7
  84. package/dist/crons/index.d.mts +7 -7
  85. package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.cjs +2 -2
  86. package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.d.cts +2 -2
  87. package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.d.mts +9 -9
  88. package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.mjs +2 -2
  89. package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.cjs +3 -3
  90. package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.d.cts +3 -3
  91. package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.d.mts +10 -10
  92. package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.mjs +3 -3
  93. package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.cjs +3 -3
  94. package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.d.cts +3 -3
  95. package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.d.mts +10 -10
  96. package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.mjs +3 -3
  97. package/dist/endpoints/Authorizer.d.mts +1 -1
  98. package/dist/endpoints/Endpoint.cjs +1 -1
  99. package/dist/endpoints/Endpoint.d.cts +1 -1
  100. package/dist/endpoints/Endpoint.d.mts +8 -8
  101. package/dist/endpoints/Endpoint.mjs +1 -1
  102. package/dist/endpoints/EndpointBuilder.cjs +3 -2
  103. package/dist/endpoints/EndpointBuilder.d.cts +2 -2
  104. package/dist/endpoints/EndpointBuilder.d.mts +9 -9
  105. package/dist/endpoints/EndpointBuilder.mjs +3 -2
  106. package/dist/endpoints/EndpointFactory.cjs +4 -3
  107. package/dist/endpoints/EndpointFactory.d.cts +3 -3
  108. package/dist/endpoints/EndpointFactory.d.mts +10 -10
  109. package/dist/endpoints/EndpointFactory.mjs +4 -3
  110. package/dist/endpoints/HonoEndpointAdaptor.cjs +3 -3
  111. package/dist/endpoints/HonoEndpointAdaptor.d.cts +2 -2
  112. package/dist/endpoints/HonoEndpointAdaptor.d.mts +9 -9
  113. package/dist/endpoints/HonoEndpointAdaptor.mjs +3 -3
  114. package/dist/endpoints/TestEndpointAdaptor.cjs +2 -2
  115. package/dist/endpoints/TestEndpointAdaptor.d.cts +2 -2
  116. package/dist/endpoints/TestEndpointAdaptor.d.mts +9 -9
  117. package/dist/endpoints/TestEndpointAdaptor.mjs +2 -2
  118. package/dist/endpoints/audit.d.cts +1 -1
  119. package/dist/endpoints/audit.d.mts +8 -8
  120. package/dist/endpoints/helpers.cjs +2 -2
  121. package/dist/endpoints/helpers.d.cts +1 -1
  122. package/dist/endpoints/helpers.d.mts +8 -8
  123. package/dist/endpoints/helpers.mjs +2 -2
  124. package/dist/endpoints/index.cjs +5 -3
  125. package/dist/endpoints/index.cjs.map +1 -1
  126. package/dist/endpoints/index.d.cts +5 -5
  127. package/dist/endpoints/index.d.mts +13 -13
  128. package/dist/endpoints/index.mjs +5 -4
  129. package/dist/endpoints/index.mjs.map +1 -1
  130. package/dist/endpoints/processAudits.d.cts +1 -1
  131. package/dist/endpoints/processAudits.d.mts +8 -8
  132. package/dist/endpoints/rls.cjs +3 -0
  133. package/dist/endpoints/rls.d.cts +9 -0
  134. package/dist/endpoints/rls.d.mts +9 -0
  135. package/dist/endpoints/rls.mjs +3 -0
  136. package/dist/functions/AWSLambdaFunction.d.mts +4 -4
  137. package/dist/functions/BaseFunctionBuilder.d.mts +2 -2
  138. package/dist/functions/Function.d.mts +2 -2
  139. package/dist/functions/FunctionBuilder.d.mts +4 -4
  140. package/dist/functions/FunctionExecutionWrapper.d.mts +3 -3
  141. package/dist/functions/TestFunctionAdaptor.d.mts +2 -2
  142. package/dist/functions/index.d.mts +5 -5
  143. package/dist/{helpers-CrrdyA04.mjs → helpers-C3B2lVrM.mjs} +2 -2
  144. package/dist/{helpers-CrrdyA04.mjs.map → helpers-C3B2lVrM.mjs.map} +1 -1
  145. package/dist/{helpers-DiPZVJQC.cjs → helpers-DxxSpLfw.cjs} +2 -2
  146. package/dist/{helpers-DiPZVJQC.cjs.map → helpers-DxxSpLfw.cjs.map} +1 -1
  147. package/dist/{index-9gJrM7Rw.d.mts → index-CFyaRrck.d.mts} +2 -2
  148. package/dist/index.d.mts +2 -2
  149. package/dist/publisher.d.mts +1 -1
  150. package/dist/rls-Bf3FRwto.mjs +9 -0
  151. package/dist/rls-Bf3FRwto.mjs.map +1 -0
  152. package/dist/rls-CmJ7bRsz.cjs +15 -0
  153. package/dist/rls-CmJ7bRsz.cjs.map +1 -0
  154. package/dist/subscribers/AWSLambdaSubscriberAdaptor.d.mts +3 -3
  155. package/dist/subscribers/Subscriber.cjs +1 -1
  156. package/dist/subscribers/Subscriber.d.mts +2 -2
  157. package/dist/subscribers/Subscriber.mjs +1 -1
  158. package/dist/subscribers/SubscriberBuilder.cjs +2 -2
  159. package/dist/subscribers/SubscriberBuilder.d.mts +3 -3
  160. package/dist/subscribers/SubscriberBuilder.mjs +2 -2
  161. package/dist/subscribers/index.cjs +2 -2
  162. package/dist/subscribers/index.d.mts +3 -3
  163. package/dist/subscribers/index.mjs +2 -2
  164. package/dist/{types-Cy1IhmUB.d.mts → types-CScirkHt.d.mts} +1 -1
  165. package/dist/types.d.mts +1 -1
  166. package/package.json +6 -5
  167. package/src/endpoints/AmazonApiGatewayEndpointAdaptor.ts +57 -26
  168. package/src/endpoints/Endpoint.ts +19 -0
  169. package/src/endpoints/EndpointBuilder.ts +57 -0
  170. package/src/endpoints/EndpointFactory.ts +119 -12
  171. package/src/endpoints/HonoEndpointAdaptor.ts +66 -37
  172. package/src/endpoints/index.ts +7 -0
  173. package/src/endpoints/rls.ts +67 -0
  174. package/dist/AmazonApiGatewayEndpointAdaptor-CPqlw2Rx.cjs.map +0 -1
  175. package/dist/AmazonApiGatewayEndpointAdaptor-Cm4iD199.mjs.map +0 -1
  176. package/dist/Endpoint-CA-byrDr.cjs.map +0 -1
  177. package/dist/Endpoint-DbPsw13b.mjs.map +0 -1
  178. package/dist/EndpointBuilder-69uVrKZL.mjs.map +0 -1
  179. package/dist/EndpointFactory-ARUlRlyM.mjs.map +0 -1
  180. package/dist/EndpointFactory-BcVbkrxf.cjs.map +0 -1
  181. package/dist/HonoEndpointAdaptor-BmB4Sc7L.mjs.map +0 -1
  182. package/dist/HonoEndpointAdaptor-CnqR6PSB.cjs.map +0 -1
@@ -1,8 +1,9 @@
1
1
  const require_chunk = require('./chunk-CUT6urMc.cjs');
2
2
  const require_Construct = require('./Construct-BYSPikVm.cjs');
3
3
  const require_BaseFunctionBuilder = require('./BaseFunctionBuilder-C5Se7pdL.cjs');
4
- const require_Endpoint = require('./Endpoint-CA-byrDr.cjs');
4
+ const require_Endpoint = require('./Endpoint-BJo9Hhwm.cjs');
5
5
  const require_Authorizer = require('./Authorizer-C0ge_tc8.cjs');
6
+ const require_rls = require('./rls-CmJ7bRsz.cjs');
6
7
  const lodash_uniqby = require_chunk.__toESM(require("lodash.uniqby"));
7
8
 
8
9
  //#region src/endpoints/EndpointBuilder.ts
@@ -20,6 +21,8 @@ var EndpointBuilder = class extends require_BaseFunctionBuilder.BaseFunctionBuil
20
21
  _actorExtractor;
21
22
  _audits = [];
22
23
  _customSecuritySchemes = {};
24
+ _rlsConfig;
25
+ _rlsBypass;
23
26
  constructor(route, method) {
24
27
  super(require_Construct.ConstructType.Endpoint);
25
28
  this.route = route;
@@ -159,6 +162,53 @@ var EndpointBuilder = class extends require_BaseFunctionBuilder.BaseFunctionBuil
159
162
  this._databaseService = service;
160
163
  return this;
161
164
  }
165
+ /**
166
+ * Configure RLS (Row-Level Security) context for this endpoint.
167
+ * Pass `false` or `RLS_BYPASS` to explicitly bypass RLS for this endpoint.
168
+ *
169
+ * @example
170
+ * ```typescript
171
+ * // Custom RLS config for this endpoint
172
+ * .rls({
173
+ * extractor: ({ session }) => ({
174
+ * user_id: session.userId,
175
+ * tenant_id: session.tenantId,
176
+ * }),
177
+ * prefix: 'app',
178
+ * })
179
+ *
180
+ * // Bypass RLS (for admin endpoints)
181
+ * .rls(false)
182
+ * ```
183
+ */
184
+ rls(config) {
185
+ if (config === false || config === require_rls.RLS_BYPASS) {
186
+ this._rlsBypass = true;
187
+ this._rlsConfig = void 0;
188
+ } else {
189
+ this._rlsConfig = config;
190
+ this._rlsBypass = false;
191
+ }
192
+ return this;
193
+ }
194
+ /**
195
+ * Explicitly bypass RLS for this endpoint.
196
+ * Useful for admin operations that need unrestricted database access.
197
+ *
198
+ * @example
199
+ * ```typescript
200
+ * .rlsBypass()
201
+ * .handle(async ({ db }) => {
202
+ * // Full access, no RLS filtering
203
+ * return db.selectFrom('orders').selectAll().execute();
204
+ * })
205
+ * ```
206
+ */
207
+ rlsBypass() {
208
+ this._rlsBypass = true;
209
+ this._rlsConfig = void 0;
210
+ return this;
211
+ }
162
212
  input(_schema) {
163
213
  throw new Error("EndpointBuilder does not support generic input. Use body(), query(), or params() instead.");
164
214
  }
@@ -197,7 +247,9 @@ var EndpointBuilder = class extends require_BaseFunctionBuilder.BaseFunctionBuil
197
247
  auditorStorageService: this._auditorStorage,
198
248
  actorExtractor: this._actorExtractor,
199
249
  audits: this._audits,
200
- databaseService: this._databaseService
250
+ databaseService: this._databaseService,
251
+ rlsConfig: this._rlsConfig,
252
+ rlsBypass: this._rlsBypass
201
253
  });
202
254
  }
203
255
  };
@@ -209,4 +261,4 @@ Object.defineProperty(exports, 'EndpointBuilder', {
209
261
  return EndpointBuilder;
210
262
  }
211
263
  });
212
- //# sourceMappingURL=EndpointBuilder-Bhyft7WY.cjs.map
264
+ //# sourceMappingURL=EndpointBuilder-DeswNQdG.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EndpointBuilder-DeswNQdG.cjs","names":["BaseFunctionBuilder","route: TRoute","method: TMethod","ConstructType","publisher: Service<TEventPublisherServiceName, TEventPublisher>","storage: Service<TAuditStorageServiceName, TAuditStorage>","service: Service<TDatabaseServiceName, TDatabase>","description: string","status: SuccessStatus","event: TEvent","tags: string[]","memorySize: number","publisher: Service<TName, T>","schema: T","config: RateLimitConfig","name: TAuthorizers[number] | 'none'","services: T","logger: T","storage: Service<TName, T>","extractor: ActorExtractor<TServices, TSession, TLogger>","audits: MappedAudit<TAuditAction, OutSchema>[]","service: Service<TName, T>","config: RlsConfig<TServices, TSession, TLogger> | false | RlsBypass","RLS_BYPASS","_schema: any","fn: EndpointHandler<\n TInput,\n TServices,\n TLogger,\n OutSchema,\n TSession,\n TDatabase,\n TAuditStorage,\n TAuditAction\n >","authorizer: Authorizer | undefined","Endpoint"],"sources":["../src/endpoints/EndpointBuilder.ts"],"sourcesContent":["import type {\n AuditStorage,\n AuditableAction,\n ExtractStorageAuditAction,\n} from '@geekmidas/audit';\nimport type { EventPublisher, MappedEvent } from '@geekmidas/events';\nimport type { Logger } from '@geekmidas/logger';\nimport type { RateLimitConfig } from '@geekmidas/rate-limit';\nimport type { Service } from '@geekmidas/services';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport uniqBy from 'lodash.uniqby';\nimport { ConstructType } from '../Construct';\nimport { BaseFunctionBuilder } from '../functions';\nimport type { HttpMethod } from '../types';\nimport type { Authorizer, SecurityScheme } from './Authorizer';\nimport { getSecurityScheme } from './Authorizer';\nimport { Endpoint, type EndpointSchemas } from './Endpoint';\nimport type {\n AuthorizeFn,\n EndpointHandler,\n SessionFn,\n SuccessStatus,\n} from './Endpoint';\nimport type { ActorExtractor, MappedAudit } from './audit';\nimport type { RlsBypass, RlsConfig } from './rls';\nimport { RLS_BYPASS } from './rls';\n\nexport class EndpointBuilder<\n TRoute extends string,\n TMethod extends HttpMethod,\n TInput extends EndpointSchemas = {},\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n OutSchema extends StandardSchemaV1 | undefined = undefined,\n TSession = unknown,\n TEventPublisher extends EventPublisher<any> | undefined = undefined,\n TEventPublisherServiceName extends string = string,\n TAuthorizers extends readonly string[] = readonly string[],\n TAuditStorage extends AuditStorage | undefined = undefined,\n TAuditStorageServiceName extends string = string,\n TAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n string,\n unknown\n >,\n TDatabase = undefined,\n TDatabaseServiceName extends string = string,\n> extends BaseFunctionBuilder<\n TInput,\n OutSchema,\n TServices,\n TLogger,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuditStorage,\n TAuditStorageServiceName,\n TDatabase,\n TDatabaseServiceName\n> {\n protected schemas: TInput = {} as TInput;\n protected _description?: string;\n protected _status?: SuccessStatus;\n protected _tags?: string[];\n protected _memorySize?: number;\n _getSession: SessionFn<TServices, TLogger, TSession, TDatabase> = () =>\n ({}) as TSession;\n _authorize: AuthorizeFn<TServices, TLogger, TSession> = () => true;\n _rateLimit?: RateLimitConfig;\n _availableAuthorizers: Authorizer[] = [];\n _authorizerName?: TAuthorizers[number];\n _actorExtractor?: ActorExtractor<TServices, TSession, TLogger>;\n _audits: MappedAudit<TAuditAction, OutSchema>[] = [];\n _customSecuritySchemes: Record<string, SecurityScheme> = {};\n _rlsConfig?: RlsConfig<TServices, TSession, TLogger>;\n _rlsBypass?: boolean;\n\n constructor(\n readonly route: TRoute,\n readonly method: TMethod,\n ) {\n super(ConstructType.Endpoint);\n }\n\n // Internal setter for EndpointFactory to set default publisher\n _setPublisher(\n publisher: Service<TEventPublisherServiceName, TEventPublisher>,\n ) {\n this._publisher = publisher;\n }\n\n // Internal setter for EndpointFactory to set default auditor storage\n _setAuditorStorage(\n storage: Service<TAuditStorageServiceName, TAuditStorage>,\n ) {\n this._auditorStorage = storage;\n }\n\n // Internal setter for EndpointFactory to set default database service\n _setDatabaseService(service: Service<TDatabaseServiceName, TDatabase>) {\n this._databaseService = service;\n }\n\n description(description: string): this {\n this._description = description;\n return this;\n }\n\n status(status: SuccessStatus): this {\n this._status = status;\n return this;\n }\n\n event<TEvent extends MappedEvent<TEventPublisher, OutSchema>>(\n event: TEvent,\n ): this {\n this._events.push(event);\n return this;\n }\n\n tags(tags: string[]): this {\n this._tags = tags;\n return this;\n }\n\n memorySize(memorySize: number): this {\n this._memorySize = memorySize;\n return this;\n }\n\n publisher<T extends EventPublisher<any>, TName extends string>(\n publisher: Service<TName, T>,\n ): EndpointBuilder<\n TRoute,\n TMethod,\n TInput,\n TServices,\n TLogger,\n OutSchema,\n TSession,\n T,\n TName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName\n > {\n this._publisher = publisher as unknown as Service<\n TEventPublisherServiceName,\n TEventPublisher\n >;\n\n return this as unknown as EndpointBuilder<\n TRoute,\n TMethod,\n TInput,\n TServices,\n TLogger,\n OutSchema,\n TSession,\n T,\n TName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName\n >;\n }\n\n body<T extends StandardSchemaV1>(\n schema: T,\n ): EndpointBuilder<\n TRoute,\n TMethod,\n Omit<TInput, 'body'> & { body: T },\n TServices,\n TLogger,\n OutSchema,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName\n > {\n this.schemas.body = schema as unknown as T;\n // @ts-ignore\n return this;\n }\n\n search<T extends StandardSchemaV1>(\n schema: T,\n ): EndpointBuilder<\n TRoute,\n TMethod,\n Omit<TInput, 'query'> & { query: T },\n TServices,\n TLogger,\n OutSchema,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName\n > {\n this.schemas.query = schema as unknown as T;\n // @ts-ignore\n return this;\n }\n\n query<T extends StandardSchemaV1>(\n schema: T,\n ): EndpointBuilder<\n TRoute,\n TMethod,\n Omit<TInput, 'query'> & { query: T },\n TServices,\n TLogger,\n OutSchema,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName\n > {\n return this.search(schema);\n }\n\n params<T extends StandardSchemaV1>(\n schema: T,\n ): EndpointBuilder<\n TRoute,\n TMethod,\n Omit<TInput, 'params'> & { params: T },\n TServices,\n TLogger,\n OutSchema,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName\n > {\n this.schemas.params = schema as unknown as T;\n // @ts-ignore\n return this;\n }\n\n rateLimit(config: RateLimitConfig): this {\n this._rateLimit = config;\n return this;\n }\n\n authorizer(\n name: TAuthorizers[number] | 'none',\n ): EndpointBuilder<\n TRoute,\n TMethod,\n TInput,\n TServices,\n TLogger,\n OutSchema,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName\n > {\n // Special case: 'none' explicitly marks endpoint as having no authorizer\n if (name === 'none') {\n this._authorizerName = undefined;\n return this;\n }\n\n // Validate that the authorizer exists in available authorizers\n const authorizerExists = this._availableAuthorizers.some(\n (a) => a.name === name,\n );\n if (!authorizerExists && this._availableAuthorizers.length > 0) {\n const available = this._availableAuthorizers\n .map((a) => a.name)\n .join(', ');\n throw new Error(\n `Authorizer \"${name as string}\" not found in available authorizers: ${available}`,\n );\n }\n this._authorizerName = name;\n return this;\n }\n\n services<T extends Service[]>(\n services: T,\n ): EndpointBuilder<\n TRoute,\n TMethod,\n TInput,\n [...TServices, ...T],\n TLogger,\n OutSchema,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName\n > {\n this._services = uniqBy(\n [...this._services, ...services],\n (s) => s.serviceName,\n ) as TServices;\n\n return this as unknown as EndpointBuilder<\n TRoute,\n TMethod,\n TInput,\n [...TServices, ...T],\n TLogger,\n OutSchema,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName\n >;\n }\n\n logger<T extends Logger>(\n logger: T,\n ): EndpointBuilder<\n TRoute,\n TMethod,\n TInput,\n TServices,\n T,\n OutSchema,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName\n > {\n this._logger = logger as unknown as TLogger;\n\n return this as unknown as EndpointBuilder<\n TRoute,\n TMethod,\n TInput,\n TServices,\n T,\n OutSchema,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName\n >;\n }\n\n output<T extends StandardSchemaV1>(\n schema: T,\n ): EndpointBuilder<\n TRoute,\n TMethod,\n TInput,\n TServices,\n TLogger,\n T,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName\n > {\n this.outputSchema = schema as unknown as OutSchema;\n\n return this as unknown as EndpointBuilder<\n TRoute,\n TMethod,\n TInput,\n TServices,\n TLogger,\n T,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName\n >;\n }\n\n /**\n * Set the auditor storage service for this endpoint.\n * This enables audit functionality and makes `auditor` available in the handler context.\n * The audit action type is automatically inferred from the storage's generic parameter.\n */\n auditor<T extends AuditStorage<any>, TName extends string>(\n storage: Service<TName, T>,\n ): EndpointBuilder<\n TRoute,\n TMethod,\n TInput,\n TServices,\n TLogger,\n OutSchema,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n T,\n TName,\n ExtractStorageAuditAction<T>,\n TDatabase,\n TDatabaseServiceName\n > {\n this._auditorStorage = storage as unknown as Service<\n TAuditStorageServiceName,\n TAuditStorage\n >;\n\n return this as unknown as EndpointBuilder<\n TRoute,\n TMethod,\n TInput,\n TServices,\n TLogger,\n OutSchema,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n T,\n TName,\n ExtractStorageAuditAction<T>,\n TDatabase,\n TDatabaseServiceName\n >;\n }\n\n /**\n * Set the actor extractor function for audit records.\n * The actor is extracted from the request context and attached to all audits.\n */\n actor(\n extractor: ActorExtractor<TServices, TSession, TLogger>,\n ): EndpointBuilder<\n TRoute,\n TMethod,\n TInput,\n TServices,\n TLogger,\n OutSchema,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName\n > {\n this._actorExtractor = extractor;\n return this;\n }\n\n /**\n * Add declarative audit definitions that are processed after the handler executes.\n * Similar to `.event()` for events, but for audits.\n *\n * @example\n * ```typescript\n * .audit<AppAuditAction>([\n * {\n * type: 'user.created',\n * payload: (response) => ({ userId: response.id, email: response.email }),\n * when: (response) => response.active,\n * entityId: (response) => response.id,\n * table: 'users',\n * },\n * ])\n * ```\n */\n audit(audits: MappedAudit<TAuditAction, OutSchema>[]): this {\n this._audits = audits;\n return this;\n }\n\n /**\n * Set the database service for this endpoint.\n * The database will be available in the handler context as `db`.\n * When audit storage is configured and uses the same database,\n * `db` will automatically be the transaction for ACID compliance.\n *\n * @example\n * ```typescript\n * .database(databaseService)\n * .handle(async ({ db }) => {\n * // db is the raw database or transaction (when auditor uses same db)\n * return await db.selectFrom('users').selectAll().execute();\n * })\n * ```\n */\n database<T, TName extends string>(\n service: Service<TName, T>,\n ): EndpointBuilder<\n TRoute,\n TMethod,\n TInput,\n TServices,\n TLogger,\n OutSchema,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n T,\n TName\n > {\n this._databaseService = service as unknown as Service<\n TDatabaseServiceName,\n TDatabase\n >;\n\n return this as unknown as EndpointBuilder<\n TRoute,\n TMethod,\n TInput,\n TServices,\n TLogger,\n OutSchema,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n T,\n TName\n >;\n }\n\n /**\n * Configure RLS (Row-Level Security) context for this endpoint.\n * Pass `false` or `RLS_BYPASS` to explicitly bypass RLS for this endpoint.\n *\n * @example\n * ```typescript\n * // Custom RLS config for this endpoint\n * .rls({\n * extractor: ({ session }) => ({\n * user_id: session.userId,\n * tenant_id: session.tenantId,\n * }),\n * prefix: 'app',\n * })\n *\n * // Bypass RLS (for admin endpoints)\n * .rls(false)\n * ```\n */\n rls(\n config: RlsConfig<TServices, TSession, TLogger> | false | RlsBypass,\n ): this {\n if (config === false || config === RLS_BYPASS) {\n this._rlsBypass = true;\n this._rlsConfig = undefined;\n } else {\n this._rlsConfig = config;\n this._rlsBypass = false;\n }\n return this;\n }\n\n /**\n * Explicitly bypass RLS for this endpoint.\n * Useful for admin operations that need unrestricted database access.\n *\n * @example\n * ```typescript\n * .rlsBypass()\n * .handle(async ({ db }) => {\n * // Full access, no RLS filtering\n * return db.selectFrom('orders').selectAll().execute();\n * })\n * ```\n */\n rlsBypass(): this {\n this._rlsBypass = true;\n this._rlsConfig = undefined;\n return this;\n }\n\n // EndpointBuilder doesn't have a generic input method - it uses body, query, params instead\n input(_schema: any): any {\n throw new Error(\n 'EndpointBuilder does not support generic input. Use body(), query(), or params() instead.',\n );\n }\n\n handle(\n fn: EndpointHandler<\n TInput,\n TServices,\n TLogger,\n OutSchema,\n TSession,\n TDatabase,\n TAuditStorage,\n TAuditAction\n >,\n ): Endpoint<\n TRoute,\n TMethod,\n TInput,\n OutSchema,\n TServices,\n TLogger,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName\n > {\n // Find authorizer metadata if name is set\n // If the authorizer name is set but not in availableAuthorizers, create a simple authorizer object\n let authorizer: Authorizer | undefined;\n if (this._authorizerName) {\n const existingAuthorizer = this._availableAuthorizers.find(\n (a) => a.name === this._authorizerName,\n );\n\n if (existingAuthorizer) {\n authorizer = existingAuthorizer;\n } else {\n // Create authorizer with security scheme if available (built-in or custom)\n const securityScheme = getSecurityScheme(\n this._authorizerName as string,\n this._customSecuritySchemes,\n );\n authorizer = {\n name: this._authorizerName as string,\n securityScheme,\n };\n }\n }\n\n return new Endpoint({\n fn,\n method: this.method,\n route: this.route,\n description: this._description,\n tags: this._tags,\n input: this.schemas,\n output: this.outputSchema,\n services: this._services,\n logger: this._logger,\n timeout: this._timeout,\n memorySize: this._memorySize,\n authorize: this._authorize,\n status: this._status,\n getSession: this._getSession,\n rateLimit: this._rateLimit,\n publisherService: this._publisher,\n events: this._events,\n authorizer,\n auditorStorageService: this._auditorStorage,\n actorExtractor: this._actorExtractor,\n audits: this._audits,\n databaseService: this._databaseService,\n rlsConfig: this._rlsConfig,\n rlsBypass: this._rlsBypass,\n });\n }\n}\n"],"mappings":"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"}
@@ -1,7 +1,8 @@
1
1
  import { ConstructType } from "./Construct-LWeB1rSQ.mjs";
2
2
  import { BaseFunctionBuilder } from "./BaseFunctionBuilder-B5gkW0Kt.mjs";
3
- import { Endpoint } from "./Endpoint-DbPsw13b.mjs";
3
+ import { Endpoint } from "./Endpoint-B70_KKhu.mjs";
4
4
  import { getSecurityScheme } from "./Authorizer-r9U3y_ms.mjs";
5
+ import { RLS_BYPASS } from "./rls-Bf3FRwto.mjs";
5
6
  import uniqBy from "lodash.uniqby";
6
7
 
7
8
  //#region src/endpoints/EndpointBuilder.ts
@@ -19,6 +20,8 @@ var EndpointBuilder = class extends BaseFunctionBuilder {
19
20
  _actorExtractor;
20
21
  _audits = [];
21
22
  _customSecuritySchemes = {};
23
+ _rlsConfig;
24
+ _rlsBypass;
22
25
  constructor(route, method) {
23
26
  super(ConstructType.Endpoint);
24
27
  this.route = route;
@@ -158,6 +161,53 @@ var EndpointBuilder = class extends BaseFunctionBuilder {
158
161
  this._databaseService = service;
159
162
  return this;
160
163
  }
164
+ /**
165
+ * Configure RLS (Row-Level Security) context for this endpoint.
166
+ * Pass `false` or `RLS_BYPASS` to explicitly bypass RLS for this endpoint.
167
+ *
168
+ * @example
169
+ * ```typescript
170
+ * // Custom RLS config for this endpoint
171
+ * .rls({
172
+ * extractor: ({ session }) => ({
173
+ * user_id: session.userId,
174
+ * tenant_id: session.tenantId,
175
+ * }),
176
+ * prefix: 'app',
177
+ * })
178
+ *
179
+ * // Bypass RLS (for admin endpoints)
180
+ * .rls(false)
181
+ * ```
182
+ */
183
+ rls(config) {
184
+ if (config === false || config === RLS_BYPASS) {
185
+ this._rlsBypass = true;
186
+ this._rlsConfig = void 0;
187
+ } else {
188
+ this._rlsConfig = config;
189
+ this._rlsBypass = false;
190
+ }
191
+ return this;
192
+ }
193
+ /**
194
+ * Explicitly bypass RLS for this endpoint.
195
+ * Useful for admin operations that need unrestricted database access.
196
+ *
197
+ * @example
198
+ * ```typescript
199
+ * .rlsBypass()
200
+ * .handle(async ({ db }) => {
201
+ * // Full access, no RLS filtering
202
+ * return db.selectFrom('orders').selectAll().execute();
203
+ * })
204
+ * ```
205
+ */
206
+ rlsBypass() {
207
+ this._rlsBypass = true;
208
+ this._rlsConfig = void 0;
209
+ return this;
210
+ }
161
211
  input(_schema) {
162
212
  throw new Error("EndpointBuilder does not support generic input. Use body(), query(), or params() instead.");
163
213
  }
@@ -196,11 +246,13 @@ var EndpointBuilder = class extends BaseFunctionBuilder {
196
246
  auditorStorageService: this._auditorStorage,
197
247
  actorExtractor: this._actorExtractor,
198
248
  audits: this._audits,
199
- databaseService: this._databaseService
249
+ databaseService: this._databaseService,
250
+ rlsConfig: this._rlsConfig,
251
+ rlsBypass: this._rlsBypass
200
252
  });
201
253
  }
202
254
  };
203
255
 
204
256
  //#endregion
205
257
  export { EndpointBuilder };
206
- //# sourceMappingURL=EndpointBuilder-69uVrKZL.mjs.map
258
+ //# sourceMappingURL=EndpointBuilder-FyyoFTJ5.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"EndpointBuilder-Bhyft7WY.cjs","names":["BaseFunctionBuilder","route: TRoute","method: TMethod","ConstructType","publisher: Service<TEventPublisherServiceName, TEventPublisher>","storage: Service<TAuditStorageServiceName, TAuditStorage>","service: Service<TDatabaseServiceName, TDatabase>","description: string","status: SuccessStatus","event: TEvent","tags: string[]","memorySize: number","publisher: Service<TName, T>","schema: T","config: RateLimitConfig","name: TAuthorizers[number] | 'none'","services: T","logger: T","storage: Service<TName, T>","extractor: ActorExtractor<TServices, TSession, TLogger>","audits: MappedAudit<TAuditAction, OutSchema>[]","service: Service<TName, T>","_schema: any","fn: EndpointHandler<\n TInput,\n TServices,\n TLogger,\n OutSchema,\n TSession,\n TDatabase,\n TAuditStorage,\n TAuditAction\n >","authorizer: Authorizer | undefined","Endpoint"],"sources":["../src/endpoints/EndpointBuilder.ts"],"sourcesContent":["import type {\n AuditStorage,\n AuditableAction,\n ExtractStorageAuditAction,\n} from '@geekmidas/audit';\nimport type { EventPublisher, MappedEvent } from '@geekmidas/events';\nimport type { Logger } from '@geekmidas/logger';\nimport type { RateLimitConfig } from '@geekmidas/rate-limit';\nimport type { Service } from '@geekmidas/services';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport uniqBy from 'lodash.uniqby';\nimport { ConstructType } from '../Construct';\nimport { BaseFunctionBuilder } from '../functions';\nimport type { HttpMethod } from '../types';\nimport type { Authorizer, SecurityScheme } from './Authorizer';\nimport { getSecurityScheme } from './Authorizer';\nimport { Endpoint, type EndpointSchemas } from './Endpoint';\nimport type {\n AuthorizeFn,\n EndpointHandler,\n SessionFn,\n SuccessStatus,\n} from './Endpoint';\nimport type { ActorExtractor, MappedAudit } from './audit';\n\nexport class EndpointBuilder<\n TRoute extends string,\n TMethod extends HttpMethod,\n TInput extends EndpointSchemas = {},\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n OutSchema extends StandardSchemaV1 | undefined = undefined,\n TSession = unknown,\n TEventPublisher extends EventPublisher<any> | undefined = undefined,\n TEventPublisherServiceName extends string = string,\n TAuthorizers extends readonly string[] = readonly string[],\n TAuditStorage extends AuditStorage | undefined = undefined,\n TAuditStorageServiceName extends string = string,\n TAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n string,\n unknown\n >,\n TDatabase = undefined,\n TDatabaseServiceName extends string = string,\n> extends BaseFunctionBuilder<\n TInput,\n OutSchema,\n TServices,\n TLogger,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuditStorage,\n TAuditStorageServiceName,\n TDatabase,\n TDatabaseServiceName\n> {\n protected schemas: TInput = {} as TInput;\n protected _description?: string;\n protected _status?: SuccessStatus;\n protected _tags?: string[];\n protected _memorySize?: number;\n _getSession: SessionFn<TServices, TLogger, TSession, TDatabase> = () =>\n ({}) as TSession;\n _authorize: AuthorizeFn<TServices, TLogger, TSession> = () => true;\n _rateLimit?: RateLimitConfig;\n _availableAuthorizers: Authorizer[] = [];\n _authorizerName?: TAuthorizers[number];\n _actorExtractor?: ActorExtractor<TServices, TSession, TLogger>;\n _audits: MappedAudit<TAuditAction, OutSchema>[] = [];\n _customSecuritySchemes: Record<string, SecurityScheme> = {};\n\n constructor(\n readonly route: TRoute,\n readonly method: TMethod,\n ) {\n super(ConstructType.Endpoint);\n }\n\n // Internal setter for EndpointFactory to set default publisher\n _setPublisher(\n publisher: Service<TEventPublisherServiceName, TEventPublisher>,\n ) {\n this._publisher = publisher;\n }\n\n // Internal setter for EndpointFactory to set default auditor storage\n _setAuditorStorage(\n storage: Service<TAuditStorageServiceName, TAuditStorage>,\n ) {\n this._auditorStorage = storage;\n }\n\n // Internal setter for EndpointFactory to set default database service\n _setDatabaseService(service: Service<TDatabaseServiceName, TDatabase>) {\n this._databaseService = service;\n }\n\n description(description: string): this {\n this._description = description;\n return this;\n }\n\n status(status: SuccessStatus): this {\n this._status = status;\n return this;\n }\n\n event<TEvent extends MappedEvent<TEventPublisher, OutSchema>>(\n event: TEvent,\n ): this {\n this._events.push(event);\n return this;\n }\n\n tags(tags: string[]): this {\n this._tags = tags;\n return this;\n }\n\n memorySize(memorySize: number): this {\n this._memorySize = memorySize;\n return this;\n }\n\n publisher<T extends EventPublisher<any>, TName extends string>(\n publisher: Service<TName, T>,\n ): EndpointBuilder<\n TRoute,\n TMethod,\n TInput,\n TServices,\n TLogger,\n OutSchema,\n TSession,\n T,\n TName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName\n > {\n this._publisher = publisher as unknown as Service<\n TEventPublisherServiceName,\n TEventPublisher\n >;\n\n return this as unknown as EndpointBuilder<\n TRoute,\n TMethod,\n TInput,\n TServices,\n TLogger,\n OutSchema,\n TSession,\n T,\n TName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName\n >;\n }\n\n body<T extends StandardSchemaV1>(\n schema: T,\n ): EndpointBuilder<\n TRoute,\n TMethod,\n Omit<TInput, 'body'> & { body: T },\n TServices,\n TLogger,\n OutSchema,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName\n > {\n this.schemas.body = schema as unknown as T;\n // @ts-ignore\n return this;\n }\n\n search<T extends StandardSchemaV1>(\n schema: T,\n ): EndpointBuilder<\n TRoute,\n TMethod,\n Omit<TInput, 'query'> & { query: T },\n TServices,\n TLogger,\n OutSchema,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName\n > {\n this.schemas.query = schema as unknown as T;\n // @ts-ignore\n return this;\n }\n\n query<T extends StandardSchemaV1>(\n schema: T,\n ): EndpointBuilder<\n TRoute,\n TMethod,\n Omit<TInput, 'query'> & { query: T },\n TServices,\n TLogger,\n OutSchema,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName\n > {\n return this.search(schema);\n }\n\n params<T extends StandardSchemaV1>(\n schema: T,\n ): EndpointBuilder<\n TRoute,\n TMethod,\n Omit<TInput, 'params'> & { params: T },\n TServices,\n TLogger,\n OutSchema,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName\n > {\n this.schemas.params = schema as unknown as T;\n // @ts-ignore\n return this;\n }\n\n rateLimit(config: RateLimitConfig): this {\n this._rateLimit = config;\n return this;\n }\n\n authorizer(\n name: TAuthorizers[number] | 'none',\n ): EndpointBuilder<\n TRoute,\n TMethod,\n TInput,\n TServices,\n TLogger,\n OutSchema,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName\n > {\n // Special case: 'none' explicitly marks endpoint as having no authorizer\n if (name === 'none') {\n this._authorizerName = undefined;\n return this;\n }\n\n // Validate that the authorizer exists in available authorizers\n const authorizerExists = this._availableAuthorizers.some(\n (a) => a.name === name,\n );\n if (!authorizerExists && this._availableAuthorizers.length > 0) {\n const available = this._availableAuthorizers\n .map((a) => a.name)\n .join(', ');\n throw new Error(\n `Authorizer \"${name as string}\" not found in available authorizers: ${available}`,\n );\n }\n this._authorizerName = name;\n return this;\n }\n\n services<T extends Service[]>(\n services: T,\n ): EndpointBuilder<\n TRoute,\n TMethod,\n TInput,\n [...TServices, ...T],\n TLogger,\n OutSchema,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName\n > {\n this._services = uniqBy(\n [...this._services, ...services],\n (s) => s.serviceName,\n ) as TServices;\n\n return this as unknown as EndpointBuilder<\n TRoute,\n TMethod,\n TInput,\n [...TServices, ...T],\n TLogger,\n OutSchema,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName\n >;\n }\n\n logger<T extends Logger>(\n logger: T,\n ): EndpointBuilder<\n TRoute,\n TMethod,\n TInput,\n TServices,\n T,\n OutSchema,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName\n > {\n this._logger = logger as unknown as TLogger;\n\n return this as unknown as EndpointBuilder<\n TRoute,\n TMethod,\n TInput,\n TServices,\n T,\n OutSchema,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName\n >;\n }\n\n output<T extends StandardSchemaV1>(\n schema: T,\n ): EndpointBuilder<\n TRoute,\n TMethod,\n TInput,\n TServices,\n TLogger,\n T,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName\n > {\n this.outputSchema = schema as unknown as OutSchema;\n\n return this as unknown as EndpointBuilder<\n TRoute,\n TMethod,\n TInput,\n TServices,\n TLogger,\n T,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName\n >;\n }\n\n /**\n * Set the auditor storage service for this endpoint.\n * This enables audit functionality and makes `auditor` available in the handler context.\n * The audit action type is automatically inferred from the storage's generic parameter.\n */\n auditor<T extends AuditStorage<any>, TName extends string>(\n storage: Service<TName, T>,\n ): EndpointBuilder<\n TRoute,\n TMethod,\n TInput,\n TServices,\n TLogger,\n OutSchema,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n T,\n TName,\n ExtractStorageAuditAction<T>,\n TDatabase,\n TDatabaseServiceName\n > {\n this._auditorStorage = storage as unknown as Service<\n TAuditStorageServiceName,\n TAuditStorage\n >;\n\n return this as unknown as EndpointBuilder<\n TRoute,\n TMethod,\n TInput,\n TServices,\n TLogger,\n OutSchema,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n T,\n TName,\n ExtractStorageAuditAction<T>,\n TDatabase,\n TDatabaseServiceName\n >;\n }\n\n /**\n * Set the actor extractor function for audit records.\n * The actor is extracted from the request context and attached to all audits.\n */\n actor(\n extractor: ActorExtractor<TServices, TSession, TLogger>,\n ): EndpointBuilder<\n TRoute,\n TMethod,\n TInput,\n TServices,\n TLogger,\n OutSchema,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName\n > {\n this._actorExtractor = extractor;\n return this;\n }\n\n /**\n * Add declarative audit definitions that are processed after the handler executes.\n * Similar to `.event()` for events, but for audits.\n *\n * @example\n * ```typescript\n * .audit<AppAuditAction>([\n * {\n * type: 'user.created',\n * payload: (response) => ({ userId: response.id, email: response.email }),\n * when: (response) => response.active,\n * entityId: (response) => response.id,\n * table: 'users',\n * },\n * ])\n * ```\n */\n audit(audits: MappedAudit<TAuditAction, OutSchema>[]): this {\n this._audits = audits;\n return this;\n }\n\n /**\n * Set the database service for this endpoint.\n * The database will be available in the handler context as `db`.\n * When audit storage is configured and uses the same database,\n * `db` will automatically be the transaction for ACID compliance.\n *\n * @example\n * ```typescript\n * .database(databaseService)\n * .handle(async ({ db }) => {\n * // db is the raw database or transaction (when auditor uses same db)\n * return await db.selectFrom('users').selectAll().execute();\n * })\n * ```\n */\n database<T, TName extends string>(\n service: Service<TName, T>,\n ): EndpointBuilder<\n TRoute,\n TMethod,\n TInput,\n TServices,\n TLogger,\n OutSchema,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n T,\n TName\n > {\n this._databaseService = service as unknown as Service<\n TDatabaseServiceName,\n TDatabase\n >;\n\n return this as unknown as EndpointBuilder<\n TRoute,\n TMethod,\n TInput,\n TServices,\n TLogger,\n OutSchema,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n T,\n TName\n >;\n }\n\n // EndpointBuilder doesn't have a generic input method - it uses body, query, params instead\n input(_schema: any): any {\n throw new Error(\n 'EndpointBuilder does not support generic input. Use body(), query(), or params() instead.',\n );\n }\n\n handle(\n fn: EndpointHandler<\n TInput,\n TServices,\n TLogger,\n OutSchema,\n TSession,\n TDatabase,\n TAuditStorage,\n TAuditAction\n >,\n ): Endpoint<\n TRoute,\n TMethod,\n TInput,\n OutSchema,\n TServices,\n TLogger,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName\n > {\n // Find authorizer metadata if name is set\n // If the authorizer name is set but not in availableAuthorizers, create a simple authorizer object\n let authorizer: Authorizer | undefined;\n if (this._authorizerName) {\n const existingAuthorizer = this._availableAuthorizers.find(\n (a) => a.name === this._authorizerName,\n );\n\n if (existingAuthorizer) {\n authorizer = existingAuthorizer;\n } else {\n // Create authorizer with security scheme if available (built-in or custom)\n const securityScheme = getSecurityScheme(\n this._authorizerName as string,\n this._customSecuritySchemes,\n );\n authorizer = {\n name: this._authorizerName as string,\n securityScheme,\n };\n }\n }\n\n return new Endpoint({\n fn,\n method: this.method,\n route: this.route,\n description: this._description,\n tags: this._tags,\n input: this.schemas,\n output: this.outputSchema,\n services: this._services,\n logger: this._logger,\n timeout: this._timeout,\n memorySize: this._memorySize,\n authorize: this._authorize,\n status: this._status,\n getSession: this._getSession,\n rateLimit: this._rateLimit,\n publisherService: this._publisher,\n events: this._events,\n authorizer,\n auditorStorageService: this._auditorStorage,\n actorExtractor: this._actorExtractor,\n audits: this._audits,\n databaseService: this._databaseService,\n });\n }\n}\n"],"mappings":";;;;;;;;AAyBA,IAAa,kBAAb,cAmBUA,gDAWR;CACA,AAAU,UAAkB,CAAE;CAC9B,AAAU;CACV,AAAU;CACV,AAAU;CACV,AAAU;CACV,cAAkE,OAC/D,CAAE;CACL,aAAwD,MAAM;CAC9D;CACA,wBAAsC,CAAE;CACxC;CACA;CACA,UAAkD,CAAE;CACpD,yBAAyD,CAAE;CAE3D,YACWC,OACAC,QACT;AACA,QAAMC,gCAAc,SAAS;EAHpB;EACA;CAGV;CAGD,cACEC,WACA;AACA,OAAK,aAAa;CACnB;CAGD,mBACEC,SACA;AACA,OAAK,kBAAkB;CACxB;CAGD,oBAAoBC,SAAmD;AACrE,OAAK,mBAAmB;CACzB;CAED,YAAYC,aAA2B;AACrC,OAAK,eAAe;AACpB,SAAO;CACR;CAED,OAAOC,QAA6B;AAClC,OAAK,UAAU;AACf,SAAO;CACR;CAED,MACEC,OACM;AACN,OAAK,QAAQ,KAAK,MAAM;AACxB,SAAO;CACR;CAED,KAAKC,MAAsB;AACzB,OAAK,QAAQ;AACb,SAAO;CACR;CAED,WAAWC,YAA0B;AACnC,OAAK,cAAc;AACnB,SAAO;CACR;CAED,UACEC,WAiBA;AACA,OAAK,aAAa;AAKlB,SAAO;CAiBR;CAED,KACEC,QAiBA;AACA,OAAK,QAAQ,OAAO;AAEpB,SAAO;CACR;CAED,OACEA,QAiBA;AACA,OAAK,QAAQ,QAAQ;AAErB,SAAO;CACR;CAED,MACEA,QAiBA;AACA,SAAO,KAAK,OAAO,OAAO;CAC3B;CAED,OACEA,QAiBA;AACA,OAAK,QAAQ,SAAS;AAEtB,SAAO;CACR;CAED,UAAUC,QAA+B;AACvC,OAAK,aAAa;AAClB,SAAO;CACR;CAED,WACEC,MAiBA;AAEA,MAAI,SAAS,QAAQ;AACnB,QAAK;AACL,UAAO;EACR;EAGD,MAAM,mBAAmB,KAAK,sBAAsB,KAClD,CAAC,MAAM,EAAE,SAAS,KACnB;AACD,OAAK,oBAAoB,KAAK,sBAAsB,SAAS,GAAG;GAC9D,MAAM,YAAY,KAAK,sBACpB,IAAI,CAAC,MAAM,EAAE,KAAK,CAClB,KAAK,KAAK;AACb,SAAM,IAAI,OACP,cAAc,KAAe,wCAAwC,UAAU;EAEnF;AACD,OAAK,kBAAkB;AACvB,SAAO;CACR;CAED,SACEC,UAiBA;AACA,OAAK,YAAY,2BACf,CAAC,GAAG,KAAK,WAAW,GAAG,QAAS,GAChC,CAAC,MAAM,EAAE,YACV;AAED,SAAO;CAiBR;CAED,OACEC,QAiBA;AACA,OAAK,UAAU;AAEf,SAAO;CAiBR;CAED,OACEJ,QAiBA;AACA,OAAK,eAAe;AAEpB,SAAO;CAiBR;;;;;;CAOD,QACEK,SAiBA;AACA,OAAK,kBAAkB;AAKvB,SAAO;CAiBR;;;;;CAMD,MACEC,WAiBA;AACA,OAAK,kBAAkB;AACvB,SAAO;CACR;;;;;;;;;;;;;;;;;;CAmBD,MAAMC,QAAsD;AAC1D,OAAK,UAAU;AACf,SAAO;CACR;;;;;;;;;;;;;;;;CAiBD,SACEC,SAiBA;AACA,OAAK,mBAAmB;AAKxB,SAAO;CAiBR;CAGD,MAAMC,SAAmB;AACvB,QAAM,IAAI,MACR;CAEH;CAED,OACEC,IAyBA;EAGA,IAAIC;AACJ,MAAI,KAAK,iBAAiB;GACxB,MAAM,qBAAqB,KAAK,sBAAsB,KACpD,CAAC,MAAM,EAAE,SAAS,KAAK,gBACxB;AAED,OAAI,mBACF,cAAa;QACR;IAEL,MAAM,iBAAiB,qCACrB,KAAK,iBACL,KAAK,uBACN;AACD,iBAAa;KACX,MAAM,KAAK;KACX;IACD;GACF;EACF;AAED,SAAO,IAAIC,0BAAS;GAClB;GACA,QAAQ,KAAK;GACb,OAAO,KAAK;GACZ,aAAa,KAAK;GAClB,MAAM,KAAK;GACX,OAAO,KAAK;GACZ,QAAQ,KAAK;GACb,UAAU,KAAK;GACf,QAAQ,KAAK;GACb,SAAS,KAAK;GACd,YAAY,KAAK;GACjB,WAAW,KAAK;GAChB,QAAQ,KAAK;GACb,YAAY,KAAK;GACjB,WAAW,KAAK;GAChB,kBAAkB,KAAK;GACvB,QAAQ,KAAK;GACb;GACA,uBAAuB,KAAK;GAC5B,gBAAgB,KAAK;GACrB,QAAQ,KAAK;GACb,iBAAiB,KAAK;EACvB;CACF;AACF"}
1
+ {"version":3,"file":"EndpointBuilder-FyyoFTJ5.mjs","names":["route: TRoute","method: TMethod","publisher: Service<TEventPublisherServiceName, TEventPublisher>","storage: Service<TAuditStorageServiceName, TAuditStorage>","service: Service<TDatabaseServiceName, TDatabase>","description: string","status: SuccessStatus","event: TEvent","tags: string[]","memorySize: number","publisher: Service<TName, T>","schema: T","config: RateLimitConfig","name: TAuthorizers[number] | 'none'","services: T","logger: T","storage: Service<TName, T>","extractor: ActorExtractor<TServices, TSession, TLogger>","audits: MappedAudit<TAuditAction, OutSchema>[]","service: Service<TName, T>","config: RlsConfig<TServices, TSession, TLogger> | false | RlsBypass","_schema: any","fn: EndpointHandler<\n TInput,\n TServices,\n TLogger,\n OutSchema,\n TSession,\n TDatabase,\n TAuditStorage,\n TAuditAction\n >","authorizer: Authorizer | undefined"],"sources":["../src/endpoints/EndpointBuilder.ts"],"sourcesContent":["import type {\n AuditStorage,\n AuditableAction,\n ExtractStorageAuditAction,\n} from '@geekmidas/audit';\nimport type { EventPublisher, MappedEvent } from '@geekmidas/events';\nimport type { Logger } from '@geekmidas/logger';\nimport type { RateLimitConfig } from '@geekmidas/rate-limit';\nimport type { Service } from '@geekmidas/services';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport uniqBy from 'lodash.uniqby';\nimport { ConstructType } from '../Construct';\nimport { BaseFunctionBuilder } from '../functions';\nimport type { HttpMethod } from '../types';\nimport type { Authorizer, SecurityScheme } from './Authorizer';\nimport { getSecurityScheme } from './Authorizer';\nimport { Endpoint, type EndpointSchemas } from './Endpoint';\nimport type {\n AuthorizeFn,\n EndpointHandler,\n SessionFn,\n SuccessStatus,\n} from './Endpoint';\nimport type { ActorExtractor, MappedAudit } from './audit';\nimport type { RlsBypass, RlsConfig } from './rls';\nimport { RLS_BYPASS } from './rls';\n\nexport class EndpointBuilder<\n TRoute extends string,\n TMethod extends HttpMethod,\n TInput extends EndpointSchemas = {},\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n OutSchema extends StandardSchemaV1 | undefined = undefined,\n TSession = unknown,\n TEventPublisher extends EventPublisher<any> | undefined = undefined,\n TEventPublisherServiceName extends string = string,\n TAuthorizers extends readonly string[] = readonly string[],\n TAuditStorage extends AuditStorage | undefined = undefined,\n TAuditStorageServiceName extends string = string,\n TAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n string,\n unknown\n >,\n TDatabase = undefined,\n TDatabaseServiceName extends string = string,\n> extends BaseFunctionBuilder<\n TInput,\n OutSchema,\n TServices,\n TLogger,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuditStorage,\n TAuditStorageServiceName,\n TDatabase,\n TDatabaseServiceName\n> {\n protected schemas: TInput = {} as TInput;\n protected _description?: string;\n protected _status?: SuccessStatus;\n protected _tags?: string[];\n protected _memorySize?: number;\n _getSession: SessionFn<TServices, TLogger, TSession, TDatabase> = () =>\n ({}) as TSession;\n _authorize: AuthorizeFn<TServices, TLogger, TSession> = () => true;\n _rateLimit?: RateLimitConfig;\n _availableAuthorizers: Authorizer[] = [];\n _authorizerName?: TAuthorizers[number];\n _actorExtractor?: ActorExtractor<TServices, TSession, TLogger>;\n _audits: MappedAudit<TAuditAction, OutSchema>[] = [];\n _customSecuritySchemes: Record<string, SecurityScheme> = {};\n _rlsConfig?: RlsConfig<TServices, TSession, TLogger>;\n _rlsBypass?: boolean;\n\n constructor(\n readonly route: TRoute,\n readonly method: TMethod,\n ) {\n super(ConstructType.Endpoint);\n }\n\n // Internal setter for EndpointFactory to set default publisher\n _setPublisher(\n publisher: Service<TEventPublisherServiceName, TEventPublisher>,\n ) {\n this._publisher = publisher;\n }\n\n // Internal setter for EndpointFactory to set default auditor storage\n _setAuditorStorage(\n storage: Service<TAuditStorageServiceName, TAuditStorage>,\n ) {\n this._auditorStorage = storage;\n }\n\n // Internal setter for EndpointFactory to set default database service\n _setDatabaseService(service: Service<TDatabaseServiceName, TDatabase>) {\n this._databaseService = service;\n }\n\n description(description: string): this {\n this._description = description;\n return this;\n }\n\n status(status: SuccessStatus): this {\n this._status = status;\n return this;\n }\n\n event<TEvent extends MappedEvent<TEventPublisher, OutSchema>>(\n event: TEvent,\n ): this {\n this._events.push(event);\n return this;\n }\n\n tags(tags: string[]): this {\n this._tags = tags;\n return this;\n }\n\n memorySize(memorySize: number): this {\n this._memorySize = memorySize;\n return this;\n }\n\n publisher<T extends EventPublisher<any>, TName extends string>(\n publisher: Service<TName, T>,\n ): EndpointBuilder<\n TRoute,\n TMethod,\n TInput,\n TServices,\n TLogger,\n OutSchema,\n TSession,\n T,\n TName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName\n > {\n this._publisher = publisher as unknown as Service<\n TEventPublisherServiceName,\n TEventPublisher\n >;\n\n return this as unknown as EndpointBuilder<\n TRoute,\n TMethod,\n TInput,\n TServices,\n TLogger,\n OutSchema,\n TSession,\n T,\n TName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName\n >;\n }\n\n body<T extends StandardSchemaV1>(\n schema: T,\n ): EndpointBuilder<\n TRoute,\n TMethod,\n Omit<TInput, 'body'> & { body: T },\n TServices,\n TLogger,\n OutSchema,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName\n > {\n this.schemas.body = schema as unknown as T;\n // @ts-ignore\n return this;\n }\n\n search<T extends StandardSchemaV1>(\n schema: T,\n ): EndpointBuilder<\n TRoute,\n TMethod,\n Omit<TInput, 'query'> & { query: T },\n TServices,\n TLogger,\n OutSchema,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName\n > {\n this.schemas.query = schema as unknown as T;\n // @ts-ignore\n return this;\n }\n\n query<T extends StandardSchemaV1>(\n schema: T,\n ): EndpointBuilder<\n TRoute,\n TMethod,\n Omit<TInput, 'query'> & { query: T },\n TServices,\n TLogger,\n OutSchema,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName\n > {\n return this.search(schema);\n }\n\n params<T extends StandardSchemaV1>(\n schema: T,\n ): EndpointBuilder<\n TRoute,\n TMethod,\n Omit<TInput, 'params'> & { params: T },\n TServices,\n TLogger,\n OutSchema,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName\n > {\n this.schemas.params = schema as unknown as T;\n // @ts-ignore\n return this;\n }\n\n rateLimit(config: RateLimitConfig): this {\n this._rateLimit = config;\n return this;\n }\n\n authorizer(\n name: TAuthorizers[number] | 'none',\n ): EndpointBuilder<\n TRoute,\n TMethod,\n TInput,\n TServices,\n TLogger,\n OutSchema,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName\n > {\n // Special case: 'none' explicitly marks endpoint as having no authorizer\n if (name === 'none') {\n this._authorizerName = undefined;\n return this;\n }\n\n // Validate that the authorizer exists in available authorizers\n const authorizerExists = this._availableAuthorizers.some(\n (a) => a.name === name,\n );\n if (!authorizerExists && this._availableAuthorizers.length > 0) {\n const available = this._availableAuthorizers\n .map((a) => a.name)\n .join(', ');\n throw new Error(\n `Authorizer \"${name as string}\" not found in available authorizers: ${available}`,\n );\n }\n this._authorizerName = name;\n return this;\n }\n\n services<T extends Service[]>(\n services: T,\n ): EndpointBuilder<\n TRoute,\n TMethod,\n TInput,\n [...TServices, ...T],\n TLogger,\n OutSchema,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName\n > {\n this._services = uniqBy(\n [...this._services, ...services],\n (s) => s.serviceName,\n ) as TServices;\n\n return this as unknown as EndpointBuilder<\n TRoute,\n TMethod,\n TInput,\n [...TServices, ...T],\n TLogger,\n OutSchema,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName\n >;\n }\n\n logger<T extends Logger>(\n logger: T,\n ): EndpointBuilder<\n TRoute,\n TMethod,\n TInput,\n TServices,\n T,\n OutSchema,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName\n > {\n this._logger = logger as unknown as TLogger;\n\n return this as unknown as EndpointBuilder<\n TRoute,\n TMethod,\n TInput,\n TServices,\n T,\n OutSchema,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName\n >;\n }\n\n output<T extends StandardSchemaV1>(\n schema: T,\n ): EndpointBuilder<\n TRoute,\n TMethod,\n TInput,\n TServices,\n TLogger,\n T,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName\n > {\n this.outputSchema = schema as unknown as OutSchema;\n\n return this as unknown as EndpointBuilder<\n TRoute,\n TMethod,\n TInput,\n TServices,\n TLogger,\n T,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName\n >;\n }\n\n /**\n * Set the auditor storage service for this endpoint.\n * This enables audit functionality and makes `auditor` available in the handler context.\n * The audit action type is automatically inferred from the storage's generic parameter.\n */\n auditor<T extends AuditStorage<any>, TName extends string>(\n storage: Service<TName, T>,\n ): EndpointBuilder<\n TRoute,\n TMethod,\n TInput,\n TServices,\n TLogger,\n OutSchema,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n T,\n TName,\n ExtractStorageAuditAction<T>,\n TDatabase,\n TDatabaseServiceName\n > {\n this._auditorStorage = storage as unknown as Service<\n TAuditStorageServiceName,\n TAuditStorage\n >;\n\n return this as unknown as EndpointBuilder<\n TRoute,\n TMethod,\n TInput,\n TServices,\n TLogger,\n OutSchema,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n T,\n TName,\n ExtractStorageAuditAction<T>,\n TDatabase,\n TDatabaseServiceName\n >;\n }\n\n /**\n * Set the actor extractor function for audit records.\n * The actor is extracted from the request context and attached to all audits.\n */\n actor(\n extractor: ActorExtractor<TServices, TSession, TLogger>,\n ): EndpointBuilder<\n TRoute,\n TMethod,\n TInput,\n TServices,\n TLogger,\n OutSchema,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName\n > {\n this._actorExtractor = extractor;\n return this;\n }\n\n /**\n * Add declarative audit definitions that are processed after the handler executes.\n * Similar to `.event()` for events, but for audits.\n *\n * @example\n * ```typescript\n * .audit<AppAuditAction>([\n * {\n * type: 'user.created',\n * payload: (response) => ({ userId: response.id, email: response.email }),\n * when: (response) => response.active,\n * entityId: (response) => response.id,\n * table: 'users',\n * },\n * ])\n * ```\n */\n audit(audits: MappedAudit<TAuditAction, OutSchema>[]): this {\n this._audits = audits;\n return this;\n }\n\n /**\n * Set the database service for this endpoint.\n * The database will be available in the handler context as `db`.\n * When audit storage is configured and uses the same database,\n * `db` will automatically be the transaction for ACID compliance.\n *\n * @example\n * ```typescript\n * .database(databaseService)\n * .handle(async ({ db }) => {\n * // db is the raw database or transaction (when auditor uses same db)\n * return await db.selectFrom('users').selectAll().execute();\n * })\n * ```\n */\n database<T, TName extends string>(\n service: Service<TName, T>,\n ): EndpointBuilder<\n TRoute,\n TMethod,\n TInput,\n TServices,\n TLogger,\n OutSchema,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n T,\n TName\n > {\n this._databaseService = service as unknown as Service<\n TDatabaseServiceName,\n TDatabase\n >;\n\n return this as unknown as EndpointBuilder<\n TRoute,\n TMethod,\n TInput,\n TServices,\n TLogger,\n OutSchema,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n T,\n TName\n >;\n }\n\n /**\n * Configure RLS (Row-Level Security) context for this endpoint.\n * Pass `false` or `RLS_BYPASS` to explicitly bypass RLS for this endpoint.\n *\n * @example\n * ```typescript\n * // Custom RLS config for this endpoint\n * .rls({\n * extractor: ({ session }) => ({\n * user_id: session.userId,\n * tenant_id: session.tenantId,\n * }),\n * prefix: 'app',\n * })\n *\n * // Bypass RLS (for admin endpoints)\n * .rls(false)\n * ```\n */\n rls(\n config: RlsConfig<TServices, TSession, TLogger> | false | RlsBypass,\n ): this {\n if (config === false || config === RLS_BYPASS) {\n this._rlsBypass = true;\n this._rlsConfig = undefined;\n } else {\n this._rlsConfig = config;\n this._rlsBypass = false;\n }\n return this;\n }\n\n /**\n * Explicitly bypass RLS for this endpoint.\n * Useful for admin operations that need unrestricted database access.\n *\n * @example\n * ```typescript\n * .rlsBypass()\n * .handle(async ({ db }) => {\n * // Full access, no RLS filtering\n * return db.selectFrom('orders').selectAll().execute();\n * })\n * ```\n */\n rlsBypass(): this {\n this._rlsBypass = true;\n this._rlsConfig = undefined;\n return this;\n }\n\n // EndpointBuilder doesn't have a generic input method - it uses body, query, params instead\n input(_schema: any): any {\n throw new Error(\n 'EndpointBuilder does not support generic input. Use body(), query(), or params() instead.',\n );\n }\n\n handle(\n fn: EndpointHandler<\n TInput,\n TServices,\n TLogger,\n OutSchema,\n TSession,\n TDatabase,\n TAuditStorage,\n TAuditAction\n >,\n ): Endpoint<\n TRoute,\n TMethod,\n TInput,\n OutSchema,\n TServices,\n TLogger,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName\n > {\n // Find authorizer metadata if name is set\n // If the authorizer name is set but not in availableAuthorizers, create a simple authorizer object\n let authorizer: Authorizer | undefined;\n if (this._authorizerName) {\n const existingAuthorizer = this._availableAuthorizers.find(\n (a) => a.name === this._authorizerName,\n );\n\n if (existingAuthorizer) {\n authorizer = existingAuthorizer;\n } else {\n // Create authorizer with security scheme if available (built-in or custom)\n const securityScheme = getSecurityScheme(\n this._authorizerName as string,\n this._customSecuritySchemes,\n );\n authorizer = {\n name: this._authorizerName as string,\n securityScheme,\n };\n }\n }\n\n return new Endpoint({\n fn,\n method: this.method,\n route: this.route,\n description: this._description,\n tags: this._tags,\n input: this.schemas,\n output: this.outputSchema,\n services: this._services,\n logger: this._logger,\n timeout: this._timeout,\n memorySize: this._memorySize,\n authorize: this._authorize,\n status: this._status,\n getSession: this._getSession,\n rateLimit: this._rateLimit,\n publisherService: this._publisher,\n events: this._events,\n authorizer,\n auditorStorageService: this._auditorStorage,\n actorExtractor: this._actorExtractor,\n audits: this._audits,\n databaseService: this._databaseService,\n rlsConfig: this._rlsConfig,\n rlsBypass: this._rlsBypass,\n });\n }\n}\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { HttpMethod } from "./types-Bp9ysFXd.cjs";
2
2
  import { BaseFunctionBuilder } from "./BaseFunctionBuilder-DaQA0uKE.cjs";
3
3
  import { Authorizer, SecurityScheme } from "./Authorizer-CpSUMTIs.cjs";
4
- import { ActorExtractor, AuthorizeFn, Endpoint, EndpointHandler, EndpointSchemas, MappedAudit, SessionFn, SuccessStatus } from "./Endpoint-BJPJTGjV.cjs";
4
+ import { ActorExtractor, AuthorizeFn, Endpoint, EndpointHandler, EndpointSchemas, MappedAudit, RlsBypass, RlsConfig, SessionFn, SuccessStatus } from "./Endpoint-CC2RGjkl.cjs";
5
5
  import { AuditStorage, AuditableAction, ExtractStorageAuditAction } from "@geekmidas/audit";
6
6
  import { EventPublisher, MappedEvent } from "@geekmidas/events";
7
7
  import { Logger } from "@geekmidas/logger";
@@ -10,6 +10,7 @@ import { StandardSchemaV1 } from "@standard-schema/spec";
10
10
  import { RateLimitConfig } from "@geekmidas/rate-limit";
11
11
 
12
12
  //#region src/endpoints/EndpointBuilder.d.ts
13
+
13
14
  declare class EndpointBuilder<TRoute extends string, TMethod extends HttpMethod, TInput extends EndpointSchemas = {}, TServices extends Service[] = [], TLogger extends Logger = Logger, OutSchema extends StandardSchemaV1 | undefined = undefined, TSession = unknown, TEventPublisher extends EventPublisher<any> | undefined = undefined, TEventPublisherServiceName extends string = string, TAuthorizers extends readonly string[] = readonly string[], TAuditStorage extends AuditStorage | undefined = undefined, TAuditStorageServiceName extends string = string, TAuditAction extends AuditableAction<string, unknown> = AuditableAction<string, unknown>, TDatabase = undefined, TDatabaseServiceName extends string = string> extends BaseFunctionBuilder<TInput, OutSchema, TServices, TLogger, TEventPublisher, TEventPublisherServiceName, TAuditStorage, TAuditStorageServiceName, TDatabase, TDatabaseServiceName> {
14
15
  readonly route: TRoute;
15
16
  readonly method: TMethod;
@@ -26,6 +27,8 @@ declare class EndpointBuilder<TRoute extends string, TMethod extends HttpMethod,
26
27
  _actorExtractor?: ActorExtractor<TServices, TSession, TLogger>;
27
28
  _audits: MappedAudit<TAuditAction, OutSchema>[];
28
29
  _customSecuritySchemes: Record<string, SecurityScheme>;
30
+ _rlsConfig?: RlsConfig<TServices, TSession, TLogger>;
31
+ _rlsBypass?: boolean;
29
32
  constructor(route: TRoute, method: TMethod);
30
33
  _setPublisher(publisher: Service<TEventPublisherServiceName, TEventPublisher>): void;
31
34
  _setAuditorStorage(storage: Service<TAuditStorageServiceName, TAuditStorage>): void;
@@ -98,9 +101,43 @@ declare class EndpointBuilder<TRoute extends string, TMethod extends HttpMethod,
98
101
  * ```
99
102
  */
100
103
  database<T, TName extends string>(service: Service<TName, T>): EndpointBuilder<TRoute, TMethod, TInput, TServices, TLogger, OutSchema, TSession, TEventPublisher, TEventPublisherServiceName, TAuthorizers, TAuditStorage, TAuditStorageServiceName, TAuditAction, T, TName>;
104
+ /**
105
+ * Configure RLS (Row-Level Security) context for this endpoint.
106
+ * Pass `false` or `RLS_BYPASS` to explicitly bypass RLS for this endpoint.
107
+ *
108
+ * @example
109
+ * ```typescript
110
+ * // Custom RLS config for this endpoint
111
+ * .rls({
112
+ * extractor: ({ session }) => ({
113
+ * user_id: session.userId,
114
+ * tenant_id: session.tenantId,
115
+ * }),
116
+ * prefix: 'app',
117
+ * })
118
+ *
119
+ * // Bypass RLS (for admin endpoints)
120
+ * .rls(false)
121
+ * ```
122
+ */
123
+ rls(config: RlsConfig<TServices, TSession, TLogger> | false | RlsBypass): this;
124
+ /**
125
+ * Explicitly bypass RLS for this endpoint.
126
+ * Useful for admin operations that need unrestricted database access.
127
+ *
128
+ * @example
129
+ * ```typescript
130
+ * .rlsBypass()
131
+ * .handle(async ({ db }) => {
132
+ * // Full access, no RLS filtering
133
+ * return db.selectFrom('orders').selectAll().execute();
134
+ * })
135
+ * ```
136
+ */
137
+ rlsBypass(): this;
101
138
  input(_schema: any): any;
102
139
  handle(fn: EndpointHandler<TInput, TServices, TLogger, OutSchema, TSession, TDatabase, TAuditStorage, TAuditAction>): Endpoint<TRoute, TMethod, TInput, OutSchema, TServices, TLogger, TSession, TEventPublisher, TEventPublisherServiceName, TAuditStorage, TAuditStorageServiceName, TAuditAction, TDatabase, TDatabaseServiceName>;
103
140
  }
104
141
  //#endregion
105
142
  export { EndpointBuilder };
106
- //# sourceMappingURL=EndpointBuilder-CQ-jOXsD.d.cts.map
143
+ //# sourceMappingURL=EndpointBuilder-vXk6eIJk.d.cts.map
@@ -1,13 +1,13 @@
1
1
  import { Authorizer, BuiltInSecuritySchemeId, SecurityScheme } from "./Authorizer-CpSUMTIs.cjs";
2
- import { ActorExtractor, AuthorizeFn, SessionFn } from "./Endpoint-BJPJTGjV.cjs";
3
- import { EndpointBuilder } from "./EndpointBuilder-CQ-jOXsD.cjs";
2
+ import { ActorExtractor, AuthorizeFn, RlsConfig, SessionFn } from "./Endpoint-CC2RGjkl.cjs";
3
+ import { EndpointBuilder } from "./EndpointBuilder-vXk6eIJk.cjs";
4
4
  import { AuditStorage, AuditableAction, ExtractStorageAuditAction } from "@geekmidas/audit";
5
5
  import { EventPublisher, MappedEvent } from "@geekmidas/events";
6
6
  import { Logger } from "@geekmidas/logger";
7
7
  import { Service } from "@geekmidas/services";
8
8
 
9
9
  //#region src/endpoints/EndpointFactory.d.ts
10
- declare class EndpointFactory<TServices extends Service[] = [], TBasePath extends string = '', TLogger extends Logger = Logger, TSession = unknown, TEventPublisher extends EventPublisher<any> | undefined = undefined, TEventPublisherServiceName extends string = string, TAuthorizers extends readonly string[] = readonly string[], TAuditStorage extends AuditStorage<any> | undefined = undefined, TAuditStorageServiceName extends string = string, TAuditAction extends AuditableAction<string, unknown> = ExtractStorageAuditAction<NonNullable<TAuditStorage>>, TDatabase = undefined, TDatabaseServiceName extends string = string, TSecuritySchemes extends Record<string, SecurityScheme> = Record<string, SecurityScheme>> {
10
+ declare class EndpointFactory<TServices extends Service[] = [], TBasePath extends string = '', TLogger extends Logger = Logger, TSession = unknown, TEventPublisher extends EventPublisher<any> | undefined = undefined, TEventPublisherServiceName extends string = string, TAuthorizers extends readonly string[] = readonly string[], TAuditStorage extends AuditStorage<any> | undefined = undefined, TAuditStorageServiceName extends string = string, TAuditAction extends AuditableAction<string, unknown> = ExtractStorageAuditAction<NonNullable<TAuditStorage>>, TDatabase = undefined, TDatabaseServiceName extends string = string, TSecuritySchemes extends Record<string, SecurityScheme> = Record<string, SecurityScheme>, TRlsConfig extends RlsConfig<TServices, TSession, TLogger> | undefined = undefined> {
11
11
  private defaultServices;
12
12
  private basePath;
13
13
  private defaultAuthorizeFn?;
@@ -20,6 +20,7 @@ declare class EndpointFactory<TServices extends Service[] = [], TBasePath extend
20
20
  private defaultDatabaseService;
21
21
  private defaultActorExtractor?;
22
22
  private customSecuritySchemes;
23
+ private defaultRlsConfig?;
23
24
  constructor({
24
25
  basePath,
25
26
  defaultAuthorizeFn,
@@ -32,8 +33,9 @@ declare class EndpointFactory<TServices extends Service[] = [], TBasePath extend
32
33
  defaultAuditorStorage,
33
34
  defaultDatabaseService,
34
35
  defaultActorExtractor,
35
- customSecuritySchemes
36
- }?: EndpointFactoryOptions<TServices, TBasePath, TLogger, TSession, TEventPublisher, TEventPublisherServiceName, TAuthorizers, TAuditStorage, TAuditStorageServiceName, TDatabase, TDatabaseServiceName, TSecuritySchemes>);
36
+ customSecuritySchemes,
37
+ defaultRlsConfig
38
+ }?: EndpointFactoryOptions<TServices, TBasePath, TLogger, TSession, TEventPublisher, TEventPublisherServiceName, TAuthorizers, TAuditStorage, TAuditStorageServiceName, TDatabase, TDatabaseServiceName, TSecuritySchemes, TRlsConfig>);
37
39
  static joinPaths<TBasePath extends string, P extends string>(path: P, basePath?: TBasePath): JoinPaths<TBasePath, P>;
38
40
  authorizers<const T extends readonly string[]>(authorizers: T): EndpointFactory<TServices, TBasePath, TLogger, TSession, TEventPublisher, TEventPublisherServiceName, T, TAuditStorage, TAuditStorageServiceName, TAuditAction, TDatabase, TDatabaseServiceName, TSecuritySchemes>;
39
41
  /**
@@ -86,6 +88,25 @@ declare class EndpointFactory<TServices extends Service[] = [], TBasePath extend
86
88
  * The actor is extracted from the request context and attached to all audits.
87
89
  */
88
90
  actor(extractor: ActorExtractor<TServices, TSession, TLogger>): EndpointFactory<TServices, TBasePath, TLogger, TSession, TEventPublisher, TEventPublisherServiceName, TAuthorizers, TAuditStorage, TAuditStorageServiceName, TAuditAction, TDatabase, TDatabaseServiceName, TSecuritySchemes>;
91
+ /**
92
+ * Set the RLS (Row-Level Security) configuration for endpoints created from this factory.
93
+ * This enables automatic PostgreSQL session variable setting for RLS policies.
94
+ *
95
+ * @example
96
+ * ```typescript
97
+ * const api = new EndpointFactory()
98
+ * .database(databaseService)
99
+ * .session(extractSession)
100
+ * .rls({
101
+ * extractor: ({ session }) => ({
102
+ * user_id: session.userId,
103
+ * tenant_id: session.tenantId,
104
+ * }),
105
+ * prefix: 'app',
106
+ * });
107
+ * ```
108
+ */
109
+ rls<TConfig extends RlsConfig<TServices, TSession, TLogger>>(config: TConfig): EndpointFactory<TServices, TBasePath, TLogger, TSession, TEventPublisher, TEventPublisherServiceName, TAuthorizers, TAuditStorage, TAuditStorageServiceName, TAuditAction, TDatabase, TDatabaseServiceName, TSecuritySchemes, TConfig>;
89
110
  private createBuilder;
90
111
  post<TPath extends string>(path: TPath): EndpointBuilder<RemoveTrailingSlash<TBasePath extends "" ? TPath : TPath extends "" ? TBasePath : TBasePath extends "/" ? TPath extends `/${string}` ? TPath : `/${TPath}` : TBasePath extends `${infer Base}/` ? TPath extends `/${infer Rest}` ? `${Base}/${Rest}` : `${Base}/${TPath}` : TPath extends `/${infer Rest_1}` ? `${TBasePath}/${Rest_1}` : `${TBasePath}/${TPath}`>, "POST", {}, TServices, TLogger, undefined, TSession, TEventPublisher, TEventPublisherServiceName, TAuthorizers, TAuditStorage, TAuditStorageServiceName, TAuditAction, TDatabase, TDatabaseServiceName>;
91
112
  get<TPath extends string>(path: TPath): EndpointBuilder<RemoveTrailingSlash<TBasePath extends "" ? TPath : TPath extends "" ? TBasePath : TBasePath extends "/" ? TPath extends `/${string}` ? TPath : `/${TPath}` : TBasePath extends `${infer Base}/` ? TPath extends `/${infer Rest}` ? `${Base}/${Rest}` : `${Base}/${TPath}` : TPath extends `/${infer Rest_1}` ? `${TBasePath}/${Rest_1}` : `${TBasePath}/${TPath}`>, "GET", {}, TServices, TLogger, undefined, TSession, TEventPublisher, TEventPublisherServiceName, TAuthorizers, TAuditStorage, TAuditStorageServiceName, TAuditAction, TDatabase, TDatabaseServiceName>;
@@ -96,7 +117,7 @@ declare class EndpointFactory<TServices extends Service[] = [], TBasePath extend
96
117
  }
97
118
  type RemoveTrailingSlash<T extends string> = T extends `${infer Rest}/` ? Rest extends '' ? T : Rest : T;
98
119
  type JoinPaths<TBasePath extends string, TPath extends string> = RemoveTrailingSlash<TBasePath extends '' ? TPath : TPath extends '' ? TBasePath : TBasePath extends '/' ? TPath extends `/${string}` ? TPath : `/${TPath}` : TBasePath extends `${infer Base}/` ? TPath extends `/${infer Rest}` ? `${Base}/${Rest}` : `${Base}/${TPath}` : TPath extends `/${infer Rest}` ? `${TBasePath}/${Rest}` : `${TBasePath}/${TPath}`>;
99
- interface EndpointFactoryOptions<TServices extends Service[] = [], TBasePath extends string = '', TLogger extends Logger = Logger, TSession = unknown, TEventPublisher extends EventPublisher<any> | undefined = undefined, TEventPublisherServiceName extends string = string, TAuthorizers extends readonly string[] = readonly string[], TAuditStorage extends AuditStorage | undefined = undefined, TAuditStorageServiceName extends string = string, TDatabase = undefined, TDatabaseServiceName extends string = string, TSecuritySchemes extends Record<string, SecurityScheme> = Record<string, SecurityScheme>> {
120
+ interface EndpointFactoryOptions<TServices extends Service[] = [], TBasePath extends string = '', TLogger extends Logger = Logger, TSession = unknown, TEventPublisher extends EventPublisher<any> | undefined = undefined, TEventPublisherServiceName extends string = string, TAuthorizers extends readonly string[] = readonly string[], TAuditStorage extends AuditStorage | undefined = undefined, TAuditStorageServiceName extends string = string, TDatabase = undefined, TDatabaseServiceName extends string = string, TSecuritySchemes extends Record<string, SecurityScheme> = Record<string, SecurityScheme>, TRlsConfig extends RlsConfig<TServices, TSession, TLogger> | undefined = undefined> {
100
121
  defaultServices?: TServices;
101
122
  basePath?: TBasePath;
102
123
  defaultAuthorizeFn?: AuthorizeFn<TServices, TLogger, TSession>;
@@ -110,8 +131,9 @@ interface EndpointFactoryOptions<TServices extends Service[] = [], TBasePath ext
110
131
  defaultDatabaseService?: Service<TDatabaseServiceName, TDatabase>;
111
132
  defaultActorExtractor?: ActorExtractor<TServices, TSession, TLogger>;
112
133
  customSecuritySchemes?: TSecuritySchemes;
134
+ defaultRlsConfig?: TRlsConfig;
113
135
  }
114
- declare const e: EndpointFactory<[], "", Logger, unknown, undefined, string, readonly string[], undefined, string, never, undefined, string, Record<string, SecurityScheme>>;
136
+ declare const e: EndpointFactory<[], "", Logger, unknown, undefined, string, readonly string[], undefined, string, never, undefined, string, Record<string, SecurityScheme>, undefined>;
115
137
  //#endregion
116
138
  export { EndpointFactory, EndpointFactoryOptions, JoinPaths, RemoveTrailingSlash, e };
117
- //# sourceMappingURL=EndpointFactory-DgwmAR_8.d.cts.map
139
+ //# sourceMappingURL=EndpointFactory-3g-7Rznt.d.cts.map
@@ -1,13 +1,13 @@
1
- import { Authorizer, BuiltInSecuritySchemeId, SecurityScheme } from "./Authorizer-D1w7MpK6.mjs";
2
- import { ActorExtractor, AuthorizeFn, SessionFn } from "./Endpoint-DoY1Owv2.mjs";
3
- import { EndpointBuilder } from "./EndpointBuilder-BJRkivxQ.mjs";
1
+ import { Authorizer, BuiltInSecuritySchemeId, SecurityScheme } from "./Authorizer-Cpx59w_q.mjs";
2
+ import { ActorExtractor, AuthorizeFn, RlsConfig, SessionFn } from "./Endpoint-C5djXyae.mjs";
3
+ import { EndpointBuilder } from "./EndpointBuilder-CD8LkBda.mjs";
4
4
  import { Service } from "@geekmidas/services";
5
5
  import { AuditStorage, AuditableAction, ExtractStorageAuditAction } from "@geekmidas/audit";
6
6
  import { EventPublisher, MappedEvent } from "@geekmidas/events";
7
7
  import { Logger } from "@geekmidas/logger";
8
8
 
9
9
  //#region src/endpoints/EndpointFactory.d.ts
10
- declare class EndpointFactory<TServices extends Service[] = [], TBasePath extends string = '', TLogger extends Logger = Logger, TSession = unknown, TEventPublisher extends EventPublisher<any> | undefined = undefined, TEventPublisherServiceName extends string = string, TAuthorizers extends readonly string[] = readonly string[], TAuditStorage extends AuditStorage<any> | undefined = undefined, TAuditStorageServiceName extends string = string, TAuditAction extends AuditableAction<string, unknown> = ExtractStorageAuditAction<NonNullable<TAuditStorage>>, TDatabase = undefined, TDatabaseServiceName extends string = string, TSecuritySchemes extends Record<string, SecurityScheme> = Record<string, SecurityScheme>> {
10
+ declare class EndpointFactory<TServices extends Service[] = [], TBasePath extends string = '', TLogger extends Logger = Logger, TSession = unknown, TEventPublisher extends EventPublisher<any> | undefined = undefined, TEventPublisherServiceName extends string = string, TAuthorizers extends readonly string[] = readonly string[], TAuditStorage extends AuditStorage<any> | undefined = undefined, TAuditStorageServiceName extends string = string, TAuditAction extends AuditableAction<string, unknown> = ExtractStorageAuditAction<NonNullable<TAuditStorage>>, TDatabase = undefined, TDatabaseServiceName extends string = string, TSecuritySchemes extends Record<string, SecurityScheme> = Record<string, SecurityScheme>, TRlsConfig extends RlsConfig<TServices, TSession, TLogger> | undefined = undefined> {
11
11
  private defaultServices;
12
12
  private basePath;
13
13
  private defaultAuthorizeFn?;
@@ -20,6 +20,7 @@ declare class EndpointFactory<TServices extends Service[] = [], TBasePath extend
20
20
  private defaultDatabaseService;
21
21
  private defaultActorExtractor?;
22
22
  private customSecuritySchemes;
23
+ private defaultRlsConfig?;
23
24
  constructor({
24
25
  basePath,
25
26
  defaultAuthorizeFn,
@@ -32,8 +33,9 @@ declare class EndpointFactory<TServices extends Service[] = [], TBasePath extend
32
33
  defaultAuditorStorage,
33
34
  defaultDatabaseService,
34
35
  defaultActorExtractor,
35
- customSecuritySchemes
36
- }?: EndpointFactoryOptions<TServices, TBasePath, TLogger, TSession, TEventPublisher, TEventPublisherServiceName, TAuthorizers, TAuditStorage, TAuditStorageServiceName, TDatabase, TDatabaseServiceName, TSecuritySchemes>);
36
+ customSecuritySchemes,
37
+ defaultRlsConfig
38
+ }?: EndpointFactoryOptions<TServices, TBasePath, TLogger, TSession, TEventPublisher, TEventPublisherServiceName, TAuthorizers, TAuditStorage, TAuditStorageServiceName, TDatabase, TDatabaseServiceName, TSecuritySchemes, TRlsConfig>);
37
39
  static joinPaths<TBasePath extends string, P extends string>(path: P, basePath?: TBasePath): JoinPaths<TBasePath, P>;
38
40
  authorizers<const T extends readonly string[]>(authorizers: T): EndpointFactory<TServices, TBasePath, TLogger, TSession, TEventPublisher, TEventPublisherServiceName, T, TAuditStorage, TAuditStorageServiceName, TAuditAction, TDatabase, TDatabaseServiceName, TSecuritySchemes>;
39
41
  /**
@@ -86,6 +88,25 @@ declare class EndpointFactory<TServices extends Service[] = [], TBasePath extend
86
88
  * The actor is extracted from the request context and attached to all audits.
87
89
  */
88
90
  actor(extractor: ActorExtractor<TServices, TSession, TLogger>): EndpointFactory<TServices, TBasePath, TLogger, TSession, TEventPublisher, TEventPublisherServiceName, TAuthorizers, TAuditStorage, TAuditStorageServiceName, TAuditAction, TDatabase, TDatabaseServiceName, TSecuritySchemes>;
91
+ /**
92
+ * Set the RLS (Row-Level Security) configuration for endpoints created from this factory.
93
+ * This enables automatic PostgreSQL session variable setting for RLS policies.
94
+ *
95
+ * @example
96
+ * ```typescript
97
+ * const api = new EndpointFactory()
98
+ * .database(databaseService)
99
+ * .session(extractSession)
100
+ * .rls({
101
+ * extractor: ({ session }) => ({
102
+ * user_id: session.userId,
103
+ * tenant_id: session.tenantId,
104
+ * }),
105
+ * prefix: 'app',
106
+ * });
107
+ * ```
108
+ */
109
+ rls<TConfig extends RlsConfig<TServices, TSession, TLogger>>(config: TConfig): EndpointFactory<TServices, TBasePath, TLogger, TSession, TEventPublisher, TEventPublisherServiceName, TAuthorizers, TAuditStorage, TAuditStorageServiceName, TAuditAction, TDatabase, TDatabaseServiceName, TSecuritySchemes, TConfig>;
89
110
  private createBuilder;
90
111
  post<TPath extends string>(path: TPath): EndpointBuilder<RemoveTrailingSlash<TBasePath extends "" ? TPath : TPath extends "" ? TBasePath : TBasePath extends "/" ? TPath extends `/${string}` ? TPath : `/${TPath}` : TBasePath extends `${infer Base}/` ? TPath extends `/${infer Rest}` ? `${Base}/${Rest}` : `${Base}/${TPath}` : TPath extends `/${infer Rest_1}` ? `${TBasePath}/${Rest_1}` : `${TBasePath}/${TPath}`>, "POST", {}, TServices, TLogger, undefined, TSession, TEventPublisher, TEventPublisherServiceName, TAuthorizers, TAuditStorage, TAuditStorageServiceName, TAuditAction, TDatabase, TDatabaseServiceName>;
91
112
  get<TPath extends string>(path: TPath): EndpointBuilder<RemoveTrailingSlash<TBasePath extends "" ? TPath : TPath extends "" ? TBasePath : TBasePath extends "/" ? TPath extends `/${string}` ? TPath : `/${TPath}` : TBasePath extends `${infer Base}/` ? TPath extends `/${infer Rest}` ? `${Base}/${Rest}` : `${Base}/${TPath}` : TPath extends `/${infer Rest_1}` ? `${TBasePath}/${Rest_1}` : `${TBasePath}/${TPath}`>, "GET", {}, TServices, TLogger, undefined, TSession, TEventPublisher, TEventPublisherServiceName, TAuthorizers, TAuditStorage, TAuditStorageServiceName, TAuditAction, TDatabase, TDatabaseServiceName>;
@@ -96,7 +117,7 @@ declare class EndpointFactory<TServices extends Service[] = [], TBasePath extend
96
117
  }
97
118
  type RemoveTrailingSlash<T extends string> = T extends `${infer Rest}/` ? Rest extends '' ? T : Rest : T;
98
119
  type JoinPaths<TBasePath extends string, TPath extends string> = RemoveTrailingSlash<TBasePath extends '' ? TPath : TPath extends '' ? TBasePath : TBasePath extends '/' ? TPath extends `/${string}` ? TPath : `/${TPath}` : TBasePath extends `${infer Base}/` ? TPath extends `/${infer Rest}` ? `${Base}/${Rest}` : `${Base}/${TPath}` : TPath extends `/${infer Rest}` ? `${TBasePath}/${Rest}` : `${TBasePath}/${TPath}`>;
99
- interface EndpointFactoryOptions<TServices extends Service[] = [], TBasePath extends string = '', TLogger extends Logger = Logger, TSession = unknown, TEventPublisher extends EventPublisher<any> | undefined = undefined, TEventPublisherServiceName extends string = string, TAuthorizers extends readonly string[] = readonly string[], TAuditStorage extends AuditStorage | undefined = undefined, TAuditStorageServiceName extends string = string, TDatabase = undefined, TDatabaseServiceName extends string = string, TSecuritySchemes extends Record<string, SecurityScheme> = Record<string, SecurityScheme>> {
120
+ interface EndpointFactoryOptions<TServices extends Service[] = [], TBasePath extends string = '', TLogger extends Logger = Logger, TSession = unknown, TEventPublisher extends EventPublisher<any> | undefined = undefined, TEventPublisherServiceName extends string = string, TAuthorizers extends readonly string[] = readonly string[], TAuditStorage extends AuditStorage | undefined = undefined, TAuditStorageServiceName extends string = string, TDatabase = undefined, TDatabaseServiceName extends string = string, TSecuritySchemes extends Record<string, SecurityScheme> = Record<string, SecurityScheme>, TRlsConfig extends RlsConfig<TServices, TSession, TLogger> | undefined = undefined> {
100
121
  defaultServices?: TServices;
101
122
  basePath?: TBasePath;
102
123
  defaultAuthorizeFn?: AuthorizeFn<TServices, TLogger, TSession>;
@@ -110,8 +131,9 @@ interface EndpointFactoryOptions<TServices extends Service[] = [], TBasePath ext
110
131
  defaultDatabaseService?: Service<TDatabaseServiceName, TDatabase>;
111
132
  defaultActorExtractor?: ActorExtractor<TServices, TSession, TLogger>;
112
133
  customSecuritySchemes?: TSecuritySchemes;
134
+ defaultRlsConfig?: TRlsConfig;
113
135
  }
114
- declare const e: EndpointFactory<[], "", Logger, unknown, undefined, string, readonly string[], undefined, string, never, undefined, string, Record<string, SecurityScheme>>;
136
+ declare const e: EndpointFactory<[], "", Logger, unknown, undefined, string, readonly string[], undefined, string, never, undefined, string, Record<string, SecurityScheme>, undefined>;
115
137
  //#endregion
116
138
  export { EndpointFactory, EndpointFactoryOptions, JoinPaths, RemoveTrailingSlash, e };
117
- //# sourceMappingURL=EndpointFactory-BKEPcQgE.d.mts.map
139
+ //# sourceMappingURL=EndpointFactory-DaFR9LQG.d.mts.map