@getstrata/core 2.2.37 → 2.2.39

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.
@@ -26,130 +26,8 @@ function createAsyncContextStore(key) {
26
26
  }
27
27
  var init_asyncContextStore = () => {};
28
28
 
29
- // ../../src/core/metrics/prometheus.ts
30
- var HTTP_DURATION_BUCKETS_MS = [5, 10, 25, 50, 100, 250, 500, 1000, 2500, 5000, 1e4];
31
- function emptyHistogram() {
32
- return {
33
- cumulative: HTTP_DURATION_BUCKETS_MS.map(() => 0),
34
- sum: 0,
35
- count: 0
36
- };
37
- }
38
-
39
- class PrometheusRegistry {
40
- maxSeries;
41
- seriesLabels = new Map;
42
- constructor(maxSeries = 4096) {
43
- this.maxSeries = maxSeries;
44
- if (!Number.isSafeInteger(maxSeries) || maxSeries < 1) {
45
- throw new Error("Metrics maxSeries must be a positive safe integer.");
46
- }
47
- }
48
- httpRequestsTotal = new Map;
49
- httpRequestDurationMs = new Map;
50
- incrementHttpRequest(labels) {
51
- const key = this.metricKey(labels);
52
- this.httpRequestsTotal.set(key, (this.httpRequestsTotal.get(key) ?? 0) + 1);
53
- }
54
- observeHttpDuration(labels, durationMs) {
55
- if (!Number.isFinite(durationMs) || durationMs < 0)
56
- return;
57
- const key = this.metricKey(labels);
58
- const histogram = this.httpRequestDurationMs.get(key) ?? emptyHistogram();
59
- histogram.count += 1;
60
- histogram.sum += durationMs;
61
- for (let index = 0;index < HTTP_DURATION_BUCKETS_MS.length; index += 1) {
62
- const bound = HTTP_DURATION_BUCKETS_MS[index];
63
- if (bound !== undefined && durationMs <= bound) {
64
- const count = histogram.cumulative[index] ?? 0;
65
- histogram.cumulative[index] = count + 1;
66
- }
67
- }
68
- this.httpRequestDurationMs.set(key, histogram);
69
- }
70
- renderMetrics() {
71
- const lines = [
72
- "# HELP http_requests_total Total HTTP requests processed.",
73
- "# TYPE http_requests_total counter"
74
- ];
75
- for (const [key, value] of this.httpRequestsTotal) {
76
- lines.push(`http_requests_total{${key}} ${value}`);
77
- }
78
- lines.push("# HELP http_request_duration_ms HTTP request duration in milliseconds.", "# TYPE http_request_duration_ms histogram");
79
- for (const [key, histogram] of this.httpRequestDurationMs) {
80
- for (let index = 0;index < HTTP_DURATION_BUCKETS_MS.length; index += 1) {
81
- const bound = HTTP_DURATION_BUCKETS_MS[index];
82
- lines.push(`http_request_duration_ms_bucket{${key},le="${bound}"} ${histogram.cumulative[index] ?? 0}`);
83
- }
84
- lines.push(`http_request_duration_ms_bucket{${key},le="+Inf"} ${histogram.count}`);
85
- lines.push(`http_request_duration_ms_sum{${key}} ${histogram.sum}`);
86
- lines.push(`http_request_duration_ms_count{${key}} ${histogram.count}`);
87
- }
88
- return `${lines.join(`
89
- `)}
90
- `;
91
- }
92
- resetForTests() {
93
- this.seriesLabels.clear();
94
- this.httpRequestsTotal.clear();
95
- this.httpRequestDurationMs.clear();
96
- }
97
- getHttpRequestSummary() {
98
- const byStatus = {};
99
- const pathCounts = new Map;
100
- let totalRequests = 0;
101
- for (const [key, count] of this.httpRequestsTotal) {
102
- totalRequests += count;
103
- const labels = this.seriesLabels.get(key);
104
- if (!labels)
105
- continue;
106
- const { method, path, status } = labels;
107
- byStatus[status] = (byStatus[status] ?? 0) + count;
108
- const pathKey = `${method} ${path}`;
109
- const existing = pathCounts.get(pathKey);
110
- if (existing) {
111
- existing.count += count;
112
- } else {
113
- pathCounts.set(pathKey, { method, path, count });
114
- }
115
- }
116
- const topPaths = Array.from(pathCounts.values()).sort((left, right) => right.count - left.count).slice(0, 10);
117
- return {
118
- totalRequests,
119
- byStatus,
120
- topPaths
121
- };
122
- }
123
- getStorageStats() {
124
- return {
125
- series: this.seriesLabels.size,
126
- histograms: this.httpRequestDurationMs.size,
127
- bucketCounters: this.httpRequestDurationMs.size * HTTP_DURATION_BUCKETS_MS.length
128
- };
129
- }
130
- metricKey(labels) {
131
- const normalized = {
132
- method: /^(GET|HEAD|POST|PUT|PATCH|DELETE|CONNECT|OPTIONS|TRACE)$/.test(labels.method) ? labels.method : "OTHER",
133
- path: labels.path.length <= 512 ? labels.path : "__overflow__",
134
- status: /^[1-5][0-9]{2}$/.test(labels.status) ? labels.status : "000"
135
- };
136
- const escapeLabel = (value) => value.replaceAll("\\", "\\\\").replaceAll(`
137
- `, "\\n").replaceAll('"', "\\\"");
138
- const encode = (value) => `method="${value.method}",path="${escapeLabel(value.path)}",status="${value.status}"`;
139
- let key = encode(normalized);
140
- if (!this.seriesLabels.has(key)) {
141
- if (this.seriesLabels.size >= this.maxSeries) {
142
- const overflow = { method: "OTHER", path: "__overflow__", status: "000" };
143
- key = encode(overflow);
144
- this.seriesLabels.set(key, overflow);
145
- } else {
146
- this.seriesLabels.set(key, normalized);
147
- }
148
- }
149
- return key;
150
- }
151
- }
152
- var prometheusRegistry = new PrometheusRegistry;
29
+ // ../../src/core/http/metricsMiddleware.ts
30
+ import { prometheusRegistry } from "@getstrata/core/metrics/prometheus";
153
31
 
