@getstrata/core 0.5.42 → 0.5.43

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.
@@ -0,0 +1,211 @@
1
+ // @bun
2
+ // ../../src/config/app.ts
3
+ var appConfig = {
4
+ name: "WorkHub",
5
+ env: process.env.APP_ENV ?? "local",
6
+ debug: (process.env.APP_DEBUG ?? "true") !== "false",
7
+ url: process.env.APP_URL ?? "http://localhost:3000",
8
+ apiPrefix: process.env.API_PREFIX ?? "/api/v1"
9
+ };
10
+
11
+ // ../../src/core/security/safeUrl.ts
12
+ import { lookup as dnsLookupImpl } from "dns/promises";
13
+
14
+ // ../../src/core/errors/http.ts
15
+ class HttpError extends Error {
16
+ status;
17
+ details;
18
+ constructor(status, message, details) {
19
+ super(message);
20
+ this.name = new.target.name;
21
+ this.status = status;
22
+ this.details = details;
23
+ }
24
+ }
25
+
26
+ class BadRequestError extends HttpError {
27
+ constructor(message = "Bad Request", details) {
28
+ super(400, message, details);
29
+ }
30
+ }
31
+
32
+ class NotFoundError extends HttpError {
33
+ constructor(message = "Not Found", details) {
34
+ super(404, message, details);
35
+ }
36
+ }
37
+
38
+ class ConflictError extends HttpError {
39
+ constructor(message = "Conflict", details) {
40
+ super(409, message, details);
41
+ }
42
+ }
43
+
44
+ class UnprocessableEntityError extends HttpError {
45
+ constructor(message = "Unprocessable Entity", details) {
46
+ super(422, message, details);
47
+ }
48
+ }
49
+
50
+ class ValidationError extends HttpError {
51
+ constructor(message = "Validation failed", details) {
52
+ super(422, message, details);
53
+ }
54
+ }
55
+
56
+ class ForbiddenError extends HttpError {
57
+ constructor(message = "Forbidden", details) {
58
+ super(403, message, details);
59
+ }
60
+ }
61
+
62
+ class UnauthorizedError extends HttpError {
63
+ constructor(message = "Unauthorized", details) {
64
+ super(401, message, details);
65
+ }
66
+ }
67
+
68
+ class PayloadTooLargeError extends HttpError {
69
+ constructor(message = "Payload Too Large", details) {
70
+ super(413, message, details);
71
+ }
72
+ }
73
+
74
+ class PreconditionFailedError extends HttpError {
75
+ constructor(message = "Precondition Failed", details) {
76
+ super(412, message, details);
77
+ }
78
+ }
79
+
80
+ // ../../src/core/security/safeUrl.ts
81
+ var dnsLookup = dnsLookupImpl;
82
+ var BLOCKED_HOSTNAMES = new Set([
83
+ "localhost",
84
+ "127.0.0.1",
85
+ "0.0.0.0",
86
+ "::1",
87
+ "metadata.google.internal"
88
+ ]);
89
+ function isPrivateIpv4(hostname) {
90
+ const match = /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/.exec(hostname);
91
+ if (!match) {
92
+ return false;
93
+ }
94
+ const octets = match.slice(1, 5).map((part) => Number.parseInt(part, 10));
95
+ if (octets.some((octet) => octet < 0 || octet > 255)) {
96
+ return true;
97
+ }
98
+ const [a = 0, b = 0] = octets;
99
+ if (a === 10) {
100
+ return true;
101
+ }
102
+ if (a === 127) {
103
+ return true;
104
+ }
105
+ if (a === 0) {
106
+ return true;
107
+ }
108
+ if (a === 169 && b === 254) {
109
+ return true;
110
+ }
111
+ if (a === 172 && b >= 16 && b <= 31) {
112
+ return true;
113
+ }
114
+ if (a === 192 && b === 168) {
115
+ return true;
116
+ }
117
+ return false;
118
+ }
119
+ function isBlockedHostname(hostname) {
120
+ const normalized = hostname.trim().toLowerCase();
121
+ if (normalized.length === 0) {
122
+ return true;
123
+ }
124
+ if (BLOCKED_HOSTNAMES.has(normalized)) {
125
+ return true;
126
+ }
127
+ if (normalized.endsWith(".local") || normalized.endsWith(".internal")) {
128
+ return true;
129
+ }
130
+ if (normalized.includes(":")) {
131
+ return true;
132
+ }
133
+ return isPrivateIpv4(normalized);
134
+ }
135
+ function assertSafeOutboundUrl(rawUrl, options = {}) {
136
+ let parsed;
137
+ try {
138
+ parsed = new URL(rawUrl);
139
+ } catch {
140
+ throw new BadRequestError("Webhook URL is invalid.");
141
+ }
142
+ if (parsed.protocol !== "https:" && !(options.allowHttp && parsed.protocol === "http:")) {
143
+ throw new BadRequestError("Webhook URL must use HTTPS.");
144
+ }
145
+ if (parsed.username || parsed.password) {
146
+ throw new BadRequestError("Webhook URL must not include credentials.");
147
+ }
148
+ if (isBlockedHostname(parsed.hostname)) {
149
+ throw new BadRequestError("Webhook URL targets a blocked host.");
150
+ }
151
+ return parsed;
152
+ }
153
+ function isBlockedIpAddress(address) {
154
+ return isBlockedHostname(address.trim().toLowerCase());
155
+ }
156
+ async function assertSafeOutboundUrlResolved(rawUrl, options = {}) {
157
+ const parsed = assertSafeOutboundUrl(rawUrl, options);
158
+ if (options.resolveDns === false) {
159
+ return parsed;
160
+ }
161
+ const hostname = parsed.hostname.trim().toLowerCase();
162
+ const results = await dnsLookup(hostname, { all: true, verbatim: true });
163
+ if (results.some((result) => isBlockedIpAddress(result.address))) {
164
+ throw new BadRequestError("Webhook URL targets a blocked host.");
165
+ }
166
+ return parsed;
167
+ }
168
+ function setDnsLookupForTests(lookupFn) {
169
+ dnsLookup = lookupFn;
170
+ }
171
+ function resetDnsLookupForTests() {
172
+ dnsLookup = dnsLookupImpl;
173
+ }
174
+
175
+ // ../../src/core/security/safeFetch.ts
176
+ var DEFAULT_FETCH_TIMEOUT_MS = 1e4;
177
+ async function safeFetch(input, init = {}, options = {}) {
178
+ const timeoutMs = options.timeoutMs ?? DEFAULT_FETCH_TIMEOUT_MS;
179
+ const maxRedirects = options.maxRedirects ?? 0;
180
+ const resolveDns = options.resolveDns ?? appConfig.env === "production";
181
+ const urlOptions = { allowHttp: options.allowHttp, resolveDns };
182
+ const controller = new AbortController;
183
+ const timeout = setTimeout(() => controller.abort(), timeoutMs);
184
+ try {
185
+ let currentUrl = (await assertSafeOutboundUrlResolved(input, urlOptions)).toString();
186
+ let redirectCount = 0;
187
+ while (true) {
188
+ const response = await fetch(currentUrl, {
189
+ ...init,
190
+ signal: controller.signal,
191
+ redirect: "manual"
192
+ });
193
+ if (response.status >= 300 && response.status < 400) {
194
+ const location = response.headers.get("location");
195
+ if (!location || redirectCount >= maxRedirects) {
196
+ return response;
197
+ }
198
+ currentUrl = (await assertSafeOutboundUrlResolved(new URL(location, currentUrl).toString(), urlOptions)).toString();
199
+ redirectCount += 1;
200
+ continue;
201
+ }
202
+ return response;
203
+ }
204
+ } finally {
205
+ clearTimeout(timeout);
206
+ }
207
+ }
208
+ export {
209
+ safeFetch,
210
+ DEFAULT_FETCH_TIMEOUT_MS
211
+ };
@@ -0,0 +1,14 @@
1
+ // @bun
2
+ // ../../src/core/security/timingSafeCompare.ts
3
+ import { timingSafeEqual } from "crypto";
4
+ function timingSafeCompareString(left, right) {
5
+ const leftBuffer = Buffer.from(left);
6
+ const rightBuffer = Buffer.from(right);
7
+ if (leftBuffer.length !== rightBuffer.length) {
8
+ return false;
9
+ }
10
+ return timingSafeEqual(leftBuffer, rightBuffer);
11
+ }
12
+ export {
13
+ timingSafeCompareString
14
+ };
@@ -0,0 +1,116 @@
1
+ // @bun
2
+ // ../../src/core/database/boundConnection.ts
3
+ var boundConnectionHolder = {
4
+ connection: null
5
+ };
6
+ function bindDatabaseConnection(connection) {
7
+ boundConnectionHolder.connection = connection;
8
+ }
9
+ function getBoundDatabaseConnection() {
10
+ return boundConnectionHolder.connection;
11
+ }
12
+ function resetBoundDatabaseConnection() {
13
+ boundConnectionHolder.connection = null;
14
+ }
15
+
16
+ // ../../src/core/runtime/asyncContextStore.ts
17
+ import { AsyncLocalStorage } from "async_hooks";
18
+ function createAsyncContextStore(key) {
19
+ const symbol = Symbol.for(key);
20
+ const globalRecord = globalThis;
21
+ const existing = globalRecord[symbol];
22
+ if (existing) {
23
+ return existing;
24
+ }
25
+ const store = new AsyncLocalStorage;
26
+ globalRecord[symbol] = store;
27
+ return store;
28
+ }
29
+
30
+ // ../../src/core/database/connectionContext.ts
31
+ var activeConnection = createAsyncContextStore("@getstrata/databaseConnectionContext");
32
+ function runWithDatabaseConnection(connection, callback) {
33
+ return activeConnection.run(connection, callback);
34
+ }
35
+ function getActiveDatabaseConnection(fallback) {
36
+ return activeConnection.getStore() ?? fallback;
37
+ }
38
+ function hasActiveDatabaseConnection() {
39
+ return activeConnection.getStore() !== undefined;
40
+ }
41
+
42
+ // ../../src/core/database/queryProxy.ts
43
+ var POOL_CONNECTION_METHODS = new Set(["begin", "close", "connect"]);
44
+ function createDatabaseQueryProxy(pool) {
45
+ function resolveDatabase() {
46
+ return getActiveDatabaseConnection(pool);
47
+ }
48
+ function resolveDatabaseForProperty(property) {
49
+ if (typeof property === "string" && POOL_CONNECTION_METHODS.has(property)) {
50
+ return pool;
51
+ }
52
+ return resolveDatabase();
53
+ }
54
+ return new Proxy(function database() {}, {
55
+ apply(_target, _thisArg, args) {
56
+ return resolveDatabase()(...args);
57
+ },
58
+ get(_target, property) {
59
+ const connection = resolveDatabaseForProperty(property);
60
+ const value = connection[property];
61
+ return typeof value === "function" ? value.bind(connection) : value;
62
+ }
63
+ });
64
+ }
65
+
66
+ // ../../src/core/database/defaultConnection.ts
67
+ var defaultPool = {
68
+ connection: null
69
+ };
70
+ var defaultQuery = {
71
+ connection: null
72
+ };
73
+ function registerDefaultDatabasePool(connection) {
74
+ defaultPool.connection = connection;
75
+ defaultQuery.connection = createDatabaseQueryProxy(connection);
76
+ }
77
+ function getDefaultDatabasePool() {
78
+ if (!defaultPool.connection) {
79
+ throw new Error("Default database pool is not registered. Call registerDefaultDatabasePool() during app bootstrap.");
80
+ }
81
+ return defaultPool.connection;
82
+ }
83
+ function getDefaultDatabaseQuery() {
84
+ if (!defaultQuery.connection) {
85
+ throw new Error("Default database query handle is not registered. Call registerDefaultDatabasePool() during app bootstrap.");
86
+ }
87
+ return defaultQuery.connection;
88
+ }
89
+
90
+ // ../../src/core/database/repositoryConnection.ts
91
+ function resolveRepositoryConnection() {
92
+ return getBoundDatabaseConnection() ?? getDefaultDatabaseQuery();
93
+ }
94
+ var repositoryConnection = new Proxy(function repositoryConnection2() {}, {
95
+ apply(_target, _thisArg, args) {
96
+ return resolveRepositoryConnection()(...args);
97
+ },
98
+ get(_target, property) {
99
+ const connection = resolveRepositoryConnection();
100
+ const value = connection[property];
101
+ return typeof value === "function" ? value.bind(connection) : value;
102
+ }
103
+ });
104
+
105
+ // ../../src/core/tenant/databaseTenantContext.ts
106
+ async function runWithMigrationBypass(callback) {
107
+ await repositoryConnection`SELECT set_config('app.bypass_rls', 'true', false)`;
108
+ try {
109
+ return await callback();
110
+ } finally {
111
+ await repositoryConnection`SELECT set_config('app.bypass_rls', 'false', false)`;
112
+ }
113
+ }
114
+ export {
115
+ runWithMigrationBypass
116
+ };
@@ -2138,6 +2138,45 @@ class Blueprint {
2138
2138
  });
