@stackframe/stack 2.4.23 → 2.4.25

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 (36) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/components/magic-link-sign-in.js +1 -1
  3. package/dist/components/magic-link-sign-in.js.map +1 -1
  4. package/dist/components/selected-team-switcher.d.mts +8 -0
  5. package/dist/components/selected-team-switcher.d.ts +8 -0
  6. package/dist/components/selected-team-switcher.js +75 -0
  7. package/dist/components/selected-team-switcher.js.map +1 -0
  8. package/dist/components-page/stack-handler.js +1 -1
  9. package/dist/components-page/stack-handler.js.map +1 -1
  10. package/dist/esm/components/magic-link-sign-in.js +1 -1
  11. package/dist/esm/components/magic-link-sign-in.js.map +1 -1
  12. package/dist/esm/components/selected-team-switcher.js +63 -0
  13. package/dist/esm/components/selected-team-switcher.js.map +1 -0
  14. package/dist/esm/components-page/stack-handler.js +1 -1
  15. package/dist/esm/components-page/stack-handler.js.map +1 -1
  16. package/dist/esm/index.js +22 -16
  17. package/dist/esm/index.js.map +1 -1
  18. package/dist/esm/lib/hooks.js.map +1 -1
  19. package/dist/esm/lib/stack-app.js +285 -282
  20. package/dist/esm/lib/stack-app.js.map +1 -1
  21. package/dist/esm/providers/stack-provider.js +1 -1
  22. package/dist/esm/providers/stack-provider.js.map +1 -1
  23. package/dist/index.d.mts +1 -0
  24. package/dist/index.d.ts +1 -0
  25. package/dist/index.js +5 -0
  26. package/dist/index.js.map +1 -1
  27. package/dist/lib/hooks.d.mts +3 -3
  28. package/dist/lib/hooks.d.ts +3 -3
  29. package/dist/lib/hooks.js.map +1 -1
  30. package/dist/lib/stack-app.d.mts +100 -81
  31. package/dist/lib/stack-app.d.ts +100 -81
  32. package/dist/lib/stack-app.js +283 -280
  33. package/dist/lib/stack-app.js.map +1 -1
  34. package/dist/providers/stack-provider.js +1 -1
  35. package/dist/providers/stack-provider.js.map +1 -1
  36. package/package.json +3 -3
@@ -1,5 +1,5 @@
1
- import { ServerUserJson, OAuthProviderConfigJson, KnownErrors } from '@stackframe/stack-shared';
2
- import { StandardProvider, UserJson, UserUpdateJson, ProjectJson, ProductionModeError, TeamJson, EmailConfigJson, DomainConfigJson, ClientProjectJson } from '@stackframe/stack-shared/dist/interface/clientInterface';
1
+ import { KnownErrors, ServerUserJson, OAuthProviderConfigJson } from '@stackframe/stack-shared';
2
+ import { StandardProvider, UserUpdateJson, UserJson, ProjectJson, ProductionModeError, TeamJson, EmailConfigJson, DomainConfigJson, ClientProjectJson } from '@stackframe/stack-shared/dist/interface/clientInterface';
3
3
  import { ReadonlyJson } from '@stackframe/stack-shared/dist/utils/json';
4
4
  import { ProjectUpdateOptions, ApiKeySetCreateOptions } from '@stackframe/stack-shared/dist/interface/adminInterface';
5
5
  import { ServerUserUpdateJson, ServerTeamCustomizableJson, ServerPermissionDefinitionCustomizableJson, ServerPermissionDefinitionJson, EmailTemplateType } from '@stackframe/stack-shared/dist/interface/serverInterface';
@@ -36,6 +36,7 @@ type OAuthScopesOnSignIn = {
36
36
  [key in StandardProvider]: string[];
37
37
  };
38
38
  type ProjectCurrentUser<ProjectId> = ProjectId extends "internal" ? CurrentInternalUser : CurrentUser;
