@hexclave/react 1.0.25 → 1.0.26

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.
Files changed (65) hide show
  1. package/dist/components-page/hexclave-handler-client.js +6 -5
  2. package/dist/components-page/hexclave-handler-client.js.map +1 -1
  3. package/dist/dev-tool/dev-tool-core.js +1 -1
  4. package/dist/dev-tool/dev-tool-core.js.map +1 -1
  5. package/dist/esm/components-page/hexclave-handler-client.js +6 -5
  6. package/dist/esm/components-page/hexclave-handler-client.js.map +1 -1
  7. package/dist/esm/dev-tool/dev-tool-core.js +1 -1
  8. package/dist/esm/dev-tool/dev-tool-core.js.map +1 -1
  9. package/dist/esm/generated/quetzal-translations.d.ts +2 -2
  10. package/dist/esm/lib/hexclave-app/apps/implementations/admin-app-impl.d.ts +7 -0
  11. package/dist/esm/lib/hexclave-app/apps/implementations/admin-app-impl.d.ts.map +1 -1
  12. package/dist/esm/lib/hexclave-app/apps/implementations/admin-app-impl.js +33 -1
  13. package/dist/esm/lib/hexclave-app/apps/implementations/admin-app-impl.js.map +1 -1
  14. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.d.ts +1 -0
  15. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.d.ts.map +1 -1
  16. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.js +9 -8
  17. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.js.map +1 -1
  18. package/dist/esm/lib/hexclave-app/apps/implementations/common.js +1 -1
  19. package/dist/esm/lib/hexclave-app/apps/interfaces/admin-app.d.ts +2 -1
  20. package/dist/esm/lib/hexclave-app/apps/interfaces/admin-app.d.ts.map +1 -1
  21. package/dist/esm/lib/hexclave-app/apps/interfaces/admin-app.js.map +1 -1
  22. package/dist/esm/lib/hexclave-app/apps/interfaces/client-app.d.ts +1 -0
  23. package/dist/esm/lib/hexclave-app/apps/interfaces/client-app.d.ts.map +1 -1
  24. package/dist/esm/lib/hexclave-app/apps/interfaces/client-app.js.map +1 -1
  25. package/dist/esm/lib/hexclave-app/index.d.ts +2 -1
  26. package/dist/esm/lib/hexclave-app/plan-usage/index.d.ts +27 -0
  27. package/dist/esm/lib/hexclave-app/plan-usage/index.d.ts.map +1 -0
  28. package/dist/esm/lib/hexclave-app/plan-usage/index.js +1 -0
  29. package/dist/esm/lib/hexclave-app/projects/index.d.ts +1 -0
  30. package/dist/esm/lib/hexclave-app/projects/index.d.ts.map +1 -1
  31. package/dist/esm/lib/hexclave-app/projects/index.js.map +1 -1
  32. package/dist/generated/quetzal-translations.d.ts +2 -2
  33. package/dist/index.d.ts +2 -1
  34. package/dist/lib/hexclave-app/apps/implementations/admin-app-impl.d.ts +7 -0
  35. package/dist/lib/hexclave-app/apps/implementations/admin-app-impl.d.ts.map +1 -1
  36. package/dist/lib/hexclave-app/apps/implementations/admin-app-impl.js +33 -1
  37. package/dist/lib/hexclave-app/apps/implementations/admin-app-impl.js.map +1 -1
  38. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.d.ts +1 -0
  39. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.d.ts.map +1 -1
  40. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.js +9 -8
  41. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.js.map +1 -1
  42. package/dist/lib/hexclave-app/apps/implementations/common.js +1 -1
  43. package/dist/lib/hexclave-app/apps/interfaces/admin-app.d.ts +2 -1
  44. package/dist/lib/hexclave-app/apps/interfaces/admin-app.d.ts.map +1 -1
  45. package/dist/lib/hexclave-app/apps/interfaces/admin-app.js.map +1 -1
  46. package/dist/lib/hexclave-app/apps/interfaces/client-app.d.ts +1 -0
  47. package/dist/lib/hexclave-app/apps/interfaces/client-app.d.ts.map +1 -1
  48. package/dist/lib/hexclave-app/apps/interfaces/client-app.js.map +1 -1
  49. package/dist/lib/hexclave-app/index.d.ts +2 -1
  50. package/dist/lib/hexclave-app/plan-usage/index.d.ts +27 -0
  51. package/dist/lib/hexclave-app/plan-usage/index.d.ts.map +1 -0
  52. package/dist/lib/hexclave-app/plan-usage/index.js +0 -0
  53. package/dist/lib/hexclave-app/projects/index.d.ts +1 -0
  54. package/dist/lib/hexclave-app/projects/index.d.ts.map +1 -1
  55. package/dist/lib/hexclave-app/projects/index.js.map +1 -1
  56. package/package.json +3 -3
  57. package/src/components-page/hexclave-handler-client.tsx +6 -5
  58. package/src/dev-tool/dev-tool-core.ts +1 -1
  59. package/src/lib/hexclave-app/apps/implementations/admin-app-impl.ts +38 -1
  60. package/src/lib/hexclave-app/apps/implementations/client-app-impl.ts +9 -8
  61. package/src/lib/hexclave-app/apps/interfaces/admin-app.ts +2 -0
  62. package/src/lib/hexclave-app/apps/interfaces/client-app.ts +1 -0
  63. package/src/lib/hexclave-app/index.ts +8 -0
  64. package/src/lib/hexclave-app/plan-usage/index.ts +29 -0
  65. package/src/lib/hexclave-app/projects/index.ts +1 -0
