@getstrata/bootstrap 0.2.60 → 0.2.62

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # @getstrata/bootstrap changelog
2
2
 
3
+ ## 0.2.62
4
+
5
+ - `HttpKernel.wrapWebPasswordConfirm()` is Laravel `password.confirm` for HTML routes. Peer `@getstrata/core` `^0.5.75`.
6
+
7
+ ## 0.2.61
8
+
9
+ - `HttpKernel.wrapVerified()` / `wrapWebVerified()` / `wrapWebAuthenticatedAllowUnverified()`. When `FEATURE_EMAIL_VERIFICATION=true`, `wrapWebAuthenticated` and `wrapWebAbility` require a verified email. Peer `@getstrata/core` `^0.5.74`.
10
+
3
11
  ## 0.2.60
4
12
 
5
13
  - Peer `@getstrata/core` `^0.5.73` for public OpenAPI email verification resend.
@@ -14,9 +14,16 @@ declare class HttpKernel {
14
14
  wrapWebGuest(handler: RouteHandler, home?: string): RouteHandler;
15
15
  wrapWebPublicRead(handler: RouteHandler): RouteHandler;
16
16
  wrapWebAuthenticated(handler: RouteHandler): RouteHandler;
17
+ /** Signed-in HTML without Laravel `verified` (logout, verification notice). */
18
+ wrapWebAuthenticatedAllowUnverified(handler: RouteHandler): RouteHandler;
19
+ wrapWebVerified(handler: RouteHandler): RouteHandler;
20
+ /** Laravel `password.confirm` — requires a fresh signed confirmation cookie. */
21
+ wrapWebPasswordConfirm(handler: RouteHandler): RouteHandler;
17
22
  wrapWebAbility(ability: string, handler: RouteHandler): RouteHandler;
18
23
  wrapWebGlobalAdmin(handler: RouteHandler): RouteHandler;
19
24
  wrapAuthenticated(handler: RouteHandler): RouteHandler;
25
+ /** Laravel `verified` for JSON/API routes. No-op when `FEATURE_EMAIL_VERIFICATION` is off. */
26
+ wrapVerified(handler: RouteHandler): RouteHandler;
20
27
  wrapPublicRead(handler: RouteHandler): RouteHandler;
21
28
  wrapGlobalAdmin(handler: RouteHandler): RouteHandler;
22
29
  wrapAbility(ability: string, handler: RouteHandler): RouteHandler;
@@ -24,6 +31,8 @@ declare class HttpKernel {
24
31
  wrapLogin(handler: RouteHandler): RouteHandler;
25
32
  wrapSigned(handler: RouteHandler): RouteHandler;
26
33
  wrapRegister(handler: RouteHandler): RouteHandler;
34
+ private wrapWebAuth;
35
+ private verifiedMiddleware;
27
36
  private wrapThrottle;
28
37
  }
29
38
  declare function createHttpKernel(dependencies: AppDependencies): HttpKernel;
@@ -6,6 +6,10 @@ import { conditionalJsonResponse } from "@getstrata/core/http/conditionalRespons
6
6
  import { applyMiddlewareToRoutes } from "@getstrata/core/http/middleware";
7
7
 
8
8
  // ../../src/bootstrap/httpKernel.ts
9
+ import {
10
+ hasVerifiedEmail,
11
+ isEmailVerificationRequired
12
+ } from "@getstrata/core/auth/emailVerification";
9
13
  import { createMembershipMiddleware } from "@getstrata/core/auth/membershipMiddleware";
10
14
  import { resolveAbilityChecker } from "@getstrata/core/contracts/serviceTokens";
11
15
  import { createAuthMiddleware } from "@getstrata/core/http/authMiddleware";
@@ -21,6 +25,8 @@ import { requestIdMiddleware } from "@getstrata/core/http/middleware";
21
25
  import { createRequireAbilityMiddleware } from "@getstrata/core/http/requireAbilityMiddleware";
22
26
  import { createRequireAuthMiddleware } from "@getstrata/core/http/requireAuthMiddleware";
23
27
  import { createRequireGlobalAdminMiddleware } from "@getstrata/core/http/requireGlobalAdminMiddleware";
28
+ import { createRequirePasswordConfirmMiddleware } from "@getstrata/core/http/requirePasswordConfirmMiddleware";
29
+ import { createRequireVerifiedMiddleware } from "@getstrata/core/http/requireVerifiedMiddleware";
24
30
  import { createRequireWebAuthMiddleware } from "@getstrata/core/http/requireWebAuthMiddleware";
25
31
  import { withErrorHandling } from "@getstrata/core/http/response";
26
32
  import { withMiddleware } from "@getstrata/core/http/routeMiddleware";
@@ -180,6 +186,9 @@ class HttpKernel {
180
186
  return this.wrapWeb(async (request) => {
181
187
  const user = await auth.resolve(request);
182
188
  if (user) {
189
+ if (isEmailVerificationRequired() && !hasVerifiedEmail(user)) {
190
+ return Response.redirect("/email/verify", 302);
191
+ }
183
192
  return Response.redirect(home, 302);
184
193
  }
185
194
  return handler(request);
@@ -192,24 +201,46 @@ class HttpKernel {
192
201
  return this.wrapWebAuthenticated(handler);
193
202
  }
194
203
  wrapWebAuthenticated(handler) {
195
- const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
196
- return this.wrapWeb(withMiddleware(createRequireWebAuthMiddleware(auth))(handler));
204
+ return this.wrapWebAuth(handler, { verified: true });
205
+ }
206
+ wrapWebAuthenticatedAllowUnverified(handler) {
207
+ return this.wrapWebAuth(handler, { verified: false });
208
+ }
209
+ wrapWebVerified(handler) {
210
+ return this.wrapWebAuth(handler, { verified: true });
211
+ }
212
+ wrapWebPasswordConfirm(handler) {
213
+ return this.wrapWebAuth(withMiddleware(createRequirePasswordConfirmMiddleware())(handler), {
214
+ verified: true
215
+ });
197
216
  }
198
217
  wrapWebAbility(ability, handler) {
199
218
  const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
200
219
  const abilityChecker = resolveAbilityChecker(this.dependencies.container);
201
220
  const requireAbility = createRequireAbilityMiddleware(abilityChecker);
202
- const middleware = [createRequireWebAuthMiddleware(auth), requireAbility(ability)];
221
+ const middleware = [
222
+ createRequireWebAuthMiddleware(auth),
223
+ ...this.verifiedMiddleware(),
224
+ requireAbility(ability)
225
+ ];
203
226
  return this.wrapWeb(withMiddleware(...middleware)(handler));
204
227
  }
205
228
  wrapWebGlobalAdmin(handler) {
206
229
  const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
207
- const middleware = [createRequireWebAuthMiddleware(auth), createRequireGlobalAdminMiddleware()];
230
+ const middleware = [
231
+ createRequireWebAuthMiddleware(auth),
232
+ ...this.verifiedMiddleware(),
233
+ createRequireGlobalAdminMiddleware()
234
+ ];
208
235
  return this.wrapWeb(withMiddleware(...middleware)(handler));
209
236
  }
210
237
  wrapAuthenticated(handler) {
211
238
  return this.wrap("authenticated", handler);
212
239
  }
240
+ wrapVerified(handler) {
241
+ const middleware = [...this.group("authenticated"), ...this.verifiedMiddleware()];
242
+ return withMiddleware(...middleware)(handler);
243
+ }
213
244
  wrapPublicRead(handler) {
214
245
  if (isPublicReadsEnabled()) {
215
246
  return handler;
@@ -240,6 +271,18 @@ class HttpKernel {
240
271
  wrapRegister(handler) {
241
272
  return this.wrapThrottle("register", resolveRegisterRateLimit(), handler);
242
273
  }
274
+ wrapWebAuth(handler, options) {
275
+ const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
276
+ const middleware = [
277
+ createRequireWebAuthMiddleware(auth),
278
+ ...options.verified ? this.verifiedMiddleware() : []
279
+ ];
280
+ return this.wrapWeb(withMiddleware(...middleware)(handler));
281
+ }
282
+ verifiedMiddleware() {
283
+ const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
284
+ return [createRequireVerifiedMiddleware(auth)];
285
+ }
243
286
  wrapThrottle(scope, rateLimit, handler) {
244
287
  const middleware = [];
245
288
  const memoryKeyPrefix = scope === "login" ? "login-throttle:" : "register-throttle:";
@@ -9,6 +9,10 @@ import { conditionalJsonResponse } from "@getstrata/core/http/conditionalRespons
9
9
  import { applyMiddlewareToRoutes } from "@getstrata/core/http/middleware";
10
10
 
11
11
  // ../../src/bootstrap/httpKernel.ts
12
+ import {
13
+ hasVerifiedEmail,
14
+ isEmailVerificationRequired
15
+ } from "@getstrata/core/auth/emailVerification";
12
16
  import { createMembershipMiddleware } from "@getstrata/core/auth/membershipMiddleware";
13
17
  import { resolveAbilityChecker } from "@getstrata/core/contracts/serviceTokens";
14
18
  import { createAuthMiddleware } from "@getstrata/core/http/authMiddleware";
@@ -24,6 +28,8 @@ import { requestIdMiddleware } from "@getstrata/core/http/middleware";
24
28
  import { createRequireAbilityMiddleware } from "@getstrata/core/http/requireAbilityMiddleware";
25
29
  import { createRequireAuthMiddleware } from "@getstrata/core/http/requireAuthMiddleware";
26
30
  import { createRequireGlobalAdminMiddleware } from "@getstrata/core/http/requireGlobalAdminMiddleware";
31
+ import { createRequirePasswordConfirmMiddleware } from "@getstrata/core/http/requirePasswordConfirmMiddleware";
32
+ import { createRequireVerifiedMiddleware } from "@getstrata/core/http/requireVerifiedMiddleware";
27
33
  import { createRequireWebAuthMiddleware } from "@getstrata/core/http/requireWebAuthMiddleware";
28
34
  import { withErrorHandling } from "@getstrata/core/http/response";
29
35
  import { withMiddleware } from "@getstrata/core/http/routeMiddleware";
@@ -183,6 +189,9 @@ class HttpKernel {
183
189
  return this.wrapWeb(async (request) => {
184
190
  const user = await auth.resolve(request);
185
191
  if (user) {
192
+ if (isEmailVerificationRequired() && !hasVerifiedEmail(user)) {
193
+ return Response.redirect("/email/verify", 302);
194
+ }
186
195
  return Response.redirect(home, 302);
187
196
  }
188
197
  return handler(request);
@@ -195,24 +204,46 @@ class HttpKernel {
195
204
  return this.wrapWebAuthenticated(handler);
196
205
  }
197
206
  wrapWebAuthenticated(handler) {
198
- const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
199
- return this.wrapWeb(withMiddleware(createRequireWebAuthMiddleware(auth))(handler));
207
+ return this.wrapWebAuth(handler, { verified: true });
208
+ }
209
+ wrapWebAuthenticatedAllowUnverified(handler) {
210
+ return this.wrapWebAuth(handler, { verified: false });
211
+ }
212
+ wrapWebVerified(handler) {
213
+ return this.wrapWebAuth(handler, { verified: true });
214
+ }
215
+ wrapWebPasswordConfirm(handler) {
216
+ return this.wrapWebAuth(withMiddleware(createRequirePasswordConfirmMiddleware())(handler), {
217
+ verified: true
218
+ });
200
219
  }
201
220
  wrapWebAbility(ability, handler) {
202
221
  const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
203
222
  const abilityChecker = resolveAbilityChecker(this.dependencies.container);
204
223
  const requireAbility = createRequireAbilityMiddleware(abilityChecker);
205
- const middleware = [createRequireWebAuthMiddleware(auth), requireAbility(ability)];
224
+ const middleware = [
225
+ createRequireWebAuthMiddleware(auth),
226
+ ...this.verifiedMiddleware(),
227
+ requireAbility(ability)
228
+ ];
206
229
  return this.wrapWeb(withMiddleware(...middleware)(handler));
207
230
  }
208
231
  wrapWebGlobalAdmin(handler) {
209
232
  const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
210
- const middleware = [createRequireWebAuthMiddleware(auth), createRequireGlobalAdminMiddleware()];
233
+ const middleware = [
234
+ createRequireWebAuthMiddleware(auth),
235
+ ...this.verifiedMiddleware(),
236
+ createRequireGlobalAdminMiddleware()
237
+ ];
211
238
  return this.wrapWeb(withMiddleware(...middleware)(handler));
212
239
  }
213
240
  wrapAuthenticated(handler) {
214
241
  return this.wrap("authenticated", handler);
215
242
  }
243
+ wrapVerified(handler) {
244
+ const middleware = [...this.group("authenticated"), ...this.verifiedMiddleware()];
245
+ return withMiddleware(...middleware)(handler);
246
+ }
216
247
  wrapPublicRead(handler) {
217
248
  if (isPublicReadsEnabled()) {
218
249
  return handler;
@@ -243,6 +274,18 @@ class HttpKernel {
243
274
  wrapRegister(handler) {
244
275
  return this.wrapThrottle("register", resolveRegisterRateLimit(), handler);
245
276
  }
277
+ wrapWebAuth(handler, options) {
278
+ const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
279
+ const middleware = [
280
+ createRequireWebAuthMiddleware(auth),
281
+ ...options.verified ? this.verifiedMiddleware() : []
282
+ ];
283
+ return this.wrapWeb(withMiddleware(...middleware)(handler));
284
+ }
285
+ verifiedMiddleware() {
286
+ const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
287
+ return [createRequireVerifiedMiddleware(auth)];
288
+ }
246
289
  wrapThrottle(scope, rateLimit, handler) {
247
290
  const middleware = [];
248
291
  const memoryKeyPrefix = scope === "login" ? "login-throttle:" : "register-throttle:";
@@ -46,6 +46,10 @@ import { conditionalJsonResponse } from "@getstrata/core/http/conditionalRespons
46
46
  import { applyMiddlewareToRoutes } from "@getstrata/core/http/middleware";
47
47
 
48
48
  // ../../src/bootstrap/httpKernel.ts
49
+ import {
50
+ hasVerifiedEmail,
51
+ isEmailVerificationRequired
52
+ } from "@getstrata/core/auth/emailVerification";
49
53
  import { createMembershipMiddleware } from "@getstrata/core/auth/membershipMiddleware";
50
54
  import { resolveAbilityChecker } from "@getstrata/core/contracts/serviceTokens";
51
55
  import { createAuthMiddleware } from "@getstrata/core/http/authMiddleware";
@@ -61,6 +65,8 @@ import { requestIdMiddleware } from "@getstrata/core/http/middleware";
61
65
  import { createRequireAbilityMiddleware } from "@getstrata/core/http/requireAbilityMiddleware";
62
66
  import { createRequireAuthMiddleware } from "@getstrata/core/http/requireAuthMiddleware";
63
67
  import { createRequireGlobalAdminMiddleware } from "@getstrata/core/http/requireGlobalAdminMiddleware";
68
+ import { createRequirePasswordConfirmMiddleware } from "@getstrata/core/http/requirePasswordConfirmMiddleware";
69
+ import { createRequireVerifiedMiddleware } from "@getstrata/core/http/requireVerifiedMiddleware";
64
70
  import { createRequireWebAuthMiddleware } from "@getstrata/core/http/requireWebAuthMiddleware";
65
71
  import { withErrorHandling } from "@getstrata/core/http/response";
66
72
  import { withMiddleware } from "@getstrata/core/http/routeMiddleware";
@@ -220,6 +226,9 @@ class HttpKernel {
220
226
  return this.wrapWeb(async (request) => {
221
227
  const user = await auth.resolve(request);
222
228
  if (user) {
229
+ if (isEmailVerificationRequired() && !hasVerifiedEmail(user)) {
230
+ return Response.redirect("/email/verify", 302);
231
+ }
223
232
  return Response.redirect(home, 302);
224
233
  }
225
234
  return handler(request);
@@ -232,24 +241,46 @@ class HttpKernel {
232
241
  return this.wrapWebAuthenticated(handler);
233
242
  }
234
243
  wrapWebAuthenticated(handler) {
235
- const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
236
- return this.wrapWeb(withMiddleware(createRequireWebAuthMiddleware(auth))(handler));
244
+ return this.wrapWebAuth(handler, { verified: true });
245
+ }
246
+ wrapWebAuthenticatedAllowUnverified(handler) {
247
+ return this.wrapWebAuth(handler, { verified: false });
248
+ }
249
+ wrapWebVerified(handler) {
250
+ return this.wrapWebAuth(handler, { verified: true });
251
+ }
252
+ wrapWebPasswordConfirm(handler) {
253
+ return this.wrapWebAuth(withMiddleware(createRequirePasswordConfirmMiddleware())(handler), {
254
+ verified: true
255
+ });
237
256
  }
238
257
  wrapWebAbility(ability, handler) {
239
258
  const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
240
259
  const abilityChecker = resolveAbilityChecker(this.dependencies.container);
241
260
  const requireAbility = createRequireAbilityMiddleware(abilityChecker);
242
- const middleware = [createRequireWebAuthMiddleware(auth), requireAbility(ability)];
261
+ const middleware = [
262
+ createRequireWebAuthMiddleware(auth),
263
+ ...this.verifiedMiddleware(),
264
+ requireAbility(ability)
265
+ ];
243
266
  return this.wrapWeb(withMiddleware(...middleware)(handler));
244
267
  }
245
268
  wrapWebGlobalAdmin(handler) {
246
269
  const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
247
- const middleware = [createRequireWebAuthMiddleware(auth), createRequireGlobalAdminMiddleware()];
270
+ const middleware = [
271
+ createRequireWebAuthMiddleware(auth),
272
+ ...this.verifiedMiddleware(),
273
+ createRequireGlobalAdminMiddleware()
274
+ ];
248
275
  return this.wrapWeb(withMiddleware(...middleware)(handler));
249
276
  }
250
277
  wrapAuthenticated(handler) {
251
278
  return this.wrap("authenticated", handler);
252
279
  }
280
+ wrapVerified(handler) {
281
+ const middleware = [...this.group("authenticated"), ...this.verifiedMiddleware()];
282
+ return withMiddleware(...middleware)(handler);
283
+ }
253
284
  wrapPublicRead(handler) {
254
285
  if (isPublicReadsEnabled()) {
255
286
  return handler;
@@ -280,6 +311,18 @@ class HttpKernel {
280
311
  wrapRegister(handler) {
281
312
  return this.wrapThrottle("register", resolveRegisterRateLimit(), handler);
282
313
  }
314
+ wrapWebAuth(handler, options) {
315
+ const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
316
+ const middleware = [
317
+ createRequireWebAuthMiddleware(auth),
318
+ ...options.verified ? this.verifiedMiddleware() : []
319
+ ];
320
+ return this.wrapWeb(withMiddleware(...middleware)(handler));
321
+ }
322
+ verifiedMiddleware() {
323
+ const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
324
+ return [createRequireVerifiedMiddleware(auth)];
325
+ }
283
326
  wrapThrottle(scope, rateLimit, handler) {
284
327
  const middleware = [];
285
328
  const memoryKeyPrefix = scope === "login" ? "login-throttle:" : "register-throttle:";
@@ -14,6 +14,10 @@ import { conditionalJsonResponse } from "@getstrata/core/http/conditionalRespons
14
14
  import { applyMiddlewareToRoutes } from "@getstrata/core/http/middleware";
15
15
 
16
16
  // ../../src/bootstrap/httpKernel.ts
17
+ import {
18
+ hasVerifiedEmail,
19
+ isEmailVerificationRequired
20
+ } from "@getstrata/core/auth/emailVerification";
17
21
  import { createMembershipMiddleware } from "@getstrata/core/auth/membershipMiddleware";
18
22
  import { resolveAbilityChecker } from "@getstrata/core/contracts/serviceTokens";
19
23
  import { createAuthMiddleware } from "@getstrata/core/http/authMiddleware";
@@ -29,6 +33,8 @@ import { requestIdMiddleware } from "@getstrata/core/http/middleware";
29
33
  import { createRequireAbilityMiddleware } from "@getstrata/core/http/requireAbilityMiddleware";
30
34
  import { createRequireAuthMiddleware } from "@getstrata/core/http/requireAuthMiddleware";
31
35
  import { createRequireGlobalAdminMiddleware } from "@getstrata/core/http/requireGlobalAdminMiddleware";
36
+ import { createRequirePasswordConfirmMiddleware } from "@getstrata/core/http/requirePasswordConfirmMiddleware";
37
+ import { createRequireVerifiedMiddleware } from "@getstrata/core/http/requireVerifiedMiddleware";
32
38
  import { createRequireWebAuthMiddleware } from "@getstrata/core/http/requireWebAuthMiddleware";
33
39
  import { withErrorHandling } from "@getstrata/core/http/response";
34
40
  import { withMiddleware } from "@getstrata/core/http/routeMiddleware";
@@ -188,6 +194,9 @@ class HttpKernel {
188
194
  return this.wrapWeb(async (request) => {
189
195
  const user = await auth.resolve(request);
190
196
  if (user) {
197
+ if (isEmailVerificationRequired() && !hasVerifiedEmail(user)) {
198
+ return Response.redirect("/email/verify", 302);
199
+ }
191
200
  return Response.redirect(home, 302);
192
201
  }
193
202
  return handler(request);
@@ -200,24 +209,46 @@ class HttpKernel {
200
209
  return this.wrapWebAuthenticated(handler);
201
210
  }
202
211
  wrapWebAuthenticated(handler) {
203
- const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
204
- return this.wrapWeb(withMiddleware(createRequireWebAuthMiddleware(auth))(handler));
212
+ return this.wrapWebAuth(handler, { verified: true });
213
+ }
214
+ wrapWebAuthenticatedAllowUnverified(handler) {
215
+ return this.wrapWebAuth(handler, { verified: false });
216
+ }
217
+ wrapWebVerified(handler) {
218
+ return this.wrapWebAuth(handler, { verified: true });
219
+ }
220
+ wrapWebPasswordConfirm(handler) {
221
+ return this.wrapWebAuth(withMiddleware(createRequirePasswordConfirmMiddleware())(handler), {
222
+ verified: true
223
+ });
205
224
  }
206
225
  wrapWebAbility(ability, handler) {
207
226
  const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
208
227
  const abilityChecker = resolveAbilityChecker(this.dependencies.container);
209
228
  const requireAbility = createRequireAbilityMiddleware(abilityChecker);
210
- const middleware = [createRequireWebAuthMiddleware(auth), requireAbility(ability)];
229
+ const middleware = [
230
+ createRequireWebAuthMiddleware(auth),
231
+ ...this.verifiedMiddleware(),
232
+ requireAbility(ability)
233
+ ];
211
234
  return this.wrapWeb(withMiddleware(...middleware)(handler));
212
235
  }
213
236
  wrapWebGlobalAdmin(handler) {
214
237
  const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
215
- const middleware = [createRequireWebAuthMiddleware(auth), createRequireGlobalAdminMiddleware()];
238
+ const middleware = [
239
+ createRequireWebAuthMiddleware(auth),
240
+ ...this.verifiedMiddleware(),
241
+ createRequireGlobalAdminMiddleware()
242
+ ];
216
243
  return this.wrapWeb(withMiddleware(...middleware)(handler));
217
244
  }
218
245
  wrapAuthenticated(handler) {
219
246
  return this.wrap("authenticated", handler);
220
247
  }
248
+ wrapVerified(handler) {
249
+ const middleware = [...this.group("authenticated"), ...this.verifiedMiddleware()];
250
+ return withMiddleware(...middleware)(handler);
251
+ }
221
252
  wrapPublicRead(handler) {
222
253
  if (isPublicReadsEnabled()) {
223
254
  return handler;
@@ -248,6 +279,18 @@ class HttpKernel {
248
279
  wrapRegister(handler) {
249
280
  return this.wrapThrottle("register", resolveRegisterRateLimit(), handler);
250
281
  }
282
+ wrapWebAuth(handler, options) {
283
+ const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
284
+ const middleware = [
285
+ createRequireWebAuthMiddleware(auth),
286
+ ...options.verified ? this.verifiedMiddleware() : []
287
+ ];
288
+ return this.wrapWeb(withMiddleware(...middleware)(handler));
289
+ }
290
+ verifiedMiddleware() {
291
+ const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
292
+ return [createRequireVerifiedMiddleware(auth)];
293
+ }
251
294
  wrapThrottle(scope, rateLimit, handler) {
252
295
  const middleware = [];
253
296
  const memoryKeyPrefix = scope === "login" ? "login-throttle:" : "register-throttle:";
@@ -2,6 +2,10 @@
2
2
  var __jsonParse = (a) => JSON.parse(a);
3
3
 
4
4
  // ../../src/bootstrap/httpKernel.ts
5
+ import {
6
+ hasVerifiedEmail,
7
+ isEmailVerificationRequired
8
+ } from "@getstrata/core/auth/emailVerification";
5
9
  import { createMembershipMiddleware } from "@getstrata/core/auth/membershipMiddleware";
6
10
  import { resolveAbilityChecker } from "@getstrata/core/contracts/serviceTokens";
7
11
  import { createAuthMiddleware } from "@getstrata/core/http/authMiddleware";
@@ -17,6 +21,8 @@ import { requestIdMiddleware } from "@getstrata/core/http/middleware";
17
21
  import { createRequireAbilityMiddleware } from "@getstrata/core/http/requireAbilityMiddleware";
18
22
  import { createRequireAuthMiddleware } from "@getstrata/core/http/requireAuthMiddleware";
19
23
  import { createRequireGlobalAdminMiddleware } from "@getstrata/core/http/requireGlobalAdminMiddleware";
24
+ import { createRequirePasswordConfirmMiddleware } from "@getstrata/core/http/requirePasswordConfirmMiddleware";
25
+ import { createRequireVerifiedMiddleware } from "@getstrata/core/http/requireVerifiedMiddleware";
20
26
  import { createRequireWebAuthMiddleware } from "@getstrata/core/http/requireWebAuthMiddleware";
21
27
  import { withErrorHandling } from "@getstrata/core/http/response";
22
28
  import { withMiddleware } from "@getstrata/core/http/routeMiddleware";
@@ -176,6 +182,9 @@ class HttpKernel {
176
182
  return this.wrapWeb(async (request) => {
177
183
  const user = await auth.resolve(request);
178
184
  if (user) {
185
+ if (isEmailVerificationRequired() && !hasVerifiedEmail(user)) {
186
+ return Response.redirect("/email/verify", 302);
187
+ }
179
188
  return Response.redirect(home, 302);
180
189
  }
181
190
  return handler(request);
@@ -188,24 +197,46 @@ class HttpKernel {
188
197
  return this.wrapWebAuthenticated(handler);
189
198
  }
190
199
  wrapWebAuthenticated(handler) {
191
- const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
192
- return this.wrapWeb(withMiddleware(createRequireWebAuthMiddleware(auth))(handler));
200
+ return this.wrapWebAuth(handler, { verified: true });
201
+ }
202
+ wrapWebAuthenticatedAllowUnverified(handler) {
203
+ return this.wrapWebAuth(handler, { verified: false });
204
+ }
205
+ wrapWebVerified(handler) {
206
+ return this.wrapWebAuth(handler, { verified: true });
207
+ }
208
+ wrapWebPasswordConfirm(handler) {
209
+ return this.wrapWebAuth(withMiddleware(createRequirePasswordConfirmMiddleware())(handler), {
210
+ verified: true
211
+ });
193
212
  }
194
213
  wrapWebAbility(ability, handler) {
195
214
  const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
196
215
  const abilityChecker = resolveAbilityChecker(this.dependencies.container);
197
216
  const requireAbility = createRequireAbilityMiddleware(abilityChecker);
198
- const middleware = [createRequireWebAuthMiddleware(auth), requireAbility(ability)];
217
+ const middleware = [
218
+ createRequireWebAuthMiddleware(auth),
219
+ ...this.verifiedMiddleware(),
220
+ requireAbility(ability)
221
+ ];
199
222
  return this.wrapWeb(withMiddleware(...middleware)(handler));
200
223
  }
201
224
  wrapWebGlobalAdmin(handler) {
202
225
  const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
203
- const middleware = [createRequireWebAuthMiddleware(auth), createRequireGlobalAdminMiddleware()];
226
+ const middleware = [
227
+ createRequireWebAuthMiddleware(auth),
228
+ ...this.verifiedMiddleware(),
229
+ createRequireGlobalAdminMiddleware()
230
+ ];
204
231
  return this.wrapWeb(withMiddleware(...middleware)(handler));
205
232
  }
206
233
  wrapAuthenticated(handler) {
207
234
  return this.wrap("authenticated", handler);
208
235
  }
236
+ wrapVerified(handler) {
237
+ const middleware = [...this.group("authenticated"), ...this.verifiedMiddleware()];
238
+ return withMiddleware(...middleware)(handler);
239
+ }
209
240
  wrapPublicRead(handler) {
210
241
  if (isPublicReadsEnabled()) {
211
242
  return handler;
@@ -236,6 +267,18 @@ class HttpKernel {
236
267
  wrapRegister(handler) {
237
268
  return this.wrapThrottle("register", resolveRegisterRateLimit(), handler);
238
269
  }
270
+ wrapWebAuth(handler, options) {
271
+ const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
272
+ const middleware = [
273
+ createRequireWebAuthMiddleware(auth),
274
+ ...options.verified ? this.verifiedMiddleware() : []
275
+ ];
276
+ return this.wrapWeb(withMiddleware(...middleware)(handler));
277
+ }
278
+ verifiedMiddleware() {
279
+ const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
280
+ return [createRequireVerifiedMiddleware(auth)];
281
+ }
239
282
  wrapThrottle(scope, rateLimit, handler) {
240
283
  const middleware = [];
241
284
  const memoryKeyPrefix = scope === "login" ? "login-throttle:" : "register-throttle:";
@@ -11,6 +11,10 @@ import {
11
11
  } from "@getstrata/core/http/securedRouteModelBinding";
12
12
 
13
13
  // ../../src/bootstrap/httpKernel.ts
14
+ import {
15
+ hasVerifiedEmail,
16
+ isEmailVerificationRequired
17
+ } from "@getstrata/core/auth/emailVerification";
14
18
  import { createMembershipMiddleware } from "@getstrata/core/auth/membershipMiddleware";
15
19
  import { resolveAbilityChecker } from "@getstrata/core/contracts/serviceTokens";
16
20
  import { createAuthMiddleware } from "@getstrata/core/http/authMiddleware";
@@ -26,6 +30,8 @@ import { requestIdMiddleware } from "@getstrata/core/http/middleware";
26
30
  import { createRequireAbilityMiddleware } from "@getstrata/core/http/requireAbilityMiddleware";
27
31
  import { createRequireAuthMiddleware } from "@getstrata/core/http/requireAuthMiddleware";
28
32
  import { createRequireGlobalAdminMiddleware } from "@getstrata/core/http/requireGlobalAdminMiddleware";
33
+ import { createRequirePasswordConfirmMiddleware } from "@getstrata/core/http/requirePasswordConfirmMiddleware";
34
+ import { createRequireVerifiedMiddleware } from "@getstrata/core/http/requireVerifiedMiddleware";
29
35
  import { createRequireWebAuthMiddleware } from "@getstrata/core/http/requireWebAuthMiddleware";
30
36
  import { withErrorHandling } from "@getstrata/core/http/response";
31
37
  import { withMiddleware } from "@getstrata/core/http/routeMiddleware";
@@ -185,6 +191,9 @@ class HttpKernel {
185
191
  return this.wrapWeb(async (request) => {
186
192
  const user = await auth.resolve(request);
187
193
  if (user) {
194
+ if (isEmailVerificationRequired() && !hasVerifiedEmail(user)) {
195
+ return Response.redirect("/email/verify", 302);
196
+ }
188
197
  return Response.redirect(home, 302);
189
198
  }
190
199
  return handler(request);
@@ -197,24 +206,46 @@ class HttpKernel {
197
206
  return this.wrapWebAuthenticated(handler);
198
207
  }
199
208
  wrapWebAuthenticated(handler) {
200
- const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
201
- return this.wrapWeb(withMiddleware(createRequireWebAuthMiddleware(auth))(handler));
209
+ return this.wrapWebAuth(handler, { verified: true });
210
+ }
211
+ wrapWebAuthenticatedAllowUnverified(handler) {
212
+ return this.wrapWebAuth(handler, { verified: false });
213
+ }
214
+ wrapWebVerified(handler) {
215
+ return this.wrapWebAuth(handler, { verified: true });
216
+ }
217
+ wrapWebPasswordConfirm(handler) {
218
+ return this.wrapWebAuth(withMiddleware(createRequirePasswordConfirmMiddleware())(handler), {
219
+ verified: true
220
+ });
202
221
  }
203
222
  wrapWebAbility(ability, handler) {
204
223
  const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
205
224
  const abilityChecker = resolveAbilityChecker(this.dependencies.container);
206
225
  const requireAbility = createRequireAbilityMiddleware(abilityChecker);
207
- const middleware = [createRequireWebAuthMiddleware(auth), requireAbility(ability)];
226
+ const middleware = [
227
+ createRequireWebAuthMiddleware(auth),
228
+ ...this.verifiedMiddleware(),
229
+ requireAbility(ability)
230
+ ];
208
231
  return this.wrapWeb(withMiddleware(...middleware)(handler));
209
232
  }
210
233
  wrapWebGlobalAdmin(handler) {
211
234
  const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
212
- const middleware = [createRequireWebAuthMiddleware(auth), createRequireGlobalAdminMiddleware()];
235
+ const middleware = [
236
+ createRequireWebAuthMiddleware(auth),
237
+ ...this.verifiedMiddleware(),
238
+ createRequireGlobalAdminMiddleware()
239
+ ];
213
240
  return this.wrapWeb(withMiddleware(...middleware)(handler));
214
241
  }
215
242
  wrapAuthenticated(handler) {
216
243
  return this.wrap("authenticated", handler);
217
244
  }
245
+ wrapVerified(handler) {
246
+ const middleware = [...this.group("authenticated"), ...this.verifiedMiddleware()];
247
+ return withMiddleware(...middleware)(handler);
248
+ }
218
249
  wrapPublicRead(handler) {
219
250
  if (isPublicReadsEnabled()) {
220
251
  return handler;
@@ -245,6 +276,18 @@ class HttpKernel {
245
276
  wrapRegister(handler) {
246
277
  return this.wrapThrottle("register", resolveRegisterRateLimit(), handler);
247
278
  }
279
+ wrapWebAuth(handler, options) {
280
+ const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
281
+ const middleware = [
282
+ createRequireWebAuthMiddleware(auth),
283
+ ...options.verified ? this.verifiedMiddleware() : []
284
+ ];
285
+ return this.wrapWeb(withMiddleware(...middleware)(handler));
286
+ }
287
+ verifiedMiddleware() {
288
+ const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
289
+ return [createRequireVerifiedMiddleware(auth)];
290
+ }
248
291
  wrapThrottle(scope, rateLimit, handler) {
249
292
  const middleware = [];
250
293
  const memoryKeyPrefix = scope === "login" ? "login-throttle:" : "register-throttle:";
package/dist/index.js CHANGED
@@ -19,6 +19,10 @@ import { conditionalJsonResponse } from "@getstrata/core/http/conditionalRespons
19
19
  import { applyMiddlewareToRoutes } from "@getstrata/core/http/middleware";
20
20
 
21
21
  // ../../src/bootstrap/httpKernel.ts
22
+ import {
23
+ hasVerifiedEmail,
24
+ isEmailVerificationRequired
25
+ } from "@getstrata/core/auth/emailVerification";
22
26
  import { createMembershipMiddleware } from "@getstrata/core/auth/membershipMiddleware";
23
27
  import { resolveAbilityChecker } from "@getstrata/core/contracts/serviceTokens";
24
28
  import { createAuthMiddleware } from "@getstrata/core/http/authMiddleware";
@@ -34,6 +38,8 @@ import { requestIdMiddleware } from "@getstrata/core/http/middleware";
34
38
  import { createRequireAbilityMiddleware } from "@getstrata/core/http/requireAbilityMiddleware";
35
39
  import { createRequireAuthMiddleware } from "@getstrata/core/http/requireAuthMiddleware";
36
40
  import { createRequireGlobalAdminMiddleware } from "@getstrata/core/http/requireGlobalAdminMiddleware";
41
+ import { createRequirePasswordConfirmMiddleware } from "@getstrata/core/http/requirePasswordConfirmMiddleware";
42
+ import { createRequireVerifiedMiddleware } from "@getstrata/core/http/requireVerifiedMiddleware";
37
43
  import { createRequireWebAuthMiddleware } from "@getstrata/core/http/requireWebAuthMiddleware";
38
44
  import { withErrorHandling } from "@getstrata/core/http/response";
39
45
  import { withMiddleware } from "@getstrata/core/http/routeMiddleware";
@@ -192,6 +198,9 @@ class HttpKernel {
192
198
  return this.wrapWeb(async (request) => {
193
199
  const user = await auth.resolve(request);
194
200
  if (user) {
201
+ if (isEmailVerificationRequired() && !hasVerifiedEmail(user)) {
202
+ return Response.redirect("/email/verify", 302);
203
+ }
195
204
  return Response.redirect(home, 302);
196
205
  }
197
206
  return handler(request);
@@ -204,24 +213,46 @@ class HttpKernel {
204
213
  return this.wrapWebAuthenticated(handler);
205
214
  }
206
215
  wrapWebAuthenticated(handler) {
207
- const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
208
- return this.wrapWeb(withMiddleware(createRequireWebAuthMiddleware(auth))(handler));
216
+ return this.wrapWebAuth(handler, { verified: true });
217
+ }
218
+ wrapWebAuthenticatedAllowUnverified(handler) {
219
+ return this.wrapWebAuth(handler, { verified: false });
220
+ }
221
+ wrapWebVerified(handler) {
222
+ return this.wrapWebAuth(handler, { verified: true });
223
+ }
224
+ wrapWebPasswordConfirm(handler) {
225
+ return this.wrapWebAuth(withMiddleware(createRequirePasswordConfirmMiddleware())(handler), {
226
+ verified: true
227
+ });
209
228
  }
210
229
  wrapWebAbility(ability, handler) {
211
230
  const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
212
231
  const abilityChecker = resolveAbilityChecker(this.dependencies.container);
213
232
  const requireAbility = createRequireAbilityMiddleware(abilityChecker);
214
- const middleware = [createRequireWebAuthMiddleware(auth), requireAbility(ability)];
233
+ const middleware = [
234
+ createRequireWebAuthMiddleware(auth),
235
+ ...this.verifiedMiddleware(),
236
+ requireAbility(ability)
237
+ ];
215
238
  return this.wrapWeb(withMiddleware(...middleware)(handler));
216
239
  }
217
240
  wrapWebGlobalAdmin(handler) {
218
241
  const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
219
- const middleware = [createRequireWebAuthMiddleware(auth), createRequireGlobalAdminMiddleware()];
242
+ const middleware = [
243
+ createRequireWebAuthMiddleware(auth),
244
+ ...this.verifiedMiddleware(),
245
+ createRequireGlobalAdminMiddleware()
246
+ ];
220
247
  return this.wrapWeb(withMiddleware(...middleware)(handler));
221
248
  }
222
249
  wrapAuthenticated(handler) {
223
250
  return this.wrap("authenticated", handler);
224
251
  }
252
+ wrapVerified(handler) {
253
+ const middleware = [...this.group("authenticated"), ...this.verifiedMiddleware()];
254
+ return withMiddleware(...middleware)(handler);
255
+ }
225
256
  wrapPublicRead(handler) {
226
257
  if (isPublicReadsEnabled()) {
227
258
  return handler;
@@ -252,6 +283,18 @@ class HttpKernel {
252
283
  wrapRegister(handler) {
253
284
  return this.wrapThrottle("register", resolveRegisterRateLimit(), handler);
254
285
  }
286
+ wrapWebAuth(handler, options) {
287
+ const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
288
+ const middleware = [
289
+ createRequireWebAuthMiddleware(auth),
290
+ ...options.verified ? this.verifiedMiddleware() : []
291
+ ];
292
+ return this.wrapWeb(withMiddleware(...middleware)(handler));
293
+ }
294
+ verifiedMiddleware() {
295
+ const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
296
+ return [createRequireVerifiedMiddleware(auth)];
297
+ }
255
298
  wrapThrottle(scope, rateLimit, handler) {
256
299
  const middleware = [];
257
300
  const memoryKeyPrefix = scope === "login" ? "login-throttle:" : "register-throttle:";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@getstrata/bootstrap",
3
- "version": "0.2.60",
3
+ "version": "0.2.62",
4
4
  "description": "Strata application bootstrap — HttpKernel, DI, web session helpers",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -173,14 +173,14 @@
173
173
  "build:bundle": "bun build index.ts --outdir dist --target bun --external bun --external eta --external @getstrata/core",
174
174
  "build:types": "tsc -p tsconfig.types.json && bun ../../scripts/prune-bootstrap-dist-types.ts",
175
175
  "prepublishOnly": "bun run build",
176
- "build:subpaths": "bun build entries/applicationRegistry.ts entries/buildModuleRoutes.ts entries/buildWebModuleRoutes.ts entries/cache/modelCacheTags.ts entries/config.ts entries/context.ts entries/contracts.ts entries/createWebRoutes.ts entries/createRoutes.ts entries/createSpaRoutes.ts entries/dependencies.ts entries/discoverModules.ts entries/health.ts entries/http/securedRouteModelBinding.ts entries/httpKernel.ts entries/listeners/invalidateCacheOnModelWrite.ts entries/membershipService.ts entries/metricsRoutes.ts entries/queue/defaultJobs.ts entries/providers.ts entries/providers/view.ts entries/routeRegistry.ts entries/schedule.ts entries/secretsGuard.ts entries/web/forms.ts entries/web/routing.ts entries/web/server.ts entries/web/session.ts entries/web/slug.ts --outdir dist --root . --target bun --external bun --external eta --external @getstrata/core --external @getstrata/bootstrap --external @getstrata/bootstrap/applicationRegistry --external @getstrata/bootstrap/buildModuleRoutes --external @getstrata/bootstrap/buildWebModuleRoutes --external @getstrata/bootstrap/cache/modelCacheTags --external @getstrata/bootstrap/config --external @getstrata/bootstrap/context --external @getstrata/bootstrap/contracts --external @getstrata/bootstrap/createWebRoutes --external @getstrata/bootstrap/createRoutes --external @getstrata/bootstrap/createSpaRoutes --external @getstrata/bootstrap/dependencies --external @getstrata/bootstrap/discoverModules --external @getstrata/bootstrap/health --external @getstrata/bootstrap/http/securedRouteModelBinding --external @getstrata/bootstrap/httpKernel --external @getstrata/bootstrap/listeners/invalidateCacheOnModelWrite --external @getstrata/bootstrap/membershipService --external @getstrata/bootstrap/metricsRoutes --external @getstrata/bootstrap/queue/defaultJobs --external @getstrata/bootstrap/providers --external @getstrata/bootstrap/providers/view --external @getstrata/bootstrap/routeRegistry --external @getstrata/bootstrap/schedule --external @getstrata/bootstrap/secretsGuard --external @getstrata/bootstrap/web/forms --external @getstrata/bootstrap/web/routing --external @getstrata/bootstrap/web/server --external @getstrata/bootstrap/web/session --external @getstrata/bootstrap/web/slug --external @getstrata/core/auth/accessControl --external @getstrata/core/auth/abilityChecker --external @getstrata/core/auth/authContext --external @getstrata/core/auth/guard --external @getstrata/core/auth/membershipContext --external @getstrata/core/auth/membershipMiddleware --external @getstrata/core/auth/membershipScope --external @getstrata/core/auth/membershipService --external @getstrata/core/auth/oauth/oidcProvider --external @getstrata/core/auth/oauth/providers --external @getstrata/core/auth/oauth/samlProvider --external @getstrata/core/auth/oauth/types --external @getstrata/core/auth/password --external @getstrata/core/auth/policy --external @getstrata/core/auth/scimAuthMiddleware --external @getstrata/core/auth/sessionCookie --external @getstrata/core/auth/sessionGuard --external @getstrata/core/auth/tokenHash --external @getstrata/core/audit/exportAuditLogs --external @getstrata/core/audit/siemFormatter --external @getstrata/core/admin/formatValue --external @getstrata/core/admin/registry --external @getstrata/core/admin/types --external @getstrata/core/cache/tags --external @getstrata/core/cache/createCacheStore --external @getstrata/core/cache/repository --external @getstrata/core/cache/simpleCache --external @getstrata/core/cache/simpleCacheStore --external @getstrata/core/config/envSchema --external @getstrata/core/contracts/serviceTokens --external @getstrata/core/contracts/container --external @getstrata/core/contracts/di --external @getstrata/core/crypto/fieldEncryption --external @getstrata/core/crypto/mfaSecret --external @getstrata/core/database --external @getstrata/core/database/baseRepository --external @getstrata/core/database/bindConnection --external @getstrata/core/database/boundConnection --external @getstrata/core/database/bunSql --external @getstrata/core/database/connection --external @getstrata/core/database/defaultConnection --external @getstrata/core/database/errors --external @getstrata/core/database/factory --external @getstrata/core/database/migrations --external @getstrata/core/database/migrations/types --external @getstrata/core/database/model --external @getstrata/core/database/query --external @getstrata/core/database/relationships --external @getstrata/core/database/repositoryConnection --external @getstrata/core/database/repositoryQuery --external @getstrata/core/database/seeders --external @getstrata/core/database/seeders/types --external @getstrata/core/database/schema --external @getstrata/core/database/table --external @getstrata/core/database/transaction --external @getstrata/core/database/types --external @getstrata/core/database/whereBuilder --external @getstrata/core/errors/http --external @getstrata/core/events --external @getstrata/core/facades --external @getstrata/core/http --external @getstrata/core/http/authMiddleware --external @getstrata/core/http/authorizeMiddleware --external @getstrata/core/http/bodySizeLimitMiddleware --external @getstrata/core/http/clientIp --external @getstrata/core/http/cookies --external @getstrata/core/http/contentNegotiation --external @getstrata/core/http/contentSecurityPolicy --external @getstrata/core/http/conditionalResponse --external @getstrata/core/http/corsMiddleware --external @getstrata/core/http/csrfMiddleware --external @getstrata/core/http/csrfProtection --external @getstrata/core/http/csrfToken --external @getstrata/core/http/etag --external @getstrata/core/http/flashSession --external @getstrata/core/http/flashMiddleware --external @getstrata/core/http/formRequest --external @getstrata/core/http/middleware --external @getstrata/core/http/metricsMiddleware --external @getstrata/core/http/loginThrottleMiddleware --external @getstrata/core/http/memoryThrottleMiddleware --external @getstrata/core/http/pagination --external @getstrata/core/http/parseFormBody --external @getstrata/core/http/parseMultipartUpload --external @getstrata/core/http/requireAbilityMiddleware --external @getstrata/core/http/requireAuthMiddleware --external @getstrata/core/http/requireGlobalAdminMiddleware --external @getstrata/core/http/requireWebAuthMiddleware --external @getstrata/core/http/resources --external @getstrata/core/http/response --external @getstrata/core/http/route --external @getstrata/core/http/routeMiddleware --external @getstrata/core/http/routeModelBinding --external @getstrata/core/http/safeInternalPath --external @getstrata/core/http/signedUrl --external @getstrata/core/http/scimThrottleMiddleware --external @getstrata/core/http/securityHeadersMiddleware --external @getstrata/core/http/securedRouteModelBinding --external @getstrata/core/http/requestMetaContext --external @getstrata/core/http/webErrorResponse --external @getstrata/core/http/webFormRequest --external @getstrata/core/http/throttleMiddleware --external @getstrata/core/http/validation --external @getstrata/core/jobs/dispatchWebhookJob --external @getstrata/core/jobs/exportAuditLogsJob --external @getstrata/core/jobs/invalidateCacheTagsJob --external @getstrata/core/lifecycle/gracefulShutdown --external @getstrata/core/logging/logger --external @getstrata/core/logging/requestLoggingMiddleware --external @getstrata/core/mail/mailer --external @getstrata/core/mail/markdownMail --external @getstrata/core/mail/markdownMailable --external @getstrata/core/mail/sanitizeMailHtml --external @getstrata/core/media/imageTransform --external @getstrata/core/metrics/prometheus --external @getstrata/core/notifications --external @getstrata/core/openapi/generator --external @getstrata/core/openapi/registeredRoute --external @getstrata/core/openapi/validate --external @getstrata/core/pagination --external @getstrata/core/queue --external @getstrata/core/queue/createAppQueue --external @getstrata/core/queue/failedJobRepository --external @getstrata/core/queue/failedJobService --external @getstrata/core/queue/jobRegistry --external @getstrata/core/queue/jobRunner --external @getstrata/core/queue/queueMetrics --external @getstrata/core/queue/publicQueue --external @getstrata/core/queue/redisQueue --external @getstrata/core/queue/types --external @getstrata/core/runtime/appKeyPrefix --external @getstrata/core/runtime/frontendMode --external @getstrata/core/runtime/applicationRegistry --external @getstrata/core/runtime/asyncContextStore --external @getstrata/core/scheduler/schedule --external @getstrata/core/scheduler/osCron --external @getstrata/core/security/oauthState --external @getstrata/core/security/publicReads --external @getstrata/core/security/safeFetch --external @getstrata/core/security/safeUrl --external @getstrata/core/security/scimTenantTokens --external @getstrata/core/security/securityEvents --external @getstrata/core/security/stripeWebhook --external @getstrata/core/security/timingSafeCompare --external @getstrata/core/security/tokenExpiry --external @getstrata/core/security/totp --external @getstrata/core/storage/storage --external @getstrata/core/tenant/tenancyConfig --external @getstrata/core/tenant/tenantContext --external @getstrata/core/tenant/tenantDatabaseScope --external @getstrata/core/tenant/databaseTenantContext --external @getstrata/core/tenant/tenantMiddleware --external @getstrata/core/terminal/runShell --external @getstrata/core/tracing/traceContext --external @getstrata/core/tracing/tracingMiddleware --external @getstrata/core/validation/rules --external @getstrata/core/view",
176
+ "build:subpaths": "bun build entries/applicationRegistry.ts entries/buildModuleRoutes.ts entries/buildWebModuleRoutes.ts entries/cache/modelCacheTags.ts entries/config.ts entries/context.ts entries/contracts.ts entries/createWebRoutes.ts entries/createRoutes.ts entries/createSpaRoutes.ts entries/dependencies.ts entries/discoverModules.ts entries/health.ts entries/http/securedRouteModelBinding.ts entries/httpKernel.ts entries/listeners/invalidateCacheOnModelWrite.ts entries/membershipService.ts entries/metricsRoutes.ts entries/queue/defaultJobs.ts entries/providers.ts entries/providers/view.ts entries/routeRegistry.ts entries/schedule.ts entries/secretsGuard.ts entries/web/forms.ts entries/web/routing.ts entries/web/server.ts entries/web/session.ts entries/web/slug.ts --outdir dist --root . --target bun --external bun --external eta --external @getstrata/core --external @getstrata/bootstrap --external @getstrata/bootstrap/applicationRegistry --external @getstrata/bootstrap/buildModuleRoutes --external @getstrata/bootstrap/buildWebModuleRoutes --external @getstrata/bootstrap/cache/modelCacheTags --external @getstrata/bootstrap/config --external @getstrata/bootstrap/context --external @getstrata/bootstrap/contracts --external @getstrata/bootstrap/createWebRoutes --external @getstrata/bootstrap/createRoutes --external @getstrata/bootstrap/createSpaRoutes --external @getstrata/bootstrap/dependencies --external @getstrata/bootstrap/discoverModules --external @getstrata/bootstrap/health --external @getstrata/bootstrap/http/securedRouteModelBinding --external @getstrata/bootstrap/httpKernel --external @getstrata/bootstrap/listeners/invalidateCacheOnModelWrite --external @getstrata/bootstrap/membershipService --external @getstrata/bootstrap/metricsRoutes --external @getstrata/bootstrap/queue/defaultJobs --external @getstrata/bootstrap/providers --external @getstrata/bootstrap/providers/view --external @getstrata/bootstrap/routeRegistry --external @getstrata/bootstrap/schedule --external @getstrata/bootstrap/secretsGuard --external @getstrata/bootstrap/web/forms --external @getstrata/bootstrap/web/routing --external @getstrata/bootstrap/web/server --external @getstrata/bootstrap/web/session --external @getstrata/bootstrap/web/slug --external @getstrata/core/auth/accessControl --external @getstrata/core/auth/abilityChecker --external @getstrata/core/auth/authContext --external @getstrata/core/auth/emailVerification --external @getstrata/core/auth/guard --external @getstrata/core/auth/membershipContext --external @getstrata/core/auth/membershipMiddleware --external @getstrata/core/auth/membershipScope --external @getstrata/core/auth/membershipService --external @getstrata/core/auth/oauth/oidcProvider --external @getstrata/core/auth/oauth/providers --external @getstrata/core/auth/oauth/samlProvider --external @getstrata/core/auth/oauth/types --external @getstrata/core/auth/password --external @getstrata/core/auth/passwordConfirmCookie --external @getstrata/core/auth/policy --external @getstrata/core/auth/scimAuthMiddleware --external @getstrata/core/auth/sessionCookie --external @getstrata/core/auth/sessionGuard --external @getstrata/core/auth/tokenHash --external @getstrata/core/audit/exportAuditLogs --external @getstrata/core/audit/siemFormatter --external @getstrata/core/admin/formatValue --external @getstrata/core/admin/registry --external @getstrata/core/admin/types --external @getstrata/core/cache/tags --external @getstrata/core/cache/createCacheStore --external @getstrata/core/cache/repository --external @getstrata/core/cache/simpleCache --external @getstrata/core/cache/simpleCacheStore --external @getstrata/core/config/envSchema --external @getstrata/core/contracts/serviceTokens --external @getstrata/core/contracts/container --external @getstrata/core/contracts/di --external @getstrata/core/crypto/fieldEncryption --external @getstrata/core/crypto/mfaSecret --external @getstrata/core/database --external @getstrata/core/database/baseRepository --external @getstrata/core/database/bindConnection --external @getstrata/core/database/boundConnection --external @getstrata/core/database/bunSql --external @getstrata/core/database/connection --external @getstrata/core/database/defaultConnection --external @getstrata/core/database/errors --external @getstrata/core/database/factory --external @getstrata/core/database/migrations --external @getstrata/core/database/migrations/types --external @getstrata/core/database/model --external @getstrata/core/database/query --external @getstrata/core/database/relationships --external @getstrata/core/database/repositoryConnection --external @getstrata/core/database/repositoryQuery --external @getstrata/core/database/seeders --external @getstrata/core/database/seeders/types --external @getstrata/core/database/schema --external @getstrata/core/database/table --external @getstrata/core/database/transaction --external @getstrata/core/database/types --external @getstrata/core/database/whereBuilder --external @getstrata/core/errors/http --external @getstrata/core/events --external @getstrata/core/facades --external @getstrata/core/http --external @getstrata/core/http/authMiddleware --external @getstrata/core/http/authorizeMiddleware --external @getstrata/core/http/bodySizeLimitMiddleware --external @getstrata/core/http/clientIp --external @getstrata/core/http/cookies --external @getstrata/core/http/contentNegotiation --external @getstrata/core/http/contentSecurityPolicy --external @getstrata/core/http/conditionalResponse --external @getstrata/core/http/corsMiddleware --external @getstrata/core/http/csrfMiddleware --external @getstrata/core/http/csrfProtection --external @getstrata/core/http/csrfToken --external @getstrata/core/http/etag --external @getstrata/core/http/flashSession --external @getstrata/core/http/flashMiddleware --external @getstrata/core/http/formRequest --external @getstrata/core/http/middleware --external @getstrata/core/http/metricsMiddleware --external @getstrata/core/http/loginThrottleMiddleware --external @getstrata/core/http/memoryThrottleMiddleware --external @getstrata/core/http/pagination --external @getstrata/core/http/parseFormBody --external @getstrata/core/http/parseMultipartUpload --external @getstrata/core/http/requireAbilityMiddleware --external @getstrata/core/http/requireAuthMiddleware --external @getstrata/core/http/requireGlobalAdminMiddleware --external @getstrata/core/http/requireWebAuthMiddleware --external @getstrata/core/http/requireVerifiedMiddleware --external @getstrata/core/http/requirePasswordConfirmMiddleware --external @getstrata/core/http/resources --external @getstrata/core/http/response --external @getstrata/core/http/route --external @getstrata/core/http/routeMiddleware --external @getstrata/core/http/routeModelBinding --external @getstrata/core/http/safeInternalPath --external @getstrata/core/http/signedUrl --external @getstrata/core/http/scimThrottleMiddleware --external @getstrata/core/http/securityHeadersMiddleware --external @getstrata/core/http/securedRouteModelBinding --external @getstrata/core/http/requestMetaContext --external @getstrata/core/http/webErrorResponse --external @getstrata/core/http/webFormRequest --external @getstrata/core/http/throttleMiddleware --external @getstrata/core/http/validation --external @getstrata/core/jobs/dispatchWebhookJob --external @getstrata/core/jobs/exportAuditLogsJob --external @getstrata/core/jobs/invalidateCacheTagsJob --external @getstrata/core/lifecycle/gracefulShutdown --external @getstrata/core/logging/logger --external @getstrata/core/logging/requestLoggingMiddleware --external @getstrata/core/mail/mailer --external @getstrata/core/mail/markdownMail --external @getstrata/core/mail/markdownMailable --external @getstrata/core/mail/sanitizeMailHtml --external @getstrata/core/media/imageTransform --external @getstrata/core/metrics/prometheus --external @getstrata/core/notifications --external @getstrata/core/openapi/generator --external @getstrata/core/openapi/registeredRoute --external @getstrata/core/openapi/validate --external @getstrata/core/pagination --external @getstrata/core/queue --external @getstrata/core/queue/createAppQueue --external @getstrata/core/queue/failedJobRepository --external @getstrata/core/queue/failedJobService --external @getstrata/core/queue/jobRegistry --external @getstrata/core/queue/jobRunner --external @getstrata/core/queue/queueMetrics --external @getstrata/core/queue/publicQueue --external @getstrata/core/queue/redisQueue --external @getstrata/core/queue/types --external @getstrata/core/runtime/appKeyPrefix --external @getstrata/core/runtime/frontendMode --external @getstrata/core/runtime/applicationRegistry --external @getstrata/core/runtime/asyncContextStore --external @getstrata/core/scheduler/schedule --external @getstrata/core/scheduler/osCron --external @getstrata/core/security/oauthState --external @getstrata/core/security/publicReads --external @getstrata/core/security/safeFetch --external @getstrata/core/security/safeUrl --external @getstrata/core/security/scimTenantTokens --external @getstrata/core/security/securityEvents --external @getstrata/core/security/stripeWebhook --external @getstrata/core/security/timingSafeCompare --external @getstrata/core/security/tokenExpiry --external @getstrata/core/security/totp --external @getstrata/core/storage/storage --external @getstrata/core/tenant/tenancyConfig --external @getstrata/core/tenant/tenantContext --external @getstrata/core/tenant/tenantDatabaseScope --external @getstrata/core/tenant/databaseTenantContext --external @getstrata/core/tenant/tenantMiddleware --external @getstrata/core/terminal/runShell --external @getstrata/core/tracing/traceContext --external @getstrata/core/tracing/tracingMiddleware --external @getstrata/core/validation/rules --external @getstrata/core/view",
177
177
  "build:shims": "true"
178
178
  },
179
179
  "publishConfig": {
180
180
  "access": "public"
181
181
  },
182
182
  "peerDependencies": {
183
- "@getstrata/core": "^0.5.73",
183
+ "@getstrata/core": "^0.5.75",
184
184
  "typescript": "^5.9.0"
185
185
  }
186
186
  }