@getstrata/core 0.5.20 → 0.5.24

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/dist/index.js CHANGED
@@ -1,47 +1,4 @@
1
1
  // @bun
2
- // ../../src/core/logging/logger.ts
3
- class Logger {
4
- channel;
5
- constructor(channel = "app") {
6
- this.channel = channel;
7
- }
8
- write(level, message, context = {}) {
9
- const entry = {
10
- level,
11
- channel: this.channel,
12
- message,
13
- timestamp: new Date().toISOString(),
14
- ...context
15
- };
16
- const line = JSON.stringify(entry);
17
- if (level === "error") {
18
- console.error(line);
19
- return;
20
- }
21
- console.log(line);
22
- }
23
- debug(message, context) {
24
- this.write("debug", message, context);
25
- }
26
- info(message, context) {
27
- this.write("info", message, context);
28
- }
29
- warn(message, context) {
30
- this.write("warn", message, context);
31
- }
32
- error(message, context) {
33
- this.write("error", message, context);
34
- }
35
- }
36
- var appLogger = new Logger("app");
37
-
38
- // ../../src/bootstrap/config.ts
39
- var CORE_QUEUE_TOKEN = "core.queue";
40
- var CORE_POLICY_GATE_TOKEN = "core.policyGate";
41
- var CORE_AUTH_TOKEN = "core.auth";
42
- var CORE_TOKEN_SERVICE_TOKEN = "core.tokenService";
43
- var DEFAULT_QUEUE_DRIVER = "sync";
44
-
45
2
  // ../../src/bootstrap/contracts.ts
46
3
  class ServiceContainer {
47
4
  services = new Map;
@@ -106,62 +63,9 @@ class ConfigStore {
106
63
  return this.values.has(key);
107
64
  }
108
65
  }
109
- function getRequiredDependency(dependencies, key) {
110
- const dependency = dependencies[key];
111
- if (dependency === undefined) {
112
- throw new Error(`Required dependency "${key}" is not registered.`);
113
- }
114
- return dependency;
115
- }
116
66
  function resolveService(dependencies, token) {
117
67
  return dependencies.container.resolve(token);
118
68
  }
119
-
120
- // ../../src/bootstrap/applicationRegistry.ts
121
- var APPLICATION_CONTEXT_KEY = Symbol.for("@getstrata/applicationContext");
122
- var activeContext;
123
- function readStoredApplicationContext() {
124
- if (activeContext) {
125
- return activeContext;
126
- }
127
- const globalContext = globalThis[APPLICATION_CONTEXT_KEY];
128
- if (globalContext) {
129
- activeContext = globalContext;
130
- }
131
- return activeContext;
132
- }
133
- function setActiveApplicationContext(context) {
134
- activeContext = context;
135
- globalThis[APPLICATION_CONTEXT_KEY] = context;
136
- }
137
- function requireActiveApplicationContext() {
138
- const context = readStoredApplicationContext();
139
- if (!context) {
140
- throw new Error("The application context has not been bootstrapped.");
141
- }
142
- return context;
143
- }
144
- function resolveApplicationCache() {
145
- return getRequiredDependency(requireActiveApplicationContext().dependencies, "cache");
146
- }
147
- function resolveApplicationQueue() {
148
- return requireActiveApplicationContext().container.resolve(CORE_QUEUE_TOKEN);
149
- }
150
- function resolveApplicationAuth() {
151
- return requireActiveApplicationContext().container.resolve(CORE_AUTH_TOKEN);
152
- }
153
- function resolveApplicationPolicyGate() {
154
- return requireActiveApplicationContext().container.resolve(CORE_POLICY_GATE_TOKEN);
155
- }
156
- function resolveApplicationConfig() {
157
- return requireActiveApplicationContext().config;
158
- }
159
- function resolveApplicationLogger() {
160
- return appLogger;
161
- }
162
- function resolveApplicationDependencies() {
163
- return requireActiveApplicationContext().dependencies;
164
- }
165
69
  // ../../src/core/admin/formatValue.ts
