@getstrata/bootstrap 0.2.51 → 0.2.53

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,16 @@
1
1
  # @getstrata/bootstrap changelog
2
2
 
3
+ ## 0.2.53
4
+
5
+ - `registerDefaultJobs()` also registers `audit.export` (`ExportAuditLogsJob`).
6
+ - In-process `audit-export` schedule runs that job instead of calling `exportPendingAuditLogs()` inline.
7
+
8
+ ## 0.2.52
9
+
10
+ - View provider registers `configureWebErrorView` so `errors/*.eta` render through the app Eta layout. `EtaViewEngine` receives `Request` from the layout-data resolver.
11
+ - `createWebServer` unknown routes and null handlers return styled HTML 404s and run inside request ALS so `configureWebLayoutData` can read the session cookie.
12
+ - `wrapSecuredRouteModelByKey` is documented as the wrong default for public HTML show pages; a missing model is a styled 404 and HTML/composite GET ETags stay off.
13
+
3
14
  ## 0.2.51
4
15
 
5
16
  - `createCookieSessionAuthManager` returns `CookieSessionAuthManager` (`signIn`, `signOut`, `signInRedirect`, `signOutRedirect`). Controllers no longer need a local cookie helper.
@@ -9,10 +9,16 @@ export declare function routeParams(request: Request): Record<string, string>;
9
9
  * Mutates the request in place so instanceof Request and Bun internals stay valid.
10
10
  */
11
11
  export declare function toRouteRequest<TParams extends Record<string, string>>(request: Request): RouteRequest<TParams>;
12
- /** Laravel-style secured route-model binding for string keys (slugs, UUIDs). */
12
+ /**
13
+ * Laravel-style secured route-model binding for string keys (slugs, UUIDs).
14
+ * Public HTML show pages should look up the model in the controller instead.
15
+ * If this wrapper is still used on HTML, a missing model becomes a styled 404
16
+ * and GET ETags are skipped for HTML / composite objects unless `etag: true`.
17
+ */
13
18
  export declare function wrapSecuredRouteModelByKey<TParams extends Record<string, string>, TModel, TParam extends keyof TParams & string>(param: TParam, resolver: (key: string, request: RouteRequest<TParams>) => Promise<TModel>, authorization: {
14
19
  resource: string;
15
20
  action: "view" | "create" | "update" | "delete";
21
+ etag?: boolean;
16
22
  }, handler: (request: RouteRequest<TParams>, model: TModel) => Response | Promise<Response>): RouteHandler;
17
23
  /** Web group (CSRF + flash + HTML errors) plus login throttle. Do not wrap with wrapWeb again. */
18
24
  export declare function wrapWebLogin(kernel: HttpKernel, handler: RouteHandler, onThrottled: (request: Request) => Response | Promise<Response>): RouteHandler;
@@ -170,7 +170,7 @@ import { validateEnv } from "@getstrata/core/config/envSchema";
170
170
 
171
171
  // ../../src/config/app.ts
172
172
  var appConfig = {
173
- name: "WorkHub",
173
+ name: process.env.APP_NAME?.trim() || "WorkHub",
174
174
  env: process.env.APP_ENV ?? "local",
175
175
  debug: (process.env.APP_DEBUG ?? "true") !== "false",
176
176
  url: process.env.APP_URL ?? "http://localhost:3000",
@@ -424,6 +424,7 @@ import {
424
424
 
425
425
  // ../../src/bootstrap/queue/defaultJobs.ts
426
426
  import { DispatchWebhookJob } from "@getstrata/core/jobs/dispatchWebhookJob";
427
+ import { ExportAuditLogsJob } from "@getstrata/core/jobs/exportAuditLogsJob";
427
428
  import { InvalidateCacheTagsJob as InvalidateCacheTagsJob2 } from "@getstrata/core/jobs/invalidateCacheTagsJob";
428
429
  import { jobRegistry } from "@getstrata/core/queue/jobRegistry";
429
430
  import { resolveApplicationCache as resolveApplicationCache2 } from "@getstrata/core/runtime/applicationRegistry";
@@ -432,6 +433,7 @@ function registerDefaultJobs() {
432
433
  return new InvalidateCacheTagsJob2(resolveApplicationCache2());
433
434
  });
434
435
  jobRegistry.register("webhook.dispatch", () => new DispatchWebhookJob);
436
+ jobRegistry.register("audit.export", () => new ExportAuditLogsJob);
435
437
  }
436
438
 
437
439
  // ../../src/bootstrap/providers/queue.ts
