@getstrata/core 0.5.54 → 0.5.55
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/README.md +14 -13
- package/dist/core/http/index.d.ts +5 -10
- package/dist/core/http/response.d.ts +6 -0
- package/dist/entries/http/response.js +880 -0
- package/dist/framework/public-api.d.ts +2 -1
- package/dist/index.js +244 -244
- package/package.json +7 -2
|
@@ -62,7 +62,7 @@ export { createCsrfTokenCookie, readSubmittedCsrfToken, readSubmittedCsrfTokenFr
|
|
|
62
62
|
export { applyConditionalGet, assertIfMatch, type EtagVersioned, etagFromResource, isEtagEnabled, } from "../core/http/etag.ts";
|
|
63
63
|
export { createFlashMiddleware } from "../core/http/flashMiddleware.ts";
|
|
64
64
|
export { FormRequest } from "../core/http/formRequest.ts";
|
|
65
|
-
export { applyMiddlewareToRoutes, bindRouteModel, buildRequestCacheKey, composeMiddleware, createAuthMiddleware, createAuthorizeMiddleware,
|
|
65
|
+
export { applyMiddlewareToRoutes, bindRouteModel, buildRequestCacheKey, composeMiddleware, createAuthMiddleware, createAuthorizeMiddleware, createRequireAuthMiddleware, paginatedResponse, parsePaginationQuery, parsePositiveIntParam, requestIdMiddleware, securedBindRouteModel, securedBindRouteModelByKey, withMiddleware, wrapRouteHandler, } from "../core/http/index.ts";
|
|
66
66
|
export { createLoginThrottleMiddleware } from "../core/http/loginThrottleMiddleware.ts";
|
|
67
67
|
export { createMemoryThrottleMiddleware } from "../core/http/memoryThrottleMiddleware.ts";
|
|
68
68
|
export { createMetricsMiddleware, normalizeMetricPath } from "../core/http/metricsMiddleware.ts";
|
|
@@ -74,6 +74,7 @@ export { createRequireAbilityMiddleware } from "../core/http/requireAbilityMiddl
|
|
|
74
74
|
export { createRequireGlobalAdminMiddleware } from "../core/http/requireGlobalAdminMiddleware.ts";
|
|
75
75
|
export { createRequireWebAuthMiddleware } from "../core/http/requireWebAuthMiddleware.ts";
|
|
76
76
|
export { serializeDate, toPaginatedResourceCollection, toResourceCollection, } from "../core/http/resources.ts";
|
|
77
|
+
export { createdResponse, jsonResponse, noContentResponse, withErrorHandling, } from "../core/http/response.ts";
|
|
77
78
|
export type { RouteRequest } from "../core/http/route.ts";
|
|
78
79
|
export { createScimThrottleMiddleware } from "../core/http/scimThrottleMiddleware.ts";
|
|
79
80
|
export { createSecurityHeadersMiddleware } from "../core/http/securityHeadersMiddleware.ts";
|
package/dist/index.js
CHANGED
|
@@ -4983,164 +4983,6 @@ class FormRequest {
|
|
|
4983
4983
|
return await parseJsonBody(request, (payload) => this.parse(payload));
|
|
4984
4984
|
}
|
|
4985
4985
|
}
|
|
4986
|
-
// ../../src/config/frontend.ts
|
|
4987
|
-
function readFrontendMode() {
|
|
4988
|
-
const mode = (process.env.FRONTEND_MODE ?? "api").trim();
|
|
4989
|
-
if (mode === "server-htmx") {
|
|
4990
|
-
return "server-htmx";
|
|
4991
|
-
}
|
|
4992
|
-
if (mode === "spa-react") {
|
|
4993
|
-
return "spa-react";
|
|
4994
|
-
}
|
|
4995
|
-
return "api";
|
|
4996
|
-
}
|
|
4997
|
-
function isViewsEnabled() {
|
|
4998
|
-
return readFrontendMode() === "server-htmx";
|
|
4999
|
-
}
|
|
5000
|
-
|
|
5001
|
-
// ../../src/core/view/etaViewEngine.ts
|
|
5002
|
-
import { join as join4 } from "path";
|
|
5003
|
-
import { Eta } from "eta";
|
|
5004
|
-
var DEFAULT_VIEWS_DIRECTORY = join4(process.cwd(), "resources/views");
|
|
5005
|
-
var DEFAULT_LAYOUT = "layouts/app.eta";
|
|
5006
|
-
|
|
5007
|
-
class EtaViewEngine {
|
|
5008
|
-
eta;
|
|
5009
|
-
resolveLayoutData;
|
|
5010
|
-
constructor(viewsDirectory = DEFAULT_VIEWS_DIRECTORY, resolveLayoutData) {
|
|
5011
|
-
this.eta = new Eta({
|
|
5012
|
-
views: viewsDirectory,
|
|
5013
|
-
autoTrim: false
|
|
5014
|
-
});
|
|
5015
|
-
this.resolveLayoutData = resolveLayoutData;
|
|
5016
|
-
}
|
|
5017
|
-
async render(name, data = {}, options = {}) {
|
|
5018
|
-
const template = name.endsWith(".eta") ? name : `${name}.eta`;
|
|
5019
|
-
const layoutData = this.resolveLayoutData ? await this.resolveLayoutData() : {};
|
|
5020
|
-
const mergedData = { ...layoutData, ...data };
|
|
5021
|
-
const body = await this.eta.renderAsync(template, mergedData);
|
|
5022
|
-
const layout = options.layout ?? DEFAULT_LAYOUT;
|
|
5023
|
-
if (layout === false) {
|
|
5024
|
-
return body;
|
|
5025
|
-
}
|
|
5026
|
-
const layoutTemplate = layout.endsWith(".eta") ? layout : `${layout}.eta`;
|
|
5027
|
-
return await this.eta.renderAsync(layoutTemplate, {
|
|
5028
|
-
...mergedData,
|
|
5029
|
-
body
|
|
5030
|
-
});
|
|
5031
|
-
}
|
|
5032
|
-
}
|
|
5033
|
-
// ../../src/core/view/htmlResponse.ts
|
|
5034
|
-
function htmlResponse(html, init = {}) {
|
|
5035
|
-
return new Response(html, {
|
|
5036
|
-
status: init.status ?? 200,
|
|
5037
|
-
statusText: init.statusText,
|
|
5038
|
-
headers: {
|
|
5039
|
-
"Content-Type": "text/html; charset=utf-8"
|
|
5040
|
-
}
|
|
5041
|
-
});
|
|
5042
|
-
}
|
|
5043
|
-
function isHtmxRequest(request) {
|
|
5044
|
-
return request.headers.get("HX-Request") === "true";
|
|
5045
|
-
}
|
|
5046
|
-
// ../../src/core/view/webLayoutData.ts
|
|
5047
|
-
async function resolveWebLayoutData(container, request) {
|
|
5048
|
-
const csrfToken = request ? resolveCsrfTokenForRequest(request) : "";
|
|
5049
|
-
const flash = request ? currentRequestMeta().flash ?? pullFlash(request) : null;
|
|
5050
|
-
const authUser = currentAuthUser();
|
|
5051
|
-
if (!authUser) {
|
|
5052
|
-
return { authUser: null, csrfToken, flash };
|
|
5053
|
-
}
|
|
5054
|
-
const userId = Number(authUser.id);
|
|
5055
|
-
if (!Number.isInteger(userId) || userId <= 0) {
|
|
5056
|
-
return { authUser: null, csrfToken, flash };
|
|
5057
|
-
}
|
|
5058
|
-
if (!container.has(tokenServiceToken)) {
|
|
5059
|
-
return {
|
|
5060
|
-
authUser: {
|
|
5061
|
-
id: userId,
|
|
5062
|
-
email: "",
|
|
5063
|
-
role: authUser.role ?? "member"
|
|
5064
|
-
},
|
|
5065
|
-
csrfToken,
|
|
5066
|
-
flash
|
|
5067
|
-
};
|
|
5068
|
-
}
|
|
5069
|
-
const tokenService = container.resolve(tokenServiceToken);
|
|
5070
|
-
try {
|
|
5071
|
-
const user = await tokenService.findByIdOrThrow(userId);
|
|
5072
|
-
return {
|
|
5073
|
-
authUser: {
|
|
5074
|
-
id: userId,
|
|
5075
|
-
email: user.email ?? "",
|
|
5076
|
-
role: authUser.role ?? user.role ?? "member"
|
|
5077
|
-
},
|
|
5078
|
-
csrfToken,
|
|
5079
|
-
flash
|
|
5080
|
-
};
|
|
5081
|
-
} catch {
|
|
5082
|
-
return { authUser: null, csrfToken, flash };
|
|
5083
|
-
}
|
|
5084
|
-
}
|
|
5085
|
-
// ../../src/core/http/contentNegotiation.ts
|
|
5086
|
-
function requestPrefersJson(request) {
|
|
5087
|
-
if (!request) {
|
|
5088
|
-
return true;
|
|
5089
|
-
}
|
|
5090
|
-
if (request.headers.get("HX-Request") === "true") {
|
|
5091
|
-
return false;
|
|
5092
|
-
}
|
|
5093
|
-
const accept = request.headers.get("accept")?.toLowerCase() ?? "";
|
|
5094
|
-
if (accept.includes("text/html")) {
|
|
5095
|
-
return false;
|
|
5096
|
-
}
|
|
5097
|
-
if (accept.includes("application/json")) {
|
|
5098
|
-
return true;
|
|
5099
|
-
}
|
|
5100
|
-
const contentType = request.headers.get("content-type")?.toLowerCase() ?? "";
|
|
5101
|
-
if (contentType.includes("application/x-www-form-urlencoded") || contentType.includes("multipart/form-data")) {
|
|
5102
|
-
return false;
|
|
5103
|
-
}
|
|
5104
|
-
const pathname = new URL(request.url).pathname;
|
|
5105
|
-
return pathname.startsWith("/api/");
|
|
5106
|
-
}
|
|
5107
|
-
|
|
5108
|
-
// ../../src/core/http/webErrorResponse.ts
|
|
5109
|
-
function normalizeFieldErrors(details) {
|
|
5110
|
-
if (!details || typeof details !== "object" || Array.isArray(details)) {
|
|
5111
|
-
return {};
|
|
5112
|
-
}
|
|
5113
|
-
const errors = {};
|
|
5114
|
-
for (const [field, messages] of Object.entries(details)) {
|
|
5115
|
-
if (Array.isArray(messages)) {
|
|
5116
|
-
errors[field] = messages.map(String);
|
|
5117
|
-
continue;
|
|
5118
|
-
}
|
|
5119
|
-
if (typeof messages === "string") {
|
|
5120
|
-
errors[field] = [messages];
|
|
5121
|
-
}
|
|
5122
|
-
}
|
|
5123
|
-
return errors;
|
|
5124
|
-
}
|
|
5125
|
-
function webErrorResponse(error, request) {
|
|
5126
|
-
if (!request || !isViewsEnabled() || requestPrefersJson(request)) {
|
|
5127
|
-
return null;
|
|
5128
|
-
}
|
|
5129
|
-
const mappedError = error instanceof HttpError ? error : mapDatabaseError(error);
|
|
5130
|
-
if (mappedError instanceof UnauthorizedError) {
|
|
5131
|
-
const redirectTarget = encodeURIComponent(new URL(request.url).pathname);
|
|
5132
|
-
return Response.redirect(`/login?redirect=${redirectTarget}`, 302);
|
|
5133
|
-
}
|
|
5134
|
-
if (mappedError instanceof ValidationError) {
|
|
5135
|
-
const errors = normalizeFieldErrors(mappedError.details);
|
|
5136
|
-
const fieldSummary = Object.entries(errors).flatMap(([field, messages]) => messages.map((message) => `${field}: ${message}`)).join(`
|
|
5137
|
-
`);
|
|
5138
|
-
return htmlResponse(`<section class="page-header"><h1>Validation failed</h1><pre>${fieldSummary || mappedError.message}</pre><p><a href="javascript:history.back()">Go back</a></p></section>`, { status: mappedError.status });
|
|
5139
|
-
}
|
|
5140
|
-
return htmlResponse(`<section class="page-header"><h1>${mappedError.message}</h1></section>`, {
|
|
5141
|
-
status: mappedError.status
|
|
5142
|
-
});
|
|
5143
|
-
}
|
|
5144
4986
|
// ../../src/core/http/authMiddleware.ts
|
|
5145
4987
|
function createAuthMiddleware(auth2) {
|
|
5146
4988
|
return async (request, next) => {
|
|
@@ -5263,91 +5105,6 @@ function parsePaginationQuery(request) {
|
|
|
5263
5105
|
function paginatedResponse(data, meta, init = {}) {
|
|
5264
5106
|
return Response.json({ data, meta }, init);
|
|
5265
5107
|
}
|
|
5266
|
-
// ../../src/core/http/requireAuthMiddleware.ts
|
|
5267
|
-
function createRequireAuthMiddleware(auth2) {
|
|
5268
|
-
return async (request, next) => {
|
|
5269
|
-
if (!await auth2.check(request)) {
|
|
5270
|
-
const error = new UnauthorizedError;
|
|
5271
|
-
return Response.json({ error: error.message }, { status: error.status });
|
|
5272
|
-
}
|
|
5273
|
-
return await next();
|
|
5274
|
-
};
|
|
5275
|
-
}
|
|
5276
|
-
// ../../src/core/http/resources.ts
|
|
5277
|
-
function serializeDate(value) {
|
|
5278
|
-
return value instanceof Date ? value.toISOString() : value;
|
|
5279
|
-
}
|
|
5280
|
-
function toResourceCollection(items, transformer) {
|
|
5281
|
-
return items.map(transformer);
|
|
5282
|
-
}
|
|
5283
|
-
function toPaginatedResourceCollection(items, meta, transformer) {
|
|
5284
|
-
return {
|
|
5285
|
-
data: toResourceCollection(items, transformer),
|
|
5286
|
-
meta
|
|
5287
|
-
};
|
|
5288
|
-
}
|
|
5289
|
-
// ../../src/core/http/routeMiddleware.ts
|
|
5290
|
-
function withMiddleware(...middleware) {
|
|
5291
|
-
const wrap = composeMiddleware(...middleware);
|
|
5292
|
-
return (handler) => {
|
|
5293
|
-
return wrap(handler);
|
|
5294
|
-
};
|
|
5295
|
-
}
|
|
5296
|
-
// ../../src/core/http/routeModelBinding.ts
|
|
5297
|
-
function bindRouteModel(param, resolver, handler) {
|
|
5298
|
-
return async (request) => {
|
|
5299
|
-
const id = parsePositiveIntParam(String(request.params[param]), String(param));
|
|
5300
|
-
const model = await resolver(id, request);
|
|
5301
|
-
return await handler(request, model);
|
|
5302
|
-
};
|
|
5303
|
-
}
|
|
5304
|
-
// ../../src/core/http/securedRouteModelBinding.ts
|
|
5305
|
-
function isMutatingPolicyAction(action) {
|
|
5306
|
-
return action === "update" || action === "delete";
|
|
5307
|
-
}
|
|
5308
|
-
function securedBindRouteModel(param, resolver, authorization, handler) {
|
|
5309
|
-
return async (request) => {
|
|
5310
|
-
const id = parsePositiveIntParam(String(request.params[param]), String(param));
|
|
5311
|
-
const model = await resolver(id, request);
|
|
5312
|
-
const gate = resolveApplicationPolicyGate();
|
|
5313
|
-
const auth2 = resolveApplicationAuth();
|
|
5314
|
-
const user = currentAuthUser() ?? await auth2.resolve(request);
|
|
5315
|
-
gate.authorize(authorization.resource, authorization.action, user, model);
|
|
5316
|
-
if (isEtagEnabled() && isMutatingPolicyAction(authorization.action)) {
|
|
5317
|
-
assertIfMatch(request, etagFromResource(model), {
|
|
5318
|
-
required: authorization.requireIfMatch ?? true
|
|
5319
|
-
});
|
|
5320
|
-
}
|
|
5321
|
-
const response = await handler(request, model);
|
|
5322
|
-
if (isEtagEnabled() && authorization.action === "view") {
|
|
5323
|
-
return applyConditionalGet(request, response, etagFromResource(model));
|
|
5324
|
-
}
|
|
5325
|
-
return response;
|
|
5326
|
-
};
|
|
5327
|
-
}
|
|
5328
|
-
function securedBindRouteModelByKey(param, resolver, authorization, handler) {
|
|
5329
|
-
return async (request) => {
|
|
5330
|
-
const key = String(request.params[param] ?? "").trim();
|
|
5331
|
-
if (!key) {
|
|
5332
|
-
throw new BadRequestError(`Missing route parameter "${String(param)}".`);
|
|
5333
|
-
}
|
|
5334
|
-
const model = await resolver(key, request);
|
|
5335
|
-
const gate = resolveApplicationPolicyGate();
|
|
5336
|
-
const auth2 = resolveApplicationAuth();
|
|
5337
|
-
const user = currentAuthUser() ?? await auth2.resolve(request);
|
|
5338
|
-
gate.authorize(authorization.resource, authorization.action, user, model);
|
|
5339
|
-
if (isEtagEnabled() && isMutatingPolicyAction(authorization.action)) {
|
|
5340
|
-
assertIfMatch(request, etagFromResource(model), {
|
|
5341
|
-
required: authorization.requireIfMatch ?? true
|
|
5342
|
-
});
|
|
5343
|
-
}
|
|
5344
|
-
const response = await handler(request, model);
|
|
5345
|
-
if (isEtagEnabled() && authorization.action === "view") {
|
|
5346
|
-
return applyConditionalGet(request, response, etagFromResource(model));
|
|
5347
|
-
}
|
|
5348
|
-
return response;
|
|
5349
|
-
};
|
|
5350
|
-
}
|
|
5351
5108
|
// ../../src/config/uploads.ts
|
|
5352
5109
|
var DEFAULT_MAX_UPLOAD_BYTES = 5 * 1024 * 1024;
|
|
5353
5110
|
var ALLOWED_UPLOAD_MIME_TYPES = new Set([
|
|
@@ -5421,8 +5178,189 @@ async function parseMultipartUpload(request, fieldName = "file") {
|
|
|
5421
5178
|
contents: new Uint8Array(await value.arrayBuffer())
|
|
5422
5179
|
};
|
|
5423
5180
|
}
|
|
5181
|
+
// ../../src/core/http/requireAuthMiddleware.ts
|
|
5182
|
+
function createRequireAuthMiddleware(auth2) {
|
|
5183
|
+
return async (request, next) => {
|
|
5184
|
+
if (!await auth2.check(request)) {
|
|
5185
|
+
const error = new UnauthorizedError;
|
|
5186
|
+
return Response.json({ error: error.message }, { status: error.status });
|
|
5187
|
+
}
|
|
5188
|
+
return await next();
|
|
5189
|
+
};
|
|
5190
|
+
}
|
|
5191
|
+
// ../../src/core/http/resources.ts
|
|
5192
|
+
function serializeDate(value) {
|
|
5193
|
+
return value instanceof Date ? value.toISOString() : value;
|
|
5194
|
+
}
|
|
5195
|
+
function toResourceCollection(items, transformer) {
|
|
5196
|
+
return items.map(transformer);
|
|
5197
|
+
}
|
|
5198
|
+
function toPaginatedResourceCollection(items, meta, transformer) {
|
|
5199
|
+
return {
|
|
5200
|
+
data: toResourceCollection(items, transformer),
|
|
5201
|
+
meta
|
|
5202
|
+
};
|
|
5203
|
+
}
|
|
5204
|
+
// ../../src/config/frontend.ts
|
|
5205
|
+
function readFrontendMode() {
|
|
5206
|
+
const mode = (process.env.FRONTEND_MODE ?? "api").trim();
|
|
5207
|
+
if (mode === "server-htmx") {
|
|
5208
|
+
return "server-htmx";
|
|
5209
|
+
}
|
|
5210
|
+
if (mode === "spa-react") {
|
|
5211
|
+
return "spa-react";
|
|
5212
|
+
}
|
|
5213
|
+
return "api";
|
|
5214
|
+
}
|
|
5215
|
+
function isViewsEnabled() {
|
|
5216
|
+
return readFrontendMode() === "server-htmx";
|
|
5217
|
+
}
|
|
5424
5218
|
|
|
5425
|
-
// ../../src/core/
|
|
5219
|
+
// ../../src/core/view/etaViewEngine.ts
|
|
5220
|
+
import { join as join4 } from "path";
|
|
5221
|
+
import { Eta } from "eta";
|
|
5222
|
+
var DEFAULT_VIEWS_DIRECTORY = join4(process.cwd(), "resources/views");
|
|
5223
|
+
var DEFAULT_LAYOUT = "layouts/app.eta";
|
|
5224
|
+
|
|
5225
|
+
class EtaViewEngine {
|
|
5226
|
+
eta;
|
|
5227
|
+
resolveLayoutData;
|
|
5228
|
+
constructor(viewsDirectory = DEFAULT_VIEWS_DIRECTORY, resolveLayoutData) {
|
|
5229
|
+
this.eta = new Eta({
|
|
5230
|
+
views: viewsDirectory,
|
|
5231
|
+
autoTrim: false
|
|
5232
|
+
});
|
|
5233
|
+
this.resolveLayoutData = resolveLayoutData;
|
|
5234
|
+
}
|
|
5235
|
+
async render(name, data = {}, options = {}) {
|
|
5236
|
+
const template = name.endsWith(".eta") ? name : `${name}.eta`;
|
|
5237
|
+
const layoutData = this.resolveLayoutData ? await this.resolveLayoutData() : {};
|
|
5238
|
+
const mergedData = { ...layoutData, ...data };
|
|
5239
|
+
const body = await this.eta.renderAsync(template, mergedData);
|
|
5240
|
+
const layout = options.layout ?? DEFAULT_LAYOUT;
|
|
5241
|
+
if (layout === false) {
|
|
5242
|
+
return body;
|
|
5243
|
+
}
|
|
5244
|
+
const layoutTemplate = layout.endsWith(".eta") ? layout : `${layout}.eta`;
|
|
5245
|
+
return await this.eta.renderAsync(layoutTemplate, {
|
|
5246
|
+
...mergedData,
|
|
5247
|
+
body
|
|
5248
|
+
});
|
|
5249
|
+
}
|
|
5250
|
+
}
|
|
5251
|
+
// ../../src/core/view/htmlResponse.ts
|
|
5252
|
+
function htmlResponse(html, init = {}) {
|
|
5253
|
+
return new Response(html, {
|
|
5254
|
+
status: init.status ?? 200,
|
|
5255
|
+
statusText: init.statusText,
|
|
5256
|
+
headers: {
|
|
5257
|
+
"Content-Type": "text/html; charset=utf-8"
|
|
5258
|
+
}
|
|
5259
|
+
});
|
|
5260
|
+
}
|
|
5261
|
+
function isHtmxRequest(request) {
|
|
5262
|
+
return request.headers.get("HX-Request") === "true";
|
|
5263
|
+
}
|
|
5264
|
+
// ../../src/core/view/webLayoutData.ts
|
|
5265
|
+
async function resolveWebLayoutData(container, request) {
|
|
5266
|
+
const csrfToken = request ? resolveCsrfTokenForRequest(request) : "";
|
|
5267
|
+
const flash = request ? currentRequestMeta().flash ?? pullFlash(request) : null;
|
|
5268
|
+
const authUser = currentAuthUser();
|
|
5269
|
+
if (!authUser) {
|
|
5270
|
+
return { authUser: null, csrfToken, flash };
|
|
5271
|
+
}
|
|
5272
|
+
const userId = Number(authUser.id);
|
|
5273
|
+
if (!Number.isInteger(userId) || userId <= 0) {
|
|
5274
|
+
return { authUser: null, csrfToken, flash };
|
|
5275
|
+
}
|
|
5276
|
+
if (!container.has(tokenServiceToken)) {
|
|
5277
|
+
return {
|
|
5278
|
+
authUser: {
|
|
5279
|
+
id: userId,
|
|
5280
|
+
email: "",
|
|
5281
|
+
role: authUser.role ?? "member"
|
|
5282
|
+
},
|
|
5283
|
+
csrfToken,
|
|
5284
|
+
flash
|
|
5285
|
+
};
|
|
5286
|
+
}
|
|
5287
|
+
const tokenService = container.resolve(tokenServiceToken);
|
|
5288
|
+
try {
|
|
5289
|
+
const user = await tokenService.findByIdOrThrow(userId);
|
|
5290
|
+
return {
|
|
5291
|
+
authUser: {
|
|
5292
|
+
id: userId,
|
|
5293
|
+
email: user.email ?? "",
|
|
5294
|
+
role: authUser.role ?? user.role ?? "member"
|
|
5295
|
+
},
|
|
5296
|
+
csrfToken,
|
|
5297
|
+
flash
|
|
5298
|
+
};
|
|
5299
|
+
} catch {
|
|
5300
|
+
return { authUser: null, csrfToken, flash };
|
|
5301
|
+
}
|
|
5302
|
+
}
|
|
5303
|
+
// ../../src/core/http/contentNegotiation.ts
|
|
5304
|
+
function requestPrefersJson(request) {
|
|
5305
|
+
if (!request) {
|
|
5306
|
+
return true;
|
|
5307
|
+
}
|
|
5308
|
+
if (request.headers.get("HX-Request") === "true") {
|
|
5309
|
+
return false;
|
|
5310
|
+
}
|
|
5311
|
+
const accept = request.headers.get("accept")?.toLowerCase() ?? "";
|
|
5312
|
+
if (accept.includes("text/html")) {
|
|
5313
|
+
return false;
|
|
5314
|
+
}
|
|
5315
|
+
if (accept.includes("application/json")) {
|
|
5316
|
+
return true;
|
|
5317
|
+
}
|
|
5318
|
+
const contentType = request.headers.get("content-type")?.toLowerCase() ?? "";
|
|
5319
|
+
if (contentType.includes("application/x-www-form-urlencoded") || contentType.includes("multipart/form-data")) {
|
|
5320
|
+
return false;
|
|
5321
|
+
}
|
|
5322
|
+
const pathname = new URL(request.url).pathname;
|
|
5323
|
+
return pathname.startsWith("/api/");
|
|
5324
|
+
}
|
|
5325
|
+
|
|
5326
|
+
// ../../src/core/http/webErrorResponse.ts
|
|
5327
|
+
function normalizeFieldErrors(details) {
|
|
5328
|
+
if (!details || typeof details !== "object" || Array.isArray(details)) {
|
|
5329
|
+
return {};
|
|
5330
|
+
}
|
|
5331
|
+
const errors = {};
|
|
5332
|
+
for (const [field, messages] of Object.entries(details)) {
|
|
5333
|
+
if (Array.isArray(messages)) {
|
|
5334
|
+
errors[field] = messages.map(String);
|
|
5335
|
+
continue;
|
|
5336
|
+
}
|
|
5337
|
+
if (typeof messages === "string") {
|
|
5338
|
+
errors[field] = [messages];
|
|
5339
|
+
}
|
|
5340
|
+
}
|
|
5341
|
+
return errors;
|
|
5342
|
+
}
|
|
5343
|
+
function webErrorResponse(error, request) {
|
|
5344
|
+
if (!request || !isViewsEnabled() || requestPrefersJson(request)) {
|
|
5345
|
+
return null;
|
|
5346
|
+
}
|
|
5347
|
+
const mappedError = error instanceof HttpError ? error : mapDatabaseError(error);
|
|
5348
|
+
if (mappedError instanceof UnauthorizedError) {
|
|
5349
|
+
const redirectTarget = encodeURIComponent(new URL(request.url).pathname);
|
|
5350
|
+
return Response.redirect(`/login?redirect=${redirectTarget}`, 302);
|
|
5351
|
+
}
|
|
5352
|
+
if (mappedError instanceof ValidationError) {
|
|
5353
|
+
const errors = normalizeFieldErrors(mappedError.details);
|
|
5354
|
+
const fieldSummary = Object.entries(errors).flatMap(([field, messages]) => messages.map((message) => `${field}: ${message}`)).join(`
|
|
5355
|
+
`);
|
|
5356
|
+
return htmlResponse(`<section class="page-header"><h1>Validation failed</h1><pre>${fieldSummary || mappedError.message}</pre><p><a href="javascript:history.back()">Go back</a></p></section>`, { status: mappedError.status });
|
|
5357
|
+
}
|
|
5358
|
+
return htmlResponse(`<section class="page-header"><h1>${mappedError.message}</h1></section>`, {
|
|
5359
|
+
status: mappedError.status
|
|
5360
|
+
});
|
|
5361
|
+
}
|
|
5362
|
+
|
|
5363
|
+
// ../../src/core/http/response.ts
|
|
5426
5364
|
function jsonResponse2(data, init = {}) {
|
|
5427
5365
|
return Response.json(data, {
|
|
5428
5366
|
status: init.status ?? 200,
|
|
@@ -5456,6 +5394,68 @@ function withErrorHandling(handler) {
|
|
|
5456
5394
|
}
|
|
5457
5395
|
};
|
|
5458
5396
|
}
|
|
5397
|
+
// ../../src/core/http/routeMiddleware.ts
|
|
5398
|
+
function withMiddleware(...middleware) {
|
|
5399
|
+
const wrap = composeMiddleware(...middleware);
|
|
5400
|
+
return (handler) => {
|
|
5401
|
+
return wrap(handler);
|
|
5402
|
+
};
|
|
5403
|
+
}
|
|
5404
|
+
// ../../src/core/http/routeModelBinding.ts
|
|
5405
|
+
function bindRouteModel(param, resolver, handler) {
|
|
5406
|
+
return async (request) => {
|
|
5407
|
+
const id = parsePositiveIntParam(String(request.params[param]), String(param));
|
|
5408
|
+
const model = await resolver(id, request);
|
|
5409
|
+
return await handler(request, model);
|
|
5410
|
+
};
|
|
5411
|
+
}
|
|
5412
|
+
// ../../src/core/http/securedRouteModelBinding.ts
|
|
5413
|
+
function isMutatingPolicyAction(action) {
|
|
5414
|
+
return action === "update" || action === "delete";
|
|
5415
|
+
}
|
|
5416
|
+
function securedBindRouteModel(param, resolver, authorization, handler) {
|
|
5417
|
+
return async (request) => {
|
|
5418
|
+
const id = parsePositiveIntParam(String(request.params[param]), String(param));
|
|
5419
|
+
const model = await resolver(id, request);
|
|
5420
|
+
const gate = resolveApplicationPolicyGate();
|
|
5421
|
+
const auth2 = resolveApplicationAuth();
|
|
5422
|
+
const user = currentAuthUser() ?? await auth2.resolve(request);
|
|
5423
|
+
gate.authorize(authorization.resource, authorization.action, user, model);
|
|
5424
|
+
if (isEtagEnabled() && isMutatingPolicyAction(authorization.action)) {
|
|
5425
|
+
assertIfMatch(request, etagFromResource(model), {
|
|
5426
|
+
required: authorization.requireIfMatch ?? true
|
|
5427
|
+
});
|
|
5428
|
+
}
|
|
5429
|
+
const response = await handler(request, model);
|
|
5430
|
+
if (isEtagEnabled() && authorization.action === "view") {
|
|
5431
|
+
return applyConditionalGet(request, response, etagFromResource(model));
|
|
5432
|
+
}
|
|
5433
|
+
return response;
|
|
5434
|
+
};
|
|
5435
|
+
}
|
|
5436
|
+
function securedBindRouteModelByKey(param, resolver, authorization, handler) {
|
|
5437
|
+
return async (request) => {
|
|
5438
|
+
const key = String(request.params[param] ?? "").trim();
|
|
5439
|
+
if (!key) {
|
|
5440
|
+
throw new BadRequestError(`Missing route parameter "${String(param)}".`);
|
|
5441
|
+
}
|
|
5442
|
+
const model = await resolver(key, request);
|
|
5443
|
+
const gate = resolveApplicationPolicyGate();
|
|
5444
|
+
const auth2 = resolveApplicationAuth();
|
|
5445
|
+
const user = currentAuthUser() ?? await auth2.resolve(request);
|
|
5446
|
+
gate.authorize(authorization.resource, authorization.action, user, model);
|
|
5447
|
+
if (isEtagEnabled() && isMutatingPolicyAction(authorization.action)) {
|
|
5448
|
+
assertIfMatch(request, etagFromResource(model), {
|
|
5449
|
+
required: authorization.requireIfMatch ?? true
|
|
5450
|
+
});
|
|
5451
|
+
}
|
|
5452
|
+
const response = await handler(request, model);
|
|
5453
|
+
if (isEtagEnabled() && authorization.action === "view") {
|
|
5454
|
+
return applyConditionalGet(request, response, etagFromResource(model));
|
|
5455
|
+
}
|
|
5456
|
+
return response;
|
|
5457
|
+
};
|
|
5458
|
+
}
|
|
5459
5459
|
// ../../src/core/http/loginThrottleMiddleware.ts
|
|
5460
5460
|
var {RedisClient: RedisClient2 } = globalThis.Bun;
|
|
5461
5461
|
function resolveLoginIdentity(request) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@getstrata/core",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.55",
|
|
4
4
|
"description": "Strata — Laravel-inspired Bun framework public API",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -445,6 +445,11 @@
|
|
|
445
445
|
"import": "./dist/entries/http/resources.js",
|
|
446
446
|
"default": "./dist/entries/http/resources.js"
|
|
447
447
|
},
|
|
448
|
+
"./http/response": {
|
|
449
|
+
"types": "./dist/core/http/response.d.ts",
|
|
450
|
+
"import": "./dist/entries/http/response.js",
|
|
451
|
+
"default": "./dist/entries/http/response.js"
|
|
452
|
+
},
|
|
448
453
|
"./http/route": {
|
|
449
454
|
"types": "./dist/core/http/route.d.ts",
|
|
450
455
|
"import": "./dist/entries/http/route.js",
|
|
@@ -742,7 +747,7 @@
|
|
|
742
747
|
"build:bundle": "bun build index.ts --outdir dist --target bun --external bun --external eta",
|
|
743
748
|
"build:types": "tsc -p tsconfig.types.json",
|
|
744
749
|
"prepublishOnly": "bun run build && bun ../../scripts/prepare-core-package-publish.ts",
|
|
745
|
-
"build:subpaths": "bun build entries/auth/accessControl.ts entries/auth/abilityChecker.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/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/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/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/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/resources.ts entries/http/route.ts entries/http/routeMiddleware.ts entries/http/routeModelBinding.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/dispatchWebhookJob.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/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/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/tracing/tracingMiddleware.ts entries/validation/rules.ts entries/view.ts --outdir dist --root . --target bun --external bun --external eta --external @getstrata/core --external @getstrata/core/auth/accessControl --external @getstrata/core/auth/abilityChecker --external @getstrata/core/auth/authContext --external @getstrata/core/auth/guard --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/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/connection --external @getstrata/core/database/defaultConnection --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/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/cookies --external @getstrata/core/http/contentNegotiation --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/resources --external @getstrata/core/http/route --external @getstrata/core/http/routeMiddleware --external @getstrata/core/http/routeModelBinding --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/dispatchWebhookJob --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/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/applicationRegistry --external @getstrata/core/runtime/asyncContextStore --external @getstrata/core/scheduler/schedule --external @getstrata/core/security/oauthState --external @getstrata/core/security/publicReads --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/tenantContext --external @getstrata/core/tenant/tenantDatabaseScope --external @getstrata/core/tenant/databaseTenantContext --external @getstrata/core/tenant/tenantMiddleware --external @getstrata/core/tracing/traceContext --external @getstrata/core/tracing/tracingMiddleware --external @getstrata/core/validation/rules --external @getstrata/core/view",
|
|
750
|
+
"build:subpaths": "bun build entries/auth/accessControl.ts entries/auth/abilityChecker.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/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/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/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/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/resources.ts entries/http/response.ts entries/http/route.ts entries/http/routeMiddleware.ts entries/http/routeModelBinding.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/dispatchWebhookJob.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/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/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/tracing/tracingMiddleware.ts entries/validation/rules.ts entries/view.ts --outdir dist --root . --target bun --external bun --external eta --external @getstrata/core --external @getstrata/core/auth/accessControl --external @getstrata/core/auth/abilityChecker --external @getstrata/core/auth/authContext --external @getstrata/core/auth/guard --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/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/connection --external @getstrata/core/database/defaultConnection --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/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/cookies --external @getstrata/core/http/contentNegotiation --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/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/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/dispatchWebhookJob --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/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/applicationRegistry --external @getstrata/core/runtime/asyncContextStore --external @getstrata/core/scheduler/schedule --external @getstrata/core/security/oauthState --external @getstrata/core/security/publicReads --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/tenantContext --external @getstrata/core/tenant/tenantDatabaseScope --external @getstrata/core/tenant/databaseTenantContext --external @getstrata/core/tenant/tenantMiddleware --external @getstrata/core/tracing/traceContext --external @getstrata/core/tracing/tracingMiddleware --external @getstrata/core/validation/rules --external @getstrata/core/view",
|
|
746
751
|
"build:shims": "bun ../../scripts/write-core-shared-shims.ts"
|
|
747
752
|
},
|
|
748
753
|
"publishConfig": {
|