166
70
  function formatAdminValue(value, type = "text") {
167
71
  if (value === null || value === undefined) {
@@ -367,6 +271,14 @@ function resolveAbilitiesForRole(role) {
367
271
  return [...MEMBER_ABILITIES];
368
272
  }
369
273
 
274
+ // ../../src/core/contracts/serviceTokens.ts
275
+ var CORE_QUEUE_TOKEN = "core.queue";
276
+ var CORE_POLICY_GATE_TOKEN = "core.policyGate";
277
+ var CORE_AUTH_TOKEN = "core.auth";
278
+ var CORE_TOKEN_SERVICE_TOKEN = "core.tokenService";
279
+ // ../../src/bootstrap/config.ts
280
+ var DEFAULT_QUEUE_DRIVER = "sync";
281
+
370
282
  // ../../src/config/features.ts
371
283
  function readFeatureFlags() {
372
284
  return {
@@ -3309,7 +3221,98 @@ function assertOrganizationReadable(organizationId) {
3309
3221
  throw new NotFoundError(`Organization ${organizationId} not found.`);
3310
3222
  }
3311
3223
  }
3312
- // ../../src/bootstrap/membershipService.ts
3224
+ // ../../src/core/contracts/applicationContext.ts
3225
+ function getRequiredDependency(dependencies, key) {
3226
+ const dependency = dependencies[key];
3227
+ if (dependency === undefined) {
3228
+ throw new Error(`Required dependency "${String(key)}" is not registered.`);
3229
+ }
3230
+ return dependency;
3231
+ }
3232
+
3233
+ // ../../src/core/logging/logger.ts
3234
+ class Logger {
3235
+ channel;
3236
+ constructor(channel = "app") {
3237
+ this.channel = channel;
3238
+ }
3239
+ write(level, message, context = {}) {
3240
+ const entry = {
3241
+ level,
3242
+ channel: this.channel,
3243
+ message,
3244
+ timestamp: new Date().toISOString(),
3245
+ ...context
3246
+ };
3247
+ const line = JSON.stringify(entry);
3248
+ if (level === "error") {
3249
+ console.error(line);
3250
+ return;
3251
+ }
3252
+ console.log(line);
3253
+ }
3254
+ debug(message, context) {
3255
+ this.write("debug", message, context);
3256
+ }
3257
+ info(message, context) {
3258
+ this.write("info", message, context);
3259
+ }
3260
+ warn(message, context) {
3261
+ this.write("warn", message, context);
3262
+ }
3263
+ error(message, context) {
3264
+ this.write("error", message, context);
3265
+ }
3266
+ }
3267
+ var appLogger = new Logger("app");
3268
+
3269
+ // ../../src/core/runtime/applicationRegistry.ts
3270
+ var APPLICATION_CONTEXT_KEY = Symbol.for("@getstrata/applicationContext");
3271
+ var activeContext;
3272
+ function readStoredApplicationContext() {
3273
+ if (activeContext) {
3274
+ return activeContext;
3275
+ }
3276
+ const globalContext = globalThis[APPLICATION_CONTEXT_KEY];
3277
+ if (globalContext) {
3278
+ activeContext = globalContext;
3279
+ }
3280
+ return activeContext;
3281
+ }
3282
+ function setActiveApplicationContext(context) {
3283
+ activeContext = context;
3284
+ globalThis[APPLICATION_CONTEXT_KEY] = context;
3285
+ }
3286
+ function requireActiveApplicationContext() {
3287
+ const context = readStoredApplicationContext();
3288
+ if (!context) {
3289
+ throw new Error("The application context has not been bootstrapped.");
3290
+ }
3291
+ return context;
3292
+ }
3293
+ function resolveApplicationCache() {
3294
+ return getRequiredDependency(requireActiveApplicationContext().dependencies, "cache");
3295
+ }
3296
+ function resolveApplicationQueue() {
3297
+ return requireActiveApplicationContext().container.resolve(CORE_QUEUE_TOKEN);
3298
+ }
3299
+ function resolveApplicationAuth() {
3300
+ return requireActiveApplicationContext().container.resolve(CORE_AUTH_TOKEN);
3301
+ }
3302
+ function resolveApplicationPolicyGate() {
3303
+ return requireActiveApplicationContext().container.resolve(CORE_POLICY_GATE_TOKEN);
3304
+ }
3305
+ function resolveApplicationConfig() {
3306
+ return requireActiveApplicationContext().config;
3307
+ }
3308
+ function resolveApplicationLogger() {
3309
+ return appLogger;
3310
+ }
3311
+ function resolveApplicationDependencies() {
3312
+ return requireActiveApplicationContext().dependencies;
3313
+ }
3314
+
3315
+ // ../../src/core/auth/resolveMembershipService.ts
3313
3316
  function resolveMembershipService() {
3314
3317
  const dependencies = resolveApplicationDependencies();
3315
3318
  if (dependencies.container.has("core.membership")) {
@@ -3920,23 +3923,6 @@ function createCacheStore(options) {
3920
3923
  }
3921
3924
  return new simpleCacheStore_default(new simpleCache_default(options.ttlMs, options.maxEntries));
3922
3925
  }
3923
- // ../../src/bootstrap/discoverModules.ts
3924
- var appModules = [];
3925
- function discoverModules() {
3926
- return appModules;
3927
- }
3928
-
3929
- // ../../src/bootstrap/cache/modelCacheTags.ts
3930
- function cacheTagsForModelWrite(tableName, action) {
3931
- const module = discoverModules().find((entry) => entry.tableName === tableName);
3932
- const baseTags = module?.cacheTags ?? [`${tableName}s`];
3933
- const isDelete = action === "deleted" || action === "force-deleted";
3934
- const extraTags = isDelete ? module?.cacheDeleteExtraTags ?? [] : [];
3935
- return [...new Set([...baseTags, ...extraTags])];
3936
- }
3937
- function discoverModelTableNames() {
3938
- return discoverModules().map((module) => module.tableName).filter((tableName) => tableName !== undefined);
3939
- }
3940
3926
  // ../../src/core/cache/taggedCache.ts
3941
3927
  class TaggedCache {
3942
3928
  store;
@@ -5305,7 +5291,7 @@ function bindRouteModel(param, resolver, handler) {
5305
5291
  return await handler(request, model);
5306
5292
  };
5307
5293
  }
5308
- // ../../src/bootstrap/http/securedRouteModelBinding.ts
5294
+ // ../../src/core/http/securedRouteModelBinding.ts
5309
5295
  function isMutatingPolicyAction(action) {
5310
5296
  return action === "update" || action === "delete";
5311
5297
  }
@@ -6119,7 +6105,6 @@ var failedJobService_default = FailedJobService;
6119
6105
 
6120
6106
  // ../../src/core/queue/jobRegistry.ts
6121
6107
  class JobRegistry {
6122
- constructor() {}
6123
6108
  factories = new Map;
6124
6109
  instances = new WeakMap;
6125
6110
  register(name, factory) {
@@ -6143,7 +6128,17 @@ class JobRegistry {
6143
6128
  return [...this.factories.keys()];
6144
6129
  }
6145
6130
  }
6146
- var jobRegistry = new JobRegistry;
6131
+ var JOB_REGISTRY_KEY = Symbol.for("@getstrata/jobRegistry");
6132
+ function readSharedJobRegistry() {
6133
+ const globalRegistry = globalThis[JOB_REGISTRY_KEY];
6134
+ if (globalRegistry) {
6135
+ return globalRegistry;
6136
+ }
6137
+ const registry = new JobRegistry;
6138
+ globalThis[JOB_REGISTRY_KEY] = registry;
6139
+ return registry;
6140
+ }
6141
+ var jobRegistry = readSharedJobRegistry();
6147
6142
 
6148
6143
  // ../../src/config/queue.ts
6149
6144
  var queueConfig = {
@@ -6358,16 +6353,6 @@ function createQueueWorker(redisUrl, failedJobs = createFailedJobService()) {
6358
6353
  }
6359
6354
  // ../../src/core/queue/queueMetrics.ts
6360
6355
  var {RedisClient: RedisClient6 } = globalThis.Bun;
6361
-
6362
- // ../../src/core/security/safeUrl.ts
6363
- var BLOCKED_HOSTNAMES = new Set([
6364
- "localhost",
6365
- "127.0.0.1",
6366
- "0.0.0.0",
6367
- "::1",
6368
- "metadata.google.internal"
6369
- ]);
6370
- // ../../src/core/queue/queueMetrics.ts
6371
6356
  async function readRedisQueueDepth(redisUrl) {
6372
6357
  const client = new RedisClient6(redisUrl);
6373
6358
  const [high, defaultQueue, low] = await Promise.all([
@@ -6821,7 +6806,6 @@ export {
6821
6806
  etagFromResource,
6822
6807
  emptyPaginateResult,
6823
6808
  emailRule,
6824
- discoverModelTableNames,
6825
6809
  dehydrateValue,
6826
6810
  defineTable,
6827
6811
  currentTraceId,
@@ -6871,7 +6855,6 @@ export {
6871
6855
  composeMiddleware,
6872
6856
  compileBlueprint,
6873
6857
  collectQueueMetrics,
6874
- cacheTagsForModelWrite,
6875
6858
  cache,
6876
6859
  buildSmtpPayload,
6877
6860
  buildRequestCacheKey,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@getstrata/core",
3
- "version": "0.5.20",
3
+ "version": "0.5.24",
4
4
  "description": "Strata — Laravel-inspired Bun framework public API",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -95,6 +95,11 @@
95
95
  "import": "./dist/entries/cache/createCacheStore.js",
96
96
  "default": "./dist/entries/cache/createCacheStore.js"
97
97
  },
98
+ "./contracts/serviceTokens": {
99
+ "types": "./dist/core/contracts/serviceTokens.d.ts",
100
+ "import": "./dist/entries/contracts/serviceTokens.js",
101
+ "default": "./dist/entries/contracts/serviceTokens.js"
102
+ },
98
103
  "./crypto/fieldEncryption": {
99
104
  "types": "./dist/core/crypto/fieldEncryption.d.ts",
100
105
  "import": "./dist/entries/crypto/fieldEncryption.js",
@@ -240,6 +245,11 @@
240
245
  "import": "./dist/entries/queue/types.js",
241
246
  "default": "./dist/entries/queue/types.js"
242
247
  },
248
+ "./runtime/applicationRegistry": {
249
+ "types": "./dist/core/runtime/applicationRegistry.d.ts",
250
+ "import": "./dist/entries/runtime/applicationRegistry.js",
251
+ "default": "./dist/entries/runtime/applicationRegistry.js"
252
+ },
243
253
  "./security/oauthState": {
244
254
  "types": "./dist/core/security/oauthState.d.ts",
245
255
  "import": "./dist/entries/security/oauthState.js",
@@ -317,7 +327,7 @@
317
327
  "build:bundle": "bun build index.ts --outdir dist --target bun --external bun --external eta",
318
328
  "build:types": "tsc -p tsconfig.types.json",
319
329
  "prepublishOnly": "bun run build && bun ../../scripts/prepare-core-package-publish.ts",
320
- "build:subpaths": "bun build entries/auth/oauth/oidcProvider.ts entries/auth/oauth/providers.ts entries/auth/oauth/samlProvider.ts entries/auth/oauth/types.ts entries/auth/password.ts entries/auth/sessionCookie.ts entries/auth/tokenHash.ts entries/cache/tags.ts entries/cache/createCacheStore.ts entries/crypto/fieldEncryption.ts entries/crypto/mfaSecret.ts entries/database/factory.ts entries/database/seeders.ts entries/database/types.ts entries/errors/http.ts entries/http/contentNegotiation.ts entries/http/csrfToken.ts entries/http/etag.ts entries/http/flashSession.ts entries/http/parseFormBody.ts entries/http/resources.ts entries/http/webErrorResponse.ts entries/http/webFormRequest.ts entries/jobs/dispatchWebhookJob.ts entries/lifecycle/gracefulShutdown.ts entries/metrics/prometheus.ts entries/pagination.ts entries/queue/createAppQueue.ts entries/queue/failedJobService.ts entries/queue/jobRegistry.ts entries/queue/jobRunner.ts entries/queue/queueMetrics.ts entries/queue/publicQueue.ts entries/queue/types.ts entries/security/oauthState.ts entries/security/publicReads.ts entries/security/safeUrl.ts entries/security/stripeWebhook.ts entries/security/tokenExpiry.ts entries/security/totp.ts entries/storage/storage.ts entries/validation/rules.ts entries/view.ts --outdir dist --root . --target bun --external bun --external eta",
330
+ "build:subpaths": "bun build entries/auth/oauth/oidcProvider.ts entries/auth/oauth/providers.ts entries/auth/oauth/samlProvider.ts entries/auth/oauth/types.ts entries/auth/password.ts entries/auth/sessionCookie.ts entries/auth/tokenHash.ts entries/cache/tags.ts entries/cache/createCacheStore.ts entries/contracts/serviceTokens.ts entries/crypto/fieldEncryption.ts entries/crypto/mfaSecret.ts entries/database/factory.ts entries/database/seeders.ts entries/database/types.ts entries/errors/http.ts entries/http/contentNegotiation.ts entries/http/csrfToken.ts entries/http/etag.ts entries/http/flashSession.ts entries/http/parseFormBody.ts entries/http/resources.ts entries/http/webErrorResponse.ts entries/http/webFormRequest.ts entries/jobs/dispatchWebhookJob.ts entries/lifecycle/gracefulShutdown.ts entries/metrics/prometheus.ts entries/pagination.ts entries/queue/createAppQueue.ts entries/queue/failedJobService.ts entries/queue/jobRegistry.ts entries/queue/jobRunner.ts entries/queue/queueMetrics.ts entries/queue/publicQueue.ts entries/queue/types.ts entries/security/oauthState.ts entries/security/publicReads.ts entries/security/safeUrl.ts entries/security/stripeWebhook.ts entries/security/tokenExpiry.ts entries/security/totp.ts entries/storage/storage.ts entries/validation/rules.ts entries/view.ts --outdir dist --root . --target bun --external bun --external eta",
321
331
  "build:shims": "bun ../../scripts/write-core-shared-shims.ts"
322
332
  },
323
333
  "publishConfig": {
@@ -1,16 +0,0 @@
1
- import type { AuthManager } from "../core/auth/guard";
2
- import type { PolicyGate } from "../core/auth/policy";
3
- import { type Logger } from "../core/logging/logger";
4
- import type { Queue } from "../core/queue";
5
- import type { CacheLike } from "../types/services";
6
- import type { AppContext } from "./contracts";
7
- import { type ConfigStore } from "./contracts";
8
- declare function setActiveApplicationContext(context: AppContext): void;
9
- declare function resolveApplicationCache(): CacheLike;
10
- declare function resolveApplicationQueue(): Queue;
11
- declare function resolveApplicationAuth(): AuthManager;
12
- declare function resolveApplicationPolicyGate(): PolicyGate;
13
- declare function resolveApplicationConfig(): ConfigStore;
14
- declare function resolveApplicationLogger(): Logger;
15
- declare function resolveApplicationDependencies(): import("./contracts").AppDependencies;
16
- export { resolveApplicationAuth, resolveApplicationCache, resolveApplicationConfig, resolveApplicationDependencies, resolveApplicationLogger, resolveApplicationPolicyGate, resolveApplicationQueue, setActiveApplicationContext, };
@@ -1,3 +0,0 @@
1
- declare function cacheTagsForModelWrite(tableName: string, action: string): string[];
2
- declare function discoverModelTableNames(): string[];
3
- export { cacheTagsForModelWrite, discoverModelTableNames };
@@ -1,5 +0,0 @@
1
- import type { AppModule } from "./contracts";
2
- declare let appModules: AppModule[];
3
- declare function ensureModulesLoaded(): Promise<AppModule[]>;
4
- declare function discoverModules(): AppModule[];
5
- export { appModules, discoverModules, ensureModulesLoaded };
@@ -1,11 +0,0 @@
1
- import type { Policy } from "../../core/auth/policy";
2
- import type { RouteRequest } from "../../core/http/route";
3
- interface RouteModelAuthorization {
4
- resource: string;
5
- action: keyof Policy;
6
- requireIfMatch?: boolean;
7
- }
8
- declare function securedBindRouteModel<TParams extends Record<string, string>, TModel, TParam extends keyof TParams & string>(param: TParam, resolver: (id: number, request: RouteRequest<TParams>) => Promise<TModel>, authorization: RouteModelAuthorization, handler: (request: RouteRequest<TParams>, model: TModel) => Response | Promise<Response>): (request: RouteRequest<TParams>) => Promise<Response>;
9
- declare function securedBindRouteModelByKey<TParams extends Record<string, string>, TModel, TParam extends keyof TParams & string>(param: TParam, resolver: (key: string, request: RouteRequest<TParams>) => Promise<TModel>, authorization: RouteModelAuthorization, handler: (request: RouteRequest<TParams>, model: TModel) => Response | Promise<Response>): (request: RouteRequest<TParams>) => Promise<Response>;
10
- export type { RouteModelAuthorization };
11
- export { securedBindRouteModel, securedBindRouteModelByKey };
@@ -1,2 +0,0 @@
1
- declare function registerDefaultJobs(): void;
2
- export { registerDefaultJobs };
@@ -1 +0,0 @@
1
- export { cacheTagsForModelWrite, discoverModelTableNames, } from "../../bootstrap/cache/modelCacheTags.ts";