@meistrari/auth-core 2.8.0 → 2.10.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/index.d.mts CHANGED
@@ -621,10 +621,30 @@ type Application = {
621
621
  /** Additional configuration for this application. */
622
622
  config?: ApplicationConfig;
623
623
  };
624
+ /**
625
+ * Fields that can be optionally included when listing candidate organizations.
626
+ */
627
+ type ListCandidateOrganizationsInclude = 'lastUsed';
628
+ /**
629
+ * Options accepted by the candidate organizations client method.
630
+ */
631
+ type ListCandidateOrganizationsOptions = {
632
+ /**
633
+ * Fields to include on each returned organization. When omitted or empty,
634
+ * only the base organization fields are returned.
635
+ */
636
+ include?: ListCandidateOrganizationsInclude[];
637
+ };
624
638
  /**
625
639
  * Response returned when listing candidate organizations for an application.
626
640
  */
627
- type ListCandidateOrganizationsResponse = FullOrganization[];
641
+ type ListCandidateOrganizationsResponse = Array<FullOrganization & {
642
+ /**
643
+ * Whether this is the organization the user last signed in to the
644
+ * application with. Only present when `lastUsed` is included.
645
+ */
646
+ lastUsed?: boolean;
647
+ }>;
628
648
  /**
629
649
  * Public application context used to preserve continuity during auth redirects.
630
650
  */
