@getstrata/core 1.1.4 → 1.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/dist/core/security/webhookSignature.d.ts +3 -0
  3. package/dist/entries/audit/exportAuditLogs.js +3 -0
  4. package/dist/entries/audit/siemFormatter.js +3 -0
  5. package/dist/entries/auth/basicAuthGuard.js +3 -0
  6. package/dist/entries/auth/intendedUrlCookie.js +3 -0
  7. package/dist/entries/auth/jwt.js +3 -0
  8. package/dist/entries/auth/jwtGuard.js +3 -0
  9. package/dist/entries/auth/oauth/providers.js +3 -0
  10. package/dist/entries/auth/oneTimeToken.js +3 -0
  11. package/dist/entries/auth/passwordConfirmCookie.js +3 -0
  12. package/dist/entries/auth/passwordLogin.js +3 -0
  13. package/dist/entries/auth/sessionCookie.js +3 -0
  14. package/dist/entries/auth/sessionGuard.js +3 -0
  15. package/dist/entries/auth/tokenHash.js +3 -0
  16. package/dist/entries/cache/createCacheStore.js +3 -0
  17. package/dist/entries/facades.js +3 -0
  18. package/dist/entries/http/corsMiddleware.js +3 -0
  19. package/dist/entries/http/csrfMiddleware.js +4 -1
  20. package/dist/entries/http/csrfToken.js +3 -0
  21. package/dist/entries/http/flashMiddleware.js +3 -0
  22. package/dist/entries/http/flashSession.js +3 -0
  23. package/dist/entries/http/memoryThrottleMiddleware.js +3 -0
  24. package/dist/entries/http/scimThrottleMiddleware.js +3 -0
  25. package/dist/entries/http/signedUrl.js +3 -0
  26. package/dist/entries/http/throttleMiddleware.js +3 -0
  27. package/dist/entries/jobs/exportAuditLogsJob.js +3 -0
  28. package/dist/entries/mail/mailer.js +3 -0
  29. package/dist/entries/openapi/generator.js +3 -0
  30. package/dist/entries/queue/createAppQueue.js +3 -0
  31. package/dist/entries/queue/publicQueue.js +3 -0
  32. package/dist/entries/queue/queueMetrics.js +3 -0
  33. package/dist/entries/queue/redisQueue.js +3 -0
  34. package/dist/entries/security/oauthState.js +3 -0
  35. package/dist/entries/security/totp.js +3 -0
  36. package/dist/entries/security/webhookSignature.js +103 -0
  37. package/dist/entries/tracing/tracingMiddleware.js +3 -0
  38. package/dist/framework/public-api.d.ts +1 -0
  39. package/dist/index.js +13 -1
  40. package/package.json +7 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,14 @@
1
1
  # @getstrata/core changelog
2
2
 
3
+ ## 1.1.5
4
+
5
+ - Close dogfood gaps: webhook docs, starter extras, signing helper
6
+
7
+ ## Unreleased
8
+
9
+ - `signWebhookBody(secret, body)` and `signedWebhookHeaders()` on `@getstrata/core/security/webhookSignature` sign outbound JSON using `webhookSignatureHeader()`.
10
+ - CSRF skips `POST /billing/webhooks/*` by path (Stripe-style inbound webhooks), same as SAML ACS and `/scim/`.
11
+
3
12
  ## 1.1.4
4
13
 
5
14
  - Publish http/uploads, validateUploadFile, migration-adoption docs