154
32
  // ../../src/core/http/requestMetaContext.ts
155
33
  init_asyncContextStore();
@@ -1,130 +1 @@
1
- // @bun
2
- // ../../src/core/metrics/prometheus.ts
3
- var HTTP_DURATION_BUCKETS_MS = [5, 10, 25, 50, 100, 250, 500, 1000, 2500, 5000, 1e4];
4
- function emptyHistogram() {
5
- return {
6
- cumulative: HTTP_DURATION_BUCKETS_MS.map(() => 0),
7
- sum: 0,
8
- count: 0
9
- };
10
- }
11
-
12
- class PrometheusRegistry {
13
- maxSeries;
14
- seriesLabels = new Map;
15
- constructor(maxSeries = 4096) {
16
- this.maxSeries = maxSeries;
17
- if (!Number.isSafeInteger(maxSeries) || maxSeries < 1) {
18
- throw new Error("Metrics maxSeries must be a positive safe integer.");
19
- }
20
- }
21
- httpRequestsTotal = new Map;
22
- httpRequestDurationMs = new Map;
23
- incrementHttpRequest(labels) {
24
- const key = this.metricKey(labels);
25
- this.httpRequestsTotal.set(key, (this.httpRequestsTotal.get(key) ?? 0) + 1);
26
- }
27
- observeHttpDuration(labels, durationMs) {
28
- if (!Number.isFinite(durationMs) || durationMs < 0)
29
- return;
30
- const key = this.metricKey(labels);
31
- const histogram = this.httpRequestDurationMs.get(key) ?? emptyHistogram();
32
- histogram.count += 1;
33
- histogram.sum += durationMs;
34
- for (let index = 0;index < HTTP_DURATION_BUCKETS_MS.length; index += 1) {
35
- const bound = HTTP_DURATION_BUCKETS_MS[index];
36
- if (bound !== undefined && durationMs <= bound) {
37
- const count = histogram.cumulative[index] ?? 0;
38
- histogram.cumulative[index] = count + 1;
39
- }
40
- }
41
- this.httpRequestDurationMs.set(key, histogram);
42
- }
43
- renderMetrics() {
44
- const lines = [
45
- "# HELP http_requests_total Total HTTP requests processed.",
46
- "# TYPE http_requests_total counter"
47
- ];
48
- for (const [key, value] of this.httpRequestsTotal) {
49
- lines.push(`http_requests_total{${key}} ${value}`);
50
- }
51
- lines.push("# HELP http_request_duration_ms HTTP request duration in milliseconds.", "# TYPE http_request_duration_ms histogram");
52
- for (const [key, histogram] of this.httpRequestDurationMs) {
53
- for (let index = 0;index < HTTP_DURATION_BUCKETS_MS.length; index += 1) {
54
- const bound = HTTP_DURATION_BUCKETS_MS[index];
55
- lines.push(`http_request_duration_ms_bucket{${key},le="${bound}"} ${histogram.cumulative[index] ?? 0}`);
56
- }
57
- lines.push(`http_request_duration_ms_bucket{${key},le="+Inf"} ${histogram.count}`);
58
- lines.push(`http_request_duration_ms_sum{${key}} ${histogram.sum}`);
59
- lines.push(`http_request_duration_ms_count{${key}} ${histogram.count}`);
60
- }
61
- return `${lines.join(`
62
- `)}
63
- `;
64
- }
65
- resetForTests() {
66
- this.seriesLabels.clear();
67
- this.httpRequestsTotal.clear();
68
- this.httpRequestDurationMs.clear();
69
- }
70
- getHttpRequestSummary() {
71
- const byStatus = {};
72
- const pathCounts = new Map;
73
- let totalRequests = 0;
74
- for (const [key, count] of this.httpRequestsTotal) {
75
- totalRequests += count;
76
- const labels = this.seriesLabels.get(key);
77
- if (!labels)
78
- continue;
79
- const { method, path, status } = labels;
80
- byStatus[status] = (byStatus[status] ?? 0) + count;
81
- const pathKey = `${method} ${path}`;
82
- const existing = pathCounts.get(pathKey);
83
- if (existing) {
84
- existing.count += count;
85
- } else {
86
- pathCounts.set(pathKey, { method, path, count });
87
- }
88
- }
89
- const topPaths = Array.from(pathCounts.values()).sort((left, right) => right.count - left.count).slice(0, 10);
90
- return {
91
- totalRequests,
92
- byStatus,
93
- topPaths
94
- };
95
- }
96
- getStorageStats() {
97
- return {
98
- series: this.seriesLabels.size,
99
- histograms: this.httpRequestDurationMs.size,
100
- bucketCounters: this.httpRequestDurationMs.size * HTTP_DURATION_BUCKETS_MS.length
101
- };
102
- }
103
- metricKey(labels) {
104
- const normalized = {
105
- method: /^(GET|HEAD|POST|PUT|PATCH|DELETE|CONNECT|OPTIONS|TRACE)$/.test(labels.method) ? labels.method : "OTHER",
106
- path: labels.path.length <= 512 ? labels.path : "__overflow__",
107
- status: /^[1-5][0-9]{2}$/.test(labels.status) ? labels.status : "000"
108
- };
109
- const escapeLabel = (value) => value.replaceAll("\\", "\\\\").replaceAll(`
110
- `, "\\n").replaceAll('"', "\\\"");
111
- const encode = (value) => `method="${value.method}",path="${escapeLabel(value.path)}",status="${value.status}"`;
112
- let key = encode(normalized);
113
- if (!this.seriesLabels.has(key)) {
114
- if (this.seriesLabels.size >= this.maxSeries) {
115
- const overflow = { method: "OTHER", path: "__overflow__", status: "000" };
116
- key = encode(overflow);
117
- this.seriesLabels.set(key, overflow);
118
- } else {
119
- this.seriesLabels.set(key, normalized);
120
- }
121
- }
122
- return key;
123
- }
124
- }
125
- var prometheusRegistry = new PrometheusRegistry;
126
- export {
127
- HTTP_DURATION_BUCKETS_MS,
128
- PrometheusRegistry,
129
- prometheusRegistry
130
- };
1
+ export * from "../../index.js";
@@ -128,7 +128,7 @@ export type { MarkdownMailableInput } from "../core/mail/markdownMailable.ts";
128
128
  export { buildMarkdownMailMessage, sendMarkdownMail } from "../core/mail/markdownMailable.ts";
129
129
  export { sanitizeMailHtml } from "../core/mail/sanitizeMailHtml.ts";
130
130
  export type { MetricLabels } from "../core/metrics/prometheus.ts";
131
- export { PrometheusRegistry, prometheusRegistry } from "../core/metrics/prometheus.ts";
131
+ export { HTTP_DURATION_BUCKETS_MS, PrometheusRegistry, prometheusRegistry, } from "../core/metrics/prometheus.ts";
132
132
  export type { DatabaseNotificationPayload, DatabaseNotificationStore, MailNotificationMessage, Notifiable, NotificationChannelName, } from "../core/notifications/index.ts";
133
133
  export { createNotificationDispatcher, Notification, NotificationDispatcher, } from "../core/notifications/index.ts";
134
134
  export type { CursorPaginatedResult, KeysetColumn, KeysetCursor, KeysetOptions, PaginatedResult, PaginationMeta, } from "../core/pagination/index.ts";
package/dist/index.js CHANGED
@@ -3304,8 +3304,6 @@ function missingOptionalPeer(packageName, reason, error) {
3304
3304
  }
3305
3305
 
3306
3306
  // ../../src/core/auth/saml/samlAssertionReplay.ts
3307
- init_boundConnection();
3308
- init_defaultConnection();
3309
3307
  init_dialect();