@@ -348,7 +348,7 @@ export class _HexclaveClientAppImplIncomplete<HasTokenStore extends boolean, Pro
348
348
  {
349
349
  provider,
350
350
  redirectUrl: this._getOAuthCallbackRedirectUri(),
351
- errorRedirectUrl: this.urls.error,
351
+ errorRedirectUrl: this._getUrls().error,
352
352
  providerScope: mergeScopeStrings(scopeString, (this._oauthScopesOnSignIn[provider as ProviderType] ?? []).join(" ")),
353
353
  },
354
354
  session,
@@ -551,7 +551,7 @@ export class _HexclaveClientAppImplIncomplete<HasTokenStore extends boolean, Pro
551
551
  {
552
552
  provider: options.providerId,
553
553
  redirectUrl: this._getOAuthCallbackRedirectUri(),
554
- errorRedirectUrl: this.urls.error,
554
+ errorRedirectUrl: this._getUrls().error,
555
555
  providerScope: mergeScopeStrings(options.scope || "", (this._oauthScopesOnSignIn[options.providerId] ?? []).join(" ")),
556
556
  },
557
557
  options.session,
@@ -855,7 +855,7 @@ export class _HexclaveClientAppImplIncomplete<HasTokenStore extends boolean, Pro
855
855
 
