@digilogiclabs/platform-core 1.7.0 → 1.8.0

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/auth.d.mts CHANGED
@@ -1,5 +1,5 @@
1
- import { R as RateLimitStore, a as RateLimitRule, b as RateLimitOptions } from './env-DerQ7Da-.mjs';
2
- export { as as AllowlistConfig, A as ApiError, k as ApiErrorCode, m as ApiErrorCodeType, o as ApiPaginatedResponse, _ as ApiSecurityConfig, a0 as ApiSecurityContext, n as ApiSuccessResponse, aK as AuditRequest, P as AuthCookiesConfig, W as AuthMethod, C as CommonApiErrors, ay as CommonRateLimits, aj as DateRangeInput, ad as DateRangeSchema, an as DeploymentStage, ah as EmailInput, a6 as EmailSchema, E as EnvValidationConfig, x as EnvValidationResult, ap as FlagDefinition, aq as FlagDefinitions, ao as FlagValue, z as KEYCLOAK_DEFAULT_ROLES, N as KeycloakCallbacksConfig, K as KeycloakConfig, O as KeycloakJwtFields, y as KeycloakTokenSet, al as LoginInput, af as LoginSchema, aF as OpsAuditActor, aH as OpsAuditEvent, aJ as OpsAuditLoggerOptions, aI as OpsAuditRecord, aG as OpsAuditResource, ai as PaginationInput, ac as PaginationSchema, a7 as PasswordSchema, aa as PersonNameSchema, a9 as PhoneSchema, ax as RateLimitCheckResult, Y as RateLimitPreset, S as RedirectCallbackConfig, ar as ResolvedFlags, X as RouteAuditConfig, ak as SearchQueryInput, ae as SearchQuerySchema, $ as SecuritySession, am as SignupInput, ag as SignupSchema, a8 as SlugSchema, aM as StandardAuditActionType, aL as StandardAuditActions, Z as StandardRateLimitPresets, T as TokenRefreshResult, a5 as WrapperPresets, av as buildAllowlist, Q as buildAuthCookies, a4 as buildErrorBody, V as buildKeycloakCallbacks, l as buildPagination, a3 as buildRateLimitHeaders, aD as buildRateLimitResponseHeaders, U as buildRedirectCallback, I as buildTokenRefreshParams, u as checkEnvVars, aA as checkRateLimit, i as classifyError, c as constantTimeEqual, f as containsHtml, d as containsUrls, aQ as createAuditActor, aR as createAuditLogger, au as createFeatureFlags, az as createMemoryRateLimitStore, ab as createSafeTextSchema, at as detectStage, e as escapeHtml, aN as extractAuditIp, aP as extractAuditRequestId, aO as extractAuditUserAgent, a2 as extractClientIp, r as getBoolEnv, h as getCorrelationId, L as getEndSessionEndpoint, w as getEnvSummary, t as getIntEnv, q as getOptionalEnv, aB as getRateLimitStatus, p as getRequiredEnv, J as getTokenEndpoint, G as hasAllRoles, F as hasAnyRole, D as hasRole, aw as isAllowlisted, j as isApiError, H as isTokenExpired, B as parseKeycloakRoles, M as refreshKeycloakToken, aC as resetRateLimitForKey, aE as resolveIdentifier, a1 as resolveRateLimitIdentifier, g as sanitizeApiError, s as stripHtml, v as validateEnvVars } from './env-DerQ7Da-.mjs';
1
+ import { R as RateLimitStore, a as RateLimitRule, b as RateLimitOptions } from './env-jqNJdZVt.mjs';
2
+ export { as as AllowlistConfig, A as ApiError, k as ApiErrorCode, m as ApiErrorCodeType, o as ApiPaginatedResponse, _ as ApiSecurityConfig, a0 as ApiSecurityContext, n as ApiSuccessResponse, aK as AuditRequest, P as AuthCookiesConfig, W as AuthMethod, aS as BetaClientConfig, C as CommonApiErrors, ay as CommonRateLimits, aj as DateRangeInput, ad as DateRangeSchema, an as DeploymentStage, ah as EmailInput, a6 as EmailSchema, E as EnvValidationConfig, x as EnvValidationResult, ap as FlagDefinition, aq as FlagDefinitions, ao as FlagValue, z as KEYCLOAK_DEFAULT_ROLES, N as KeycloakCallbacksConfig, K as KeycloakConfig, O as KeycloakJwtFields, y as KeycloakTokenSet, al as LoginInput, af as LoginSchema, aF as OpsAuditActor, aH as OpsAuditEvent, aJ as OpsAuditLoggerOptions, aI as OpsAuditRecord, aG as OpsAuditResource, ai as PaginationInput, ac as PaginationSchema, a7 as PasswordSchema, aa as PersonNameSchema, a9 as PhoneSchema, ax as RateLimitCheckResult, Y as RateLimitPreset, S as RedirectCallbackConfig, ar as ResolvedFlags, X as RouteAuditConfig, ak as SearchQueryInput, ae as SearchQuerySchema, $ as SecuritySession, am as SignupInput, ag as SignupSchema, a8 as SlugSchema, aM as StandardAuditActionType, aL as StandardAuditActions, Z as StandardRateLimitPresets, T as TokenRefreshResult, a5 as WrapperPresets, av as buildAllowlist, Q as buildAuthCookies, a4 as buildErrorBody, V as buildKeycloakCallbacks, l as buildPagination, a3 as buildRateLimitHeaders, aD as buildRateLimitResponseHeaders, U as buildRedirectCallback, I as buildTokenRefreshParams, u as checkEnvVars, aA as checkRateLimit, i as classifyError, aY as clearStoredBetaCode, c as constantTimeEqual, f as containsHtml, d as containsUrls, aQ as createAuditActor, aR as createAuditLogger, aT as createBetaClient, au as createFeatureFlags, az as createMemoryRateLimitStore, ab as createSafeTextSchema, at as detectStage, e as escapeHtml, aN as extractAuditIp, aP as extractAuditRequestId, aO as extractAuditUserAgent, a2 as extractClientIp, aU as fetchBetaSettings, r as getBoolEnv, h as getCorrelationId, L as getEndSessionEndpoint, w as getEnvSummary, t as getIntEnv, q as getOptionalEnv, aB as getRateLimitStatus, p as getRequiredEnv, aX as getStoredBetaCode, J as getTokenEndpoint, G as hasAllRoles, F as hasAnyRole, D as hasRole, aw as isAllowlisted, j as isApiError, H as isTokenExpired, B as parseKeycloakRoles, M as refreshKeycloakToken, aC as resetRateLimitForKey, aE as resolveIdentifier, a1 as resolveRateLimitIdentifier, g as sanitizeApiError, aW as storeBetaCode, s as stripHtml, aV as validateBetaCode, v as validateEnvVars } from './env-jqNJdZVt.mjs';
3
3
  import 'zod';
