@getstrata/core 0.5.75 → 0.5.77

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # @getstrata/core changelog
2
2
 
3
+ ## 0.5.77
4
+
5
+ - `@getstrata/core/security/recoveryCodes` (`generateRecoveryCodes`, `hashRecoveryCode`, `recoveryCodeMatches`). Fortify-style one-time MFA backup codes (`abcd-efgh`).
6
+
7
+ ## 0.5.76
8
+
9
+ - `createSessionCookie(userId, { remember })` issues a longer HMAC session (default 30 days, `SESSION_REMEMBER_TTL_SECONDS`). Remember cookies embed the TTL in the signed payload so they stay valid after the default 7-day session lifetime. `SESSION_TTL_SECONDS` overrides the short session.
10
+
3
11
  ## 0.5.75
4
12
 
5
13
  - Laravel `password.confirm`: `@getstrata/core/auth/passwordConfirmCookie` (`createPasswordConfirmCookie`, `hasFreshPasswordConfirmation`, `clearPasswordConfirmCookie`) and `createRequirePasswordConfirmMiddleware()` (HTML 302 `/confirm-password`, JSON 423). Cookie name `PASSWORD_CONFIRM_COOKIE_NAME` (default `workhub_password_confirmed`), TTL `PASSWORD_CONFIRM_TIMEOUT` (default 10800s).