2139
2139
  }
2140
2140
  }
2141
+ // ../../src/core/database/schema/driver.ts
2142
+ function normalizeConnectionName(connection) {
2143
+ const normalized = connection.trim().toLowerCase();
2144
+ if (normalized === "pgsql" || normalized === "postgres" || normalized === "postgresql") {
2145
+ return "pgsql";
2146
+ }
2147
+ if (normalized === "mysql" || normalized === "mariadb") {
2148
+ return "mysql";
2149
+ }
2150
+ if (normalized === "sqlite") {
2151
+ return "sqlite";
2152
+ }
2153
+ throw new Error(`Unsupported DB_CONNECTION: ${connection}`);
2154
+ }
2155
+ function resolveDriverFromUrl(url) {
2156
+ const normalized = url.trim().toLowerCase();
2157
+ if (normalized.startsWith("postgres://") || normalized.startsWith("postgresql://") || normalized.startsWith("postgres:")) {
2158
+ return "pgsql";
2159
+ }
2160
+ if (normalized.startsWith("mysql://") || normalized.startsWith("mysql:")) {
2161
+ return "mysql";
2162
+ }
2163
+ if (normalized.startsWith("sqlite:")) {
2164
+ return "sqlite";
2165
+ }
2166
+ return null;
2167
+ }
2168
+ function resolveDatabaseDriver(options = {}) {
2169
+ const connection = options.connection ?? process.env.DB_CONNECTION;
2170
+ if (connection) {
2171
+ return normalizeConnectionName(connection);
2172
+ }
2173
+ const url = options.url ?? process.env.DATABASE_URL ?? "";
2174
+ const fromUrl = resolveDriverFromUrl(url);
2175
+ if (fromUrl) {
2176
+ return fromUrl;
2177
+ }
2178
+ return "pgsql";
2179
+ }
2141
2180
  // ../../src/core/database/schema/errors.ts
