@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.
@@ -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, createdResponse, createRequireAuthMiddleware, jsonResponse, noContentResponse, paginatedResponse, parsePaginationQuery, parsePositiveIntParam, requestIdMiddleware, securedBindRouteModel, securedBindRouteModelByKey, withErrorHandling, withMiddleware, wrapRouteHandler, } from "../core/http/index.ts";
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/http/index.ts
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.54",
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": {