@getstrata/bootstrap 0.2.68 → 0.4.2

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/dist/index.js CHANGED
@@ -41,7 +41,7 @@ import { createRequireGlobalAdminMiddleware } from "@getstrata/core/http/require
41
41
  import { createRequirePasswordConfirmMiddleware } from "@getstrata/core/http/requirePasswordConfirmMiddleware";
42
42
  import { createRequireVerifiedMiddleware } from "@getstrata/core/http/requireVerifiedMiddleware";
43
43
  import { createRequireWebAuthMiddleware } from "@getstrata/core/http/requireWebAuthMiddleware";
44
- import { withErrorHandling } from "@getstrata/core/http/response";
44
+ import { withErrorHandling, withJsonErrorHandling } from "@getstrata/core/http/response";
45
45
  import { withMiddleware } from "@getstrata/core/http/routeMiddleware";
46
46
  import { createSecurityHeadersMiddleware } from "@getstrata/core/http/securityHeadersMiddleware";
47
47
  import { createValidateSignatureMiddleware } from "@getstrata/core/http/signedUrl";
@@ -188,7 +188,7 @@ class HttpKernel {
188
188
  return withMiddleware(...middleware)(handler);
189
189
  }
190
190
  wrapApi(handler) {
191
- return this.wrap(["api", "authenticated"], handler);
191
+ return withJsonErrorHandling(this.wrap(["api", "authenticated"], handler));
192
192
  }
