@getstrata/bootstrap 0.2.60 → 0.2.61

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,9 @@
1
1
  # @getstrata/bootstrap changelog
2
2
 
3
+ ## 0.2.61
4
+
5
+ - `HttpKernel.wrapVerified()` / `wrapWebVerified()` / `wrapWebAuthenticatedAllowUnverified()`. When `FEATURE_EMAIL_VERIFICATION=true`, `wrapWebAuthenticated` and `wrapWebAbility` require a verified email. Peer `@getstrata/core` `^0.5.74`.
6
+
3
7
  ## 0.2.60
4
8
 
5
9
  - Peer `@getstrata/core` `^0.5.73` for public OpenAPI email verification resend.
@@ -14,9 +14,14 @@ 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;
17
20
  wrapWebAbility(ability: string, handler: RouteHandler): RouteHandler;
18
21
  wrapWebGlobalAdmin(handler: RouteHandler): RouteHandler;
19
22
  wrapAuthenticated(handler: RouteHandler): RouteHandler;
23
+ /** Laravel `verified` for JSON/API routes. No-op when `FEATURE_EMAIL_VERIFICATION` is off. */
24
+ wrapVerified(handler: RouteHandler): RouteHandler;
20
25
  wrapPublicRead(handler: RouteHandler): RouteHandler;
21
26
  wrapGlobalAdmin(handler: RouteHandler): RouteHandler;
22
27
  wrapAbility(ability: string, handler: RouteHandler): RouteHandler;
@@ -24,6 +29,8 @@ declare class HttpKernel {
24
29
  wrapLogin(handler: RouteHandler): RouteHandler;
25
30
  wrapSigned(handler: RouteHandler): RouteHandler;
26
31
  wrapRegister(handler: RouteHandler): RouteHandler;
32
+ private wrapWebAuth;
33
+ private verifiedMiddleware;
27
34
  private wrapThrottle;
28
35
  }
29
36
  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,7 @@ 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 { createRequireVerifiedMiddleware } from "@getstrata/core/http/requireVerifiedMiddleware";
24
29
  import { createRequireWebAuthMiddleware } from "@getstrata/core/http/requireWebAuthMiddleware";
25
30
  import { withErrorHandling } from "@getstrata/core/http/response";
26
31
  import { withMiddleware } from "@getstrata/core/http/routeMiddleware";
