@getstrata/core 0.5.74 → 0.5.76

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.76
4
+
5
+ - `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.
6
+
7
+ ## 0.5.75
8
+
9
+ - 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).
10
+
3
11
  ## 0.5.74
4
12
 
5
13
  - `AuthUser.emailVerifiedAt` and `@getstrata/core/auth/emailVerification` (`isEmailVerificationRequired`, `hasVerifiedEmail`). `null` means unverified; missing is treated as verified (GuestGuard / legacy).
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.74 && git push origin v0.5.74`
85
+ 2. Tag a release: `git tag v0.5.78 && git push origin v0.5.78`
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.
@@ -0,0 +1,8 @@
1
+ declare const PASSWORD_CONFIRM_COOKIE = "workhub_password_confirmed";
2
+ declare const DEFAULT_PASSWORD_CONFIRM_TTL_SECONDS: number;
3
+ declare function passwordConfirmCookieName(): string;
4
+ declare function passwordConfirmTtlSeconds(): number;
5
+ declare function hasFreshPasswordConfirmation(request: Request, userId: number): boolean;
6
+ declare function createPasswordConfirmCookie(userId: number): string;
7
+ declare function clearPasswordConfirmCookie(): string;
8
+ export { clearPasswordConfirmCookie, createPasswordConfirmCookie, DEFAULT_PASSWORD_CONFIRM_TTL_SECONDS, hasFreshPasswordConfirmation, PASSWORD_CONFIRM_COOKIE, passwordConfirmCookieName, passwordConfirmTtlSeconds, };
@@ -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,5 @@
1
+ import type { Middleware } from "./middleware";
2
+ declare const PASSWORD_CONFIRM_MESSAGE = "Password confirmation required.";
3
+ declare const PASSWORD_CONFIRM_PATH = "/confirm-password";
4
+ declare function createRequirePasswordConfirmMiddleware(): Middleware;
5
+ export { createRequirePasswordConfirmMiddleware, PASSWORD_CONFIRM_MESSAGE, PASSWORD_CONFIRM_PATH };
@@ -0,0 +1,81 @@
1
+ // @bun
2
+ // ../../src/core/auth/passwordConfirmCookie.ts
3
+ import { createHmac, timingSafeEqual } from "crypto";
4
+ var PASSWORD_CONFIRM_COOKIE = "workhub_password_confirmed";
5
+ var DEFAULT_PASSWORD_CONFIRM_TTL_SECONDS = 3 * 60 * 60;
6
+ function passwordConfirmCookieName() {
7
+ return process.env.PASSWORD_CONFIRM_COOKIE_NAME?.trim() || PASSWORD_CONFIRM_COOKIE;
8
+ }
9
+ function passwordConfirmTtlSeconds() {
10
+ const parsed = Number.parseInt(process.env.PASSWORD_CONFIRM_TIMEOUT ?? "", 10);
11
+ return Number.isInteger(parsed) && parsed > 0 ? parsed : DEFAULT_PASSWORD_CONFIRM_TTL_SECONDS;
12
+ }
13
+ function resolvePasswordConfirmSecret() {
14
+ return process.env.SESSION_SECRET?.trim() || process.env.OAUTH_STATE_SECRET?.trim() || "workhub-dev-session-secret";
15
+ }
16
+ function signPasswordConfirm(userId, confirmedAt) {
17
+ const payload = `${userId}.${confirmedAt}`;
18
+ const signature = createHmac("sha256", resolvePasswordConfirmSecret()).update(payload).digest("hex");
19
+ return `${payload}.${signature}`;
20
+ }
21
+ function readCookieValue(request, cookieName) {
22
+ const cookieHeader = request.headers.get("cookie");
23
+ if (!cookieHeader) {
24
+ return null;
25
+ }
26
+ for (const part of cookieHeader.split(";")) {
27
+ const [name, ...rest] = part.trim().split("=");
28
+ if (name === cookieName) {
29
+ return decodeURIComponent(rest.join("="));
30
+ }
31
+ }
32
+ return null;
33
+ }
34
+ function hasFreshPasswordConfirmation(request, userId) {
35
+ const cookieValue = readCookieValue(request, passwordConfirmCookieName());
36
+ if (!cookieValue) {
37
+ return false;
38
+ }
39
+ const parts = cookieValue.split(".");
40
+ if (parts.length !== 3) {
41
+ return false;
42
+ }
43
+ const [userIdRaw, confirmedAtRaw, cookieSignature] = parts;
44
+ const cookieUserId = Number.parseInt(String(userIdRaw), 10);
45
+ const confirmedAt = Number.parseInt(String(confirmedAtRaw), 10);
46
+ if (cookieUserId !== userId || !Number.isInteger(cookieUserId) || cookieUserId <= 0 || !Number.isFinite(confirmedAt)) {
47
+ return false;
48
+ }
49
+ if (Date.now() - confirmedAt > passwordConfirmTtlSeconds() * 1000) {
50
+ return false;
51
+ }
52
+ const expectedSignature = signPasswordConfirm(cookieUserId, confirmedAt).split(".").pop();
53
+ if (!expectedSignature || !cookieSignature) {
54
+ return false;
55
+ }
56
+ const expectedBuffer = Buffer.from(expectedSignature);
57
+ const actualBuffer = Buffer.from(cookieSignature);
58
+ if (expectedBuffer.length !== actualBuffer.length) {
59
+ return false;
60
+ }
61
+ return timingSafeEqual(expectedBuffer, actualBuffer);
62
+ }
63
+ function createPasswordConfirmCookie(userId) {
64
+ const confirmedAt = Date.now();
65
+ const value = signPasswordConfirm(userId, confirmedAt);
66
+ const secure = process.env.APP_ENV === "production" ? "; Secure" : "";
67
+ return `${passwordConfirmCookieName()}=${encodeURIComponent(value)}; Path=/; HttpOnly; SameSite=Lax; Max-Age=${passwordConfirmTtlSeconds()}${secure}`;
68
+ }
69
+ function clearPasswordConfirmCookie() {
70
+ const secure = process.env.APP_ENV === "production" ? "; Secure" : "";
71
+ return `${passwordConfirmCookieName()}=; Path=/; HttpOnly; SameSite=Lax; Max-Age=0${secure}`;
72
+ }
73
+ export {
74
+ DEFAULT_PASSWORD_CONFIRM_TTL_SECONDS,
75
+ PASSWORD_CONFIRM_COOKIE,
76
+ clearPasswordConfirmCookie,
77
+ createPasswordConfirmCookie,
78
+ hasFreshPasswordConfirmation,
79
+ passwordConfirmCookieName,
80
+ passwordConfirmTtlSeconds
81
+ };
@@ -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,89 @@
1
+ // @bun
2
+ // ../../src/core/http/requirePasswordConfirmMiddleware.ts
3
+ import { resolveUserId } from "@getstrata/core/auth/accessControl";
4
+ import { currentAuthUser } from "@getstrata/core/auth/authContext";
5
+ import { hasFreshPasswordConfirmation } from "@getstrata/core/auth/passwordConfirmCookie";
6
+
7
+ // ../../src/core/http/contentNegotiation.ts
8
+ function requestPrefersJson(request) {
9
+ if (!request) {
10
+ return true;
11
+ }
12
+ if (request.headers.get("HX-Request") === "true") {
13
+ return false;
14
+ }
15
+ const accept = request.headers.get("accept")?.toLowerCase() ?? "";
16
+ if (accept.includes("text/html")) {
17
+ return false;
18
+ }
19
+ if (accept.includes("application/json")) {
20
+ return true;
21
+ }
22
+ const contentType = request.headers.get("content-type")?.toLowerCase() ?? "";
23
+ if (contentType.includes("application/x-www-form-urlencoded") || contentType.includes("multipart/form-data")) {
24
+ return false;
25
+ }
26
+ const pathname = new URL(request.url).pathname;
27
+ return pathname.startsWith("/api/");
28
+ }
29
+
30
+ // ../../src/core/http/safeInternalPath.ts
31
+ function looksLikeExternalTarget(value) {
32
+ const trimmed = value.trim();
33
+ if (!trimmed.startsWith("/") || trimmed.startsWith("//") || trimmed.includes("\\")) {
34
+ return true;
35
+ }
36
+ if (trimmed.includes("://") || trimmed.includes(":/") || trimmed.includes(":\\")) {
37
+ return true;
38
+ }
39
+ try {
40
+ const decoded = decodeURIComponent(trimmed);
41
+ if (decoded.startsWith("//") || decoded.includes("\\") || /https?:/i.test(decoded)) {
42
+ return true;
43
+ }
44
+ } catch {
45
+ return true;
46
+ }
47
+ return false;
48
+ }
49
+ function sanitizeInternalPath(raw, fallback = "/") {
50
+ if (looksLikeExternalTarget(raw)) {
51
+ return fallback;
52
+ }
53
+ return raw;
54
+ }
55
+ function safeInternalRedirectPath(request, fallback = "/") {
56
+ const url = new URL(request.url);
57
+ return sanitizeInternalPath(`${url.pathname}${url.search}`, fallback);
58
+ }
59
+ function loginRedirectLocation(request) {
60
+ return `/login?redirect=${encodeURIComponent(safeInternalRedirectPath(request))}`;
61
+ }
62
+
63
+ // ../../src/core/http/requirePasswordConfirmMiddleware.ts
64
+ var PASSWORD_CONFIRM_MESSAGE = "Password confirmation required.";
65
+ var PASSWORD_CONFIRM_PATH = "/confirm-password";
66
+ function createRequirePasswordConfirmMiddleware() {
67
+ return async (request, next) => {
68
+ const user = currentAuthUser();
69
+ if (!user) {
70
+ return await next();
71
+ }
72
+ const userId = resolveUserId(user);
73
+ if (hasFreshPasswordConfirmation(request, userId)) {
74
+ return await next();
75
+ }
76
+ if (requestPrefersJson(request)) {
77
+ return Response.json({ error: PASSWORD_CONFIRM_MESSAGE }, { status: 423 });
78
+ }
79
+ const url = new URL(request.url);
80
+ const intended = request.method === "GET" ? `${url.pathname}${url.search}` : "/account";
81
+ const redirect = sanitizeInternalPath(intended, "/account");
82
+ return Response.redirect(`${PASSWORD_CONFIRM_PATH}?redirect=${encodeURIComponent(redirect)}`, 302);
83
+ };
84
+ }
85
+ export {
86
+ PASSWORD_CONFIRM_MESSAGE,
87
+ PASSWORD_CONFIRM_PATH,
88
+ createRequirePasswordConfirmMiddleware
89
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@getstrata/core",
3
- "version": "0.5.74",
3
+ "version": "0.5.76",
4
4
  "description": "Strata — Laravel-inspired Bun framework public API",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -85,6 +85,11 @@
85
85
  "import": "./dist/entries/auth/password.js",
86
86
  "default": "./dist/entries/auth/password.js"
87
87
  },