2142
2181
  class UnsupportedSchemaFeatureError extends Error {
2143
2182
  constructor(feature, driver) {
@@ -2482,6 +2521,25 @@ class SchemaBuilder {
2482
2521
  }
2483
2522
  }
2484
2523
  }
2524
+
2525
+ class Schema {
2526
+ static builder(driver) {
2527
+ return new SchemaBuilder(driver ?? resolveDatabaseDriver());
2528
+ }
2529
+ static async run(db, driver, callback) {
2530
+ const schema = Schema.builder(driver);
2531
+ await callback(schema);
2532
+ await schema.execute(db);
2533
+ }
2534
+ }
2535
+ function createSchemaBuilder(db, driver) {
2536
+ const builder = Schema.builder(driver);
2537
+ return Object.assign(builder, {
2538
+ async commit() {
2539
+ await builder.execute(db);
2540
+ }
2541
+ });
2542
+ }
2485
2543
  // ../../src/core/database/table.ts
2486
2544
  function defineTable(definition) {
2487
2545
  return definition;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@getstrata/core",
3
- "version": "0.5.42",
3
+ "version": "0.5.43",
4
4
  "description": "Strata — Laravel-inspired Bun framework public API",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -75,6 +75,11 @@
75
75
  "import": "./dist/entries/auth/policy.js",
76
76
  "default": "./dist/entries/auth/policy.js"
77
77
  },
