@stackframe/stack 2.8.54 → 2.8.58

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 (74) hide show
  1. package/dist/components/credential-sign-up.js.map +1 -1
  2. package/dist/components/user-button.js +4 -4
  3. package/dist/components/user-button.js.map +1 -1
  4. package/dist/components-page/account-settings/email-and-auth/emails-section.js +4 -3
  5. package/dist/components-page/account-settings/email-and-auth/emails-section.js.map +1 -1
  6. package/dist/components-page/onboarding.js +170 -0
  7. package/dist/components-page/onboarding.js.map +1 -0
  8. package/dist/components-page/stack-handler-client.js +13 -1
  9. package/dist/components-page/stack-handler-client.js.map +1 -1
  10. package/dist/components-page/stack-handler.js.map +1 -1
  11. package/dist/components-page/team-invitation.js +15 -1
  12. package/dist/components-page/team-invitation.js.map +1 -1
  13. package/dist/esm/components/credential-sign-up.js.map +1 -1
  14. package/dist/esm/components/user-button.js +4 -4
  15. package/dist/esm/components/user-button.js.map +1 -1
  16. package/dist/esm/components-page/account-settings/email-and-auth/emails-section.js +4 -3
  17. package/dist/esm/components-page/account-settings/email-and-auth/emails-section.js.map +1 -1
  18. package/dist/esm/components-page/onboarding.js +146 -0
  19. package/dist/esm/components-page/onboarding.js.map +1 -0
  20. package/dist/esm/components-page/stack-handler-client.js +13 -1
  21. package/dist/esm/components-page/stack-handler-client.js.map +1 -1
  22. package/dist/esm/components-page/stack-handler.js.map +1 -1
  23. package/dist/esm/components-page/team-invitation.js +15 -1
  24. package/dist/esm/components-page/team-invitation.js.map +1 -1
  25. package/dist/esm/generated/global-css.js +1 -1
  26. package/dist/esm/generated/global-css.js.map +1 -1
  27. package/dist/esm/lib/cookie.js +56 -20
  28. package/dist/esm/lib/cookie.js.map +1 -1
  29. package/dist/esm/lib/stack-app/apps/implementations/admin-app-impl.js +235 -0
  30. package/dist/esm/lib/stack-app/apps/implementations/admin-app-impl.js.map +1 -1
  31. package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.js +154 -31
  32. package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.js.map +1 -1
  33. package/dist/esm/lib/stack-app/apps/implementations/common.js +2 -1
  34. package/dist/esm/lib/stack-app/apps/implementations/common.js.map +1 -1
  35. package/dist/esm/lib/stack-app/apps/implementations/server-app-impl.js +40 -27
  36. package/dist/esm/lib/stack-app/apps/implementations/server-app-impl.js.map +1 -1
  37. package/dist/esm/lib/stack-app/apps/interfaces/admin-app.js.map +1 -1
  38. package/dist/esm/lib/stack-app/apps/interfaces/client-app.js.map +1 -1
  39. package/dist/esm/lib/stack-app/apps/interfaces/server-app.js.map +1 -1
  40. package/dist/esm/lib/stack-app/common.js.map +1 -1
  41. package/dist/esm/lib/stack-app/index.js.map +1 -1
  42. package/dist/esm/lib/stack-app/projects/index.js +4 -0
  43. package/dist/esm/lib/stack-app/projects/index.js.map +1 -1
  44. package/dist/esm/lib/stack-app/teams/index.js.map +1 -1
  45. package/dist/esm/lib/stack-app/users/index.js +13 -12
  46. package/dist/esm/lib/stack-app/users/index.js.map +1 -1
  47. package/dist/generated/global-css.js +1 -1
  48. package/dist/generated/global-css.js.map +1 -1
  49. package/dist/index.d.mts +269 -16
  50. package/dist/index.d.ts +269 -16
  51. package/dist/lib/cookie.js +56 -20
  52. package/dist/lib/cookie.js.map +1 -1
  53. package/dist/lib/stack-app/apps/implementations/admin-app-impl.js +235 -0
  54. package/dist/lib/stack-app/apps/implementations/admin-app-impl.js.map +1 -1
  55. package/dist/lib/stack-app/apps/implementations/client-app-impl.js +151 -28
  56. package/dist/lib/stack-app/apps/implementations/client-app-impl.js.map +1 -1
  57. package/dist/lib/stack-app/apps/implementations/common.js +2 -1
  58. package/dist/lib/stack-app/apps/implementations/common.js.map +1 -1
  59. package/dist/lib/stack-app/apps/implementations/server-app-impl.js +38 -25
  60. package/dist/lib/stack-app/apps/implementations/server-app-impl.js.map +1 -1
  61. package/dist/lib/stack-app/apps/interfaces/admin-app.js.map +1 -1
  62. package/dist/lib/stack-app/apps/interfaces/client-app.js.map +1 -1
  63. package/dist/lib/stack-app/apps/interfaces/server-app.js.map +1 -1
  64. package/dist/lib/stack-app/common.js.map +1 -1
  65. package/dist/lib/stack-app/email/index.js.map +1 -1
  66. package/dist/lib/stack-app/index.js.map +1 -1
  67. package/dist/lib/stack-app/project-configs/index.js.map +1 -1
  68. package/dist/lib/stack-app/projects/index.js +4 -0
  69. package/dist/lib/stack-app/projects/index.js.map +1 -1
  70. package/dist/lib/stack-app/teams/index.js.map +1 -1
  71. package/dist/lib/stack-app/users/index.js +15 -14
  72. package/dist/lib/stack-app/users/index.js.map +1 -1
  73. package/package.json +6 -5
  74. package/CHANGELOG.md +0 -2052