@@ -460,7 +462,13 @@ var storage_default = storageProvider;
460
462
 
461
463
  // ../../src/bootstrap/providers/view.ts
462
464
  import { currentRequestMeta } from "@getstrata/core/http/requestMetaContext";
463
- import { DEFAULT_VIEWS_DIRECTORY, EtaViewEngine, resolveWebLayoutData } from "@getstrata/core/view";
465
+ import {
466
+ configureWebErrorView,
467
+ DEFAULT_VIEWS_DIRECTORY,
468
+ EtaViewEngine,
469
+ errorTemplateName,
470
+ resolveWebLayoutData
471
+ } from "@getstrata/core/view";
464
472
 
465
473
  // ../../src/config/frontend.ts
466
474
  function readFrontendMode() {
@@ -491,7 +499,15 @@ var viewProvider = {
491
499
  }
492
500
  const viewsDirectory = process.env.VIEW_DIRECTORY?.trim() || DEFAULT_VIEWS_DIRECTORY;
493
501
  config.set(VIEW_DIRECTORY_CONFIG_KEY, viewsDirectory);
494
- container.set(CORE_VIEW_TOKEN, new EtaViewEngine(viewsDirectory, () => resolveWebLayoutData(container, currentRequestMeta().request)));
502
+ const engine = new EtaViewEngine(viewsDirectory, (request) => resolveWebLayoutData(container, request ?? currentRequestMeta().request));
503
+ container.set(CORE_VIEW_TOKEN, engine);
504
+ configureWebErrorView({
505
+ render: async (input) => engine.render(errorTemplateName(input.status), {
506
+ title: input.title,
507
+ message: input.message,
508
+ errors: input.errors
509
+ })
510
+ });
495
511
  }
496
512
  };
497
513
 
@@ -4,14 +4,14 @@ var __jsonParse = (a) => JSON.parse(a);
4
4
  // ../../src/bootstrap/createRoutes.ts
5
5
  import { applyMiddlewareToRoutes as applyMiddlewareToRoutes3 } from "@getstrata/core/http/middleware";
6
6
  import { jsonResponse as jsonResponse4 } from "@getstrata/core/http/response";
7
- import { htmlResponse as htmlResponse2 } from "@getstrata/core/view";
7
+ import { notFoundHtmlResponse as notFoundHtmlResponse2 } from "@getstrata/core/view";
8
8
 
9
9
  // ../../index.html
10
10
  var strata_default = __jsonParse("{\"index\":\"_.._/_.._/index.html\",\"files\":[{\"input\":\"../../index.html\",\"path\":\"./index-sfreg6q3.js\",\"loader\":\"js\",\"isEntry\":true,\"headers\":{\"etag\":\"Oc_YLpCmV6M\",\"content-type\":\"text/javascript;charset=utf-8\"}},{\"input\":\"../../index.html\",\"path\":\"_.._/_.._/index.html\",\"loader\":\"html\",\"isEntry\":true,\"headers\":{\"etag\":\"rWY90LWIcx8\",\"content-type\":\"text/html;charset=utf-8\"}}]}");
11
11
 
12
12
  // ../../src/config/app.ts