3310
3308
 
3311
3309
  // ../../src/core/database/errors.ts
@@ -3421,6 +3419,7 @@ function isUniqueConstraintError(error) {
3421
3419
  }
3422
3420
 
3423
3421
  // ../../src/core/auth/saml/samlAssertionReplay.ts
3422
+ init_transaction();
3424
3423
  var REPLAY_RETENTION_MS = 60 * 60 * 1000;
3425
3424
 
3426
3425
  class InMemorySamlAssertionReplayStore {
@@ -3448,17 +3447,18 @@ class InMemorySamlAssertionReplayStore {
3448
3447
 
3449
3448
  class SqlSamlAssertionReplayStore {
3450
3449
  async consume(assertionId) {
3451
- const sql = getBoundDatabaseConnection() ?? getDefaultDatabasePool();
3452
3450
  const dialect = currentSqlDialect();
3453
3451
  try {
3454
- await sql.unsafe(`INSERT INTO auth_saml_assertions (assertion_id, consumed_at) VALUES (${dialect.placeholder(1)}, ${dialect.placeholder(2)})`, [assertionId, new Date().toISOString()]);
3452
+ await runInTransaction(async (connection) => {
3453
+ await connection.unsafe(`INSERT INTO auth_saml_assertions (assertion_id, consumed_at) VALUES (${dialect.placeholder(1)}, ${dialect.placeholder(2)})`, [assertionId, dialect.timestampValue(new Date)]);
3454
+ await connection.unsafe(`DELETE FROM auth_saml_assertions WHERE consumed_at < ${dialect.placeholder(1)}`, [dialect.timestampValue(new Date(Date.now() - REPLAY_RETENTION_MS))]);
3455
+ });
3455
3456
  } catch (error) {
3456
3457
  if (isUniqueConstraintError(error)) {
3457
3458
  throw new Error("SAML assertion replay detected.");
3458
3459
  }
3459
3460
  throw error;
3460
3461
  }
3461
- await sql.unsafe(`DELETE FROM auth_saml_assertions WHERE consumed_at < ${dialect.placeholder(1)}`, [new Date(Date.now() - REPLAY_RETENTION_MS).toISOString()]);
3462
3462
  }
3463
3463
  }
3464
3464
  var sqlReplayStore = new SqlSamlAssertionReplayStore;
@@ -3481,6 +3481,7 @@ async function consumeSamlAssertion(assertionId) {
3481
3481
  }
3482
3482
 
3483
3483
  // ../../src/core/auth/saml/samlServiceProvider.ts
3484
+ var CLOCK_SKEW_MS = 5000;
3484
3485
  function readAssertionId(profile) {
3485
3486
  if (typeof profile.ID === "string" && profile.ID.trim()) {
3486
3487
  return profile.ID.trim();
@@ -3489,6 +3490,43 @@ function readAssertionId(profile) {
3489
3490
  const assertionId = parsed?.Assertion?.$?.ID;
3490
3491
  return typeof assertionId === "string" ? assertionId.trim() : "";
3491
3492
  }
3493
+ function assertBearerRecipient(profile, acsUrl) {
3494
+ const subjects = profile.getAssertion?.()?.Assertion?.Subject;
3495
+ const confirmations = Array.isArray(subjects) && subjects.length === 1 ? subjects[0]?.SubjectConfirmation : undefined;
3496
+ const now = Date.now();
3497
+ const matches = Array.isArray(confirmations) && confirmations.some((confirmation) => {
3498
+ if (confirmation?.$?.Method !== "urn:oasis:names:tc:SAML:2.0:cm:bearer")
3499
+ return false;
3500
+ const data = confirmation.SubjectConfirmationData;
3501
+ if (!Array.isArray(data) || data.length !== 1)
3502
+ return false;
3503
+ const attributes = data[0]?.$;
3504
+ if (attributes?.Recipient !== acsUrl || attributes.NotBefore !== undefined)
3505
+ return false;
3506
+ if (typeof attributes.NotOnOrAfter !== "string")
3507
+ return false;
3508
+ const expires = Date.parse(attributes.NotOnOrAfter);
3509
+ return Number.isFinite(expires) && now < expires + CLOCK_SKEW_MS;
3510
+ });
3511
+ if (!matches)
3512
+ throw new Error("SAML assertion bearer recipient is invalid.");
3513
+ }
3514
+ async function assertResponseDestination(profile, acsUrl) {
3515
+ const xml = profile.getSamlResponseXml?.();
3516
+ const invalid = () => new Error("SAML response destination is invalid.");
3517
+ if (typeof xml !== "string" || !xml.trim())
3518
+ throw invalid();
3519
+ const parserModule = "@xmldom/xmldom";
3520
+ const { DOMParser } = await import(parserModule);
3521
+ const document = new DOMParser({
3522
+ errorHandler: () => {
3523
+ throw invalid();
3524
+ }
3525
+ }).parseFromString(xml, "application/xml");
3526
+ const response = document.documentElement;
3527
+ if (document.doctype || response?.localName !== "Response" || response.namespaceURI !== "urn:oasis:names:tc:SAML:2.0:protocol" || response.getAttribute("Destination") !== acsUrl)
3528
+ throw invalid();
3529
+ }
3492
3530
  function requireSamlOption(value, name) {
3493
3531
  const trimmed = value?.trim() ?? "";
3494
3532
  if (!trimmed) {
@@ -3553,7 +3591,7 @@ class SamlServiceProvider {
3553
3591
  idpCert: this.options.idpCert,
3554
3592
  audience: this.options.spEntityId,
3555
3593
  idpIssuer: this.options.idpIssuer,
3556
- acceptedClockSkewMs: 5000,
3594
+ acceptedClockSkewMs: CLOCK_SKEW_MS,
3557
3595
  wantAssertionsSigned: this.options.wantAssertionsSigned ?? true,
3558
3596
  wantAuthnResponseSigned: this.options.wantAuthnResponseSigned ?? true,
3559
3597
  disableRequestedAuthnContext: this.options.disableRequestedAuthnContext ?? false
@@ -3584,6 +3622,8 @@ class SamlServiceProvider {
3584
3622
  if (!assertionId) {
3585
3623
  throw new Error("SAML assertion did not include an ID.");
3586
3624
  }
3625
+ assertBearerRecipient(profile, this.options.acsUrl);
3626
+ await assertResponseDestination(profile, this.options.acsUrl);
3587
3627
  await consumeSamlAssertion(assertionId);
3588
3628
  const email = profile.email || (typeof profile["urn:oid:0.9.2342.19200300.100.1.3"] === "string" ? profile["urn:oid:0.9.2342.19200300.100.1.3"] : "") || "";
3589
3629
  if (!email) {
@@ -17073,6 +17113,7 @@ export {
17073
17113
  FormRequest,
17074
17114
  GuestGuard,
17075
17115
  HTMX_2_0_4_INDICATOR_STYLE_HASH,
17116
+ HTTP_DURATION_BUCKETS_MS,
17076
17117
  HasManyRelationQuery,
17077
17118
  HasManyThroughRelationQuery,
17078
17119
  HasOneRelationQuery,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@getstrata/core",
3
- "version": "2.2.37",
3
+ "version": "2.2.39",
4
4
  "description": "Strata Bun framework public API",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -958,7 +958,7 @@
958
958
  "build:bundle": "bun build index.ts --outdir dist --target bun --external bun --external '@opentelemetry/*' --external eta --external mysql2 --external @node-saml/node-saml",
959
959
  "build:types": "tsc -p tsconfig.types.json",
960
960
  "prepublishOnly": "bun run build && bun ../../scripts/prepare-core-package-publish.ts",
961
- "build:subpaths": "bun build entries/auth/accountState.ts entries/auth/accountStateMigration.ts 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/pendingMfaCookie.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/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/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 '@opentelemetry/*' --external eta --external mysql2 --external @node-saml/node-saml --external @getstrata/core --external @getstrata/core/auth/accountState --external @getstrata/core/auth/accountStateMigration --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/pendingMfaCookie --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/fieldEncryptionRotation --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/events/outbox --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",
961
+ "build:subpaths": "bun build entries/auth/accountState.ts entries/auth/accountStateMigration.ts 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/pendingMfaCookie.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/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/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/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 '@opentelemetry/*' --external eta --external mysql2 --external @node-saml/node-saml --external @getstrata/core --external @getstrata/core/auth/accountState --external @getstrata/core/auth/accountStateMigration --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/pendingMfaCookie --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/fieldEncryptionRotation --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/events/outbox --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",
962
962
  "build:shims": "bun ../../scripts/write-core-shared-shims.ts"
963
963
  },
964
964
  "publishConfig": {
@@ -992,6 +992,7 @@
992
992
  "@opentelemetry/resources": "2.12.0",
993
993
  "@opentelemetry/sdk-trace": "2.12.0",
994
994
  "@opentelemetry/sdk-trace-base": "2.12.0",
995
- "@opentelemetry/sdk-trace-node": "2.12.0"
995
+ "@opentelemetry/sdk-trace-node": "2.12.0",
996
+ "@xmldom/xmldom": "^0.8.15"
996
997
  }
997
998
  }