78
+ "./auth/scimAuthMiddleware": {
79
+ "types": "./dist/core/auth/scimAuthMiddleware.d.ts",
80
+ "import": "./dist/entries/auth/scimAuthMiddleware.js",
81
+ "default": "./dist/entries/auth/scimAuthMiddleware.js"
82
+ },
78
83
  "./auth/sessionCookie": {
79
84
  "types": "./dist/core/auth/sessionCookie.d.ts",
80
85
  "import": "./dist/entries/auth/sessionCookie.js",
@@ -95,6 +100,21 @@
95
100
  "import": "./dist/entries/audit/exportAuditLogs.js",
96
101
  "default": "./dist/entries/audit/exportAuditLogs.js"
97
102
  },
103
+ "./audit/siemFormatter": {
104
+ "types": "./dist/core/audit/siemFormatter.d.ts",
105
+ "import": "./dist/entries/audit/siemFormatter.js",
106
+ "default": "./dist/entries/audit/siemFormatter.js"
107
+ },
108
+ "./admin/formatValue": {
109
+ "types": "./dist/core/admin/formatValue.d.ts",
110
+ "import": "./dist/entries/admin/formatValue.js",
111
+ "default": "./dist/entries/admin/formatValue.js"
112
+ },
113
+ "./admin/registry": {
114
+ "types": "./dist/core/admin/registry.d.ts",
115
+ "import": "./dist/entries/admin/registry.js",
116
+ "default": "./dist/entries/admin/registry.js"
117
+ },
98
118
  "./cache/tags": {
99
119
  "types": "./dist/core/cache/tags.d.ts",
100
120
  "import": "./dist/entries/cache/tags.js",
@@ -205,6 +225,11 @@
205
225
  "import": "./dist/entries/database/seeders.js",
206
226
  "default": "./dist/entries/database/seeders.js"
207
227
  },