package/README.md CHANGED
@@ -82,7 +82,7 @@ import type { Migration } from "@getstrata/core/database/migrations/types";
82
82
  Package name: **`@getstrata/core`** (npm org [`@getstrata`](https://www.npmjs.com/org/getstrata)).
83
83
 
84
84
  1. Add `NPM_TOKEN` to GitHub repository secrets.
85
- 2. Tag a release: `git tag v0.5.77 && git push origin v0.5.77`
85
+ 2. Tag a release: `git tag v0.5.79 && git push origin v0.5.79`
86
86
  3. [Release workflow](../../.github/workflows/release.yml) builds and runs `npm publish --access public`.
87
87
 
88
88
  Previously published as `@eyk-workhub/framework@0.1.0`, deprecated in favor of this package.
@@ -1,7 +1,14 @@
1
1
  declare const SESSION_COOKIE = "workhub_session";
2
2
  declare const SESSION_TTL_SECONDS: number;
3
+ declare const SESSION_REMEMBER_TTL_SECONDS: number;
4
+ interface CreateSessionCookieOptions {
5
+ remember?: boolean;
6
+ }
3
7
  declare function sessionCookieName(): string;
8
+ declare function sessionTtlSeconds(): number;
9
+ declare function sessionRememberTtlSeconds(): number;
4
10
  declare function readSessionUserId(request: Request): number | null;
5
- declare function createSessionCookie(userId: number): string;
11
+ declare function createSessionCookie(userId: number, options?: CreateSessionCookieOptions): string;
6
12
  declare function clearSessionCookie(): string;
7
- export { clearSessionCookie, createSessionCookie, readSessionUserId, SESSION_COOKIE, SESSION_TTL_SECONDS, sessionCookieName, };
13
+ export type { CreateSessionCookieOptions };
14
+ export { clearSessionCookie, createSessionCookie, readSessionUserId, SESSION_COOKIE, SESSION_REMEMBER_TTL_SECONDS, SESSION_TTL_SECONDS, sessionCookieName, sessionRememberTtlSeconds, sessionTtlSeconds, };
@@ -0,0 +1,7 @@
1
+ declare const DEFAULT_RECOVERY_CODE_COUNT = 8;
2
+ declare function normalizeRecoveryCode(code: string): string;
3
+ declare function formatRecoveryCode(normalized: string): string;
4
+ declare function generateRecoveryCodes(count?: number): string[];
5
+ declare function hashRecoveryCode(code: string): string;
6
+ declare function recoveryCodeMatches(code: string, hash: string): boolean;
7
+ export { DEFAULT_RECOVERY_CODE_COUNT, formatRecoveryCode, generateRecoveryCodes, hashRecoveryCode, normalizeRecoveryCode, recoveryCodeMatches, };
@@ -3,14 +3,25 @@
3
3
  import { createHmac, timingSafeEqual } from "crypto";
4
4
  var SESSION_COOKIE = "workhub_session";
5
5
  var SESSION_TTL_SECONDS = 60 * 60 * 24 * 7;
6
+ var SESSION_REMEMBER_TTL_SECONDS = 60 * 60 * 24 * 30;
6
7
  function sessionCookieName() {
7
8
  return process.env.SESSION_COOKIE_NAME?.trim() || SESSION_COOKIE;
8
9
  }
10
+ function parsePositiveSeconds(raw, fallback) {
11
+ const parsed = Number.parseInt(raw ?? "", 10);
12
+ return Number.isInteger(parsed) && parsed > 0 ? parsed : fallback;
13
+ }
14
+ function sessionTtlSeconds() {
15
+ return parsePositiveSeconds(process.env.SESSION_TTL_SECONDS, SESSION_TTL_SECONDS);
16
+ }
17
+ function sessionRememberTtlSeconds() {
18
+ return parsePositiveSeconds(process.env.SESSION_REMEMBER_TTL_SECONDS, SESSION_REMEMBER_TTL_SECONDS);
19
+ }
9
20
  function resolveSessionSecret() {
10
21
  return process.env.SESSION_SECRET?.trim() || process.env.OAUTH_STATE_SECRET?.trim() || process.env.ADMIN_API_TOKEN?.trim() || "workhub-dev-session-secret";
11
22
  }
12
- function signSession(userId, issuedAt) {
13
- const payload = `${userId}.${issuedAt}`;
23
+ function signSession(userId, issuedAt, ttlSeconds) {
24
+ const payload = ttlSeconds === undefined ? `${userId}.${issuedAt}` : `${userId}.${issuedAt}.${ttlSeconds}`;
14
25
  const signature = createHmac("sha256", resolveSessionSecret()).update(payload).digest("hex");
15
26
  return `${payload}.${signature}`;
16
27
  }
@@ -27,25 +38,19 @@ function readCookieValue(request, cookieName) {
27
38
  }
28
39
  return null;
29
40
  }
30
- function readSessionUserId(request) {
31
- const cookieValue = readCookieValue(request, sessionCookieName());
32
- if (!cookieValue) {
33
- return null;
34
- }
35
- const parts = cookieValue.split(".");
36
- if (parts.length !== 3) {
41
+ function readSignedSession(userIdRaw, issuedAtRaw, cookieSignature, ttlSeconds, remember) {
42
+ const userId = Number.parseInt(userIdRaw, 10);
43
+ const issuedAt = Number.parseInt(issuedAtRaw, 10);
44
+ if (!Number.isInteger(userId) || userId <= 0 || !Number.isFinite(issuedAt)) {
37
45
  return null;
38
46
  }
39
- const [userIdRaw, issuedAtRaw, cookieSignature] = parts;
40
- const userId = Number.parseInt(String(userIdRaw), 10);
41
- const issuedAt = Number.parseInt(String(issuedAtRaw), 10);
42
- if (!Number.isInteger(userId) || userId <= 0 || !Number.isFinite(issuedAt)) {
47
+ if (!Number.isInteger(ttlSeconds) || ttlSeconds <= 0) {
43
48
  return null;
44
49
  }
45
- if (Date.now() - issuedAt > SESSION_TTL_SECONDS * 1000) {
50
+ if (Date.now() - issuedAt > ttlSeconds * 1000) {
46
51
  return null;
47
52
  }
48
- const expectedSignature = signSession(userId, issuedAt).split(".").pop();
53
+ const expectedSignature = (remember ? signSession(userId, issuedAt, ttlSeconds) : signSession(userId, issuedAt)).split(".").pop();
49
54
  if (!expectedSignature || !cookieSignature) {
50
55
  return null;
51
56
  }
@@ -59,11 +64,28 @@ function readSessionUserId(request) {
59
64
  }
60
65
  return userId;
61
66
  }
62
- function createSessionCookie(userId) {
67
+ function readSessionUserId(request) {
68
+ const cookieValue = readCookieValue(request, sessionCookieName());
69
+ if (!cookieValue) {
70
+ return null;
71
+ }
72
+ const parts = cookieValue.split(".");
73
+ if (parts.length === 4) {
74
+ const [userIdRaw2, issuedAtRaw2, ttlRaw, cookieSignature2] = parts;
75
+ return readSignedSession(String(userIdRaw2), String(issuedAtRaw2), cookieSignature2, Number.parseInt(String(ttlRaw), 10), true);
76
+ }
77
+ if (parts.length !== 3) {
78
+ return null;
79
+ }
80
+ const [userIdRaw, issuedAtRaw, cookieSignature] = parts;
81
+ return readSignedSession(String(userIdRaw), String(issuedAtRaw), cookieSignature, sessionTtlSeconds(), false);
82
+ }
83
+ function createSessionCookie(userId, options = {}) {
63
84
  const issuedAt = Date.now();
64
- const value = signSession(userId, issuedAt);
85
+ const ttlSeconds = options.remember ? sessionRememberTtlSeconds() : sessionTtlSeconds();
86
+ const value = options.remember ? signSession(userId, issuedAt, ttlSeconds) : signSession(userId, issuedAt);
65
87
  const secure = process.env.APP_ENV === "production" ? "; Secure" : "";
66
- return `${sessionCookieName()}=${encodeURIComponent(value)}; Path=/; HttpOnly; SameSite=Lax; Max-Age=${SESSION_TTL_SECONDS}${secure}`;
88
+ return `${sessionCookieName()}=${encodeURIComponent(value)}; Path=/; HttpOnly; SameSite=Lax; Max-Age=${ttlSeconds}${secure}`;
67
89
  }
68
90
  function clearSessionCookie() {
69
91
  const secure = process.env.APP_ENV === "production" ? "; Secure" : "";
@@ -71,9 +93,12 @@ function clearSessionCookie() {
71
93
  }
72
94
  export {
73
95
  SESSION_COOKIE,
96
+ SESSION_REMEMBER_TTL_SECONDS,
74
97
  SESSION_TTL_SECONDS,
75
98
  clearSessionCookie,
76
99
  createSessionCookie,
77
100
  readSessionUserId,
78
- sessionCookieName
101
+ sessionCookieName,
102
+ sessionRememberTtlSeconds,
103
+ sessionTtlSeconds
79
104
  };
@@ -86,14 +86,25 @@ function resolveAbilitiesForRole(role) {
86
86
  import { createHmac, timingSafeEqual } from "crypto";
87
87
  var SESSION_COOKIE = "workhub_session";
88
88
  var SESSION_TTL_SECONDS = 60 * 60 * 24 * 7;
89
+ var SESSION_REMEMBER_TTL_SECONDS = 60 * 60 * 24 * 30;
89
90
  function sessionCookieName() {
90
91
  return process.env.SESSION_COOKIE_NAME?.trim() || SESSION_COOKIE;
91
92
  }
93
+ function parsePositiveSeconds(raw, fallback) {
94
+ const parsed = Number.parseInt(raw ?? "", 10);
95
+ return Number.isInteger(parsed) && parsed > 0 ? parsed : fallback;
96
+ }
97
+ function sessionTtlSeconds() {
98
+ return parsePositiveSeconds(process.env.SESSION_TTL_SECONDS, SESSION_TTL_SECONDS);
99
+ }
100
+ function sessionRememberTtlSeconds() {
101
+ return parsePositiveSeconds(process.env.SESSION_REMEMBER_TTL_SECONDS, SESSION_REMEMBER_TTL_SECONDS);
102
+ }
92
103
  function resolveSessionSecret() {
93
104
  return process.env.SESSION_SECRET?.trim() || process.env.OAUTH_STATE_SECRET?.trim() || process.env.ADMIN_API_TOKEN?.trim() || "workhub-dev-session-secret";
94
105
  }
95
- function signSession(userId, issuedAt) {
96
- const payload = `${userId}.${issuedAt}`;
106
+ function signSession(userId, issuedAt, ttlSeconds) {
107
+ const payload = ttlSeconds === undefined ? `${userId}.${issuedAt}` : `${userId}.${issuedAt}.${ttlSeconds}`;
97
108
  const signature = createHmac("sha256", resolveSessionSecret()).update(payload).digest("hex");
98
109
  return `${payload}.${signature}`;
99
110
  }
@@ -110,25 +121,19 @@ function readCookieValue(request, cookieName) {
110
121
  }
111
122
  return null;
112
123
  }
113
- function readSessionUserId(request) {
114
- const cookieValue = readCookieValue(request, sessionCookieName());
115
- if (!cookieValue) {
116
- return null;
117
- }
118
- const parts = cookieValue.split(".");
119
- if (parts.length !== 3) {
124
+ function readSignedSession(userIdRaw, issuedAtRaw, cookieSignature, ttlSeconds, remember) {
125
+ const userId = Number.parseInt(userIdRaw, 10);
126
+ const issuedAt = Number.parseInt(issuedAtRaw, 10);
127
+ if (!Number.isInteger(userId) || userId <= 0 || !Number.isFinite(issuedAt)) {
120
128
  return null;
121
129
  }
122
- const [userIdRaw, issuedAtRaw, cookieSignature] = parts;
123
- const userId = Number.parseInt(String(userIdRaw), 10);
124
- const issuedAt = Number.parseInt(String(issuedAtRaw), 10);
125
- if (!Number.isInteger(userId) || userId <= 0 || !Number.isFinite(issuedAt)) {
130
+ if (!Number.isInteger(ttlSeconds) || ttlSeconds <= 0) {
126
131
  return null;
127
132
  }
128
- if (Date.now() - issuedAt > SESSION_TTL_SECONDS * 1000) {
133
+ if (Date.now() - issuedAt > ttlSeconds * 1000) {
129
134
  return null;
130
135
  }
131
- const expectedSignature = signSession(userId, issuedAt).split(".").pop();
136
+ const expectedSignature = (remember ? signSession(userId, issuedAt, ttlSeconds) : signSession(userId, issuedAt)).split(".").pop();
132
137
  if (!expectedSignature || !cookieSignature) {
133
138
  return null;
134
139
  }
@@ -142,11 +147,28 @@ function readSessionUserId(request) {
142
147
  }
143
148
  return userId;
144
149
  }
145
- function createSessionCookie(userId) {
150
+ function readSessionUserId(request) {
151
+ const cookieValue = readCookieValue(request, sessionCookieName());
152
+ if (!cookieValue) {
153
+ return null;
154
+ }
155
+ const parts = cookieValue.split(".");
156
+ if (parts.length === 4) {
157
+ const [userIdRaw2, issuedAtRaw2, ttlRaw, cookieSignature2] = parts;
158
+ return readSignedSession(String(userIdRaw2), String(issuedAtRaw2), cookieSignature2, Number.parseInt(String(ttlRaw), 10), true);
159
+ }
160
+ if (parts.length !== 3) {
161
+ return null;
162
+ }
163
+ const [userIdRaw, issuedAtRaw, cookieSignature] = parts;
164
+ return readSignedSession(String(userIdRaw), String(issuedAtRaw), cookieSignature, sessionTtlSeconds(), false);
165
+ }
166
+ function createSessionCookie(userId, options = {}) {
146
167
  const issuedAt = Date.now();
147
- const value = signSession(userId, issuedAt);
168
+ const ttlSeconds = options.remember ? sessionRememberTtlSeconds() : sessionTtlSeconds();
169
+ const value = options.remember ? signSession(userId, issuedAt, ttlSeconds) : signSession(userId, issuedAt);
148
170
  const secure = process.env.APP_ENV === "production" ? "; Secure" : "";
149
- return `${sessionCookieName()}=${encodeURIComponent(value)}; Path=/; HttpOnly; SameSite=Lax; Max-Age=${SESSION_TTL_SECONDS}${secure}`;
171
+ return `${sessionCookieName()}=${encodeURIComponent(value)}; Path=/; HttpOnly; SameSite=Lax; Max-Age=${ttlSeconds}${secure}`;
150
172
  }
151
173
  function clearSessionCookie() {
152
174
  const secure = process.env.APP_ENV === "production" ? "; Secure" : "";
@@ -0,0 +1,38 @@
1
+ // @bun
2
+ // ../../src/core/security/recoveryCodes.ts
3
+ import { randomBytes } from "crypto";
4
+ import { hashApiToken } from "@getstrata/core/auth/tokenHash";
5
+ import { timingSafeCompareString } from "@getstrata/core/security/timingSafeCompare";
6
+ var DEFAULT_RECOVERY_CODE_COUNT = 8;
7
+ var RECOVERY_CODE_BYTES = 4;
8
+ function normalizeRecoveryCode(code) {
9
+ return code.replace(/[^a-z0-9]/giu, "").toLowerCase();
10
+ }
11
+ function formatRecoveryCode(normalized) {
12
+ if (normalized.length !== RECOVERY_CODE_BYTES * 2) {
13
+ return normalized;
14
+ }
15
+ return `${normalized.slice(0, 4)}-${normalized.slice(4)}`;
16
+ }
17
+ function generateRecoveryCodes(count = DEFAULT_RECOVERY_CODE_COUNT) {
18
+ const size = Number.isInteger(count) && count > 0 ? count : DEFAULT_RECOVERY_CODE_COUNT;
19
+ const codes = new Set;
20
+ while (codes.size < size) {
21
+ codes.add(formatRecoveryCode(randomBytes(RECOVERY_CODE_BYTES).toString("hex")));
22
+ }
23
+ return [...codes];
24
+ }
25
+ function hashRecoveryCode(code) {
26
+ return hashApiToken(normalizeRecoveryCode(code));
27
+ }
28
+ function recoveryCodeMatches(code, hash) {
29
+ return timingSafeCompareString(hashRecoveryCode(code), hash);
30
+ }
31
+ export {
32
+ DEFAULT_RECOVERY_CODE_COUNT,
33
+ formatRecoveryCode,
34
+ generateRecoveryCodes,
35
+ hashRecoveryCode,
36
+ normalizeRecoveryCode,
37
+ recoveryCodeMatches
38
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@getstrata/core",
3
- "version": "0.5.75",
3
+ "version": "0.5.77",
4
4
  "description": "Strata — Laravel-inspired Bun framework public API",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -725,6 +725,11 @@
725
725
  "import": "./dist/entries/security/publicReads.js",
726
726
  "default": "./dist/entries/security/publicReads.js"
727
727
  },
728
+ "./security/recoveryCodes": {
729
+ "types": "./dist/core/security/recoveryCodes.d.ts",
730
+ "import": "./dist/entries/security/recoveryCodes.js",
731
+ "default": "./dist/entries/security/recoveryCodes.js"
732
+ },
728
733
  "./security/safeFetch": {
729
734
  "types": "./dist/core/security/safeFetch.d.ts",
730
735
  "import": "./dist/entries/security/safeFetch.js",
@@ -833,7 +838,7 @@
833
838
  "build:bundle": "bun build index.ts --outdir dist --target bun --external bun --external eta",
834
839
  "build:types": "tsc -p tsconfig.types.json",
835
840
  "prepublishOnly": "bun run build && bun ../../scripts/prepare-core-package-publish.ts",
836
- "build:subpaths": "bun build entries/auth/accessControl.ts entries/auth/abilityChecker.ts entries/auth/emailVerification.ts entries/auth/membershipMiddleware.ts entries/auth/membershipScope.ts entries/auth/membershipService.ts entries/auth/oauth/oidcProvider.ts entries/auth/oauth/providers.ts entries/auth/oauth/samlProvider.ts entries/auth/oauth/types.ts entries/auth/password.ts entries/auth/passwordConfirmCookie.ts entries/auth/policy.ts entries/auth/scimAuthMiddleware.ts entries/auth/sessionCookie.ts entries/auth/sessionGuard.ts entries/auth/tokenHash.ts entries/audit/exportAuditLogs.ts entries/audit/siemFormatter.ts entries/admin/formatValue.ts entries/admin/registry.ts entries/admin/types.ts entries/cache/tags.ts entries/cache/createCacheStore.ts entries/cache/repository.ts entries/cache/simpleCache.ts entries/cache/simpleCacheStore.ts entries/config/envSchema.ts entries/contracts/serviceTokens.ts entries/contracts/container.ts entries/contracts/di.ts entries/crypto/fieldEncryption.ts entries/crypto/mfaSecret.ts entries/database/errors.ts entries/database/factory.ts entries/database/migrations.ts entries/database/migrations/types.ts entries/database/model.ts entries/database/query.ts entries/database/relationships.ts entries/database/repositoryQuery.ts entries/database/seeders.ts entries/database/seeders/types.ts entries/database/schema.ts entries/database/table.ts entries/database/types.ts entries/database/whereBuilder.ts entries/facades.ts entries/http/authMiddleware.ts entries/http/authorizeMiddleware.ts entries/http/bodySizeLimitMiddleware.ts entries/http/clientIp.ts entries/http/cookies.ts entries/http/contentNegotiation.ts entries/http/conditionalResponse.ts entries/http/corsMiddleware.ts entries/http/csrfMiddleware.ts entries/http/csrfProtection.ts entries/http/csrfToken.ts entries/http/etag.ts entries/http/flashSession.ts entries/http/flashMiddleware.ts entries/http/formRequest.ts entries/http/metricsMiddleware.ts entries/http/loginThrottleMiddleware.ts entries/http/memoryThrottleMiddleware.ts entries/http/pagination.ts entries/http/parseFormBody.ts entries/http/parseMultipartUpload.ts entries/http/requireAbilityMiddleware.ts entries/http/requireAuthMiddleware.ts entries/http/requireGlobalAdminMiddleware.ts entries/http/requireWebAuthMiddleware.ts entries/http/requireVerifiedMiddleware.ts entries/http/requirePasswordConfirmMiddleware.ts entries/http/resources.ts entries/http/response.ts entries/http/route.ts entries/http/routeMiddleware.ts entries/http/routeModelBinding.ts entries/http/safeInternalPath.ts entries/http/signedUrl.ts entries/http/scimThrottleMiddleware.ts entries/http/securityHeadersMiddleware.ts entries/http/securedRouteModelBinding.ts entries/http/webErrorResponse.ts entries/http/webFormRequest.ts entries/http/throttleMiddleware.ts entries/http/validation.ts entries/jobs/dispatchWebhookJob.ts entries/jobs/exportAuditLogsJob.ts entries/jobs/invalidateCacheTagsJob.ts entries/lifecycle/gracefulShutdown.ts entries/logging/logger.ts entries/logging/requestLoggingMiddleware.ts entries/mail/mailer.ts entries/mail/markdownMail.ts entries/mail/markdownMailable.ts entries/mail/sanitizeMailHtml.ts entries/media/imageTransform.ts entries/metrics/prometheus.ts entries/openapi/generator.ts entries/openapi/registeredRoute.ts entries/openapi/validate.ts entries/pagination.ts entries/queue.ts entries/queue/createAppQueue.ts entries/queue/failedJobRepository.ts entries/queue/failedJobService.ts entries/queue/jobRunner.ts entries/queue/queueMetrics.ts entries/queue/publicQueue.ts entries/queue/redisQueue.ts entries/queue/types.ts entries/runtime/appKeyPrefix.ts entries/runtime/frontendMode.ts entries/runtime/asyncContextStore.ts entries/scheduler/schedule.ts entries/scheduler/osCron.ts entries/security/oauthState.ts entries/security/publicReads.ts entries/security/safeFetch.ts entries/security/safeUrl.ts entries/security/scimTenantTokens.ts entries/security/stripeWebhook.ts entries/security/timingSafeCompare.ts entries/security/tokenExpiry.ts entries/security/totp.ts entries/storage/storage.ts entries/tenant/tenancyConfig.ts entries/tenant/tenantDatabaseScope.ts entries/tenant/databaseTenantContext.ts entries/terminal/runShell.ts entries/tracing/tracingMiddleware.ts entries/validation/rules.ts entries/view.ts --outdir dist --root . --target bun --external bun --external eta --external @getstrata/core --external @getstrata/core/auth/accessControl --external @getstrata/core/auth/abilityChecker --external @getstrata/core/auth/authContext --external @getstrata/core/auth/emailVerification --external @getstrata/core/auth/guard --external @getstrata/core/auth/membershipContext --external @getstrata/core/auth/membershipMiddleware --external @getstrata/core/auth/membershipScope --external @getstrata/core/auth/membershipService --external @getstrata/core/auth/oauth/oidcProvider --external @getstrata/core/auth/oauth/providers --external @getstrata/core/auth/oauth/samlProvider --external @getstrata/core/auth/oauth/types --external @getstrata/core/auth/password --external @getstrata/core/auth/passwordConfirmCookie --external @getstrata/core/auth/policy --external @getstrata/core/auth/scimAuthMiddleware --external @getstrata/core/auth/sessionCookie --external @getstrata/core/auth/sessionGuard --external @getstrata/core/auth/tokenHash --external @getstrata/core/audit/exportAuditLogs --external @getstrata/core/audit/siemFormatter --external @getstrata/core/admin/formatValue --external @getstrata/core/admin/registry --external @getstrata/core/admin/types --external @getstrata/core/cache/tags --external @getstrata/core/cache/createCacheStore --external @getstrata/core/cache/repository --external @getstrata/core/cache/simpleCache --external @getstrata/core/cache/simpleCacheStore --external @getstrata/core/config/envSchema --external @getstrata/core/contracts/serviceTokens --external @getstrata/core/contracts/container --external @getstrata/core/contracts/di --external @getstrata/core/crypto/fieldEncryption --external @getstrata/core/crypto/mfaSecret --external @getstrata/core/database --external @getstrata/core/database/baseRepository --external @getstrata/core/database/bindConnection --external @getstrata/core/database/boundConnection --external @getstrata/core/database/bunSql --external @getstrata/core/database/connection --external @getstrata/core/database/defaultConnection --external @getstrata/core/database/errors --external @getstrata/core/database/factory --external @getstrata/core/database/migrations --external @getstrata/core/database/migrations/types --external @getstrata/core/database/model --external @getstrata/core/database/query --external @getstrata/core/database/relationships --external @getstrata/core/database/repositoryConnection --external @getstrata/core/database/repositoryQuery --external @getstrata/core/database/seeders --external @getstrata/core/database/seeders/types --external @getstrata/core/database/schema --external @getstrata/core/database/table --external @getstrata/core/database/transaction --external @getstrata/core/database/types --external @getstrata/core/database/whereBuilder --external @getstrata/core/errors/http --external @getstrata/core/events --external @getstrata/core/facades --external @getstrata/core/http --external @getstrata/core/http/authMiddleware --external @getstrata/core/http/authorizeMiddleware --external @getstrata/core/http/bodySizeLimitMiddleware --external @getstrata/core/http/clientIp --external @getstrata/core/http/cookies --external @getstrata/core/http/contentNegotiation --external @getstrata/core/http/contentSecurityPolicy --external @getstrata/core/http/conditionalResponse --external @getstrata/core/http/corsMiddleware --external @getstrata/core/http/csrfMiddleware --external @getstrata/core/http/csrfProtection --external @getstrata/core/http/csrfToken --external @getstrata/core/http/etag --external @getstrata/core/http/flashSession --external @getstrata/core/http/flashMiddleware --external @getstrata/core/http/formRequest --external @getstrata/core/http/middleware --external @getstrata/core/http/metricsMiddleware --external @getstrata/core/http/loginThrottleMiddleware --external @getstrata/core/http/memoryThrottleMiddleware --external @getstrata/core/http/pagination --external @getstrata/core/http/parseFormBody --external @getstrata/core/http/parseMultipartUpload --external @getstrata/core/http/requireAbilityMiddleware --external @getstrata/core/http/requireAuthMiddleware --external @getstrata/core/http/requireGlobalAdminMiddleware --external @getstrata/core/http/requireWebAuthMiddleware --external @getstrata/core/http/requireVerifiedMiddleware --external @getstrata/core/http/requirePasswordConfirmMiddleware --external @getstrata/core/http/resources --external @getstrata/core/http/response --external @getstrata/core/http/route --external @getstrata/core/http/routeMiddleware --external @getstrata/core/http/routeModelBinding --external @getstrata/core/http/safeInternalPath --external @getstrata/core/http/signedUrl --external @getstrata/core/http/scimThrottleMiddleware --external @getstrata/core/http/securityHeadersMiddleware --external @getstrata/core/http/securedRouteModelBinding --external @getstrata/core/http/requestMetaContext --external @getstrata/core/http/webErrorResponse --external @getstrata/core/http/webFormRequest --external @getstrata/core/http/throttleMiddleware --external @getstrata/core/http/validation --external @getstrata/core/jobs/dispatchWebhookJob --external @getstrata/core/jobs/exportAuditLogsJob --external @getstrata/core/jobs/invalidateCacheTagsJob --external @getstrata/core/lifecycle/gracefulShutdown --external @getstrata/core/logging/logger --external @getstrata/core/logging/requestLoggingMiddleware --external @getstrata/core/mail/mailer --external @getstrata/core/mail/markdownMail --external @getstrata/core/mail/markdownMailable --external @getstrata/core/mail/sanitizeMailHtml --external @getstrata/core/media/imageTransform --external @getstrata/core/metrics/prometheus --external @getstrata/core/notifications --external @getstrata/core/openapi/generator --external @getstrata/core/openapi/registeredRoute --external @getstrata/core/openapi/validate --external @getstrata/core/pagination --external @getstrata/core/queue --external @getstrata/core/queue/createAppQueue --external @getstrata/core/queue/failedJobRepository --external @getstrata/core/queue/failedJobService --external @getstrata/core/queue/jobRegistry --external @getstrata/core/queue/jobRunner --external @getstrata/core/queue/queueMetrics --external @getstrata/core/queue/publicQueue --external @getstrata/core/queue/redisQueue --external @getstrata/core/queue/types --external @getstrata/core/runtime/appKeyPrefix --external @getstrata/core/runtime/frontendMode --external @getstrata/core/runtime/applicationRegistry --external @getstrata/core/runtime/asyncContextStore --external @getstrata/core/scheduler/schedule --external @getstrata/core/scheduler/osCron --external @getstrata/core/security/oauthState --external @getstrata/core/security/publicReads --external @getstrata/core/security/safeFetch --external @getstrata/core/security/safeUrl --external @getstrata/core/security/scimTenantTokens --external @getstrata/core/security/securityEvents --external @getstrata/core/security/stripeWebhook --external @getstrata/core/security/timingSafeCompare --external @getstrata/core/security/tokenExpiry --external @getstrata/core/security/totp --external @getstrata/core/storage/storage --external @getstrata/core/tenant/tenancyConfig --external @getstrata/core/tenant/tenantContext --external @getstrata/core/tenant/tenantDatabaseScope --external @getstrata/core/tenant/databaseTenantContext --external @getstrata/core/tenant/tenantMiddleware --external @getstrata/core/terminal/runShell --external @getstrata/core/tracing/traceContext --external @getstrata/core/tracing/tracingMiddleware --external @getstrata/core/validation/rules --external @getstrata/core/view",
841
+ "build:subpaths": "bun build entries/auth/accessControl.ts entries/auth/abilityChecker.ts entries/auth/emailVerification.ts entries/auth/membershipMiddleware.ts entries/auth/membershipScope.ts entries/auth/membershipService.ts entries/auth/oauth/oidcProvider.ts entries/auth/oauth/providers.ts entries/auth/oauth/samlProvider.ts entries/auth/oauth/types.ts entries/auth/password.ts entries/auth/passwordConfirmCookie.ts entries/auth/policy.ts entries/auth/scimAuthMiddleware.ts entries/auth/sessionCookie.ts entries/auth/sessionGuard.ts entries/auth/tokenHash.ts entries/audit/exportAuditLogs.ts entries/audit/siemFormatter.ts entries/admin/formatValue.ts entries/admin/registry.ts entries/admin/types.ts entries/cache/tags.ts entries/cache/createCacheStore.ts entries/cache/repository.ts entries/cache/simpleCache.ts entries/cache/simpleCacheStore.ts entries/config/envSchema.ts entries/contracts/serviceTokens.ts entries/contracts/container.ts entries/contracts/di.ts entries/crypto/fieldEncryption.ts entries/crypto/mfaSecret.ts entries/database/errors.ts entries/database/factory.ts entries/database/migrations.ts entries/database/migrations/types.ts entries/database/model.ts entries/database/query.ts entries/database/relationships.ts entries/database/repositoryQuery.ts entries/database/seeders.ts entries/database/seeders/types.ts entries/database/schema.ts entries/database/table.ts entries/database/types.ts entries/database/whereBuilder.ts entries/facades.ts entries/http/authMiddleware.ts entries/http/authorizeMiddleware.ts entries/http/bodySizeLimitMiddleware.ts entries/http/clientIp.ts entries/http/cookies.ts entries/http/contentNegotiation.ts entries/http/conditionalResponse.ts entries/http/corsMiddleware.ts entries/http/csrfMiddleware.ts entries/http/csrfProtection.ts entries/http/csrfToken.ts entries/http/etag.ts entries/http/flashSession.ts entries/http/flashMiddleware.ts entries/http/formRequest.ts entries/http/metricsMiddleware.ts entries/http/loginThrottleMiddleware.ts entries/http/memoryThrottleMiddleware.ts entries/http/pagination.ts entries/http/parseFormBody.ts entries/http/parseMultipartUpload.ts entries/http/requireAbilityMiddleware.ts entries/http/requireAuthMiddleware.ts entries/http/requireGlobalAdminMiddleware.ts entries/http/requireWebAuthMiddleware.ts entries/http/requireVerifiedMiddleware.ts entries/http/requirePasswordConfirmMiddleware.ts entries/http/resources.ts entries/http/response.ts entries/http/route.ts entries/http/routeMiddleware.ts entries/http/routeModelBinding.ts entries/http/safeInternalPath.ts entries/http/signedUrl.ts entries/http/scimThrottleMiddleware.ts entries/http/securityHeadersMiddleware.ts entries/http/securedRouteModelBinding.ts entries/http/webErrorResponse.ts entries/http/webFormRequest.ts entries/http/throttleMiddleware.ts entries/http/validation.ts entries/jobs/dispatchWebhookJob.ts entries/jobs/exportAuditLogsJob.ts entries/jobs/invalidateCacheTagsJob.ts entries/lifecycle/gracefulShutdown.ts entries/logging/logger.ts entries/logging/requestLoggingMiddleware.ts entries/mail/mailer.ts entries/mail/markdownMail.ts entries/mail/markdownMailable.ts entries/mail/sanitizeMailHtml.ts entries/media/imageTransform.ts entries/metrics/prometheus.ts entries/openapi/generator.ts entries/openapi/registeredRoute.ts entries/openapi/validate.ts entries/pagination.ts entries/queue.ts entries/queue/createAppQueue.ts entries/queue/failedJobRepository.ts entries/queue/failedJobService.ts entries/queue/jobRunner.ts entries/queue/queueMetrics.ts entries/queue/publicQueue.ts entries/queue/redisQueue.ts entries/queue/types.ts entries/runtime/appKeyPrefix.ts entries/runtime/frontendMode.ts entries/runtime/asyncContextStore.ts entries/scheduler/schedule.ts entries/scheduler/osCron.ts entries/security/oauthState.ts entries/security/publicReads.ts entries/security/recoveryCodes.ts entries/security/safeFetch.ts entries/security/safeUrl.ts entries/security/scimTenantTokens.ts entries/security/stripeWebhook.ts entries/security/timingSafeCompare.ts entries/security/tokenExpiry.ts entries/security/totp.ts entries/storage/storage.ts entries/tenant/tenancyConfig.ts entries/tenant/tenantDatabaseScope.ts entries/tenant/databaseTenantContext.ts entries/terminal/runShell.ts entries/tracing/tracingMiddleware.ts entries/validation/rules.ts entries/view.ts --outdir dist --root . --target bun --external bun --external eta --external @getstrata/core --external @getstrata/core/auth/accessControl --external @getstrata/core/auth/abilityChecker --external @getstrata/core/auth/authContext --external @getstrata/core/auth/emailVerification --external @getstrata/core/auth/guard --external @getstrata/core/auth/membershipContext --external @getstrata/core/auth/membershipMiddleware --external @getstrata/core/auth/membershipScope --external @getstrata/core/auth/membershipService --external @getstrata/core/auth/oauth/oidcProvider --external @getstrata/core/auth/oauth/providers --external @getstrata/core/auth/oauth/samlProvider --external @getstrata/core/auth/oauth/types --external @getstrata/core/auth/password --external @getstrata/core/auth/passwordConfirmCookie --external @getstrata/core/auth/policy --external @getstrata/core/auth/scimAuthMiddleware --external @getstrata/core/auth/sessionCookie --external @getstrata/core/auth/sessionGuard --external @getstrata/core/auth/tokenHash --external @getstrata/core/audit/exportAuditLogs --external @getstrata/core/audit/siemFormatter --external @getstrata/core/admin/formatValue --external @getstrata/core/admin/registry --external @getstrata/core/admin/types --external @getstrata/core/cache/tags --external @getstrata/core/cache/createCacheStore --external @getstrata/core/cache/repository --external @getstrata/core/cache/simpleCache --external @getstrata/core/cache/simpleCacheStore --external @getstrata/core/config/envSchema --external @getstrata/core/contracts/serviceTokens --external @getstrata/core/contracts/container --external @getstrata/core/contracts/di --external @getstrata/core/crypto/fieldEncryption --external @getstrata/core/crypto/mfaSecret --external @getstrata/core/database --external @getstrata/core/database/baseRepository --external @getstrata/core/database/bindConnection --external @getstrata/core/database/boundConnection --external @getstrata/core/database/bunSql --external @getstrata/core/database/connection --external @getstrata/core/database/defaultConnection --external @getstrata/core/database/errors --external @getstrata/core/database/factory --external @getstrata/core/database/migrations --external @getstrata/core/database/migrations/types --external @getstrata/core/database/model --external @getstrata/core/database/query --external @getstrata/core/database/relationships --external @getstrata/core/database/repositoryConnection --external @getstrata/core/database/repositoryQuery --external @getstrata/core/database/seeders --external @getstrata/core/database/seeders/types --external @getstrata/core/database/schema --external @getstrata/core/database/table --external @getstrata/core/database/transaction --external @getstrata/core/database/types --external @getstrata/core/database/whereBuilder --external @getstrata/core/errors/http --external @getstrata/core/events --external @getstrata/core/facades --external @getstrata/core/http --external @getstrata/core/http/authMiddleware --external @getstrata/core/http/authorizeMiddleware --external @getstrata/core/http/bodySizeLimitMiddleware --external @getstrata/core/http/clientIp --external @getstrata/core/http/cookies --external @getstrata/core/http/contentNegotiation --external @getstrata/core/http/contentSecurityPolicy --external @getstrata/core/http/conditionalResponse --external @getstrata/core/http/corsMiddleware --external @getstrata/core/http/csrfMiddleware --external @getstrata/core/http/csrfProtection --external @getstrata/core/http/csrfToken --external @getstrata/core/http/etag --external @getstrata/core/http/flashSession --external @getstrata/core/http/flashMiddleware --external @getstrata/core/http/formRequest --external @getstrata/core/http/middleware --external @getstrata/core/http/metricsMiddleware --external @getstrata/core/http/loginThrottleMiddleware --external @getstrata/core/http/memoryThrottleMiddleware --external @getstrata/core/http/pagination --external @getstrata/core/http/parseFormBody --external @getstrata/core/http/parseMultipartUpload --external @getstrata/core/http/requireAbilityMiddleware --external @getstrata/core/http/requireAuthMiddleware --external @getstrata/core/http/requireGlobalAdminMiddleware --external @getstrata/core/http/requireWebAuthMiddleware --external @getstrata/core/http/requireVerifiedMiddleware --external @getstrata/core/http/requirePasswordConfirmMiddleware --external @getstrata/core/http/resources --external @getstrata/core/http/response --external @getstrata/core/http/route --external @getstrata/core/http/routeMiddleware --external @getstrata/core/http/routeModelBinding --external @getstrata/core/http/safeInternalPath --external @getstrata/core/http/signedUrl --external @getstrata/core/http/scimThrottleMiddleware --external @getstrata/core/http/securityHeadersMiddleware --external @getstrata/core/http/securedRouteModelBinding --external @getstrata/core/http/requestMetaContext --external @getstrata/core/http/webErrorResponse --external @getstrata/core/http/webFormRequest --external @getstrata/core/http/throttleMiddleware --external @getstrata/core/http/validation --external @getstrata/core/jobs/dispatchWebhookJob --external @getstrata/core/jobs/exportAuditLogsJob --external @getstrata/core/jobs/invalidateCacheTagsJob --external @getstrata/core/lifecycle/gracefulShutdown --external @getstrata/core/logging/logger --external @getstrata/core/logging/requestLoggingMiddleware --external @getstrata/core/mail/mailer --external @getstrata/core/mail/markdownMail --external @getstrata/core/mail/markdownMailable --external @getstrata/core/mail/sanitizeMailHtml --external @getstrata/core/media/imageTransform --external @getstrata/core/metrics/prometheus --external @getstrata/core/notifications --external @getstrata/core/openapi/generator --external @getstrata/core/openapi/registeredRoute --external @getstrata/core/openapi/validate --external @getstrata/core/pagination --external @getstrata/core/queue --external @getstrata/core/queue/createAppQueue --external @getstrata/core/queue/failedJobRepository --external @getstrata/core/queue/failedJobService --external @getstrata/core/queue/jobRegistry --external @getstrata/core/queue/jobRunner --external @getstrata/core/queue/queueMetrics --external @getstrata/core/queue/publicQueue --external @getstrata/core/queue/redisQueue --external @getstrata/core/queue/types --external @getstrata/core/runtime/appKeyPrefix --external @getstrata/core/runtime/frontendMode --external @getstrata/core/runtime/applicationRegistry --external @getstrata/core/runtime/asyncContextStore --external @getstrata/core/scheduler/schedule --external @getstrata/core/scheduler/osCron --external @getstrata/core/security/oauthState --external @getstrata/core/security/publicReads --external @getstrata/core/security/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",
837
842
  "build:shims": "bun ../../scripts/write-core-shared-shims.ts"
838
843
  },
839
844
  "publishConfig": {