@happyvertical/smrt-users 0.45.2 → 0.46.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/README.md +14 -3
- package/dist/chunks/{TerminalAuthService-Buu2oc6x.js → TerminalAuthService-C7z3uZ4w.js} +3 -3
- package/dist/chunks/{TerminalAuthService-Buu2oc6x.js.map → TerminalAuthService-C7z3uZ4w.js.map} +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +127 -5
- package/dist/index.js.map +1 -1
- package/dist/manifest.json +1 -1
- package/dist/migrations/backfillLegacyUserProfiles.d.ts +30 -0
- package/dist/migrations/backfillLegacyUserProfiles.d.ts.map +1 -0
- package/dist/smrt-knowledge.json +5 -5
- package/dist/sveltekit.js +1 -1
- package/package.json +10 -10
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { AccessRequestCollection, type CliAuthApproveReservation, CliAuthRequestCollection, type CreateChildTenantOptions, type CreateSessionOptions, DEFAULT_ROLE_PERMISSION_PATTERNS, type GetOrCreateFromOidcOptions, GroupCollection, GroupMemberCollection, GroupRoleCollection, MagicLinkTokenCollection, MembershipCollection, MembershipOverrideCollection, type NormalizedOidcClaims, type OidcClaims, type OidcIdentityResult, type OidcProfileOwnerAuthorization, type OidcProfileOwnerAuthorizer, type OidcProfileOwnerAuthorizerContext, type OidcProfileResolver, type OidcProfileResolverContext, OidcProvisioningError, type OidcProvisioningErrorCode, PermissionCollection, RoleCollection, RolePermissionCollection, type RolePermissionPatternMatrix, type SeedRolePermissionsOptions, type SeedRolePermissionsResult, type SeedSystemRolesOptions, SessionCollection, TenantCollection, TenantHierarchyError, TenantIntegrationCollection, TenantPermissionOverrideCollection, type TenantPermissionOverrideResult, UserCollection, UsersCliAuthApproveLimitCollection, UsersCliAuthRequestCollection, UsersMagicLinkTokenCollection, } from './collections/index.js';
|
|
2
|
+
export { type BackfillLegacyUserProfilesResult, backfillLegacyUserProfiles, LEGACY_USER_PROFILE_BACKFILL_NAME, LegacyUserProfileBackfillError, type LegacyUserProfileBackfillErrorCode, } from './migrations/backfillLegacyUserProfiles.js';
|
|
2
3
|
export { type BackfillUserEmailKeysResult, backfillUserEmailKeys, type DuplicateUserEmailKey, UserEmailKeyBackfillError, type UserEmailKeyBackfillErrorCode, } from './migrations/backfillUserEmailKeys.js';
|
|
3
4
|
export { AccessRequest, type AccessRequestOptions, CliAuthRequest, type CliAuthRequestStatus, DEFAULT_SESSION_TTL, DEFAULT_TOKEN_EXPIRY_SECONDS, Group, GroupMember, GroupRole, generateSessionId, MAX_TENANT_HIERARCHY_DEPTH, MagicLinkToken, Membership, MembershipOverride, Permission, Role, RolePermission, Session, Tenant, TenantIntegration, type TenantIntegrationCheckSummary, type TenantIntegrationOptions, type TenantIntegrationProvider, type TenantIntegrationStatus, TenantPermissionOverride, User, UsersCliAuthApproveLimit, UsersCliAuthRequest, UsersMagicLinkToken, } from './models/index.js';
|
|
4
5
|
export { CLI_AUTH_RETENTION_TASK, MAGIC_LINK_RETENTION_TASK, registerUserRetentionTasks, SESSIONS_RETENTION_TASK, USER_RETENTION_TASKS, unregisterUserRetentionTasks, } from './retention.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
import { $ as
|
|
1
|
+
import { $ as MembershipOverride, B as RolePermissionCollection, C as decodeOidcTransaction, Ct as OverrideEffect, Dt as UserStatus, E as resolveOidcProviderConfig, Et as TenantStatus, F as TenantCollection, G as registerPermissionDefinitions, H as deriveOperationPermissionCollectionName, I as TenantHierarchyError, J as RoleCollection, K as syncPermissionCatalog, L as MAX_TENANT_HIERARCHY_DEPTH, M as backfillUserEmailKeys, N as TenantPermissionOverrideCollection, O as OidcProvisioningError, Ot as UsersCliAuthRequest, P as TenantPermissionOverride, Q as MembershipOverrideCollection, R as Tenant, S as OidcLoginService, St as MembershipStatus, T as getUsersOidcConfig, Tt as TenantPermissionEffect, U as deriveOperationPermissionSlug, V as PermissionCatalogService, W as normalizeOperationPermissionAction, X as PermissionCollection, Y as Role, Z as Permission, _ as readMobileBearerToken, _t as generateSessionId, a as TerminalAuthRateLimitError, at as GroupMember, b as PermissionResolver, bt as DEFAULT_ROLE_SLUGS, c as assertOperationPermission, ct as UsersCliAuthApproveLimitCollection, d as getCurrentSessionPermissionContext, dt as isValidEmail, et as MembershipCollection, f as getRequestScopedDatabase, ft as normalizeEmail, g as MobileAuthService, gt as Session, h as MobileAuthError, ht as DEFAULT_SESSION_TTL, i as TerminalAuthError, it as GroupMemberCollection, j as UserEmailKeyBackfillError, k as UserCollection, l as checkOperationPermission, lt as UsersCliAuthApproveLimit, m as withSessionPermissionContext, mt as SessionCollection, n as DEFAULT_CLI_AUTH_REQUEST_TTL_SECONDS, nt as GroupRoleCollection, o as TerminalAuthService, ot as GroupCollection, p as withPrincipalPermissionContext, pt as UsersCliAuthRequestCollection, q as RolePermission, r as DEFAULT_CLI_SESSION_TTL_SECONDS, rt as GroupRole, s as OperationPermissionError, st as Group, t as DEFAULT_CLI_AUTH_POLL_INTERVAL_SECONDS, tt as Membership, u as hasOperationPermission, ut as User, v as validateMobileRedirectUri, vt as AccessRequestStatus, w as encodeOidcTransaction, wt as SessionStatus, x as OidcLoginError, xt as DEFAULT_TENANT_POLICY, y as SessionService, yt as DEFAULT_ROLES, z as DEFAULT_ROLE_PERMISSION_PATTERNS } from "./chunks/TerminalAuthService-C7z3uZ4w.js";
|
|
2
2
|
import { ObjectRegistry, SmrtCollection, SmrtObject, field, findManifestEntryByQualifiedName, isUniqueViolationError, registerRetentionTask, smrt, unregisterRetentionTask } from "@happyvertical/smrt-core";
|
|
3
|
+
import { PROFILE_EMAIL_KEY_BACKFILL_NAME, Person, ProfileCollection, ProfileTypeCollection, normalizeIdentityEmail } from "@happyvertical/smrt-profiles";
|
|
3
4
|
import { createHash } from "node:crypto";
|
|
4
|
-
import { TenantScoped, tenantId } from "@happyvertical/smrt-tenancy";
|
|
5
|
+
import { TenantScoped, tenantId, withSystemContext } from "@happyvertical/smrt-tenancy";
|
|
6
|
+
import { BackfillTracker } from "@happyvertical/smrt-core/migrations";
|
|
5
7
|
import { createLogger } from "@happyvertical/logger";
|
|
6
8
|
//#region src/models/MagicLinkToken.ts
|
|
7
9
|
var __defProp$2 = Object.defineProperty;
|
|
@@ -463,6 +465,126 @@ function isDuplicateKeyError(err) {
|
|
|
463
465
|
return isUniqueViolationError(err);
|
|
464
466
|
}
|
|
465
467
|
//#endregion
|
|
468
|
+
//#region src/migrations/backfillLegacyUserProfiles.ts
|
|
469
|
+
var LEGACY_USER_PROFILE_BACKFILL_NAME = "@happyvertical/smrt-users:legacy-user-profiles:v1";
|
|
470
|
+
var LegacyUserProfileBackfillError = class extends Error {
|
|
471
|
+
constructor(code, message, options) {
|
|
472
|
+
super(message, options);
|
|
473
|
+
this.code = code;
|
|
474
|
+
this.name = "LegacyUserProfileBackfillError";
|
|
475
|
+
}
|
|
476
|
+
code;
|
|
477
|
+
};
|
|
478
|
+
async function backfillLegacyUserProfiles(db) {
|
|
479
|
+
if (!db.transaction) throw new LegacyUserProfileBackfillError("transaction_required", "Legacy User/Profile backfill requires a root database with transaction().");
|
|
480
|
+
const transaction = db.transaction;
|
|
481
|
+
return withSystemContext(() => transaction(async (tx) => {
|
|
482
|
+
BackfillTracker.requireExistingTable(tx);
|
|
483
|
+
const tracker = new BackfillTracker({ db: tx });
|
|
484
|
+
if (!await tracker.isApplied(PROFILE_EMAIL_KEY_BACKFILL_NAME)) throw new LegacyUserProfileBackfillError("profile_email_backfill_required", "Run backfillProfileEmailKeys() before the legacy User/Profile backfill.");
|
|
485
|
+
if (!await tracker.isApplied("@happyvertical/smrt-users:user-email-keys:v1")) throw new LegacyUserProfileBackfillError("user_email_backfill_required", "Run backfillUserEmailKeys() before the legacy User/Profile backfill.");
|
|
486
|
+
const lockClause = /^postgres(?:ql)?:/iu.test(tx.url ?? "") ? " FOR UPDATE" : "";
|
|
487
|
+
const userResult = await tx.query(`SELECT CAST(id AS VARCHAR) AS id, email, email_key,
|
|
488
|
+
CAST(profile_id AS VARCHAR) AS profile_id
|
|
489
|
+
FROM users
|
|
490
|
+
ORDER BY id${lockClause}`);
|
|
491
|
+
const candidates = [];
|
|
492
|
+
const userEmailOwners = /* @__PURE__ */ new Map();
|
|
493
|
+
for (const row of userResult.rows) {
|
|
494
|
+
const id = readRequiredString(row.id, "User id");
|
|
495
|
+
const email = readString(row.email) ?? "";
|
|
496
|
+
const emailKey = email.trim() ? normalizeIdentityEmail(email) : null;
|
|
497
|
+
if (readString(row.email_key) !== emailKey) throw new LegacyUserProfileBackfillError("stale_user_email_key", `User ${id} has a missing or stale email key; rerun backfillUserEmailKeys().`);
|
|
498
|
+
if (emailKey) {
|
|
499
|
+
const owners = userEmailOwners.get(emailKey) ?? [];
|
|
500
|
+
owners.push(id);
|
|
501
|
+
userEmailOwners.set(emailKey, owners);
|
|
502
|
+
}
|
|
503
|
+
if (readString(row.profile_id)?.trim()) continue;
|
|
504
|
+
if (!emailKey) throw new LegacyUserProfileBackfillError("missing_email", `User ${id} cannot receive a canonical Profile without a nonblank email.`);
|
|
505
|
+
candidates.push({
|
|
506
|
+
email,
|
|
507
|
+
emailKey,
|
|
508
|
+
id
|
|
509
|
+
});
|
|
510
|
+
}
|
|
511
|
+
const duplicate = [...userEmailOwners.entries()].find(([, owners]) => owners.length > 1);
|
|
512
|
+
if (duplicate) throw new LegacyUserProfileBackfillError("duplicate_user_email", `Multiple Users share normalized email ${duplicate[0]}; reconcile them before backfill.`);
|
|
513
|
+
const candidateEmails = new Set(candidates.map((candidate) => candidate.emailKey));
|
|
514
|
+
const profileResult = await tx.query("SELECT CAST(id AS VARCHAR) AS id, slug, email, email_key FROM profiles ORDER BY id");
|
|
515
|
+
for (const row of profileResult.rows) {
|
|
516
|
+
const id = readRequiredString(row.id, "Profile id");
|
|
517
|
+
const slug = readString(row.slug);
|
|
518
|
+
const email = readString(row.email) ?? "";
|
|
519
|
+
const expectedEmailKey = email.trim() ? normalizeIdentityEmail(email) : null;
|
|
520
|
+
if (readString(row.email_key) !== expectedEmailKey) throw new LegacyUserProfileBackfillError("profile_email_backfill_required", `Profile ${id} has a missing or stale email key; rerun backfillProfileEmailKeys().`);
|
|
521
|
+
if (expectedEmailKey && candidateEmails.has(expectedEmailKey)) throw new LegacyUserProfileBackfillError("profile_conflict", `A Profile already uses the email required by legacy User ${findCandidateId(candidates, expectedEmailKey)}; reconcile ownership explicitly.`);
|
|
522
|
+
const slugOwner = candidates.find((candidate) => `legacy-user-${candidate.id}` === slug);
|
|
523
|
+
if (slugOwner) throw new LegacyUserProfileBackfillError("profile_conflict", `Profile slug ${slug} is already in use; reconcile legacy User ${slugOwner.id} explicitly.`);
|
|
524
|
+
}
|
|
525
|
+
if (candidateEmails.size > 0) {
|
|
526
|
+
const conflict = (await tx.query("SELECT email_key FROM oidc_profile_email_reservations ORDER BY email_key")).rows.find((row) => {
|
|
527
|
+
const emailKey = readString(row.email_key);
|
|
528
|
+
return emailKey ? candidateEmails.has(emailKey) : false;
|
|
529
|
+
});
|
|
530
|
+
if (conflict) throw new LegacyUserProfileBackfillError("reservation_conflict", `A canonical identity reservation already uses the email required by legacy User ${findCandidateId(candidates, readRequiredString(conflict.email_key, "Reservation email key"))}.`);
|
|
531
|
+
}
|
|
532
|
+
if ((await tx.query(`SELECT CAST(id AS VARCHAR) AS id
|
|
533
|
+
FROM profile_types
|
|
534
|
+
WHERE slug = 'person'
|
|
535
|
+
AND context = ''
|
|
536
|
+
AND _meta_type = '@happyvertical/smrt-profiles:ProfileType'
|
|
537
|
+
AND tenant_id IS NULL
|
|
538
|
+
ORDER BY id`)).rows.length > 1) throw new LegacyUserProfileBackfillError("profile_type_conflict", "Multiple global Person ProfileTypes exist; reconcile them before backfill.");
|
|
539
|
+
const profileTypes = await ProfileTypeCollection.create({ db: tx });
|
|
540
|
+
const profiles = await ProfileCollection.create({ db: tx });
|
|
541
|
+
let created = 0;
|
|
542
|
+
let linked = 0;
|
|
543
|
+
for (const candidate of candidates) {
|
|
544
|
+
const typeId = readRequiredString((await profileTypes.getOrCreateGlobalBySlug("person", {
|
|
545
|
+
name: "Person",
|
|
546
|
+
description: "Individual person profile"
|
|
547
|
+
})).id, "Person ProfileType id");
|
|
548
|
+
let profile = new Person({
|
|
549
|
+
db: tx,
|
|
550
|
+
email: candidate.email,
|
|
551
|
+
name: candidate.email,
|
|
552
|
+
slug: `legacy-user-${candidate.id}`,
|
|
553
|
+
tenantId: null,
|
|
554
|
+
typeId
|
|
555
|
+
});
|
|
556
|
+
await profile.initialize();
|
|
557
|
+
await profile.save();
|
|
558
|
+
profile = await profiles.reserveCanonicalIdentityEmail(readRequiredString(profile.id, "Created Profile id"), candidate.email);
|
|
559
|
+
if ((await tx.query(`UPDATE users
|
|
560
|
+
SET profile_id = ?, updated_at = current_timestamp
|
|
561
|
+
WHERE id = ?
|
|
562
|
+
AND (profile_id IS NULL OR TRIM(CAST(profile_id AS VARCHAR)) = '')`, readRequiredString(profile.id, "Reserved Profile id"), candidate.id)).rowCount !== 1) throw new Error(`Legacy User ${candidate.id} changed during Profile backfill.`);
|
|
563
|
+
created += 1;
|
|
564
|
+
linked += 1;
|
|
565
|
+
}
|
|
566
|
+
await tracker.recordApplied(LEGACY_USER_PROFILE_BACKFILL_NAME, {
|
|
567
|
+
description: "Legacy Users have canonical global Person Profiles.",
|
|
568
|
+
packageName: "@happyvertical/smrt-users"
|
|
569
|
+
});
|
|
570
|
+
return {
|
|
571
|
+
created,
|
|
572
|
+
linked
|
|
573
|
+
};
|
|
574
|
+
}));
|
|
575
|
+
}
|
|
576
|
+
function findCandidateId(candidates, emailKey) {
|
|
577
|
+
return candidates.find((candidate) => candidate.emailKey === emailKey)?.id ?? "<unknown>";
|
|
578
|
+
}
|
|
579
|
+
function readString(value) {
|
|
580
|
+
return typeof value === "string" ? value : value == null ? null : String(value);
|
|
581
|
+
}
|
|
582
|
+
function readRequiredString(value, label) {
|
|
583
|
+
const stringValue = readString(value);
|
|
584
|
+
if (!stringValue) throw new Error(`${label} is missing.`);
|
|
585
|
+
return stringValue;
|
|
586
|
+
}
|
|
587
|
+
//#endregion
|
|
466
588
|
//#region src/services/AccessRequestService.ts
|
|
467
589
|
var logger = createLogger({ level: "info" });
|
|
468
590
|
var ACCESS_REQUEST_CAPABILITIES = {
|
|
@@ -953,7 +1075,7 @@ var MagicLinkService = class MagicLinkService {
|
|
|
953
1075
|
* The caller is responsible for emailing the token to the user.
|
|
954
1076
|
*/
|
|
955
1077
|
async generate(email) {
|
|
956
|
-
const { SignJWT } = await import("./chunks/TerminalAuthService-
|
|
1078
|
+
const { SignJWT } = await import("./chunks/TerminalAuthService-C7z3uZ4w.js").then((n) => n.D);
|
|
957
1079
|
const key = await this.getSigningKey();
|
|
958
1080
|
const nonce = crypto.randomUUID();
|
|
959
1081
|
const normalizedEmail = normalizeEmail(email);
|
|
@@ -982,7 +1104,7 @@ var MagicLinkService = class MagicLinkService {
|
|
|
982
1104
|
* @throws {MagicLinkError} If the token is invalid, expired, or already used
|
|
983
1105
|
*/
|
|
984
1106
|
async verify(token) {
|
|
985
|
-
const { jwtVerify, errors } = await import("./chunks/TerminalAuthService-
|
|
1107
|
+
const { jwtVerify, errors } = await import("./chunks/TerminalAuthService-C7z3uZ4w.js").then((n) => n.D);
|
|
986
1108
|
const key = await this.getSigningKey();
|
|
987
1109
|
let payload;
|
|
988
1110
|
try {
|
|
@@ -1458,6 +1580,6 @@ var TenantService = class TenantService {
|
|
|
1458
1580
|
//#region src/index.ts
|
|
1459
1581
|
registerUserRetentionTasks();
|
|
1460
1582
|
//#endregion
|
|
1461
|
-
export { ACCESS_REQUEST_CAPABILITIES, AccessRequest, AccessRequestCollection, AccessRequestError, AccessRequestService, AccessRequestStatus, CLI_AUTH_RETENTION_TASK, UsersCliAuthRequest as CliAuthRequest, UsersCliAuthRequest, UsersCliAuthRequestCollection as CliAuthRequestCollection, UsersCliAuthRequestCollection, DEFAULT_CLI_AUTH_POLL_INTERVAL_SECONDS, DEFAULT_CLI_AUTH_REQUEST_TTL_SECONDS, DEFAULT_CLI_SESSION_TTL_SECONDS, DEFAULT_ROLES, DEFAULT_ROLE_PERMISSION_PATTERNS, DEFAULT_ROLE_SLUGS, DEFAULT_SESSION_TTL, DEFAULT_TENANT_POLICY, DEFAULT_TOKEN_EXPIRY_SECONDS, Group, GroupCollection, GroupMember, GroupMemberCollection, GroupRole, GroupRoleCollection, MAGIC_LINK_RETENTION_TASK, MAX_TENANT_HIERARCHY_DEPTH, MagicLinkError, MagicLinkService, UsersMagicLinkToken as MagicLinkToken, UsersMagicLinkToken, UsersMagicLinkTokenCollection as MagicLinkTokenCollection, UsersMagicLinkTokenCollection, Membership, MembershipCollection, MembershipOverride, MembershipOverrideCollection, MembershipStatus, MobileAuthError, MobileAuthService, OidcLoginError, OidcLoginService, OidcProvisioningError, OperationPermissionError, OverrideEffect, Permission, PermissionCatalogService, PermissionCollection, PermissionResolver, Role, RoleCollection, RolePermission, RolePermissionCollection, SESSIONS_RETENTION_TASK, Session, SessionCollection, SessionService, SessionStatus, Tenant, TenantCollection, TenantHierarchyError, TenantIntegration, TenantIntegrationCollection, TenantPermissionEffect, TenantPermissionOverride, TenantPermissionOverrideCollection, TenantService, TenantStatus, TerminalAuthError, TerminalAuthRateLimitError, TerminalAuthService, USER_RETENTION_TASKS, User, UserCollection, UserEmailKeyBackfillError, UserStatus, UsersCliAuthApproveLimit, UsersCliAuthApproveLimitCollection, applyPostgresPermissionPolicies, assertOperationPermission, backfillUserEmailKeys, checkOperationPermission, decodeOidcTransaction, deriveOperationPermissionCollectionName, deriveOperationPermissionSlug, encodeOidcTransaction, generatePostgresPermissionSql, generateSessionId, getCurrentSessionPermissionContext, getRequestScopedDatabase, getUsersOidcConfig, hasOperationPermission, normalizeOperationPermissionAction, readMobileBearerToken, registerPermissionDefinitions, registerUserRetentionTasks, resolveOidcProviderConfig, syncPermissionCatalog, unregisterUserRetentionTasks, validateMobileRedirectUri, withPrincipalPermissionContext, withSessionPermissionContext };
|
|
1583
|
+
export { ACCESS_REQUEST_CAPABILITIES, AccessRequest, AccessRequestCollection, AccessRequestError, AccessRequestService, AccessRequestStatus, CLI_AUTH_RETENTION_TASK, UsersCliAuthRequest as CliAuthRequest, UsersCliAuthRequest, UsersCliAuthRequestCollection as CliAuthRequestCollection, UsersCliAuthRequestCollection, DEFAULT_CLI_AUTH_POLL_INTERVAL_SECONDS, DEFAULT_CLI_AUTH_REQUEST_TTL_SECONDS, DEFAULT_CLI_SESSION_TTL_SECONDS, DEFAULT_ROLES, DEFAULT_ROLE_PERMISSION_PATTERNS, DEFAULT_ROLE_SLUGS, DEFAULT_SESSION_TTL, DEFAULT_TENANT_POLICY, DEFAULT_TOKEN_EXPIRY_SECONDS, Group, GroupCollection, GroupMember, GroupMemberCollection, GroupRole, GroupRoleCollection, LEGACY_USER_PROFILE_BACKFILL_NAME, LegacyUserProfileBackfillError, MAGIC_LINK_RETENTION_TASK, MAX_TENANT_HIERARCHY_DEPTH, MagicLinkError, MagicLinkService, UsersMagicLinkToken as MagicLinkToken, UsersMagicLinkToken, UsersMagicLinkTokenCollection as MagicLinkTokenCollection, UsersMagicLinkTokenCollection, Membership, MembershipCollection, MembershipOverride, MembershipOverrideCollection, MembershipStatus, MobileAuthError, MobileAuthService, OidcLoginError, OidcLoginService, OidcProvisioningError, OperationPermissionError, OverrideEffect, Permission, PermissionCatalogService, PermissionCollection, PermissionResolver, Role, RoleCollection, RolePermission, RolePermissionCollection, SESSIONS_RETENTION_TASK, Session, SessionCollection, SessionService, SessionStatus, Tenant, TenantCollection, TenantHierarchyError, TenantIntegration, TenantIntegrationCollection, TenantPermissionEffect, TenantPermissionOverride, TenantPermissionOverrideCollection, TenantService, TenantStatus, TerminalAuthError, TerminalAuthRateLimitError, TerminalAuthService, USER_RETENTION_TASKS, User, UserCollection, UserEmailKeyBackfillError, UserStatus, UsersCliAuthApproveLimit, UsersCliAuthApproveLimitCollection, applyPostgresPermissionPolicies, assertOperationPermission, backfillLegacyUserProfiles, backfillUserEmailKeys, checkOperationPermission, decodeOidcTransaction, deriveOperationPermissionCollectionName, deriveOperationPermissionSlug, encodeOidcTransaction, generatePostgresPermissionSql, generateSessionId, getCurrentSessionPermissionContext, getRequestScopedDatabase, getUsersOidcConfig, hasOperationPermission, normalizeOperationPermissionAction, readMobileBearerToken, registerPermissionDefinitions, registerUserRetentionTasks, resolveOidcProviderConfig, syncPermissionCatalog, unregisterUserRetentionTasks, validateMobileRedirectUri, withPrincipalPermissionContext, withSessionPermissionContext };
|
|
1462
1584
|
|
|
1463
1585
|
//# sourceMappingURL=index.js.map
|