@getstrata/bootstrap 0.2.47 → 0.2.48

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.
@@ -1,64 +1,28 @@
1
1
  // @bun
2
2
  var __jsonParse = (a) => JSON.parse(a);
3
3
 
4
- // ../../src/config/app.ts
5
- var appConfig = {
6
- name: "WorkHub",
7
- env: process.env.APP_ENV ?? "local",
8
- debug: (process.env.APP_DEBUG ?? "true") !== "false",
9
- url: process.env.APP_URL ?? "http://localhost:3000",
10
- apiPrefix: process.env.API_PREFIX ?? "/api/v1"
11
- };
12
-
13
- // ../../src/config/features.ts
14
- function readFeatureFlags() {
15
- return {
16
- webhooks: (process.env.FEATURE_WEBHOOKS ?? "true") !== "false",
17
- fullTextSearch: (process.env.FEATURE_SEARCH ?? "true") !== "false",
18
- auditLog: (process.env.FEATURE_AUDIT_LOG ?? "true") !== "false",
19
- oauthLogin: (process.env.FEATURE_OAUTH ?? "true") !== "false",
20
- samlLogin: (process.env.FEATURE_SAML ?? "false") === "true",
21
- scim: (process.env.FEATURE_SCIM ?? "true") !== "false",
22
- billing: (process.env.FEATURE_BILLING ?? "true") !== "false",
23
- siemExport: (process.env.FEATURE_SIEM_EXPORT ?? "true") !== "false",
24
- publicReads: (process.env.FEATURE_PUBLIC_READS ?? "true") !== "false",
25
- emailVerification: (process.env.FEATURE_EMAIL_VERIFICATION ?? "false") === "true",
26
- mfa: (process.env.FEATURE_MFA ?? "false") === "true"
27
- };
28
- }
29
- var featureFlags = readFeatureFlags();
30
- function isFeatureEnabled(feature) {
31
- return readFeatureFlags()[feature];
32
- }
33
-
34
- // ../../src/domain/auth.ts
35
- var TEST_ADMIN_API_TOKEN = "workhub-admin-test-token";
36
- var TEST_MEMBER_API_TOKEN = "workhub-member-test-token";
37
-
38
- // ../../src/domain/scim.ts
39
- var TEST_SCIM_BEARER_TOKEN = "workhub-scim-test-token";
40
- var DEFAULT_SCIM_BEARER_TOKEN = TEST_SCIM_BEARER_TOKEN;
41
- var SCIM_SCHEMAS = {
42
- user: "urn:ietf:params:scim:schemas:core:2.0:User",
43
- group: "urn:ietf:params:scim:schemas:core:2.0:Group",
44
- listResponse: "urn:ietf:params:scim:api:messages:2.0:ListResponse",
45
- patchOp: "urn:ietf:params:scim:api:messages:2.0:PatchOp",
46
- serviceProviderConfig: "urn:ietf:params:scim:schemas:core:2.0:ServiceProviderConfig"
47
- };
48
-
49
4
  // ../../src/bootstrap/secretsGuard.ts