193
193
  wrapWeb(handler) {
194
194
  return withErrorHandling(this.wrap("web", handler));
@@ -527,17 +527,19 @@ import {
527
527
  } from "@getstrata/core/contracts/di";
528
528
 
529
529
  // ../../src/bootstrap/providers/auth.ts
530
+ import { BasicAuthGuard } from "@getstrata/core/auth/basicAuthGuard";
530
531
  import {
531
532
  AuthManager,
532
533
  CompositeGuard,
533
534
  DatabaseTokenGuard,
534
535
  GuestGuard
535
536
  } from "@getstrata/core/auth/guard";
537
+ import { JwtGuard } from "@getstrata/core/auth/jwtGuard";
536
538
  import { SessionGuard } from "@getstrata/core/auth/sessionGuard";
537
539
 
538
540
  // ../../src/config/auth.ts
539
541
  var authConfig = {
540
- allowDevHeaders: (process.env.AUTH_DEV_HEADERS ?? "true") !== "false",
542
+ allowDevHeaders: process.env.AUTH_DEV_HEADERS === "true",
541
543
  tokenDefaultAbilities: ["*"]
542
544
  };
543
545
 
@@ -546,11 +548,22 @@ var authProvider = {
546
548
  name: "core.auth",
547
549
  register({ container, config }) {
548
550
  config.set("auth.allowDevHeaders", authConfig.allowDevHeaders);
549
- const guards = [new DatabaseTokenGuard(container), new SessionGuard(container)];
551
+ const apiGuard = new DatabaseTokenGuard(container);
552
+ const sessionGuard = new SessionGuard(container);
553
+ const jwtGuard = new JwtGuard;
554
+ const basicGuard = new BasicAuthGuard(container);
555
+ const guards = [apiGuard, jwtGuard, basicGuard, sessionGuard];
550
556
  if (authConfig.allowDevHeaders) {
551
557
  guards.push(new GuestGuard);
552
558
  }
553
- container.set(CORE_AUTH_TOKEN, new AuthManager(new CompositeGuard(guards)));
559
+ const auth = new AuthManager(new CompositeGuard(guards));
560
+ auth.registerGuard("api", apiGuard);
561
+ auth.registerGuard("access_token", apiGuard);
562
+ auth.registerGuard("jwt", jwtGuard);
563
+ auth.registerGuard("basic", basicGuard);
564
+ auth.registerGuard("web", sessionGuard);
565
+ auth.registerGuard("session", sessionGuard);
566
+ container.set(CORE_AUTH_TOKEN, auth);
554
567
  }
555
568
  };
556
569
  var auth_default = authProvider;
@@ -611,8 +624,12 @@ var queueConfig = {
611
624
  };
612
625
  // ../../src/bootstrap/env.ts
613
626
  import { defineEnvSchema } from "@getstrata/core/config/envSchema";
627
+ import { DEFAULT_SPA_PREFIX, FRONTEND_MODE_PATTERN } from "@getstrata/core/runtime/frontendMode";
614
628
  var appEnvSchema = defineEnvSchema({
615
- DATABASE_URL: { required: true, pattern: /^postgres(ql)?:\/\// },
629
+ DATABASE_URL: {
630
+ required: true,
631
+ pattern: /^(postgres(ql)?|mysql|sqlite):\/\//i
632
+ },
616
633
  PORT: {
617
634
  integer: true,
618
635
  minimum: 1,
@@ -640,9 +657,21 @@ var appEnvSchema = defineEnvSchema({
640
657
  pattern: /^(sync|async|redis)$/
641
658
  },
642
659
  AUTH_DEV_HEADERS: {
643
- default: "true",
660
+ default: "false",
644
661
  pattern: /^(true|false|0|1)$/
645
662
  },
663
+ DB_CONNECTION: {
664
+ default: "",
665
+ pattern: /^(pgsql|postgres|postgresql|mysql|mariadb|sqlite)?$/i
666
+ },
667
+ AUTH_DEFAULT_GUARD: {
668
+ default: "web"
669
+ },
670
+ JWT_TTL_SECONDS: {
671
+ integer: true,
672
+ minimum: 60,
673
+ default: "3600"
674
+ },
646
675
  APP_ENV: {
647
676
  default: "local"
648
677
  },
@@ -652,6 +681,13 @@ var appEnvSchema = defineEnvSchema({
652
681
  APP_URL: {
653
682
  default: "http://localhost:3000"
654
683
  },
684
+ FRONTEND_MODE: {
685
+ default: "api",
686
+ pattern: FRONTEND_MODE_PATTERN
687
+ },
688
+ SPA_PREFIX: {
689
+ default: DEFAULT_SPA_PREFIX
690
+ },
655
691
  API_PREFIX: {
656
692
  default: "/api/v1"
657
693
  },
@@ -1103,15 +1139,21 @@ import {
1103
1139
  // ../../src/bootstrap/membershipService.ts
1104
1140
  import { resolveMembershipService } from "@getstrata/core/auth/membershipService";
1105
1141
  // ../../src/bootstrap/secretsGuard.ts
1106
- var PUBLISHED_TEST_ADMIN_API_TOKEN = "workhub-admin-test-token";
1107
- var PUBLISHED_TEST_MEMBER_API_TOKEN = "workhub-member-test-token";
1108
- var PUBLISHED_TEST_SCIM_BEARER_TOKEN = "workhub-scim-test-token";
1142
+ import { isViewsMode, parseFrontendMode } from "@getstrata/core/runtime/frontendMode";
1143
+ var PUBLISHED_TEST_ADMIN_API_TOKEN = "strata-admin-test-token";
1144
+ var PUBLISHED_TEST_MEMBER_API_TOKEN = "strata-member-test-token";
1145
+ var PUBLISHED_TEST_SCIM_BEARER_TOKEN = "strata-scim-test-token";
1109
1146
  var MIN_SESSION_SECRET_LENGTH = 32;
1110
1147
  var PUBLISHED_TEST_TOKENS = new Set([
1111
1148
  PUBLISHED_TEST_ADMIN_API_TOKEN,
1112
- PUBLISHED_TEST_MEMBER_API_TOKEN
1149
+ PUBLISHED_TEST_MEMBER_API_TOKEN,
1150
+ "workhub-admin-test-token",
1151
+ "workhub-member-test-token"
1152
+ ]);
1153
+ var PUBLISHED_TEST_SCIM_TOKENS = new Set([
1154
+ PUBLISHED_TEST_SCIM_BEARER_TOKEN,
1155
+ "workhub-scim-test-token"
1113
1156
  ]);
1114
- var PUBLISHED_TEST_SCIM_TOKENS = new Set([PUBLISHED_TEST_SCIM_BEARER_TOKEN]);
1115
1157
  function isEnabled(value, defaultEnabled) {
1116
1158
  if (value === undefined) {
1117
1159
  return defaultEnabled;
@@ -1135,7 +1177,7 @@ function assertAuthDevHeadersDisabled(env) {
1135
1177
  function assertSessionSecret(env) {
1136
1178
  const secret = env.SESSION_SECRET?.trim() ?? "";
1137
1179
  if (secret.length < MIN_SESSION_SECRET_LENGTH) {
1138
- throw new Error("Production startup blocked: set SESSION_SECRET when FRONTEND_MODE=server-htmx (32+ characters).");
1180
+ throw new Error("Production startup blocked: set SESSION_SECRET when FRONTEND_MODE=server-htmx or hybrid (32+ characters).");
1139
1181
  }
1140
1182
  }
1141
1183
  function assertPublishedTestTokensRotated(env) {
@@ -1197,8 +1239,7 @@ function assertProductionSecrets(env = process.env) {
1197
1239
  assertTokenAuthProductionSecrets(env);
1198
1240
  }
1199
1241
  assertFeatureProductionSecrets(env);
1200
- const frontendMode = (env.FRONTEND_MODE ?? "api").trim();
1201
- if (frontendMode === "server-htmx") {
1242
+ if (isViewsMode(parseFrontendMode(env.FRONTEND_MODE))) {
1202
1243
  assertSessionSecret(env);
1203
1244
  }
1204
1245
  }
@@ -1235,6 +1276,7 @@ async function parseFormBody(request) {
1235
1276
  return { fields, files };
1236
1277
  }
1237
1278
  // ../../src/bootstrap/web/routing.ts
1279
+ import { requestPrefersJson } from "@getstrata/core/http/contentNegotiation";
1238
1280
  import { withErrorHandling as withErrorHandling2 } from "@getstrata/core/http/response";
1239
1281
  function routeParams(request) {
1240
1282
  const normalized = {};
@@ -1270,7 +1312,7 @@ function wrapWebThrottle(kernel, scope, handler, onThrottled) {
1270
1312
  const throttled = scope === "login" ? kernel.wrapLogin(handler) : kernel.wrapRegister(handler);
1271
1313
  return async (request) => {
1272
1314
  const response = await throttled(request);
1273
- if (response.status === 429) {
1315
+ if (response.status === 429 && !requestPrefersJson(request)) {
1274
1316
  return onThrottled(request);
1275
1317
  }
1276
1318
  return response;
@@ -1349,11 +1391,19 @@ function createWebServer(options) {
1349
1391
  });
1350
1392
  }
1351
1393
  // ../../src/bootstrap/web/session.ts
1352
- import { createHash, randomBytes } from "crypto";
1394
+ import { createHmac, randomBytes } from "crypto";
1353
1395
  import { AuthManager as AuthManager2 } from "@getstrata/core/auth/guard";
1354
1396
  import { getBoundDatabaseConnection as getBoundDatabaseConnection2 } from "@getstrata/core/database/boundConnection";
1355
1397
  import { getDefaultDatabasePool as getDefaultDatabasePool2 } from "@getstrata/core/database/defaultConnection";
1398
+ import { currentSqlDialect } from "@getstrata/core/database/dialect";
1356
1399
  import { readRequestCookie } from "@getstrata/core/http/cookies";
1400
+ import { timingSafeCompareString } from "@getstrata/core/security/timingSafeCompare";
1401
+ function sqlPlaceholder(index) {
1402
+ return currentSqlDialect().placeholder(index);
1403
+ }
1404
+ function sqlNow() {
1405
+ return currentSqlDialect().nowExpression();
1406
+ }
1357
1407
  function isSqlClient(value) {
1358
1408
  return typeof value.unsafe === "function";
1359
1409
  }
@@ -1376,22 +1426,34 @@ function defaultMapSessionUser(user) {
1376
1426
  role: user.is_admin ? "admin" : "member"
1377
1427
  };
1378
1428
  }
1429
+ function sessionDisplayName(row, email) {
1430
+ if (typeof row.name === "string" && row.name.trim() !== "") {
1431
+ return row.name;
1432
+ }
1433
+ const first = typeof row.first_name === "string" ? row.first_name.trim() : "";
1434
+ const last = typeof row.last_name === "string" ? row.last_name.trim() : "";
1435
+ const composed = `${first} ${last}`.trim();
1436
+ return composed || email;
1437
+ }
1438
+ function mapSessionUserRow(row) {
1439
+ const email = typeof row.email === "string" ? row.email : "";
1440
+ return {
1441
+ id: Number(row.user_id ?? row.id),
1442
+ name: sessionDisplayName(row, email),
1443
+ email,
1444
+ learn_subscriber: Boolean(row.learn_subscriber),
1445
+ is_admin: Boolean(row.is_admin)
1446
+ };
1447
+ }
1379
1448
  async function defaultLoadSessionUser(sql, sessionId) {
1380
- const rows = await sql.unsafe(`SELECT s.id, s.user_id, s.expires_at, u.name, u.email, u.learn_subscriber,
1381
- COALESCE(u.is_admin, false) AS is_admin
1449
+ const rows = await sql.unsafe(`SELECT s.user_id, s.expires_at, u.*
1382
1450
  FROM sessions s
1383
1451
  INNER JOIN users u ON u.id = s.user_id
1384
- WHERE s.id = $1 AND s.expires_at > NOW()`, [sessionId]);
1452
+ WHERE s.id = ${sqlPlaceholder(1)} AND s.expires_at > ${sqlNow()}`, [sessionId]);
1385
1453
  const row = rows[0];
1386
1454
  if (!row)
1387
1455
  return null;
1388
- return {
1389
- id: row.user_id,
1390
- name: row.name,
1391
- email: row.email,
1392
- learn_subscriber: row.learn_subscriber,
1393
- is_admin: row.is_admin
1394
- };
1456
+ return mapSessionUserRow(row);
1395
1457
  }
1396
1458
  function redirectWithCookie(location, setCookie, status) {
1397
1459
  return new Response(null, {
@@ -1429,7 +1491,7 @@ class CookieSessionStore {
1429
1491
  if (!raw)
1430
1492
  return null;
1431
1493
  const [sessionId, signature] = raw.split(".");
1432
- if (!sessionId || !signature || signature !== this.sign(sessionId)) {
1494
+ if (!sessionId || !signature || !timingSafeCompareString(signature, this.sign(sessionId))) {
1433
1495
  return null;
1434
1496
  }
1435
1497
  return sessionId;
@@ -1447,28 +1509,24 @@ class CookieSessionStore {
1447
1509
  const id = randomBytes(32).toString("hex");
1448
1510
  const expires = new Date(Date.now() + this.maxAgeSeconds * 1000);
1449
1511
  await this.sql().unsafe(`INSERT INTO sessions (id, user_id, expires_at, user_agent, ip_address, last_active_at)
1450
- VALUES ($1, $2, $3, $4, $5, NOW())`, [id, user.id, expires, meta.userAgent ?? null, meta.ipAddress ?? null]);
1512
+ VALUES (${sqlPlaceholder(1)}, ${sqlPlaceholder(2)}, ${sqlPlaceholder(3)}, ${sqlPlaceholder(4)}, ${sqlPlaceholder(5)}, ${sqlNow()})`, [id, user.id, expires, meta.userAgent ?? null, meta.ipAddress ?? null]);
1451
1513
  return id;
1452
1514
  }
1453
1515
  async destroy(sessionId) {
1454
- await this.sql().unsafe(`DELETE FROM sessions WHERE id = $1`, [sessionId]);
1516
+ await this.sql().unsafe(`DELETE FROM sessions WHERE id = ${sqlPlaceholder(1)}`, [sessionId]);
1455
1517
  }
1456
1518
  async destroyOtherSessions(userId, keepSessionId) {
1457
- await this.sql().unsafe(`DELETE FROM sessions WHERE user_id = $1 AND id <> $2`, [
1458
- userId,
1459
- keepSessionId
1460
- ]);
1519
+ await this.sql().unsafe(`DELETE FROM sessions WHERE user_id = ${sqlPlaceholder(1)} AND id <> ${sqlPlaceholder(2)}`, [userId, keepSessionId]);
1461
1520
  }
1462
1521
  async listForUser(userId) {
1522
+ const dialect = currentSqlDialect();
1463
1523
  return this.sql().unsafe(`SELECT id, user_id, user_agent, ip_address, last_active_at, expires_at
1464
1524
  FROM sessions
1465
- WHERE user_id = $1 AND expires_at > NOW()
1466
- ORDER BY last_active_at DESC NULLS LAST, expires_at DESC`, [userId]);
1525
+ WHERE user_id = ${dialect.placeholder(1)} AND expires_at > ${dialect.nowExpression()}
1526
+ ORDER BY last_active_at DESC${dialect.nullsLastSuffix()}, expires_at DESC`, [userId]);
1467
1527
  }
1468
1528
  async touch(sessionId) {
1469
- await this.sql().unsafe(`UPDATE sessions SET last_active_at = NOW() WHERE id = $1`, [
1470
- sessionId
1471
- ]);
1529
+ await this.sql().unsafe(`UPDATE sessions SET last_active_at = ${sqlNow()} WHERE id = ${sqlPlaceholder(1)}`, [sessionId]);
1472
1530
  }
1473
1531
  async read(request) {
1474
1532
  const sessionId = this.sessionIdFromRequest(request);
@@ -1477,7 +1535,7 @@ class CookieSessionStore {
1477
1535
  return this.loadSessionUser(this.sql(), sessionId);
1478
1536
  }
1479
1537
  sign(value) {
1480
- return createHash("sha256").update(`${value}.${this.secret}`).digest("hex").slice(0, 32);
1538
+ return createHmac("sha256", this.secret).update(value).digest("hex").slice(0, 32);
1481
1539
  }
1482
1540
  }
1483
1541
 
@@ -1500,8 +1558,11 @@ class CookieSessionGuard {
1500
1558
  class CookieSessionAuthManager extends AuthManager2 {
1501
1559
  store;
1502
1560
  constructor(store, mapUser = defaultMapSessionUser) {
1503
- super(new CookieSessionGuard(store, mapUser));
1561
+ const guard = new CookieSessionGuard(store, mapUser);
1562
+ super(guard);
1504
1563
  this.store = store;
1564
+ this.registerGuard("web", guard);
1565
+ this.registerGuard("session", guard);
1505
1566
  }
1506
1567
  async signIn(user, meta = {}) {
1507
1568
  const sessionId = await this.store.create(user, meta);
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@getstrata/bootstrap",
3
- "version": "0.2.68",
4
- "description": "Strata application bootstrap HttpKernel, DI, web session helpers",
3
+ "version": "0.4.2",
4
+ "description": "Strata application bootstrap: HttpKernel, DI, web session helpers",
5
5
  "type": "module",
6
6
  "license": "MIT",
7
7
  "repository": {
@@ -170,17 +170,17 @@
170
170
  ],
171
171
  "scripts": {
172
172
  "build": "bun run build:bundle && bun run build:shims && bun run build:subpaths && bun run build:types",
173
- "build:bundle": "bun build index.ts --outdir dist --target bun --external bun --external eta --external @getstrata/core",
173
+ "build:bundle": "bun build index.ts --outdir dist --target bun --external bun --external eta --external mysql2 --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/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/intendedUrlCookie --external @getstrata/core/auth/passwordConfirmCookie --external @getstrata/core/auth/policy --external @getstrata/core/auth/scimAuthMiddleware --external @getstrata/core/auth/sessionCookie --external @getstrata/core/auth/sessionGuard --external @getstrata/core/auth/tokenHash --external @getstrata/core/audit/exportAuditLogs --external @getstrata/core/audit/siemFormatter --external @getstrata/core/admin/formatValue --external @getstrata/core/admin/registry --external @getstrata/core/admin/types --external @getstrata/core/cache/tags --external @getstrata/core/cache/createCacheStore --external @getstrata/core/cache/repository --external @getstrata/core/cache/simpleCache --external @getstrata/core/cache/simpleCacheStore --external @getstrata/core/config/envSchema --external @getstrata/core/contracts/serviceTokens --external @getstrata/core/contracts/container --external @getstrata/core/contracts/di --external @getstrata/core/crypto/fieldEncryption --external @getstrata/core/crypto/mfaSecret --external @getstrata/core/database --external @getstrata/core/database/baseRepository --external @getstrata/core/database/bindConnection --external @getstrata/core/database/boundConnection --external @getstrata/core/database/bunSql --external @getstrata/core/database/connection --external @getstrata/core/database/defaultConnection --external @getstrata/core/database/errors --external @getstrata/core/database/factory --external @getstrata/core/database/migrations --external @getstrata/core/database/migrations/types --external @getstrata/core/database/model --external @getstrata/core/database/query --external @getstrata/core/database/relationships --external @getstrata/core/database/repositoryConnection --external @getstrata/core/database/repositoryQuery --external @getstrata/core/database/seeders --external @getstrata/core/database/seeders/types --external @getstrata/core/database/schema --external @getstrata/core/database/table --external @getstrata/core/database/transaction --external @getstrata/core/database/types --external @getstrata/core/database/whereBuilder --external @getstrata/core/errors/http --external @getstrata/core/events --external @getstrata/core/facades --external @getstrata/core/http --external @getstrata/core/http/authMiddleware --external @getstrata/core/http/authorizeMiddleware --external @getstrata/core/http/bodySizeLimitMiddleware --external @getstrata/core/http/clientIp --external @getstrata/core/http/cookies --external @getstrata/core/http/contentNegotiation --external @getstrata/core/http/contentSecurityPolicy --external @getstrata/core/http/conditionalResponse --external @getstrata/core/http/corsMiddleware --external @getstrata/core/http/csrfMiddleware --external @getstrata/core/http/csrfProtection --external @getstrata/core/http/csrfToken --external @getstrata/core/http/etag --external @getstrata/core/http/flashSession --external @getstrata/core/http/flashMiddleware --external @getstrata/core/http/formRequest --external @getstrata/core/http/middleware --external @getstrata/core/http/metricsMiddleware --external @getstrata/core/http/loginThrottleMiddleware --external @getstrata/core/http/memoryThrottleMiddleware --external @getstrata/core/http/pagination --external @getstrata/core/http/parseFormBody --external @getstrata/core/http/parseMultipartUpload --external @getstrata/core/http/requireAbilityMiddleware --external @getstrata/core/http/requireAuthMiddleware --external @getstrata/core/http/requireGlobalAdminMiddleware --external @getstrata/core/http/requireWebAuthMiddleware --external @getstrata/core/http/requireVerifiedMiddleware --external @getstrata/core/http/requirePasswordConfirmMiddleware --external @getstrata/core/http/resources --external @getstrata/core/http/response --external @getstrata/core/http/route --external @getstrata/core/http/routeMiddleware --external @getstrata/core/http/routeModelBinding --external @getstrata/core/http/safeInternalPath --external @getstrata/core/http/signedUrl --external @getstrata/core/http/scimThrottleMiddleware --external @getstrata/core/http/securityHeadersMiddleware --external @getstrata/core/http/securedRouteModelBinding --external @getstrata/core/http/requestMetaContext --external @getstrata/core/http/webErrorResponse --external @getstrata/core/http/webFormRequest --external @getstrata/core/http/throttleMiddleware --external @getstrata/core/http/validation --external @getstrata/core/jobs/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/recoveryCodes --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 mysql2 --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/jwt --external @getstrata/core/auth/jwtGuard --external @getstrata/core/auth/basicAuthGuard --external @getstrata/core/auth/tokenAbilityChecker --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/intendedUrlCookie --external @getstrata/core/auth/passwordConfirmCookie --external @getstrata/core/auth/policy --external @getstrata/core/auth/scimAuthMiddleware --external @getstrata/core/auth/sessionCookie --external @getstrata/core/auth/sessionGuard --external @getstrata/core/auth/tokenHash --external @getstrata/core/audit/exportAuditLogs --external @getstrata/core/audit/siemFormatter --external @getstrata/core/admin/formatValue --external @getstrata/core/admin/registry --external @getstrata/core/admin/types --external @getstrata/core/cache/tags --external @getstrata/core/cache/createCacheStore --external @getstrata/core/cache/repository --external @getstrata/core/cache/simpleCache --external @getstrata/core/cache/simpleCacheStore --external @getstrata/core/config/envSchema --external @getstrata/core/contracts/serviceTokens --external @getstrata/core/contracts/container --external @getstrata/core/contracts/di --external @getstrata/core/crypto/fieldEncryption --external @getstrata/core/crypto/mfaSecret --external @getstrata/core/database --external @getstrata/core/database/baseRepository --external @getstrata/core/database/bindConnection --external @getstrata/core/database/boundConnection --external @getstrata/core/database/bunSql --external @getstrata/core/database/connection --external @getstrata/core/database/connectionContext --external @getstrata/core/database/defaultConnection --external @getstrata/core/database/dialect --external @getstrata/core/database/mysqlConnection --external @getstrata/core/database/namedConnections --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/sqliteConnection --external @getstrata/core/database/table --external @getstrata/core/database/transaction --external @getstrata/core/database/types --external @getstrata/core/database/whereBuilder --external @getstrata/core/errors/http --external @getstrata/core/events --external @getstrata/core/facades --external @getstrata/core/http --external @getstrata/core/http/authMiddleware --external @getstrata/core/http/authorizeMiddleware --external @getstrata/core/http/bodySizeLimitMiddleware --external @getstrata/core/http/clientIp --external @getstrata/core/http/cookies --external @getstrata/core/http/contentNegotiation --external @getstrata/core/http/contentSecurityPolicy --external @getstrata/core/http/conditionalResponse --external @getstrata/core/http/corsMiddleware --external @getstrata/core/http/csrfMiddleware --external @getstrata/core/http/csrfProtection --external @getstrata/core/http/csrfToken --external @getstrata/core/http/etag --external @getstrata/core/http/flashSession --external @getstrata/core/http/flashMiddleware --external @getstrata/core/http/formRequest --external @getstrata/core/http/middleware --external @getstrata/core/http/metricsMiddleware --external @getstrata/core/http/loginThrottleMiddleware --external @getstrata/core/http/memoryThrottleMiddleware --external @getstrata/core/http/pagination --external @getstrata/core/http/parseFormBody --external @getstrata/core/http/parseMultipartUpload --external @getstrata/core/http/requireAbilityMiddleware --external @getstrata/core/http/requireAuthMiddleware --external @getstrata/core/http/requireGlobalAdminMiddleware --external @getstrata/core/http/requireWebAuthMiddleware --external @getstrata/core/http/requireVerifiedMiddleware --external @getstrata/core/http/requirePasswordConfirmMiddleware --external @getstrata/core/http/resources --external @getstrata/core/http/response --external @getstrata/core/http/route --external @getstrata/core/http/routeMiddleware --external @getstrata/core/http/routeModelBinding --external @getstrata/core/http/safeInternalPath --external @getstrata/core/http/signedUrl --external @getstrata/core/http/statelessAuth --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/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/recoveryCodes --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.75",
183
+ "@getstrata/core": "^0.7.2",
184
184
  "typescript": "^5.9.0"
185
185
  }
186
186
  }