228
+ "./database/schema": {
229
+ "types": "./dist/core/database/schema/index.d.ts",
230
+ "import": "./dist/entries/database/schema.js",
231
+ "default": "./dist/entries/database/schema.js"
232
+ },
208
233
  "./database/table": {
209
234
  "types": "./dist/core/database/table.d.ts",
210
235
  "import": "./dist/entries/database/table.js",
@@ -345,16 +370,46 @@
345
370
  "import": "./dist/entries/logging/logger.js",
346
371
  "default": "./dist/entries/logging/logger.js"
347
372
  },
373
+ "./mail/mailer": {
374
+ "types": "./dist/core/mail/mailer.d.ts",
375
+ "import": "./dist/entries/mail/mailer.js",
376
+ "default": "./dist/entries/mail/mailer.js"
377
+ },
378
+ "./mail/markdownMail": {
379
+ "types": "./dist/core/mail/markdownMail.d.ts",
380
+ "import": "./dist/entries/mail/markdownMail.js",
381
+ "default": "./dist/entries/mail/markdownMail.js"
382
+ },
383
+ "./mail/markdownMailable": {
384
+ "types": "./dist/core/mail/markdownMailable.d.ts",
385
+ "import": "./dist/entries/mail/markdownMailable.js",
386
+ "default": "./dist/entries/mail/markdownMailable.js"
387
+ },
348
388
  "./metrics/prometheus": {
349
389
  "types": "./dist/core/metrics/prometheus.d.ts",
350
390
  "import": "./dist/entries/metrics/prometheus.js",
351
391
  "default": "./dist/entries/metrics/prometheus.js"
352
392
  },
393
+ "./notifications": {
394
+ "types": "./dist/core/notifications/index.d.ts",
395
+ "import": "./dist/entries/notifications.js",
396
+ "default": "./dist/entries/notifications.js"
397
+ },
398
+ "./openapi/generator": {
399
+ "types": "./dist/core/openapi/generator.d.ts",
400
+ "import": "./dist/entries/openapi/generator.js",
401
+ "default": "./dist/entries/openapi/generator.js"
402
+ },
353
403
  "./openapi/registeredRoute": {
354
404
  "types": "./dist/core/openapi/registeredRoute.d.ts",
355
405
  "import": "./dist/entries/openapi/registeredRoute.js",
356
406
  "default": "./dist/entries/openapi/registeredRoute.js"
357
407
  },