39
+ type ProjectCurrentServerUser<ProjectId> = ProjectId extends "internal" ? CurrentInternalServerUser : CurrentServerUser;
39
40
  type StackClientAppConstructorOptions<HasTokenStore extends boolean, ProjectId extends string> = {
40
41
  baseUrl?: string;
41
42
  projectId?: ProjectId;
@@ -68,10 +69,10 @@ type Session = {
68
69
  /**
69
70
  * Contains everything related to the current user session.
70
71
  */
71
- type Auth<T, C> = {
72
+ type Auth = {
72
73
  readonly _internalSession: InternalSession;
73
74
  readonly currentSession: Session;
74
- signOut(this: T): Promise<void>;
75
+ signOut(): Promise<void>;
75
76
  /**
76
77
  * Returns headers for sending authenticated HTTP requests to external servers. Most commonly used in cross-origin
77
78
  * requests. Similar to `getAuthJson`, but specifically for HTTP requests.
@@ -143,26 +144,12 @@ type Auth<T, C> = {
143
144
  accessToken: string | null;
144
145
  refreshToken: string | null;
145
146
  }>;
146
- update(this: T, user: C): Promise<void>;
147
- updateSelectedTeam(this: T, team: Team | null): Promise<void>;
148
- sendVerificationEmail(this: T): Promise<KnownErrors["EmailAlreadyVerified"] | void>;
149
- updatePassword(this: T, options: {
150
- oldPassword: string;
151
- newPassword: string;
152
- }): Promise<KnownErrors["PasswordMismatch"] | KnownErrors["PasswordRequirementsNotMet"] | void>;
153
147
  };
154
- type InternalAuth<T> = {
155
- createProject(this: T, newProject: ProjectUpdateOptions & {
156
- displayName: string;
157
- }): Promise<Project>;
158
- listOwnedProjects(this: T): Promise<Project[]>;
159
- useOwnedProjects(this: T): Project[];
160
- onOwnedProjectsChange(this: T, callback: (projects: Project[]) => void): void;
161
- };
162
- type User = ({
148
+ type User = {
163
149
  readonly projectId: string;
164
150
  readonly id: string;
165
151
  readonly displayName: string | null;
152
+ setDisplayName(displayName: string): Promise<void>;
166
153
  /**
167
154
  * The user's email address.
168
155
  *
@@ -170,71 +157,87 @@ type User = ({
170
157
  */
171
158
  readonly primaryEmail: string | null;
172
159
  readonly primaryEmailVerified: boolean;
160
+ sendVerificationEmail(): Promise<KnownErrors["EmailAlreadyVerified"] | void>;
173
161
  readonly profileImageUrl: string | null;
174
162
  readonly signedUpAt: Date;
175
163
  readonly clientMetadata: ReadonlyJson;
176
- readonly authMethod: 'credential' | 'oauth';
177
- readonly hasPassword: boolean;
164
+ setClientMetadata(metadata: ReadonlyJson): Promise<void>;
165
+ /**
166
+ * Whether the primary e-mail can be used for authentication.
167
+ */
178
168
  readonly authWithEmail: boolean;
169
+ /**
170
+ * Whether the user has a password set.
171
+ */
172
+ readonly hasPassword: boolean;
179
173
  readonly oauthProviders: readonly string[];
180
- hasPermission(this: CurrentUser, scope: Team, permissionId: string): Promise<boolean>;
181
- getSelectedTeam(this: CurrentUser): Promise<Team | null>;
182
- useSelectedTeam(this: CurrentUser): Team | null;
183
- getConnection(id: StandardProvider, options?: {
184
- scopes?: string[];
185
- }): Promise<OAuthConnection | null>;
186
- getConnection(id: StandardProvider, options: {
174
+ updatePassword(options: {
175
+ oldPassword: string;
176
+ newPassword: string;
177
+ }): Promise<KnownErrors["PasswordMismatch"] | KnownErrors["PasswordRequirementsNotMet"] | void>;
178
+ /**
179
+ * A shorthand method to update multiple fields of the user at once.
180
+ */
181
+ update(update: UserUpdateJson): Promise<void>;
182
+ hasPermission(scope: Team, permissionId: string): Promise<boolean>;
183
+ readonly selectedTeam: Team | null;
184
+ setSelectedTeam(team: Team | null): Promise<void>;
185
+ getConnectedAccount(id: StandardProvider, options: {
187
186
  or: 'redirect';
188
187
  scopes?: string[];
189
188
  }): Promise<OAuthConnection>;
190
- getConnection(id: StandardProvider, options?: {
191
- or?: 'redirect';
189
+ getConnectedAccount(id: StandardProvider, options?: {
190
+ or?: 'redirect' | 'throw' | 'return-null';
192
191
  scopes?: string[];
193
192
  }): Promise<OAuthConnection | null>;
194
- useConnection(id: StandardProvider, options?: {
195
- scopes?: string[];
196
- }): OAuthConnection | null;
197
- useConnection(id: StandardProvider, options: {
193
+ useConnectedAccount(id: StandardProvider, options: {
198
194
  or: 'redirect';
199
195
  scopes?: string[];
200
196
  }): OAuthConnection;
201
- useConnection(id: StandardProvider, options?: {
202
- or?: 'redirect';
197
+ useConnectedAccount(id: StandardProvider, options?: {
198
+ or?: 'redirect' | 'throw' | 'return-null';
203
199
  scopes?: string[];
204
200
  }): OAuthConnection | null;
205
- toJson(this: CurrentUser): UserJson;
206
- } & AsyncStoreProperty<"team", [id: string], Team | null, false> & AsyncStoreProperty<"teams", [], Team[], true> & Omit<AsyncStoreProperty<"permission", [scope: Team, permissionId: string, options?: {
201
+ toClientJson(): UserJson;
202
+ } & AsyncStoreProperty<"team", [id: string], Team | null, false> & AsyncStoreProperty<"teams", [], Team[], true> & AsyncStoreProperty<"permission", [scope: Team, permissionId: string, options?: {
207
203
  direct?: boolean;
208
- }], Permission | null, false>, "onPermissionChange"> & Omit<AsyncStoreProperty<"permissions", [scope: Team, options?: {
204
+ }], Permission | null, false> & AsyncStoreProperty<"permissions", [scope: Team, options?: {
209
205
  direct?: boolean;
210
- }], Permission[], true>, "onPermissionsChange">);
211
- type CurrentUser = Auth<User, UserUpdateJson> & User;
212
- type CurrentInternalUser = CurrentUser & InternalAuth<CurrentUser>;
206
+ }], Permission[], true>;
207
+ type InternalUserExtra = {
208
+ createProject(newProject: ProjectUpdateOptions & {
209
+ displayName: string;
210
+ }): Promise<Project>;
211
+ } & AsyncStoreProperty<"ownedProjects", [], Project[], true>;
212
+ type CurrentUser = Auth & User;
213
+ type CurrentInternalUser = CurrentUser & InternalUserExtra;
213
214
  /**
214
215
  * A user including sensitive fields that should only be used on the server, never sent to the client
215
216
  * (such as sensitive information and serverMetadata).
216
217
  */
217
- type ServerUser = (Omit<User, 'hasPermission' | 'toJson' | keyof AsyncStoreProperty<"team", [], Team | null, false> | keyof AsyncStoreProperty<"teams", [], Team[], true> | keyof AsyncStoreProperty<"permission", [], Permission[], false> | keyof AsyncStoreProperty<"permissions", [], Permission[], true>> & {
218
+ type ServerUser = {
219
+ setPrimaryEmail(email: string, options?: {
220
+ verified?: boolean | undefined;
221
+ }): Promise<void>;
218
222
  readonly serverMetadata: ReadonlyJson;
219
- /**
220
- * Returns a new user object with the sensitive fields removed.
221
- */
222
- getClientUser(this: ServerUser): User;
223
- update(this: ServerUser, user: Partial<ServerUserUpdateJson>): Promise<void>;
224
- delete(this: ServerUser): Promise<void>;
223
+ setServerMetadata(metadata: ReadonlyJson): Promise<void>;
224
+ updatePassword(options: {
225
+ oldPassword?: string;
226
+ newPassword: string;
227
+ }): Promise<KnownErrors["PasswordMismatch"] | KnownErrors["PasswordRequirementsNotMet"] | void>;
228
+ update(user: Partial<ServerUserUpdateJson>): Promise<void>;
229
+ delete(): Promise<void>;
225
230
  grantPermission(scope: Team, permissionId: string): Promise<void>;
226
231
  revokePermission(scope: Team, permissionId: string): Promise<void>;
227
232
  hasPermission(scope: Team, permissionId: string): Promise<boolean>;
228
- toJson(this: ServerUser): ServerUserJson;
229
- } & AsyncStoreProperty<"team", [id: string], ServerTeam | null, false> & AsyncStoreProperty<"teams", [], ServerTeam[], true> & Omit<AsyncStoreProperty<"permission", [scope: Team, permissionId: string, options?: {
233
+ toServerJson(): ServerUserJson;
234
+ } & AsyncStoreProperty<"team", [id: string], ServerTeam | null, false> & AsyncStoreProperty<"teams", [], ServerTeam[], true> & AsyncStoreProperty<"permission", [scope: Team, permissionId: string, options?: {
230
235
  direct?: boolean;
231
- }], ServerPermission | null, false>, "onPermissionChange"> & Omit<AsyncStoreProperty<"permissions", [scope: Team, options?: {
236
+ }], ServerPermission | null, false> & AsyncStoreProperty<"permissions", [scope: Team, options?: {
232
237
  direct?: boolean;
233
- }], ServerPermission[], true>, "onPermissionsChange">);
234
- type CurrentServerUser = Auth<ServerUser, ServerUserUpdateJson> & Omit<ServerUser, "getClientUser"> & {
235
- getClientUser(this: CurrentServerUser): CurrentUser;
236
- };
237
- type CurrentInternalServerUser = CurrentServerUser & InternalAuth<CurrentServerUser>;
238
+ }], ServerPermission[], true> & User;
239
+ type CurrentServerUser = Auth & ServerUser;
240
+ type CurrentInternalServerUser = CurrentServerUser & InternalUserExtra;
238
241
  type Project = {
239
242
  readonly id: string;
240
243
  readonly displayName: string;
@@ -260,7 +263,7 @@ type Team = {
260
263
  id: string;
261
264
  displayName: string;
262
265
  createdAt: Date;
263
- toJson(this: Team): TeamJson;
266
+ toJson(): TeamJson;
264
267
  };
265
268
  type ServerTeam = Team & {
266
269
  listMembers(): Promise<ServerTeamMember[]>;
@@ -276,7 +279,7 @@ type TeamMember = {
276
279
  displayName: string | null;
277
280
  };
278
281
  type ServerTeamMember = TeamMember & {
279
- getUser(): Promise<ServerUser>;
282
+ user: ServerUser;
280
283
  };
281
284
  type Permission = {
282
285
  id: string;
@@ -331,14 +334,14 @@ type ApiKeySet = ApiKeySetBase & {
331
334
  type EmailConfig = EmailConfigJson;
332
335
  type DomainConfig = DomainConfigJson;
333
336
  type OAuthProviderConfig = OAuthProviderConfigJson;
334
- type GetUserOptions = {
337
+ type GetUserOptions<HasTokenStore> = {
335
338
  or?: 'redirect' | 'throw' | 'return-null';
336
339
  tokenStore?: TokenStoreInit;
337
- };
340
+ } & (HasTokenStore extends false ? {
341
+ tokenStore: TokenStoreInit;
342
+ } : {});
338
343
  type AsyncStoreProperty<Name extends string, Args extends any[], Value, IsMultiple extends boolean> = {
339
344
  [key in `${IsMultiple extends true ? "list" : "get"}${Capitalize<Name>}`]: (...args: Args) => Promise<Value>;
340
- } & {
341
- [key in `on${Capitalize<Name>}Change`]: (...tupleArgs: [...args: Args, callback: (value: Value) => void]) => void;
342
345
  } & {
343
346
  [key in `use${Capitalize<Name>}`]: (...args: Args) => Value;
344
347
  };
@@ -371,36 +374,34 @@ type StackClientApp<HasTokenStore extends boolean = boolean, ProjectId extends s
371
374
  verifyPasswordResetCode(code: string): Promise<KnownErrors["PasswordResetCodeError"] | void>;
372
375
  verifyEmail(code: string): Promise<KnownErrors["EmailVerificationError"] | void>;
373
376
  signInWithMagicLink(code: string): Promise<KnownErrors["MagicLinkError"] | void>;
374
- [stackAppInternalsSymbol]: {
375
- toClientJson(): StackClientAppJson<HasTokenStore, ProjectId>;
376
- setCurrentUser(userJsonPromise: Promise<UserJson | null>): void;
377
- };
378
- } & AsyncStoreProperty<"project", [], ClientProjectJson, false> & {
379
- [K in `redirectTo${Capitalize<keyof Omit<HandlerUrls, 'handler' | 'oauthCallback'>>}`]: (options?: RedirectToOptions) => Promise<void>;
380
- } & (HasTokenStore extends false ? {} : {
381
377
  redirectToOAuthCallback(): Promise<void>;
382
- useUser(options: GetUserOptions & {
378
+ useUser(options: GetUserOptions<HasTokenStore> & {
383
379
  or: 'redirect';
384
380
  }): ProjectCurrentUser<ProjectId>;
385
- useUser(options: GetUserOptions & {
381
+ useUser(options: GetUserOptions<HasTokenStore> & {
386
382
  or: 'throw';
387
383
  }): ProjectCurrentUser<ProjectId>;
388
- useUser(options?: GetUserOptions): ProjectCurrentUser<ProjectId> | null;
389
- getUser(options: GetUserOptions & {
384
+ useUser(options?: GetUserOptions<HasTokenStore>): ProjectCurrentUser<ProjectId> | null;
385
+ getUser(options: GetUserOptions<HasTokenStore> & {
390
386
  or: 'redirect';
391
387
  }): Promise<ProjectCurrentUser<ProjectId>>;
392
- getUser(options: GetUserOptions & {
388
+ getUser(options: GetUserOptions<HasTokenStore> & {
393
389
  or: 'throw';
394
390
  }): Promise<ProjectCurrentUser<ProjectId>>;
395
- getUser(options?: GetUserOptions): Promise<ProjectCurrentUser<ProjectId> | null>;
396
- onUserChange: AsyncStoreProperty<"user", [], CurrentUser | null, false>["onUserChange"];
397
- }));
391
+ getUser(options?: GetUserOptions<HasTokenStore>): Promise<ProjectCurrentUser<ProjectId> | null>;
392
+ [stackAppInternalsSymbol]: {
393
+ toClientJson(): StackClientAppJson<HasTokenStore, ProjectId>;
394
+ setCurrentUser(userJsonPromise: Promise<UserJson | null>): void;
395
+ };
396
+ } & AsyncStoreProperty<"project", [], ClientProjectJson, false> & {
397
+ [K in `redirectTo${Capitalize<keyof Omit<HandlerUrls, 'handler' | 'oauthCallback'>>}`]: (options?: RedirectToOptions) => Promise<void>;
398
+ });
398
399
  declare const StackClientApp: StackClientAppConstructor;
399
400
  type StackServerAppConstructor = {
400
401
  new <TokenStoreType extends string, HasTokenStore extends (TokenStoreType extends {} ? true : boolean), ProjectId extends string>(options: StackServerAppConstructorOptions<HasTokenStore, ProjectId>): StackServerApp<HasTokenStore, ProjectId>;
401
402
  new (options: StackServerAppConstructorOptions<boolean, string>): StackServerApp<boolean, string>;
402
403
  };
403
- type StackServerApp<HasTokenStore extends boolean = boolean, ProjectId extends string = string> = (StackClientApp<HasTokenStore, ProjectId> & {
404
+ type StackServerApp<HasTokenStore extends boolean = boolean, ProjectId extends string = string> = ({
404
405
  createTeam(data: ServerTeamCustomizableJson): Promise<ServerTeam>;
405
406
  createPermissionDefinition(data: ServerPermissionDefinitionCustomizableJson): Promise<ServerPermission>;
406
407
  updatePermissionDefinition(permissionId: string, data: Partial<ServerPermissionDefinitionCustomizableJson>): Promise<void>;
@@ -411,7 +412,25 @@ type StackServerApp<HasTokenStore extends boolean = boolean, ProjectId extends s
411
412
  listEmailTemplates(): Promise<ListEmailTemplatesCrud['Server']['Read']>;
412
413
  updateEmailTemplate(type: EmailTemplateType, data: EmailTemplateCrud['Server']['Update']): Promise<void>;
413
414
  resetEmailTemplate(type: EmailTemplateType): Promise<void>;
414
- } & AsyncStoreProperty<"serverUser", [], CurrentServerUser | null, false> & AsyncStoreProperty<"serverUsers", [], ServerUser[], true> & Omit<AsyncStoreProperty<"team", [id: string], ServerTeam | null, false>, "onTeamChange"> & Omit<AsyncStoreProperty<"teams", [], ServerTeam[], true>, "onTeamsChange">);
415
+ /**
416
+ * @deprecated use `getUser()` instead
417
+ */
418
+ getServerUser(): Promise<ProjectCurrentServerUser<ProjectId> | null>;
419
+ useUser(options: GetUserOptions<HasTokenStore> & {
420
+ or: 'redirect';
421
+ }): ProjectCurrentServerUser<ProjectId>;
422
+ useUser(options: GetUserOptions<HasTokenStore> & {
423
+ or: 'throw';
424
+ }): ProjectCurrentServerUser<ProjectId>;
425
+ useUser(options?: GetUserOptions<HasTokenStore>): ProjectCurrentServerUser<ProjectId> | null;
426
+ getUser(options: GetUserOptions<HasTokenStore> & {
427
+ or: 'redirect';
428
+ }): Promise<ProjectCurrentServerUser<ProjectId>>;
429
+ getUser(options: GetUserOptions<HasTokenStore> & {
430
+ or: 'throw';
431
+ }): Promise<ProjectCurrentServerUser<ProjectId>>;
432
+ getUser(options?: GetUserOptions<HasTokenStore>): Promise<ProjectCurrentServerUser<ProjectId> | null>;
433
+ } & StackClientApp<HasTokenStore, ProjectId> & AsyncStoreProperty<"users", [], ServerUser[], true> & AsyncStoreProperty<"team", [id: string], ServerTeam | null, false> & AsyncStoreProperty<"teams", [], ServerTeam[], true>);
415
434
  declare const StackServerApp: StackServerAppConstructor;
416
435
  type StackAdminAppConstructor = {
417
436
  new <HasTokenStore extends boolean, ProjectId extends string>(options: StackAdminAppConstructorOptions<HasTokenStore, ProjectId>): StackAdminApp<HasTokenStore, ProjectId>;