856
856
  protected _getOAuthCallbackRedirectUri(): string {
857
857
  if (!this._isOAuthCallbackUrlHosted()) {
858
- return this.urls.oauthCallback;
858
+ return this._getUrls().oauthCallback;
859
859
  }
860
860
  if (typeof window === "undefined") {
861
861
  throw new HexclaveAssertionError("Hosted OAuth callback URLs require a browser environment to use the current URL as the redirect URI");
@@ -3010,13 +3010,13 @@ export class _HexclaveClientAppImplIncomplete<HasTokenStore extends boolean, Pro
3010
3010
  async redirectToMfa(options?: RedirectToOptions) { return await this._redirectToHandler("mfa", options); }
3011
3011
 
3012
3012
  async sendForgotPasswordEmail(email: string, options?: { callbackUrl?: string }): Promise<Result<undefined, KnownErrors["UserNotFound"]>> {
3013
- return await this._interface.sendForgotPasswordEmail(email, options?.callbackUrl ?? constructRedirectUrl(this.urls.passwordReset, "callbackUrl"));
3013
+ return await this._interface.sendForgotPasswordEmail(email, options?.callbackUrl ?? constructRedirectUrl(this._getUrls().passwordReset, "callbackUrl"));
3014
3014
  }
3015
3015
 
3016
3016
  async sendMagicLinkEmail(email: string, options?: {
3017
3017
  callbackUrl?: string,
3018
3018
  }): Promise<Result<{ nonce: string }, KnownErrors["RedirectUrlNotWhitelisted"] | KnownErrors["BotChallengeFailed"]>> {
3019
- const callbackUrl = options?.callbackUrl ?? constructRedirectUrl(this.urls.magicLinkCallback, "callbackUrl");
3019
+ const callbackUrl = options?.callbackUrl ?? constructRedirectUrl(this._getUrls().magicLinkCallback, "callbackUrl");
3020
3020
  return await this._executeResultWithBotChallengeFlow({
3021
3021
  action: "send_magic_link_email",
3022
3022
  execute: async (challenge) => {
@@ -3305,7 +3305,7 @@ export class _HexclaveClientAppImplIncomplete<HasTokenStore extends boolean, Pro
3305
3305
  return await this._interface.authorizeOAuth({
3306
3306
  provider,
3307
3307
  redirectUrl: constructRedirectUrl(this._getOAuthCallbackRedirectUri(), "redirectUrl"),
3308
- errorRedirectUrl: constructRedirectUrl(this.urls.error, "errorRedirectUrl"),
3308
+ errorRedirectUrl: constructRedirectUrl(this._getUrls().error, "errorRedirectUrl"),
3309
3309
  afterCallbackRedirectUrl,
3310
3310
  type: "authenticate",
3311
3311
  providerScope: this._oauthScopesOnSignIn[provider]?.join(" "),
@@ -3425,7 +3425,7 @@ export class _HexclaveClientAppImplIncomplete<HasTokenStore extends boolean, Pro
3425
3425
  }
3426
3426
  this._ensurePersistentTokenStore();
3427
3427
  const session = await this._getSession();
3428
- const emailVerificationRedirectUrl = options.noVerificationCallback ? undefined : options.verificationCallbackUrl ?? constructRedirectUrl(this.urls.emailVerification, "verificationCallbackUrl");
3428
+ const emailVerificationRedirectUrl = options.noVerificationCallback ? undefined : options.verificationCallbackUrl ?? constructRedirectUrl(this._getUrls().emailVerification, "verificationCallbackUrl");
3429
3429
 
3430
3430
  const executeSignUp = async (challenge: { token?: string, phase?: "invisible" | "visible", unavailable?: true }) => {
3431
3431
  let result = await this._interface.signUpWithCredential(
@@ -3588,7 +3588,7 @@ export class _HexclaveClientAppImplIncomplete<HasTokenStore extends boolean, Pro
3588
3588
 
3589
3589
  // Step 2: Open the browser for the user to authenticate and display the verification code
3590
3590
  const url = buildCliAuthConfirmUrl({
3591
- cliAuthConfirmUrl: this.urls.cliAuthConfirm,
3591
+ cliAuthConfirmUrl: this._getUrls().cliAuthConfirm,
3592
3592
  appUrl: options.appUrl,
3593
3593
  loginCode,
3594
3594
  });
@@ -4026,6 +4026,7 @@ export class _HexclaveClientAppImplIncomplete<HasTokenStore extends boolean, Pro
4026
4026
  ) => {
4027
4027
  return await this._interface.sendClientRequest(path, requestOptions, await this._getSession(), requestType);
4028
4028
  },
4029
+ getUrls: () => this._getUrls(),
4029
4030
  getRedirectMethod: () => this._redirectMethod ?? throwErr("Redirect method should have been initialized in the Stack client app constructor"),
4030
4031
  redirectToUrl: async (url: string | URL, options?: { replace?: boolean }) => {
4031
4032
  await this._redirectTo({ url, ...options });
@@ -13,6 +13,7 @@ import { AsyncStoreProperty, EmailConfig } from "../../common";
13
13
  import { AdminEmailOutbox, AdminSentEmail } from "../../email";
14
14
  import { InternalApiKey, InternalApiKeyCreateOptions, InternalApiKeyFirstView } from "../../internal-api-keys";
15
15
  import { AdminProjectPermission, AdminProjectPermissionDefinition, AdminProjectPermissionDefinitionCreateOptions, AdminProjectPermissionDefinitionUpdateOptions, AdminTeamPermission, AdminTeamPermissionDefinition, AdminTeamPermissionDefinitionCreateOptions, AdminTeamPermissionDefinitionUpdateOptions } from "../../permissions";
16
+ import type { PlanUsage } from "../../plan-usage";
16
17
  import { AdminProject } from "../../projects";
17
18
  import { _HexclaveAdminAppImpl } from "../implementations";
18
19
  import { StackServerApp, StackServerAppConstructorOptions } from "./server-app";
@@ -75,6 +76,7 @@ export type StackAdminAppConstructorOptions<HasTokenStore extends boolean, Proje
75
76
  /** @deprecated Use `HexclaveAdminApp` from the `@hexclave/*` package instead — same symbol, new brand name. See https://docs.hexclave.com/migration. */
76
77
  export type StackAdminApp<HasTokenStore extends boolean = boolean, ProjectId extends string = string> = (
77
78
  & AsyncStoreProperty<"project", [], AdminProject, false>
79
+ & AsyncStoreProperty<"planUsage", [], PlanUsage, false>
78
80
  & AsyncStoreProperty<"internalApiKeys", [], InternalApiKey[], true>
79
81
  & AsyncStoreProperty<"teamPermissionDefinitions", [], AdminTeamPermissionDefinition[], true>
80
82
  & AsyncStoreProperty<"projectPermissionDefinitions", [], AdminProjectPermissionDefinition[], true>
@@ -131,6 +131,7 @@ export type StackClientApp<HasTokenStore extends boolean = boolean, ProjectId ex
131
131
  sendAnalyticsEventBatch(body: string, options: { keepalive: boolean }): Promise<Result<Response, Error>>,
132
132
  addRequestListener(listener: RequestListener): () => void,
133
133
  sendRequest(path: string, requestOptions: RequestInit, requestType?: "client" | "server" | "admin"): Promise<Response>,
134
+ getUrls(): Readonly<ResolvedHandlerUrls>,
134
135
  getRedirectMethod(): RedirectMethod,
135
136
  redirectToUrl(url: string | URL, options?: { replace?: boolean }): Promise<void>,
136
137
  redirectToHandler(handlerName: keyof HandlerUrls, options?: RedirectToOptions): Promise<void>,
@@ -118,6 +118,14 @@ export type {
118
118
  PushedConfigSource
119
119
  } from "./projects";
120
120
 
121
+ export type {
122
+ PlanUsage,
123
+ PlanUsageKind,
124
+ PlanUsageNextPlanId,
125
+ PlanUsagePlanId,
126
+ PlanUsageRow,
127
+ } from "./plan-usage";
128
+
121
129
  export type {
122
130
  EditableTeamMemberProfile, ReceivedTeamInvitation,
123
131
  SentTeamInvitation, ServerListUsersOptions,
@@ -0,0 +1,29 @@
1
+
2
+ //===========================================
3
+ // THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template
4
+ //===========================================
5
+ export type PlanUsageKind = "current" | "metered" | "capability";
6
+ export type PlanUsagePlanId = "free" | "team" | "growth";
7
+ export type PlanUsageNextPlanId = "team" | "growth";
8
+
9
+ export type PlanUsageRow = {
10
+ itemId: string,
11
+ displayName: string,
12
+ kind: PlanUsageKind,
13
+ used: number | null,
14
+ limit: number | null,
15
+ remaining: number | null,
16
+ overage: number | null,
17
+ isUnlimited: boolean,
18
+ };
19
+
20
+ export type PlanUsage = {
21
+ ownerTeamId: string,
22
+ ownerTeamDisplayName: string,
23
+ planId: PlanUsagePlanId,
24
+ planDisplayName: string,
25
+ periodStart: Date,
26
+ periodEnd: Date,
27
+ nextPlanId: PlanUsageNextPlanId | null,
28
+ rows: PlanUsageRow[],
29
+ };
@@ -44,6 +44,7 @@ export type AdminProject = {
44
44
  readonly isDevelopmentEnvironment: boolean,
45
45
  readonly ownerTeamId: string | null,
46
46
  readonly onboardingStatus: ProjectOnboardingStatus,
47
+ readonly onboardingState: NonNullable<ProjectsCrud["Admin"]["Read"]["onboarding_state"]> | null,
47
48
  readonly logoUrl: string | null | undefined,
48
49
  readonly logoFullUrl: string | null | undefined,
49
50
  readonly logoDarkModeUrl: string | null | undefined,