4
4
 
5
5
  /**
package/dist/auth.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { R as RateLimitStore, a as RateLimitRule, b as RateLimitOptions } from './env-DerQ7Da-.js';
2
- export { as as AllowlistConfig, A as ApiError, k as ApiErrorCode, m as ApiErrorCodeType, o as ApiPaginatedResponse, _ as ApiSecurityConfig, a0 as ApiSecurityContext, n as ApiSuccessResponse, aK as AuditRequest, P as AuthCookiesConfig, W as AuthMethod, C as CommonApiErrors, ay as CommonRateLimits, aj as DateRangeInput, ad as DateRangeSchema, an as DeploymentStage, ah as EmailInput, a6 as EmailSchema, E as EnvValidationConfig, x as EnvValidationResult, ap as FlagDefinition, aq as FlagDefinitions, ao as FlagValue, z as KEYCLOAK_DEFAULT_ROLES, N as KeycloakCallbacksConfig, K as KeycloakConfig, O as KeycloakJwtFields, y as KeycloakTokenSet, al as LoginInput, af as LoginSchema, aF as OpsAuditActor, aH as OpsAuditEvent, aJ as OpsAuditLoggerOptions, aI as OpsAuditRecord, aG as OpsAuditResource, ai as PaginationInput, ac as PaginationSchema, a7 as PasswordSchema, aa as PersonNameSchema, a9 as PhoneSchema, ax as RateLimitCheckResult, Y as RateLimitPreset, S as RedirectCallbackConfig, ar as ResolvedFlags, X as RouteAuditConfig, ak as SearchQueryInput, ae as SearchQuerySchema, $ as SecuritySession, am as SignupInput, ag as SignupSchema, a8 as SlugSchema, aM as StandardAuditActionType, aL as StandardAuditActions, Z as StandardRateLimitPresets, T as TokenRefreshResult, a5 as WrapperPresets, av as buildAllowlist, Q as buildAuthCookies, a4 as buildErrorBody, V as buildKeycloakCallbacks, l as buildPagination, a3 as buildRateLimitHeaders, aD as buildRateLimitResponseHeaders, U as buildRedirectCallback, I as buildTokenRefreshParams, u as checkEnvVars, aA as checkRateLimit, i as classifyError, c as constantTimeEqual, f as containsHtml, d as containsUrls, aQ as createAuditActor, aR as createAuditLogger, au as createFeatureFlags, az as createMemoryRateLimitStore, ab as createSafeTextSchema, at as detectStage, e as escapeHtml, aN as extractAuditIp, aP as extractAuditRequestId, aO as extractAuditUserAgent, a2 as extractClientIp, r as getBoolEnv, h as getCorrelationId, L as getEndSessionEndpoint, w as getEnvSummary, t as getIntEnv, q as getOptionalEnv, aB as getRateLimitStatus, p as getRequiredEnv, J as getTokenEndpoint, G as hasAllRoles, F as hasAnyRole, D as hasRole, aw as isAllowlisted, j as isApiError, H as isTokenExpired, B as parseKeycloakRoles, M as refreshKeycloakToken, aC as resetRateLimitForKey, aE as resolveIdentifier, a1 as resolveRateLimitIdentifier, g as sanitizeApiError, s as stripHtml, v as validateEnvVars } from './env-DerQ7Da-.js';
1
+ import { R as RateLimitStore, a as RateLimitRule, b as RateLimitOptions } from './env-jqNJdZVt.js';
2
+ export { as as AllowlistConfig, A as ApiError, k as ApiErrorCode, m as ApiErrorCodeType, o as ApiPaginatedResponse, _ as ApiSecurityConfig, a0 as ApiSecurityContext, n as ApiSuccessResponse, aK as AuditRequest, P as AuthCookiesConfig, W as AuthMethod, aS as BetaClientConfig, C as CommonApiErrors, ay as CommonRateLimits, aj as DateRangeInput, ad as DateRangeSchema, an as DeploymentStage, ah as EmailInput, a6 as EmailSchema, E as EnvValidationConfig, x as EnvValidationResult, ap as FlagDefinition, aq as FlagDefinitions, ao as FlagValue, z as KEYCLOAK_DEFAULT_ROLES, N as KeycloakCallbacksConfig, K as KeycloakConfig, O as KeycloakJwtFields, y as KeycloakTokenSet, al as LoginInput, af as LoginSchema, aF as OpsAuditActor, aH as OpsAuditEvent, aJ as OpsAuditLoggerOptions, aI as OpsAuditRecord, aG as OpsAuditResource, ai as PaginationInput, ac as PaginationSchema, a7 as PasswordSchema, aa as PersonNameSchema, a9 as PhoneSchema, ax as RateLimitCheckResult, Y as RateLimitPreset, S as RedirectCallbackConfig, ar as ResolvedFlags, X as RouteAuditConfig, ak as SearchQueryInput, ae as SearchQuerySchema, $ as SecuritySession, am as SignupInput, ag as SignupSchema, a8 as SlugSchema, aM as StandardAuditActionType, aL as StandardAuditActions, Z as StandardRateLimitPresets, T as TokenRefreshResult, a5 as WrapperPresets, av as buildAllowlist, Q as buildAuthCookies, a4 as buildErrorBody, V as buildKeycloakCallbacks, l as buildPagination, a3 as buildRateLimitHeaders, aD as buildRateLimitResponseHeaders, U as buildRedirectCallback, I as buildTokenRefreshParams, u as checkEnvVars, aA as checkRateLimit, i as classifyError, aY as clearStoredBetaCode, c as constantTimeEqual, f as containsHtml, d as containsUrls, aQ as createAuditActor, aR as createAuditLogger, aT as createBetaClient, au as createFeatureFlags, az as createMemoryRateLimitStore, ab as createSafeTextSchema, at as detectStage, e as escapeHtml, aN as extractAuditIp, aP as extractAuditRequestId, aO as extractAuditUserAgent, a2 as extractClientIp, aU as fetchBetaSettings, r as getBoolEnv, h as getCorrelationId, L as getEndSessionEndpoint, w as getEnvSummary, t as getIntEnv, q as getOptionalEnv, aB as getRateLimitStatus, p as getRequiredEnv, aX as getStoredBetaCode, J as getTokenEndpoint, G as hasAllRoles, F as hasAnyRole, D as hasRole, aw as isAllowlisted, j as isApiError, H as isTokenExpired, B as parseKeycloakRoles, M as refreshKeycloakToken, aC as resetRateLimitForKey, aE as resolveIdentifier, a1 as resolveRateLimitIdentifier, g as sanitizeApiError, aW as storeBetaCode, s as stripHtml, aV as validateBetaCode, v as validateEnvVars } from './env-jqNJdZVt.js';
3
3
  import 'zod';
4
4
 
5
5
  /**
package/dist/auth.js CHANGED
@@ -50,11 +50,13 @@ __export(auth_exports, {
50
50
  checkEnvVars: () => checkEnvVars,
51
51
  checkRateLimit: () => checkRateLimit,
52
52
  classifyError: () => classifyError,
53
+ clearStoredBetaCode: () => clearStoredBetaCode,
53
54
  constantTimeEqual: () => constantTimeEqual,
54
55
  containsHtml: () => containsHtml,
55
56
  containsUrls: () => containsUrls,
56
57
  createAuditActor: () => createAuditActor,
57
58
  createAuditLogger: () => createAuditLogger,
59
+ createBetaClient: () => createBetaClient,
58
60
  createFeatureFlags: () => createFeatureFlags,
59
61
  createMemoryRateLimitStore: () => createMemoryRateLimitStore,
60
62
  createRedisRateLimitStore: () => createRedisRateLimitStore,
@@ -68,6 +70,7 @@ __export(auth_exports, {
68
70
  extractAuditUserAgent: () => extractAuditUserAgent,
69
71
  extractBearerToken: () => extractBearerToken,
70
72
  extractClientIp: () => extractClientIp,
73
+ fetchBetaSettings: () => fetchBetaSettings,
71
74
  getBoolEnv: () => getBoolEnv,
72
75
  getCorrelationId: () => getCorrelationId,
73
76
  getEndSessionEndpoint: () => getEndSessionEndpoint,
@@ -76,6 +79,7 @@ __export(auth_exports, {
76
79
  getOptionalEnv: () => getOptionalEnv,
77
80
  getRateLimitStatus: () => getRateLimitStatus,
78
81
  getRequiredEnv: () => getRequiredEnv,
82
+ getStoredBetaCode: () => getStoredBetaCode,
79
83
  getTokenEndpoint: () => getTokenEndpoint,
80
84
  hasAllRoles: () => hasAllRoles,
81
85
  hasAnyRole: () => hasAnyRole,
@@ -90,7 +94,9 @@ __export(auth_exports, {
90
94
  resolveIdentifier: () => resolveIdentifier,
91
95
  resolveRateLimitIdentifier: () => resolveRateLimitIdentifier,
92
96
  sanitizeApiError: () => sanitizeApiError,
97
+ storeBetaCode: () => storeBetaCode,
93
98
  stripHtml: () => stripHtml,
99
+ validateBetaCode: () => validateBetaCode,
94
100
  validateEnvVars: () => validateEnvVars,
95
101
  zodErrorResponse: () => zodErrorResponse
96
102
  });
@@ -1204,6 +1210,119 @@ function isValidBearerToken(request, secret) {
1204
1210
  return constantTimeEqual(token, secret);
1205
1211
  }
1206
1212
 
1213
+ // src/auth/beta-client.ts
1214
+ var DEFAULT_CONFIG = {
1215
+ baseUrl: "",
1216
+ settingsEndpoint: "/api/beta-settings",
1217
+ validateEndpoint: "/api/validate-beta-code",
1218
+ storageKey: "beta_code",
1219
+ failSafeDefaults: {
1220
+ betaMode: true,
1221
+ requireInviteCode: true,
1222
+ betaMessage: ""
1223
+ }
1224
+ };
1225
+ function createBetaClient(config = {}) {
1226
+ const cfg = {
1227
+ ...DEFAULT_CONFIG,
1228
+ ...config,
1229
+ failSafeDefaults: {
1230
+ ...DEFAULT_CONFIG.failSafeDefaults,
1231
+ ...config.failSafeDefaults
1232
+ }
1233
+ };
1234
+ return {
1235
+ fetchSettings: () => fetchBetaSettings(cfg),
1236
+ validateCode: (code) => validateBetaCode(code, cfg),
1237
+ storeCode: (code) => storeBetaCode(code, cfg),
1238
+ getStoredCode: () => getStoredBetaCode(cfg),
1239
+ clearStoredCode: () => clearStoredBetaCode(cfg)
1240
+ };
1241
+ }
1242
+ async function fetchBetaSettings(config = {}) {
1243
+ const cfg = { ...DEFAULT_CONFIG, ...config };
1244
+ try {
1245
+ const response = await fetch(
1246
+ `${cfg.baseUrl}${cfg.settingsEndpoint}`,
1247
+ {
1248
+ method: "GET",
1249
+ headers: { "Content-Type": "application/json" },
1250
+ cache: "no-store"
1251
+ }
1252
+ );
1253
+ if (!response.ok) {
1254
+ throw new Error(`Failed to fetch beta settings: ${response.status}`);
1255
+ }
1256
+ const data = await response.json();
1257
+ return {
1258
+ betaMode: data.betaMode ?? cfg.failSafeDefaults.betaMode ?? true,
1259
+ requireInviteCode: data.requireInviteCode ?? cfg.failSafeDefaults.requireInviteCode ?? true,
1260
+ betaMessage: data.betaMessage ?? cfg.failSafeDefaults.betaMessage ?? ""
1261
+ };
1262
+ } catch (error) {
1263
+ console.error("Error fetching beta settings:", error);
1264
+ return {
1265
+ betaMode: cfg.failSafeDefaults.betaMode ?? true,
1266
+ requireInviteCode: cfg.failSafeDefaults.requireInviteCode ?? true,
1267
+ betaMessage: cfg.failSafeDefaults.betaMessage ?? ""
1268
+ };
1269
+ }
1270
+ }
1271
+ async function validateBetaCode(code, config = {}) {
1272
+ const cfg = { ...DEFAULT_CONFIG, ...config };
1273
+ if (!code || code.trim().length < 3) {
1274
+ return {
1275
+ valid: false,
1276
+ message: "Please enter a valid invite code."
1277
+ };
1278
+ }
1279
+ try {
1280
+ const response = await fetch(
1281
+ `${cfg.baseUrl}${cfg.validateEndpoint}`,
1282
+ {
1283
+ method: "POST",
1284
+ headers: { "Content-Type": "application/json" },
1285
+ body: JSON.stringify({ code: code.trim().toUpperCase() })
1286
+ }
1287
+ );
1288
+ if (response.status === 429) {
1289
+ return {
1290
+ valid: false,
1291
+ message: "Too many attempts. Please try again later."
1292
+ };
1293
+ }
1294
+ if (!response.ok) {
1295
+ throw new Error(`Validation request failed: ${response.status}`);
1296
+ }
1297
+ return await response.json();
1298
+ } catch (error) {
1299
+ console.error("Error validating invite code:", error);
1300
+ return {
1301
+ valid: false,
1302
+ message: "Unable to validate code. Please try again."
1303
+ };
1304
+ }
1305
+ }
1306
+ function storeBetaCode(code, config = {}) {
1307
+ const key = config.storageKey ?? DEFAULT_CONFIG.storageKey;
1308
+ if (typeof window !== "undefined") {
1309
+ sessionStorage.setItem(key, code.trim().toUpperCase());
1310
+ }
1311
+ }
1312
+ function getStoredBetaCode(config = {}) {
1313
+ const key = config.storageKey ?? DEFAULT_CONFIG.storageKey;
1314
+ if (typeof window !== "undefined") {
1315
+ return sessionStorage.getItem(key);
1316
+ }
1317
+ return null;
1318
+ }
1319
+ function clearStoredBetaCode(config = {}) {
1320
+ const key = config.storageKey ?? DEFAULT_CONFIG.storageKey;
1321
+ if (typeof window !== "undefined") {
1322
+ sessionStorage.removeItem(key);
1323
+ }
1324
+ }
1325
+
1207
1326
  // src/env.ts
1208
1327
  function getRequiredEnv(key) {
1209
1328
  const value = process.env[key];
@@ -1326,11 +1445,13 @@ function getEnvSummary(keys) {
1326
1445
  checkEnvVars,
1327
1446
  checkRateLimit,
1328
1447
  classifyError,
1448
+ clearStoredBetaCode,
1329
1449
  constantTimeEqual,
1330
1450
  containsHtml,
1331
1451
  containsUrls,
1332
1452
  createAuditActor,
1333
1453
  createAuditLogger,
1454
+ createBetaClient,
1334
1455
  createFeatureFlags,
1335
1456
  createMemoryRateLimitStore,
1336
1457
  createRedisRateLimitStore,
@@ -1344,6 +1465,7 @@ function getEnvSummary(keys) {
1344
1465
  extractAuditUserAgent,
1345
1466
  extractBearerToken,
1346
1467
  extractClientIp,
1468
+ fetchBetaSettings,
1347
1469
  getBoolEnv,
1348
1470
  getCorrelationId,
1349
1471
  getEndSessionEndpoint,
@@ -1352,6 +1474,7 @@ function getEnvSummary(keys) {
1352
1474
  getOptionalEnv,
1353
1475
  getRateLimitStatus,
1354
1476
  getRequiredEnv,
1477
+ getStoredBetaCode,
1355
1478
  getTokenEndpoint,
1356
1479
  hasAllRoles,
1357
1480
  hasAnyRole,
@@ -1366,7 +1489,9 @@ function getEnvSummary(keys) {
1366
1489
  resolveIdentifier,
1367
1490
  resolveRateLimitIdentifier,
1368
1491
  sanitizeApiError,
1492
+ storeBetaCode,
1369
1493
  stripHtml,
1494
+ validateBetaCode,
1370
1495
  validateEnvVars,
1371
1496
  zodErrorResponse
1372
1497
  });