88
+ "./auth/passwordConfirmCookie": {
89
+ "types": "./dist/core/auth/passwordConfirmCookie.d.ts",
90
+ "import": "./dist/entries/auth/passwordConfirmCookie.js",
91
+ "default": "./dist/entries/auth/passwordConfirmCookie.js"
92
+ },
88
93
  "./auth/policy": {
89
94
  "types": "./dist/core/auth/policy.d.ts",
90
95
  "import": "./dist/entries/auth/policy.js",
@@ -465,6 +470,11 @@
465
470
  "import": "./dist/entries/http/requireVerifiedMiddleware.js",
466
471
  "default": "./dist/entries/http/requireVerifiedMiddleware.js"
467
472
  },
473
+ "./http/requirePasswordConfirmMiddleware": {
474
+ "types": "./dist/core/http/requirePasswordConfirmMiddleware.d.ts",
475
+ "import": "./dist/entries/http/requirePasswordConfirmMiddleware.js",
476
+ "default": "./dist/entries/http/requirePasswordConfirmMiddleware.js"
477
+ },
468
478
  "./http/resources": {
469
479
  "types": "./dist/core/http/resources.d.ts",
470
480
  "import": "./dist/entries/http/resources.js",
@@ -823,7 +833,7 @@
823
833
  "build:bundle": "bun build index.ts --outdir dist --target bun --external bun --external eta",
824
834
  "build:types": "tsc -p tsconfig.types.json",
825
835
  "prepublishOnly": "bun run build && bun ../../scripts/prepare-core-package-publish.ts",
826
- "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/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/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/policy --external @getstrata/core/auth/scimAuthMiddleware --external @getstrata/core/auth/sessionCookie --external @getstrata/core/auth/sessionGuard --external @getstrata/core/auth/tokenHash --external @getstrata/core/audit/exportAuditLogs --external @getstrata/core/audit/siemFormatter --external @getstrata/core/admin/formatValue --external @getstrata/core/admin/registry --external @getstrata/core/admin/types --external @getstrata/core/cache/tags --external @getstrata/core/cache/createCacheStore --external @getstrata/core/cache/repository --external @getstrata/core/cache/simpleCache --external @getstrata/core/cache/simpleCacheStore --external @getstrata/core/config/envSchema --external @getstrata/core/contracts/serviceTokens --external @getstrata/core/contracts/container --external @getstrata/core/contracts/di --external @getstrata/core/crypto/fieldEncryption --external @getstrata/core/crypto/mfaSecret --external @getstrata/core/database --external @getstrata/core/database/baseRepository --external @getstrata/core/database/bindConnection --external @getstrata/core/database/boundConnection --external @getstrata/core/database/bunSql --external @getstrata/core/database/connection --external @getstrata/core/database/defaultConnection --external @getstrata/core/database/errors --external @getstrata/core/database/factory --external @getstrata/core/database/migrations --external @getstrata/core/database/migrations/types --external @getstrata/core/database/model --external @getstrata/core/database/query --external @getstrata/core/database/relationships --external @getstrata/core/database/repositoryConnection --external @getstrata/core/database/repositoryQuery --external @getstrata/core/database/seeders --external @getstrata/core/database/seeders/types --external @getstrata/core/database/schema --external @getstrata/core/database/table --external @getstrata/core/database/transaction --external @getstrata/core/database/types --external @getstrata/core/database/whereBuilder --external @getstrata/core/errors/http --external @getstrata/core/events --external @getstrata/core/facades --external @getstrata/core/http --external @getstrata/core/http/authMiddleware --external @getstrata/core/http/authorizeMiddleware --external @getstrata/core/http/bodySizeLimitMiddleware --external @getstrata/core/http/clientIp --external @getstrata/core/http/cookies --external @getstrata/core/http/contentNegotiation --external @getstrata/core/http/contentSecurityPolicy --external @getstrata/core/http/conditionalResponse --external @getstrata/core/http/corsMiddleware --external @getstrata/core/http/csrfMiddleware --external @getstrata/core/http/csrfProtection --external @getstrata/core/http/csrfToken --external @getstrata/core/http/etag --external @getstrata/core/http/flashSession --external @getstrata/core/http/flashMiddleware --external @getstrata/core/http/formRequest --external @getstrata/core/http/middleware --external @getstrata/core/http/metricsMiddleware --external @getstrata/core/http/loginThrottleMiddleware --external @getstrata/core/http/memoryThrottleMiddleware --external @getstrata/core/http/pagination --external @getstrata/core/http/parseFormBody --external @getstrata/core/http/parseMultipartUpload --external @getstrata/core/http/requireAbilityMiddleware --external @getstrata/core/http/requireAuthMiddleware --external @getstrata/core/http/requireGlobalAdminMiddleware --external @getstrata/core/http/requireWebAuthMiddleware --external @getstrata/core/http/requireVerifiedMiddleware --external @getstrata/core/http/resources --external @getstrata/core/http/response --external @getstrata/core/http/route --external @getstrata/core/http/routeMiddleware --external @getstrata/core/http/routeModelBinding --external @getstrata/core/http/safeInternalPath --external @getstrata/core/http/signedUrl --external @getstrata/core/http/scimThrottleMiddleware --external @getstrata/core/http/securityHeadersMiddleware --external @getstrata/core/http/securedRouteModelBinding --external @getstrata/core/http/requestMetaContext --external @getstrata/core/http/webErrorResponse --external @getstrata/core/http/webFormRequest --external @getstrata/core/http/throttleMiddleware --external @getstrata/core/http/validation --external @getstrata/core/jobs/dispatchWebhookJob --external @getstrata/core/jobs/exportAuditLogsJob --external @getstrata/core/jobs/invalidateCacheTagsJob --external @getstrata/core/lifecycle/gracefulShutdown --external @getstrata/core/logging/logger --external @getstrata/core/logging/requestLoggingMiddleware --external @getstrata/core/mail/mailer --external @getstrata/core/mail/markdownMail --external @getstrata/core/mail/markdownMailable --external @getstrata/core/mail/sanitizeMailHtml --external @getstrata/core/media/imageTransform --external @getstrata/core/metrics/prometheus --external @getstrata/core/notifications --external @getstrata/core/openapi/generator --external @getstrata/core/openapi/registeredRoute --external @getstrata/core/openapi/validate --external @getstrata/core/pagination --external @getstrata/core/queue --external @getstrata/core/queue/createAppQueue --external @getstrata/core/queue/failedJobRepository --external @getstrata/core/queue/failedJobService --external @getstrata/core/queue/jobRegistry --external @getstrata/core/queue/jobRunner --external @getstrata/core/queue/queueMetrics --external @getstrata/core/queue/publicQueue --external @getstrata/core/queue/redisQueue --external @getstrata/core/queue/types --external @getstrata/core/runtime/appKeyPrefix --external @getstrata/core/runtime/frontendMode --external @getstrata/core/runtime/applicationRegistry --external @getstrata/core/runtime/asyncContextStore --external @getstrata/core/scheduler/schedule --external @getstrata/core/scheduler/osCron --external @getstrata/core/security/oauthState --external @getstrata/core/security/publicReads --external @getstrata/core/security/safeFetch --external @getstrata/core/security/safeUrl --external @getstrata/core/security/scimTenantTokens --external @getstrata/core/security/securityEvents --external @getstrata/core/security/stripeWebhook --external @getstrata/core/security/timingSafeCompare --external @getstrata/core/security/tokenExpiry --external @getstrata/core/security/totp --external @getstrata/core/storage/storage --external @getstrata/core/tenant/tenancyConfig --external @getstrata/core/tenant/tenantContext --external @getstrata/core/tenant/tenantDatabaseScope --external @getstrata/core/tenant/databaseTenantContext --external @getstrata/core/tenant/tenantMiddleware --external @getstrata/core/terminal/runShell --external @getstrata/core/tracing/traceContext --external @getstrata/core/tracing/tracingMiddleware --external @getstrata/core/validation/rules --external @getstrata/core/view",
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",
827
837
  "build:shims": "bun ../../scripts/write-core-shared-shims.ts"
828
838
  },
829
839
  "publishConfig": {