@getstrata/core 0.5.73 → 0.5.75

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,14 @@
1
1
  # @getstrata/core changelog
2
2
 
3
+ ## 0.5.75
4
+
5
+ - 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).
6
+
7
+ ## 0.5.74
8
+
9
+ - `AuthUser.emailVerifiedAt` and `@getstrata/core/auth/emailVerification` (`isEmailVerificationRequired`, `hasVerifiedEmail`). `null` means unverified; missing is treated as verified (GuestGuard / legacy).
10
+ - `createRequireVerifiedMiddleware()` is Laravel `verified` (HTML 302 `/email/verify`, JSON 403).
11
+
3
12
  ## 0.5.73
4
13
 
5
14
  - OpenAPI treats `POST /auth/email/verification-notification` as a public operation (no bearer).
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.73 && git push origin v0.5.73`
85
+ 2. Tag a release: `git tag v0.5.77 && git push origin v0.5.77`
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.
@@ -3,6 +3,7 @@ type AuthUser = {
3
3
  role?: string;
4
4
  abilities?: string[];
5
5
  tokenId?: number;
6
+ emailVerifiedAt?: Date | string | null;
6
7
  };
7
8
  declare const authContext: import("node:async_hooks").AsyncLocalStorage<AuthUser | null>;
8
9
  declare function runWithAuthUser<T>(user: AuthUser | null, callback: () => T | Promise<T>): T | Promise<T>;
@@ -0,0 +1,5 @@
1
+ import type { AuthUser } from "./authContext";
2
+ declare function isEmailVerificationRequired(): boolean;
3
+ /** `null` is unverified. Missing/`undefined` (GuestGuard, legacy tokens) is treated as verified. */
4
+ declare function hasVerifiedEmail(user: AuthUser): boolean;
5
+ export { hasVerifiedEmail, isEmailVerificationRequired };
@@ -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, };
@@ -3,6 +3,7 @@ interface AuthUserRecord {
3
3
  id: number;
4
4
  email?: string | null;
5
5
  role: string;
6
+ email_verified_at?: Date | string | null;
6
7
  }
7
8
  interface AuthUserDirectory {
8
9
  resolveUserFromToken(token: string): Promise<AuthUser | null>;
@@ -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,6 @@
1
+ import type { AuthManager } from "@getstrata/core/auth/guard";
2
+ import type { Middleware } from "./middleware";
3
+ declare const UNVERIFIED_MESSAGE = "Your email address is not verified.";
4
+ declare const VERIFY_NOTICE_PATH = "/email/verify";
5
+ declare function createRequireVerifiedMiddleware(auth?: AuthManager): Middleware;
6
+ export { createRequireVerifiedMiddleware, UNVERIFIED_MESSAGE, VERIFY_NOTICE_PATH };
@@ -0,0 +1,12 @@
1
+ // @bun
2
+ // ../../src/core/auth/emailVerification.ts
3
+ function isEmailVerificationRequired() {
4
+ return (process.env.FEATURE_EMAIL_VERIFICATION ?? "false") === "true";
5
+ }
6
+ function hasVerifiedEmail(user) {
7
+ return user.emailVerifiedAt !== null;
8
+ }
9
+ export {
10
+ hasVerifiedEmail,
11
+ isEmailVerificationRequired
12
+ };
@@ -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
+ };
@@ -173,7 +173,8 @@ class SessionGuard {
173
173
  return {
174
174
  id: user.id,
175
175
  role: user.role,
176
- abilities: resolveAbilitiesForRole(user.role)
176
+ abilities: resolveAbilitiesForRole(user.role),
177
+ emailVerifiedAt: user.email_verified_at ?? null
177
178
  };
178
179
  } catch {
179
180
  return null;
@@ -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
+ };
@@ -0,0 +1,54 @@
1
+ // @bun
2
+ // ../../src/core/http/requireVerifiedMiddleware.ts
3
+ import { currentAuthUser } from "@getstrata/core/auth/authContext";
4
+ import {
5
+ hasVerifiedEmail,
6
+ isEmailVerificationRequired
7
+ } from "@getstrata/core/auth/emailVerification";
8
+
9
+ // ../../src/core/http/contentNegotiation.ts
10
+ function requestPrefersJson(request) {
11
+ if (!request) {
12
+ return true;
13
+ }
14
+ if (request.headers.get("HX-Request") === "true") {
15
+ return false;
16
+ }
17
+ const accept = request.headers.get("accept")?.toLowerCase() ?? "";
18
+ if (accept.includes("text/html")) {
19
+ return false;
20
+ }
21
+ if (accept.includes("application/json")) {
22
+ return true;
23
+ }
24
+ const contentType = request.headers.get("content-type")?.toLowerCase() ?? "";
25
+ if (contentType.includes("application/x-www-form-urlencoded") || contentType.includes("multipart/form-data")) {
26
+ return false;
27
+ }
28
+ const pathname = new URL(request.url).pathname;
29
+ return pathname.startsWith("/api/");
30
+ }
31
+
32
+ // ../../src/core/http/requireVerifiedMiddleware.ts
33
+ var UNVERIFIED_MESSAGE = "Your email address is not verified.";
34
+ var VERIFY_NOTICE_PATH = "/email/verify";
35
+ function createRequireVerifiedMiddleware(auth) {
36
+ return async (request, next) => {
37
+ if (!isEmailVerificationRequired()) {
38
+ return await next();
39
+ }
40
+ const user = currentAuthUser() ?? (auth ? await auth.resolve(request) : null);
41
+ if (!user || hasVerifiedEmail(user)) {
42
+ return await next();
43
+ }
44
+ if (requestPrefersJson(request)) {
45
+ return Response.json({ error: UNVERIFIED_MESSAGE }, { status: 403 });
46
+ }
47
+ return Response.redirect(VERIFY_NOTICE_PATH, 302);
48
+ };
49
+ }
50
+ export {
51
+ UNVERIFIED_MESSAGE,
52
+ VERIFY_NOTICE_PATH,
53
+ createRequireVerifiedMiddleware
54
+ };
package/dist/index.js CHANGED
@@ -258,10 +258,12 @@ class GuestGuard {
258
258
  return null;
259
259
  }
260
260
  const role = request.headers.get("x-authenticated-user-role");
261
+ const verified = request.headers.get("x-authenticated-email-verified");
261
262
  return {
262
263
  id: userId,
263
264
  abilities: devHeaderAbilities(role),
264
- ...role ? { role } : {}
265
+ ...role ? { role } : {},
266
+ ...verified === "false" ? { emailVerifiedAt: null } : {}
265
267
  };
266
268
  }
267
269
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@getstrata/core",
3
- "version": "0.5.73",
3
+ "version": "0.5.75",
4
4
  "description": "Strata — Laravel-inspired Bun framework public API",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -30,6 +30,11 @@
30
30
  "import": "./dist/entries/auth/authContext.js",
31
31
  "default": "./dist/entries/auth/authContext.js"
32
32
  },
33
+ "./auth/emailVerification": {
34
+ "types": "./dist/core/auth/emailVerification.d.ts",
35
+ "import": "./dist/entries/auth/emailVerification.js",
36
+ "default": "./dist/entries/auth/emailVerification.js"
37
+ },
33
38
  "./auth/guard": {
34
39
  "types": "./dist/core/auth/guard.d.ts",
35
40
  "import": "./dist/entries/auth/guard.js",
@@ -80,6 +85,11 @@
80
85
  "import": "./dist/entries/auth/password.js",
81
86
  "default": "./dist/entries/auth/password.js"
82
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
+ },
83
93
  "./auth/policy": {
84
94
  "types": "./dist/core/auth/policy.d.ts",
85
95
  "import": "./dist/entries/auth/policy.js",
@@ -455,6 +465,16 @@
455
465
  "import": "./dist/entries/http/requireWebAuthMiddleware.js",
456
466
  "default": "./dist/entries/http/requireWebAuthMiddleware.js"
457
467
  },
468
+ "./http/requireVerifiedMiddleware": {
469
+ "types": "./dist/core/http/requireVerifiedMiddleware.d.ts",
470
+ "import": "./dist/entries/http/requireVerifiedMiddleware.js",
471
+ "default": "./dist/entries/http/requireVerifiedMiddleware.js"
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
+ },
458
478
  "./http/resources": {
459
479
  "types": "./dist/core/http/resources.d.ts",
460
480
  "import": "./dist/entries/http/resources.js",
@@ -813,7 +833,7 @@
813
833
  "build:bundle": "bun build index.ts --outdir dist --target bun --external bun --external eta",
814
834
  "build:types": "tsc -p tsconfig.types.json",
815
835
  "prepublishOnly": "bun run build && bun ../../scripts/prepare-core-package-publish.ts",
816
- "build:subpaths": "bun build entries/auth/accessControl.ts entries/auth/abilityChecker.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/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/guard --external @getstrata/core/auth/membershipContext --external @getstrata/core/auth/membershipMiddleware --external @getstrata/core/auth/membershipScope --external @getstrata/core/auth/membershipService --external @getstrata/core/auth/oauth/oidcProvider --external @getstrata/core/auth/oauth/providers --external @getstrata/core/auth/oauth/samlProvider --external @getstrata/core/auth/oauth/types --external @getstrata/core/auth/password --external @getstrata/core/auth/policy --external @getstrata/core/auth/scimAuthMiddleware --external @getstrata/core/auth/sessionCookie --external @getstrata/core/auth/sessionGuard --external @getstrata/core/auth/tokenHash --external @getstrata/core/audit/exportAuditLogs --external @getstrata/core/audit/siemFormatter --external @getstrata/core/admin/formatValue --external @getstrata/core/admin/registry --external @getstrata/core/admin/types --external @getstrata/core/cache/tags --external @getstrata/core/cache/createCacheStore --external @getstrata/core/cache/repository --external @getstrata/core/cache/simpleCache --external @getstrata/core/cache/simpleCacheStore --external @getstrata/core/config/envSchema --external @getstrata/core/contracts/serviceTokens --external @getstrata/core/contracts/container --external @getstrata/core/contracts/di --external @getstrata/core/crypto/fieldEncryption --external @getstrata/core/crypto/mfaSecret --external @getstrata/core/database --external @getstrata/core/database/baseRepository --external @getstrata/core/database/bindConnection --external @getstrata/core/database/boundConnection --external @getstrata/core/database/bunSql --external @getstrata/core/database/connection --external @getstrata/core/database/defaultConnection --external @getstrata/core/database/errors --external @getstrata/core/database/factory --external @getstrata/core/database/migrations --external @getstrata/core/database/migrations/types --external @getstrata/core/database/model --external @getstrata/core/database/query --external @getstrata/core/database/relationships --external @getstrata/core/database/repositoryConnection --external @getstrata/core/database/repositoryQuery --external @getstrata/core/database/seeders --external @getstrata/core/database/seeders/types --external @getstrata/core/database/schema --external @getstrata/core/database/table --external @getstrata/core/database/transaction --external @getstrata/core/database/types --external @getstrata/core/database/whereBuilder --external @getstrata/core/errors/http --external @getstrata/core/events --external @getstrata/core/facades --external @getstrata/core/http --external @getstrata/core/http/authMiddleware --external @getstrata/core/http/authorizeMiddleware --external @getstrata/core/http/bodySizeLimitMiddleware --external @getstrata/core/http/clientIp --external @getstrata/core/http/cookies --external @getstrata/core/http/contentNegotiation --external @getstrata/core/http/contentSecurityPolicy --external @getstrata/core/http/conditionalResponse --external @getstrata/core/http/corsMiddleware --external @getstrata/core/http/csrfMiddleware --external @getstrata/core/http/csrfProtection --external @getstrata/core/http/csrfToken --external @getstrata/core/http/etag --external @getstrata/core/http/flashSession --external @getstrata/core/http/flashMiddleware --external @getstrata/core/http/formRequest --external @getstrata/core/http/middleware --external @getstrata/core/http/metricsMiddleware --external @getstrata/core/http/loginThrottleMiddleware --external @getstrata/core/http/memoryThrottleMiddleware --external @getstrata/core/http/pagination --external @getstrata/core/http/parseFormBody --external @getstrata/core/http/parseMultipartUpload --external @getstrata/core/http/requireAbilityMiddleware --external @getstrata/core/http/requireAuthMiddleware --external @getstrata/core/http/requireGlobalAdminMiddleware --external @getstrata/core/http/requireWebAuthMiddleware --external @getstrata/core/http/resources --external @getstrata/core/http/response --external @getstrata/core/http/route --external @getstrata/core/http/routeMiddleware --external @getstrata/core/http/routeModelBinding --external @getstrata/core/http/safeInternalPath --external @getstrata/core/http/signedUrl --external @getstrata/core/http/scimThrottleMiddleware --external @getstrata/core/http/securityHeadersMiddleware --external @getstrata/core/http/securedRouteModelBinding --external @getstrata/core/http/requestMetaContext --external @getstrata/core/http/webErrorResponse --external @getstrata/core/http/webFormRequest --external @getstrata/core/http/throttleMiddleware --external @getstrata/core/http/validation --external @getstrata/core/jobs/dispatchWebhookJob --external @getstrata/core/jobs/exportAuditLogsJob --external @getstrata/core/jobs/invalidateCacheTagsJob --external @getstrata/core/lifecycle/gracefulShutdown --external @getstrata/core/logging/logger --external @getstrata/core/logging/requestLoggingMiddleware --external @getstrata/core/mail/mailer --external @getstrata/core/mail/markdownMail --external @getstrata/core/mail/markdownMailable --external @getstrata/core/mail/sanitizeMailHtml --external @getstrata/core/media/imageTransform --external @getstrata/core/metrics/prometheus --external @getstrata/core/notifications --external @getstrata/core/openapi/generator --external @getstrata/core/openapi/registeredRoute --external @getstrata/core/openapi/validate --external @getstrata/core/pagination --external @getstrata/core/queue --external @getstrata/core/queue/createAppQueue --external @getstrata/core/queue/failedJobRepository --external @getstrata/core/queue/failedJobService --external @getstrata/core/queue/jobRegistry --external @getstrata/core/queue/jobRunner --external @getstrata/core/queue/queueMetrics --external @getstrata/core/queue/publicQueue --external @getstrata/core/queue/redisQueue --external @getstrata/core/queue/types --external @getstrata/core/runtime/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",
817
837
  "build:shims": "bun ../../scripts/write-core-shared-shims.ts"
818
838
  },
819
839
  "publishConfig": {