50
- var DEFAULT_TOKENS = new Set([TEST_ADMIN_API_TOKEN, TEST_MEMBER_API_TOKEN]);
51
- var DEFAULT_SCIM_TOKENS = new Set([TEST_SCIM_BEARER_TOKEN, DEFAULT_SCIM_BEARER_TOKEN]);
5
+ var DEFAULT_ADMIN_API_TOKEN = "workhub-admin-test-token";
6
+ var DEFAULT_MEMBER_API_TOKEN = "workhub-member-test-token";
7
+ var DEFAULT_SCIM_BEARER_TOKEN = "workhub-scim-test-token";
8
+ var DEFAULT_TOKENS = new Set([DEFAULT_ADMIN_API_TOKEN, DEFAULT_MEMBER_API_TOKEN]);
9
+ var DEFAULT_SCIM_TOKENS = new Set([DEFAULT_SCIM_BEARER_TOKEN]);
10
+ function isEnabled(value, defaultEnabled) {
11
+ if (value === undefined) {
12
+ return defaultEnabled;
13
+ }
14
+ return defaultEnabled ? value !== "false" : value === "true";
15
+ }
52
16
  function assertProductionSecrets(env = process.env) {
53
- const appEnv = env.APP_ENV ?? appConfig.env;
17
+ const appEnv = env.APP_ENV ?? "local";
54
18
  if (appEnv !== "production") {
55
19
  return;
56
20
  }
57
- const adminToken = env.ADMIN_API_TOKEN ?? TEST_ADMIN_API_TOKEN;
58
- const memberToken = env.MEMBER_API_TOKEN ?? TEST_MEMBER_API_TOKEN;
21
+ const adminToken = env.ADMIN_API_TOKEN ?? DEFAULT_ADMIN_API_TOKEN;
22
+ const memberToken = env.MEMBER_API_TOKEN ?? DEFAULT_MEMBER_API_TOKEN;
59
23
  const scimToken = env.SCIM_BEARER_TOKEN ?? DEFAULT_SCIM_BEARER_TOKEN;
60
- const encryptionEnabled = env.FEATURE_FIELD_ENCRYPTION !== "false";
61
- const devHeadersEnabled = (env.AUTH_DEV_HEADERS ?? "true") !== "false";
24
+ const encryptionEnabled = isEnabled(env.FEATURE_FIELD_ENCRYPTION, true);
25
+ const devHeadersEnabled = isEnabled(env.AUTH_DEV_HEADERS, true);
62
26
  if (devHeadersEnabled) {
63
27
  throw new Error("Production startup blocked: set AUTH_DEV_HEADERS=false to disable development auth headers.");
64
28
  }
@@ -71,18 +35,17 @@ function assertProductionSecrets(env = process.env) {
71
35
  if (encryptionEnabled && !env.KMS_ENCRYPTION_KEY?.trim()) {
72
36
  throw new Error("Production startup blocked: set KMS_ENCRYPTION_KEY when field encryption is enabled.");
73
37
  }
74
- if (!env.SIEM_EXPORT_URL?.trim() && isFeatureEnabled("siemExport")) {
38
+ if (!env.SIEM_EXPORT_URL?.trim() && isEnabled(env.FEATURE_SIEM_EXPORT, true)) {
75
39
  console.warn("[secrets] SIEM_EXPORT_URL is not configured; audit logs remain database-only.");
76
40
  }
77
- const billingEnabled = (env.FEATURE_BILLING ?? "true") !== "false";
78
- if (billingEnabled && !env.STRIPE_WEBHOOK_SECRET?.trim()) {
41
+ if (isEnabled(env.FEATURE_BILLING, true) && !env.STRIPE_WEBHOOK_SECRET?.trim()) {
79
42
  throw new Error("Production startup blocked: set STRIPE_WEBHOOK_SECRET when billing webhooks are enabled.");
80
43
  }
81
44
  const corsOrigins = (env.CORS_ALLOWED_ORIGINS ?? "*").split(",").map((origin) => origin.trim());
82
45
  if (corsOrigins.includes("*")) {
83
46
  throw new Error("Production startup blocked: set explicit CORS_ALLOWED_ORIGINS instead of wildcard.");
84
47
  }
85
- if ((env.FEATURE_PUBLIC_READS ?? "true") !== "false") {
48
+ if (isEnabled(env.FEATURE_PUBLIC_READS, true)) {
86
49
  throw new Error("Production startup blocked: set FEATURE_PUBLIC_READS=false for authenticated-only reads.");
87
50
  }
88
51
  if (!env.OAUTH_STATE_SECRET?.trim()) {
@@ -94,6 +57,10 @@ function assertProductionSecrets(env = process.env) {
94
57
  if (!env.API_TOKEN_DEFAULT_EXPIRY_DAYS?.trim()) {
95
58
  throw new Error("Production startup blocked: set API_TOKEN_DEFAULT_EXPIRY_DAYS to enforce token rotation.");
96
59
  }
60
+ const frontendMode = (env.FRONTEND_MODE ?? "api").trim();
61
+ if (frontendMode === "server-htmx" && !env.SESSION_SECRET?.trim()) {
62
+ throw new Error("Production startup blocked: set SESSION_SECRET when FRONTEND_MODE=server-htmx.");
63
+ }
97
64
  }
98
65
  export {
99
66
  assertProductionSecrets
@@ -34,6 +34,6 @@ async function parseFormBody(request) {
34
34
  return { fields, files };
35
35
  }
36
36
  export {
37
- parseFormBody,
38
- createCsrfProtection
37
+ createCsrfProtection,
38
+ parseFormBody
39
39
  };
@@ -178,7 +178,7 @@ class HttpKernel {
178
178
  return this.wrap(["api", "authenticated"], handler);
179
179
  }
180
180
  wrapWeb(handler) {
181
- return handler;
181
+ return this.wrap("web", handler);
182
182
  }
183
183
  wrapWebPublicRead(handler) {
184
184
  if (isPublicReadsEnabled()) {
@@ -188,19 +188,19 @@ class HttpKernel {
188
188
  }
189
189
  wrapWebAuthenticated(handler) {
190
190
  const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
191
- return withMiddleware(createRequireWebAuthMiddleware(auth))(handler);
191
+ return this.wrap("web", withMiddleware(createRequireWebAuthMiddleware(auth))(handler));
192
192
  }
193
193
  wrapWebAbility(ability, handler) {
194
194
  const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
195
195
  const abilityChecker = this.dependencies.container.resolve(CORE_TOKEN_SERVICE_TOKEN);
196
196
  const requireAbility = createRequireAbilityMiddleware(abilityChecker);
197
197
  const middleware = [createRequireWebAuthMiddleware(auth), requireAbility(ability)];
198
- return withMiddleware(...middleware)(handler);
198
+ return this.wrap("web", withMiddleware(...middleware)(handler));
199
199
  }
200
200
  wrapWebGlobalAdmin(handler) {
201
201
  const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
202
202
  const middleware = [createRequireWebAuthMiddleware(auth), createRequireGlobalAdminMiddleware()];
203
- return withMiddleware(...middleware)(handler);
203
+ return this.wrap("web", withMiddleware(...middleware)(handler));
204
204
  }
205
205
  wrapAuthenticated(handler) {
206
206
  return this.wrap("authenticated", handler);
@@ -319,10 +319,10 @@ function createRouteKernel(dependencies) {
319
319
  return createHttpKernel(dependencies);
320
320
  }
321
321
  export {
322
- wrapWebRegister,
323
- wrapWebLogin,
324
- wrapSecuredRouteModelByKey,
325
- toRouteRequest,
322
+ createRouteKernel,
326
323
  routeParams,
327
- createRouteKernel
324
+ toRouteRequest,
325
+ wrapSecuredRouteModelByKey,
326
+ wrapWebLogin,
327
+ wrapWebRegister
328
328
  };
@@ -54,6 +54,6 @@ function createWebServer(options) {
54
54
  });
55
55
  }
56
56
  export {
57
- createWebServer,
58
- convertAppRoutesToBunRoutes
57
+ convertAppRoutesToBunRoutes,
58
+ createWebServer
59
59
  };
package/dist/index.js CHANGED
@@ -1,96 +1,7 @@
1
1
  // @bun
2
2
  // ../../src/bootstrap/public-api.ts
3
- import { appSchedule as appSchedule3, runDueScheduledTasks as runDueScheduledTasks2, Schedule as Schedule2 } from "@getstrata/core/scheduler/schedule";
3
+ import { appSchedule, runDueScheduledTasks, Schedule } from "@getstrata/core/scheduler/schedule";
4
4
 
5
- // ../../src/core/scheduler/schedule.ts
6
- class Schedule {
7
- tasks = [];
8
- command(expression, name, run) {
9
- this.tasks.push({ expression, name, run });
10
- return this;
11
- }
12
- dueTasks(now = new Date) {
13
- const minute = now.getMinutes();
14
- return this.tasks.filter((task) => {
15
- if (task.expression === "* * * * *") {
16
- return true;
17
- }
18
- if (task.expression.startsWith("*/")) {
19
- const interval = Number.parseInt(task.expression.slice(2), 10);
20
- return Number.isInteger(interval) && interval > 0 && minute % interval === 0;
21
- }
22
- return false;
23
- });
24
- }
25
- tasksList() {
26
- return [...this.tasks];
27
- }
28
- }
29
- var appSchedule = new Schedule;
30
- async function runDueScheduledTasks(schedule = appSchedule, now = new Date) {
31
- const due = schedule.dueTasks(now);
32
- for (const task of due) {
33
- await task.run();
34
- }
35
- return due.length;
36
- }
37
-
38
- // ../../src/bootstrap/schedule.ts
39
- import { exportPendingAuditLogs } from "@getstrata/core/audit/exportAuditLogs";
40
- import { appLogger } from "@getstrata/core/logging/logger";
41
- import { appSchedule as appSchedule2 } from "@getstrata/core/scheduler/schedule";
42
-
43
- // ../../src/config/features.ts
44
- function readFeatureFlags() {
45
- return {
46
- webhooks: (process.env.FEATURE_WEBHOOKS ?? "true") !== "false",
47
- fullTextSearch: (process.env.FEATURE_SEARCH ?? "true") !== "false",
48
- auditLog: (process.env.FEATURE_AUDIT_LOG ?? "true") !== "false",
49
- oauthLogin: (process.env.FEATURE_OAUTH ?? "true") !== "false",
50
- samlLogin: (process.env.FEATURE_SAML ?? "false") === "true",
51
- scim: (process.env.FEATURE_SCIM ?? "true") !== "false",
52
- billing: (process.env.FEATURE_BILLING ?? "true") !== "false",
53
- siemExport: (process.env.FEATURE_SIEM_EXPORT ?? "true") !== "false",
54
- publicReads: (process.env.FEATURE_PUBLIC_READS ?? "true") !== "false",
55
- emailVerification: (process.env.FEATURE_EMAIL_VERIFICATION ?? "false") === "true",
56
- mfa: (process.env.FEATURE_MFA ?? "false") === "true"
57
- };
58
- }
59
- var featureFlags = readFeatureFlags();
60
- function isFeatureEnabled(feature) {
61
- return readFeatureFlags()[feature];
62
- }
63
-
64
- // ../../src/bootstrap/schedule.ts
65
- appSchedule2.command("* * * * *", "heartbeat", () => {
66
- appLogger.debug("Scheduler heartbeat");
67
- });
68
- appSchedule2.command("* * * * *", "audit-export", async () => {
69
- if (!isFeatureEnabled("siemExport")) {
70
- return;
71
- }
72
- try {
73
- const exported = await exportPendingAuditLogs();
74
- if (exported > 0) {
75
- appLogger.info(`Exported ${exported} audit log entries to SIEM.`);
76
- }
77
- } catch (error) {
78
- appLogger.error("Audit export failed.", { error: String(error) });
79
- }
80
- });
81
-
82
- // ../../src/cli/commands/scheduleRun.ts
83
- async function scheduleRunCommand() {
84
- const due = appSchedule.dueTasks();
85
- if (due.length === 0) {
86
- console.log("No scheduled tasks due.");
87
- return;
88
- }
89
- for (const task of due) {
90
- console.log(`Running scheduled task: ${task.name}`);
91
- }
92
- await runDueScheduledTasks(appSchedule);
93
- }
94
5
  // ../../src/bootstrap/applicationRegistry.ts
95
6
  import {
96
7
  resolveApplicationAuth,
@@ -271,7 +182,7 @@ class HttpKernel {
271
182
  return this.wrap(["api", "authenticated"], handler);
272
183
  }
273
184
  wrapWeb(handler) {
274
- return handler;
185
+ return this.wrap("web", handler);
275
186
  }
276
187
  wrapWebPublicRead(handler) {
277
188
  if (isPublicReadsEnabled()) {
@@ -281,19 +192,19 @@ class HttpKernel {
281
192
  }
282
193
  wrapWebAuthenticated(handler) {
283
194
  const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
284
- return withMiddleware(createRequireWebAuthMiddleware(auth))(handler);
195
+ return this.wrap("web", withMiddleware(createRequireWebAuthMiddleware(auth))(handler));
285
196
  }
286
197
  wrapWebAbility(ability, handler) {
287
198
  const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
288
199
  const abilityChecker = this.dependencies.container.resolve(CORE_TOKEN_SERVICE_TOKEN);
289
200
  const requireAbility = createRequireAbilityMiddleware(abilityChecker);
290
201
  const middleware = [createRequireWebAuthMiddleware(auth), requireAbility(ability)];
291
- return withMiddleware(...middleware)(handler);
202
+ return this.wrap("web", withMiddleware(...middleware)(handler));
292
203
  }
293
204
  wrapWebGlobalAdmin(handler) {
294
205
  const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
295
206
  const middleware = [createRequireWebAuthMiddleware(auth), createRequireGlobalAdminMiddleware()];
296
- return withMiddleware(...middleware)(handler);
207
+ return this.wrap("web", withMiddleware(...middleware)(handler));
297
208
  }
298
209
  wrapAuthenticated(handler) {
299
210
  return this.wrap("authenticated", handler);
@@ -392,7 +303,7 @@ function resolveModulesDirectory(options) {
392
303
  if (state.configuredModulesDir) {
393
304
  return state.configuredModulesDir;
394
305
  }
395
- return join(import.meta.dir, "../modules");
306
+ throw new Error("configureModulesDirectory() must be called before discovering modules. WorkHub and the starter do this from preload.");
396
307
  }
397
308
  async function loadDiscoveredModules(options) {
398
309
  const modulesDirectory = resolveModulesDirectory(options);
@@ -514,7 +425,7 @@ function buildWebModuleRoutes(dependencies, options = {}) {
514
425
  routeRegistry.clear();
515
426
  }
516
427
  const kernel = createHttpKernel(dependencies);
517
- const middleware = [...kernel.globalMiddleware(), ...kernel.group("web")];
428
+ const middleware = kernel.globalMiddleware();
518
429
  const moduleRoutes = { ...seedRoutes };
519
430
  for (const module of modules) {
520
431
  if (!module.webRoutes) {
@@ -907,27 +818,28 @@ var coreProviders = [
907
818
  viewProvider
908
819
  ];
909
820
 
910
- // ../../src/domain/auth.ts
911
- var TEST_ADMIN_API_TOKEN = "workhub-admin-test-token";
912
- var TEST_MEMBER_API_TOKEN = "workhub-member-test-token";
913
-
914
- // ../../src/domain/scim.ts
915
- var TEST_SCIM_BEARER_TOKEN = "workhub-scim-test-token";
916
- var DEFAULT_SCIM_BEARER_TOKEN = TEST_SCIM_BEARER_TOKEN;
917
-
918
821
  // ../../src/bootstrap/secretsGuard.ts
919
- var DEFAULT_TOKENS = new Set([TEST_ADMIN_API_TOKEN, TEST_MEMBER_API_TOKEN]);
920
- var DEFAULT_SCIM_TOKENS = new Set([TEST_SCIM_BEARER_TOKEN, DEFAULT_SCIM_BEARER_TOKEN]);
822
+ var DEFAULT_ADMIN_API_TOKEN = "workhub-admin-test-token";
823
+ var DEFAULT_MEMBER_API_TOKEN = "workhub-member-test-token";
824
+ var DEFAULT_SCIM_BEARER_TOKEN = "workhub-scim-test-token";
825
+ var DEFAULT_TOKENS = new Set([DEFAULT_ADMIN_API_TOKEN, DEFAULT_MEMBER_API_TOKEN]);
826
+ var DEFAULT_SCIM_TOKENS = new Set([DEFAULT_SCIM_BEARER_TOKEN]);
827
+ function isEnabled(value, defaultEnabled) {
828
+ if (value === undefined) {
829
+ return defaultEnabled;
830
+ }
831
+ return defaultEnabled ? value !== "false" : value === "true";
832
+ }
921
833
  function assertProductionSecrets(env = process.env) {
922
- const appEnv = env.APP_ENV ?? appConfig.env;
834
+ const appEnv = env.APP_ENV ?? "local";
923
835
  if (appEnv !== "production") {
924
836
  return;
925
837
  }
926
- const adminToken = env.ADMIN_API_TOKEN ?? TEST_ADMIN_API_TOKEN;
927
- const memberToken = env.MEMBER_API_TOKEN ?? TEST_MEMBER_API_TOKEN;
838
+ const adminToken = env.ADMIN_API_TOKEN ?? DEFAULT_ADMIN_API_TOKEN;
839
+ const memberToken = env.MEMBER_API_TOKEN ?? DEFAULT_MEMBER_API_TOKEN;
928
840
  const scimToken = env.SCIM_BEARER_TOKEN ?? DEFAULT_SCIM_BEARER_TOKEN;
929
- const encryptionEnabled = env.FEATURE_FIELD_ENCRYPTION !== "false";
930
- const devHeadersEnabled = (env.AUTH_DEV_HEADERS ?? "true") !== "false";
841
+ const encryptionEnabled = isEnabled(env.FEATURE_FIELD_ENCRYPTION, true);
842
+ const devHeadersEnabled = isEnabled(env.AUTH_DEV_HEADERS, true);
931
843
  if (devHeadersEnabled) {
932
844
  throw new Error("Production startup blocked: set AUTH_DEV_HEADERS=false to disable development auth headers.");
933
845
  }
@@ -940,18 +852,17 @@ function assertProductionSecrets(env = process.env) {
940
852
  if (encryptionEnabled && !env.KMS_ENCRYPTION_KEY?.trim()) {
941
853
  throw new Error("Production startup blocked: set KMS_ENCRYPTION_KEY when field encryption is enabled.");
942
854
  }
943
- if (!env.SIEM_EXPORT_URL?.trim() && isFeatureEnabled("siemExport")) {
855
+ if (!env.SIEM_EXPORT_URL?.trim() && isEnabled(env.FEATURE_SIEM_EXPORT, true)) {
944
856
  console.warn("[secrets] SIEM_EXPORT_URL is not configured; audit logs remain database-only.");
945
857
  }
946
- const billingEnabled = (env.FEATURE_BILLING ?? "true") !== "false";
947
- if (billingEnabled && !env.STRIPE_WEBHOOK_SECRET?.trim()) {
858
+ if (isEnabled(env.FEATURE_BILLING, true) && !env.STRIPE_WEBHOOK_SECRET?.trim()) {
948
859
  throw new Error("Production startup blocked: set STRIPE_WEBHOOK_SECRET when billing webhooks are enabled.");
949
860
  }
950
861
  const corsOrigins = (env.CORS_ALLOWED_ORIGINS ?? "*").split(",").map((origin) => origin.trim());
951
862
  if (corsOrigins.includes("*")) {
952
863
  throw new Error("Production startup blocked: set explicit CORS_ALLOWED_ORIGINS instead of wildcard.");
953
864
  }
954
- if ((env.FEATURE_PUBLIC_READS ?? "true") !== "false") {
865
+ if (isEnabled(env.FEATURE_PUBLIC_READS, true)) {
955
866
  throw new Error("Production startup blocked: set FEATURE_PUBLIC_READS=false for authenticated-only reads.");
956
867
  }
957
868
  if (!env.OAUTH_STATE_SECRET?.trim()) {
@@ -963,6 +874,10 @@ function assertProductionSecrets(env = process.env) {
963
874
  if (!env.API_TOKEN_DEFAULT_EXPIRY_DAYS?.trim()) {
964
875
  throw new Error("Production startup blocked: set API_TOKEN_DEFAULT_EXPIRY_DAYS to enforce token rotation.");
965
876
  }
877
+ const frontendMode = (env.FRONTEND_MODE ?? "api").trim();
878
+ if (frontendMode === "server-htmx" && !env.SESSION_SECRET?.trim()) {
879
+ throw new Error("Production startup blocked: set SESSION_SECRET when FRONTEND_MODE=server-htmx.");
880
+ }
966
881
  }
967
882
 
968
883
  // ../../src/bootstrap/context.ts
@@ -1249,66 +1164,65 @@ function slugify(value) {
1249
1164
  return value.toLowerCase().trim().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 80);
1250
1165
  }
1251
1166
  export {
1252
- wrapWebRegister,
1253
- wrapWebLogin,
1254
- wrapSecuredRouteModelByKey,
1255
- toRouteRequest,
1256
- slugify,
1257
- setActiveApplicationContext,
1258
- securedBindRouteModelByKey,
1259
- securedBindRouteModel,
1260
- scheduleRunCommand,
1261
- runProviderPhase,
1262
- runDueScheduledTasks2 as runDueScheduledTasks,
1263
- routeRegistry,
1264
- routeParams,
1265
- resolveService,
1266
- resolveMembershipService,
1267
- resolveApplicationQueue,
1268
- resolveApplicationPolicyGate,
1269
- resolveApplicationLogger,
1270
- resolveApplicationEventBus,
1271
- resolveApplicationDependencies,
1272
- resolveApplicationConfig,
1273
- resolveApplicationCache,
1274
- resolveApplicationAuth,
1275
- registerDefaultJobs,
1276
- prefixRouteMap,
1277
- parseFormBody,
1278
- mergeWebRoutes,
1279
- getRequiredDependency,
1280
- ensureModulesLoaded,
1281
- discoverModules,
1282
- discoverModelTableNames,
1283
- createWebServer,
1284
- createWebRoutes,
1285
- createRouteKernel,
1286
- createHttpKernel,
1287
- createCsrfProtection,
1288
- createAppDependencies,
1289
- createAppContext,
1290
- coreProviders,
1291
- configureModulesDirectory,
1292
- collectProviders,
1293
- cacheTagsForModelWrite,
1294
- buildWebModuleRoutes,
1295
- buildModuleRoutes,
1296
- assertProductionSecrets,
1297
- assertAppDependenciesComplete,
1298
- appSchedule3 as appSchedule,
1299
- ServiceContainer,
1300
- Schedule2 as Schedule,
1301
- RouteRegistry,
1302
- REDIS_URL_CONFIG_KEY,
1303
- DEFAULT_APP_PORT,
1304
- DATABASE_URL_CONFIG_KEY,
1305
- CookieSessionStore,
1306
- CORE_TOKEN_SERVICE_TOKEN,
1307
- CORE_QUEUE_TOKEN,
1308
- CORE_POLICY_GATE_TOKEN,
1309
- CORE_EVENT_BUS_TOKEN,
1310
- CORE_CONFIG_TOKEN,
1311
- CORE_CACHE_TOKEN,
1167
+ APP_PORT_CONFIG_KEY,
1312
1168
  CORE_AUTH_TOKEN,
1313
- APP_PORT_CONFIG_KEY
1169
+ CORE_CACHE_TOKEN,
1170
+ CORE_CONFIG_TOKEN,
1171
+ CORE_EVENT_BUS_TOKEN,
1172
+ CORE_POLICY_GATE_TOKEN,
1173
+ CORE_QUEUE_TOKEN,
1174
+ CORE_TOKEN_SERVICE_TOKEN,
1175
+ CookieSessionStore,
1176
+ DATABASE_URL_CONFIG_KEY,
1177
+ DEFAULT_APP_PORT,
1178
+ REDIS_URL_CONFIG_KEY,
1179
+ RouteRegistry,
1180
+ Schedule,
1181
+ ServiceContainer,
1182
+ appSchedule,
1183
+ assertAppDependenciesComplete,
1184
+ assertProductionSecrets,
1185
+ buildModuleRoutes,
1186
+ buildWebModuleRoutes,
1187
+ cacheTagsForModelWrite,
1188
+ collectProviders,
1189
+ configureModulesDirectory,
1190
+ coreProviders,
1191
+ createAppContext,
1192
+ createAppDependencies,
1193
+ createCsrfProtection,
1194
+ createHttpKernel,
1195
+ createRouteKernel,
1196
+ createWebRoutes,
1197
+ createWebServer,
1198
+ discoverModelTableNames,
1199
+ discoverModules,
1200
+ ensureModulesLoaded,
1201
+ getRequiredDependency,
1202
+ mergeWebRoutes,
1203
+ parseFormBody,
1204
+ prefixRouteMap,
1205
+ registerDefaultJobs,
1206
+ resolveApplicationAuth,
1207
+ resolveApplicationCache,
1208
+ resolveApplicationConfig,
1209
+ resolveApplicationDependencies,
1210
+ resolveApplicationEventBus,
1211
+ resolveApplicationLogger,
1212
+ resolveApplicationPolicyGate,
1213
+ resolveApplicationQueue,
1214
+ resolveMembershipService,
1215
+ resolveService,
1216
+ routeParams,
1217
+ routeRegistry,
1218
+ runDueScheduledTasks,
1219
+ runProviderPhase,
1220
+ securedBindRouteModel,
1221
+ securedBindRouteModelByKey,
1222
+ setActiveApplicationContext,
1223
+ slugify,
1224
+ toRouteRequest,
1225
+ wrapSecuredRouteModelByKey,
1226
+ wrapWebLogin,
1227
+ wrapWebRegister
1314
1228
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@getstrata/bootstrap",
3
- "version": "0.2.47",
3
+ "version": "0.2.48",
4
4
  "description": "Strata application bootstrap — HttpKernel, DI, web session helpers",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -172,14 +172,14 @@
172
172
  "build:bundle": "bun build index.ts --outdir dist --target bun --external bun --external eta --external @getstrata/core",
173
173
  "build:types": "tsc -p tsconfig.types.json && bun ../../scripts/prune-bootstrap-dist-types.ts",
174
174
  "prepublishOnly": "bun run build",
175
- "build:subpaths": "bun build entries/applicationRegistry.ts entries/buildModuleRoutes.ts entries/buildWebModuleRoutes.ts entries/cache/modelCacheTags.ts entries/config.ts entries/context.ts entries/contracts.ts entries/createWebRoutes.ts entries/createRoutes.ts entries/createSpaRoutes.ts entries/dependencies.ts entries/discoverModules.ts entries/health.ts entries/http/securedRouteModelBinding.ts entries/httpKernel.ts entries/listeners/invalidateCacheOnModelWrite.ts entries/membershipService.ts entries/metricsRoutes.ts entries/queue/defaultJobs.ts entries/providers.ts entries/providers/view.ts entries/routeRegistry.ts entries/schedule.ts entries/secretsGuard.ts entries/web/forms.ts entries/web/routing.ts entries/web/server.ts entries/web/session.ts entries/web/slug.ts --outdir dist --root . --target bun --external bun --external eta --external @getstrata/core --external @getstrata/bootstrap --external @getstrata/bootstrap/applicationRegistry --external @getstrata/bootstrap/buildModuleRoutes --external @getstrata/bootstrap/buildWebModuleRoutes --external @getstrata/bootstrap/cache/modelCacheTags --external @getstrata/bootstrap/config --external @getstrata/bootstrap/context --external @getstrata/bootstrap/contracts --external @getstrata/bootstrap/createWebRoutes --external @getstrata/bootstrap/createRoutes --external @getstrata/bootstrap/createSpaRoutes --external @getstrata/bootstrap/dependencies --external @getstrata/bootstrap/discoverModules --external @getstrata/bootstrap/health --external @getstrata/bootstrap/http/securedRouteModelBinding --external @getstrata/bootstrap/httpKernel --external @getstrata/bootstrap/listeners/invalidateCacheOnModelWrite --external @getstrata/bootstrap/membershipService --external @getstrata/bootstrap/metricsRoutes --external @getstrata/bootstrap/queue/defaultJobs --external @getstrata/bootstrap/providers --external @getstrata/bootstrap/providers/view --external @getstrata/bootstrap/routeRegistry --external @getstrata/bootstrap/schedule --external @getstrata/bootstrap/secretsGuard --external @getstrata/bootstrap/web/forms --external @getstrata/bootstrap/web/routing --external @getstrata/bootstrap/web/server --external @getstrata/bootstrap/web/session --external @getstrata/bootstrap/web/slug --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",
175
+ "build:subpaths": "bun build entries/applicationRegistry.ts entries/buildModuleRoutes.ts entries/buildWebModuleRoutes.ts entries/cache/modelCacheTags.ts entries/config.ts entries/context.ts entries/contracts.ts entries/createWebRoutes.ts entries/createRoutes.ts entries/createSpaRoutes.ts entries/dependencies.ts entries/discoverModules.ts entries/health.ts entries/http/securedRouteModelBinding.ts entries/httpKernel.ts entries/listeners/invalidateCacheOnModelWrite.ts entries/membershipService.ts entries/metricsRoutes.ts entries/queue/defaultJobs.ts entries/providers.ts entries/providers/view.ts entries/routeRegistry.ts entries/schedule.ts entries/secretsGuard.ts entries/web/forms.ts entries/web/routing.ts entries/web/server.ts entries/web/session.ts entries/web/slug.ts --outdir dist --root . --target bun --external bun --external eta --external @getstrata/core --external @getstrata/bootstrap --external @getstrata/bootstrap/applicationRegistry --external @getstrata/bootstrap/buildModuleRoutes --external @getstrata/bootstrap/buildWebModuleRoutes --external @getstrata/bootstrap/cache/modelCacheTags --external @getstrata/bootstrap/config --external @getstrata/bootstrap/context --external @getstrata/bootstrap/contracts --external @getstrata/bootstrap/createWebRoutes --external @getstrata/bootstrap/createRoutes --external @getstrata/bootstrap/createSpaRoutes --external @getstrata/bootstrap/dependencies --external @getstrata/bootstrap/discoverModules --external @getstrata/bootstrap/health --external @getstrata/bootstrap/http/securedRouteModelBinding --external @getstrata/bootstrap/httpKernel --external @getstrata/bootstrap/listeners/invalidateCacheOnModelWrite --external @getstrata/bootstrap/membershipService --external @getstrata/bootstrap/metricsRoutes --external @getstrata/bootstrap/queue/defaultJobs --external @getstrata/bootstrap/providers --external @getstrata/bootstrap/providers/view --external @getstrata/bootstrap/routeRegistry --external @getstrata/bootstrap/schedule --external @getstrata/bootstrap/secretsGuard --external @getstrata/bootstrap/web/forms --external @getstrata/bootstrap/web/routing --external @getstrata/bootstrap/web/server --external @getstrata/bootstrap/web/session --external @getstrata/bootstrap/web/slug --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/clientIp --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/media/imageTransform --external @getstrata/core/metrics/prometheus --external @getstrata/core/notifications --external @getstrata/core/openapi/generator --external @getstrata/core/openapi/registeredRoute --external @getstrata/core/openapi/validate --external @getstrata/core/pagination --external @getstrata/core/queue --external @getstrata/core/queue/createAppQueue --external @getstrata/core/queue/failedJobRepository --external @getstrata/core/queue/failedJobService --external @getstrata/core/queue/jobRegistry --external @getstrata/core/queue/jobRunner --external @getstrata/core/queue/queueMetrics --external @getstrata/core/queue/publicQueue --external @getstrata/core/queue/redisQueue --external @getstrata/core/queue/types --external @getstrata/core/runtime/applicationRegistry --external @getstrata/core/runtime/asyncContextStore --external @getstrata/core/scheduler/schedule --external @getstrata/core/scheduler/osCron --external @getstrata/core/security/oauthState --external @getstrata/core/security/publicReads --external @getstrata/core/security/safeFetch --external @getstrata/core/security/safeUrl --external @getstrata/core/security/scimTenantTokens --external @getstrata/core/security/securityEvents --external @getstrata/core/security/stripeWebhook --external @getstrata/core/security/timingSafeCompare --external @getstrata/core/security/tokenExpiry --external @getstrata/core/security/totp --external @getstrata/core/storage/storage --external @getstrata/core/tenant/tenancyConfig --external @getstrata/core/tenant/tenantContext --external @getstrata/core/tenant/tenantDatabaseScope --external @getstrata/core/tenant/databaseTenantContext --external @getstrata/core/tenant/tenantMiddleware --external @getstrata/core/terminal/runShell --external @getstrata/core/tracing/traceContext --external @getstrata/core/tracing/tracingMiddleware --external @getstrata/core/validation/rules --external @getstrata/core/view",
176
176
  "build:shims": "true"
177
177
  },
178
178
  "publishConfig": {
179
179
  "access": "public"
180
180
  },
181
181
  "peerDependencies": {
182
- "@getstrata/core": "^0.5.33",
182
+ "@getstrata/core": "^0.5.57",
183
183
  "typescript": "^5.9.0"
184
184
  }
185
185
  }