@getstrata/bootstrap 0.4.3 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/CHANGELOG.md +27 -12
  2. package/README.md +32 -12
  3. package/dist/bootstrap/web/server.d.ts +3 -3
  4. package/dist/entries/applicationRegistry.js +0 -2
  5. package/dist/entries/buildModuleRoutes.js +2 -4
  6. package/dist/entries/buildWebModuleRoutes.js +2 -4
  7. package/dist/entries/cache/modelCacheTags.js +0 -2
  8. package/dist/entries/config.js +0 -2
  9. package/dist/entries/context.js +0 -2
  10. package/dist/entries/contracts.js +0 -2
  11. package/dist/entries/createSpaRoutes.js +1 -3
  12. package/dist/entries/createWebRoutes.js +2 -4
  13. package/dist/entries/dependencies.js +0 -2
  14. package/dist/entries/discoverModules.js +0 -2
  15. package/dist/entries/health.js +0 -2
  16. package/dist/entries/http/securedRouteModelBinding.js +0 -2
  17. package/dist/entries/httpKernel.js +2 -4
  18. package/dist/entries/listeners/invalidateCacheOnModelWrite.js +0 -2
  19. package/dist/entries/membershipService.js +0 -2
  20. package/dist/entries/metricsRoutes.js +0 -2
  21. package/dist/entries/providers/view.js +0 -2
  22. package/dist/entries/providers.js +0 -2
  23. package/dist/entries/queue/defaultJobs.js +0 -2
  24. package/dist/entries/routeRegistry.js +0 -2
  25. package/dist/entries/schedule.js +0 -2
  26. package/dist/entries/secretsGuard.js +39 -9
  27. package/dist/entries/web/forms.js +0 -2
  28. package/dist/entries/web/routing.js +2 -4
  29. package/dist/entries/web/server.js +8 -4
  30. package/dist/entries/web/session.js +10 -6
  31. package/dist/entries/web/slug.js +0 -2
  32. package/dist/index.js +59 -15
  33. package/package.json +7 -9
  34. package/dist/_.._/_.._/index.html +0 -174
  35. package/dist/bootstrap/createRoutes.d.ts +0 -3
  36. package/dist/bootstrap/dogfoodApp.d.ts +0 -7
  37. package/dist/bootstrap/preloadModules.d.ts +0 -1
  38. package/dist/bootstrap/routes.d.ts +0 -3
  39. package/dist/entries/createRoutes.js +0 -801
  40. package/dist/index-sfreg6q3.js +0 -0