@@ -0,0 +1,3 @@
1
+ declare function signWebhookBody(secret: string, body: string | Buffer): string;
2
+ declare function signedWebhookHeaders(secret: string, body: string | Buffer): Record<string, string>;
3
+ export { signedWebhookHeaders, signWebhookBody };
@@ -61,6 +61,9 @@ function appUserAgent() {
61
61
  function otelServiceName() {
62
62
  return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
63
63
  }
64
+ function webhookSignatureHeader() {
65
+ return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
66
+ }
64
67
  function appDisplayName() {
65
68
  return process.env.APP_NAME?.trim() || "Strata";
66
69
  }
@@ -58,6 +58,9 @@ function appUserAgent() {
58
58
  function otelServiceName() {
59
59
  return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
60
60
  }
61
+ function webhookSignatureHeader() {
62
+ return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
63
+ }
61
64
  function appDisplayName() {
62
65
  return process.env.APP_NAME?.trim() || "Strata";
63
66
  }
@@ -539,6 +539,9 @@ function appUserAgent() {
539
539
  function otelServiceName() {
540
540
  return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
541
541
  }
542
+ function webhookSignatureHeader() {
543
+ return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
544
+ }
542
545
  function appDisplayName() {
543
546
  return process.env.APP_NAME?.trim() || "Strata";
544
547
  }
@@ -121,6 +121,9 @@ function appUserAgent() {
121
121
  function otelServiceName() {
122
122
  return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
123
123
  }
124
+ function webhookSignatureHeader() {
125
+ return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
126
+ }
124
127
  function appDisplayName() {
125
128
  return process.env.APP_NAME?.trim() || "Strata";
126
129
  }
@@ -61,6 +61,9 @@ function appUserAgent() {
61
61
  function otelServiceName() {
62
62
  return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
63
63
  }
64
+ function webhookSignatureHeader() {
65
+ return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
66
+ }
64
67
  function appDisplayName() {
65
68
  return process.env.APP_NAME?.trim() || "Strata";
66
69
  }
@@ -148,6 +148,9 @@ function appUserAgent() {
148
148
  function otelServiceName() {
149
149
  return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
150
150
  }
151
+ function webhookSignatureHeader() {
152
+ return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
153
+ }
151
154
  function appDisplayName() {
152
155
  return process.env.APP_NAME?.trim() || "Strata";
153
156
  }
@@ -58,6 +58,9 @@ function appUserAgent() {
58
58
  function otelServiceName() {
59
59
  return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
60
60
  }
61
+ function webhookSignatureHeader() {
62
+ return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
63
+ }
61
64
  function appDisplayName() {
62
65
  return process.env.APP_NAME?.trim() || "Strata";
63
66
  }
@@ -256,6 +256,9 @@ function appUserAgent() {
256
256
  function otelServiceName() {
257
257
  return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
258
258
  }
259
+ function webhookSignatureHeader() {
260
+ return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
261
+ }
259
262
  function appDisplayName() {
260
263
  return process.env.APP_NAME?.trim() || "Strata";
261
264
  }
@@ -61,6 +61,9 @@ function appUserAgent() {
61
61
  function otelServiceName() {
62
62
  return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
63
63
  }
64
+ function webhookSignatureHeader() {
65
+ return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
66
+ }
64
67
  function appDisplayName() {
65
68
  return process.env.APP_NAME?.trim() || "Strata";
66
69
  }
@@ -390,6 +390,9 @@ function appUserAgent() {
390
390
  function otelServiceName() {
391
391
  return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
392
392
  }
393
+ function webhookSignatureHeader() {
394
+ return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
395
+ }
393
396
  function appDisplayName() {
394
397
  return process.env.APP_NAME?.trim() || "Strata";
395
398
  }
@@ -61,6 +61,9 @@ function appUserAgent() {
61
61
  function otelServiceName() {
62
62
  return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
63
63
  }
64
+ function webhookSignatureHeader() {
65
+ return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
66
+ }
64
67
  function appDisplayName() {
65
68
  return process.env.APP_NAME?.trim() || "Strata";
66
69
  }
@@ -128,6 +128,9 @@ function appUserAgent() {
128
128
  function otelServiceName() {
129
129
  return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
130
130
  }
131
+ function webhookSignatureHeader() {
132
+ return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
133
+ }
131
134
  function appDisplayName() {
132
135
  return process.env.APP_NAME?.trim() || "Strata";
133
136
  }
@@ -61,6 +61,9 @@ function appUserAgent() {
61
61
  function otelServiceName() {
62
62
  return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
63
63
  }
64
+ function webhookSignatureHeader() {
65
+ return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
66
+ }
64
67
  function appDisplayName() {
65
68
  return process.env.APP_NAME?.trim() || "Strata";
66
69
  }
@@ -61,6 +61,9 @@ function appUserAgent() {
61
61
  function otelServiceName() {
62
62
  return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
63
63
  }
64
+ function webhookSignatureHeader() {
65
+ return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
66
+ }
64
67
  function appDisplayName() {
65
68
  return process.env.APP_NAME?.trim() || "Strata";
66
69
  }
@@ -70,6 +70,9 @@ function appUserAgent() {
70
70
  function otelServiceName() {
71
71
  return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
72
72
  }
73
+ function webhookSignatureHeader() {
74
+ return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
75
+ }
73
76
  function appDisplayName() {
74
77
  return process.env.APP_NAME?.trim() || "Strata";
75
78
  }
@@ -58,6 +58,9 @@ function appUserAgent() {
58
58
  function otelServiceName() {
59
59
  return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
60
60
  }
61
+ function webhookSignatureHeader() {
62
+ return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
63
+ }
61
64
  function appDisplayName() {
62
65
  return process.env.APP_NAME?.trim() || "Strata";
63
66
  }
@@ -65,6 +65,9 @@ function appUserAgent() {
65
65
  function otelServiceName() {
66
66
  return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
67
67
  }
68
+ function webhookSignatureHeader() {
69
+ return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
70
+ }
68
71
  function appDisplayName() {
69
72
  return process.env.APP_NAME?.trim() || "Strata";
70
73
  }
@@ -239,7 +242,7 @@ function samlAcsPathname() {
239
242
  }
240
243
  }
241
244
  function skipsCsrfPath(pathname) {
242
- return pathname === samlAcsPathname() || pathname.startsWith("/scim/");
245
+ return pathname === samlAcsPathname() || pathname.startsWith("/scim/") || pathname.startsWith("/billing/webhooks/");
243
246
  }
244
247
  function appendSetCookie(response, cookie) {
245
248
  const headers = new Headers(response.headers);
@@ -61,6 +61,9 @@ function appUserAgent() {
61
61
  function otelServiceName() {
62
62
  return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
63
63
  }
64
+ function webhookSignatureHeader() {
65
+ return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
66
+ }
64
67
  function appDisplayName() {
65
68
  return process.env.APP_NAME?.trim() || "Strata";
66
69
  }
@@ -61,6 +61,9 @@ function appUserAgent() {
61
61
  function otelServiceName() {
62
62
  return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
63
63
  }
64
+ function webhookSignatureHeader() {
65
+ return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
66
+ }
64
67
  function appDisplayName() {
65
68
  return process.env.APP_NAME?.trim() || "Strata";
66
69
  }
@@ -61,6 +61,9 @@ function appUserAgent() {
61
61
  function otelServiceName() {
62
62
  return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
63
63
  }
64
+ function webhookSignatureHeader() {
65
+ return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
66
+ }
64
67
  function appDisplayName() {
65
68
  return process.env.APP_NAME?.trim() || "Strata";
66
69
  }
@@ -58,6 +58,9 @@ function appUserAgent() {
58
58
  function otelServiceName() {
59
59
  return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
60
60
  }
61
+ function webhookSignatureHeader() {
62
+ return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
63
+ }
61
64
  function appDisplayName() {
62
65
  return process.env.APP_NAME?.trim() || "Strata";
63
66
  }
@@ -62,6 +62,9 @@ function appUserAgent() {
62
62
  function otelServiceName() {
63
63
  return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
64
64
  }
65
+ function webhookSignatureHeader() {
66
+ return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
67
+ }
65
68
  function appDisplayName() {
66
69
  return process.env.APP_NAME?.trim() || "Strata";
67
70
  }
@@ -63,6 +63,9 @@ function appUserAgent() {
63
63
  function otelServiceName() {
64
64
  return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
65
65
  }
66
+ function webhookSignatureHeader() {
67
+ return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
68
+ }
66
69
  function appDisplayName() {
67
70
  return process.env.APP_NAME?.trim() || "Strata";
68
71
  }
@@ -63,6 +63,9 @@ function appUserAgent() {
63
63
  function otelServiceName() {
64
64
  return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
65
65
  }
66
+ function webhookSignatureHeader() {
67
+ return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
68
+ }
66
69
  function appDisplayName() {
67
70
  return process.env.APP_NAME?.trim() || "Strata";
68
71
  }
@@ -61,6 +61,9 @@ function appUserAgent() {
61
61
  function otelServiceName() {
62
62
  return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
63
63
  }
64
+ function webhookSignatureHeader() {
65
+ return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
66
+ }
64
67
  function appDisplayName() {
65
68
  return process.env.APP_NAME?.trim() || "Strata";
66
69
  }
@@ -58,6 +58,9 @@ function appUserAgent() {
58
58
  function otelServiceName() {
59
59
  return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
60
60
  }
61
+ function webhookSignatureHeader() {
62
+ return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
63
+ }
61
64
  function appDisplayName() {
62
65
  return process.env.APP_NAME?.trim() || "Strata";
63
66
  }
@@ -58,6 +58,9 @@ function appUserAgent() {
58
58
  function otelServiceName() {
59
59
  return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
60
60
  }
61
+ function webhookSignatureHeader() {
62
+ return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
63
+ }
61
64
  function appDisplayName() {
62
65
  return process.env.APP_NAME?.trim() || "Strata";
63
66
  }
@@ -215,6 +215,9 @@ function appUserAgent() {
215
215
  function otelServiceName() {
216
216
  return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
217
217
  }
218
+ function webhookSignatureHeader() {
219
+ return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
220
+ }
218
221
  function appDisplayName() {
219
222
  return process.env.APP_NAME?.trim() || "Strata";
220
223
  }
@@ -215,6 +215,9 @@ function appUserAgent() {
215
215
  function otelServiceName() {
216
216
  return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
217
217
  }
218
+ function webhookSignatureHeader() {
219
+ return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
220
+ }
218
221
  function appDisplayName() {
219
222
  return process.env.APP_NAME?.trim() || "Strata";
220
223
  }
@@ -218,6 +218,9 @@ function appUserAgent() {
218
218
  function otelServiceName() {
219
219
  return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
220
220
  }
221
+ function webhookSignatureHeader() {
222
+ return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
223
+ }
221
224
  function appDisplayName() {
222
225
  return process.env.APP_NAME?.trim() || "Strata";
223
226
  }
@@ -61,6 +61,9 @@ function appUserAgent() {
61
61
  function otelServiceName() {
62
62
  return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
63
63
  }
64
+ function webhookSignatureHeader() {
65
+ return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
66
+ }
64
67
  function appDisplayName() {
65
68
  return process.env.APP_NAME?.trim() || "Strata";
66
69
  }
@@ -61,6 +61,9 @@ function appUserAgent() {
61
61
  function otelServiceName() {
62
62
  return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
63
63
  }
64
+ function webhookSignatureHeader() {
65
+ return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
66
+ }
64
67
  function appDisplayName() {
65
68
  return process.env.APP_NAME?.trim() || "Strata";
66
69
  }
@@ -61,6 +61,9 @@ function appUserAgent() {
61
61
  function otelServiceName() {
62
62
  return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
63
63
  }
64
+ function webhookSignatureHeader() {
65
+ return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
66
+ }
64
67
  function appDisplayName() {
65
68
  return process.env.APP_NAME?.trim() || "Strata";
66
69
  }
@@ -0,0 +1,103 @@
1
+ // @bun
2
+ // ../../src/core/security/webhookSignature.ts
3
+ import { createHmac } from "crypto";
4
+
5
+ // ../../src/core/runtime/appEnv.ts
6
+ var NON_PRODUCTION_APP_ENVS = new Set(["local", "development", "dev", "test", "testing", "ci"]);
7
+ function normalizeEnvValue(value) {
8
+ return (value ?? "").trim().toLowerCase();
9
+ }
10
+ function isProductionEnv(env = process.env) {
11
+ const appEnv = normalizeEnvValue(env.APP_ENV);
12
+ const nodeEnv = normalizeEnvValue(env.NODE_ENV);
13
+ if (appEnv === "production" || nodeEnv === "production") {
14
+ return true;
15
+ }
16
+ if (appEnv === "") {
17
+ return false;
18
+ }
19
+ return !NON_PRODUCTION_APP_ENVS.has(appEnv);
20
+ }
21
+ function envFlagEnabled(value) {
22
+ return value === "true";
23
+ }
24
+
25
+ // ../../src/core/runtime/appKeyPrefix.ts
26
+ function appKeyPrefix() {
27
+ return process.env.APP_KEY_PREFIX?.trim() || "strata";
28
+ }
29
+ function appCookieName(kind) {
30
+ return `${appKeyPrefix()}_${kind}`;
31
+ }
32
+ function appDevSecret(kind) {
33
+ return `${appKeyPrefix()}-dev-${kind}`;
34
+ }
35
+ function requireConfiguredSecret(names, devKind, env = process.env) {
36
+ for (const name of names) {
37
+ const value = env[name]?.trim();
38
+ if (value) {
39
+ return value;
40
+ }
41
+ }
42
+ if (isProductionEnv(env)) {
43
+ throw new Error(`${names[0]} must be set outside development. Do not derive secrets from the app name.`);
44
+ }
45
+ return appDevSecret(devKind);
46
+ }
47
+ function namespacedRedisKey(kind) {
48
+ return `${appKeyPrefix()}:${kind}`;
49
+ }
50
+ function smtpEhloHost() {
51
+ const raw = process.env.MAIL_EHLO?.trim() || `${appKeyPrefix()}.local`;
52
+ const safe = raw.replace(/[^a-zA-Z0-9.-]/g, "");
53
+ return safe || "strata.local";
54
+ }
55
+ function siemEventType() {
56
+ return process.env.SIEM_EVENT_TYPE?.trim() || `${appKeyPrefix()}.audit`;
57
+ }
58
+ function appUserAgent() {
59
+ return process.env.APP_USER_AGENT?.trim() || appKeyPrefix();
60
+ }
61
+ function otelServiceName() {
62
+ return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
63
+ }
64
+ function webhookSignatureHeader() {
65
+ return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
66
+ }
67
+ function appDisplayName() {
68
+ return process.env.APP_NAME?.trim() || "Strata";
69
+ }
70
+ function appEnv() {
71
+ return process.env.APP_ENV?.trim() || "local";
72
+ }
73
+ function appUrl() {
74
+ return (process.env.APP_URL?.trim() || "http://localhost:3000").replace(/\/$/, "");
75
+ }
76
+ function apiPrefix() {
77
+ const raw = process.env.API_PREFIX?.trim() || "/api/v1";
78
+ const withSlash = raw.startsWith("/") ? raw : `/${raw}`;
79
+ const trimmed = withSlash.replace(/\/+$/, "");
80
+ return trimmed || "/api/v1";
81
+ }
82
+ function sdkClientClassName() {
83
+ const override = process.env.APP_SDK_CLASS?.trim();
84
+ if (override && /^[A-Za-z_][A-Za-z0-9_]*$/.test(override)) {
85
+ return override;
86
+ }
87
+ const fromName = appDisplayName().replace(/[^A-Za-z0-9]/g, "");
88
+ return fromName ? `${fromName}Client` : "AppClient";
89
+ }
90
+
91
+ // ../../src/core/security/webhookSignature.ts
92
+ function signWebhookBody(secret, body) {
93
+ return createHmac("sha256", secret).update(body).digest("hex");
94
+ }
95
+ function signedWebhookHeaders(secret, body) {
96
+ return {
97
+ [webhookSignatureHeader()]: signWebhookBody(secret, body)
98
+ };
99
+ }
100
+ export {
101
+ signWebhookBody,
102
+ signedWebhookHeaders
103
+ };
@@ -61,6 +61,9 @@ function appUserAgent() {
61
61
  function otelServiceName() {
62
62
  return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
63
63
  }
64
+ function webhookSignatureHeader() {
65
+ return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
66
+ }
64
67
  function appDisplayName() {
65
68
  return process.env.APP_NAME?.trim() || "Strata";
66
69
  }
@@ -139,6 +139,7 @@ export { assertPathUnderRoot, assertUrlPathUnderRoot } from "../core/security/sa
139
139
  export { assertSafeOutboundUrl, assertSafeOutboundUrlResolved, isBlockedHostname, isBlockedIpAddress, pinUrlToAddress, resetDnsLookupForTests, resolveSafeOutboundTarget, setDnsLookupForTests, } from "../core/security/safeUrl.ts";
140
140
  export type { SecurityEventDetails } from "../core/security/securityEvents.ts";
141
141
  export { logSecurityEvent } from "../core/security/securityEvents.ts";
142
+ export { signedWebhookHeaders, signWebhookBody } from "../core/security/webhookSignature.ts";
142
143
  export type { StorageDriver } from "../core/storage/storage.ts";
143
144
  export { createStorageDriver, LocalStorageDriver, resetDefaultStorage, StorageManager, } from "../core/storage/storage.ts";
144
145
  export { enableTenantRlsSql, enableUserOwnedRlsSql, generatedRlsBootstrapSql, RLS_HELPER_SQL, } from "../core/tenant/enableTenantRls.ts";
package/dist/index.js CHANGED
@@ -8608,7 +8608,7 @@ function samlAcsPathname() {
8608
8608
  }
8609
8609
  }
8610
8610
  function skipsCsrfPath(pathname) {
8611
- return pathname === samlAcsPathname() || pathname.startsWith("/scim/");
8611
+ return pathname === samlAcsPathname() || pathname.startsWith("/scim/") || pathname.startsWith("/billing/webhooks/");
8612
8612
  }
8613
8613
  function appendSetCookie(response, cookie) {
8614
8614
  const headers = new Headers(response.headers);
@@ -10909,6 +10909,16 @@ function isPublicReadsEnabled() {
10909
10909
  function guestCanViewResource() {
10910
10910
  return isPublicReadsEnabled();
10911
10911
  }
10912
+ // ../../src/core/security/webhookSignature.ts
10913
+ import { createHmac as createHmac7 } from "crypto";
10914
+ function signWebhookBody(secret, body) {
10915
+ return createHmac7("sha256", secret).update(body).digest("hex");
10916
+ }
10917
+ function signedWebhookHeaders(secret, body) {
10918
+ return {
10919
+ [webhookSignatureHeader()]: signWebhookBody(secret, body)
10920
+ };
10921
+ }
10912
10922
  // ../../src/core/tenant/enableTenantRls.ts
10913
10923
  function assertSafeIdentifier2(identifier) {
10914
10924
  if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(identifier)) {
@@ -12021,7 +12031,9 @@ export {
12021
12031
  setSamlAssertionReplayStoreForTests,
12022
12032
  siemEventType,
12023
12033
  signJwt,
12034
+ signWebhookBody,
12024
12035
  signedUrl,
12036
+ signedWebhookHeaders,
12025
12037
  singularize,
12026
12038
  smtpEhloHost,
12027
12039
  spaContentSecurityPolicy,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@getstrata/core",
3
- "version": "1.1.4",
3
+ "version": "1.1.5",
4
4
  "description": "Strata Bun framework public API",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -840,6 +840,11 @@
840
840
  "import": "./dist/entries/security/stripeWebhook.js",
841
841
  "default": "./dist/entries/security/stripeWebhook.js"
842
842
  },
843
+ "./security/webhookSignature": {
844
+ "types": "./dist/core/security/webhookSignature.d.ts",
845
+ "import": "./dist/entries/security/webhookSignature.js",
846
+ "default": "./dist/entries/security/webhookSignature.js"
847
+ },
843
848
  "./security/timingSafeCompare": {
844
849
  "types": "./dist/core/security/timingSafeCompare.d.ts",
845
850
  "import": "./dist/entries/security/timingSafeCompare.js",
@@ -928,7 +933,7 @@
928
933
  "build:bundle": "bun build index.ts --outdir dist --target bun --external bun --external eta --external mysql2 --external @node-saml/node-saml",
929
934
  "build:types": "tsc -p tsconfig.types.json",
930
935
  "prepublishOnly": "bun run build && bun ../../scripts/prepare-core-package-publish.ts",
931
- "build:subpaths": "bun build entries/auth/accessControl.ts entries/auth/abilityChecker.ts entries/auth/emailVerification.ts entries/auth/jwt.ts entries/auth/jwtGuard.ts entries/auth/basicAuthGuard.ts entries/auth/tokenAbilityChecker.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/saml/samlServiceProvider.ts entries/auth/password.ts entries/auth/passwordLogin.ts entries/auth/oneTimeToken.ts entries/auth/intendedUrlCookie.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/authUserDirectory.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/sqliteConnection.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/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/statelessAuth.ts entries/http/scimThrottleMiddleware.ts entries/http/securityHeadersMiddleware.ts entries/http/securedRouteModelBinding.ts entries/http/webFormRequest.ts entries/http/throttleMiddleware.ts entries/http/uploads.ts entries/http/validation.ts entries/jobs/exportAuditLogsJob.ts entries/jobs/invalidateCacheTagsJob.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/appEnv.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/safePath.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/tenant/enableTenantRls.ts entries/terminal/runShell.ts entries/tracing/tracingMiddleware.ts entries/validation/rules.ts --outdir dist --root . --target bun --external bun --external eta --external mysql2 --external @node-saml/node-saml --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/jwt --external @getstrata/core/auth/jwtGuard --external @getstrata/core/auth/basicAuthGuard --external @getstrata/core/auth/tokenAbilityChecker --external @getstrata/core/auth/membershipContext --external @getstrata/core/auth/membershipMiddleware --external @getstrata/core/auth/membershipScope --external @getstrata/core/auth/membershipService --external @getstrata/core/auth/oauth/oidcProvider --external @getstrata/core/auth/oauth/providers --external @getstrata/core/auth/oauth/samlProvider --external @getstrata/core/auth/oauth/types --external @getstrata/core/auth/saml/samlServiceProvider --external @getstrata/core/auth/password --external @getstrata/core/auth/passwordLogin --external @getstrata/core/auth/oneTimeToken --external @getstrata/core/auth/intendedUrlCookie --external @getstrata/core/auth/passwordConfirmCookie --external @getstrata/core/auth/policy --external @getstrata/core/auth/scimAuthMiddleware --external @getstrata/core/auth/sessionCookie --external @getstrata/core/auth/sessionGuard --external @getstrata/core/auth/tokenHash --external @getstrata/core/audit/exportAuditLogs --external @getstrata/core/audit/siemFormatter --external @getstrata/core/admin/formatValue --external @getstrata/core/admin/registry --external @getstrata/core/admin/types --external @getstrata/core/cache/tags --external @getstrata/core/cache/createCacheStore --external @getstrata/core/cache/repository --external @getstrata/core/cache/simpleCache --external @getstrata/core/cache/simpleCacheStore --external @getstrata/core/config/envSchema --external @getstrata/core/contracts/serviceTokens --external @getstrata/core/contracts/authUserDirectory --external @getstrata/core/contracts/container --external @getstrata/core/contracts/di --external @getstrata/core/crypto/fieldEncryption --external @getstrata/core/crypto/mfaSecret --external @getstrata/core/database --external @getstrata/core/database/baseRepository --external @getstrata/core/database/bindConnection --external @getstrata/core/database/boundConnection --external @getstrata/core/database/bunSql --external @getstrata/core/database/connection --external @getstrata/core/database/connectionContext --external @getstrata/core/database/defaultConnection --external @getstrata/core/database/dialect --external @getstrata/core/database/mysqlConnection --external @getstrata/core/database/namedConnections --external @getstrata/core/database/errors --external @getstrata/core/database/factory --external @getstrata/core/database/migrations --external @getstrata/core/database/migrations/types --external @getstrata/core/database/model --external @getstrata/core/database/query --external @getstrata/core/database/relationships --external @getstrata/core/database/repositoryConnection --external @getstrata/core/database/repositoryQuery --external @getstrata/core/database/seeders --external @getstrata/core/database/seeders/types --external @getstrata/core/database/schema --external @getstrata/core/database/sqliteConnection --external @getstrata/core/database/table --external @getstrata/core/database/transaction --external @getstrata/core/database/types --external @getstrata/core/database/whereBuilder --external @getstrata/core/errors/http --external @getstrata/core/events --external @getstrata/core/facades --external @getstrata/core/http --external @getstrata/core/http/authMiddleware --external @getstrata/core/http/authorizeMiddleware --external @getstrata/core/http/bodySizeLimitMiddleware --external @getstrata/core/http/clientIp --external @getstrata/core/http/cookies --external @getstrata/core/http/contentNegotiation --external @getstrata/core/http/contentSecurityPolicy --external @getstrata/core/http/conditionalResponse --external @getstrata/core/http/corsMiddleware --external @getstrata/core/http/csrfMiddleware --external @getstrata/core/http/csrfProtection --external @getstrata/core/http/csrfToken --external @getstrata/core/http/etag --external @getstrata/core/http/flashSession --external @getstrata/core/http/flashMiddleware --external @getstrata/core/http/formRequest --external @getstrata/core/http/middleware --external @getstrata/core/http/metricsMiddleware --external @getstrata/core/http/loginThrottleMiddleware --external @getstrata/core/http/memoryThrottleMiddleware --external @getstrata/core/http/pagination --external @getstrata/core/http/parseFormBody --external @getstrata/core/http/parseMultipartUpload --external @getstrata/core/http/requireAbilityMiddleware --external @getstrata/core/http/requireAuthMiddleware --external @getstrata/core/http/requireGlobalAdminMiddleware --external @getstrata/core/http/requireWebAuthMiddleware --external @getstrata/core/http/requireVerifiedMiddleware --external @getstrata/core/http/requirePasswordConfirmMiddleware --external @getstrata/core/http/resources --external @getstrata/core/http/response --external @getstrata/core/http/route --external @getstrata/core/http/routeMiddleware --external @getstrata/core/http/routeModelBinding --external @getstrata/core/http/safeInternalPath --external @getstrata/core/http/signedUrl --external @getstrata/core/http/statelessAuth --external @getstrata/core/http/scimThrottleMiddleware --external @getstrata/core/http/securityHeadersMiddleware --external @getstrata/core/http/securedRouteModelBinding --external @getstrata/core/http/requestMetaContext --external @getstrata/core/http/webErrorResponse --external @getstrata/core/http/webFormRequest --external @getstrata/core/http/throttleMiddleware --external @getstrata/core/http/uploads --external @getstrata/core/http/validation --external @getstrata/core/jobs/exportAuditLogsJob --external @getstrata/core/jobs/invalidateCacheTagsJob --external @getstrata/core/lifecycle/gracefulShutdown --external @getstrata/core/logging/logger --external @getstrata/core/logging/requestLoggingMiddleware --external @getstrata/core/mail/mailer --external @getstrata/core/mail/markdownMail --external @getstrata/core/mail/markdownMailable --external @getstrata/core/mail/sanitizeMailHtml --external @getstrata/core/media/imageTransform --external @getstrata/core/metrics/prometheus --external @getstrata/core/notifications --external @getstrata/core/openapi/generator --external @getstrata/core/openapi/registeredRoute --external @getstrata/core/openapi/validate --external @getstrata/core/pagination --external @getstrata/core/queue --external @getstrata/core/queue/createAppQueue --external @getstrata/core/queue/failedJobRepository --external @getstrata/core/queue/failedJobService --external @getstrata/core/queue/jobRegistry --external @getstrata/core/queue/jobRunner --external @getstrata/core/queue/queueMetrics --external @getstrata/core/queue/publicQueue --external @getstrata/core/queue/redisQueue --external @getstrata/core/queue/types --external @getstrata/core/runtime/appEnv --external @getstrata/core/runtime/appKeyPrefix --external @getstrata/core/runtime/frontendMode --external @getstrata/core/runtime/applicationRegistry --external @getstrata/core/runtime/asyncContextStore --external @getstrata/core/scheduler/schedule --external @getstrata/core/scheduler/osCron --external @getstrata/core/security/oauthState --external @getstrata/core/security/publicReads --external @getstrata/core/security/recoveryCodes --external @getstrata/core/security/safeFetch --external @getstrata/core/security/safePath --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/tenant/enableTenantRls --external @getstrata/core/terminal/runShell --external @getstrata/core/tracing/traceContext --external @getstrata/core/tracing/tracingMiddleware --external @getstrata/core/validation/rules --external @getstrata/core/view",
936
+ "build:subpaths": "bun build entries/auth/accessControl.ts entries/auth/abilityChecker.ts entries/auth/emailVerification.ts entries/auth/jwt.ts entries/auth/jwtGuard.ts entries/auth/basicAuthGuard.ts entries/auth/tokenAbilityChecker.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/saml/samlServiceProvider.ts entries/auth/password.ts entries/auth/passwordLogin.ts entries/auth/oneTimeToken.ts entries/auth/intendedUrlCookie.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/authUserDirectory.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/sqliteConnection.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/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/statelessAuth.ts entries/http/scimThrottleMiddleware.ts entries/http/securityHeadersMiddleware.ts entries/http/securedRouteModelBinding.ts entries/http/webFormRequest.ts entries/http/throttleMiddleware.ts entries/http/uploads.ts entries/http/validation.ts entries/jobs/exportAuditLogsJob.ts entries/jobs/invalidateCacheTagsJob.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/appEnv.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/safePath.ts entries/security/scimTenantTokens.ts entries/security/stripeWebhook.ts entries/security/webhookSignature.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/tenant/enableTenantRls.ts entries/terminal/runShell.ts entries/tracing/tracingMiddleware.ts entries/validation/rules.ts --outdir dist --root . --target bun --external bun --external eta --external mysql2 --external @node-saml/node-saml --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/jwt --external @getstrata/core/auth/jwtGuard --external @getstrata/core/auth/basicAuthGuard --external @getstrata/core/auth/tokenAbilityChecker --external @getstrata/core/auth/membershipContext --external @getstrata/core/auth/membershipMiddleware --external @getstrata/core/auth/membershipScope --external @getstrata/core/auth/membershipService --external @getstrata/core/auth/oauth/oidcProvider --external @getstrata/core/auth/oauth/providers --external @getstrata/core/auth/oauth/samlProvider --external @getstrata/core/auth/oauth/types --external @getstrata/core/auth/saml/samlServiceProvider --external @getstrata/core/auth/password --external @getstrata/core/auth/passwordLogin --external @getstrata/core/auth/oneTimeToken --external @getstrata/core/auth/intendedUrlCookie --external @getstrata/core/auth/passwordConfirmCookie --external @getstrata/core/auth/policy --external @getstrata/core/auth/scimAuthMiddleware --external @getstrata/core/auth/sessionCookie --external @getstrata/core/auth/sessionGuard --external @getstrata/core/auth/tokenHash --external @getstrata/core/audit/exportAuditLogs --external @getstrata/core/audit/siemFormatter --external @getstrata/core/admin/formatValue --external @getstrata/core/admin/registry --external @getstrata/core/admin/types --external @getstrata/core/cache/tags --external @getstrata/core/cache/createCacheStore --external @getstrata/core/cache/repository --external @getstrata/core/cache/simpleCache --external @getstrata/core/cache/simpleCacheStore --external @getstrata/core/config/envSchema --external @getstrata/core/contracts/serviceTokens --external @getstrata/core/contracts/authUserDirectory --external @getstrata/core/contracts/container --external @getstrata/core/contracts/di --external @getstrata/core/crypto/fieldEncryption --external @getstrata/core/crypto/mfaSecret --external @getstrata/core/database --external @getstrata/core/database/baseRepository --external @getstrata/core/database/bindConnection --external @getstrata/core/database/boundConnection --external @getstrata/core/database/bunSql --external @getstrata/core/database/connection --external @getstrata/core/database/connectionContext --external @getstrata/core/database/defaultConnection --external @getstrata/core/database/dialect --external @getstrata/core/database/mysqlConnection --external @getstrata/core/database/namedConnections --external @getstrata/core/database/errors --external @getstrata/core/database/factory --external @getstrata/core/database/migrations --external @getstrata/core/database/migrations/types --external @getstrata/core/database/model --external @getstrata/core/database/query --external @getstrata/core/database/relationships --external @getstrata/core/database/repositoryConnection --external @getstrata/core/database/repositoryQuery --external @getstrata/core/database/seeders --external @getstrata/core/database/seeders/types --external @getstrata/core/database/schema --external @getstrata/core/database/sqliteConnection --external @getstrata/core/database/table --external @getstrata/core/database/transaction --external @getstrata/core/database/types --external @getstrata/core/database/whereBuilder --external @getstrata/core/errors/http --external @getstrata/core/events --external @getstrata/core/facades --external @getstrata/core/http --external @getstrata/core/http/authMiddleware --external @getstrata/core/http/authorizeMiddleware --external @getstrata/core/http/bodySizeLimitMiddleware --external @getstrata/core/http/clientIp --external @getstrata/core/http/cookies --external @getstrata/core/http/contentNegotiation --external @getstrata/core/http/contentSecurityPolicy --external @getstrata/core/http/conditionalResponse --external @getstrata/core/http/corsMiddleware --external @getstrata/core/http/csrfMiddleware --external @getstrata/core/http/csrfProtection --external @getstrata/core/http/csrfToken --external @getstrata/core/http/etag --external @getstrata/core/http/flashSession --external @getstrata/core/http/flashMiddleware --external @getstrata/core/http/formRequest --external @getstrata/core/http/middleware --external @getstrata/core/http/metricsMiddleware --external @getstrata/core/http/loginThrottleMiddleware --external @getstrata/core/http/memoryThrottleMiddleware --external @getstrata/core/http/pagination --external @getstrata/core/http/parseFormBody --external @getstrata/core/http/parseMultipartUpload --external @getstrata/core/http/requireAbilityMiddleware --external @getstrata/core/http/requireAuthMiddleware --external @getstrata/core/http/requireGlobalAdminMiddleware --external @getstrata/core/http/requireWebAuthMiddleware --external @getstrata/core/http/requireVerifiedMiddleware --external @getstrata/core/http/requirePasswordConfirmMiddleware --external @getstrata/core/http/resources --external @getstrata/core/http/response --external @getstrata/core/http/route --external @getstrata/core/http/routeMiddleware --external @getstrata/core/http/routeModelBinding --external @getstrata/core/http/safeInternalPath --external @getstrata/core/http/signedUrl --external @getstrata/core/http/statelessAuth --external @getstrata/core/http/scimThrottleMiddleware --external @getstrata/core/http/securityHeadersMiddleware --external @getstrata/core/http/securedRouteModelBinding --external @getstrata/core/http/requestMetaContext --external @getstrata/core/http/webErrorResponse --external @getstrata/core/http/webFormRequest --external @getstrata/core/http/throttleMiddleware --external @getstrata/core/http/uploads --external @getstrata/core/http/validation --external @getstrata/core/jobs/exportAuditLogsJob --external @getstrata/core/jobs/invalidateCacheTagsJob --external @getstrata/core/lifecycle/gracefulShutdown --external @getstrata/core/logging/logger --external @getstrata/core/logging/requestLoggingMiddleware --external @getstrata/core/mail/mailer --external @getstrata/core/mail/markdownMail --external @getstrata/core/mail/markdownMailable --external @getstrata/core/mail/sanitizeMailHtml --external @getstrata/core/media/imageTransform --external @getstrata/core/metrics/prometheus --external @getstrata/core/notifications --external @getstrata/core/openapi/generator --external @getstrata/core/openapi/registeredRoute --external @getstrata/core/openapi/validate --external @getstrata/core/pagination --external @getstrata/core/queue --external @getstrata/core/queue/createAppQueue --external @getstrata/core/queue/failedJobRepository --external @getstrata/core/queue/failedJobService --external @getstrata/core/queue/jobRegistry --external @getstrata/core/queue/jobRunner --external @getstrata/core/queue/queueMetrics --external @getstrata/core/queue/publicQueue --external @getstrata/core/queue/redisQueue --external @getstrata/core/queue/types --external @getstrata/core/runtime/appEnv --external @getstrata/core/runtime/appKeyPrefix --external @getstrata/core/runtime/frontendMode --external @getstrata/core/runtime/applicationRegistry --external @getstrata/core/runtime/asyncContextStore --external @getstrata/core/scheduler/schedule --external @getstrata/core/scheduler/osCron --external @getstrata/core/security/oauthState --external @getstrata/core/security/publicReads --external @getstrata/core/security/recoveryCodes --external @getstrata/core/security/safeFetch --external @getstrata/core/security/safePath --external @getstrata/core/security/safeUrl --external @getstrata/core/security/scimTenantTokens --external @getstrata/core/security/securityEvents --external @getstrata/core/security/stripeWebhook --external @getstrata/core/security/webhookSignature --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/tenant/enableTenantRls --external @getstrata/core/terminal/runShell --external @getstrata/core/tracing/traceContext --external @getstrata/core/tracing/tracingMiddleware --external @getstrata/core/validation/rules --external @getstrata/core/view",
932
937
  "build:shims": "bun ../../scripts/write-core-shared-shims.ts"
933
938
  },
934
939
  "publishConfig": {