@getstrata/core 0.5.52 → 0.5.53

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.
@@ -48,12 +48,65 @@ function formDataToRecord(formData) {
48
48
  import { currentAuthUser } from "@getstrata/core/auth/authContext";
49
49
  import { BadRequestError as BadRequestError2 } from "@getstrata/core/errors/http";
50
50
  import { currentTenantId } from "@getstrata/core/tenant/tenantContext";
51
+ function buildRequestCacheKey(fallbackPath, request) {
52
+ if (!request) {
53
+ return fallbackPath;
54
+ }
55
+ const url = new URL(request.url);
56
+ const user = currentAuthUser();
57
+ const authScope = user ? `u:${user.id}` : "guest";
58
+ const tenantScope = `t:${currentTenantId()}`;
59
+ return `${authScope}|${tenantScope}|${url.pathname}${url.search}`;
60
+ }
51
61
  function getQueryParams(request) {
52
62
  if (!request) {
53
63
  return new URLSearchParams;
54
64
  }
55
65
  return new URL(request.url).searchParams;
56
66
  }
67
+ function parseOptionalPositiveIntQueryParam(params, name) {
68
+ const value = params.get(name);
69
+ if (value === null || value.trim() === "") {
70
+ return;
71
+ }
72
+ const parsed = Number.parseInt(value, 10);
73
+ if (!Number.isInteger(parsed) || parsed <= 0) {
74
+ throw new BadRequestError2(`Invalid query parameter "${name}". Expected a positive integer.`);
75
+ }
76
+ return parsed;
77
+ }
78
+ function parseOptionalBooleanQueryParam(params, name) {
79
+ const value = params.get(name);
80
+ if (value === null || value.trim() === "") {
81
+ return;
82
+ }
83
+ switch (value.toLowerCase()) {
84
+ case "true":
85
+ case "1":
86
+ return true;
87
+ case "false":
88
+ case "0":
89
+ return false;
90
+ default:
91
+ throw new BadRequestError2(`Invalid query parameter "${name}". Expected a boolean.`);
92
+ }
93
+ }
94
+ function parseOptionalEnumQueryParam(params, name, allowedValues) {
95
+ const value = params.get(name);
96
+ if (value === null || value.trim() === "") {
97
+ return;
98
+ }
99
+ if (!allowedValues.includes(value)) {
100
+ throw new BadRequestError2(`Invalid query parameter "${name}". Expected one of: ${allowedValues.join(", ")}.`);
101
+ }
102
+ return value;
103
+ }
104
+ function expectObject(value, label = "request body") {
105
+ if (value === null || typeof value !== "object" || Array.isArray(value)) {
106
+ throw new BadRequestError2(`${label} must be a JSON object.`);
107
+ }
108
+ return value;
109
+ }
57
110
  async function parseJsonBody(request, validator) {
58
111
  let payload;
59
112
  try {
@@ -63,6 +116,55 @@ async function parseJsonBody(request, validator) {
63
116
  }
64
117
  return validator(payload);
65
118
  }
119
+ function readRequiredString(payload, field, options = {}) {
120
+ const value = payload[field];
121
+ if (typeof value !== "string" || value.trim() === "") {
122
+ throw new BadRequestError2(`"${field}" is required and must be a string.`);
123
+ }
124
+ const trimmed = value.trim();
125
+ if (options.minLength !== undefined && trimmed.length < options.minLength) {
126
+ throw new BadRequestError2(`"${field}" must be at least ${options.minLength} characters.`);
127
+ }
128
+ if (options.maxLength !== undefined && trimmed.length > options.maxLength) {
129
+ throw new BadRequestError2(`"${field}" must be at most ${options.maxLength} characters.`);
130
+ }
131
+ if (options.pattern && !options.pattern.test(trimmed)) {
132
+ throw new BadRequestError2(`"${field}" has an invalid format.`);
133
+ }
134
+ return trimmed;
135
+ }
136
+ function readOptionalString(payload, field, options = {}) {
137
+ if (!(field in payload) || payload[field] === undefined) {
138
+ return;
139
+ }
140
+ return readRequiredString(payload, field, options);
141
+ }
142
+ function readRequiredEnum(payload, field, allowedValues) {
143
+ const value = readRequiredString(payload, field);
144
+ if (!allowedValues.includes(value)) {
145
+ throw new BadRequestError2(`"${field}" must be one of: ${allowedValues.join(", ")}.`);
146
+ }
147
+ return value;
148
+ }
149
+ function readOptionalEnum(payload, field, allowedValues) {
150
+ if (!(field in payload) || payload[field] === undefined) {
151
+ return;
152
+ }
153
+ return readRequiredEnum(payload, field, allowedValues);
154
+ }
155
+ function readRequiredPositiveInt(payload, field) {
156
+ const value = payload[field];
157
+ if (typeof value !== "number" || !Number.isInteger(value) || value <= 0) {
158
+ throw new BadRequestError2(`"${field}" is required and must be a positive integer.`);
159
+ }
160
+ return value;
161
+ }
162
+ function readOptionalPositiveInt(payload, field) {
163
+ if (!(field in payload) || payload[field] === undefined) {
164
+ return;
165
+ }
166
+ return readRequiredPositiveInt(payload, field);
167
+ }
66
168
  function parsePositiveIntParam(value, name = "id") {
67
169
  const parsed = Number.parseInt(value, 10);
68
170
  if (!Number.isInteger(parsed) || parsed <= 0) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@getstrata/core",
3
- "version": "0.5.52",
3
+ "version": "0.5.53",
4
4
  "description": "Strata — Laravel-inspired Bun framework public API",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -255,6 +255,11 @@
255
255
  "import": "./dist/entries/database/repositoryConnection.js",
256
256
  "default": "./dist/entries/database/repositoryConnection.js"
257
257
  },
258
+ "./database/repositoryQuery": {
259
+ "types": "./dist/core/database/repositoryQuery.d.ts",
260
+ "import": "./dist/entries/database/repositoryQuery.js",
261
+ "default": "./dist/entries/database/repositoryQuery.js"
262
+ },
258
263
  "./database/seeders": {
259
264
  "types": "./dist/core/database/seeders/runner.d.ts",
260
265
  "import": "./dist/entries/database/seeders.js",
@@ -285,6 +290,11 @@
285
290
  "import": "./dist/entries/database/types.js",
286
291
  "default": "./dist/entries/database/types.js"
287
292
  },
293
+ "./database/whereBuilder": {
294
+ "types": "./dist/core/database/whereBuilder.d.ts",
295
+ "import": "./dist/entries/database/whereBuilder.js",
296
+ "default": "./dist/entries/database/whereBuilder.js"
297
+ },
288
298
  "./errors/http": {
289
299
  "types": "./dist/core/errors/http.d.ts",
290
300
  "import": "./dist/entries/errors/http.js",
@@ -485,6 +495,11 @@
485
495
  "import": "./dist/entries/http/throttleMiddleware.js",
486
496
  "default": "./dist/entries/http/throttleMiddleware.js"
487
497
  },
498
+ "./http/validation": {
499
+ "types": "./dist/core/http/validation.d.ts",
500
+ "import": "./dist/entries/http/validation.js",
501
+ "default": "./dist/entries/http/validation.js"
502
+ },
488
503
  "./jobs/dispatchWebhookJob": {
489
504
  "types": "./dist/core/jobs/dispatchWebhookJob.d.ts",
490
505
  "import": "./dist/entries/jobs/dispatchWebhookJob.js",
@@ -727,7 +742,7 @@
727
742
  "build:bundle": "bun build index.ts --outdir dist --target bun --external bun --external eta",
728
743
  "build:types": "tsc -p tsconfig.types.json",
729
744
  "prepublishOnly": "bun run build && bun ../../scripts/prepare-core-package-publish.ts",
730
- "build:subpaths": "bun build entries/auth/abilityChecker.ts entries/auth/membershipMiddleware.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/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/seeders.ts entries/database/seeders/types.ts entries/database/schema.ts entries/database/table.ts entries/database/types.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/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/authContext --external @getstrata/core/auth/guard --external @getstrata/core/auth/membershipContext --external @getstrata/core/auth/membershipScope --external @getstrata/core/auth/membershipService --external @getstrata/core/auth/policy --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/repositoryConnection --external @getstrata/core/database/transaction --external @getstrata/core/errors/http --external @getstrata/core/events --external @getstrata/core/http --external @getstrata/core/http/middleware --external @getstrata/core/http/requestMetaContext --external @getstrata/core/notifications --external @getstrata/core/queue/jobRegistry --external @getstrata/core/runtime/applicationRegistry --external @getstrata/core/security/securityEvents --external @getstrata/core/tenant/tenantContext --external @getstrata/core/tenant/tenantMiddleware --external @getstrata/core/tracing/traceContext",
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",
731
746
  "build:shims": "bun ../../scripts/write-core-shared-shims.ts"
732
747
  },
733
748
  "publishConfig": {