@getstrata/core 1.1.3 → 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.
- package/CHANGELOG.md +13 -0
- package/dist/core/http/index.d.ts +1 -1
- package/dist/core/http/parseMultipartUpload.d.ts +2 -1
- package/dist/core/security/webhookSignature.d.ts +3 -0
- package/dist/entries/audit/exportAuditLogs.js +3 -0
- package/dist/entries/audit/siemFormatter.js +3 -0
- package/dist/entries/auth/basicAuthGuard.js +3 -0
- package/dist/entries/auth/intendedUrlCookie.js +3 -0
- package/dist/entries/auth/jwt.js +3 -0
- package/dist/entries/auth/jwtGuard.js +3 -0
- package/dist/entries/auth/oauth/providers.js +3 -0
- package/dist/entries/auth/oneTimeToken.js +3 -0
- package/dist/entries/auth/passwordConfirmCookie.js +3 -0
- package/dist/entries/auth/passwordLogin.js +3 -0
- package/dist/entries/auth/sessionCookie.js +3 -0
- package/dist/entries/auth/sessionGuard.js +3 -0
- package/dist/entries/auth/tokenHash.js +3 -0
- package/dist/entries/cache/createCacheStore.js +3 -0
- package/dist/entries/facades.js +3 -0
- package/dist/entries/http/corsMiddleware.js +3 -0
- package/dist/entries/http/csrfMiddleware.js +4 -1
- package/dist/entries/http/csrfToken.js +3 -0
- package/dist/entries/http/flashMiddleware.js +3 -0
- package/dist/entries/http/flashSession.js +3 -0
- package/dist/entries/http/memoryThrottleMiddleware.js +3 -0
- package/dist/entries/http/parseMultipartUpload.js +22 -15
- package/dist/entries/http/scimThrottleMiddleware.js +3 -0
- package/dist/entries/http/signedUrl.js +3 -0
- package/dist/entries/http/throttleMiddleware.js +3 -0
- package/dist/entries/http/uploads.js +62 -0
- package/dist/entries/jobs/exportAuditLogsJob.js +3 -0
- package/dist/entries/mail/mailer.js +3 -0
- package/dist/entries/openapi/generator.js +3 -0
- package/dist/entries/queue/createAppQueue.js +3 -0
- package/dist/entries/queue/publicQueue.js +3 -0
- package/dist/entries/queue/queueMetrics.js +3 -0
- package/dist/entries/queue/redisQueue.js +3 -0
- package/dist/entries/security/oauthState.js +3 -0
- package/dist/entries/security/totp.js +3 -0
- package/dist/entries/security/webhookSignature.js +103 -0
- package/dist/entries/tracing/tracingMiddleware.js +3 -0
- package/dist/framework/public-api.d.ts +2 -1
- package/dist/index.js +34 -15
- package/package.json +12 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
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
|
+
|
|
12
|
+
## 1.1.4
|
|
13
|
+
|
|
14
|
+
- Publish http/uploads, validateUploadFile, migration-adoption docs
|
|
15
|
+
|
|
3
16
|
## 1.1.3
|
|
4
17
|
|
|
5
18
|
- Eager with() arrays, OpenAPI mkdir, public-read/auth docs
|
|
@@ -10,7 +10,7 @@ export type { Middleware, RouteHandler } from "./middleware";
|
|
|
10
10
|
export { applyMiddlewareToRoutes, composeMiddleware, requestIdMiddleware, wrapRouteHandler, } from "./middleware";
|
|
11
11
|
export { buildPaginationMeta, DEFAULT_PER_PAGE, MAX_PER_PAGE, paginatedResponse, parsePaginationQuery, } from "./pagination";
|
|
12
12
|
export type { ParsedUpload } from "./parseMultipartUpload";
|
|
13
|
-
export { parseMultipartUpload, sanitizeUploadFileName } from "./parseMultipartUpload";
|
|
13
|
+
export { parseMultipartUpload, sanitizeUploadFileName, validateUploadFile, } from "./parseMultipartUpload";
|
|
14
14
|
export { createRequireAuthMiddleware } from "./requireAuthMiddleware";
|
|
15
15
|
export { serializeDate, toPaginatedResourceCollection, toResourceCollection } from "./resources";
|
|
16
16
|
export { createdResponse, errorResponse, jsonResponse, noContentResponse, withErrorHandling, } from "./response";
|
|
@@ -5,6 +5,7 @@ interface ParsedUpload {
|
|
|
5
5
|
contents: Uint8Array;
|
|
6
6
|
}
|
|
7
7
|
declare function sanitizeUploadFileName(name: string): string;
|
|
8
|
+
declare function validateUploadFile(file: File, fieldName?: string): Promise<ParsedUpload>;
|
|
8
9
|
declare function parseMultipartUpload(request: Request, fieldName?: string): Promise<ParsedUpload>;
|
|
9
10
|
export type { ParsedUpload };
|
|
10
|
-
export { parseMultipartUpload, sanitizeUploadFileName };
|
|
11
|
+
export { parseMultipartUpload, sanitizeUploadFileName, validateUploadFile };
|
|
@@ -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
|
}
|
package/dist/entries/auth/jwt.js
CHANGED
|
@@ -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
|
}
|
package/dist/entries/facades.js
CHANGED
|
@@ -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
|
}
|
|
@@ -67,35 +67,42 @@ function sanitizeUploadFileName(name) {
|
|
|
67
67
|
const sanitized = base.replace(/[^\w.\-()+ ]+/g, "_").slice(0, 200);
|
|
68
68
|
return sanitized.length > 0 ? sanitized : "upload";
|
|
69
69
|
}
|
|
70
|
-
async function
|
|
71
|
-
|
|
72
|
-
if (!contentType.includes("multipart/form-data")) {
|
|
73
|
-
throw new BadRequestError("Expected multipart form data.");
|
|
74
|
-
}
|
|
75
|
-
const formData = await request.formData();
|
|
76
|
-
const value = formData.get(fieldName);
|
|
77
|
-
if (!(value instanceof File)) {
|
|
70
|
+
async function validateUploadFile(file, fieldName = "file") {
|
|
71
|
+
if (!(file instanceof File)) {
|
|
78
72
|
throw new BadRequestError(`Missing upload field "${fieldName}".`);
|
|
79
73
|
}
|
|
80
|
-
if (
|
|
74
|
+
if (file.size <= 0) {
|
|
81
75
|
throw new BadRequestError("Uploaded file is empty.");
|
|
82
76
|
}
|
|
83
77
|
const maxBytes = resolveMaxUploadBytes();
|
|
84
|
-
if (
|
|
78
|
+
if (file.size > maxBytes) {
|
|
85
79
|
throw new PayloadTooLargeError(`Upload exceeds the ${maxBytes} byte limit.`);
|
|
86
80
|
}
|
|
87
|
-
const mimeType = normalizeMimeType2(
|
|
81
|
+
const mimeType = normalizeMimeType2(file.type.trim() || "application/octet-stream");
|
|
88
82
|
if (!isAllowedMimeType(mimeType)) {
|
|
89
83
|
throw new BadRequestError(`File type "${mimeType}" is not allowed.`);
|
|
90
84
|
}
|
|
91
85
|
return {
|
|
92
|
-
fileName: sanitizeUploadFileName(
|
|
86
|
+
fileName: sanitizeUploadFileName(file.name),
|
|
93
87
|
mimeType,
|
|
94
|
-
size:
|
|
95
|
-
contents: new Uint8Array(await
|
|
88
|
+
size: file.size,
|
|
89
|
+
contents: new Uint8Array(await file.arrayBuffer())
|
|
96
90
|
};
|
|
97
91
|
}
|
|
92
|
+
async function parseMultipartUpload(request, fieldName = "file") {
|
|
93
|
+
const contentType = request.headers.get("content-type")?.toLowerCase() ?? "";
|
|
94
|
+
if (!contentType.includes("multipart/form-data")) {
|
|
95
|
+
throw new BadRequestError("Expected multipart form data.");
|
|
96
|
+
}
|
|
97
|
+
const formData = await request.formData();
|
|
98
|
+
const value = formData.get(fieldName);
|
|
99
|
+
if (!(value instanceof File)) {
|
|
100
|
+
throw new BadRequestError(`Missing upload field "${fieldName}".`);
|
|
101
|
+
}
|
|
102
|
+
return validateUploadFile(value, fieldName);
|
|
103
|
+
}
|
|
98
104
|
export {
|
|
99
105
|
parseMultipartUpload,
|
|
100
|
-
sanitizeUploadFileName
|
|
106
|
+
sanitizeUploadFileName,
|
|
107
|
+
validateUploadFile
|
|
101
108
|
};
|
|
@@ -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
|
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
// ../../src/core/runtime/appEnv.ts
|
|
3
|
+
var NON_PRODUCTION_APP_ENVS = new Set(["local", "development", "dev", "test", "testing", "ci"]);
|
|
4
|
+
function normalizeEnvValue(value) {
|
|
5
|
+
return (value ?? "").trim().toLowerCase();
|
|
6
|
+
}
|
|
7
|
+
function isProductionEnv(env = process.env) {
|
|
8
|
+
const appEnv = normalizeEnvValue(env.APP_ENV);
|
|
9
|
+
const nodeEnv = normalizeEnvValue(env.NODE_ENV);
|
|
10
|
+
if (appEnv === "production" || nodeEnv === "production") {
|
|
11
|
+
return true;
|
|
12
|
+
}
|
|
13
|
+
if (appEnv === "") {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
return !NON_PRODUCTION_APP_ENVS.has(appEnv);
|
|
17
|
+
}
|
|
18
|
+
function envFlagEnabled(value) {
|
|
19
|
+
return value === "true";
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// ../../src/core/http/uploads.ts
|
|
23
|
+
var DEFAULT_MAX_UPLOAD_BYTES = 5 * 1024 * 1024;
|
|
24
|
+
var ALLOWED_UPLOAD_MIME_TYPES = new Set([
|
|
25
|
+
"application/pdf",
|
|
26
|
+
"application/json",
|
|
27
|
+
"application/zip",
|
|
28
|
+
"application/x-zip-compressed",
|
|
29
|
+
"image/jpeg",
|
|
30
|
+
"image/png",
|
|
31
|
+
"image/gif",
|
|
32
|
+
"image/webp",
|
|
33
|
+
"text/plain",
|
|
34
|
+
"text/csv"
|
|
35
|
+
]);
|
|
36
|
+
function resolveMaxUploadBytes() {
|
|
37
|
+
const raw = process.env.MAX_UPLOAD_BYTES?.trim() ?? process.env.MAX_REQUEST_BODY_BYTES?.trim();
|
|
38
|
+
if (!raw) {
|
|
39
|
+
return DEFAULT_MAX_UPLOAD_BYTES;
|
|
40
|
+
}
|
|
41
|
+
const parsed = Number.parseInt(raw, 10);
|
|
42
|
+
if (!Number.isInteger(parsed) || parsed <= 0) {
|
|
43
|
+
return DEFAULT_MAX_UPLOAD_BYTES;
|
|
44
|
+
}
|
|
45
|
+
return parsed;
|
|
46
|
+
}
|
|
47
|
+
function normalizeMimeType(mimeType) {
|
|
48
|
+
return mimeType.split(";")[0]?.trim().toLowerCase() ?? "";
|
|
49
|
+
}
|
|
50
|
+
function isAllowedMimeType(mimeType) {
|
|
51
|
+
const normalized = normalizeMimeType(mimeType);
|
|
52
|
+
if (!normalized || normalized === "application/octet-stream") {
|
|
53
|
+
return envFlagEnabled(process.env.UPLOAD_ALLOW_UNKNOWN_MIME);
|
|
54
|
+
}
|
|
55
|
+
return ALLOWED_UPLOAD_MIME_TYPES.has(normalized);
|
|
56
|
+
}
|
|
57
|
+
export {
|
|
58
|
+
ALLOWED_UPLOAD_MIME_TYPES,
|
|
59
|
+
DEFAULT_MAX_UPLOAD_BYTES,
|
|
60
|
+
isAllowedMimeType,
|
|
61
|
+
resolveMaxUploadBytes
|
|
62
|
+
};
|
|
@@ -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
|
}
|
|
@@ -91,7 +91,7 @@ export { createLoginThrottleMiddleware, createMemoryLoginThrottleMiddleware, res
|
|
|
91
91
|
export { createMemoryThrottleMiddleware, resetMemoryThrottleForTests, } from "../core/http/memoryThrottleMiddleware.ts";
|
|
92
92
|
export { createMetricsMiddleware, normalizeMetricPath } from "../core/http/metricsMiddleware.ts";
|
|
93
93
|
export type { Middleware, RouteHandler } from "../core/http/middleware.ts";
|
|
94
|
-
export { type ParsedUpload, parseMultipartUpload, sanitizeUploadFileName, } from "../core/http/parseMultipartUpload.ts";
|
|
94
|
+
export { type ParsedUpload, parseMultipartUpload, sanitizeUploadFileName, validateUploadFile, } from "../core/http/parseMultipartUpload.ts";
|
|
95
95
|
export type { RequestMeta } from "../core/http/requestMetaContext.ts";
|
|
96
96
|
export { currentRequestMeta, requestMetaContext, runWithRequestMeta, } from "../core/http/requestMetaContext.ts";
|
|
97
97
|
export { createRequireAbilityMiddleware } from "../core/http/requireAbilityMiddleware.ts";
|
|
@@ -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);
|
|
@@ -9080,34 +9080,40 @@ function sanitizeUploadFileName(name) {
|
|
|
9080
9080
|
const sanitized = base.replace(/[^\w.\-()+ ]+/g, "_").slice(0, 200);
|
|
9081
9081
|
return sanitized.length > 0 ? sanitized : "upload";
|
|
9082
9082
|
}
|
|
9083
|
-
async function
|
|
9084
|
-
|
|
9085
|
-
if (!contentType.includes("multipart/form-data")) {
|
|
9086
|
-
throw new BadRequestError("Expected multipart form data.");
|
|
9087
|
-
}
|
|
9088
|
-
const formData = await request.formData();
|
|
9089
|
-
const value = formData.get(fieldName);
|
|
9090
|
-
if (!(value instanceof File)) {
|
|
9083
|
+
async function validateUploadFile(file, fieldName = "file") {
|
|
9084
|
+
if (!(file instanceof File)) {
|
|
9091
9085
|
throw new BadRequestError(`Missing upload field "${fieldName}".`);
|
|
9092
9086
|
}
|
|
9093
|
-
if (
|
|
9087
|
+
if (file.size <= 0) {
|
|
9094
9088
|
throw new BadRequestError("Uploaded file is empty.");
|
|
9095
9089
|
}
|
|
9096
9090
|
const maxBytes = resolveMaxUploadBytes();
|
|
9097
|
-
if (
|
|
9091
|
+
if (file.size > maxBytes) {
|
|
9098
9092
|
throw new PayloadTooLargeError(`Upload exceeds the ${maxBytes} byte limit.`);
|
|
9099
9093
|
}
|
|
9100
|
-
const mimeType = normalizeMimeType2(
|
|
9094
|
+
const mimeType = normalizeMimeType2(file.type.trim() || "application/octet-stream");
|
|
9101
9095
|
if (!isAllowedMimeType(mimeType)) {
|
|
9102
9096
|
throw new BadRequestError(`File type "${mimeType}" is not allowed.`);
|
|
9103
9097
|
}
|
|
9104
9098
|
return {
|
|
9105
|
-
fileName: sanitizeUploadFileName(
|
|
9099
|
+
fileName: sanitizeUploadFileName(file.name),
|
|
9106
9100
|
mimeType,
|
|
9107
|
-
size:
|
|
9108
|
-
contents: new Uint8Array(await
|
|
9101
|
+
size: file.size,
|
|
9102
|
+
contents: new Uint8Array(await file.arrayBuffer())
|
|
9109
9103
|
};
|
|
9110
9104
|
}
|
|
9105
|
+
async function parseMultipartUpload(request, fieldName = "file") {
|
|
9106
|
+
const contentType = request.headers.get("content-type")?.toLowerCase() ?? "";
|
|
9107
|
+
if (!contentType.includes("multipart/form-data")) {
|
|
9108
|
+
throw new BadRequestError("Expected multipart form data.");
|
|
9109
|
+
}
|
|
9110
|
+
const formData = await request.formData();
|
|
9111
|
+
const value = formData.get(fieldName);
|
|
9112
|
+
if (!(value instanceof File)) {
|
|
9113
|
+
throw new BadRequestError(`Missing upload field "${fieldName}".`);
|
|
9114
|
+
}
|
|
9115
|
+
return validateUploadFile(value, fieldName);
|
|
9116
|
+
}
|
|
9111
9117
|
// ../../src/core/http/requireAuthMiddleware.ts
|
|
9112
9118
|
function createRequireAuthMiddleware(auth) {
|
|
9113
9119
|
return async (request, next) => {
|
|
@@ -10903,6 +10909,16 @@ function isPublicReadsEnabled() {
|
|
|
10903
10909
|
function guestCanViewResource() {
|
|
10904
10910
|
return isPublicReadsEnabled();
|
|
10905
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
|
+
}
|
|
10906
10922
|
// ../../src/core/tenant/enableTenantRls.ts
|
|
10907
10923
|
function assertSafeIdentifier2(identifier) {
|
|
10908
10924
|
if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(identifier)) {
|
|
@@ -12015,7 +12031,9 @@ export {
|
|
|
12015
12031
|
setSamlAssertionReplayStoreForTests,
|
|
12016
12032
|
siemEventType,
|
|
12017
12033
|
signJwt,
|
|
12034
|
+
signWebhookBody,
|
|
12018
12035
|
signedUrl,
|
|
12036
|
+
signedWebhookHeaders,
|
|
12019
12037
|
singularize,
|
|
12020
12038
|
smtpEhloHost,
|
|
12021
12039
|
spaContentSecurityPolicy,
|
|
@@ -12036,6 +12054,7 @@ export {
|
|
|
12036
12054
|
unregisterNamedConnection,
|
|
12037
12055
|
useSqlDialect,
|
|
12038
12056
|
validateObject,
|
|
12057
|
+
validateUploadFile,
|
|
12039
12058
|
verifyCsrfToken,
|
|
12040
12059
|
verifyJwt,
|
|
12041
12060
|
webErrorResponse,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@getstrata/core",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.5",
|
|
4
4
|
"description": "Strata Bun framework public API",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -620,6 +620,11 @@
|
|
|
620
620
|
"import": "./dist/entries/http/throttleMiddleware.js",
|
|
621
621
|
"default": "./dist/entries/http/throttleMiddleware.js"
|
|
622
622
|
},
|
|
623
|
+
"./http/uploads": {
|
|
624
|
+
"types": "./dist/core/http/uploads.d.ts",
|
|
625
|
+
"import": "./dist/entries/http/uploads.js",
|
|
626
|
+
"default": "./dist/entries/http/uploads.js"
|
|
627
|
+
},
|
|
623
628
|
"./http/validation": {
|
|
624
629
|
"types": "./dist/core/http/validation.d.ts",
|
|
625
630
|
"import": "./dist/entries/http/validation.js",
|
|
@@ -835,6 +840,11 @@
|
|
|
835
840
|
"import": "./dist/entries/security/stripeWebhook.js",
|
|
836
841
|
"default": "./dist/entries/security/stripeWebhook.js"
|
|
837
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
|
+
},
|
|
838
848
|
"./security/timingSafeCompare": {
|
|
839
849
|
"types": "./dist/core/security/timingSafeCompare.d.ts",
|
|
840
850
|
"import": "./dist/entries/security/timingSafeCompare.js",
|
|
@@ -923,7 +933,7 @@
|
|
|
923
933
|
"build:bundle": "bun build index.ts --outdir dist --target bun --external bun --external eta --external mysql2 --external @node-saml/node-saml",
|
|
924
934
|
"build:types": "tsc -p tsconfig.types.json",
|
|
925
935
|
"prepublishOnly": "bun run build && bun ../../scripts/prepare-core-package-publish.ts",
|
|
926
|
-
"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/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/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",
|
|
927
937
|
"build:shims": "bun ../../scripts/write-core-shared-shims.ts"
|
|
928
938
|
},
|
|
929
939
|
"publishConfig": {
|