@@ -888,10 +908,14 @@ declare class ApplicationService {
888
908
  * entitlement is selected first; organization entitlements are considered only
889
909
  * when no global entitlement is enabled.
890
910
  *
911
+ * Pass `options.include` with `lastUsed` to flag the organization the user
912
+ * last signed in to the application with.
913
+ *
891
914
  * @param applicationId - The application ID to get candidate organizations for
915
+ * @param options - Optional include list controlling which fields are returned
892
916
  * @returns The list of candidate organizations
893
917
  */
894
- listCandidateOrganizations(applicationId: string): Promise<ListCandidateOrganizationsResponse>;
918
+ listCandidateOrganizations(applicationId: string, options?: ListCandidateOrganizationsOptions): Promise<ListCandidateOrganizationsResponse>;
895
919
  /**
896
920
  * Starts an authorization flow for a specific application.
897
921
  *
@@ -3408,7 +3432,7 @@ declare function createAPIClient(apiUrl: string, fetchOptions?: BetterFetchOptio
3408
3432
  data: ApplicationAuthContextResponse;
3409
3433
  error: null;
3410
3434
  }>;
3411
- listCandidateOrganizations: (applicationId: string) => Promise<{
3435
+ listCandidateOrganizations: (applicationId: string, options?: ListCandidateOrganizationsOptions) => Promise<{
3412
3436
  data: ListCandidateOrganizationsResponse;
3413
3437
  error?: unknown;
3414
3438
  }>;
@@ -5123,14 +5147,14 @@ declare class AdminService {
5123
5147
  * Requests an application management route.
5124
5148
  *
5125
5149
  * These routes are served by the API itself rather than by the Better Auth
5126
- * handler, so they sit outside the `/api/auth` base path that the Better
5127
- * Auth client prepends and cannot go through {@link APIClient.$fetch}. They
5128
- * authenticate with the session cookie alone; a bearer token must never be
5129
- * attached, since the API reads one only as an internal API key and would
5130
- * reject the request.
5150
+ * handler, so they sit outside the `/api/auth` base path. The request is
5151
+ * sent to an absolute URL resolved against the API root, which better-fetch
5152
+ * uses as-is instead of prefixing the client's base URL, so it still goes
5153
+ * through {@link APIClient.$fetch} and picks up every fetch option the
5154
+ * client was created with (hooks, default headers, custom fetch, cookies).
5131
5155
  *
5132
- * @param path - Path relative to the API root, without a leading slash
5133
- * @param request - Method, body, and query parameters
5156
+ * @param path - Path relative to the API root, without a leading slash; `:name` segments are filled from `request.params`
5157
+ * @param request - Method, body, query, and path parameters
5134
5158
  * @returns The parsed JSON response
5135
5159
  */
5136
5160
  private requestApplicationRoute;
@@ -6550,4 +6574,4 @@ declare function validateToken(token: string, apiUrl: string): Promise<boolean>;
6550
6574
  declare function extractTokenPayload(token: string): DecodedJWTPayload;
6551
6575
 
6552
6576
  export { AAL, AALBrand, AALs, ACR, ACRBrand, ACRs, AMR, AMRBrand, AMRs, ApiKeyMetadata, ApplicationConfig, ApplicationError, ApplicationSessionAssuranceConfig, ApplicationSessionAssuranceError, ApplicationTokenStorage, AuthClient, AuthMethod, AuthMethodBrand, AuthMethods, AuthorizationFlowError, DEFAULT_APPLICATION_CONFIG, DEFAULT_JWT_ASSURANCE, DEFAULT_SESSION_ASSURANCE_CONFIG, DeviceAccessDeniedError, DeviceAuthorizationPendingError, DeviceAuthorizationSlowDownError, DeviceCodeExpiredError, DeviceTransientServerError, EmailOTPService, EmailRequired, InvalidCallbackURL, InvalidSocialProvider, JWTPayload, JWTPayloadAssurance, JWTPayloadUser, JWTPayloadWorkspace, LOGIN_METHODS, OAuthBeginStepUpResponse, OAuthCompleteStepUpResponse, OAuthStepUpProvider, RefreshTokenExpiredError, Roles, SENSITIVE_ACTION_ASSURANCE_POLICY, STEP_UP_MAX_AGE_SECONDS, SendOtpResponse, SessionAssurancePolicy, SessionAssuranceRequiredError, SessionAssuranceRequiredPayload, SessionAssuranceResponse, SessionAssuranceService, StepUpOption, UserNotLoggedInError, ac, assuranceFields, canStepUpWithAmr, createAPIClient, extractTokenPayload, getAalRank, invitationAdditionalFields, isAssuranceSufficientForPolicy, isSessionAssuranceSufficient, isTokenExpired, memberAdditionalFields, mergeStepUpAssurance, normalizeAmr, organizationAdditionalFields, parseSessionAssuranceRequiredPayload, rolesAccessControl, sessionAssurancePluginClient, userAdditionalFields, validateToken };
6553
- export type { APIClient, AcceptInvitationResult, AdminApplication, AdminApplicationEntitlement, AdminApplicationEntitlementRecord, AdminApplicationIdentity, AdminApplicationMember, AdminApplicationMemberOrganization, AdminApplicationMemberRecord, AdminApplicationOrganization, AdminApplicationRecord, AdminApplicationRole, AdminApplicationSecret, AdminEntitlementRule, AdminEntitlementRuleType, AdminEntitlementWithRules, AdminMember, AdminOrganization, AdminOrganizationApplication, AdminOrganizationMember, AdminOrganizationMemberApplication, AdminOrganizationMemberRecord, AdminOrganizationMemberTeam, AdminOrganizationSummary, AdminOrganizationTeam, AdminOrganizationTeamRecord, AdminUser, AdminUserAccess, AdminUserAccessApplication, AdminUserAccessOrganization, AdminUserAccessTeam, AdminUserInvitation, AdminUserOrganization, ApiKey, ApiKeyWithoutSecret, Application, ApplicationAuthContextResponse, ApplicationTokenStorageOptions, AssuranceFields, BaseOrganization, BeginOAuthStepUpParams, BillingMode, ClientCredentialsGrant, ClientCredentialsTokenResponse, CompleteAuthorizationFlowResponse, CreateAdminApplicationEntitlementOptions, CreateAdminApplicationOptions, CreateAdminApplicationRoleOptions, CreateAdminApplicationSecretOptions, CreateAdminOrganizationOptions, CreateAdminOrganizationTeamOptions, CreateApiKeyPayload, CreateTeamPayload, CreatedAdminApplicationSecret, DecodedJWTPayload, DeleteAdminOrganizationTeamOptions, DeviceAuthorizationActionResponse, DeviceAuthorizationContextResponse, DeviceAuthorizationResponse, DeviceContextApplication, EmailOTPSignInOptions, FullOrganization, GetAdminOrganizationOptions, GetAdminOrganizationsSummaryOptions, GetTokenOptions, Invitation, InvitationPasswordSetupResult, InvitationSignupStatus, InviteAdminOrganizationUsersOptions, InviteAdminOrganizationUsersResult, InviteUserToOrganizationOptions, JWTPayloadData, ListAdminApplicationMembersOptions, ListAdminApplicationMembersResult, ListAdminApplicationsOptions, ListAdminApplicationsResult, ListAdminOrganizationMembersOptions, ListAdminOrganizationMembersResult, ListAdminOrganizationTeamsOptions, ListAdminOrganizationTeamsResult, ListAdminOrganizationsOptions, ListAdminOrganizationsResult, ListAdminUsersOptions, ListAdminUsersResult, ListCandidateOrganizationsResponse, ListMembersOptions, ListOrganizationsOptions, ListOrganizationsWithRoleOptions, LoginMethod, LoginMethodsResponse, Member, NoncePayloadResponse, ExtendedOrganization as Organization, OrganizationSettings, OrganizationWithRole, RemoveAdminMemberOptions, RemoveUserFromOrganizationOptions, ResendAdminInviteOptions, Role, SendVerificationOTPOptions, Session, SessionAssuranceActions, SessionData, SetAdminEntitlementRulesOptions, SetAdminUserApplicationRoleOptions, SetAdminUserPasswordOptions, SetAdminUserTeamOptions, SignInWithEmailAndPasswordOptions, SignInWithSsoOptions, SocialSignInOptions, StartAuthorizationFlowResponse, Strict, Team, TeamMember, TeamMembersResponse, UpdateAdminApplicationRoleOptions, UpdateAdminEntitlementOptions, UpdateAdminMemberRoleOptions, UpdateAdminOrganizationOptions, UpdateAdminOrganizationTeamOptions, UpdateApiKeyPayload, UpdateMemberRoleOptions, UpdateOrganizationPayload, UpdateTeamPayload, User, UserProfile, WhoAmIInclude, WhoAmIOptions, WhoAmIOrganization, WhoAmIResponse };
6577
+ export type { APIClient, AcceptInvitationResult, AdminApplication, AdminApplicationEntitlement, AdminApplicationEntitlementRecord, AdminApplicationIdentity, AdminApplicationMember, AdminApplicationMemberOrganization, AdminApplicationMemberRecord, AdminApplicationOrganization, AdminApplicationRecord, AdminApplicationRole, AdminApplicationSecret, AdminEntitlementRule, AdminEntitlementRuleType, AdminEntitlementWithRules, AdminMember, AdminOrganization, AdminOrganizationApplication, AdminOrganizationMember, AdminOrganizationMemberApplication, AdminOrganizationMemberRecord, AdminOrganizationMemberTeam, AdminOrganizationSummary, AdminOrganizationTeam, AdminOrganizationTeamRecord, AdminUser, AdminUserAccess, AdminUserAccessApplication, AdminUserAccessOrganization, AdminUserAccessTeam, AdminUserInvitation, AdminUserOrganization, ApiKey, ApiKeyWithoutSecret, Application, ApplicationAuthContextResponse, ApplicationTokenStorageOptions, AssuranceFields, BaseOrganization, BeginOAuthStepUpParams, BillingMode, ClientCredentialsGrant, ClientCredentialsTokenResponse, CompleteAuthorizationFlowResponse, CreateAdminApplicationEntitlementOptions, CreateAdminApplicationOptions, CreateAdminApplicationRoleOptions, CreateAdminApplicationSecretOptions, CreateAdminOrganizationOptions, CreateAdminOrganizationTeamOptions, CreateApiKeyPayload, CreateTeamPayload, CreatedAdminApplicationSecret, DecodedJWTPayload, DeleteAdminOrganizationTeamOptions, DeviceAuthorizationActionResponse, DeviceAuthorizationContextResponse, DeviceAuthorizationResponse, DeviceContextApplication, EmailOTPSignInOptions, FullOrganization, GetAdminOrganizationOptions, GetAdminOrganizationsSummaryOptions, GetTokenOptions, Invitation, InvitationPasswordSetupResult, InvitationSignupStatus, InviteAdminOrganizationUsersOptions, InviteAdminOrganizationUsersResult, InviteUserToOrganizationOptions, JWTPayloadData, ListAdminApplicationMembersOptions, ListAdminApplicationMembersResult, ListAdminApplicationsOptions, ListAdminApplicationsResult, ListAdminOrganizationMembersOptions, ListAdminOrganizationMembersResult, ListAdminOrganizationTeamsOptions, ListAdminOrganizationTeamsResult, ListAdminOrganizationsOptions, ListAdminOrganizationsResult, ListAdminUsersOptions, ListAdminUsersResult, ListCandidateOrganizationsInclude, ListCandidateOrganizationsOptions, ListCandidateOrganizationsResponse, ListMembersOptions, ListOrganizationsOptions, ListOrganizationsWithRoleOptions, LoginMethod, LoginMethodsResponse, Member, NoncePayloadResponse, ExtendedOrganization as Organization, OrganizationSettings, OrganizationWithRole, RemoveAdminMemberOptions, RemoveUserFromOrganizationOptions, ResendAdminInviteOptions, Role, SendVerificationOTPOptions, Session, SessionAssuranceActions, SessionData, SetAdminEntitlementRulesOptions, SetAdminUserApplicationRoleOptions, SetAdminUserPasswordOptions, SetAdminUserTeamOptions, SignInWithEmailAndPasswordOptions, SignInWithSsoOptions, SocialSignInOptions, StartAuthorizationFlowResponse, Strict, Team, TeamMember, TeamMembersResponse, UpdateAdminApplicationRoleOptions, UpdateAdminEntitlementOptions, UpdateAdminMemberRoleOptions, UpdateAdminOrganizationOptions, UpdateAdminOrganizationTeamOptions, UpdateApiKeyPayload, UpdateMemberRoleOptions, UpdateOrganizationPayload, UpdateTeamPayload, User, UserProfile, WhoAmIInclude, WhoAmIOptions, WhoAmIOrganization, WhoAmIResponse };
package/dist/index.d.ts CHANGED
@@ -621,10 +621,30 @@ type Application = {
621
621
  /** Additional configuration for this application. */
622
622
  config?: ApplicationConfig;
623
623
  };
624
+ /**
625
+ * Fields that can be optionally included when listing candidate organizations.
626
+ */
627
+ type ListCandidateOrganizationsInclude = 'lastUsed';
628
+ /**
629
+ * Options accepted by the candidate organizations client method.
630
+ */
631
+ type ListCandidateOrganizationsOptions = {
632
+ /**
633
+ * Fields to include on each returned organization. When omitted or empty,
634
+ * only the base organization fields are returned.
635
+ */
636
+ include?: ListCandidateOrganizationsInclude[];
637
+ };
624
638
  /**
625
639
  * Response returned when listing candidate organizations for an application.
626
640
  */
627
- type ListCandidateOrganizationsResponse = FullOrganization[];
641
+ type ListCandidateOrganizationsResponse = Array<FullOrganization & {
642
+ /**
643
+ * Whether this is the organization the user last signed in to the
644
+ * application with. Only present when `lastUsed` is included.
645
+ */
646
+ lastUsed?: boolean;
647
+ }>;
628
648
  /**
629
649
  * Public application context used to preserve continuity during auth redirects.
630
650
  */
@@ -888,10 +908,14 @@ declare class ApplicationService {
888
908
  * entitlement is selected first; organization entitlements are considered only
889
909
  * when no global entitlement is enabled.
890
910
  *
911
+ * Pass `options.include` with `lastUsed` to flag the organization the user
912
+ * last signed in to the application with.
913
+ *
891
914
  * @param applicationId - The application ID to get candidate organizations for
915
+ * @param options - Optional include list controlling which fields are returned
892
916
  * @returns The list of candidate organizations
893
917
  */
894
- listCandidateOrganizations(applicationId: string): Promise<ListCandidateOrganizationsResponse>;
918
+ listCandidateOrganizations(applicationId: string, options?: ListCandidateOrganizationsOptions): Promise<ListCandidateOrganizationsResponse>;
895
919
  /**
896
920
  * Starts an authorization flow for a specific application.
897
921
  *
@@ -3408,7 +3432,7 @@ declare function createAPIClient(apiUrl: string, fetchOptions?: BetterFetchOptio
3408
3432
  data: ApplicationAuthContextResponse;
3409
3433
  error: null;
3410
3434
  }>;
3411
- listCandidateOrganizations: (applicationId: string) => Promise<{
3435
+ listCandidateOrganizations: (applicationId: string, options?: ListCandidateOrganizationsOptions) => Promise<{
3412
3436
  data: ListCandidateOrganizationsResponse;
3413
3437
  error?: unknown;
3414
3438
  }>;
@@ -5123,14 +5147,14 @@ declare class AdminService {
5123
5147
  * Requests an application management route.
5124
5148
  *
5125
5149
  * These routes are served by the API itself rather than by the Better Auth
5126
- * handler, so they sit outside the `/api/auth` base path that the Better
5127
- * Auth client prepends and cannot go through {@link APIClient.$fetch}. They
5128
- * authenticate with the session cookie alone; a bearer token must never be
5129
- * attached, since the API reads one only as an internal API key and would
5130
- * reject the request.
5150
+ * handler, so they sit outside the `/api/auth` base path. The request is
5151
+ * sent to an absolute URL resolved against the API root, which better-fetch
5152
+ * uses as-is instead of prefixing the client's base URL, so it still goes
5153
+ * through {@link APIClient.$fetch} and picks up every fetch option the
5154
+ * client was created with (hooks, default headers, custom fetch, cookies).
5131
5155
  *
5132
- * @param path - Path relative to the API root, without a leading slash
5133
- * @param request - Method, body, and query parameters
5156
+ * @param path - Path relative to the API root, without a leading slash; `:name` segments are filled from `request.params`
5157
+ * @param request - Method, body, query, and path parameters
5134
5158
  * @returns The parsed JSON response
5135
5159
  */
5136
5160
  private requestApplicationRoute;
@@ -6550,4 +6574,4 @@ declare function validateToken(token: string, apiUrl: string): Promise<boolean>;
6550
6574
  declare function extractTokenPayload(token: string): DecodedJWTPayload;
6551
6575
 
6552
6576
  export { AAL, AALBrand, AALs, ACR, ACRBrand, ACRs, AMR, AMRBrand, AMRs, ApiKeyMetadata, ApplicationConfig, ApplicationError, ApplicationSessionAssuranceConfig, ApplicationSessionAssuranceError, ApplicationTokenStorage, AuthClient, AuthMethod, AuthMethodBrand, AuthMethods, AuthorizationFlowError, DEFAULT_APPLICATION_CONFIG, DEFAULT_JWT_ASSURANCE, DEFAULT_SESSION_ASSURANCE_CONFIG, DeviceAccessDeniedError, DeviceAuthorizationPendingError, DeviceAuthorizationSlowDownError, DeviceCodeExpiredError, DeviceTransientServerError, EmailOTPService, EmailRequired, InvalidCallbackURL, InvalidSocialProvider, JWTPayload, JWTPayloadAssurance, JWTPayloadUser, JWTPayloadWorkspace, LOGIN_METHODS, OAuthBeginStepUpResponse, OAuthCompleteStepUpResponse, OAuthStepUpProvider, RefreshTokenExpiredError, Roles, SENSITIVE_ACTION_ASSURANCE_POLICY, STEP_UP_MAX_AGE_SECONDS, SendOtpResponse, SessionAssurancePolicy, SessionAssuranceRequiredError, SessionAssuranceRequiredPayload, SessionAssuranceResponse, SessionAssuranceService, StepUpOption, UserNotLoggedInError, ac, assuranceFields, canStepUpWithAmr, createAPIClient, extractTokenPayload, getAalRank, invitationAdditionalFields, isAssuranceSufficientForPolicy, isSessionAssuranceSufficient, isTokenExpired, memberAdditionalFields, mergeStepUpAssurance, normalizeAmr, organizationAdditionalFields, parseSessionAssuranceRequiredPayload, rolesAccessControl, sessionAssurancePluginClient, userAdditionalFields, validateToken };
6553
- export type { APIClient, AcceptInvitationResult, AdminApplication, AdminApplicationEntitlement, AdminApplicationEntitlementRecord, AdminApplicationIdentity, AdminApplicationMember, AdminApplicationMemberOrganization, AdminApplicationMemberRecord, AdminApplicationOrganization, AdminApplicationRecord, AdminApplicationRole, AdminApplicationSecret, AdminEntitlementRule, AdminEntitlementRuleType, AdminEntitlementWithRules, AdminMember, AdminOrganization, AdminOrganizationApplication, AdminOrganizationMember, AdminOrganizationMemberApplication, AdminOrganizationMemberRecord, AdminOrganizationMemberTeam, AdminOrganizationSummary, AdminOrganizationTeam, AdminOrganizationTeamRecord, AdminUser, AdminUserAccess, AdminUserAccessApplication, AdminUserAccessOrganization, AdminUserAccessTeam, AdminUserInvitation, AdminUserOrganization, ApiKey, ApiKeyWithoutSecret, Application, ApplicationAuthContextResponse, ApplicationTokenStorageOptions, AssuranceFields, BaseOrganization, BeginOAuthStepUpParams, BillingMode, ClientCredentialsGrant, ClientCredentialsTokenResponse, CompleteAuthorizationFlowResponse, CreateAdminApplicationEntitlementOptions, CreateAdminApplicationOptions, CreateAdminApplicationRoleOptions, CreateAdminApplicationSecretOptions, CreateAdminOrganizationOptions, CreateAdminOrganizationTeamOptions, CreateApiKeyPayload, CreateTeamPayload, CreatedAdminApplicationSecret, DecodedJWTPayload, DeleteAdminOrganizationTeamOptions, DeviceAuthorizationActionResponse, DeviceAuthorizationContextResponse, DeviceAuthorizationResponse, DeviceContextApplication, EmailOTPSignInOptions, FullOrganization, GetAdminOrganizationOptions, GetAdminOrganizationsSummaryOptions, GetTokenOptions, Invitation, InvitationPasswordSetupResult, InvitationSignupStatus, InviteAdminOrganizationUsersOptions, InviteAdminOrganizationUsersResult, InviteUserToOrganizationOptions, JWTPayloadData, ListAdminApplicationMembersOptions, ListAdminApplicationMembersResult, ListAdminApplicationsOptions, ListAdminApplicationsResult, ListAdminOrganizationMembersOptions, ListAdminOrganizationMembersResult, ListAdminOrganizationTeamsOptions, ListAdminOrganizationTeamsResult, ListAdminOrganizationsOptions, ListAdminOrganizationsResult, ListAdminUsersOptions, ListAdminUsersResult, ListCandidateOrganizationsResponse, ListMembersOptions, ListOrganizationsOptions, ListOrganizationsWithRoleOptions, LoginMethod, LoginMethodsResponse, Member, NoncePayloadResponse, ExtendedOrganization as Organization, OrganizationSettings, OrganizationWithRole, RemoveAdminMemberOptions, RemoveUserFromOrganizationOptions, ResendAdminInviteOptions, Role, SendVerificationOTPOptions, Session, SessionAssuranceActions, SessionData, SetAdminEntitlementRulesOptions, SetAdminUserApplicationRoleOptions, SetAdminUserPasswordOptions, SetAdminUserTeamOptions, SignInWithEmailAndPasswordOptions, SignInWithSsoOptions, SocialSignInOptions, StartAuthorizationFlowResponse, Strict, Team, TeamMember, TeamMembersResponse, UpdateAdminApplicationRoleOptions, UpdateAdminEntitlementOptions, UpdateAdminMemberRoleOptions, UpdateAdminOrganizationOptions, UpdateAdminOrganizationTeamOptions, UpdateApiKeyPayload, UpdateMemberRoleOptions, UpdateOrganizationPayload, UpdateTeamPayload, User, UserProfile, WhoAmIInclude, WhoAmIOptions, WhoAmIOrganization, WhoAmIResponse };
6577
+ export type { APIClient, AcceptInvitationResult, AdminApplication, AdminApplicationEntitlement, AdminApplicationEntitlementRecord, AdminApplicationIdentity, AdminApplicationMember, AdminApplicationMemberOrganization, AdminApplicationMemberRecord, AdminApplicationOrganization, AdminApplicationRecord, AdminApplicationRole, AdminApplicationSecret, AdminEntitlementRule, AdminEntitlementRuleType, AdminEntitlementWithRules, AdminMember, AdminOrganization, AdminOrganizationApplication, AdminOrganizationMember, AdminOrganizationMemberApplication, AdminOrganizationMemberRecord, AdminOrganizationMemberTeam, AdminOrganizationSummary, AdminOrganizationTeam, AdminOrganizationTeamRecord, AdminUser, AdminUserAccess, AdminUserAccessApplication, AdminUserAccessOrganization, AdminUserAccessTeam, AdminUserInvitation, AdminUserOrganization, ApiKey, ApiKeyWithoutSecret, Application, ApplicationAuthContextResponse, ApplicationTokenStorageOptions, AssuranceFields, BaseOrganization, BeginOAuthStepUpParams, BillingMode, ClientCredentialsGrant, ClientCredentialsTokenResponse, CompleteAuthorizationFlowResponse, CreateAdminApplicationEntitlementOptions, CreateAdminApplicationOptions, CreateAdminApplicationRoleOptions, CreateAdminApplicationSecretOptions, CreateAdminOrganizationOptions, CreateAdminOrganizationTeamOptions, CreateApiKeyPayload, CreateTeamPayload, CreatedAdminApplicationSecret, DecodedJWTPayload, DeleteAdminOrganizationTeamOptions, DeviceAuthorizationActionResponse, DeviceAuthorizationContextResponse, DeviceAuthorizationResponse, DeviceContextApplication, EmailOTPSignInOptions, FullOrganization, GetAdminOrganizationOptions, GetAdminOrganizationsSummaryOptions, GetTokenOptions, Invitation, InvitationPasswordSetupResult, InvitationSignupStatus, InviteAdminOrganizationUsersOptions, InviteAdminOrganizationUsersResult, InviteUserToOrganizationOptions, JWTPayloadData, ListAdminApplicationMembersOptions, ListAdminApplicationMembersResult, ListAdminApplicationsOptions, ListAdminApplicationsResult, ListAdminOrganizationMembersOptions, ListAdminOrganizationMembersResult, ListAdminOrganizationTeamsOptions, ListAdminOrganizationTeamsResult, ListAdminOrganizationsOptions, ListAdminOrganizationsResult, ListAdminUsersOptions, ListAdminUsersResult, ListCandidateOrganizationsInclude, ListCandidateOrganizationsOptions, ListCandidateOrganizationsResponse, ListMembersOptions, ListOrganizationsOptions, ListOrganizationsWithRoleOptions, LoginMethod, LoginMethodsResponse, Member, NoncePayloadResponse, ExtendedOrganization as Organization, OrganizationSettings, OrganizationWithRole, RemoveAdminMemberOptions, RemoveUserFromOrganizationOptions, ResendAdminInviteOptions, Role, SendVerificationOTPOptions, Session, SessionAssuranceActions, SessionData, SetAdminEntitlementRulesOptions, SetAdminUserApplicationRoleOptions, SetAdminUserPasswordOptions, SetAdminUserTeamOptions, SignInWithEmailAndPasswordOptions, SignInWithSsoOptions, SocialSignInOptions, StartAuthorizationFlowResponse, Strict, Team, TeamMember, TeamMembersResponse, UpdateAdminApplicationRoleOptions, UpdateAdminEntitlementOptions, UpdateAdminMemberRoleOptions, UpdateAdminOrganizationOptions, UpdateAdminOrganizationTeamOptions, UpdateApiKeyPayload, UpdateMemberRoleOptions, UpdateOrganizationPayload, UpdateTeamPayload, User, UserProfile, WhoAmIInclude, WhoAmIOptions, WhoAmIOrganization, WhoAmIResponse };
package/dist/index.mjs CHANGED
@@ -21,7 +21,7 @@ function isTokenExpired(token, expiresInMs) {
21
21
  return nowInSeconds > expirationTime;
22
22
  }
23
23
 
24
- const version = "2.8.0";
24
+ const version = "2.10.0";
25
25
 
26
26
  function parsedEnumValues(schema) {
27
27
  return Object.fromEntries(
@@ -239,11 +239,13 @@ function applicationsPluginClient() {
239
239
  }
240
240
  });
241
241
  },
242
- listCandidateOrganizations: async (applicationId) => {
242
+ listCandidateOrganizations: async (applicationId, options = {}) => {
243
+ const query = { applicationId };
244
+ if (options.include && options.include.length > 0) {
245
+ query.include = options.include.join(",");
246
+ }
243
247
  const response = await $fetch("/organization/list", {
244
- query: {
245
- applicationId
246
- }
248
+ query
247
249
  });
248
250
  return normalizeOrganizationsResponse(response);
249
251
  },
@@ -512,19 +514,12 @@ class ApplicationRouteError extends Error {
512
514
  code;
513
515
  details;
514
516
  status;
515
- constructor(response, body) {
516
- super(body?.error ?? body?.message ?? response.statusText);
517
+ constructor(body) {
518
+ super(body.error ?? body.message ?? body.statusText);
517
519
  this.name = "ApplicationRouteError";
518
- this.status = response.status;
519
- this.code = body?.code;
520
- this.details = body?.details;
521
- }
522
- }
523
- async function readErrorBody(response) {
524
- try {
525
- return await response.json();
526
- } catch {
527
- return null;
520
+ this.status = body.status;
521
+ this.code = body.code;
522
+ this.details = body.details;
528
523
  }
529
524
  }
530
525
  class AdminService {
@@ -545,35 +540,35 @@ class AdminService {
545
540
  * Requests an application management route.
546
541
  *
547
542
  * These routes are served by the API itself rather than by the Better Auth
548
- * handler, so they sit outside the `/api/auth` base path that the Better
549
- * Auth client prepends and cannot go through {@link APIClient.$fetch}. They
550
- * authenticate with the session cookie alone; a bearer token must never be
551
- * attached, since the API reads one only as an internal API key and would
552
- * reject the request.
553
- *
554
- * @param path - Path relative to the API root, without a leading slash
555
- * @param request - Method, body, and query parameters
543
+ * handler, so they sit outside the `/api/auth` base path. The request is
544
+ * sent to an absolute URL resolved against the API root, which better-fetch
545
+ * uses as-is instead of prefixing the client's base URL, so it still goes
546
+ * through {@link APIClient.$fetch} and picks up every fetch option the
547
+ * client was created with (hooks, default headers, custom fetch, cookies).
548
+ *
549
+ * @param path - Path relative to the API root, without a leading slash; `:name` segments are filled from `request.params`
550
+ * @param request - Method, body, query, and path parameters
556
551
  * @returns The parsed JSON response
557
552
  */
558
553
  async requestApplicationRoute(path, request = {}) {
559
554
  const base = this.apiUrl.endsWith("/") ? this.apiUrl : `${this.apiUrl}/`;
560
- const url = new URL(path, base);
561
- for (const [key, value] of Object.entries(request.query ?? {})) {
562
- if (value !== void 0)
563
- url.searchParams.set(key, String(value));
564
- }
565
- const headers = new Headers({ Accept: "application/json" });
566
- if (request.body !== void 0)
567
- headers.set("Content-Type", "application/json");
568
- const response = await fetch(url, {
555
+ const hasBody = request.body !== void 0;
556
+ const { data, error } = await this.client.$fetch(`${base}${path}`, {
569
557
  method: request.method ?? "GET",
570
- credentials: "include",
571
- headers,
572
- ...request.body !== void 0 ? { body: JSON.stringify(request.body) } : {}
558
+ params: request.params,
559
+ query: request.query,
560
+ headers: {
561
+ Accept: "application/json",
562
+ ...hasBody ? { "Content-Type": "application/json" } : {}
563
+ },
564
+ ...hasBody ? { body: JSON.stringify(request.body) } : {},
565
+ // The client's parser revives ISO strings into Dates; these routes are typed with plain strings
566
+ jsonParser: (text) => JSON.parse(text),
567
+ throw: false
573
568
  });
574
- if (!response.ok)
575
- throw new ApplicationRouteError(response, await readErrorBody(response));
576
- return await response.json();
569
+ if (error)
570
+ throw new ApplicationRouteError(error);
571
+ return data;
577
572
  }
578
573
  /**
579
574
  * Lists applications, optionally filtered by organization.
@@ -614,7 +609,8 @@ class AdminService {
614
609
  * @returns The updated application
615
610
  */
616
611
  async updateApplication(applicationId, options) {
617
- return await this.requestApplicationRoute(`applications/${encodeURIComponent(applicationId)}`, {
612
+ return await this.requestApplicationRoute("applications/:applicationId", {
613
+ params: { applicationId },
618
614
  method: "PUT",
619
615
  body: options
620
616
  });
@@ -622,28 +618,29 @@ class AdminService {
622
618
  /** Lists the role catalog for an application. */
623
619
  async listApplicationRoles(applicationId) {
624
620
  return await this.requestApplicationRoute(
625
- `applications/${encodeURIComponent(applicationId)}/roles`
621
+ "applications/:applicationId/roles",
622
+ { params: { applicationId } }
626
623
  );
627
624
  }
628
625
  /** Creates an application-scoped role definition. */
629
626
  async createApplicationRole(applicationId, options) {
630
627
  return await this.requestApplicationRoute(
631
- `applications/${encodeURIComponent(applicationId)}/roles`,
632
- { method: "POST", body: options }
628
+ "applications/:applicationId/roles",
629
+ { params: { applicationId }, method: "POST", body: options }
633
630
  );
634
631
  }
635
632
  /** Updates an application-scoped role definition. */
636
633
  async updateApplicationRole(applicationId, currentName, options) {
637
634
  return await this.requestApplicationRoute(
638
- `applications/${encodeURIComponent(applicationId)}/roles/${encodeURIComponent(currentName)}`,
639
- { method: "PUT", body: options }
635
+ "applications/:applicationId/roles/:currentName",
636
+ { params: { applicationId, currentName }, method: "PUT", body: options }
640
637
  );
641
638
  }
642
639
  /** Deletes an application-scoped role definition. */
643
640
  async deleteApplicationRole(applicationId, name) {
644
641
  return await this.requestApplicationRoute(
645
- `applications/${encodeURIComponent(applicationId)}/roles/${encodeURIComponent(name)}`,
646
- { method: "DELETE" }
642
+ "applications/:applicationId/roles/:name",
643
+ { params: { applicationId, name }, method: "DELETE" }
647
644
  );
648
645
  }
649
646
  /**
@@ -654,7 +651,8 @@ class AdminService {
654
651
  * @returns The created entitlement
655
652
  */
656
653
  async createApplicationEntitlement(applicationId, options) {
657
- return await this.requestApplicationRoute(`applications/${encodeURIComponent(applicationId)}/entitlements`, {
654
+ return await this.requestApplicationRoute("applications/:applicationId/entitlements", {
655
+ params: { applicationId },
658
656
  method: "POST",
659
657
  body: options
660
658
  });
@@ -666,7 +664,7 @@ class AdminService {
666
664
  * @returns Secret metadata without plaintext values
667
665
  */
668
666
  async listApplicationSecrets(applicationId) {
669
- return await this.requestApplicationRoute(`applications/${encodeURIComponent(applicationId)}/secrets`);
667
+ return await this.requestApplicationRoute("applications/:applicationId/secrets", { params: { applicationId } });
670
668
  }
671
669
  /**
672
670
  * Creates a client secret for an application.
@@ -676,7 +674,8 @@ class AdminService {
676
674
  * @returns The created secret, including the plaintext value shown only once
677
675
  */
678
676
  async createApplicationSecret(applicationId, options = {}) {
679
- return await this.requestApplicationRoute(`applications/${encodeURIComponent(applicationId)}/secrets`, {
677
+ return await this.requestApplicationRoute("applications/:applicationId/secrets", {
678
+ params: { applicationId },
680
679
  method: "POST",
681
680
  body: options
682
681
  });
@@ -690,8 +689,8 @@ class AdminService {
690
689
  */
691
690
  async deleteApplicationSecret(applicationId, secretId) {
692
691
  return await this.requestApplicationRoute(
693
- `applications/${encodeURIComponent(applicationId)}/secrets/${encodeURIComponent(secretId)}`,
694
- { method: "DELETE" }
692
+ "applications/:applicationId/secrets/:secretId",
693
+ { params: { applicationId, secretId }, method: "DELETE" }
695
694
  );
696
695
  }
697
696
  /**
@@ -702,8 +701,8 @@ class AdminService {
702
701
  */
703
702
  async retireApplicationServiceAccount(applicationId) {
704
703
  return await this.requestApplicationRoute(
705
- `applications/${encodeURIComponent(applicationId)}/service-account`,
706
- { method: "DELETE" }
704
+ "applications/:applicationId/service-account",
705
+ { params: { applicationId }, method: "DELETE" }
707
706
  );
708
707
  }
709
708
  /**
@@ -958,7 +957,8 @@ class AdminService {
958
957
  */
959
958
  async getEntitlement(entitlementId) {
960
959
  return await this.requestApplicationRoute(
961
- `applications/entitlements/${encodeURIComponent(entitlementId)}`
960
+ "applications/entitlements/:entitlementId",
961
+ { params: { entitlementId } }
962
962
  );
963
963
  }
964
964
  /**
@@ -970,8 +970,8 @@ class AdminService {
970
970
  */
971
971
  async setEntitlementRules(entitlementId, options) {
972
972
  return await this.requestApplicationRoute(
973
- `applications/entitlements/${encodeURIComponent(entitlementId)}/rules`,
974
- { method: "PUT", body: options }
973
+ "applications/entitlements/:entitlementId/rules",
974
+ { params: { entitlementId }, method: "PUT", body: options }
975
975
  );
976
976
  }
977
977
  /**
@@ -983,8 +983,8 @@ class AdminService {
983
983
  */
984
984
  async updateEntitlement(entitlementId, options) {
985
985
  return await this.requestApplicationRoute(
986
- `applications/entitlements/${encodeURIComponent(entitlementId)}`,
987
- { method: "PUT", body: options }
986
+ "applications/entitlements/:entitlementId",
987
+ { params: { entitlementId }, method: "PUT", body: options }
988
988
  );
989
989
  }
990
990
  /**
@@ -995,8 +995,8 @@ class AdminService {
995
995
  */
996
996
  async deleteEntitlement(entitlementId) {
997
997
  return await this.requestApplicationRoute(
998
- `applications/entitlements/${encodeURIComponent(entitlementId)}`,
999
- { method: "DELETE" }
998
+ "applications/entitlements/:entitlementId",
999
+ { params: { entitlementId }, method: "DELETE" }
1000
1000
  );
1001
1001
  }
1002
1002
  /**
@@ -1491,11 +1491,15 @@ class ApplicationService {
1491
1491
  * entitlement is selected first; organization entitlements are considered only
1492
1492
  * when no global entitlement is enabled.
1493
1493
  *
1494
+ * Pass `options.include` with `lastUsed` to flag the organization the user
1495
+ * last signed in to the application with.
1496
+ *
1494
1497
  * @param applicationId - The application ID to get candidate organizations for
1498
+ * @param options - Optional include list controlling which fields are returned
1495
1499
  * @returns The list of candidate organizations
1496
1500
  */
1497
- async listCandidateOrganizations(applicationId) {
1498
- const response = await this.client.applications.listCandidateOrganizations(applicationId);
1501
+ async listCandidateOrganizations(applicationId, options = {}) {
1502
+ const response = await this.client.applications.listCandidateOrganizations(applicationId, options);
1499
1503
  if (!response.data) {
1500
1504
  throw new Error("No data returned from the API", { cause: response.error });
1501
1505
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@meistrari/auth-core",
3
- "version": "2.8.0",
3
+ "version": "2.10.0",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {