@getstrata/core 1.0.0 → 1.0.2
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 +52 -33
- package/README.md +36 -43
- package/dist/core/database/baseRepository.d.ts +2 -1
- package/dist/core/database/dialect.d.ts +5 -1
- package/dist/core/database/errors.d.ts +4 -0
- package/dist/core/database/mysqlConnection.d.ts +3 -1
- package/dist/core/errors/http.d.ts +4 -1
- package/dist/core/http/clientIp.d.ts +6 -3
- package/dist/core/http/webErrorResponse.d.ts +3 -1
- package/dist/core/runtime/appEnv.d.ts +4 -0
- package/dist/core/tenant/tenancyConfig.d.ts +1 -0
- package/dist/entries/audit/exportAuditLogs.js +7 -5
- package/dist/entries/auth/scimAuthMiddleware.js +7 -5
- package/dist/entries/contracts/authUserDirectory.js +1 -0
- package/dist/entries/database/errors.js +45 -6
- package/dist/entries/database/mysqlConnection.js +18 -2
- package/dist/entries/database/sqliteConnection.js +5 -0
- package/dist/entries/http/clientIp.js +24 -6
- package/dist/entries/http/corsMiddleware.js +14 -3
- package/dist/entries/http/loginThrottleMiddleware.js +25 -8
- package/dist/entries/http/memoryThrottleMiddleware.js +25 -8
- package/dist/entries/http/response.js +66 -7
- package/dist/entries/http/scimThrottleMiddleware.js +23 -6
- package/dist/entries/http/throttleMiddleware.js +25 -8
- package/dist/entries/http/webErrorResponse.js +66 -7
- package/dist/entries/jobs/exportAuditLogsJob.js +7 -5
- package/dist/entries/logging/requestLoggingMiddleware.js +29 -10
- package/dist/entries/openapi/generator.js +1 -1
- package/dist/entries/runtime/appEnv.js +8 -0
- package/dist/entries/tenant/databaseTenantContext.js +7 -5
- package/dist/entries/tenant/tenancyConfig.js +7 -5
- package/dist/entries/tenant/tenantDatabaseScope.js +7 -5
- package/dist/framework/public-api.d.ts +3 -3
- package/dist/index.js +161 -39
- package/package.json +16 -3
|
@@ -3,14 +3,16 @@
|
|
|
3
3
|
import { repositoryConnection as db } from "@getstrata/core/database/repositoryConnection";
|
|
4
4
|
|
|
5
5
|
// ../../src/core/tenant/tenancyConfig.ts
|
|
6
|
+
var TENANCY_DRIVERS = ["rls", "column", "none"];
|
|
6
7
|
function readTenancyDriver(env = process.env) {
|
|
7
|
-
|
|
8
|
-
|
|
8
|
+
const raw = env.TENANCY_DRIVER?.trim();
|
|
9
|
+
if (raw === undefined || raw === "") {
|
|
10
|
+
return "rls";
|
|
9
11
|
}
|
|
10
|
-
if (
|
|
11
|
-
return
|
|
12
|
+
if (TENANCY_DRIVERS.includes(raw)) {
|
|
13
|
+
return raw;
|
|
12
14
|
}
|
|
13
|
-
|
|
15
|
+
throw new Error(`TENANCY_DRIVER must be one of ${TENANCY_DRIVERS.join(", ")}; received "${raw}".`);
|
|
14
16
|
}
|
|
15
17
|
function isTenancyEnabled(env = process.env) {
|
|
16
18
|
return readTenancyDriver(env) !== "none";
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
// @bun
|
|
2
2
|
// ../../src/core/tenant/tenancyConfig.ts
|
|
3
|
+
var TENANCY_DRIVERS = ["rls", "column", "none"];
|
|
3
4
|
function readTenancyDriver(env = process.env) {
|
|
4
|
-
|
|
5
|
-
|
|
5
|
+
const raw = env.TENANCY_DRIVER?.trim();
|
|
6
|
+
if (raw === undefined || raw === "") {
|
|
7
|
+
return "rls";
|
|
6
8
|
}
|
|
7
|
-
if (
|
|
8
|
-
return
|
|
9
|
+
if (TENANCY_DRIVERS.includes(raw)) {
|
|
10
|
+
return raw;
|
|
9
11
|
}
|
|
10
|
-
|
|
12
|
+
throw new Error(`TENANCY_DRIVER must be one of ${TENANCY_DRIVERS.join(", ")}; received "${raw}".`);
|
|
11
13
|
}
|
|
12
14
|
function isTenancyEnabled(env = process.env) {
|
|
13
15
|
return readTenancyDriver(env) !== "none";
|
|
@@ -29,14 +29,16 @@ function hasActiveDatabaseConnection() {
|
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
// ../../src/core/tenant/tenancyConfig.ts
|
|
32
|
+
var TENANCY_DRIVERS = ["rls", "column", "none"];
|
|
32
33
|
function readTenancyDriver(env = process.env) {
|
|
33
|
-
|
|
34
|
-
|
|
34
|
+
const raw = env.TENANCY_DRIVER?.trim();
|
|
35
|
+
if (raw === undefined || raw === "") {
|
|
36
|
+
return "rls";
|
|
35
37
|
}
|
|
36
|
-
if (
|
|
37
|
-
return
|
|
38
|
+
if (TENANCY_DRIVERS.includes(raw)) {
|
|
39
|
+
return raw;
|
|
38
40
|
}
|
|
39
|
-
|
|
41
|
+
throw new Error(`TENANCY_DRIVER must be one of ${TENANCY_DRIVERS.join(", ")}; received "${raw}".`);
|
|
40
42
|
}
|
|
41
43
|
function isTenancyEnabled(env = process.env) {
|
|
42
44
|
return readTenancyDriver(env) !== "none";
|
|
@@ -35,7 +35,7 @@ export { createDatabaseConnection } from "../core/database/connection.ts";
|
|
|
35
35
|
export { getActiveDatabaseConnection, hasActiveDatabaseConnection, runWithDatabaseConnection, } from "../core/database/connectionContext.ts";
|
|
36
36
|
export { getDefaultDatabasePool, getDefaultDatabaseQuery, registerDefaultDatabasePool, } from "../core/database/defaultConnection.ts";
|
|
37
37
|
export type { SqlDialect } from "../core/database/dialect.ts";
|
|
38
|
-
export { currentSqlDialect, dialectFor, resetSqlDialect, runWithSqlDialect, useSqlDialect, } from "../core/database/dialect.ts";
|
|
38
|
+
export { currentSqlDialect, dialectFor, resetSqlDialect, runWithSqlDialect, sqlTimestamp, useSqlDialect, } from "../core/database/dialect.ts";
|
|
39
39
|
export { Factory } from "../core/database/factory.ts";
|
|
40
40
|
export { foreignKeyFromTable, pivotTableName, singularize } from "../core/database/inflection.ts";
|
|
41
41
|
export { withMigrationLock } from "../core/database/migrations/advisoryLock.ts";
|
|
@@ -43,7 +43,7 @@ export { freshDatabase, getMigrationStatus, loadMigrationsFromDirectory, migrate
|
|
|
43
43
|
export type { Migration, MigrationDatabase, MigrationStatus, } from "../core/database/migrations/types.ts";
|
|
44
44
|
export type { CastType, GlobalScopeFn, ModelConstructor } from "../core/database/model.ts";
|
|
45
45
|
export { applyCasts, BelongsToManyRelationQuery, BelongsToRelationQuery, dehydrateValue, filterMassAssignable, HasManyRelationQuery, HasOneRelationQuery, hydrateValue, Model, ModelQuery, MorphManyRelationQuery, MorphOneRelationQuery, MorphToRelationQuery, registerModelClass, registerModelRepository, } from "../core/database/model.ts";
|
|
46
|
-
export { createMysqlConnection, createMysqlConnectionFromPool, } from "../core/database/mysqlConnection.ts";
|
|
46
|
+
export { createMysqlConnection, createMysqlConnectionFromPool, createMysqlPool, } from "../core/database/mysqlConnection.ts";
|
|
47
47
|
export { getNamedConnection, hasNamedConnection, registerNamedConnection, resetNamedConnections, runOnNamedConnection, unregisterNamedConnection, } from "../core/database/namedConnections.ts";
|
|
48
48
|
export { createDatabaseQueryProxy } from "../core/database/queryProxy.ts";
|
|
49
49
|
export type { BelongsToManyRelation, BelongsToRelation, HasManyRelation, HasOneRelation, MorphManyRelation, MorphOneRelation, MorphToRelation, } from "../core/database/relationships.ts";
|
|
@@ -60,7 +60,7 @@ export { runInTransaction } from "../core/database/transaction.ts";
|
|
|
60
60
|
export type { QueryJoin, QueryJoinOn, QueryOptions, QueryOrder, QuerySelectItem, QueryWhere, } from "../core/database/types.ts";
|
|
61
61
|
export type { WhereNode } from "../core/database/whereBuilder.ts";
|
|
62
62
|
export { WhereBuilder } from "../core/database/whereBuilder.ts";
|
|
63
|
-
export { BadRequestError, ConflictError, ForbiddenError, HttpError, isHttpErrorLike, NotFoundError, PayloadTooLargeError, PreconditionFailedError, toHttpError, UnauthorizedError, UnprocessableEntityError, ValidationError, } from "../core/errors/http.ts";
|
|
63
|
+
export { BadRequestError, ConflictError, ForbiddenError, HttpError, InternalServerError, isHttpErrorLike, NotFoundError, PayloadTooLargeError, PreconditionFailedError, toHttpError, UnauthorizedError, UnprocessableEntityError, ValidationError, } from "../core/errors/http.ts";
|
|
64
64
|
export type { EventListener } from "../core/events/eventBus.ts";
|
|
65
65
|
export { EventBus, eventBus } from "../core/events/eventBus.ts";
|
|
66
66
|
export { modelEventName } from "../core/events/index.ts";
|
package/dist/index.js
CHANGED
|
@@ -120,6 +120,12 @@ class PreconditionFailedError extends HttpError {
|
|
|
120
120
|
super(412, message, details);
|
|
121
121
|
}
|
|
122
122
|
}
|
|
123
|
+
|
|
124
|
+
class InternalServerError extends HttpError {
|
|
125
|
+
constructor(message = "Internal server error.", details) {
|
|
126
|
+
super(500, message, details);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
123
129
|
function isHttpErrorLike(error) {
|
|
124
130
|
if (typeof error !== "object" || error === null) {
|
|
125
131
|
return false;
|
|
@@ -1156,14 +1162,16 @@ var repositoryConnection = new Proxy(function repositoryConnection() {}, {
|
|
|
1156
1162
|
});
|
|
1157
1163
|
|
|
1158
1164
|
// ../../src/core/tenant/tenancyConfig.ts
|
|
1165
|
+
var TENANCY_DRIVERS = ["rls", "column", "none"];
|
|
1159
1166
|
function readTenancyDriver(env = process.env) {
|
|
1160
|
-
|
|
1161
|
-
|
|
1167
|
+
const raw = env.TENANCY_DRIVER?.trim();
|
|
1168
|
+
if (raw === undefined || raw === "") {
|
|
1169
|
+
return "rls";
|
|
1162
1170
|
}
|
|
1163
|
-
if (
|
|
1164
|
-
return
|
|
1171
|
+
if (TENANCY_DRIVERS.includes(raw)) {
|
|
1172
|
+
return raw;
|
|
1165
1173
|
}
|
|
1166
|
-
|
|
1174
|
+
throw new Error(`TENANCY_DRIVER must be one of ${TENANCY_DRIVERS.join(", ")}; received "${raw}".`);
|
|
1167
1175
|
}
|
|
1168
1176
|
function isTenancyEnabled(env = process.env) {
|
|
1169
1177
|
return readTenancyDriver(env) !== "none";
|
|
@@ -1864,14 +1872,55 @@ function getPostgresSqlState(error) {
|
|
|
1864
1872
|
}
|
|
1865
1873
|
return;
|
|
1866
1874
|
}
|
|
1875
|
+
var MYSQL_ERRNO_MESSAGES = {
|
|
1876
|
+
1062: () => new ConflictError("A record with these values already exists."),
|
|
1877
|
+
1451: () => new UnprocessableEntityError("Record is still referenced by other records."),
|
|
1878
|
+
1452: () => new UnprocessableEntityError("Referenced record does not exist."),
|
|
1879
|
+
1048: () => new BadRequestError("Required field is missing."),
|
|
1880
|
+
3819: () => new BadRequestError("Value violates a database constraint.")
|
|
1881
|
+
};
|
|
1882
|
+
function mapSqliteError(error) {
|
|
1883
|
+
const code = typeof error.code === "string" ? error.code : "";
|
|
1884
|
+
if (!code.startsWith("SQLITE_")) {
|
|
1885
|
+
return null;
|
|
1886
|
+
}
|
|
1887
|
+
if (code === "SQLITE_CONSTRAINT_UNIQUE" || code === "SQLITE_CONSTRAINT_PRIMARYKEY") {
|
|
1888
|
+
return new ConflictError("A record with these values already exists.");
|
|
1889
|
+
}
|
|
1890
|
+
if (code === "SQLITE_CONSTRAINT_FOREIGNKEY") {
|
|
1891
|
+
return new UnprocessableEntityError("Referenced record does not exist.");
|
|
1892
|
+
}
|
|
1893
|
+
if (code === "SQLITE_CONSTRAINT_NOTNULL") {
|
|
1894
|
+
return new BadRequestError("Required field is missing.");
|
|
1895
|
+
}
|
|
1896
|
+
if (code.startsWith("SQLITE_CONSTRAINT")) {
|
|
1897
|
+
return new BadRequestError("Value violates a database constraint.");
|
|
1898
|
+
}
|
|
1899
|
+
return new InternalServerError("Database operation failed.");
|
|
1900
|
+
}
|
|
1901
|
+
function mapMysqlError(error) {
|
|
1902
|
+
const code = typeof error.code === "string" ? error.code : "";
|
|
1903
|
+
if (!code.startsWith("ER_")) {
|
|
1904
|
+
return null;
|
|
1905
|
+
}
|
|
1906
|
+
const factory = typeof error.errno === "number" ? MYSQL_ERRNO_MESSAGES[error.errno] : undefined;
|
|
1907
|
+
return factory ? factory() : new InternalServerError("Database operation failed.");
|
|
1908
|
+
}
|
|
1867
1909
|
function mapDatabaseError(error) {
|
|
1868
1910
|
const httpError = toHttpError(error);
|
|
1869
1911
|
if (httpError) {
|
|
1870
1912
|
return httpError;
|
|
1871
1913
|
}
|
|
1872
1914
|
if (!isPostgresError(error)) {
|
|
1873
|
-
|
|
1874
|
-
|
|
1915
|
+
return new InternalServerError;
|
|
1916
|
+
}
|
|
1917
|
+
const sqlite = mapSqliteError(error);
|
|
1918
|
+
if (sqlite) {
|
|
1919
|
+
return sqlite;
|
|
1920
|
+
}
|
|
1921
|
+
const mysql = mapMysqlError(error);
|
|
1922
|
+
if (mysql) {
|
|
1923
|
+
return mysql;
|
|
1875
1924
|
}
|
|
1876
1925
|
const sqlState = getPostgresSqlState(error);
|
|
1877
1926
|
switch (sqlState) {
|
|
@@ -1892,10 +1941,7 @@ function mapDatabaseError(error) {
|
|
|
1892
1941
|
constraint: error.constraint
|
|
1893
1942
|
});
|
|
1894
1943
|
default:
|
|
1895
|
-
return new
|
|
1896
|
-
code: error.code,
|
|
1897
|
-
sqlState
|
|
1898
|
-
});
|
|
1944
|
+
return new InternalServerError("Database operation failed.");
|
|
1899
1945
|
}
|
|
1900
1946
|
}
|
|
1901
1947
|
async function withDatabaseErrorHandling(operation) {
|
|
@@ -1964,6 +2010,9 @@ var postgresDialect = {
|
|
|
1964
2010
|
nowExpression() {
|
|
1965
2011
|
return "NOW()";
|
|
1966
2012
|
},
|
|
2013
|
+
timestampValue(value) {
|
|
2014
|
+
return value.toISOString();
|
|
2015
|
+
},
|
|
1967
2016
|
returningClause(columns) {
|
|
1968
2017
|
return ` RETURNING ${columns}`;
|
|
1969
2018
|
},
|
|
@@ -1988,6 +2037,9 @@ var mysqlDialect = {
|
|
|
1988
2037
|
nowExpression() {
|
|
1989
2038
|
return "CURRENT_TIMESTAMP";
|
|
1990
2039
|
},
|
|
2040
|
+
timestampValue(value) {
|
|
2041
|
+
return value.toISOString().slice(0, 19).replace("T", " ");
|
|
2042
|
+
},
|
|
1991
2043
|
returningClause() {
|
|
1992
2044
|
return "";
|
|
1993
2045
|
},
|
|
@@ -2010,7 +2062,10 @@ var sqliteDialect = {
|
|
|
2010
2062
|
return `"${assertSafeIdentifier(identifier)}"`;
|
|
2011
2063
|
},
|
|
2012
2064
|
nowExpression() {
|
|
2013
|
-
return "
|
|
2065
|
+
return "strftime('%Y-%m-%dT%H:%M:%fZ', 'now')";
|
|
2066
|
+
},
|
|
2067
|
+
timestampValue(value) {
|
|
2068
|
+
return value.toISOString();
|
|
2014
2069
|
},
|
|
2015
2070
|
returningClause(columns) {
|
|
2016
2071
|
return ` RETURNING ${columns}`;
|
|
@@ -2042,6 +2097,9 @@ function useSqlDialect(driver) {
|
|
|
2042
2097
|
dialectOverride = dialectFor(driver);
|
|
2043
2098
|
return dialectOverride;
|
|
2044
2099
|
}
|
|
2100
|
+
function sqlTimestamp(value = new Date) {
|
|
2101
|
+
return currentSqlDialect().timestampValue(value);
|
|
2102
|
+
}
|
|
2045
2103
|
function resetSqlDialect() {
|
|
2046
2104
|
dialectOverride = null;
|
|
2047
2105
|
}
|
|
@@ -5177,11 +5235,26 @@ function createMysqlConnectionFromPool(pool) {
|
|
|
5177
5235
|
}
|
|
5178
5236
|
};
|
|
5179
5237
|
}
|
|
5238
|
+
var MYSQL_SESSION_UTC = "SET time_zone = '+00:00'";
|
|
5239
|
+
function pinSessionToUtc(connection) {
|
|
5240
|
+
connection.query(MYSQL_SESSION_UTC, (error) => {
|
|
5241
|
+
if (error) {
|
|
5242
|
+
console.warn(`[mysql] Could not set the session time zone to UTC; DATETIME comparisons may drift: ${error instanceof Error ? error.message : String(error)}`);
|
|
5243
|
+
}
|
|
5244
|
+
});
|
|
5245
|
+
}
|
|
5246
|
+
function createMysqlPool(url) {
|
|
5247
|
+
const pool = mysql.createPool({ uri: url, timezone: "Z" });
|
|
5248
|
+
pool.on("connection", (connection) => {
|
|
5249
|
+
pinSessionToUtc(connection);
|
|
5250
|
+
});
|
|
5251
|
+
return pool;
|
|
5252
|
+
}
|
|
5180
5253
|
function createMysqlConnection(url) {
|
|
5181
5254
|
if (!url.trim()) {
|
|
5182
5255
|
throw new Error("MYSQL_URL is not configured. Set url before creating a MySQL pool.");
|
|
5183
5256
|
}
|
|
5184
|
-
return createMysqlConnectionFromPool(
|
|
5257
|
+
return createMysqlConnectionFromPool(createMysqlPool(url));
|
|
5185
5258
|
}
|
|
5186
5259
|
// ../../src/core/database/namedConnections.ts
|
|
5187
5260
|
var REGISTRY_KEY = Symbol.for("@getstrata/namedConnections");
|
|
@@ -5845,6 +5918,11 @@ function createSqliteConnection(filename) {
|
|
|
5845
5918
|
}
|
|
5846
5919
|
const db = new Database(filename, { create: true });
|
|
5847
5920
|
db.exec("PRAGMA foreign_keys = ON");
|
|
5921
|
+
db.exec("PRAGMA busy_timeout = 5000");
|
|
5922
|
+
if (filename !== ":memory:") {
|
|
5923
|
+
db.exec("PRAGMA journal_mode = WAL");
|
|
5924
|
+
db.exec("PRAGMA synchronous = NORMAL");
|
|
5925
|
+
}
|
|
5848
5926
|
return {
|
|
5849
5927
|
async unsafe(query, params = []) {
|
|
5850
5928
|
const statement = db.query(query);
|
|
@@ -6257,20 +6335,48 @@ function createBodySizeLimitMiddleware(maxBytes = resolveMaxBodyBytes()) {
|
|
|
6257
6335
|
return await next();
|
|
6258
6336
|
};
|
|
6259
6337
|
}
|
|
6338
|
+
// ../../src/core/http/requestMetaContext.ts
|
|
6339
|
+
var requestMetaContext = createAsyncContextStore("@getstrata/requestMetaContext");
|
|
6340
|
+
function runWithRequestMeta(meta, callback) {
|
|
6341
|
+
return requestMetaContext.run(meta, callback);
|
|
6342
|
+
}
|
|
6343
|
+
function currentRequestMeta() {
|
|
6344
|
+
return requestMetaContext.getStore() ?? {
|
|
6345
|
+
ipAddress: null,
|
|
6346
|
+
userAgent: null
|
|
6347
|
+
};
|
|
6348
|
+
}
|
|
6349
|
+
|
|
6260
6350
|
// ../../src/core/http/clientIp.ts
|
|
6261
6351
|
function trustForwardedFor(env = process.env) {
|
|
6262
6352
|
return (env.TRUST_FORWARDED_FOR ?? "false") === "true";
|
|
6263
6353
|
}
|
|
6264
|
-
function
|
|
6265
|
-
|
|
6266
|
-
|
|
6354
|
+
function isPrivateAddress(address) {
|
|
6355
|
+
const ip = address.replace(/^::ffff:/i, "");
|
|
6356
|
+
return ip === "::1" || ip === "localhost" || /^127\./.test(ip) || /^10\./.test(ip) || /^192\.168\./.test(ip) || /^172\.(1[6-9]|2\d|3[01])\./.test(ip) || /^169\.254\./.test(ip) || /^f[cd][0-9a-f]{2}:/i.test(ip) || /^fe80:/i.test(ip);
|
|
6357
|
+
}
|
|
6358
|
+
function forwardedClientIp(request) {
|
|
6359
|
+
const hops = (request.headers.get("x-forwarded-for") ?? "").split(",").map((hop) => hop.trim()).filter(Boolean);
|
|
6360
|
+
for (let index = hops.length - 1;index >= 0; index -= 1) {
|
|
6361
|
+
const hop = hops[index];
|
|
6362
|
+
if (hop && !isPrivateAddress(hop)) {
|
|
6363
|
+
return hop;
|
|
6364
|
+
}
|
|
6267
6365
|
}
|
|
6268
|
-
|
|
6269
|
-
|
|
6270
|
-
return forwarded;
|
|
6366
|
+
if (hops.length > 0) {
|
|
6367
|
+
return hops[hops.length - 1];
|
|
6271
6368
|
}
|
|
6272
6369
|
return request.headers.get("x-real-ip")?.trim() || undefined;
|
|
6273
6370
|
}
|
|
6371
|
+
function readClientIp(request, env = process.env) {
|
|
6372
|
+
if (trustForwardedFor(env)) {
|
|
6373
|
+
const forwarded = forwardedClientIp(request);
|
|
6374
|
+
if (forwarded) {
|
|
6375
|
+
return forwarded;
|
|
6376
|
+
}
|
|
6377
|
+
}
|
|
6378
|
+
return currentRequestMeta().ipAddress ?? undefined;
|
|
6379
|
+
}
|
|
6274
6380
|
// ../../src/core/crypto/nonCryptographicHash.ts
|
|
6275
6381
|
function nonCryptographicDigest(input) {
|
|
6276
6382
|
return Bun.hash(input).toString(16);
|
|
@@ -6572,10 +6678,18 @@ function readRequestCookie(request, name) {
|
|
|
6572
6678
|
function readBunRequestCookie(request, name) {
|
|
6573
6679
|
return request.cookies.get(name) ?? readRequestCookie(request, name);
|
|
6574
6680
|
}
|
|
6681
|
+
// ../../src/core/runtime/appEnv.ts
|
|
6682
|
+
function isProductionEnv(env = process.env) {
|
|
6683
|
+
return env.APP_ENV === "production" || env.NODE_ENV === "production";
|
|
6684
|
+
}
|
|
6685
|
+
|
|
6575
6686
|
// ../../src/core/http/corsMiddleware.ts
|
|
6687
|
+
function defaultAllowedOrigins() {
|
|
6688
|
+
return isProductionEnv() ? "" : "*";
|
|
6689
|
+
}
|
|
6576
6690
|
function resolveCorsConfig() {
|
|
6577
6691
|
return {
|
|
6578
|
-
allowedOrigins: (process.env.CORS_ALLOWED_ORIGINS ??
|
|
6692
|
+
allowedOrigins: (process.env.CORS_ALLOWED_ORIGINS ?? defaultAllowedOrigins()).split(",").map((origin) => origin.trim()).filter(Boolean),
|
|
6579
6693
|
allowedMethods: ["GET", "POST", "PATCH", "PUT", "DELETE", "OPTIONS"],
|
|
6580
6694
|
allowedHeaders: [
|
|
6581
6695
|
"Authorization",
|
|
@@ -6615,30 +6729,19 @@ function buildCorsHeaders(request) {
|
|
|
6615
6729
|
const origin = request.headers.get("origin");
|
|
6616
6730
|
const corsConfig = resolveCorsConfig();
|
|
6617
6731
|
const allowedOrigins = corsConfig.allowedOrigins;
|
|
6618
|
-
|
|
6732
|
+
headers.set("Vary", "Origin");
|
|
6733
|
+
const allowOrigin = allowedOrigins.includes("*") ? "*" : origin && allowedOrigins.includes(origin) ? origin : null;
|
|
6734
|
+
if (!allowOrigin) {
|
|
6735
|
+
return headers;
|
|
6736
|
+
}
|
|
6619
6737
|
headers.set("Access-Control-Allow-Origin", allowOrigin);
|
|
6620
6738
|
headers.set("Access-Control-Allow-Methods", corsConfig.allowedMethods.join(", "));
|
|
6621
6739
|
headers.set("Access-Control-Allow-Headers", corsConfig.allowedHeaders.join(", "));
|
|
6622
6740
|
headers.set("Access-Control-Max-Age", String(corsConfig.maxAgeSeconds));
|
|
6623
|
-
headers.set("Vary", "Origin");
|
|
6624
6741
|
return headers;
|
|
6625
6742
|
}
|
|
6626
6743
|
// ../../src/core/http/csrfToken.ts
|
|
6627
6744
|
import { timingSafeEqual as timingSafeEqual3 } from "crypto";
|
|
6628
|
-
|
|
6629
|
-
// ../../src/core/http/requestMetaContext.ts
|
|
6630
|
-
var requestMetaContext = createAsyncContextStore("@getstrata/requestMetaContext");
|
|
6631
|
-
function runWithRequestMeta(meta, callback) {
|
|
6632
|
-
return requestMetaContext.run(meta, callback);
|
|
6633
|
-
}
|
|
6634
|
-
function currentRequestMeta() {
|
|
6635
|
-
return requestMetaContext.getStore() ?? {
|
|
6636
|
-
ipAddress: null,
|
|
6637
|
-
userAgent: null
|
|
6638
|
-
};
|
|
6639
|
-
}
|
|
6640
|
-
|
|
6641
|
-
// ../../src/core/http/csrfToken.ts
|
|
6642
6745
|
var CSRF_COOKIE = appCookieName("csrf");
|
|
6643
6746
|
var CSRF_TTL_MS = 60 * 60 * 1000;
|
|
6644
6747
|
function csrfCookieName() {
|
|
@@ -7412,14 +7515,27 @@ function errorPageTitle(status, message) {
|
|
|
7412
7515
|
return message;
|
|
7413
7516
|
}
|
|
7414
7517
|
function publicErrorMessage(status, message) {
|
|
7415
|
-
if (status >= 500 &&
|
|
7518
|
+
if (status >= 500 && isProductionEnv()) {
|
|
7519
|
+
return "Something went wrong.";
|
|
7520
|
+
}
|
|
7416
7521
|
return message;
|
|
7417
7522
|
}
|
|
7523
|
+
function logServerError(error, mappedError) {
|
|
7524
|
+
if (mappedError.status < 500) {
|
|
7525
|
+
return;
|
|
7526
|
+
}
|
|
7527
|
+
appLogger.error("Unhandled request error", {
|
|
7528
|
+
status: mappedError.status,
|
|
7529
|
+
error: error instanceof Error ? error.message : String(error),
|
|
7530
|
+
stack: error instanceof Error ? error.stack : undefined
|
|
7531
|
+
});
|
|
7532
|
+
}
|
|
7418
7533
|
async function webErrorResponse(error, request) {
|
|
7419
7534
|
if (!request || !isViewsEnabled() || requestPrefersJson(request)) {
|
|
7420
7535
|
return null;
|
|
7421
7536
|
}
|
|
7422
7537
|
const mappedError = toHttpError(error) ?? mapDatabaseError(error);
|
|
7538
|
+
logServerError(error, mappedError);
|
|
7423
7539
|
if (mappedError.status === 401) {
|
|
7424
7540
|
return Response.redirect(loginRedirectLocation(request), 302);
|
|
7425
7541
|
}
|
|
@@ -7448,6 +7564,7 @@ function noContentResponse() {
|
|
|
7448
7564
|
}
|
|
7449
7565
|
function errorResponse(error) {
|
|
7450
7566
|
const mappedError = toHttpError(error) ?? mapDatabaseError(error);
|
|
7567
|
+
logServerError(error, mappedError);
|
|
7451
7568
|
return Response.json({
|
|
7452
7569
|
error: mappedError.message,
|
|
7453
7570
|
...mappedError.details === undefined ? {} : { details: mappedError.details }
|
|
@@ -8150,9 +8267,10 @@ function installGracefulShutdownSignals(signals = ["SIGINT", "SIGTERM"]) {
|
|
|
8150
8267
|
// ../../src/core/logging/requestLoggingMiddleware.ts
|
|
8151
8268
|
function createRequestLoggingMiddleware() {
|
|
8152
8269
|
return async (request, next) => {
|
|
8270
|
+
const ipAddress = readClientIp(request) ?? null;
|
|
8153
8271
|
return await runWithRequestMeta({
|
|
8154
8272
|
...currentRequestMeta(),
|
|
8155
|
-
ipAddress
|
|
8273
|
+
ipAddress,
|
|
8156
8274
|
userAgent: request.headers.get("user-agent"),
|
|
8157
8275
|
request
|
|
8158
8276
|
}, async () => {
|
|
@@ -8165,7 +8283,8 @@ function createRequestLoggingMiddleware() {
|
|
|
8165
8283
|
method: request.method,
|
|
8166
8284
|
path: new URL(request.url).pathname,
|
|
8167
8285
|
status: response.status,
|
|
8168
|
-
durationMs
|
|
8286
|
+
durationMs,
|
|
8287
|
+
ipAddress
|
|
8169
8288
|
});
|
|
8170
8289
|
return response;
|
|
8171
8290
|
});
|
|
@@ -9406,6 +9525,7 @@ export {
|
|
|
9406
9525
|
HasManyRelationQuery,
|
|
9407
9526
|
HasOneRelationQuery,
|
|
9408
9527
|
HttpError,
|
|
9528
|
+
InternalServerError,
|
|
9409
9529
|
Job,
|
|
9410
9530
|
JsonResource,
|
|
9411
9531
|
JwtGuard,
|
|
@@ -9496,6 +9616,7 @@ export {
|
|
|
9496
9616
|
createMetricsMiddleware,
|
|
9497
9617
|
createMysqlConnection,
|
|
9498
9618
|
createMysqlConnectionFromPool,
|
|
9619
|
+
createMysqlPool,
|
|
9499
9620
|
createNotificationDispatcher,
|
|
9500
9621
|
createProductionQueue,
|
|
9501
9622
|
createQueue,
|
|
@@ -9678,6 +9799,7 @@ export {
|
|
|
9678
9799
|
signedUrl,
|
|
9679
9800
|
singularize,
|
|
9680
9801
|
spaContentSecurityPolicy,
|
|
9802
|
+
sqlTimestamp,
|
|
9681
9803
|
storageFacade as storage,
|
|
9682
9804
|
strictApiContentSecurityPolicy,
|
|
9683
9805
|
stringRule,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@getstrata/core",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "Strata Bun framework public API",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -200,6 +200,11 @@
|
|
|
200
200
|
"import": "./dist/entries/contracts/serviceTokens.js",
|
|
201
201
|
"default": "./dist/entries/contracts/serviceTokens.js"
|
|
202
202
|
},
|
|
203
|
+
"./contracts/authUserDirectory": {
|
|
204
|
+
"types": "./dist/core/contracts/authUserDirectory.d.ts",
|
|
205
|
+
"import": "./dist/entries/contracts/authUserDirectory.js",
|
|
206
|
+
"default": "./dist/entries/contracts/authUserDirectory.js"
|
|
207
|
+
},
|
|
203
208
|
"./contracts/container": {
|
|
204
209
|
"types": "./dist/core/contracts/container.d.ts",
|
|
205
210
|
"import": "./dist/entries/contracts/container.js",
|
|
@@ -735,6 +740,11 @@
|
|
|
735
740
|
"import": "./dist/entries/queue/types.js",
|
|
736
741
|
"default": "./dist/entries/queue/types.js"
|
|
737
742
|
},
|
|
743
|
+
"./runtime/appEnv": {
|
|
744
|
+
"types": "./dist/core/runtime/appEnv.d.ts",
|
|
745
|
+
"import": "./dist/entries/runtime/appEnv.js",
|
|
746
|
+
"default": "./dist/entries/runtime/appEnv.js"
|
|
747
|
+
},
|
|
738
748
|
"./runtime/appKeyPrefix": {
|
|
739
749
|
"types": "./dist/core/runtime/appKeyPrefix.d.ts",
|
|
740
750
|
"import": "./dist/entries/runtime/appKeyPrefix.js",
|
|
@@ -884,11 +894,11 @@
|
|
|
884
894
|
"CHANGELOG.md"
|
|
885
895
|
],
|
|
886
896
|
"scripts": {
|
|
887
|
-
"build": "bun run build:bundle && bun run build:shims && bun run build:subpaths && bun run build:types",
|
|
897
|
+
"build": "rm -rf dist && bun run build:bundle && bun run build:shims && bun run build:subpaths && bun run build:types",
|
|
888
898
|
"build:bundle": "bun build index.ts --outdir dist --target bun --external bun --external eta --external mysql2",
|
|
889
899
|
"build:types": "tsc -p tsconfig.types.json",
|
|
890
900
|
"prepublishOnly": "bun run build && bun ../../scripts/prepare-core-package-publish.ts",
|
|
891
|
-
"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/password.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/container.ts entries/contracts/di.ts entries/crypto/fieldEncryption.ts entries/crypto/mfaSecret.ts entries/database/mysqlConnection.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/loginThrottleMiddleware.ts entries/http/memoryThrottleMiddleware.ts entries/http/pagination.ts entries/http/parseFormBody.ts entries/http/parseMultipartUpload.ts entries/http/requireAbilityMiddleware.ts entries/http/requireAuthMiddleware.ts entries/http/requireGlobalAdminMiddleware.ts entries/http/requireWebAuthMiddleware.ts entries/http/requireVerifiedMiddleware.ts entries/http/requirePasswordConfirmMiddleware.ts entries/http/resources.ts entries/http/response.ts entries/http/route.ts entries/http/routeMiddleware.ts entries/http/routeModelBinding.ts entries/http/safeInternalPath.ts entries/http/signedUrl.ts entries/http/statelessAuth.ts entries/http/scimThrottleMiddleware.ts entries/http/securityHeadersMiddleware.ts entries/http/securedRouteModelBinding.ts entries/http/webErrorResponse.ts entries/http/webFormRequest.ts entries/http/throttleMiddleware.ts entries/http/validation.ts entries/jobs/exportAuditLogsJob.ts entries/jobs/invalidateCacheTagsJob.ts entries/lifecycle/gracefulShutdown.ts entries/logging/logger.ts entries/logging/requestLoggingMiddleware.ts entries/mail/mailer.ts entries/mail/markdownMail.ts entries/mail/markdownMailable.ts entries/mail/sanitizeMailHtml.ts entries/media/imageTransform.ts entries/metrics/prometheus.ts entries/openapi/generator.ts entries/openapi/registeredRoute.ts entries/openapi/validate.ts entries/pagination.ts entries/queue.ts entries/queue/createAppQueue.ts entries/queue/failedJobRepository.ts entries/queue/failedJobService.ts entries/queue/jobRunner.ts entries/queue/queueMetrics.ts entries/queue/publicQueue.ts entries/queue/redisQueue.ts entries/queue/types.ts entries/runtime/appKeyPrefix.ts entries/runtime/frontendMode.ts entries/runtime/asyncContextStore.ts entries/scheduler/schedule.ts entries/scheduler/osCron.ts entries/security/oauthState.ts entries/security/publicReads.ts entries/security/recoveryCodes.ts entries/security/safeFetch.ts entries/security/safeUrl.ts entries/security/scimTenantTokens.ts entries/security/stripeWebhook.ts entries/security/timingSafeCompare.ts entries/security/tokenExpiry.ts entries/security/totp.ts entries/storage/storage.ts entries/tenant/tenancyConfig.ts entries/tenant/tenantDatabaseScope.ts entries/tenant/databaseTenantContext.ts entries/terminal/runShell.ts entries/tracing/tracingMiddleware.ts entries/validation/rules.ts entries/view.ts --outdir dist --root . --target bun --external bun --external eta --external mysql2 --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/password --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/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/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/safeUrl --external @getstrata/core/security/scimTenantTokens --external @getstrata/core/security/securityEvents --external @getstrata/core/security/stripeWebhook --external @getstrata/core/security/timingSafeCompare --external @getstrata/core/security/tokenExpiry --external @getstrata/core/security/totp --external @getstrata/core/storage/storage --external @getstrata/core/tenant/tenancyConfig --external @getstrata/core/tenant/tenantContext --external @getstrata/core/tenant/tenantDatabaseScope --external @getstrata/core/tenant/databaseTenantContext --external @getstrata/core/tenant/tenantMiddleware --external @getstrata/core/terminal/runShell --external @getstrata/core/tracing/traceContext --external @getstrata/core/tracing/tracingMiddleware --external @getstrata/core/validation/rules --external @getstrata/core/view",
|
|
901
|
+
"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/password.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/mysqlConnection.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/loginThrottleMiddleware.ts entries/http/memoryThrottleMiddleware.ts entries/http/pagination.ts entries/http/parseFormBody.ts entries/http/parseMultipartUpload.ts entries/http/requireAbilityMiddleware.ts entries/http/requireAuthMiddleware.ts entries/http/requireGlobalAdminMiddleware.ts entries/http/requireWebAuthMiddleware.ts entries/http/requireVerifiedMiddleware.ts entries/http/requirePasswordConfirmMiddleware.ts entries/http/resources.ts entries/http/response.ts entries/http/route.ts entries/http/routeMiddleware.ts entries/http/routeModelBinding.ts entries/http/safeInternalPath.ts entries/http/signedUrl.ts entries/http/statelessAuth.ts entries/http/scimThrottleMiddleware.ts entries/http/securityHeadersMiddleware.ts entries/http/securedRouteModelBinding.ts entries/http/webErrorResponse.ts entries/http/webFormRequest.ts entries/http/throttleMiddleware.ts entries/http/validation.ts entries/jobs/exportAuditLogsJob.ts entries/jobs/invalidateCacheTagsJob.ts entries/lifecycle/gracefulShutdown.ts entries/logging/logger.ts entries/logging/requestLoggingMiddleware.ts entries/mail/mailer.ts entries/mail/markdownMail.ts entries/mail/markdownMailable.ts entries/mail/sanitizeMailHtml.ts entries/media/imageTransform.ts entries/metrics/prometheus.ts entries/openapi/generator.ts entries/openapi/registeredRoute.ts entries/openapi/validate.ts entries/pagination.ts entries/queue.ts entries/queue/createAppQueue.ts entries/queue/failedJobRepository.ts entries/queue/failedJobService.ts entries/queue/jobRunner.ts entries/queue/queueMetrics.ts entries/queue/publicQueue.ts entries/queue/redisQueue.ts entries/queue/types.ts entries/runtime/appEnv.ts entries/runtime/appKeyPrefix.ts entries/runtime/frontendMode.ts entries/runtime/asyncContextStore.ts entries/scheduler/schedule.ts entries/scheduler/osCron.ts entries/security/oauthState.ts entries/security/publicReads.ts entries/security/recoveryCodes.ts entries/security/safeFetch.ts entries/security/safeUrl.ts entries/security/scimTenantTokens.ts entries/security/stripeWebhook.ts entries/security/timingSafeCompare.ts entries/security/tokenExpiry.ts entries/security/totp.ts entries/storage/storage.ts entries/tenant/tenancyConfig.ts entries/tenant/tenantDatabaseScope.ts entries/tenant/databaseTenantContext.ts entries/terminal/runShell.ts entries/tracing/tracingMiddleware.ts entries/validation/rules.ts entries/view.ts --outdir dist --root . --target bun --external bun --external eta --external mysql2 --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/password --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/safeUrl --external @getstrata/core/security/scimTenantTokens --external @getstrata/core/security/securityEvents --external @getstrata/core/security/stripeWebhook --external @getstrata/core/security/timingSafeCompare --external @getstrata/core/security/tokenExpiry --external @getstrata/core/security/totp --external @getstrata/core/storage/storage --external @getstrata/core/tenant/tenancyConfig --external @getstrata/core/tenant/tenantContext --external @getstrata/core/tenant/tenantDatabaseScope --external @getstrata/core/tenant/databaseTenantContext --external @getstrata/core/tenant/tenantMiddleware --external @getstrata/core/terminal/runShell --external @getstrata/core/tracing/traceContext --external @getstrata/core/tracing/tracingMiddleware --external @getstrata/core/validation/rules --external @getstrata/core/view",
|
|
892
902
|
"build:shims": "bun ../../scripts/write-core-shared-shims.ts"
|
|
893
903
|
},
|
|
894
904
|
"publishConfig": {
|
|
@@ -900,5 +910,8 @@
|
|
|
900
910
|
},
|
|
901
911
|
"peerDependencies": {
|
|
902
912
|
"typescript": "^5.9.0"
|
|
913
|
+
},
|
|
914
|
+
"engines": {
|
|
915
|
+
"bun": ">=1.4.0"
|
|
903
916
|
}
|
|
904
917
|
}
|