@@ -180,6 +185,9 @@ class HttpKernel {
180
185
  return this.wrapWeb(async (request) => {
181
186
  const user = await auth.resolve(request);
182
187
  if (user) {
188
+ if (isEmailVerificationRequired() && !hasVerifiedEmail(user)) {
189
+ return Response.redirect("/email/verify", 302);
190
+ }
183
191
  return Response.redirect(home, 302);
184
192
  }
185
193
  return handler(request);
@@ -192,24 +200,41 @@ class HttpKernel {
192
200
  return this.wrapWebAuthenticated(handler);
193
201
  }
194
202
  wrapWebAuthenticated(handler) {
195
- const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
196
- return this.wrapWeb(withMiddleware(createRequireWebAuthMiddleware(auth))(handler));
203
+ return this.wrapWebAuth(handler, { verified: true });
204
+ }
205
+ wrapWebAuthenticatedAllowUnverified(handler) {
206
+ return this.wrapWebAuth(handler, { verified: false });
207
+ }
208
+ wrapWebVerified(handler) {
209
+ return this.wrapWebAuth(handler, { verified: true });
197
210
  }
198
211
  wrapWebAbility(ability, handler) {
199
212
  const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
200
213
  const abilityChecker = resolveAbilityChecker(this.dependencies.container);
201
214
  const requireAbility = createRequireAbilityMiddleware(abilityChecker);
202
- const middleware = [createRequireWebAuthMiddleware(auth), requireAbility(ability)];
215
+ const middleware = [
216
+ createRequireWebAuthMiddleware(auth),
217
+ ...this.verifiedMiddleware(),
218
+ requireAbility(ability)
219
+ ];
203
220
  return this.wrapWeb(withMiddleware(...middleware)(handler));
204
221
  }
205
222
  wrapWebGlobalAdmin(handler) {
206
223
  const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
207
- const middleware = [createRequireWebAuthMiddleware(auth), createRequireGlobalAdminMiddleware()];
224
+ const middleware = [
225
+ createRequireWebAuthMiddleware(auth),
226
+ ...this.verifiedMiddleware(),
227
+ createRequireGlobalAdminMiddleware()
228
+ ];
208
229
  return this.wrapWeb(withMiddleware(...middleware)(handler));
209
230
  }
210
231
  wrapAuthenticated(handler) {
211
232
  return this.wrap("authenticated", handler);
212
233
  }
234
+ wrapVerified(handler) {
235
+ const middleware = [...this.group("authenticated"), ...this.verifiedMiddleware()];
236
+ return withMiddleware(...middleware)(handler);
237
+ }
213
238
  wrapPublicRead(handler) {
214
239
  if (isPublicReadsEnabled()) {
215
240
  return handler;
@@ -240,6 +265,18 @@ class HttpKernel {
240
265
  wrapRegister(handler) {
241
266
  return this.wrapThrottle("register", resolveRegisterRateLimit(), handler);
242
267
  }
268
+ wrapWebAuth(handler, options) {
269
+ const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
270
+ const middleware = [
271
+ createRequireWebAuthMiddleware(auth),
272
+ ...options.verified ? this.verifiedMiddleware() : []
273
+ ];
274
+ return this.wrapWeb(withMiddleware(...middleware)(handler));
275
+ }
276
+ verifiedMiddleware() {
277
+ const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
278
+ return [createRequireVerifiedMiddleware(auth)];
279
+ }
243
280
  wrapThrottle(scope, rateLimit, handler) {
244
281
  const middleware = [];
245
282
  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,7 @@ 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 { createRequireVerifiedMiddleware } from "@getstrata/core/http/requireVerifiedMiddleware";
27
32
  import { createRequireWebAuthMiddleware } from "@getstrata/core/http/requireWebAuthMiddleware";
28
33
  import { withErrorHandling } from "@getstrata/core/http/response";
29
34
  import { withMiddleware } from "@getstrata/core/http/routeMiddleware";
@@ -183,6 +188,9 @@ class HttpKernel {
183
188
  return this.wrapWeb(async (request) => {
184
189
  const user = await auth.resolve(request);
185
190
  if (user) {
191
+ if (isEmailVerificationRequired() && !hasVerifiedEmail(user)) {
192
+ return Response.redirect("/email/verify", 302);
193
+ }
186
194
  return Response.redirect(home, 302);
187
195
  }
188
196
  return handler(request);
@@ -195,24 +203,41 @@ class HttpKernel {
195
203
  return this.wrapWebAuthenticated(handler);
196
204
  }
197
205
  wrapWebAuthenticated(handler) {
198
- const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
199
- return this.wrapWeb(withMiddleware(createRequireWebAuthMiddleware(auth))(handler));
206
+ return this.wrapWebAuth(handler, { verified: true });
207
+ }
208
+ wrapWebAuthenticatedAllowUnverified(handler) {
209
+ return this.wrapWebAuth(handler, { verified: false });
210
+ }
211
+ wrapWebVerified(handler) {
212
+ return this.wrapWebAuth(handler, { verified: true });
200
213
  }
201
214
  wrapWebAbility(ability, handler) {
202
215
  const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
203
216
  const abilityChecker = resolveAbilityChecker(this.dependencies.container);
204
217
  const requireAbility = createRequireAbilityMiddleware(abilityChecker);
205
- const middleware = [createRequireWebAuthMiddleware(auth), requireAbility(ability)];
218
+ const middleware = [
219
+ createRequireWebAuthMiddleware(auth),
220
+ ...this.verifiedMiddleware(),
221
+ requireAbility(ability)
222
+ ];
206
223
  return this.wrapWeb(withMiddleware(...middleware)(handler));
207
224
  }
208
225
  wrapWebGlobalAdmin(handler) {
209
226
  const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
210
- const middleware = [createRequireWebAuthMiddleware(auth), createRequireGlobalAdminMiddleware()];
227
+ const middleware = [
228
+ createRequireWebAuthMiddleware(auth),
229
+ ...this.verifiedMiddleware(),
230
+ createRequireGlobalAdminMiddleware()
231
+ ];
211
232
  return this.wrapWeb(withMiddleware(...middleware)(handler));
212
233
  }
213
234
  wrapAuthenticated(handler) {
214
235
  return this.wrap("authenticated", handler);
215
236
  }
237
+ wrapVerified(handler) {
238
+ const middleware = [...this.group("authenticated"), ...this.verifiedMiddleware()];
239
+ return withMiddleware(...middleware)(handler);
240
+ }
216
241
  wrapPublicRead(handler) {
217
242
  if (isPublicReadsEnabled()) {
218
243
  return handler;
@@ -243,6 +268,18 @@ class HttpKernel {
243
268
  wrapRegister(handler) {
244
269
  return this.wrapThrottle("register", resolveRegisterRateLimit(), handler);
245
270
  }
271
+ wrapWebAuth(handler, options) {
272
+ const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
273
+ const middleware = [
274
+ createRequireWebAuthMiddleware(auth),
275
+ ...options.verified ? this.verifiedMiddleware() : []
276
+ ];
277
+ return this.wrapWeb(withMiddleware(...middleware)(handler));
278
+ }
279
+ verifiedMiddleware() {
280
+ const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
281
+ return [createRequireVerifiedMiddleware(auth)];
282
+ }
246
283
  wrapThrottle(scope, rateLimit, handler) {
247
284
  const middleware = [];
248
285
  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,7 @@ 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 { createRequireVerifiedMiddleware } from "@getstrata/core/http/requireVerifiedMiddleware";
64
69
  import { createRequireWebAuthMiddleware } from "@getstrata/core/http/requireWebAuthMiddleware";
65
70
  import { withErrorHandling } from "@getstrata/core/http/response";
66
71
  import { withMiddleware } from "@getstrata/core/http/routeMiddleware";
@@ -220,6 +225,9 @@ class HttpKernel {
220
225
  return this.wrapWeb(async (request) => {
221
226
  const user = await auth.resolve(request);
222
227
  if (user) {
228
+ if (isEmailVerificationRequired() && !hasVerifiedEmail(user)) {
229
+ return Response.redirect("/email/verify", 302);
230
+ }
223
231
  return Response.redirect(home, 302);
224
232
  }
225
233
  return handler(request);
@@ -232,24 +240,41 @@ class HttpKernel {
232
240
  return this.wrapWebAuthenticated(handler);
233
241
  }
234
242
  wrapWebAuthenticated(handler) {
235
- const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
236
- return this.wrapWeb(withMiddleware(createRequireWebAuthMiddleware(auth))(handler));
243
+ return this.wrapWebAuth(handler, { verified: true });
244
+ }
245
+ wrapWebAuthenticatedAllowUnverified(handler) {
246
+ return this.wrapWebAuth(handler, { verified: false });
247
+ }
248
+ wrapWebVerified(handler) {
249
+ return this.wrapWebAuth(handler, { verified: true });
237
250
  }
238
251
  wrapWebAbility(ability, handler) {
239
252
  const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
240
253
  const abilityChecker = resolveAbilityChecker(this.dependencies.container);
241
254
  const requireAbility = createRequireAbilityMiddleware(abilityChecker);
242
- const middleware = [createRequireWebAuthMiddleware(auth), requireAbility(ability)];
255
+ const middleware = [
256
+ createRequireWebAuthMiddleware(auth),
257
+ ...this.verifiedMiddleware(),
258
+ requireAbility(ability)
259
+ ];
243
260
  return this.wrapWeb(withMiddleware(...middleware)(handler));
244
261
  }
245
262
  wrapWebGlobalAdmin(handler) {
246
263
  const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
247
- const middleware = [createRequireWebAuthMiddleware(auth), createRequireGlobalAdminMiddleware()];
264
+ const middleware = [
265
+ createRequireWebAuthMiddleware(auth),
266
+ ...this.verifiedMiddleware(),
267
+ createRequireGlobalAdminMiddleware()
268
+ ];
248
269
  return this.wrapWeb(withMiddleware(...middleware)(handler));
249
270
  }
250
271
  wrapAuthenticated(handler) {
251
272
  return this.wrap("authenticated", handler);
252
273
  }
274
+ wrapVerified(handler) {
275
+ const middleware = [...this.group("authenticated"), ...this.verifiedMiddleware()];
276
+ return withMiddleware(...middleware)(handler);
277
+ }
253
278
  wrapPublicRead(handler) {
254
279
  if (isPublicReadsEnabled()) {
255
280
  return handler;
@@ -280,6 +305,18 @@ class HttpKernel {
280
305
  wrapRegister(handler) {
281
306
  return this.wrapThrottle("register", resolveRegisterRateLimit(), handler);
282
307
  }
308
+ wrapWebAuth(handler, options) {
309
+ const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
310
+ const middleware = [
311
+ createRequireWebAuthMiddleware(auth),
312
+ ...options.verified ? this.verifiedMiddleware() : []
313
+ ];
314
+ return this.wrapWeb(withMiddleware(...middleware)(handler));
315
+ }
316
+ verifiedMiddleware() {
317
+ const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
318
+ return [createRequireVerifiedMiddleware(auth)];
319
+ }
283
320
  wrapThrottle(scope, rateLimit, handler) {
284
321
  const middleware = [];
285
322
  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,7 @@ 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 { createRequireVerifiedMiddleware } from "@getstrata/core/http/requireVerifiedMiddleware";
32
37
  import { createRequireWebAuthMiddleware } from "@getstrata/core/http/requireWebAuthMiddleware";
33
38
  import { withErrorHandling } from "@getstrata/core/http/response";
34
39
  import { withMiddleware } from "@getstrata/core/http/routeMiddleware";
@@ -188,6 +193,9 @@ class HttpKernel {
188
193
  return this.wrapWeb(async (request) => {
189
194
  const user = await auth.resolve(request);
190
195
  if (user) {
196
+ if (isEmailVerificationRequired() && !hasVerifiedEmail(user)) {
197
+ return Response.redirect("/email/verify", 302);
198
+ }
191
199
  return Response.redirect(home, 302);
192
200
  }
193
201
  return handler(request);
@@ -200,24 +208,41 @@ class HttpKernel {
200
208
  return this.wrapWebAuthenticated(handler);
201
209
  }
202
210
  wrapWebAuthenticated(handler) {
203
- const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
204
- return this.wrapWeb(withMiddleware(createRequireWebAuthMiddleware(auth))(handler));
211
+ return this.wrapWebAuth(handler, { verified: true });
212
+ }
213
+ wrapWebAuthenticatedAllowUnverified(handler) {
214
+ return this.wrapWebAuth(handler, { verified: false });
215
+ }
216
+ wrapWebVerified(handler) {
217
+ return this.wrapWebAuth(handler, { verified: true });
205
218
  }
206
219
  wrapWebAbility(ability, handler) {
207
220
  const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
208
221
  const abilityChecker = resolveAbilityChecker(this.dependencies.container);
209
222
  const requireAbility = createRequireAbilityMiddleware(abilityChecker);
210
- const middleware = [createRequireWebAuthMiddleware(auth), requireAbility(ability)];
223
+ const middleware = [
224
+ createRequireWebAuthMiddleware(auth),
225
+ ...this.verifiedMiddleware(),
226
+ requireAbility(ability)
227
+ ];
211
228
  return this.wrapWeb(withMiddleware(...middleware)(handler));
212
229
  }
213
230
  wrapWebGlobalAdmin(handler) {
214
231
  const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
215
- const middleware = [createRequireWebAuthMiddleware(auth), createRequireGlobalAdminMiddleware()];
232
+ const middleware = [
233
+ createRequireWebAuthMiddleware(auth),
234
+ ...this.verifiedMiddleware(),
235
+ createRequireGlobalAdminMiddleware()
236
+ ];
216
237
  return this.wrapWeb(withMiddleware(...middleware)(handler));
217
238
  }
218
239
  wrapAuthenticated(handler) {
219
240
  return this.wrap("authenticated", handler);
220
241
  }
242
+ wrapVerified(handler) {
243
+ const middleware = [...this.group("authenticated"), ...this.verifiedMiddleware()];
244
+ return withMiddleware(...middleware)(handler);
245
+ }
221
246
  wrapPublicRead(handler) {
222
247
  if (isPublicReadsEnabled()) {
223
248
  return handler;
@@ -248,6 +273,18 @@ class HttpKernel {
248
273
  wrapRegister(handler) {
249
274
  return this.wrapThrottle("register", resolveRegisterRateLimit(), handler);
250
275
  }
276
+ wrapWebAuth(handler, options) {
277
+ const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
278
+ const middleware = [
279
+ createRequireWebAuthMiddleware(auth),
280
+ ...options.verified ? this.verifiedMiddleware() : []
281
+ ];
282
+ return this.wrapWeb(withMiddleware(...middleware)(handler));
283
+ }
284
+ verifiedMiddleware() {
285
+ const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
286
+ return [createRequireVerifiedMiddleware(auth)];
287
+ }
251
288
  wrapThrottle(scope, rateLimit, handler) {
252
289
  const middleware = [];
253
290
  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,7 @@ 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 { createRequireVerifiedMiddleware } from "@getstrata/core/http/requireVerifiedMiddleware";
20
25
  import { createRequireWebAuthMiddleware } from "@getstrata/core/http/requireWebAuthMiddleware";
21
26
  import { withErrorHandling } from "@getstrata/core/http/response";
22
27
  import { withMiddleware } from "@getstrata/core/http/routeMiddleware";
@@ -176,6 +181,9 @@ class HttpKernel {
176
181
  return this.wrapWeb(async (request) => {
177
182
  const user = await auth.resolve(request);
178
183
  if (user) {
184
+ if (isEmailVerificationRequired() && !hasVerifiedEmail(user)) {
185
+ return Response.redirect("/email/verify", 302);
186
+ }
179
187
  return Response.redirect(home, 302);
180
188
  }
181
189
  return handler(request);
@@ -188,24 +196,41 @@ class HttpKernel {
188
196
  return this.wrapWebAuthenticated(handler);
189
197
  }
190
198
  wrapWebAuthenticated(handler) {
191
- const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
192
- return this.wrapWeb(withMiddleware(createRequireWebAuthMiddleware(auth))(handler));
199
+ return this.wrapWebAuth(handler, { verified: true });
200
+ }
201
+ wrapWebAuthenticatedAllowUnverified(handler) {
202
+ return this.wrapWebAuth(handler, { verified: false });
203
+ }
204
+ wrapWebVerified(handler) {
205
+ return this.wrapWebAuth(handler, { verified: true });
193
206
  }
194
207
  wrapWebAbility(ability, handler) {
195
208
  const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
196
209
  const abilityChecker = resolveAbilityChecker(this.dependencies.container);
197
210
  const requireAbility = createRequireAbilityMiddleware(abilityChecker);
198
- const middleware = [createRequireWebAuthMiddleware(auth), requireAbility(ability)];
211
+ const middleware = [
212
+ createRequireWebAuthMiddleware(auth),
213
+ ...this.verifiedMiddleware(),
214
+ requireAbility(ability)
215
+ ];
199
216
  return this.wrapWeb(withMiddleware(...middleware)(handler));
200
217
  }
201
218
  wrapWebGlobalAdmin(handler) {
202
219
  const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
203
- const middleware = [createRequireWebAuthMiddleware(auth), createRequireGlobalAdminMiddleware()];
220
+ const middleware = [
221
+ createRequireWebAuthMiddleware(auth),
222
+ ...this.verifiedMiddleware(),
223
+ createRequireGlobalAdminMiddleware()
224
+ ];
204
225
  return this.wrapWeb(withMiddleware(...middleware)(handler));
205
226
  }
206
227
  wrapAuthenticated(handler) {
207
228
  return this.wrap("authenticated", handler);
208
229
  }
230
+ wrapVerified(handler) {
231
+ const middleware = [...this.group("authenticated"), ...this.verifiedMiddleware()];
232
+ return withMiddleware(...middleware)(handler);
233
+ }
209
234
  wrapPublicRead(handler) {
210
235
  if (isPublicReadsEnabled()) {
211
236
  return handler;
@@ -236,6 +261,18 @@ class HttpKernel {
236
261
  wrapRegister(handler) {
237
262
  return this.wrapThrottle("register", resolveRegisterRateLimit(), handler);
238
263
  }
264
+ wrapWebAuth(handler, options) {
265
+ const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
266
+ const middleware = [
267
+ createRequireWebAuthMiddleware(auth),
268
+ ...options.verified ? this.verifiedMiddleware() : []
269
+ ];
270
+ return this.wrapWeb(withMiddleware(...middleware)(handler));
271
+ }
272
+ verifiedMiddleware() {
273
+ const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
274
+ return [createRequireVerifiedMiddleware(auth)];
275
+ }
239
276
  wrapThrottle(scope, rateLimit, handler) {
240
277
  const middleware = [];
241
278
  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,7 @@ 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 { createRequireVerifiedMiddleware } from "@getstrata/core/http/requireVerifiedMiddleware";
29
34
  import { createRequireWebAuthMiddleware } from "@getstrata/core/http/requireWebAuthMiddleware";
30
35
  import { withErrorHandling } from "@getstrata/core/http/response";
31
36
  import { withMiddleware } from "@getstrata/core/http/routeMiddleware";
@@ -185,6 +190,9 @@ class HttpKernel {
185
190
  return this.wrapWeb(async (request) => {
186
191
  const user = await auth.resolve(request);
187
192
  if (user) {
193
+ if (isEmailVerificationRequired() && !hasVerifiedEmail(user)) {
194
+ return Response.redirect("/email/verify", 302);
195
+ }
188
196
  return Response.redirect(home, 302);
189
197
  }
190
198
  return handler(request);
@@ -197,24 +205,41 @@ class HttpKernel {
197
205
  return this.wrapWebAuthenticated(handler);
198
206
  }
199
207
  wrapWebAuthenticated(handler) {
200
- const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
201
- return this.wrapWeb(withMiddleware(createRequireWebAuthMiddleware(auth))(handler));
208
+ return this.wrapWebAuth(handler, { verified: true });
209
+ }
210
+ wrapWebAuthenticatedAllowUnverified(handler) {
211
+ return this.wrapWebAuth(handler, { verified: false });
212
+ }
213
+ wrapWebVerified(handler) {
214
+ return this.wrapWebAuth(handler, { verified: true });
202
215
  }
203
216
  wrapWebAbility(ability, handler) {
204
217
  const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
205
218
  const abilityChecker = resolveAbilityChecker(this.dependencies.container);
206
219
  const requireAbility = createRequireAbilityMiddleware(abilityChecker);
207
- const middleware = [createRequireWebAuthMiddleware(auth), requireAbility(ability)];
220
+ const middleware = [
221
+ createRequireWebAuthMiddleware(auth),
222
+ ...this.verifiedMiddleware(),
223
+ requireAbility(ability)
224
+ ];
208
225
  return this.wrapWeb(withMiddleware(...middleware)(handler));
209
226
  }
210
227
  wrapWebGlobalAdmin(handler) {
211
228
  const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
212
- const middleware = [createRequireWebAuthMiddleware(auth), createRequireGlobalAdminMiddleware()];
229
+ const middleware = [
230
+ createRequireWebAuthMiddleware(auth),
231
+ ...this.verifiedMiddleware(),
232
+ createRequireGlobalAdminMiddleware()
233
+ ];
213
234
  return this.wrapWeb(withMiddleware(...middleware)(handler));
214
235
  }
215
236
  wrapAuthenticated(handler) {
216
237
  return this.wrap("authenticated", handler);
217
238
  }
239
+ wrapVerified(handler) {
240
+ const middleware = [...this.group("authenticated"), ...this.verifiedMiddleware()];
241
+ return withMiddleware(...middleware)(handler);
242
+ }
218
243
  wrapPublicRead(handler) {
219
244
  if (isPublicReadsEnabled()) {
220
245
  return handler;
@@ -245,6 +270,18 @@ class HttpKernel {
245
270
  wrapRegister(handler) {
246
271
  return this.wrapThrottle("register", resolveRegisterRateLimit(), handler);
247
272
  }
273
+ wrapWebAuth(handler, options) {
274
+ const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
275
+ const middleware = [
276
+ createRequireWebAuthMiddleware(auth),
277
+ ...options.verified ? this.verifiedMiddleware() : []
278
+ ];
279
+ return this.wrapWeb(withMiddleware(...middleware)(handler));
280
+ }
281
+ verifiedMiddleware() {
282
+ const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
283
+ return [createRequireVerifiedMiddleware(auth)];
284
+ }
248
285
  wrapThrottle(scope, rateLimit, handler) {
249
286
  const middleware = [];
250
287
  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,7 @@ 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 { createRequireVerifiedMiddleware } from "@getstrata/core/http/requireVerifiedMiddleware";
37
42
  import { createRequireWebAuthMiddleware } from "@getstrata/core/http/requireWebAuthMiddleware";
38
43
  import { withErrorHandling } from "@getstrata/core/http/response";
39
44
  import { withMiddleware } from "@getstrata/core/http/routeMiddleware";
@@ -192,6 +197,9 @@ class HttpKernel {
192
197
  return this.wrapWeb(async (request) => {
193
198
  const user = await auth.resolve(request);
194
199
  if (user) {
200
+ if (isEmailVerificationRequired() && !hasVerifiedEmail(user)) {
201
+ return Response.redirect("/email/verify", 302);
202
+ }
195
203
  return Response.redirect(home, 302);
196
204
  }
197
205
  return handler(request);
@@ -204,24 +212,41 @@ class HttpKernel {
204
212
  return this.wrapWebAuthenticated(handler);
205
213
  }
206
214
  wrapWebAuthenticated(handler) {
207
- const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
208
- return this.wrapWeb(withMiddleware(createRequireWebAuthMiddleware(auth))(handler));
215
+ return this.wrapWebAuth(handler, { verified: true });
216
+ }
217
+ wrapWebAuthenticatedAllowUnverified(handler) {
218
+ return this.wrapWebAuth(handler, { verified: false });
219
+ }
220
+ wrapWebVerified(handler) {
221
+ return this.wrapWebAuth(handler, { verified: true });
209
222
  }
210
223
  wrapWebAbility(ability, handler) {
211
224
  const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
212
225
  const abilityChecker = resolveAbilityChecker(this.dependencies.container);
213
226
  const requireAbility = createRequireAbilityMiddleware(abilityChecker);
214
- const middleware = [createRequireWebAuthMiddleware(auth), requireAbility(ability)];
227
+ const middleware = [
228
+ createRequireWebAuthMiddleware(auth),
229
+ ...this.verifiedMiddleware(),
230
+ requireAbility(ability)
231
+ ];
215
232
  return this.wrapWeb(withMiddleware(...middleware)(handler));
216
233
  }
217
234
  wrapWebGlobalAdmin(handler) {
218
235
  const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
219
- const middleware = [createRequireWebAuthMiddleware(auth), createRequireGlobalAdminMiddleware()];
236
+ const middleware = [
237
+ createRequireWebAuthMiddleware(auth),
238
+ ...this.verifiedMiddleware(),
239
+ createRequireGlobalAdminMiddleware()
240
+ ];
220
241
  return this.wrapWeb(withMiddleware(...middleware)(handler));
221
242
  }
222
243
  wrapAuthenticated(handler) {
223
244
  return this.wrap("authenticated", handler);
224
245
  }
246
+ wrapVerified(handler) {
247
+ const middleware = [...this.group("authenticated"), ...this.verifiedMiddleware()];
248
+ return withMiddleware(...middleware)(handler);
249
+ }
225
250
  wrapPublicRead(handler) {
226
251
  if (isPublicReadsEnabled()) {
227
252
  return handler;
@@ -252,6 +277,18 @@ class HttpKernel {
252
277
  wrapRegister(handler) {
253
278
  return this.wrapThrottle("register", resolveRegisterRateLimit(), handler);
254
279
  }
280
+ wrapWebAuth(handler, options) {
281
+ const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
282
+ const middleware = [
283
+ createRequireWebAuthMiddleware(auth),
284
+ ...options.verified ? this.verifiedMiddleware() : []
285
+ ];
286
+ return this.wrapWeb(withMiddleware(...middleware)(handler));
287
+ }
288
+ verifiedMiddleware() {
289
+ const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
290
+ return [createRequireVerifiedMiddleware(auth)];
291
+ }
255
292
  wrapThrottle(scope, rateLimit, handler) {
256
293
  const middleware = [];
257
294
  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.61",
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/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/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.74",
184
184
  "typescript": "^5.9.0"
185
185
  }
186
186
  }