package/dist/index.d.ts CHANGED
@@ -42,6 +42,15 @@ type RedirectMethod = "window" | "nextjs" | "none" | {
42
42
  };
43
43
  type GetCurrentUserOptions<HasTokenStore> = {
44
44
  or?: 'redirect' | 'throw' | 'return-null' | 'anonymous' | /** @deprecated */ 'anonymous-if-exists[deprecated]';
45
+ /**
46
+ * Whether to include restricted users (users who haven't completed onboarding requirements like email verification).
47
+ * By default, restricted users are filtered out (treated similar to anonymous users).
48
+ *
49
+ * Note: This option cannot be set to false when `or: 'anonymous'` is used, as all anonymous users are also restricted.
50
+ *
51
+ * @default false
52
+ */
53
+ includeRestricted?: boolean;
45
54
  tokenStore?: TokenStoreInit;
46
55
  } & (HasTokenStore extends false ? {
47
56
  tokenStore: TokenStoreInit;
@@ -89,6 +98,7 @@ type HandlerUrls = {
89
98
  teamInvitation: string;
90
99
  mfa: string;
91
100
  error: string;
101
+ onboarding: string;
92
102
  };
93
103
  type OAuthScopesOnSignIn = {
94
104
  [key in ProviderType]: string[];
@@ -104,6 +114,22 @@ type AuthLike<ExtraOptions = {}> = {
104
114
  signOut(options?: {
105
115
  redirectUrl?: URL | string;
106
116
  }): Promise<void>;
117
+ /**
118
+ * Returns the current access token, or null if the user is not signed in.
119
+ *
120
+ * The access token is a short-lived JWT that can be used to authenticate requests to external servers.
121
+ * It will be automatically refreshed when it expires.
122
+ */
123
+ getAccessToken(options?: {} & ExtraOptions): Promise<string | null>;
124
+ useAccessToken(options?: {} & ExtraOptions): string | null;
125
+ /**
126
+ * Returns the current refresh token, or null if the user is not signed in.
127
+ *
128
+ * The refresh token is a long-lived token that can be used to obtain new access tokens.
129
+ * It should be kept secret and never exposed to the client.
130
+ */
131
+ getRefreshToken(options?: {} & ExtraOptions): Promise<string | null>;
132
+ useRefreshToken(options?: {} & ExtraOptions): string | null;
107
133
  /**
108
134
  * Returns headers for sending authenticated HTTP requests to external servers. Most commonly used in cross-origin
109
135
  * requests. Similar to `getAuthJson`, but specifically for HTTP requests.
@@ -120,8 +146,8 @@ type AuthLike<ExtraOptions = {}> = {
120
146
  * must include `x-stack-auth` in the [`Access-Control-Allow-Headers` header](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Headers)
121
147
  * of the CORS preflight response.
122
148
  *
123
- * If you are not using HTTP (and hence cannot set headers), you will need to use the `getAuthJson()` function
124
- * instead.
149
+ * If you are not using HTTP (and hence cannot set headers), you will need to use the `getAccessToken()` and
150
+ * `getRefreshToken()` functions instead.
125
151
  *
126
152
  * Example:
127
153
  *
@@ -144,7 +170,12 @@ type AuthLike<ExtraOptions = {}> = {
144
170
  getAuthHeaders(options?: {} & ExtraOptions): Promise<{
145
171
  "x-stack-auth": string;
146
172
  }>;
173
+ useAuthHeaders(options?: {} & ExtraOptions): {
174
+ "x-stack-auth": string;
175
+ };
147
176
  /**
177
+ * @deprecated Use `getAccessToken()` and `getRefreshToken()` instead.
178
+ *
148
179
  * Creates a JSON-serializable object containing the information to authenticate a user on an external server.
149
180
  * Similar to `getAuthHeaders`, but returns an object that can be sent over any protocol instead of just
150
181
  * HTTP headers.
@@ -175,6 +206,11 @@ type AuthLike<ExtraOptions = {}> = {
175
206
  accessToken: string | null;
176
207
  refreshToken: string | null;
177
208
  }>;
209
+ /** @deprecated Use `useAccessToken()` and `useRefreshToken()` instead. */
210
+ useAuthJson(options?: {} & ExtraOptions): {
211
+ accessToken: string | null;
212
+ refreshToken: string | null;
213
+ };
178
214
  };
179
215
  /** @internal */
180
216
  declare const stackAppInternalsSymbol: unique symbol;
@@ -259,6 +295,137 @@ type AdminSentEmail = {
259
295
  sentAt: Date;
260
296
  error?: unknown;
261
297
  };
298
+ type AdminEmailOutboxRecipient = {
299
+ type: "user-primary-email";
300
+ userId: string;
301
+ } | {
302
+ type: "user-custom-emails";
303
+ userId: string;
304
+ emails: string[];
305
+ } | {
306
+ type: "custom-emails";
307
+ emails: string[];
308
+ };
309
+ type AdminEmailOutboxStatus = "paused" | "preparing" | "rendering" | "render-error" | "scheduled" | "queued" | "sending" | "server-error" | "skipped" | "bounced" | "delivery-delayed" | "sent" | "opened" | "clicked" | "marked-as-spam";
310
+ type AdminEmailOutboxSimpleStatus = "in-progress" | "ok" | "error";
311
+ type AdminEmailOutboxBase = {
312
+ id: string;
313
+ createdAt: Date;
314
+ updatedAt: Date;
315
+ to: AdminEmailOutboxRecipient;
316
+ scheduledAt: Date;
317
+ isPaused: false;
318
+ hasRendered: false;
319
+ hasDelivered: false;
320
+ };
321
+ type AdminEmailOutboxRenderedFields = Omit<AdminEmailOutboxBase, "hasRendered"> & {
322
+ hasRendered: true;
323
+ startedRenderingAt: Date;
324
+ renderedAt: Date;
325
+ subject: string;
326
+ html: string | null;
327
+ text: string | null;
328
+ isTransactional: boolean;
329
+ isHighPriority: boolean;
330
+ notificationCategoryId: string | null;
331
+ };
332
+ type AdminEmailOutboxStartedSendingFields = AdminEmailOutboxRenderedFields & {
333
+ startedSendingAt: Date;
334
+ };
335
+ type AdminEmailOutboxFinishedDeliveringFields = Omit<AdminEmailOutboxStartedSendingFields, "hasDelivered"> & {
336
+ hasDelivered: true;
337
+ deliveredAt: Date;
338
+ };
339
+ type AdminEmailOutboxPaused = Omit<AdminEmailOutboxBase, "isPaused"> & {
340
+ status: "paused";
341
+ simpleStatus: "in-progress";
342
+ isPaused: true;
343
+ };
344
+ type AdminEmailOutboxPreparing = AdminEmailOutboxBase & {
345
+ status: "preparing";
346
+ simpleStatus: "in-progress";
347
+ };
348
+ type AdminEmailOutboxRendering = AdminEmailOutboxBase & {
349
+ status: "rendering";
350
+ simpleStatus: "in-progress";
351
+ startedRenderingAt: Date;
352
+ };
353
+ type AdminEmailOutboxRenderError = AdminEmailOutboxBase & {
354
+ status: "render-error";
355
+ simpleStatus: "error";
356
+ startedRenderingAt: Date;
357
+ renderedAt: Date;
358
+ renderError: string;
359
+ };
360
+ type AdminEmailOutboxScheduled = AdminEmailOutboxRenderedFields & {
361
+ status: "scheduled";
362
+ simpleStatus: "in-progress";
363
+ };
364
+ type AdminEmailOutboxQueued = AdminEmailOutboxRenderedFields & {
365
+ status: "queued";
366
+ simpleStatus: "in-progress";
367
+ };
368
+ type AdminEmailOutboxSending = AdminEmailOutboxStartedSendingFields & {
369
+ status: "sending";
370
+ simpleStatus: "in-progress";
371
+ };
372
+ type AdminEmailOutboxServerError = AdminEmailOutboxStartedSendingFields & {
373
+ status: "server-error";
374
+ simpleStatus: "error";
375
+ errorAt: Date;
376
+ serverError: string;
377
+ };
378
+ type AdminEmailOutboxSkipped = Omit<AdminEmailOutboxBase, "hasRendered"> & {
379
+ status: "skipped";
380
+ simpleStatus: "ok";
381
+ hasRendered: boolean;
382
+ skippedAt: Date;
383
+ skippedReason: string;
384
+ skippedDetails: Record<string, unknown>;
385
+ startedRenderingAt?: Date;
386
+ renderedAt?: Date;
387
+ subject?: string;
388
+ html?: string | null;
389
+ text?: string | null;
390
+ isTransactional?: boolean;
391
+ isHighPriority?: boolean;
392
+ notificationCategoryId?: string | null;
393
+ startedSendingAt?: Date;
394
+ };
395
+ type AdminEmailOutboxBounced = AdminEmailOutboxStartedSendingFields & {
396
+ status: "bounced";
397
+ simpleStatus: "error";
398
+ bouncedAt: Date;
399
+ };
400
+ type AdminEmailOutboxDeliveryDelayed = AdminEmailOutboxStartedSendingFields & {
401
+ status: "delivery-delayed";
402
+ simpleStatus: "ok";
403
+ deliveryDelayedAt: Date;
404
+ };
405
+ type AdminEmailOutboxSent = AdminEmailOutboxFinishedDeliveringFields & {
406
+ status: "sent";
407
+ simpleStatus: "ok";
408
+ canHaveDeliveryInfo: boolean;
409
+ };
410
+ type AdminEmailOutboxOpened = AdminEmailOutboxFinishedDeliveringFields & {
411
+ status: "opened";
412
+ simpleStatus: "ok";
413
+ openedAt: Date;
414
+ canHaveDeliveryInfo: true;
415
+ };
416
+ type AdminEmailOutboxClicked = AdminEmailOutboxFinishedDeliveringFields & {
417
+ status: "clicked";
418
+ simpleStatus: "ok";
419
+ clickedAt: Date;
420
+ canHaveDeliveryInfo: true;
421
+ };
422
+ type AdminEmailOutboxMarkedAsSpam = AdminEmailOutboxFinishedDeliveringFields & {
423
+ status: "marked-as-spam";
424
+ simpleStatus: "ok";
425
+ markedAsSpamAt: Date;
426
+ canHaveDeliveryInfo: true;
427
+ };
428
+ type AdminEmailOutbox = AdminEmailOutboxPaused | AdminEmailOutboxPreparing | AdminEmailOutboxRendering | AdminEmailOutboxRenderError | AdminEmailOutboxScheduled | AdminEmailOutboxQueued | AdminEmailOutboxSending | AdminEmailOutboxServerError | AdminEmailOutboxSkipped | AdminEmailOutboxBounced | AdminEmailOutboxDeliveryDelayed | AdminEmailOutboxSent | AdminEmailOutboxOpened | AdminEmailOutboxClicked | AdminEmailOutboxMarkedAsSpam;
262
429
  type SendEmailOptionsBase = {
263
430
  themeId?: string | null | false;
264
431
  subject?: string;
@@ -283,6 +450,25 @@ type SendEmailOptions = SendEmailOptionsBase & XOR<[
283
450
  draftId: string;
284
451
  }
285
452
  ]>;
453
+ type EmailDeliveryWindowStats = {
454
+ sent: number;
455
+ bounced: number;
456
+ marked_as_spam: number;
457
+ };
458
+ type EmailDeliveryStats = {
459
+ hour: EmailDeliveryWindowStats;
460
+ day: EmailDeliveryWindowStats;
461
+ week: EmailDeliveryWindowStats;
462
+ month: EmailDeliveryWindowStats;
463
+ };
464
+ type EmailDeliveryCapacity = {
465
+ rate_per_second: number;
466
+ penalty_factor: number;
467
+ };
468
+ type EmailDeliveryInfo = {
469
+ stats: EmailDeliveryStats;
470
+ capacity: EmailDeliveryCapacity;
471
+ };
286
472
 
287
473
  type InternalApiKeyBase = {
288
474
  id: string;
@@ -485,18 +671,21 @@ type ServerOAuthProvider = {
485
671
  }): Promise<Result<void, InstanceType<typeof KnownErrors.OAuthProviderAccountIdAlreadyUsedForSignIn>>>;
486
672
  delete(): Promise<void>;
487
673
  };
488
- type Session = {
489
- getTokens(): Promise<{
490
- accessToken: string | null;
491
- refreshToken: string | null;
492
- }>;
493
- };
494
674
  /**
495
675
  * Contains everything related to the current user session.
496
676
  */
497
677
  type Auth = AuthLike<{}> & {
498
678
  readonly _internalSession: InternalSession;
499
- readonly currentSession: Session;
679
+ readonly currentSession: {
680
+ getTokens(): Promise<{
681
+ accessToken: string | null;
682
+ refreshToken: string | null;
683
+ }>;
684
+ useTokens(): {
685
+ accessToken: string | null;
686
+ refreshToken: string | null;
687
+ };
688
+ };
500
689
  };
501
690
  /**
502
691
  * ```
@@ -542,6 +731,18 @@ type BaseUser = {
542
731
  readonly passkeyAuthEnabled: boolean;
543
732
  readonly isMultiFactorRequired: boolean;
544
733
  readonly isAnonymous: boolean;
734
+ /**
735
+ * Whether the user is in restricted state (signed up but hasn't completed onboarding requirements).
736
+ * For example, if email verification is required but the user hasn't verified their email yet.
737
+ */
738
+ readonly isRestricted: boolean;
739
+ /**
740
+ * The reason why the user is restricted, e.g., { type: "email_not_verified" } or { type: "anonymous" }.
741
+ * Null if the user is not restricted.
742
+ */
743
+ readonly restrictedReason: {
744
+ type: "anonymous" | "email_not_verified";
745
+ } | null;
545
746
  toClientJson(): CurrentUserCrud["Client"]["Read"];
546
747
  /**
547
748
  * @deprecated, use contact channel's usedForAuth instead
@@ -555,7 +756,7 @@ type BaseUser = {
555
756
  }[];
556
757
  };
557
758
  type UserExtra = {
558
- setDisplayName(displayName: string): Promise<void>;
759
+ setDisplayName(displayName: string | null): Promise<void>;
559
760
  /** @deprecated Use contact channel's sendVerificationEmail instead */
560
761
  sendVerificationEmail(): Promise<KnownErrors["EmailAlreadyVerified"] | void>;
561
762
  setClientMetadata(metadata: any): Promise<void>;
@@ -611,7 +812,7 @@ type UserExtra = {
611
812
  usePermission(scope: Team, permissionId: string): TeamPermission | null;
612
813
  usePermission(permissionId: string): TeamPermission | null;
613
814
  readonly selectedTeam: Team | null;
614
- setSelectedTeam(team: Team | null): Promise<void>;
815
+ setSelectedTeam(teamOrId: string | Team | null): Promise<void>;
615
816
  createTeam(data: TeamCreateOptions): Promise<Team>;
616
817
  leaveTeam(team: Team): Promise<void>;
617
818
  getActiveSessions(): Promise<ActiveSession[]>;
@@ -639,8 +840,8 @@ type User = BaseUser;
639
840
  type CurrentUser = BaseUser & Auth & UserExtra & Customer;
640
841
  type CurrentInternalUser = CurrentUser & InternalUserExtra;
641
842
  type ProjectCurrentUser<ProjectId> = ProjectId extends "internal" ? CurrentInternalUser : CurrentUser;
642
- type TokenPartialUser = Pick<User, "id" | "displayName" | "primaryEmail" | "primaryEmailVerified" | "isAnonymous">;
643
- type SyncedPartialUser = TokenPartialUser & Pick<User, "id" | "displayName" | "primaryEmail" | "primaryEmailVerified" | "profileImageUrl" | "signedUpAt" | "clientMetadata" | "clientReadOnlyMetadata" | "isAnonymous" | "hasPassword">;
843
+ type TokenPartialUser = Pick<User, "id" | "displayName" | "primaryEmail" | "primaryEmailVerified" | "isAnonymous" | "isRestricted" | "restrictedReason">;
844
+ type SyncedPartialUser = TokenPartialUser & Pick<User, "id" | "displayName" | "primaryEmail" | "primaryEmailVerified" | "profileImageUrl" | "signedUpAt" | "clientMetadata" | "clientReadOnlyMetadata" | "isAnonymous" | "hasPassword" | "isRestricted" | "restrictedReason">;
644
845
  type ActiveSession = {
645
846
  id: string;
646
847
  userId: string;
@@ -651,13 +852,14 @@ type ActiveSession = {
651
852
  geoInfo?: GeoInfo;
652
853
  };
653
854
  type UserUpdateOptions = {
654
- displayName?: string;
855
+ displayName?: string | null;
655
856
  clientMetadata?: ReadonlyJson;
656
857
  selectedTeamId?: string | null;
657
858
  totpMultiFactorSecret?: Uint8Array | null;
658
859
  profileImageUrl?: string | null;
659
860
  otpAuthEnabled?: boolean;
660
861
  passkeyAuthEnabled?: boolean;
862
+ primaryEmail?: string | null;
661
863
  };
662
864
  type ServerBaseUser = {
663
865
  setPrimaryEmail(email: string | null, options?: {
@@ -704,7 +906,12 @@ type ServerBaseUser = {
704
906
  createSession(options?: {
705
907
  expiresInMillis?: number;
706
908
  isImpersonation?: boolean;
707
- }): Promise<Session>;
909
+ }): Promise<{
910
+ getTokens(): Promise<{
911
+ accessToken: string | null;
912
+ refreshToken: string | null;
913
+ }>;
914
+ }>;
708
915
  } & AsyncStoreProperty<"team", [id: string], ServerTeam | null, false> & AsyncStoreProperty<"teams", [], ServerTeam[], true> & AsyncStoreProperty<"permission", [scope: Team, permissionId: string, options?: {
709
916
  direct?: boolean;
710
917
  }], AdminTeamPermission | null, false> & AsyncStoreProperty<"permissions", [scope: Team, options?: {
@@ -811,6 +1018,15 @@ type ServerListUsersOptions = {
811
1018
  orderBy?: 'signedUpAt';
812
1019
  desc?: boolean;
813
1020
  query?: string;
1021
+ /**
1022
+ * Whether to include restricted users (users who haven't completed onboarding requirements).
1023
+ * Defaults to false.
1024
+ */
1025
+ includeRestricted?: boolean;
1026
+ /**
1027
+ * Whether to include anonymous users (and restricted users).
1028
+ * Defaults to false.
1029
+ */
814
1030
  includeAnonymous?: boolean;
815
1031
  };
816
1032
  type ServerTeamCreateOptions = TeamCreateOptions & {
@@ -925,6 +1141,8 @@ type StackServerApp<HasTokenStore extends boolean = boolean, ProjectId extends s
925
1141
  allowConnectedAccounts: boolean;
926
1142
  }): Promise<Result<ServerOAuthProvider, InstanceType<typeof KnownErrors.OAuthProviderAccountIdAlreadyUsedForSignIn>>>;
927
1143
  sendEmail(options: SendEmailOptions): Promise<void>;
1144
+ getEmailDeliveryStats(): Promise<EmailDeliveryInfo>;
1145
+ useEmailDeliveryStats(): EmailDeliveryInfo;
928
1146
  } & AsyncStoreProperty<"user", [id: string], ServerUser | null, false> & Omit<AsyncStoreProperty<"users", [], ServerUser[], true>, "listUsers" | "useUsers"> & AsyncStoreProperty<"teams", [], ServerTeam[], true> & AsyncStoreProperty<"dataVaultStore", [id: string], DataVaultStore, false> & AsyncStoreProperty<"item", [
929
1147
  {
930
1148
  itemId: string;
@@ -941,6 +1159,21 @@ type StackServerApp<HasTokenStore extends boolean = boolean, ProjectId extends s
941
1159
  ], CustomerProductsList, true> & StackClientApp<HasTokenStore, ProjectId>);
942
1160
  declare const StackServerApp: StackServerAppConstructor;
943
1161
 
1162
+ type EmailOutboxListOptions = {
1163
+ status?: string;
1164
+ simpleStatus?: string;
1165
+ limit?: number;
1166
+ cursor?: string;
1167
+ };
1168
+ type EmailOutboxListResult = {
1169
+ items: AdminEmailOutbox[];
1170
+ nextCursor: string | null;
1171
+ };
1172
+ type EmailOutboxUpdateOptions = {
1173
+ isPaused?: boolean;
1174
+ scheduledAtMillis?: number;
1175
+ cancel?: boolean;
1176
+ };
944
1177
  type StackAdminAppConstructorOptions<HasTokenStore extends boolean, ProjectId extends string> = (StackServerAppConstructorOptions<HasTokenStore, ProjectId> & {
945
1178
  superSecretAdminKey?: string;
946
1179
  projectOwnerSession?: InternalSession;
@@ -1073,6 +1306,12 @@ type StackAdminApp<HasTokenStore extends boolean = boolean, ProjectId extends st
1073
1306
  type: "subscription" | "one-time-purchase";
1074
1307
  id: string;
1075
1308
  }): Promise<void>;
1309
+ listOutboxEmails(options?: EmailOutboxListOptions): Promise<EmailOutboxListResult>;
1310
+ getOutboxEmail(id: string): Promise<AdminEmailOutbox>;
1311
+ updateOutboxEmail(id: string, options: EmailOutboxUpdateOptions): Promise<AdminEmailOutbox>;
1312
+ pauseOutboxEmail(id: string): Promise<AdminEmailOutbox>;
1313
+ unpauseOutboxEmail(id: string): Promise<AdminEmailOutbox>;
1314
+ cancelOutboxEmail(id: string): Promise<AdminEmailOutbox>;
1076
1315
  } & StackServerApp<HasTokenStore, ProjectId>);
1077
1316
  declare const StackAdminApp: StackAdminAppConstructor;
1078
1317
 
@@ -1090,6 +1329,9 @@ type ProjectConfig = {
1090
1329
  type OAuthProviderConfig = {
1091
1330
  readonly id: string;
1092
1331
  };
1332
+ /**
1333
+ * @deprecated This type is deprecated. Use the new config override setup instead.
1334
+ */
1093
1335
  type AdminProjectConfig = {
1094
1336
  readonly signUpEnabled: boolean;
1095
1337
  readonly credentialEnabled: boolean;
@@ -1335,6 +1577,12 @@ type StackClientApp<HasTokenStore extends boolean = boolean, ProjectId extends s
1335
1577
  or: 'anonymous';
1336
1578
  }): Promise<ProjectCurrentUser<ProjectId>>;
1337
1579
  getUser(options?: GetCurrentUserOptions<HasTokenStore>): Promise<ProjectCurrentUser<ProjectId> | null>;
1580
+ cancelSubscription(options: {
1581
+ productId: string;
1582
+ } | {
1583
+ productId: string;
1584
+ teamId: string;
1585
+ }): Promise<void>;
1338
1586
  getPartialUser(options: GetCurrentPartialUserOptions<HasTokenStore> & {
1339
1587
  from: 'token';
1340
1588
  }): Promise<TokenPartialUser | null>;
@@ -1462,6 +1710,10 @@ declare function OAuthCallback({ fullPage }: {
1462
1710
  fullPage?: boolean;
1463
1711
  }): react_jsx_runtime.JSX.Element;
1464
1712
 
1713
+ declare function Onboarding(props: {
1714
+ fullPage?: boolean;
1715
+ }): react_jsx_runtime.JSX.Element | null;
1716
+
1465
1717
  declare function PasswordReset({ searchParams, fullPage, }: {
1466
1718
  searchParams: Record<string, string>;
1467
1719
  fullPage?: boolean;
@@ -1490,6 +1742,7 @@ type Components = {
1490
1742
  AccountSettings: typeof AccountSettings;
1491
1743
  CliAuthConfirmation: typeof CliAuthConfirmation;
1492
1744
  MFA: typeof MFA;
1745
+ Onboarding: typeof Onboarding;
1493
1746
  };
1494
1747
  type BaseHandlerProps = {
1495
1748
  fullPage: boolean;
@@ -1761,4 +2014,4 @@ type UserButtonProps = {
1761
2014
  };
1762
2015
  declare function UserButton(props: UserButtonProps): react_jsx_runtime.JSX.Element;
1763
2016
 
1764
- export { AccountSettings, type AdminDomainConfig, type AdminEmailConfig, type AdminOAuthProviderConfig, type AdminOwnedProject, type AdminProject, type AdminProjectConfig, type AdminProjectConfigUpdateOptions, type AdminProjectCreateOptions, type AdminProjectPermission, type AdminProjectPermissionDefinition, type AdminProjectPermissionDefinitionCreateOptions, type AdminProjectPermissionDefinitionUpdateOptions, type AdminProjectUpdateOptions, type AdminSentEmail, type AdminTeamPermission, type AdminTeamPermissionDefinition, type AdminTeamPermissionDefinitionCreateOptions, type AdminTeamPermissionDefinitionUpdateOptions, type Auth, AuthPage, CliAuthConfirmation, type Connection, type ContactChannel, CredentialSignIn, CredentialSignUp, type CurrentInternalServerUser, type CurrentInternalUser, type CurrentServerUser, type CurrentUser, type EditableTeamMemberProfile, EmailVerification, ForgotPassword, type GetCurrentUserOptions, type GetCurrentUserOptions as GetUserOptions, type HandlerUrls, type InternalApiKey, type InternalApiKeyBase, type InternalApiKeyBaseCrudRead, type InternalApiKeyCreateOptions, type InternalApiKeyFirstView, MagicLinkSignIn, MessageCard, OAuthButton, OAuthButtonGroup, type OAuthConnection, type OAuthProvider, type OAuthProviderConfig, type OAuthScopesOnSignIn, PasswordReset, type Project, type ProjectConfig, SelectedTeamSwitcher, type ServerContactChannel, type ServerListUsersOptions, type ServerOAuthProvider, type ServerTeam, type ServerTeamCreateOptions, type ServerTeamMemberProfile, type ServerTeamUpdateOptions, type ServerTeamUser, type ServerUser, type Session, SignIn, SignUp, StackAdminApp, type StackAdminAppConstructor, type StackAdminAppConstructorOptions, StackClientApp, type StackClientAppConstructor, type StackClientAppConstructorOptions, type StackClientAppJson, StackHandler, NextStackProvider as StackProvider, StackServerApp, type StackServerAppConstructor, type StackServerAppConstructorOptions, StackTheme, type Team, type TeamCreateOptions, type TeamInvitation$1 as TeamInvitation, type TeamMemberProfile, TeamSwitcher, type TeamUpdateOptions, type TeamUser, type User, UserAvatar, UserButton, stackAppInternalsSymbol, useStackApp, useUser };
2017
+ export { AccountSettings, type AdminDomainConfig, type AdminEmailConfig, type AdminEmailOutbox, type AdminEmailOutboxRecipient, type AdminEmailOutboxSimpleStatus, type AdminEmailOutboxStatus, type AdminOAuthProviderConfig, type AdminOwnedProject, type AdminProject, type AdminProjectConfig, type AdminProjectConfigUpdateOptions, type AdminProjectCreateOptions, type AdminProjectPermission, type AdminProjectPermissionDefinition, type AdminProjectPermissionDefinitionCreateOptions, type AdminProjectPermissionDefinitionUpdateOptions, type AdminProjectUpdateOptions, type AdminSentEmail, type AdminTeamPermission, type AdminTeamPermissionDefinition, type AdminTeamPermissionDefinitionCreateOptions, type AdminTeamPermissionDefinitionUpdateOptions, type Auth, AuthPage, CliAuthConfirmation, type Connection, type ContactChannel, CredentialSignIn, CredentialSignUp, type CurrentInternalServerUser, type CurrentInternalUser, type CurrentServerUser, type CurrentUser, type EditableTeamMemberProfile, type EmailOutboxListOptions, type EmailOutboxListResult, type EmailOutboxUpdateOptions, EmailVerification, ForgotPassword, type GetCurrentUserOptions, type GetCurrentUserOptions as GetUserOptions, type HandlerUrls, type InternalApiKey, type InternalApiKeyBase, type InternalApiKeyBaseCrudRead, type InternalApiKeyCreateOptions, type InternalApiKeyFirstView, MagicLinkSignIn, MessageCard, OAuthButton, OAuthButtonGroup, type OAuthConnection, type OAuthProvider, type OAuthProviderConfig, type OAuthScopesOnSignIn, PasswordReset, type Project, type ProjectConfig, SelectedTeamSwitcher, type ServerContactChannel, type ServerListUsersOptions, type ServerOAuthProvider, type ServerTeam, type ServerTeamCreateOptions, type ServerTeamMemberProfile, type ServerTeamUpdateOptions, type ServerTeamUser, type ServerUser, SignIn, SignUp, StackAdminApp, type StackAdminAppConstructor, type StackAdminAppConstructorOptions, StackClientApp, type StackClientAppConstructor, type StackClientAppConstructorOptions, type StackClientAppJson, StackHandler, NextStackProvider as StackProvider, StackServerApp, type StackServerAppConstructor, type StackServerAppConstructorOptions, StackTheme, type Team, type TeamCreateOptions, type TeamInvitation$1 as TeamInvitation, type TeamMemberProfile, TeamSwitcher, type TeamUpdateOptions, type TeamUser, type User, UserAvatar, UserButton, stackAppInternalsSymbol, useStackApp, useUser };
@@ -106,7 +106,7 @@ function createNextCookieHelper(rscCookiesAwaited, rscHeadersAwaited) {
106
106
  },
107
107
  getAll: () => {
108
108
  try {
109
- rscCookiesAwaited.set("stack-is-https", "true", { secure: true });
109
+ rscCookiesAwaited.set("stack-is-https", "true", { secure: true, expires: new Date(Date.now() + 1e3 * 60 * 60 * 24 * 365) });
110
110
  } catch (e) {
111
111
  if (typeof e === "object" && e !== null && "message" in e && typeof e.message === "string" && e.message.includes("Cookies can only be modified in a Server Action or Route Handler")) {
112
112
  } else {
@@ -124,21 +124,22 @@ function createNextCookieHelper(rscCookiesAwaited, rscHeadersAwaited) {
124
124
  try {
125
125
  rscCookiesAwaited.set(name, value, {
126
126
  secure: isSecureCookie,
127
- maxAge: options.maxAge,
128
- domain: options.domain
127
+ maxAge: options.maxAge === "session" ? void 0 : options.maxAge,
128
+ domain: options.domain,
129
+ sameSite: "lax"
129
130
  });
130
131
  } catch (e) {
131
132
  handleCookieError(e, options);
132
133
  }
133
134
  },
134
- setOrDelete(name, value, options = {}) {
135
+ setOrDelete(name, value, options) {
135
136
  if (value === null) {
136
137
  this.delete(name, options);
137
138
  } else {
138
139
  this.set(name, value, options);
139
140
  }
140
141
  },
141
- delete(name, options = {}) {
142
+ delete(name, options) {
142
143
  try {
143
144
  if (options.domain !== void 0) {
144
145
  rscCookiesAwaited.delete({ name, domain: options.domain });
@@ -158,7 +159,7 @@ function getCookieClient(name) {
158
159
  }
159
160
  function getAllCookiesClient() {
160
161
  ensureClient();
161
- import_js_cookie.default.set("stack-is-https", "true", { secure: true });
162
+ import_js_cookie.default.set("stack-is-https", "true", { secure: true, expires: new Date(Date.now() + 1e3 * 60 * 60 * 24 * 365) });
162
163
  return import_js_cookie.default.get();
163
164
  }
164
165
  async function getCookie(name) {
@@ -178,21 +179,56 @@ function determineSecureFromClientContext() {
178
179
  function determineSecureFromServerContext(cookies, headers) {
179
180
  return cookies.has("stack-is-https") || headers.get("x-forwarded-proto") === "https";
180
181
  }
181
- function setCookieClientInternal(name, value, options = {}) {
182
+ var _shouldSetPartitionedClientCache = void 0;
183
+ function shouldSetPartitionedClient() {
184
+ return _shouldSetPartitionedClientCache ??= _internalShouldSetPartitionedClient();
185
+ }
186
+ function _internalShouldSetPartitionedClient() {
187
+ ensureClient();
188
+ if (!determineSecureFromClientContext()) {
189
+ return false;
190
+ }
191
+ const cookie1Name = "__Host-stack-temporary-chips-test-" + Math.random().toString(36).substring(2, 15);
192
+ document.cookie = `${cookie1Name}=value1; Secure; path=/`;
193
+ const cookies1 = document.cookie.split("; ");
194
+ document.cookie = `${cookie1Name}=delete1; Secure; path=/; expires=Thu, 01 Jan 1970 00:00:00 UTC;`;
195
+ if (cookies1.some((c) => c.startsWith(cookie1Name + "="))) {
196
+ return false;
197
+ }
198
+ const cookie2Name = "__Host-stack-temporary-chips-test-" + Math.random().toString(36).substring(2, 15);
199
+ document.cookie = `${cookie2Name}=delete1; Secure; SameSite=None; Partitioned; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/`;
200
+ document.cookie = `${cookie2Name}=delete2; Secure; SameSite=None; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/`;
201
+ document.cookie = `${cookie2Name}=set1; Secure; SameSite=None; Partitioned; path=/`;
202
+ document.cookie = `${cookie2Name}=set2; Secure; SameSite=None; path=/`;
203
+ const cookies2 = document.cookie.split("; ");
204
+ const numberOfCookiesWithThisName = cookies2.filter((c) => c.startsWith(cookie2Name + "=")).length;
205
+ document.cookie = `${cookie2Name}=delete3; Secure; SameSite=None; Partitioned; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/`;
206
+ document.cookie = `${cookie2Name}=delete4; Secure; SameSite=None; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/`;
207
+ return numberOfCookiesWithThisName === 2;
208
+ }
209
+ function setCookieClientInternal(name, value, options) {
182
210
  const secure = options.secure ?? determineSecureFromClientContext();
211
+ const partitioned = shouldSetPartitionedClient();
183
212
  import_js_cookie.default.set(name, value, {
184
- expires: options.maxAge === void 0 ? void 0 : new Date(Date.now() + options.maxAge * 1e3),
213
+ expires: options.maxAge === "session" ? void 0 : new Date(Date.now() + options.maxAge * 1e3),
185
214
  domain: options.domain,
186
- secure
215
+ secure,
216
+ sameSite: "Lax",
217
+ ...partitioned ? {
218
+ partitioned,
219
+ sameSite: "None"
220
+ } : {}
187
221
  });
188
222
  }
189
- function deleteCookieClientInternal(name, options = {}) {
190
- if (options.domain !== void 0) {
191
- import_js_cookie.default.remove(name, { domain: options.domain, secure: determineSecureFromClientContext() });
223
+ function deleteCookieClientInternal(name, options) {
224
+ for (const partitioned of [true, false]) {
225
+ if (options.domain !== void 0) {
226
+ import_js_cookie.default.remove(name, { domain: options.domain, secure: determineSecureFromClientContext(), partitioned });
227
+ }
228
+ import_js_cookie.default.remove(name, { secure: determineSecureFromClientContext(), partitioned });
192
229
  }
193
- import_js_cookie.default.remove(name, { secure: determineSecureFromClientContext() });
194
230
  }
195
- function setOrDeleteCookieClient(name, value, options = {}) {
231
+ function setOrDeleteCookieClient(name, value, options) {
196
232
  ensureClient();
197
233
  if (value === null) {
198
234
  deleteCookieClientInternal(name, options);
@@ -200,23 +236,23 @@ function setOrDeleteCookieClient(name, value, options = {}) {
200
236
  setCookieClientInternal(name, value, options);
201
237
  }
202
238
  }
203
- async function setOrDeleteCookie(name, value, options = {}) {
239
+ async function setOrDeleteCookie(name, value, options) {
204
240
  const cookieHelper = await createCookieHelper();
205
241
  cookieHelper.setOrDelete(name, value, options);
206
242
  }
207
- function deleteCookieClient(name, options = {}) {
243
+ function deleteCookieClient(name, options) {
208
244
  ensureClient();
209
245
  deleteCookieClientInternal(name, options);
210
246
  }
211
- async function deleteCookie(name, options = {}) {
247
+ async function deleteCookie(name, options) {
212
248
  const cookieHelper = await createCookieHelper();
213
249
  cookieHelper.delete(name, options);
214
250
  }
215
- function setCookieClient(name, value, options = {}) {
251
+ function setCookieClient(name, value, options) {
216
252
  ensureClient();
217
253
  setCookieClientInternal(name, value, options);
218
254
  }
219
- async function setCookie(name, value, options = {}) {
255
+ async function setCookie(name, value, options) {
220
256
  const cookieHelper = await createCookieHelper();
221
257
  cookieHelper.set(name, value, options);
222
258
  }
@@ -237,7 +273,7 @@ function consumeVerifierAndStateCookie(state) {
237
273
  if (!codeVerifier) {
238
274
  return null;
239
275
  }
240
- deleteCookieClient(cookieName);
276
+ deleteCookieClient(cookieName, {});
241
277
  return {
242
278
  codeVerifier
243
279
  };