@getstrata/bootstrap 0.2.49 → 0.2.51

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/CHANGELOG.md ADDED
@@ -0,0 +1,13 @@
1
+ # @getstrata/bootstrap changelog
2
+
3
+ ## 0.2.51
4
+
5
+ - `createCookieSessionAuthManager` returns `CookieSessionAuthManager` (`signIn`, `signOut`, `signInRedirect`, `signOutRedirect`). Controllers no longer need a local cookie helper.
6
+ - Pass `loadSessionUser` to replace the default `users.learn_subscriber` / `users.is_admin` session query. Keep `mapUser` in the app.
7
+
8
+ ## 0.2.50
9
+
10
+ - `createCookieSessionAuthManager` / `CookieSessionGuard` turn `CookieSessionStore` into an `AuthGuard` / `AuthManager` for `CORE_AUTH_TOKEN`. Supply a `mapUser` mapper; WorkHub abilities are not baked in. Omit `sql` to read the client from `bindDatabaseConnection()` on every call.
11
+ - `checkDatabase()` / `createHealthRoutes()` ping the bound database client, not WorkHub’s private connection holder. `/health` stays `{ status: "ok" }` unless `{ pingOnHealth: true }`. Extra JSON fields are optional.
12
+ - `assertProductionSecrets()` is feature-gated. A production HTMX app with `SESSION_SECRET` (32+), `AUTH_DEV_HEADERS=false`, and feature flags off does not need WorkHub API tokens. WorkHub’s current production env (rotated tokens, CORS, pepper, expiry) still passes.
13
+ - Re-exports `CORE_ABILITY_CHECKER_TOKEN` and `CORE_AUTH_USER_DIRECTORY_TOKEN`.
package/README.md CHANGED
@@ -28,7 +28,9 @@ import {
28
28
  import { createHttpKernel, createAppContext, coreProviders } from "@getstrata/bootstrap";
29
29
  ```
30
30
 
31
- `createAppContext()` does not call `assertProductionSecrets`. WorkHub calls that from `App.serve()` / `queue:work`. Sibling apps should call it only if they want those WorkHub production gates (API tokens, Stripe, SCIM, CORS).
31
+ `createAppContext()` does not call `assertProductionSecrets`. WorkHub calls that from `App.serve()` / `queue:work`. Sibling HTMX apps can call it in production without WorkHub API tokens when feature flags are off see [SIBLING-HTMX.md](../../docs/SIBLING-HTMX.md).
32
+
33
+ Sibling HTMX apps should bind `createCookieSessionAuthManager` from `@getstrata/bootstrap/web/session` instead of HMAC `SessionGuard`. Use `signIn` / `signOut` (or the redirect helpers) instead of calling `CookieSessionStore` from controllers. Pass `mapUser` to map roles in the app. Pass `loadSessionUser` when the default `learn_subscriber` / `is_admin` SELECT does not match your schema.
32
34
 
33
35
  `wrapWeb` applies the web group (CSRF + flash) and `withErrorHandling`, so CSRF `ForbiddenError` becomes an HTML 403 in `FRONTEND_MODE=server-htmx`. `wrapWebLogin` / `wrapWebRegister` include that web group plus throttle — do not wrap them with `wrapWeb` again.
34
36
 
@@ -4,7 +4,7 @@ declare const CACHE_MAX_ENTRIES_CONFIG_KEY = "cache.maxEntries";
4
4
  declare const CACHE_DRIVER_CONFIG_KEY = "cache.driver";
5
5
  declare const REDIS_URL_CONFIG_KEY = "cache.redisUrl";
6
6
  declare const DATABASE_URL_CONFIG_KEY = "database.url";
7
- export { CORE_AUTH_TOKEN, CORE_CACHE_TOKEN, CORE_CONFIG_TOKEN, CORE_EVENT_BUS_TOKEN, CORE_POLICY_GATE_TOKEN, CORE_QUEUE_TOKEN, CORE_TOKEN_SERVICE_TOKEN, } from "@getstrata/core/contracts/serviceTokens";
7
+ export { CORE_ABILITY_CHECKER_TOKEN, CORE_AUTH_TOKEN, CORE_AUTH_USER_DIRECTORY_TOKEN, CORE_CACHE_TOKEN, CORE_CONFIG_TOKEN, CORE_EVENT_BUS_TOKEN, CORE_POLICY_GATE_TOKEN, CORE_QUEUE_TOKEN, CORE_TOKEN_SERVICE_TOKEN, } from "@getstrata/core/contracts/serviceTokens";
8
8
  declare const AUTH_DEV_HEADERS_CONFIG_KEY = "auth.allowDevHeaders";
9
9
  declare const DEFAULT_APP_PORT = 3000;
10
10
  declare const DEFAULT_CACHE_TTL_MS = 3600000;
@@ -1,8 +1,14 @@
1
1
  import type { AppDependencies } from "./contracts";
2
+ interface CreateHealthRoutesOptions {
3
+ pingOnHealth?: boolean;
4
+ extra?: Record<string, unknown> | (() => Record<string, unknown> | Promise<Record<string, unknown>>);
5
+ }
2
6
  declare function checkDatabase(): Promise<boolean>;
7
+ declare function pingDatabase(): Promise<boolean>;
3
8
  declare function checkRedis(redisUrl: string): Promise<boolean>;
4
- declare function createHealthRoutes(dependencies: AppDependencies): {
9
+ declare function createHealthRoutes(dependencies: AppDependencies, options?: CreateHealthRoutesOptions): {
5
10
  "/health": () => Promise<Response>;
6
11
  "/ready": () => Promise<Response>;
7
12
  };
8
- export { checkDatabase, checkRedis, createHealthRoutes };
13
+ export type { CreateHealthRoutesOptions };
14
+ export { checkDatabase, checkRedis, createHealthRoutes, pingDatabase };
@@ -9,7 +9,7 @@ export { buildModuleRoutes } from "./buildModuleRoutes.ts";
9
9
  export type { BuildWebModuleRoutesOptions } from "./buildWebModuleRoutes.ts";
10
10
  export { buildWebModuleRoutes } from "./buildWebModuleRoutes.ts";
11
11
  export { cacheTagsForModelWrite, discoverModelTableNames } from "./cache/modelCacheTags.ts";
12
- export { APP_PORT_CONFIG_KEY, CORE_AUTH_TOKEN, CORE_CACHE_TOKEN, CORE_CONFIG_TOKEN, CORE_EVENT_BUS_TOKEN, CORE_POLICY_GATE_TOKEN, CORE_QUEUE_TOKEN, CORE_TOKEN_SERVICE_TOKEN, DATABASE_URL_CONFIG_KEY, DEFAULT_APP_PORT, REDIS_URL_CONFIG_KEY, } from "./config.ts";
12
+ export { APP_PORT_CONFIG_KEY, CORE_ABILITY_CHECKER_TOKEN, CORE_AUTH_TOKEN, CORE_AUTH_USER_DIRECTORY_TOKEN, CORE_CACHE_TOKEN, CORE_CONFIG_TOKEN, CORE_EVENT_BUS_TOKEN, CORE_POLICY_GATE_TOKEN, CORE_QUEUE_TOKEN, CORE_TOKEN_SERVICE_TOKEN, DATABASE_URL_CONFIG_KEY, DEFAULT_APP_PORT, REDIS_URL_CONFIG_KEY, } from "./config.ts";
13
13
  export { collectProviders, createAppContext, runProviderPhase } from "./context.ts";
14
14
  export type { AppContext, AppDependencies, AppModule, AppRouteMap, CachedJson, ConfigStore, ModuleRouteContext, MutableAppDependencies, ProviderContext, ServiceFactory, ServiceProvider, } from "./contracts.ts";
15
15
  export { assertAppDependenciesComplete, getRequiredDependency, resolveService, ServiceContainer, } from "./contracts.ts";
@@ -17,6 +17,8 @@ export { createWebRoutes, mergeWebRoutes } from "./createWebRoutes.ts";
17
17
  export { createAppDependencies } from "./dependencies.ts";
18
18
  export type { DiscoverModulesOptions } from "./discoverModules.ts";
19
19
  export { configureModulesDirectory, discoverModules, ensureModulesLoaded, } from "./discoverModules.ts";
20
+ export type { CreateHealthRoutesOptions } from "./health.ts";
21
+ export { checkDatabase, checkRedis, createHealthRoutes, pingDatabase } from "./health.ts";
20
22
  export { type RouteModelAuthorization, securedBindRouteModel, securedBindRouteModelByKey, } from "./http/securedRouteModelBinding.ts";
21
23
  export { createHttpKernel, type HttpKernel, type MiddlewareGroupName } from "./httpKernel.ts";
22
24
  export { resolveMembershipService } from "./membershipService.ts";
@@ -25,4 +27,4 @@ export { coreProviders } from "./providers/index.ts";
25
27
  export { registerDefaultJobs } from "./queue/defaultJobs.ts";
26
28
  export { RouteRegistry, routeRegistry } from "./routeRegistry.ts";
27
29
  export { assertProductionSecrets } from "./secretsGuard.ts";
28
- export { CookieSessionStore, createCsrfProtection, createRouteKernel, createWebServer, type ParsedForm, parseFormBody, routeParams, type SessionUser, slugify, toRouteRequest, type WebServerOptions, wrapSecuredRouteModelByKey, wrapWebLogin, wrapWebRegister, } from "./web/index.ts";
30
+ export { CookieSessionAuthManager, CookieSessionGuard, CookieSessionStore, createCookieSessionAuthManager, createCsrfProtection, createRouteKernel, createWebServer, type LoadSessionUser, type MapSessionUser, type ParsedForm, parseFormBody, routeParams, type SessionUser, slugify, toRouteRequest, type WebServerOptions, wrapSecuredRouteModelByKey, wrapWebLogin, wrapWebRegister, } from "./web/index.ts";
@@ -4,5 +4,5 @@
4
4
  export { createCsrfProtection, type ParsedForm, parseFormBody } from "./forms.ts";
5
5
  export { createRouteKernel, routeParams, toRouteRequest, wrapSecuredRouteModelByKey, wrapWebLogin, wrapWebRegister, } from "./routing.ts";
6
6
  export { convertAppRoutesToBunRoutes, createWebServer, type WebServerOptions } from "./server.ts";
7
- export { CookieSessionStore, type SessionUser } from "./session.ts";
7
+ export { CookieSessionAuthManager, CookieSessionGuard, CookieSessionStore, createCookieSessionAuthManager, type LoadSessionUser, type MapSessionUser, type SessionUser, } from "./session.ts";
8
8
  export { slugify } from "./slug.ts";
@@ -1,3 +1,5 @@
1
+ import type { AuthUser } from "@getstrata/core/auth/authContext";
2
+ import { type AuthGuard, AuthManager } from "@getstrata/core/auth/guard";
1
3
  export interface SessionUser {
2
4
  id: number;
3
5
  name: string;
@@ -8,18 +10,55 @@ export interface SessionUser {
8
10
  type SqlClient = {
9
11
  unsafe<T>(query: string, params?: readonly unknown[]): Promise<T[]>;
10
12
  };
13
+ type SqlSource = SqlClient | (() => SqlClient);
14
+ export type LoadSessionUser = (sql: SqlClient, sessionId: string) => Promise<SessionUser | null>;
15
+ declare function defaultSessionSql(): SqlClient;
16
+ export type MapSessionUser = (user: SessionUser) => AuthUser;
17
+ declare function defaultMapSessionUser(user: SessionUser): AuthUser;
11
18
  export declare class CookieSessionStore {
12
- private readonly sql;
19
+ private readonly sqlSource;
13
20
  private readonly secret;
14
21
  private readonly cookieName;
15
22
  private readonly maxAgeSeconds;
16
- constructor(sql: SqlClient, secret: string, cookieName?: string, maxAgeSeconds?: number);
23
+ private readonly loadSessionUser;
24
+ constructor(sqlSource: SqlSource, secret: string, cookieName?: string, maxAgeSeconds?: number, loadSessionUser?: LoadSessionUser);
17
25
  cookieHeader(_user: SessionUser, sessionId: string): string;
18
26
  clearCookieHeader(): string;
27
+ sessionIdFromRequest(request: Request): string | null;
19
28
  private withSecureFlag;
29
+ private sql;
20
30
  create(user: SessionUser): Promise<string>;
21
31
  destroy(sessionId: string): Promise<void>;
22
32
  read(request: Request): Promise<SessionUser | null>;
23
33
  private sign;
24
34
  }
25
- export {};
35
+ export declare class CookieSessionGuard implements AuthGuard {
36
+ private readonly store;
37
+ private readonly mapUser;
38
+ constructor(store: CookieSessionStore, mapUser?: MapSessionUser);
39
+ resolve(request: Request): Promise<AuthUser | null>;
40
+ }
41
+ export declare class CookieSessionAuthManager extends AuthManager {
42
+ readonly store: CookieSessionStore;
43
+ constructor(store: CookieSessionStore, mapUser?: MapSessionUser);
44
+ signIn(user: SessionUser): Promise<{
45
+ sessionId: string;
46
+ setCookie: string;
47
+ }>;
48
+ signOut(request: Request): Promise<{
49
+ setCookie: string;
50
+ }>;
51
+ signInRedirect(user: SessionUser, location: string, status?: number): Promise<Response>;
52
+ signOutRedirect(request: Request, location: string, status?: number): Promise<Response>;
53
+ }
54
+ export interface CreateCookieSessionAuthManagerOptions {
55
+ store?: CookieSessionStore;
56
+ sql?: SqlSource;
57
+ secret?: string;
58
+ cookieName?: string;
59
+ maxAgeSeconds?: number;
60
+ mapUser?: MapSessionUser;
61
+ loadSessionUser?: LoadSessionUser;
62
+ }
63
+ declare function createCookieSessionAuthManager(options?: CreateCookieSessionAuthManagerOptions): CookieSessionAuthManager;
64
+ export { createCookieSessionAuthManager, defaultMapSessionUser, defaultSessionSql };
@@ -7,6 +7,7 @@ import { applyMiddlewareToRoutes } from "@getstrata/core/http/middleware";
7
7
 
8
8
  // ../../src/bootstrap/httpKernel.ts
9
9
  import { createMembershipMiddleware } from "@getstrata/core/auth/membershipMiddleware";
10
+ import { resolveAbilityChecker } from "@getstrata/core/contracts/serviceTokens";
10
11
  import { createAuthMiddleware } from "@getstrata/core/http/authMiddleware";
11
12
  import { createAuthorizeMiddleware } from "@getstrata/core/http/authorizeMiddleware";
12
13
  import { createBodySizeLimitMiddleware } from "@getstrata/core/http/bodySizeLimitMiddleware";
@@ -67,24 +68,38 @@ function parsePositiveInt(value, fallback) {
67
68
  }
68
69
  return Math.trunc(parsed);
69
70
  }
71
+ function parseWindowSeconds(secondsValue, msValue, fallback) {
72
+ if (secondsValue !== undefined && secondsValue.trim() !== "") {
73
+ return parsePositiveInt(secondsValue, fallback);
74
+ }
75
+ if (msValue !== undefined && msValue.trim() !== "") {
76
+ const parsedMs = Number(msValue);
77
+ if (Number.isFinite(parsedMs) && parsedMs > 0) {
78
+ return Math.max(1, Math.trunc(parsedMs / 1000));
79
+ }
80
+ }
81
+ return fallback;
82
+ }
70
83
  function resolveLoginRateLimit() {
71
84
  const defaults = isLocalAppEnv() ? LOCAL_LOGIN_RATE_LIMIT : PRODUCTION_LOGIN_RATE_LIMIT;
72
85
  return {
73
86
  maxAttempts: parsePositiveInt(process.env.LOGIN_RATE_LIMIT_PER_WINDOW, defaults.maxAttempts),
74
- decaySeconds: parsePositiveInt(process.env.LOGIN_RATE_LIMIT_WINDOW_SECONDS, defaults.decaySeconds)
87
+ decaySeconds: parseWindowSeconds(process.env.LOGIN_RATE_LIMIT_WINDOW_SECONDS, process.env.LOGIN_RATE_LIMIT_WINDOW_MS, defaults.decaySeconds)
75
88
  };
76
89
  }
77
90
  function resolveRegisterRateLimit() {
78
91
  const defaults = isLocalAppEnv() ? { maxAttempts: 100, decaySeconds: 60 } : { maxAttempts: 10, decaySeconds: 60 };
79
92
  return {
80
93
  maxAttempts: parsePositiveInt(process.env.REGISTER_RATE_LIMIT_PER_WINDOW, defaults.maxAttempts),
81
- decaySeconds: parsePositiveInt(process.env.REGISTER_RATE_LIMIT_WINDOW_SECONDS ?? process.env.REGISTER_RATE_LIMIT_WINDOW_MS ? String(Number(process.env.REGISTER_RATE_LIMIT_WINDOW_MS) / 1000) : undefined, defaults.decaySeconds)
94
+ decaySeconds: parseWindowSeconds(process.env.REGISTER_RATE_LIMIT_WINDOW_SECONDS, process.env.REGISTER_RATE_LIMIT_WINDOW_MS, defaults.decaySeconds)
82
95
  };
83
96
  }
84
97
 
85
98
  // ../../src/bootstrap/config.ts
86
99
  import {
100
+ CORE_ABILITY_CHECKER_TOKEN,
87
101
  CORE_AUTH_TOKEN,
102
+ CORE_AUTH_USER_DIRECTORY_TOKEN,
88
103
  CORE_CACHE_TOKEN,
89
104
  CORE_CONFIG_TOKEN,
90
105
  CORE_EVENT_BUS_TOKEN,
@@ -188,7 +203,7 @@ class HttpKernel {
188
203
  }
189
204
  wrapWebAbility(ability, handler) {
190
205
  const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
191
- const abilityChecker = this.dependencies.container.resolve(CORE_TOKEN_SERVICE_TOKEN);
206
+ const abilityChecker = resolveAbilityChecker(this.dependencies.container);
192
207
  const requireAbility = createRequireAbilityMiddleware(abilityChecker);
193
208
  const middleware = [createRequireWebAuthMiddleware(auth), requireAbility(ability)];
194
209
  return this.wrapWeb(withMiddleware(...middleware)(handler));
@@ -212,7 +227,7 @@ class HttpKernel {
212
227
  return withMiddleware(...middleware)(handler);
213
228
  }
214
229
  wrapAbility(ability, handler) {
215
- const abilityChecker = this.dependencies.container.resolve(CORE_TOKEN_SERVICE_TOKEN);
230
+ const abilityChecker = resolveAbilityChecker(this.dependencies.container);
216
231
  const requireAbility = createRequireAbilityMiddleware(abilityChecker);
217
232
  const middleware = [...this.group("authenticated"), requireAbility(ability)];
218
233
  return withMiddleware(...middleware)(handler);
@@ -10,6 +10,7 @@ import { applyMiddlewareToRoutes } from "@getstrata/core/http/middleware";
10
10
 
11
11
  // ../../src/bootstrap/httpKernel.ts
12
12
  import { createMembershipMiddleware } from "@getstrata/core/auth/membershipMiddleware";
13
+ import { resolveAbilityChecker } from "@getstrata/core/contracts/serviceTokens";
13
14
  import { createAuthMiddleware } from "@getstrata/core/http/authMiddleware";
14
15
  import { createAuthorizeMiddleware } from "@getstrata/core/http/authorizeMiddleware";
15
16
  import { createBodySizeLimitMiddleware } from "@getstrata/core/http/bodySizeLimitMiddleware";
@@ -70,24 +71,38 @@ function parsePositiveInt(value, fallback) {
70
71
  }
71
72
  return Math.trunc(parsed);
72
73
  }
74
+ function parseWindowSeconds(secondsValue, msValue, fallback) {
75
+ if (secondsValue !== undefined && secondsValue.trim() !== "") {
76
+ return parsePositiveInt(secondsValue, fallback);
77
+ }
78
+ if (msValue !== undefined && msValue.trim() !== "") {
79
+ const parsedMs = Number(msValue);
80
+ if (Number.isFinite(parsedMs) && parsedMs > 0) {
81
+ return Math.max(1, Math.trunc(parsedMs / 1000));
82
+ }
83
+ }
84
+ return fallback;
85
+ }
73
86
  function resolveLoginRateLimit() {
74
87
  const defaults = isLocalAppEnv() ? LOCAL_LOGIN_RATE_LIMIT : PRODUCTION_LOGIN_RATE_LIMIT;
75
88
  return {
76
89
  maxAttempts: parsePositiveInt(process.env.LOGIN_RATE_LIMIT_PER_WINDOW, defaults.maxAttempts),
77
- decaySeconds: parsePositiveInt(process.env.LOGIN_RATE_LIMIT_WINDOW_SECONDS, defaults.decaySeconds)
90
+ decaySeconds: parseWindowSeconds(process.env.LOGIN_RATE_LIMIT_WINDOW_SECONDS, process.env.LOGIN_RATE_LIMIT_WINDOW_MS, defaults.decaySeconds)
78
91
  };
79
92
  }
80
93
  function resolveRegisterRateLimit() {
81
94
  const defaults = isLocalAppEnv() ? { maxAttempts: 100, decaySeconds: 60 } : { maxAttempts: 10, decaySeconds: 60 };
82
95
  return {
83
96
  maxAttempts: parsePositiveInt(process.env.REGISTER_RATE_LIMIT_PER_WINDOW, defaults.maxAttempts),
84
- decaySeconds: parsePositiveInt(process.env.REGISTER_RATE_LIMIT_WINDOW_SECONDS ?? process.env.REGISTER_RATE_LIMIT_WINDOW_MS ? String(Number(process.env.REGISTER_RATE_LIMIT_WINDOW_MS) / 1000) : undefined, defaults.decaySeconds)
97
+ decaySeconds: parseWindowSeconds(process.env.REGISTER_RATE_LIMIT_WINDOW_SECONDS, process.env.REGISTER_RATE_LIMIT_WINDOW_MS, defaults.decaySeconds)
85
98
  };
86
99
  }
87
100
 
88
101
  // ../../src/bootstrap/config.ts
89
102
  import {
103
+ CORE_ABILITY_CHECKER_TOKEN,
90
104
  CORE_AUTH_TOKEN,
105
+ CORE_AUTH_USER_DIRECTORY_TOKEN,
91
106
  CORE_CACHE_TOKEN,
92
107
  CORE_CONFIG_TOKEN,
93
108
  CORE_EVENT_BUS_TOKEN,
@@ -191,7 +206,7 @@ class HttpKernel {
191
206
  }
192
207
  wrapWebAbility(ability, handler) {
193
208
  const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
194
- const abilityChecker = this.dependencies.container.resolve(CORE_TOKEN_SERVICE_TOKEN);
209
+ const abilityChecker = resolveAbilityChecker(this.dependencies.container);
195
210
  const requireAbility = createRequireAbilityMiddleware(abilityChecker);
196
211
  const middleware = [createRequireWebAuthMiddleware(auth), requireAbility(ability)];
197
212
  return this.wrapWeb(withMiddleware(...middleware)(handler));
@@ -215,7 +230,7 @@ class HttpKernel {
215
230
  return withMiddleware(...middleware)(handler);
216
231
  }
217
232
  wrapAbility(ability, handler) {
218
- const abilityChecker = this.dependencies.container.resolve(CORE_TOKEN_SERVICE_TOKEN);
233
+ const abilityChecker = resolveAbilityChecker(this.dependencies.container);
219
234
  const requireAbility = createRequireAbilityMiddleware(abilityChecker);
220
235
  const middleware = [...this.group("authenticated"), requireAbility(ability)];
221
236
  return withMiddleware(...middleware)(handler);
@@ -3,7 +3,9 @@ var __jsonParse = (a) => JSON.parse(a);
3
3
 
4
4
  // ../../src/bootstrap/config.ts
5
5
  import {
6
+ CORE_ABILITY_CHECKER_TOKEN,
6
7
  CORE_AUTH_TOKEN,
8
+ CORE_AUTH_USER_DIRECTORY_TOKEN,
7
9
  CORE_CACHE_TOKEN,
8
10
  CORE_CONFIG_TOKEN,
9
11
  CORE_EVENT_BUS_TOKEN,
@@ -30,7 +32,9 @@ export {
30
32
  CACHE_DRIVER_CONFIG_KEY,
31
33
  CACHE_MAX_ENTRIES_CONFIG_KEY,
32
34
  CACHE_TTL_MS_CONFIG_KEY,
35
+ CORE_ABILITY_CHECKER_TOKEN,
33
36
  CORE_AUTH_TOKEN,
37
+ CORE_AUTH_USER_DIRECTORY_TOKEN,
34
38
  CORE_CACHE_TOKEN,
35
39
  CORE_CONFIG_TOKEN,
36
40
  CORE_EVENT_BUS_TOKEN,
@@ -107,7 +107,9 @@ var authConfig = {
107
107
 
108
108
  // ../../src/bootstrap/config.ts
109
109
  import {
110
+ CORE_ABILITY_CHECKER_TOKEN,
110
111
  CORE_AUTH_TOKEN,
112
+ CORE_AUTH_USER_DIRECTORY_TOKEN,
111
113
  CORE_CACHE_TOKEN,
112
114
  CORE_CONFIG_TOKEN,
113
115
  CORE_EVENT_BUS_TOKEN,