408
+ "./openapi/validate": {
409
+ "types": "./dist/core/openapi/validate.d.ts",
410
+ "import": "./dist/entries/openapi/validate.js",
411
+ "default": "./dist/entries/openapi/validate.js"
412
+ },
358
413
  "./pagination": {
359
414
  "types": "./dist/core/pagination/index.d.ts",
360
415
  "import": "./dist/entries/pagination.js",
@@ -415,6 +470,11 @@
415
470
  "import": "./dist/entries/runtime/applicationRegistry.js",
416
471
  "default": "./dist/entries/runtime/applicationRegistry.js"
417
472
  },
473
+ "./runtime/asyncContextStore": {
474
+ "types": "./dist/core/runtime/asyncContextStore.d.ts",
475
+ "import": "./dist/entries/runtime/asyncContextStore.js",
476
+ "default": "./dist/entries/runtime/asyncContextStore.js"
477
+ },
418
478
  "./scheduler/schedule": {
419
479
  "types": "./dist/core/scheduler/schedule.d.ts",
420
480
  "import": "./dist/entries/scheduler/schedule.js",
@@ -430,6 +490,11 @@
430
490
  "import": "./dist/entries/security/publicReads.js",
431
491
  "default": "./dist/entries/security/publicReads.js"
432
492
  },
493
+ "./security/safeFetch": {
494
+ "types": "./dist/core/security/safeFetch.d.ts",
495
+ "import": "./dist/entries/security/safeFetch.js",
496
+ "default": "./dist/entries/security/safeFetch.js"
497
+ },
433
498
  "./security/safeUrl": {
434
499
  "types": "./dist/core/security/safeUrl.d.ts",
435
500
  "import": "./dist/entries/security/safeUrl.js",
@@ -450,6 +515,11 @@
450
515
  "import": "./dist/entries/security/stripeWebhook.js",
451
516
  "default": "./dist/entries/security/stripeWebhook.js"
452
517
  },
518
+ "./security/timingSafeCompare": {
519
+ "types": "./dist/core/security/timingSafeCompare.d.ts",
520
+ "import": "./dist/entries/security/timingSafeCompare.js",
521
+ "default": "./dist/entries/security/timingSafeCompare.js"
522
+ },
453
523
  "./security/tokenExpiry": {
454
524
  "types": "./dist/core/security/tokenExpiry.d.ts",
455
525
  "import": "./dist/entries/security/tokenExpiry.js",
@@ -475,6 +545,11 @@
475
545
  "import": "./dist/entries/tenant/tenantDatabaseScope.js",
476
546
  "default": "./dist/entries/tenant/tenantDatabaseScope.js"
477
547
  },