13
13
  var appConfig = {
14
- name: "WorkHub",
14
+ name: process.env.APP_NAME?.trim() || "WorkHub",
15
15
  env: process.env.APP_ENV ?? "local",
16
16
  debug: (process.env.APP_DEBUG ?? "true") !== "false",
17
17
  url: process.env.APP_URL ?? "http://localhost:3000",
@@ -508,7 +508,7 @@ function mergeSpaRoutes(dependencies, routes) {
508
508
 
509
509
  // ../../src/bootstrap/createWebRoutes.ts
510
510
  import { join as join3 } from "path";
511
- import { htmlResponse } from "@getstrata/core/view";
511
+ import { notFoundHtmlResponse } from "@getstrata/core/view";
512
512
 
513
513
  // ../../src/bootstrap/buildWebModuleRoutes.ts
514
514
  import { applyMiddlewareToRoutes as applyMiddlewareToRoutes2 } from "@getstrata/core/http/middleware";
@@ -551,7 +551,7 @@ function createWebRoutes(dependencies) {
551
551
  const relativePath = pathname.replace(/^\//, "");
552
552
  const file = Bun.file(join3(process.cwd(), "public", relativePath));
553
553
  if (!await file.exists()) {
554
- return htmlResponse("Not Found", { status: 404 });
554
+ return notFoundHtmlResponse();
555
555
  }
556
556
  return new Response(file);
557
557
  };
@@ -751,7 +751,7 @@ function assertScimIfMatch(request, etagSource) {
751
751
  }
752
752
 
753
753
  // ../../src/modules/scim/service.ts
754
- import { hashPassword } from "@getstrata/core/auth/password";
754
+ import { hashPassword as hashPassword2 } from "@getstrata/core/auth/password";
755
755
  import { resolveService } from "@getstrata/core/contracts/di";
756
756
  import { NotFoundError as NotFoundError4 } from "@getstrata/core/errors/http";
757
757
  import { currentTenantId as currentTenantId4 } from "@getstrata/core/tenant/tenantContext";
@@ -1014,11 +1014,11 @@ var apiTokenTable = defineTable2({
1014
1014
 
1015
1015
  // ../../src/modules/user/authService.ts
1016
1016
  import { verifyPassword } from "@getstrata/core/auth/password";
1017
- import { revealMfaSecret } from "@getstrata/core/crypto/mfaSecret";
1018
- import { UnauthorizedError } from "@getstrata/core/errors/http";
1017
+ import { protectMfaSecret, revealMfaSecret } from "@getstrata/core/crypto/mfaSecret";
1018
+ import { UnauthorizedError, ValidationError } from "@getstrata/core/errors/http";
1019
1019
  import { logSecurityEvent } from "@getstrata/core/security/securityEvents";
1020
1020
  import { resolveDefaultTokenExpiryDays } from "@getstrata/core/security/tokenExpiry";
1021
- import { verifyTotp } from "@getstrata/core/security/totp";
1021
+ import { buildOtpauthUrl, generateTotpSecret, verifyTotp } from "@getstrata/core/security/totp";
1022
1022
  import { currentTenantId as currentTenantId2 } from "@getstrata/core/tenant/tenantContext";
1023
1023
 
1024
1024
  // ../../src/core/auth/abilityCatalog.ts
@@ -1075,6 +1075,19 @@ var oauthIdentityTable = defineTable4({
1075
1075
  columns: ["id", "user_id", "provider", "provider_user_id", "email", "created_at"]
1076
1076
  });
1077
1077
 
1078
+ // ../../src/modules/user/passwordResetService.ts
1079
+ import { hashPassword } from "@getstrata/core/auth/password";
1080
+ import { hashApiToken } from "@getstrata/core/auth/tokenHash";
1081
+ import { repositoryConnection as db2 } from "@getstrata/core/database/repositoryConnection";
1082
+ import { ValidationError as ValidationError2 } from "@getstrata/core/errors/http";
1083
+ import { absoluteTemporarySignedUrl } from "@getstrata/core/http/signedUrl";
1084
+ import { mailer } from "@getstrata/core/mail/mailer";
1085
+ import { sendMarkdownMail } from "@getstrata/core/mail/markdownMailable";
1086
+ import { logSecurityEvent as logSecurityEvent2 } from "@getstrata/core/security/securityEvents";
1087
+ import { timingSafeCompareString } from "@getstrata/core/security/timingSafeCompare";
1088
+ var RESET_TTL_SECONDS = 60 * 60;
1089
+ var VERIFY_TTL_SECONDS = 60 * 60 * 24;
1090
+
1078
1091
  // ../../src/modules/user/repository.ts
1079
1092
  import {
1080
1093
  emailLookupForQuery,
@@ -1108,7 +1121,7 @@ var userTable = defineTable5({
1108
1121
  });
1109
1122
 
1110
1123
  // ../../src/modules/user/tokenService.ts
1111
- import { hashApiToken } from "@getstrata/core/auth/tokenHash";
1124
+ import { hashApiToken as hashApiToken2 } from "@getstrata/core/auth/tokenHash";
1112
1125
  import { ForbiddenError, NotFoundError as NotFoundError3 } from "@getstrata/core/errors/http";
1113
1126
  import { resolveDefaultTokenExpiryDays as resolveDefaultTokenExpiryDays2 } from "@getstrata/core/security/tokenExpiry";
1114
1127
 
@@ -1176,7 +1189,7 @@ class ScimService {
1176
1189
  if (!email) {
1177
1190
  throw new Error("SCIM userName or email is required.");
1178
1191
  }
1179
- const passwordHash = await hashPassword(crypto.randomUUID());
1192
+ const passwordHash = await hashPassword2(crypto.randomUUID());
1180
1193
  const user = await this.users.create({
1181
1194
  name: payload.name?.formatted ?? email.split("@")[0] ?? "SCIM User",
1182
1195
  email,
@@ -1428,7 +1441,7 @@ function createRoutes(dependencies) {
1428
1441
  "/*": async () => {
1429
1442
  registerRoute2("GET", "/*", []);
1430
1443
  if (isViewsEnabled()) {
1431
- return htmlResponse2("Not Found", { status: 404 });
1444
+ return notFoundHtmlResponse2();
1432
1445
  }
1433
1446
  if (isSpaEnabled()) {
1434
1447
  return jsonResponse4({ error: "Not Found" }, { status: 404 });
@@ -3,7 +3,7 @@ var __jsonParse = (a) => JSON.parse(a);
3
3
 
4
4
  // ../../src/bootstrap/createWebRoutes.ts
5
5
  import { join as join2 } from "path";
6
- import { htmlResponse } from "@getstrata/core/view";
6
+ import { notFoundHtmlResponse } from "@getstrata/core/view";
7
7
 
8
8
  // ../../src/config/frontend.ts
9
9
  function readFrontendMode() {
@@ -478,7 +478,7 @@ function createWebRoutes(dependencies) {
478
478
  const relativePath = pathname.replace(/^\//, "");
479
479
  const file = Bun.file(join2(process.cwd(), "public", relativePath));
480
480
  if (!await file.exists()) {
481
- return htmlResponse("Not Found", { status: 404 });
481
+ return notFoundHtmlResponse();
482
482
  }
483
483
  return new Response(file);
484
484
  };
@@ -170,7 +170,7 @@ import { validateEnv } from "@getstrata/core/config/envSchema";
170
170
 
171
171
  // ../../src/config/app.ts
172
172
  var appConfig = {
173
- name: "WorkHub",
173
+ name: process.env.APP_NAME?.trim() || "WorkHub",
174
174
  env: process.env.APP_ENV ?? "local",
175
175
  debug: (process.env.APP_DEBUG ?? "true") !== "false",
176
176
  url: process.env.APP_URL ?? "http://localhost:3000",
@@ -424,6 +424,7 @@ import {
424
424
 
425
425
  // ../../src/bootstrap/queue/defaultJobs.ts
426
426
  import { DispatchWebhookJob } from "@getstrata/core/jobs/dispatchWebhookJob";
427
+ import { ExportAuditLogsJob } from "@getstrata/core/jobs/exportAuditLogsJob";
427
428
  import { InvalidateCacheTagsJob as InvalidateCacheTagsJob2 } from "@getstrata/core/jobs/invalidateCacheTagsJob";
428
429
  import { jobRegistry } from "@getstrata/core/queue/jobRegistry";
429
430
  import { resolveApplicationCache as resolveApplicationCache2 } from "@getstrata/core/runtime/applicationRegistry";
@@ -432,6 +433,7 @@ function registerDefaultJobs() {
432
433
  return new InvalidateCacheTagsJob2(resolveApplicationCache2());
433
434
  });
434
435
  jobRegistry.register("webhook.dispatch", () => new DispatchWebhookJob);
436
+ jobRegistry.register("audit.export", () => new ExportAuditLogsJob);
435
437
  }
436
438
 
437
439
  // ../../src/bootstrap/providers/queue.ts
@@ -460,7 +462,13 @@ var storage_default = storageProvider;
460
462
 
461
463
  // ../../src/bootstrap/providers/view.ts
462
464
  import { currentRequestMeta } from "@getstrata/core/http/requestMetaContext";
463
- import { DEFAULT_VIEWS_DIRECTORY, EtaViewEngine, resolveWebLayoutData } from "@getstrata/core/view";
465
+ import {
466
+ configureWebErrorView,
467
+ DEFAULT_VIEWS_DIRECTORY,
468
+ EtaViewEngine,
469
+ errorTemplateName,
470
+ resolveWebLayoutData
471
+ } from "@getstrata/core/view";
464
472
 
465
473
  // ../../src/config/frontend.ts
466
474
  function readFrontendMode() {
@@ -491,7 +499,15 @@ var viewProvider = {
491
499
  }
492
500
  const viewsDirectory = process.env.VIEW_DIRECTORY?.trim() || DEFAULT_VIEWS_DIRECTORY;
493
501
  config.set(VIEW_DIRECTORY_CONFIG_KEY, viewsDirectory);
494
- container.set(CORE_VIEW_TOKEN, new EtaViewEngine(viewsDirectory, () => resolveWebLayoutData(container, currentRequestMeta().request)));
502
+ const engine = new EtaViewEngine(viewsDirectory, (request) => resolveWebLayoutData(container, request ?? currentRequestMeta().request));
503
+ container.set(CORE_VIEW_TOKEN, engine);
504
+ configureWebErrorView({
505
+ render: async (input) => engine.render(errorTemplateName(input.status), {
506
+ title: input.title,
507
+ message: input.message,
508
+ errors: input.errors
509
+ })
510
+ });
495
511
  }
496
512
  };
497
513
 
@@ -3,7 +3,13 @@ var __jsonParse = (a) => JSON.parse(a);
3
3
 
4
4
  // ../../src/bootstrap/providers/view.ts
5
5
  import { currentRequestMeta } from "@getstrata/core/http/requestMetaContext";
6
- import { DEFAULT_VIEWS_DIRECTORY, EtaViewEngine, resolveWebLayoutData } from "@getstrata/core/view";
6
+ import {
7
+ configureWebErrorView,
8
+ DEFAULT_VIEWS_DIRECTORY,
9
+ EtaViewEngine,
10
+ errorTemplateName,
11
+ resolveWebLayoutData
12
+ } from "@getstrata/core/view";
7
13
 
8
14
  // ../../src/config/frontend.ts
9
15
  function readFrontendMode() {
@@ -34,7 +40,15 @@ var viewProvider = {
34
40
  }
35
41
  const viewsDirectory = process.env.VIEW_DIRECTORY?.trim() || DEFAULT_VIEWS_DIRECTORY;
36
42
  config.set(VIEW_DIRECTORY_CONFIG_KEY, viewsDirectory);
37
- container.set(CORE_VIEW_TOKEN, new EtaViewEngine(viewsDirectory, () => resolveWebLayoutData(container, currentRequestMeta().request)));
43
+ const engine = new EtaViewEngine(viewsDirectory, (request) => resolveWebLayoutData(container, request ?? currentRequestMeta().request));
44
+ container.set(CORE_VIEW_TOKEN, engine);
45
+ configureWebErrorView({
46
+ render: async (input) => engine.render(errorTemplateName(input.status), {
47
+ title: input.title,
48
+ message: input.message,
49
+ errors: input.errors
50
+ })
51
+ });
38
52
  }
39
53
  };
40
54
  export {
@@ -81,7 +81,7 @@ import { validateEnv } from "@getstrata/core/config/envSchema";
81
81
 
82
82
  // ../../src/config/app.ts
83
83
  var appConfig = {
84
- name: "WorkHub",
84
+ name: process.env.APP_NAME?.trim() || "WorkHub",
85
85
  env: process.env.APP_ENV ?? "local",
86
86
  debug: (process.env.APP_DEBUG ?? "true") !== "false",
87
87
  url: process.env.APP_URL ?? "http://localhost:3000",
@@ -414,6 +414,7 @@ import {
414
414
 
415
415
  // ../../src/bootstrap/queue/defaultJobs.ts
416
416
  import { DispatchWebhookJob } from "@getstrata/core/jobs/dispatchWebhookJob";
417
+ import { ExportAuditLogsJob } from "@getstrata/core/jobs/exportAuditLogsJob";
417
418
  import { InvalidateCacheTagsJob as InvalidateCacheTagsJob2 } from "@getstrata/core/jobs/invalidateCacheTagsJob";
418
419
  import { jobRegistry } from "@getstrata/core/queue/jobRegistry";
419
420
  import { resolveApplicationCache as resolveApplicationCache2 } from "@getstrata/core/runtime/applicationRegistry";
@@ -422,6 +423,7 @@ function registerDefaultJobs() {
422
423
  return new InvalidateCacheTagsJob2(resolveApplicationCache2());
423
424
  });
424
425
  jobRegistry.register("webhook.dispatch", () => new DispatchWebhookJob);
426
+ jobRegistry.register("audit.export", () => new ExportAuditLogsJob);
425
427
  }
426
428
 
427
429
  // ../../src/bootstrap/providers/queue.ts
@@ -450,7 +452,13 @@ var storage_default = storageProvider;
450
452
 
451
453
  // ../../src/bootstrap/providers/view.ts
452
454
  import { currentRequestMeta } from "@getstrata/core/http/requestMetaContext";
453
- import { DEFAULT_VIEWS_DIRECTORY, EtaViewEngine, resolveWebLayoutData } from "@getstrata/core/view";
455
+ import {
456
+ configureWebErrorView,
457
+ DEFAULT_VIEWS_DIRECTORY,
458
+ EtaViewEngine,
459
+ errorTemplateName,
460
+ resolveWebLayoutData
461
+ } from "@getstrata/core/view";
454
462
 
455
463
  // ../../src/config/frontend.ts
456
464
  function readFrontendMode() {
@@ -481,7 +489,15 @@ var viewProvider = {
481
489
  }
482
490
  const viewsDirectory = process.env.VIEW_DIRECTORY?.trim() || DEFAULT_VIEWS_DIRECTORY;
483
491
  config.set(VIEW_DIRECTORY_CONFIG_KEY, viewsDirectory);
484
- container.set(CORE_VIEW_TOKEN, new EtaViewEngine(viewsDirectory, () => resolveWebLayoutData(container, currentRequestMeta().request)));
492
+ const engine = new EtaViewEngine(viewsDirectory, (request) => resolveWebLayoutData(container, request ?? currentRequestMeta().request));
493
+ container.set(CORE_VIEW_TOKEN, engine);
494
+ configureWebErrorView({
495
+ render: async (input) => engine.render(errorTemplateName(input.status), {
496
+ title: input.title,
497
+ message: input.message,
498
+ errors: input.errors
499
+ })
500
+ });
485
501
  }
486
502
  };
487
503
 
@@ -3,6 +3,7 @@ var __jsonParse = (a) => JSON.parse(a);
3
3
 
4
4
  // ../../src/bootstrap/queue/defaultJobs.ts
5
5
  import { DispatchWebhookJob } from "@getstrata/core/jobs/dispatchWebhookJob";
6
+ import { ExportAuditLogsJob } from "@getstrata/core/jobs/exportAuditLogsJob";
6
7
  import { InvalidateCacheTagsJob } from "@getstrata/core/jobs/invalidateCacheTagsJob";
7
8
  import { jobRegistry } from "@getstrata/core/queue/jobRegistry";
8
9
  import { resolveApplicationCache } from "@getstrata/core/runtime/applicationRegistry";
@@ -11,6 +12,7 @@ function registerDefaultJobs() {
11
12
  return new InvalidateCacheTagsJob(resolveApplicationCache());
12
13
  });
13
14
  jobRegistry.register("webhook.dispatch", () => new DispatchWebhookJob);
15
+ jobRegistry.register("audit.export", () => new ExportAuditLogsJob);
14
16
  }
15
17
  export {
16
18
  registerDefaultJobs
@@ -2,7 +2,7 @@
2
2
  var __jsonParse = (a) => JSON.parse(a);
3
3
 
4
4
  // ../../src/bootstrap/schedule.ts
5
- import { exportPendingAuditLogs } from "@getstrata/core/audit/exportAuditLogs";
5
+ import { ExportAuditLogsJob } from "@getstrata/core/jobs/exportAuditLogsJob";
6
6
  import { appLogger } from "@getstrata/core/logging/logger";
7
7
  import { appSchedule } from "@getstrata/core/scheduler/schedule";
8
8
 
@@ -36,10 +36,7 @@ appSchedule.command("* * * * *", "audit-export", async () => {
36
36
  return;
37
37
  }
38
38
  try {
39
- const exported = await exportPendingAuditLogs();
40
- if (exported > 0) {
41
- appLogger.info(`Exported ${exported} audit log entries to SIEM.`);
42
- }
39
+ await new ExportAuditLogsJob().handle({});
43
40
  } catch (error) {
44
41
  appLogger.error("Audit export failed.", { error: String(error) });
45
42
  }
@@ -2,10 +2,21 @@
2
2
  var __jsonParse = (a) => JSON.parse(a);
3
3
 
4
4
  // ../../src/bootstrap/web/server.ts
5
+ import { currentRequestMeta, runWithRequestMeta } from "@getstrata/core/http/requestMetaContext";
6
+ import { notFoundHtmlResponse } from "@getstrata/core/view";
7
+ async function missingHtmlResponse() {
8
+ return notFoundHtmlResponse();
9
+ }
5
10
  function wrapRouteHandler(handler) {
6
11
  return async (request) => {
7
- const response = await handler(request);
8
- return response ?? new Response("Not Found", { status: 404 });
12
+ return await runWithRequestMeta({
13
+ ...currentRequestMeta(),
14
+ request,
15
+ userAgent: request.headers.get("user-agent")
16
+ }, async () => {
17
+ const response = await handler(request);
18
+ return response ?? await missingHtmlResponse();
19
+ });
9
20
  };
10
21
  }
11
22
  function convertAppRoutesToBunRoutes(routes) {
@@ -37,19 +48,25 @@ function createWebServer(options) {
37
48
  port: options.port,
38
49
  ...bunRoutes ? { routes: bunRoutes } : {},
39
50
  async fetch(request) {
40
- await options.onRequest?.(request);
41
- const url = new URL(request.url);
42
- if (url.pathname.startsWith("/assets/")) {
43
- const file = Bun.file(`${publicDir}${url.pathname}`);
44
- if (await file.exists()) {
45
- return new Response(file);
51
+ return await runWithRequestMeta({
52
+ ...currentRequestMeta(),
53
+ request,
54
+ userAgent: request.headers.get("user-agent")
55
+ }, async () => {
56
+ await options.onRequest?.(request);
57
+ const url = new URL(request.url);
58
+ if (url.pathname.startsWith("/assets/")) {
59
+ const file = Bun.file(`${publicDir}${url.pathname}`);
60
+ if (await file.exists()) {
61
+ return new Response(file);
62
+ }
46
63
  }
47
- }
48
- if (options.handle) {
49
- const response = await options.handle(request);
50
- return response ?? new Response("Not Found", { status: 404 });
51
- }
52
- return new Response("Not Found", { status: 404 });
64
+ if (options.handle) {
65
+ const response = await options.handle(request);
66
+ return response ?? await missingHtmlResponse();
67
+ }
68
+ return await missingHtmlResponse();
69
+ });
53
70
  }
54
71
  });
55
72
  }
package/dist/index.js CHANGED
@@ -531,7 +531,7 @@ import { validateEnv } from "@getstrata/core/config/envSchema";
531
531
 
532
532
  // ../../src/config/app.ts
533
533
  var appConfig = {
534
- name: "WorkHub",
534
+ name: process.env.APP_NAME?.trim() || "WorkHub",
535
535
  env: process.env.APP_ENV ?? "local",
536
536
  debug: (process.env.APP_DEBUG ?? "true") !== "false",
537
537
  url: process.env.APP_URL ?? "http://localhost:3000",
@@ -770,6 +770,7 @@ import {
770
770
 
771
771
  // ../../src/bootstrap/queue/defaultJobs.ts
772
772
  import { DispatchWebhookJob } from "@getstrata/core/jobs/dispatchWebhookJob";
773
+ import { ExportAuditLogsJob } from "@getstrata/core/jobs/exportAuditLogsJob";
773
774
  import { InvalidateCacheTagsJob as InvalidateCacheTagsJob2 } from "@getstrata/core/jobs/invalidateCacheTagsJob";
774
775
  import { jobRegistry } from "@getstrata/core/queue/jobRegistry";
775
776
  import { resolveApplicationCache as resolveApplicationCache2 } from "@getstrata/core/runtime/applicationRegistry";
@@ -778,6 +779,7 @@ function registerDefaultJobs() {
778
779
  return new InvalidateCacheTagsJob2(resolveApplicationCache2());
779
780
  });
780
781
  jobRegistry.register("webhook.dispatch", () => new DispatchWebhookJob);
782
+ jobRegistry.register("audit.export", () => new ExportAuditLogsJob);
781
783
  }
782
784
 
783
785
  // ../../src/bootstrap/providers/queue.ts
@@ -806,7 +808,13 @@ var storage_default = storageProvider;
806
808
 
807
809
  // ../../src/bootstrap/providers/view.ts
808
810
  import { currentRequestMeta } from "@getstrata/core/http/requestMetaContext";
809
- import { DEFAULT_VIEWS_DIRECTORY, EtaViewEngine, resolveWebLayoutData } from "@getstrata/core/view";
811
+ import {
812
+ configureWebErrorView,
813
+ DEFAULT_VIEWS_DIRECTORY,
814
+ EtaViewEngine,
815
+ errorTemplateName,
816
+ resolveWebLayoutData
817
+ } from "@getstrata/core/view";
810
818
  var CORE_VIEW_TOKEN = "core.view";
811
819
  var VIEW_DIRECTORY_CONFIG_KEY = "view.directory";
812
820
  var viewProvider = {
@@ -817,7 +825,15 @@ var viewProvider = {
817
825
  }
818
826
  const viewsDirectory = process.env.VIEW_DIRECTORY?.trim() || DEFAULT_VIEWS_DIRECTORY;
819
827
  config.set(VIEW_DIRECTORY_CONFIG_KEY, viewsDirectory);
820
- container.set(CORE_VIEW_TOKEN, new EtaViewEngine(viewsDirectory, () => resolveWebLayoutData(container, currentRequestMeta().request)));
828
+ const engine = new EtaViewEngine(viewsDirectory, (request) => resolveWebLayoutData(container, request ?? currentRequestMeta().request));
829
+ container.set(CORE_VIEW_TOKEN, engine);
830
+ configureWebErrorView({
831
+ render: async (input) => engine.render(errorTemplateName(input.status), {
832
+ title: input.title,
833
+ message: input.message,
834
+ errors: input.errors
835
+ })
836
+ });
821
837
  }
822
838
  };
823
839
 
@@ -868,7 +884,7 @@ function createAppContext() {
868
884
  }
869
885
  // ../../src/bootstrap/createWebRoutes.ts
870
886
  import { join as join3 } from "path";
871
- import { htmlResponse } from "@getstrata/core/view";
887
+ import { notFoundHtmlResponse } from "@getstrata/core/view";
872
888
  function registerRoute(method, path, middleware) {
873
889
  routeRegistry.register({ method, path, middleware });
874
890
  }
@@ -886,7 +902,7 @@ function createWebRoutes(dependencies) {
886
902
  const relativePath = pathname.replace(/^\//, "");
887
903
  const file = Bun.file(join3(process.cwd(), "public", relativePath));
888
904
  if (!await file.exists()) {
889
- return htmlResponse("Not Found", { status: 404 });
905
+ return notFoundHtmlResponse();
890
906
  }
891
907
  return new Response(file);
892
908
  };
@@ -1201,10 +1217,21 @@ function createRouteKernel(dependencies) {
1201
1217
  return createHttpKernel(dependencies);
1202
1218
  }
1203
1219
  // ../../src/bootstrap/web/server.ts
1220
+ import { currentRequestMeta as currentRequestMeta2, runWithRequestMeta } from "@getstrata/core/http/requestMetaContext";
1221
+ import { notFoundHtmlResponse as notFoundHtmlResponse2 } from "@getstrata/core/view";
1222
+ async function missingHtmlResponse() {
1223
+ return notFoundHtmlResponse2();
1224
+ }
1204
1225
  function wrapRouteHandler(handler) {
1205
1226
  return async (request) => {
1206
- const response = await handler(request);
1207
- return response ?? new Response("Not Found", { status: 404 });
1227
+ return await runWithRequestMeta({
1228
+ ...currentRequestMeta2(),
1229
+ request,
1230
+ userAgent: request.headers.get("user-agent")
1231
+ }, async () => {
1232
+ const response = await handler(request);
1233
+ return response ?? await missingHtmlResponse();
1234
+ });
1208
1235
  };
1209
1236
  }
1210
1237
  function convertAppRoutesToBunRoutes(routes) {
@@ -1236,19 +1263,25 @@ function createWebServer(options) {
1236
1263
  port: options.port,
1237
1264
  ...bunRoutes ? { routes: bunRoutes } : {},
1238
1265
  async fetch(request) {
1239
- await options.onRequest?.(request);
1240
- const url = new URL(request.url);
1241
- if (url.pathname.startsWith("/assets/")) {
1242
- const file = Bun.file(`${publicDir}${url.pathname}`);
1243
- if (await file.exists()) {
1244
- return new Response(file);
1266
+ return await runWithRequestMeta({
1267
+ ...currentRequestMeta2(),
1268
+ request,
1269
+ userAgent: request.headers.get("user-agent")
1270
+ }, async () => {
1271
+ await options.onRequest?.(request);
1272
+ const url = new URL(request.url);
1273
+ if (url.pathname.startsWith("/assets/")) {
1274
+ const file = Bun.file(`${publicDir}${url.pathname}`);
1275
+ if (await file.exists()) {
1276
+ return new Response(file);
1277
+ }
1245
1278
  }
1246
- }
1247
- if (options.handle) {
1248
- const response = await options.handle(request);
1249
- return response ?? new Response("Not Found", { status: 404 });
1250
- }
1251
- return new Response("Not Found", { status: 404 });
1279
+ if (options.handle) {
1280
+ const response = await options.handle(request);
1281
+ return response ?? await missingHtmlResponse();
1282
+ }
1283
+ return await missingHtmlResponse();
1284
+ });
1252
1285
  }
1253
1286
  });
1254
1287
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@getstrata/bootstrap",
3
- "version": "0.2.51",
3
+ "version": "0.2.53",
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/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/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/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/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/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/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/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.60",
183
+ "@getstrata/core": "^0.5.62",
184
184
  "typescript": "^5.9.0"
185
185
  }
186
186
  }