package/dist/index.js CHANGED
@@ -158,10 +158,10 @@ class HttpKernel {
158
158
  const config = this.dependencies.container.resolve(CORE_CONFIG_TOKEN);
159
159
  const redisUrl = config.get(REDIS_URL_CONFIG_KEY)?.trim() ?? "";
160
160
  if (!redisUrl) {
161
- const maxAttempts2 = Number(process.env.RATE_LIMIT_PER_MINUTE ?? "120");
161
+ const maxAttempts = Number(process.env.RATE_LIMIT_PER_MINUTE ?? "120");
162
162
  return [
163
163
  createMemoryThrottleMiddleware({
164
- maxAttempts: Number.isFinite(maxAttempts2) ? maxAttempts2 : 120,
164
+ maxAttempts: Number.isFinite(maxAttempts) ? maxAttempts : 120,
165
165
  decaySeconds: 60
166
166
  })
167
167
  ];
@@ -1146,14 +1146,28 @@ var PUBLISHED_TEST_SCIM_BEARER_TOKEN = "strata-scim-test-token";
1146
1146
  var MIN_SESSION_SECRET_LENGTH = 32;
1147
1147
  var PUBLISHED_TEST_TOKENS = new Set([
1148
1148
  PUBLISHED_TEST_ADMIN_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"
1149
+ PUBLISHED_TEST_MEMBER_API_TOKEN
1156
1150
  ]);
1151
+ var PUBLISHED_TEST_SCIM_TOKENS = new Set([PUBLISHED_TEST_SCIM_BEARER_TOKEN]);
1152
+ var PLACEHOLDER_SECRET_PATTERN = /change-me/i;
1153
+ var SECRETS_TO_ROTATE = [
1154
+ "SESSION_SECRET",
1155
+ "TOKEN_HASH_PEPPER",
1156
+ "METRICS_TOKEN",
1157
+ "SCIM_BEARER_TOKEN",
1158
+ "JWT_SECRET",
1159
+ "OAUTH_STATE_SECRET",
1160
+ "KMS_ENCRYPTION_KEY",
1161
+ "STRIPE_WEBHOOK_SECRET",
1162
+ "ADMIN_API_TOKEN",
1163
+ "MEMBER_API_TOKEN"
1164
+ ];
1165
+ function assertNoPlaceholderSecrets(env) {
1166
+ const unrotated = SECRETS_TO_ROTATE.filter((name) => PLACEHOLDER_SECRET_PATTERN.test(env[name]?.trim() ?? ""));
1167
+ if (unrotated.length > 0) {
1168
+ throw new Error(`Production startup blocked: replace the generated placeholder values for ${unrotated.join(", ")}.`);
1169
+ }
1170
+ }
1157
1171
  function isEnabled(value, defaultEnabled) {
1158
1172
  if (value === undefined) {
1159
1173
  return defaultEnabled;
@@ -1229,12 +1243,30 @@ function assertFeatureProductionSecrets(env) {
1229
1243
  console.warn("[secrets] SIEM_EXPORT_URL is not configured; audit logs remain database-only.");
1230
1244
  }
1231
1245
  }
1246
+ var LOCAL_HOSTS = new Set(["localhost", "127.0.0.1", "0.0.0.0", "::1", "[::1]"]);
1247
+ function assertPublicAppUrl(env) {
1248
+ const raw = env.APP_URL?.trim() ?? "";
1249
+ let url = null;
1250
+ try {
1251
+ url = raw ? new URL(raw) : null;
1252
+ } catch {
1253
+ url = null;
1254
+ }
1255
+ if (!url || !/^https?:$/.test(url.protocol) || LOCAL_HOSTS.has(url.hostname)) {
1256
+ throw new Error("Production startup blocked: set APP_URL to the public origin of this app (for example https://app.example.com). Signed links and redirects are built from it.");
1257
+ }
1258
+ if (url.protocol === "http:") {
1259
+ console.warn(`[secrets] APP_URL uses http; session cookies are marked Secure in production and will not be sent over ${raw}.`);
1260
+ }
1261
+ }
1232
1262
  function assertProductionSecrets(env = process.env) {
1233
1263
  const appEnv = env.APP_ENV ?? "local";
1234
1264
  if (appEnv !== "production") {
1235
1265
  return;
1236
1266
  }
1267
+ assertNoPlaceholderSecrets(env);
1237
1268
  assertAuthDevHeadersDisabled(env);
1269
+ assertPublicAppUrl(env);
1238
1270
  if (isTokenAuthEnabled(env)) {
1239
1271
  assertTokenAuthProductionSecrets(env);
1240
1272
  }
@@ -1324,14 +1356,19 @@ function createRouteKernel(dependencies) {
1324
1356
  // ../../src/bootstrap/web/server.ts
1325
1357
  import { currentRequestMeta as currentRequestMeta2, runWithRequestMeta } from "@getstrata/core/http/requestMetaContext";
1326
1358
  import { notFoundHtmlResponse as notFoundHtmlResponse2 } from "@getstrata/core/view";
1359
+ function socketAddress(server, request) {
1360
+ const address = server?.requestIP(request)?.address;
1361
+ return address ? address.replace(/^::ffff:/i, "") : null;
1362
+ }
1327
1363
  async function missingHtmlResponse() {
1328
1364
  return notFoundHtmlResponse2();
1329
1365
  }
1330
1366
  function wrapRouteHandler(handler) {
1331
- return async (request) => {
1367
+ return async (request, server) => {
1332
1368
  return await runWithRequestMeta({
1333
1369
  ...currentRequestMeta2(),
1334
1370
  request,
1371
+ ipAddress: socketAddress(server, request),
1335
1372
  userAgent: request.headers.get("user-agent")
1336
1373
  }, async () => {
1337
1374
  const response = await handler(request);
@@ -1367,10 +1404,11 @@ function createWebServer(options) {
1367
1404
  return Bun.serve({
1368
1405
  port: options.port,
1369
1406
  ...bunRoutes ? { routes: bunRoutes } : {},
1370
- async fetch(request) {
1407
+ async fetch(request, server) {
1371
1408
  return await runWithRequestMeta({
1372
1409
  ...currentRequestMeta2(),
1373
1410
  request,
1411
+ ipAddress: socketAddress(server, request),
1374
1412
  userAgent: request.headers.get("user-agent")
1375
1413
  }, async () => {
1376
1414
  await options.onRequest?.(request);
@@ -1395,8 +1433,10 @@ import { createHmac, randomBytes } from "crypto";
1395
1433
  import { AuthManager as AuthManager2 } from "@getstrata/core/auth/guard";
1396
1434
  import { getBoundDatabaseConnection as getBoundDatabaseConnection2 } from "@getstrata/core/database/boundConnection";
1397
1435
  import { getDefaultDatabasePool as getDefaultDatabasePool2 } from "@getstrata/core/database/defaultConnection";
1398
- import { currentSqlDialect } from "@getstrata/core/database/dialect";
1436
+ import { currentSqlDialect, sqlTimestamp } from "@getstrata/core/database/dialect";
1399
1437
  import { readRequestCookie } from "@getstrata/core/http/cookies";
1438
+ import { currentRequestMeta as currentRequestMeta3 } from "@getstrata/core/http/requestMetaContext";
1439
+ import { isProductionEnv } from "@getstrata/core/runtime/appEnv";
1400
1440
  import { timingSafeCompareString } from "@getstrata/core/security/timingSafeCompare";
1401
1441
  function sqlPlaceholder(index) {
1402
1442
  return currentSqlDialect().placeholder(index);
@@ -1499,7 +1539,7 @@ class CookieSessionStore {
1499
1539
  return sessionId;
1500
1540
  }
1501
1541
  withSecureFlag(header) {
1502
- if (true) {
1542
+ if (!isProductionEnv()) {
1503
1543
  return header;
1504
1544
  }
1505
1545
  return header.includes("Secure") ? header : `${header}; Secure`;
@@ -1511,7 +1551,7 @@ class CookieSessionStore {
1511
1551
  const id = randomBytes(32).toString("hex");
1512
1552
  const expires = new Date(Date.now() + this.maxAgeSeconds * 1000);
1513
1553
  await this.sql().unsafe(`INSERT INTO sessions (id, user_id, expires_at, user_agent, ip_address, last_active_at)
1514
- VALUES (${sqlPlaceholder(1)}, ${sqlPlaceholder(2)}, ${sqlPlaceholder(3)}, ${sqlPlaceholder(4)}, ${sqlPlaceholder(5)}, ${sqlNow()})`, [id, user.id, expires.toISOString(), meta.userAgent ?? null, meta.ipAddress ?? null]);
1554
+ VALUES (${sqlPlaceholder(1)}, ${sqlPlaceholder(2)}, ${sqlPlaceholder(3)}, ${sqlPlaceholder(4)}, ${sqlPlaceholder(5)}, ${sqlNow()})`, [id, user.id, sqlTimestamp(expires), meta.userAgent ?? null, meta.ipAddress ?? null]);
1515
1555
  return id;
1516
1556
  }
1517
1557
  async destroy(sessionId) {
@@ -1567,7 +1607,11 @@ class CookieSessionAuthManager extends AuthManager2 {
1567
1607
  this.registerGuard("session", guard);
1568
1608
  }
1569
1609
  async signIn(user, meta = {}) {
1570
- const sessionId = await this.store.create(user, meta);
1610
+ const current = currentRequestMeta3();
1611
+ const sessionId = await this.store.create(user, {
1612
+ userAgent: meta.userAgent ?? current.userAgent ?? null,
1613
+ ipAddress: meta.ipAddress ?? current.ipAddress ?? null
1614
+ });
1571
1615
  return { sessionId, setCookie: this.store.cookieHeader(user, sessionId) };
1572
1616
  }
1573
1617
  async signOut(request) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@getstrata/bootstrap",
3
- "version": "0.4.3",
3
+ "version": "1.0.1",
4
4
  "description": "Strata application bootstrap: HttpKernel, DI, web session helpers",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -55,11 +55,6 @@
55
55
  "import": "./dist/entries/createWebRoutes.js",
56
56
  "default": "./dist/entries/createWebRoutes.js"
57
57
  },
58
- "./createRoutes": {
59
- "types": "./dist/bootstrap/createRoutes.d.ts",
60
- "import": "./dist/entries/createRoutes.js",
61
- "default": "./dist/entries/createRoutes.js"
62
- },
63
58
  "./createSpaRoutes": {
64
59
  "types": "./dist/bootstrap/createSpaRoutes.d.ts",
65
60
  "import": "./dist/entries/createSpaRoutes.js",
@@ -169,18 +164,21 @@
169
164
  "CHANGELOG.md"
170
165
  ],
171
166
  "scripts": {
172
- "build": "bun run build:bundle && bun run build:shims && bun run build:subpaths && bun run build:types",
167
+ "build": "rm -rf dist && bun run build:bundle && bun run build:shims && bun run build:subpaths && bun run build:types",
173
168
  "build:bundle": "bun build index.ts --outdir dist --target bun --external bun --external eta --external mysql2 --external @getstrata/core",
174
169
  "build:types": "tsc -p tsconfig.types.json && bun ../../scripts/prune-bootstrap-dist-types.ts",
175
170
  "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 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",
171
+ "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/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/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/authUserDirectory --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/appEnv --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
172
  "build:shims": "true"
178
173
  },
179
174
  "publishConfig": {
180
175
  "access": "public"
181
176
  },
182
177
  "peerDependencies": {
183
- "@getstrata/core": "^0.7.2",
178
+ "@getstrata/core": "^1.0.1",
184
179
  "typescript": "^5.9.0"
180
+ },
181
+ "engines": {
182
+ "bun": ">=1.4.0"
185
183
  }
186
184
  }
@@ -1,174 +0,0 @@
1
- <!doctype html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="UTF-8" />
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
- <title>Strata</title>
7
- <style>
8
- :root {
9
- color-scheme: dark;
10
- }
11
-
12
- body {
13
- font-family: sans-serif;
14
- background-color: #000;
15
- color: #fff;
16
- margin: 0;
17
- padding: 2rem;
18
- line-height: 1.5;
19
- }
20
-
21
- h1,
22
- h2 {
23
- margin-top: 0;
24
- }
25
-
26
- section {
27
- margin-bottom: 2rem;
28
- }
29
-
30
- ul {
31
- padding-left: 1.25rem;
32
- }
33
-
34
- li {
35
- padding: 0.35rem 0;
36
- }
37
-
38
- a {
39
- color: #fff;
40
- }
41
-
42
- code,
43
- input,
44
- button {
45
- font: inherit;
46
- }
47
-
48
- form {
49
- display: flex;
50
- flex-wrap: wrap;
51
- gap: 0.5rem;
52
- margin: 0.75rem 0;
53
- }
54
-
55
- input {
56
- border: 1px solid #555;
57
- background-color: #111;
58
- color: #fff;
59
- padding: 0.5rem 0.75rem;
60
- border-radius: 0.35rem;
61
- min-width: 14rem;
62
- }
63
-
64
- button {
65
- border: 1px solid #777;
66
- background-color: #222;
67
- color: #fff;
68
- padding: 0.5rem 0.9rem;
69
- border-radius: 0.35rem;
70
- cursor: pointer;
71
- }
72
-
73
- .hint {
74
- color: #bbb;
75
- font-size: 0.95rem;
76
- }
77
- </style>
78
- <script type="module" crossorigin src="../../index-sfreg6q3.js"></script></head>
79
-
80
- <body>
81
- <h1>Strata</h1>
82
- <p class="hint">
83
- Framework reference domain for organizations, projects, tasks, and
84
- comments.
85
- </p>
86
-
87
- <section>
88
- <h2>Collections</h2>
89
- <ul>
90
- <li><a href="/organizations">/organizations</a></li>
91
- <li><a href="/projects?include=organization">/projects</a></li>
92
- <li><a href="/tasks?include=project">/tasks</a></li>
93
- <li><a href="/comments">/comments</a></li>
94
- <li><a href="/reports/summary">/reports/summary</a></li>
95
- </ul>
96
- </section>
97
-
98
- <section>
99
- <h2>Lookup by ID</h2>
100
-
101
- <form data-prefix="/organizations/">
102
- <input
103
- type="number"
104
- min="1"
105
- name="id"
106
- placeholder="Organization ID"
107
- required
108
- />
109
- <button type="submit">Open /organizations/:id</button>
110
- </form>
111
-
112
- <form data-prefix="/projects/">
113
- <input
114
- type="number"
115
- min="1"
116
- name="id"
117
- placeholder="Project ID"
118
- required
119
- />
120
- <button type="submit">Open /projects/:id</button>
121
- </form>
122
-
123
- <form data-prefix="/tasks/">
124
- <input
125
- type="number"
126
- min="1"
127
- name="id"
128
- placeholder="Task ID"
129
- required
130
- />
131
- <button type="submit">Open /tasks/:id</button>
132
- </form>
133
-
134
- <form data-prefix="/tasks/" data-suffix="/comments">
135
- <input
136
- type="number"
137
- min="1"
138
- name="id"
139
- placeholder="Task ID"
140
- required
141
- />
142
- <button type="submit">Open /tasks/:id/comments</button>
143
- </form>
144
-
145
- <form data-prefix="/reports/organizations/">
146
- <input
147
- type="number"
148
- min="1"
149
- name="id"
150
- placeholder="Organization ID"
151
- required
152
- />
153
- <button type="submit">Open /reports/organizations/:id</button>
154
- </form>
155
- </section>
156
-
157
- <script>
158
- for (const form of document.querySelectorAll("form[data-prefix]")) {
159
- form.addEventListener("submit", (event) => {
160
- event.preventDefault();
161
- const prefix = form.getAttribute("data-prefix");
162
- const suffix = form.getAttribute("data-suffix") ?? "";
163
- const input = form.querySelector('input[name="id"]');
164
-
165
- if (!prefix || !input?.value) {
166
- return;
167
- }
168
-
169
- window.location.href = `${prefix}${input.value}${suffix}`;
170
- });
171
- }
172
- </script>
173
- </body>
174
- </html>
@@ -1,3 +0,0 @@
1
- import type { AppDependencies, AppRouteMap } from "./contracts";
2
- declare function createRoutes(dependencies: AppDependencies): AppRouteMap;
3
- export { createRoutes };
@@ -1,7 +0,0 @@
1
- type DogfoodApp = "hiroapp";
2
- declare function readDogfoodApp(): DogfoodApp;
3
- declare function isHiroappDogfood(): boolean;
4
- declare function hiroappSourcePath(...segments: string[]): string;
5
- declare function importHiroappModule<T = unknown>(relativeFromApp: string): Promise<T>;
6
- export type { DogfoodApp };
7
- export { hiroappSourcePath, importHiroappModule, isHiroappDogfood, readDogfoodApp };
@@ -1 +0,0 @@
1
- export {};
@@ -1,3 +0,0 @@
1
- import type { AppRouteMap } from "./contracts";
2
- declare function buildRoutes(): AppRouteMap;
3
- export { buildRoutes };