548
+ "./tenant/databaseTenantContext": {
549
+ "types": "./dist/core/tenant/databaseTenantContext.d.ts",
550
+ "import": "./dist/entries/tenant/databaseTenantContext.js",
551
+ "default": "./dist/entries/tenant/databaseTenantContext.js"
552
+ },
478
553
  "./tenant/tenantMiddleware": {
479
554
  "types": "./dist/core/tenant/tenantMiddleware.d.ts",
480
555
  "import": "./dist/entries/tenant/tenantMiddleware.js",
@@ -507,7 +582,7 @@
507
582
  "build:bundle": "bun build index.ts --outdir dist --target bun --external bun --external eta",
508
583
  "build:types": "tsc -p tsconfig.types.json",
509
584
  "prepublishOnly": "bun run build && bun ../../scripts/prepare-core-package-publish.ts",
510
- "build:subpaths": "bun build entries/auth/oauth/oidcProvider.ts entries/auth/oauth/providers.ts entries/auth/oauth/samlProvider.ts entries/auth/oauth/types.ts entries/auth/password.ts entries/auth/sessionCookie.ts entries/auth/sessionGuard.ts entries/auth/tokenHash.ts entries/audit/exportAuditLogs.ts entries/cache/tags.ts entries/cache/createCacheStore.ts entries/cache/repository.ts entries/cache/simpleCache.ts entries/cache/simpleCacheStore.ts entries/config/envSchema.ts entries/contracts/serviceTokens.ts entries/contracts/container.ts entries/contracts/di.ts entries/crypto/fieldEncryption.ts entries/crypto/mfaSecret.ts entries/database/baseRepository.ts entries/database/bindConnection.ts entries/database/boundConnection.ts entries/database/connection.ts entries/database/errors.ts entries/database/factory.ts entries/database/model.ts entries/database/query.ts entries/database/relationships.ts entries/database/seeders.ts entries/database/table.ts entries/database/transaction.ts entries/database/types.ts entries/errors/http.ts entries/http/authMiddleware.ts entries/http/authorizeMiddleware.ts entries/http/bodySizeLimitMiddleware.ts entries/http/cookies.ts entries/http/csrfProtection.ts entries/http/contentNegotiation.ts entries/http/csrfToken.ts entries/http/etag.ts entries/http/flashSession.ts entries/http/metricsMiddleware.ts entries/http/parseFormBody.ts entries/http/parseMultipartUpload.ts entries/http/resources.ts entries/http/securedRouteModelBinding.ts entries/http/webErrorResponse.ts entries/http/webFormRequest.ts entries/jobs/dispatchWebhookJob.ts entries/jobs/invalidateCacheTagsJob.ts entries/lifecycle/gracefulShutdown.ts entries/logging/logger.ts entries/metrics/prometheus.ts entries/openapi/registeredRoute.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/scheduler/schedule.ts entries/security/oauthState.ts entries/security/publicReads.ts entries/security/safeUrl.ts entries/security/scimTenantTokens.ts entries/security/stripeWebhook.ts entries/security/tokenExpiry.ts entries/security/totp.ts entries/storage/storage.ts entries/tenant/tenantDatabaseScope.ts entries/validation/rules.ts entries/view.ts --outdir dist --root . --target bun --external bun --external eta",
585
+ "build:subpaths": "bun build entries/auth/oauth/oidcProvider.ts entries/auth/oauth/providers.ts entries/auth/oauth/samlProvider.ts entries/auth/oauth/types.ts entries/auth/password.ts entries/auth/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/cache/tags.ts entries/cache/createCacheStore.ts entries/cache/repository.ts entries/cache/simpleCache.ts entries/cache/simpleCacheStore.ts entries/config/envSchema.ts entries/contracts/serviceTokens.ts entries/contracts/container.ts entries/contracts/di.ts entries/crypto/fieldEncryption.ts entries/crypto/mfaSecret.ts entries/database/baseRepository.ts entries/database/bindConnection.ts entries/database/boundConnection.ts entries/database/connection.ts entries/database/errors.ts entries/database/factory.ts entries/database/model.ts entries/database/query.ts entries/database/relationships.ts entries/database/seeders.ts entries/database/schema.ts entries/database/table.ts entries/database/transaction.ts entries/database/types.ts entries/errors/http.ts entries/http/authMiddleware.ts entries/http/authorizeMiddleware.ts entries/http/bodySizeLimitMiddleware.ts entries/http/cookies.ts entries/http/csrfProtection.ts entries/http/contentNegotiation.ts entries/http/csrfToken.ts entries/http/etag.ts entries/http/flashSession.ts entries/http/metricsMiddleware.ts entries/http/parseFormBody.ts entries/http/parseMultipartUpload.ts entries/http/resources.ts entries/http/securedRouteModelBinding.ts entries/http/webErrorResponse.ts entries/http/webFormRequest.ts entries/jobs/dispatchWebhookJob.ts entries/jobs/invalidateCacheTagsJob.ts entries/lifecycle/gracefulShutdown.ts entries/logging/logger.ts entries/mail/mailer.ts entries/mail/markdownMail.ts entries/mail/markdownMailable.ts entries/metrics/prometheus.ts entries/notifications.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/asyncContextStore.ts entries/scheduler/schedule.ts entries/security/oauthState.ts entries/security/publicReads.ts entries/security/safeFetch.ts entries/security/safeUrl.ts entries/security/scimTenantTokens.ts entries/security/stripeWebhook.ts entries/security/timingSafeCompare.ts entries/security/tokenExpiry.ts entries/security/totp.ts entries/storage/storage.ts entries/tenant/tenantDatabaseScope.ts entries/tenant/databaseTenantContext.ts entries/validation/rules.ts entries/view.ts --outdir dist --root . --target bun --external bun --external eta",
511
586
  "build:shims": "bun ../../scripts/write-core-shared-shims.ts"
512
587
  },
513
588
  "publishConfig": {