@stackframe/js 2.7.20 → 2.7.22

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 (162) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/admin-app-impl-Co__PI-r.d.ts +357 -0
  3. package/dist/admin-app-impl-s-tPjfRz.d.mts +357 -0
  4. package/dist/esm/index.js.map +1 -1
  5. package/dist/esm/lib/auth.js.map +1 -1
  6. package/dist/esm/lib/cookie.js +5 -8
  7. package/dist/esm/lib/cookie.js.map +1 -1
  8. package/dist/esm/lib/stack-app/api-keys/index.js +14 -0
  9. package/dist/esm/lib/stack-app/api-keys/index.js.map +1 -0
  10. package/dist/esm/lib/stack-app/apps/implementations/admin-app-impl.js +257 -0
  11. package/dist/esm/lib/stack-app/apps/implementations/admin-app-impl.js.map +1 -0
  12. package/dist/esm/lib/{stack-app.js → stack-app/apps/implementations/client-app-impl.js} +36 -952
  13. package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.js.map +1 -0
  14. package/dist/esm/lib/stack-app/apps/implementations/common.js +107 -0
  15. package/dist/esm/lib/stack-app/apps/implementations/common.js.map +1 -0
  16. package/dist/esm/lib/stack-app/apps/implementations/index.js +24 -0
  17. package/dist/esm/lib/stack-app/apps/implementations/index.js.map +1 -0
  18. package/dist/esm/lib/stack-app/apps/implementations/server-app-impl.js +430 -0
  19. package/dist/esm/lib/stack-app/apps/implementations/server-app-impl.js.map +1 -0
  20. package/dist/esm/lib/stack-app/apps/index.js +16 -0
  21. package/dist/esm/lib/stack-app/apps/index.js.map +1 -0
  22. package/dist/esm/lib/stack-app/apps/interfaces/admin-app.js +7 -0
  23. package/dist/esm/lib/stack-app/apps/interfaces/admin-app.js.map +1 -0
  24. package/dist/esm/lib/stack-app/apps/interfaces/client-app.js +7 -0
  25. package/dist/esm/lib/stack-app/apps/interfaces/client-app.js.map +1 -0
  26. package/dist/esm/lib/stack-app/apps/interfaces/server-app.js +7 -0
  27. package/dist/esm/lib/stack-app/apps/interfaces/server-app.js.map +1 -0
  28. package/dist/esm/lib/stack-app/common.js +6 -0
  29. package/dist/esm/lib/stack-app/common.js.map +1 -0
  30. package/dist/esm/lib/stack-app/connected-accounts/index.js +1 -0
  31. package/dist/esm/lib/stack-app/contact-channels/index.js +39 -0
  32. package/dist/esm/lib/stack-app/contact-channels/index.js.map +1 -0
  33. package/dist/esm/lib/stack-app/email-templates/index.js +11 -0
  34. package/dist/esm/lib/stack-app/email-templates/index.js.map +1 -0
  35. package/dist/esm/lib/stack-app/index.js +16 -0
  36. package/dist/esm/lib/stack-app/index.js.map +1 -0
  37. package/dist/esm/lib/stack-app/permissions/index.js +20 -0
  38. package/dist/esm/lib/stack-app/permissions/index.js.map +1 -0
  39. package/dist/esm/lib/stack-app/project-configs/index.js +1 -0
  40. package/dist/esm/lib/stack-app/projects/index.js +57 -0
  41. package/dist/esm/lib/stack-app/projects/index.js.map +1 -0
  42. package/dist/esm/lib/stack-app/teams/index.js +38 -0
  43. package/dist/esm/lib/stack-app/teams/index.js.map +1 -0
  44. package/dist/esm/lib/stack-app/users/index.js +47 -0
  45. package/dist/esm/lib/stack-app/users/index.js.map +1 -0
  46. package/dist/esm/utils/url.js +4 -13
  47. package/dist/esm/utils/url.js.map +1 -1
  48. package/dist/{lib/stack-app.d.mts → index-COYzPcGI.d.mts} +128 -338
  49. package/dist/{lib/stack-app.d.ts → index-CueS5Qbi.d.ts} +128 -338
  50. package/dist/index.d.mts +17 -5
  51. package/dist/index.d.ts +17 -5
  52. package/dist/index.js.map +1 -1
  53. package/dist/lib/auth.js.map +1 -1
  54. package/dist/lib/cookie.d.mts +2 -2
  55. package/dist/lib/cookie.d.ts +2 -2
  56. package/dist/lib/cookie.js +6 -9
  57. package/dist/lib/cookie.js.map +1 -1
  58. package/dist/lib/stack-app/api-keys/index.d.mts +40 -0
  59. package/dist/lib/stack-app/api-keys/index.d.ts +40 -0
  60. package/dist/lib/stack-app/api-keys/index.js +39 -0
  61. package/dist/lib/stack-app/api-keys/index.js.map +1 -0
  62. package/dist/lib/stack-app/apps/implementations/admin-app-impl.d.mts +30 -0
  63. package/dist/lib/stack-app/apps/implementations/admin-app-impl.d.ts +30 -0
  64. package/dist/lib/stack-app/apps/implementations/admin-app-impl.js +282 -0
  65. package/dist/lib/stack-app/apps/implementations/admin-app-impl.js.map +1 -0
  66. package/dist/lib/stack-app/apps/implementations/client-app-impl.d.mts +30 -0
  67. package/dist/lib/stack-app/apps/implementations/client-app-impl.d.ts +30 -0
  68. package/dist/lib/{stack-app.js → stack-app/apps/implementations/client-app-impl.js} +63 -984
  69. package/dist/lib/stack-app/apps/implementations/client-app-impl.js.map +1 -0
  70. package/dist/lib/stack-app/apps/implementations/common.d.mts +44 -0
  71. package/dist/lib/stack-app/apps/implementations/common.d.ts +44 -0
  72. package/dist/lib/stack-app/apps/implementations/common.js +141 -0
  73. package/dist/lib/stack-app/apps/implementations/common.js.map +1 -0
  74. package/dist/lib/stack-app/apps/implementations/index.d.mts +36 -0
  75. package/dist/lib/stack-app/apps/implementations/index.d.ts +36 -0
  76. package/dist/lib/stack-app/apps/implementations/index.js +51 -0
  77. package/dist/lib/stack-app/apps/implementations/index.js.map +1 -0
  78. package/dist/lib/stack-app/apps/implementations/server-app-impl.d.mts +30 -0
  79. package/dist/lib/stack-app/apps/implementations/server-app-impl.d.ts +30 -0
  80. package/dist/lib/stack-app/apps/implementations/server-app-impl.js +455 -0
  81. package/dist/lib/stack-app/apps/implementations/server-app-impl.js.map +1 -0
  82. package/dist/lib/stack-app/apps/index.d.mts +23 -0
  83. package/dist/lib/stack-app/apps/index.d.ts +23 -0
  84. package/dist/lib/stack-app/apps/index.js +37 -0
  85. package/dist/lib/stack-app/apps/index.js.map +1 -0
  86. package/dist/lib/stack-app/apps/interfaces/admin-app.d.mts +23 -0
  87. package/dist/lib/stack-app/apps/interfaces/admin-app.d.ts +23 -0
  88. package/dist/lib/stack-app/apps/interfaces/admin-app.js +32 -0
  89. package/dist/lib/stack-app/apps/interfaces/admin-app.js.map +1 -0
  90. package/dist/lib/stack-app/apps/interfaces/client-app.d.mts +23 -0
  91. package/dist/lib/stack-app/apps/interfaces/client-app.d.ts +23 -0
  92. package/dist/lib/stack-app/apps/interfaces/client-app.js +32 -0
  93. package/dist/lib/stack-app/apps/interfaces/client-app.js.map +1 -0
  94. package/dist/lib/stack-app/apps/interfaces/server-app.d.mts +23 -0
  95. package/dist/lib/stack-app/apps/interfaces/server-app.d.ts +23 -0
  96. package/dist/lib/stack-app/apps/interfaces/server-app.js +32 -0
  97. package/dist/lib/stack-app/apps/interfaces/server-app.js.map +1 -0
  98. package/dist/lib/stack-app/common.d.mts +61 -0
  99. package/dist/lib/stack-app/common.d.ts +61 -0
  100. package/dist/lib/stack-app/common.js +31 -0
  101. package/dist/lib/stack-app/common.js.map +1 -0
  102. package/dist/lib/stack-app/connected-accounts/index.d.mts +10 -0
  103. package/dist/lib/stack-app/connected-accounts/index.d.ts +10 -0
  104. package/dist/lib/stack-app/connected-accounts/index.js +19 -0
  105. package/dist/lib/stack-app/connected-accounts/index.js.map +1 -0
  106. package/dist/lib/stack-app/contact-channels/index.d.mts +38 -0
  107. package/dist/lib/stack-app/contact-channels/index.d.ts +38 -0
  108. package/dist/lib/stack-app/contact-channels/index.js +67 -0
  109. package/dist/lib/stack-app/contact-channels/index.js.map +1 -0
  110. package/dist/lib/stack-app/email-templates/index.d.mts +15 -0
  111. package/dist/lib/stack-app/email-templates/index.d.ts +15 -0
  112. package/dist/lib/stack-app/email-templates/index.js +36 -0
  113. package/dist/lib/stack-app/email-templates/index.js.map +1 -0
  114. package/dist/lib/stack-app/index.d.mts +23 -0
  115. package/dist/lib/stack-app/index.d.ts +23 -0
  116. package/dist/lib/stack-app/index.js +38 -0
  117. package/dist/lib/stack-app/index.js.map +1 -0
  118. package/dist/lib/stack-app/permissions/index.d.mts +21 -0
  119. package/dist/lib/stack-app/permissions/index.d.ts +21 -0
  120. package/dist/lib/stack-app/permissions/index.js +46 -0
  121. package/dist/lib/stack-app/permissions/index.js.map +1 -0
  122. package/dist/lib/stack-app/project-configs/index.d.mts +82 -0
  123. package/dist/lib/stack-app/project-configs/index.d.ts +82 -0
  124. package/dist/lib/stack-app/project-configs/index.js +19 -0
  125. package/dist/lib/stack-app/project-configs/index.js.map +1 -0
  126. package/dist/lib/stack-app/projects/index.d.mts +23 -0
  127. package/dist/lib/stack-app/projects/index.d.ts +23 -0
  128. package/dist/lib/stack-app/projects/index.js +83 -0
  129. package/dist/lib/stack-app/projects/index.js.map +1 -0
  130. package/dist/lib/stack-app/teams/index.d.mts +23 -0
  131. package/dist/lib/stack-app/teams/index.d.ts +23 -0
  132. package/dist/lib/stack-app/teams/index.js +66 -0
  133. package/dist/lib/stack-app/teams/index.js.map +1 -0
  134. package/dist/lib/stack-app/users/index.d.mts +23 -0
  135. package/dist/lib/stack-app/users/index.d.ts +23 -0
  136. package/dist/lib/stack-app/users/index.js +74 -0
  137. package/dist/lib/stack-app/users/index.js.map +1 -0
  138. package/dist/utils/url.d.mts +1 -2
  139. package/dist/utils/url.d.ts +1 -2
  140. package/dist/utils/url.js +4 -14
  141. package/dist/utils/url.js.map +1 -1
  142. package/package.json +2 -2
  143. package/dist/esm/generated/global-css.js +0 -6
  144. package/dist/esm/generated/global-css.js.map +0 -1
  145. package/dist/esm/generated/quetzal-translations.js +0 -2397
  146. package/dist/esm/generated/quetzal-translations.js.map +0 -1
  147. package/dist/esm/global.d.js +0 -1
  148. package/dist/esm/lib/stack-app.js.map +0 -1
  149. package/dist/generated/global-css.d.mts +0 -3
  150. package/dist/generated/global-css.d.ts +0 -3
  151. package/dist/generated/global-css.js +0 -31
  152. package/dist/generated/global-css.js.map +0 -1
  153. package/dist/generated/quetzal-translations.d.mts +0 -4
  154. package/dist/generated/quetzal-translations.d.ts +0 -4
  155. package/dist/generated/quetzal-translations.js +0 -2423
  156. package/dist/generated/quetzal-translations.js.map +0 -1
  157. package/dist/global.d.d.mts +0 -2
  158. package/dist/global.d.d.ts +0 -2
  159. package/dist/global.d.js +0 -2
  160. package/dist/lib/stack-app.js.map +0 -1
  161. /package/dist/esm/{global.d.js.map → lib/stack-app/connected-accounts/index.js.map} +0 -0
  162. /package/dist/{global.d.js.map → esm/lib/stack-app/project-configs/index.js.map} +0 -0
@@ -0,0 +1,357 @@
1
+ import * as _stackframe_stack_shared_dist_sessions from '@stackframe/stack-shared/dist/sessions';
2
+ import { InternalSession } from '@stackframe/stack-shared/dist/sessions';
3
+ import * as _stackframe_stack_shared_dist_interface_crud_current_user from '@stackframe/stack-shared/dist/interface/crud/current-user';
4
+ import { CurrentUserCrud } from '@stackframe/stack-shared/dist/interface/crud/current-user';
5
+ import { S as StackClientAppConstructorOptions, a as StackClientApp, P as Project, T as TeamUser, b as TeamInvitation, c as Team, A as Auth, E as EditableTeamMemberProfile, B as BaseUser, U as UserExtra, I as InternalUserExtra, d as ProjectCurrentUser, e as UserUpdateOptions, f as AdminOwnedProject, g as AdminProjectUpdateOptions, h as StackClientAppJson, i as StackServerAppConstructorOptions, j as ServerUser, k as ServerTeamUser, l as ProjectCurrentServerUser, m as ServerTeam, n as ServerUserCreateOptions, o as ServerListUsersOptions, p as ServerTeamCreateOptions, q as StackAdminAppConstructorOptions, r as AdminProject } from './index-COYzPcGI.mjs';
6
+ import { TokenStoreInit, RedirectMethod, HandlerUrls, OAuthScopesOnSignIn, RequestLike, RedirectToOptions, GetUserOptions, stackAppInternalsSymbol, EmailConfig } from './lib/stack-app/common.mjs';
7
+ import { StackClientInterface, KnownErrors, StackServerInterface, StackAdminInterface } from '@stackframe/stack-shared';
8
+ import { Result } from '@stackframe/stack-shared/dist/utils/results';
9
+ import { TeamPermission, AdminTeamPermission, AdminTeamPermissionDefinition, AdminTeamPermissionDefinitionCreateOptions, AdminTeamPermissionDefinitionUpdateOptions } from './lib/stack-app/permissions/index.mjs';
10
+ import { ApiKeyCreateCrudResponse } from '@stackframe/stack-shared/dist/interface/adminInterface';
11
+ import { ApiKeysCrud } from '@stackframe/stack-shared/dist/interface/crud/api-keys';
12
+ import { EmailTemplateCrud, EmailTemplateType } from '@stackframe/stack-shared/dist/interface/crud/email-templates';
13
+ import { ProjectsCrud, InternalProjectsCrud } from '@stackframe/stack-shared/dist/interface/crud/projects';
14
+ import { ApiKeyBaseCrudRead, ApiKeyBase, ApiKey, ApiKeyFirstView, ApiKeyCreateOptions } from './lib/stack-app/api-keys/index.mjs';
15
+ import { AdminEmailTemplate, AdminEmailTemplateUpdateOptions } from './lib/stack-app/email-templates/index.mjs';
16
+ import { ContactChannelsCrud } from '@stackframe/stack-shared/dist/interface/crud/contact-channels';
17
+ import { TeamInvitationCrud } from '@stackframe/stack-shared/dist/interface/crud/team-invitation';
18
+ import { TeamMemberProfilesCrud } from '@stackframe/stack-shared/dist/interface/crud/team-member-profiles';
19
+ import { TeamPermissionsCrud, TeamPermissionDefinitionsCrud } from '@stackframe/stack-shared/dist/interface/crud/team-permissions';
20
+ import { TeamsCrud } from '@stackframe/stack-shared/dist/interface/crud/teams';
21
+ import { UsersCrud } from '@stackframe/stack-shared/dist/interface/crud/users';
22
+ import { ContactChannel, ServerContactChannel } from './lib/stack-app/contact-channels/index.mjs';
23
+ import { ProviderType } from '@stackframe/stack-shared/dist/utils/oauth';
24
+ import { Store } from '@stackframe/stack-shared/dist/utils/stores';
25
+ import { CookieHelper } from './lib/cookie.mjs';
26
+ import { TokenObject } from './lib/stack-app/apps/implementations/common.mjs';
27
+
28
+ declare class _StackClientAppImplIncomplete<HasTokenStore extends boolean, ProjectId extends string = string> {
29
+ protected readonly _options: {
30
+ uniqueIdentifier?: string;
31
+ checkString?: string;
32
+ } & (StackClientAppConstructorOptions<HasTokenStore, ProjectId> | Exclude<StackClientAppConstructorOptions<HasTokenStore, ProjectId>, "baseUrl" | "projectId" | "publishableClientKey"> & {
33
+ interface: StackClientInterface;
34
+ });
35
+ /**
36
+ * There is a circular dependency between the admin app and the client app, as the former inherits from the latter and
37
+ * the latter needs to use the former when creating a new instance of an internal project.
38
+ *
39
+ * To break it, we set the admin app here lazily instead of importing it directly. This variable is set by ./index.ts,
40
+ * which imports both this file and ./admin-app-impl.ts.
41
+ */
42
+ static readonly LazyStackAdminAppImpl: {
43
+ value: typeof _StackAdminAppImplIncomplete | undefined;
44
+ };
45
+ protected _uniqueIdentifier: string | undefined;
46
+ protected _interface: StackClientInterface;
47
+ protected readonly _tokenStoreInit: TokenStoreInit<HasTokenStore>;
48
+ protected readonly _redirectMethod: RedirectMethod | undefined;
49
+ protected readonly _urlOptions: Partial<HandlerUrls>;
50
+ protected readonly _oauthScopesOnSignIn: Partial<OAuthScopesOnSignIn>;
51
+ private __DEMO_ENABLE_SLIGHT_FETCH_DELAY;
52
+ private readonly _ownedAdminApps;
53
+ private readonly _currentUserCache;
54
+ private readonly _currentProjectCache;
55
+ private readonly _ownedProjectsCache;
56
+ private readonly _currentUserPermissionsCache;
57
+ private readonly _currentUserTeamsCache;
58
+ private readonly _currentUserOAuthConnectionAccessTokensCache;
59
+ private readonly _currentUserOAuthConnectionCache;
60
+ private readonly _teamMemberProfilesCache;
61
+ private readonly _teamInvitationsCache;
62
+ private readonly _currentUserTeamProfileCache;
63
+ private readonly _clientContactChannelsCache;
64
+ protected _createCookieHelper(): Promise<CookieHelper>;
65
+ protected _getUserOAuthConnectionCacheFn(options: {
66
+ getUser: () => Promise<CurrentUserCrud['Client']['Read'] | null>;
67
+ getOrWaitOAuthToken: () => Promise<{
68
+ accessToken: string;
69
+ } | null>;
70
+ providerId: ProviderType;
71
+ scope: string | null;
72
+ } & ({
73
+ redirect: true;
74
+ session: InternalSession | null;
75
+ } | {
76
+ redirect: false;
77
+ })): Promise<{
78
+ id: "google" | "github" | "microsoft" | "spotify" | "facebook" | "discord" | "gitlab" | "bitbucket" | "linkedin" | "apple" | "x";
79
+ getAccessToken(): Promise<{
80
+ accessToken: string;
81
+ }>;
82
+ } | null>;
83
+ constructor(_options: {
84
+ uniqueIdentifier?: string;
85
+ checkString?: string;
86
+ } & (StackClientAppConstructorOptions<HasTokenStore, ProjectId> | Exclude<StackClientAppConstructorOptions<HasTokenStore, ProjectId>, "baseUrl" | "projectId" | "publishableClientKey"> & {
87
+ interface: StackClientInterface;
88
+ }));
89
+ protected _initUniqueIdentifier(): void;
90
+ /**
91
+ * Cloudflare workers does not allow use of randomness on the global scope (on which the Stack app is probably
92
+ * initialized). For that reason, we generate the unique identifier lazily when it is first needed instead of in the
93
+ * constructor.
94
+ */
95
+ protected _getUniqueIdentifier(): string;
96
+ protected _checkFeatureSupport(name: string, options: any): Promise<never>;
97
+ protected _useCheckFeatureSupport(name: string, options: any): never;
98
+ protected _memoryTokenStore: Store<TokenObject>;
99
+ protected _nextServerCookiesTokenStores: WeakMap<object, Store<TokenObject>>;
100
+ protected _requestTokenStores: WeakMap<RequestLike, Store<TokenObject>>;
101
+ protected _storedBrowserCookieTokenStore: Store<TokenObject> | null;
102
+ protected get _refreshTokenCookieName(): string;
103
+ protected _getTokensFromCookies(cookies: {
104
+ refreshTokenCookie: string | null;
105
+ accessTokenCookie: string | null;
106
+ }): TokenObject;
107
+ protected get _accessTokenCookieName(): string;
108
+ protected _getBrowserCookieTokenStore(): Store<TokenObject>;
109
+ protected _getOrCreateTokenStore(cookieHelper: CookieHelper, overrideTokenStoreInit?: TokenStoreInit): Store<TokenObject>;
110
+ /**
111
+ * A map from token stores and session keys to sessions.
112
+ *
113
+ * This isn't just a map from session keys to sessions for two reasons:
114
+ *
115
+ * - So we can garbage-collect Session objects when the token store is garbage-collected
116
+ * - So different token stores are separated and don't leak information between each other, eg. if the same user sends two requests to the same server they should get a different session object
117
+ */
118
+ private _sessionsByTokenStoreAndSessionKey;
119
+ protected _getSessionFromTokenStore(tokenStore: Store<TokenObject>): InternalSession;
120
+ protected _getSession(overrideTokenStoreInit?: TokenStoreInit): Promise<InternalSession>;
121
+ protected _signInToAccountWithTokens(tokens: {
122
+ accessToken: string | null;
123
+ refreshToken: string;
124
+ }): Promise<void>;
125
+ protected _hasPersistentTokenStore(overrideTokenStoreInit?: TokenStoreInit): this is StackClientApp<true, ProjectId>;
126
+ protected _ensurePersistentTokenStore(overrideTokenStoreInit?: TokenStoreInit): asserts this is StackClientApp<true, ProjectId>;
127
+ protected _isInternalProject(): this is {
128
+ projectId: "internal";
129
+ };
130
+ protected _ensureInternalProject(): asserts this is {
131
+ projectId: "internal";
132
+ };
133
+ protected _clientProjectFromCrud(crud: ProjectsCrud['Client']['Read']): Project;
134
+ protected _clientTeamPermissionFromCrud(crud: TeamPermissionsCrud['Client']['Read']): TeamPermission;
135
+ protected _clientTeamUserFromCrud(crud: TeamMemberProfilesCrud['Client']['Read']): TeamUser;
136
+ protected _clientTeamInvitationFromCrud(session: InternalSession, crud: TeamInvitationCrud['Client']['Read']): TeamInvitation;
137
+ protected _clientTeamFromCrud(crud: TeamsCrud['Client']['Read'], session: InternalSession): Team;
138
+ protected _clientContactChannelFromCrud(crud: ContactChannelsCrud['Client']['Read'], session: InternalSession): ContactChannel;
139
+ protected _createAuth(session: InternalSession): Auth;
140
+ protected _editableTeamProfileFromCrud(crud: TeamMemberProfilesCrud['Client']['Read'], session: InternalSession): EditableTeamMemberProfile;
141
+ protected _createBaseUser(crud: NonNullable<CurrentUserCrud['Client']['Read']> | UsersCrud['Server']['Read']): BaseUser;
142
+ protected _createUserExtraFromCurrent(crud: NonNullable<CurrentUserCrud['Client']['Read']>, session: InternalSession): UserExtra;
143
+ protected _createInternalUserExtra(session: InternalSession): InternalUserExtra;
144
+ protected _currentUserFromCrud(crud: NonNullable<CurrentUserCrud['Client']['Read']>, session: InternalSession): ProjectCurrentUser<ProjectId>;
145
+ protected _getOwnedAdminApp(forProjectId: string, session: InternalSession): _StackAdminAppImplIncomplete<false, string>;
146
+ get projectId(): ProjectId;
147
+ protected _isTrusted(url: string): Promise<boolean>;
148
+ get urls(): Readonly<HandlerUrls>;
149
+ protected _getCurrentUrl(): Promise<URL | null>;
150
+ protected _redirectTo(options: {
151
+ url: URL | string;
152
+ replace?: boolean;
153
+ }): Promise<void>;
154
+ protected _redirectIfTrusted(url: string, options?: RedirectToOptions): Promise<void>;
155
+ protected _redirectToHandler(handlerName: keyof HandlerUrls, options?: RedirectToOptions): Promise<void>;
156
+ redirectToSignIn(options?: RedirectToOptions): Promise<void>;
157
+ redirectToSignUp(options?: RedirectToOptions): Promise<void>;
158
+ redirectToSignOut(options?: RedirectToOptions): Promise<void>;
159
+ redirectToEmailVerification(options?: RedirectToOptions): Promise<void>;
160
+ redirectToPasswordReset(options?: RedirectToOptions): Promise<void>;
161
+ redirectToForgotPassword(options?: RedirectToOptions): Promise<void>;
162
+ redirectToHome(options?: RedirectToOptions): Promise<void>;
163
+ redirectToOAuthCallback(options?: RedirectToOptions): Promise<void>;
164
+ redirectToMagicLinkCallback(options?: RedirectToOptions): Promise<void>;
165
+ redirectToAfterSignIn(options?: RedirectToOptions): Promise<void>;
166
+ redirectToAfterSignUp(options?: RedirectToOptions): Promise<void>;
167
+ redirectToAfterSignOut(options?: RedirectToOptions): Promise<void>;
168
+ redirectToAccountSettings(options?: RedirectToOptions): Promise<void>;
169
+ redirectToError(options?: RedirectToOptions): Promise<void>;
170
+ redirectToTeamInvitation(options?: RedirectToOptions): Promise<void>;
171
+ sendForgotPasswordEmail(email: string, options?: {
172
+ callbackUrl?: string;
173
+ }): Promise<Result<undefined, KnownErrors["UserNotFound"]>>;
174
+ sendMagicLinkEmail(email: string, options?: {
175
+ callbackUrl?: string;
176
+ }): Promise<Result<{
177
+ nonce: string;
178
+ }, KnownErrors["RedirectUrlNotWhitelisted"]>>;
179
+ resetPassword(options: {
180
+ password: string;
181
+ code: string;
182
+ }): Promise<Result<undefined, KnownErrors["VerificationCodeError"]>>;
183
+ verifyPasswordResetCode(code: string): Promise<Result<undefined, KnownErrors["VerificationCodeError"]>>;
184
+ verifyTeamInvitationCode(code: string): Promise<Result<undefined, KnownErrors["VerificationCodeError"]>>;
185
+ acceptTeamInvitation(code: string): Promise<Result<undefined, KnownErrors["VerificationCodeError"]>>;
186
+ getTeamInvitationDetails(code: string): Promise<Result<{
187
+ teamDisplayName: string;
188
+ }, KnownErrors["VerificationCodeError"]>>;
189
+ verifyEmail(code: string): Promise<Result<undefined, KnownErrors["VerificationCodeError"]>>;
190
+ getUser(options: GetUserOptions<HasTokenStore> & {
191
+ or: 'redirect';
192
+ }): Promise<ProjectCurrentUser<ProjectId>>;
193
+ getUser(options: GetUserOptions<HasTokenStore> & {
194
+ or: 'throw';
195
+ }): Promise<ProjectCurrentUser<ProjectId>>;
196
+ getUser(options?: GetUserOptions<HasTokenStore>): Promise<ProjectCurrentUser<ProjectId> | null>;
197
+ protected _updateClientUser(update: UserUpdateOptions, session: InternalSession): Promise<void>;
198
+ signInWithOAuth(provider: ProviderType): Promise<void>;
199
+ /**
200
+ * @deprecated
201
+ * TODO remove
202
+ */
203
+ protected _experimentalMfa(error: KnownErrors['MultiFactorAuthenticationRequired'], session: InternalSession): Promise<{
204
+ accessToken: any;
205
+ refreshToken: any;
206
+ newUser: any;
207
+ }>;
208
+ /**
209
+ * @deprecated
210
+ * TODO remove
211
+ */
212
+ protected _catchMfaRequiredError<T, E>(callback: () => Promise<Result<T, E>>): Promise<Result<T | {
213
+ accessToken: string;
214
+ refreshToken: string;
215
+ newUser: boolean;
216
+ }, E>>;
217
+ signInWithCredential(options: {
218
+ email: string;
219
+ password: string;
220
+ noRedirect?: boolean;
221
+ }): Promise<Result<undefined, KnownErrors["EmailPasswordMismatch"] | KnownErrors["InvalidTotpCode"]>>;
222
+ signUpWithCredential(options: {
223
+ email: string;
224
+ password: string;
225
+ noRedirect?: boolean;
226
+ verificationCallbackUrl?: string;
227
+ }): Promise<Result<undefined, KnownErrors["UserEmailAlreadyExists"] | KnownErrors['PasswordRequirementsNotMet']>>;
228
+ signInWithMagicLink(code: string): Promise<Result<undefined, KnownErrors["VerificationCodeError"] | KnownErrors["InvalidTotpCode"]>>;
229
+ signInWithPasskey(): Promise<Result<undefined, KnownErrors["PasskeyAuthenticationFailed"] | KnownErrors["InvalidTotpCode"] | KnownErrors["PasskeyWebAuthnError"]>>;
230
+ callOAuthCallback(): Promise<boolean>;
231
+ protected _signOut(session: InternalSession, options?: {
232
+ redirectUrl?: URL | string;
233
+ }): Promise<void>;
234
+ signOut(options?: {
235
+ redirectUrl?: URL | string;
236
+ }): Promise<void>;
237
+ getProject(): Promise<Project>;
238
+ protected _listOwnedProjects(session: InternalSession): Promise<AdminOwnedProject[]>;
239
+ protected _createProject(session: InternalSession, newProject: AdminProjectUpdateOptions & {
240
+ displayName: string;
241
+ }): Promise<AdminOwnedProject>;
242
+ protected _refreshUser(session: InternalSession): Promise<void>;
243
+ protected _refreshSession(session: InternalSession): Promise<void>;
244
+ protected _refreshUsers(): Promise<void>;
245
+ protected _refreshProject(): Promise<void>;
246
+ protected _refreshOwnedProjects(session: InternalSession): Promise<void>;
247
+ static get [stackAppInternalsSymbol](): {
248
+ fromClientJson: <HasTokenStore extends boolean, ProjectId extends string>(json: StackClientAppJson<HasTokenStore, ProjectId>) => StackClientApp<HasTokenStore, ProjectId>;
249
+ };
250
+ get [stackAppInternalsSymbol](): {
251
+ toClientJson: () => StackClientAppJson<HasTokenStore, ProjectId>;
252
+ setCurrentUser: (userJsonPromise: Promise<CurrentUserCrud["Client"]["Read"] | null>) => void;
253
+ sendRequest: (path: string, requestOptions: RequestInit, requestType?: "client" | "server" | "admin") => Promise<Response & {
254
+ usedTokens: {
255
+ accessToken: _stackframe_stack_shared_dist_sessions.AccessToken;
256
+ refreshToken: _stackframe_stack_shared_dist_sessions.RefreshToken | null;
257
+ } | null;
258
+ }>;
259
+ };
260
+ }
261
+
262
+ declare class _StackServerAppImplIncomplete<HasTokenStore extends boolean, ProjectId extends string> extends _StackClientAppImplIncomplete<HasTokenStore, ProjectId> {
263
+ protected _interface: StackServerInterface;
264
+ private readonly _currentServerUserCache;
265
+ private readonly _serverUsersCache;
266
+ private readonly _serverUserCache;
267
+ private readonly _serverTeamsCache;
268
+ private readonly _serverTeamUserPermissionsCache;
269
+ private readonly _serverUserOAuthConnectionAccessTokensCache;
270
+ private readonly _serverUserOAuthConnectionCache;
271
+ private readonly _serverTeamMemberProfilesCache;
272
+ private readonly _serverTeamInvitationsCache;
273
+ private readonly _serverUserTeamProfileCache;
274
+ private readonly _serverContactChannelsCache;
275
+ private _updateServerUser;
276
+ protected _serverEditableTeamProfileFromCrud(crud: TeamMemberProfilesCrud['Client']['Read']): EditableTeamMemberProfile;
277
+ protected _serverContactChannelFromCrud(userId: string, crud: ContactChannelsCrud['Server']['Read']): ServerContactChannel;
278
+ constructor(options: StackServerAppConstructorOptions<HasTokenStore, ProjectId> | {
279
+ interface: StackServerInterface;
280
+ tokenStore: TokenStoreInit<HasTokenStore>;
281
+ urls: Partial<HandlerUrls> | undefined;
282
+ oauthScopesOnSignIn?: Partial<OAuthScopesOnSignIn> | undefined;
283
+ });
284
+ protected _serverUserFromCrud(crud: UsersCrud['Server']['Read']): ServerUser;
285
+ protected _serverTeamUserFromCrud(crud: TeamMemberProfilesCrud["Server"]["Read"]): ServerTeamUser;
286
+ protected _serverTeamInvitationFromCrud(crud: TeamInvitationCrud['Server']['Read']): TeamInvitation;
287
+ protected _currentUserFromCrud(crud: UsersCrud['Server']['Read'], session: InternalSession): ProjectCurrentServerUser<ProjectId>;
288
+ protected _serverTeamFromCrud(crud: TeamsCrud['Server']['Read']): ServerTeam;
289
+ createUser(options: ServerUserCreateOptions): Promise<ServerUser>;
290
+ getUser(options: GetUserOptions<HasTokenStore> & {
291
+ or: 'redirect';
292
+ }): Promise<ProjectCurrentServerUser<ProjectId>>;
293
+ getUser(options: GetUserOptions<HasTokenStore> & {
294
+ or: 'throw';
295
+ }): Promise<ProjectCurrentServerUser<ProjectId>>;
296
+ getUser(options?: GetUserOptions<HasTokenStore>): Promise<ProjectCurrentServerUser<ProjectId> | null>;
297
+ getUser(id: string): Promise<ServerUser | null>;
298
+ getServerUser(): Promise<ProjectCurrentServerUser<ProjectId> | null>;
299
+ getServerUserById(userId: string): Promise<ServerUser | null>;
300
+ listUsers(options?: ServerListUsersOptions): Promise<ServerUser[] & {
301
+ nextCursor: string | null;
302
+ }>;
303
+ _serverPermissionFromCrud(crud: TeamPermissionsCrud['Server']['Read']): AdminTeamPermission;
304
+ _serverTeamPermissionDefinitionFromCrud(crud: TeamPermissionDefinitionsCrud['Admin']['Read']): AdminTeamPermissionDefinition;
305
+ listTeams(): Promise<ServerTeam[]>;
306
+ createTeam(data: ServerTeamCreateOptions): Promise<ServerTeam>;
307
+ getTeam(teamId: string): Promise<ServerTeam | null>;
308
+ protected _refreshSession(session: InternalSession): Promise<void>;
309
+ protected _refreshUsers(): Promise<void>;
310
+ }
311
+
312
+ declare class _StackAdminAppImplIncomplete<HasTokenStore extends boolean, ProjectId extends string> extends _StackServerAppImplIncomplete<HasTokenStore, ProjectId> {
313
+ protected _interface: StackAdminInterface;
314
+ private readonly _adminProjectCache;
315
+ private readonly _apiKeysCache;
316
+ private readonly _adminEmailTemplatesCache;
317
+ private readonly _adminTeamPermissionDefinitionsCache;
318
+ private readonly _svixTokenCache;
319
+ private readonly _metricsCache;
320
+ constructor(options: StackAdminAppConstructorOptions<HasTokenStore, ProjectId>);
321
+ _adminOwnedProjectFromCrud(data: InternalProjectsCrud['Admin']['Read'], onRefresh: () => Promise<void>): AdminOwnedProject;
322
+ _adminProjectFromCrud(data: InternalProjectsCrud['Admin']['Read'], onRefresh: () => Promise<void>): AdminProject;
323
+ _adminEmailTemplateFromCrud(data: EmailTemplateCrud['Admin']['Read']): AdminEmailTemplate;
324
+ getProject(): Promise<AdminProject>;
325
+ protected _createApiKeyBaseFromCrud(data: ApiKeyBaseCrudRead): ApiKeyBase;
326
+ protected _createApiKeyFromCrud(data: ApiKeysCrud["Admin"]["Read"]): ApiKey;
327
+ protected _createApiKeyFirstViewFromCrud(data: ApiKeyCreateCrudResponse): ApiKeyFirstView;
328
+ listApiKeys(): Promise<ApiKey[]>;
329
+ createApiKey(options: ApiKeyCreateOptions): Promise<ApiKeyFirstView>;
330
+ listEmailTemplates(): Promise<AdminEmailTemplate[]>;
331
+ updateEmailTemplate(type: EmailTemplateType, data: AdminEmailTemplateUpdateOptions): Promise<void>;
332
+ resetEmailTemplate(type: EmailTemplateType): Promise<void>;
333
+ createTeamPermissionDefinition(data: AdminTeamPermissionDefinitionCreateOptions): Promise<AdminTeamPermission>;
334
+ updateTeamPermissionDefinition(permissionId: string, data: AdminTeamPermissionDefinitionUpdateOptions): Promise<void>;
335
+ deleteTeamPermissionDefinition(permissionId: string): Promise<void>;
336
+ listTeamPermissionDefinitions(): Promise<AdminTeamPermissionDefinition[]>;
337
+ protected _refreshProject(): Promise<void>;
338
+ protected _refreshApiKeys(): Promise<void>;
339
+ get [stackAppInternalsSymbol](): {
340
+ toClientJson: () => StackClientAppJson<HasTokenStore, ProjectId>;
341
+ setCurrentUser: (userJsonPromise: Promise<_stackframe_stack_shared_dist_interface_crud_current_user.CurrentUserCrud["Client"]["Read"] | null>) => void;
342
+ sendRequest: (path: string, requestOptions: RequestInit, requestType?: "client" | "server" | "admin") => Promise<Response & {
343
+ usedTokens: {
344
+ accessToken: _stackframe_stack_shared_dist_sessions.AccessToken;
345
+ refreshToken: _stackframe_stack_shared_dist_sessions.RefreshToken | null;
346
+ } | null;
347
+ }>;
348
+ };
349
+ sendTestEmail(options: {
350
+ recipientEmail: string;
351
+ emailConfig: EmailConfig;
352
+ }): Promise<Result<undefined, {
353
+ errorMessage: string;
354
+ }>>;
355
+ }
356
+
357
+ export { _StackAdminAppImplIncomplete as _, _StackClientAppImplIncomplete as a, _StackServerAppImplIncomplete as b };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts"],"sourcesContent":["//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\n\nexport * from './lib/stack-app';\n\n"],"mappings":";AAIA,cAAc;","names":[]}
1
+ {"version":3,"sources":["../../src/index.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\nexport * from './lib/stack-app';\n\n"],"mappings":";AAIA,cAAc;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/auth.ts"],"sourcesContent":["//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\n\nimport { KnownError, StackClientInterface } from \"@stackframe/stack-shared\";\nimport { InternalSession } from \"@stackframe/stack-shared/dist/sessions\";\nimport { StackAssertionError, throwErr } from \"@stackframe/stack-shared/dist/utils/errors\";\nimport { neverResolve } from \"@stackframe/stack-shared/dist/utils/promises\";\nimport { Result } from \"@stackframe/stack-shared/dist/utils/results\";\nimport { deindent } from \"@stackframe/stack-shared/dist/utils/strings\";\nimport { constructRedirectUrl } from \"../utils/url\";\nimport { consumeVerifierAndStateCookie, saveVerifierAndState } from \"./cookie\";\n\nexport async function signInWithOAuth(\n iface: StackClientInterface,\n options: {\n provider: string,\n redirectUrl: string,\n errorRedirectUrl: string,\n providerScope?: string,\n }\n) {\n const { codeChallenge, state } = await saveVerifierAndState();\n const location = await iface.getOAuthUrl({\n provider: options.provider,\n redirectUrl: constructRedirectUrl(options.redirectUrl),\n errorRedirectUrl: constructRedirectUrl(options.errorRedirectUrl),\n codeChallenge,\n state,\n type: \"authenticate\",\n providerScope: options.providerScope,\n });\n window.location.assign(location);\n await neverResolve();\n}\n\nexport async function addNewOAuthProviderOrScope(\n iface: StackClientInterface,\n options: {\n provider: string,\n redirectUrl: string,\n errorRedirectUrl: string,\n providerScope?: string,\n },\n session: InternalSession,\n) {\n const { codeChallenge, state } = await saveVerifierAndState();\n const location = await iface.getOAuthUrl({\n provider: options.provider,\n redirectUrl: constructRedirectUrl(options.redirectUrl),\n errorRedirectUrl: constructRedirectUrl(options.errorRedirectUrl),\n afterCallbackRedirectUrl: constructRedirectUrl(window.location.href),\n codeChallenge,\n state,\n type: \"link\",\n session,\n providerScope: options.providerScope,\n });\n window.location.assign(location);\n await neverResolve();\n}\n\n/**\n * Checks if the current URL has the query parameters for an OAuth callback, and if so, removes them.\n *\n * Must be synchronous for the logic in callOAuthCallback to work without race conditions.\n */\nfunction consumeOAuthCallbackQueryParams() {\n const requiredParams = [\"code\", \"state\"];\n const originalUrl = new URL(window.location.href);\n for (const param of requiredParams) {\n if (!originalUrl.searchParams.has(param)) {\n console.warn(new Error(`Missing required query parameter on OAuth callback: ${param}. Maybe you opened or reloaded the oauth-callback page from your history?`));\n return null;\n }\n }\n\n const expectedState = originalUrl.searchParams.get(\"state\") ?? throwErr(\"This should never happen; isn't state required above?\");\n const cookieResult = consumeVerifierAndStateCookie(expectedState);\n\n if (!cookieResult) {\n // If the state can't be found in the cookies, then the callback wasn't meant for us.\n // Maybe the website uses another OAuth library?\n console.warn(deindent`\n Stack found an outer OAuth callback state in the query parameters, but not in cookies.\n \n This could have multiple reasons:\n - The cookie expired, because the OAuth flow took too long.\n - The user's browser deleted the cookie, either manually or because of a very strict cookie policy.\n - The cookie was already consumed by this page, and the user already logged in.\n - You are using another OAuth client library with the same callback URL as Stack.\n - The user opened the OAuth callback page from their history.\n\n Either way, it is probably safe to ignore this warning unless you are debugging an OAuth issue.\n `);\n return null;\n }\n\n\n const newUrl = new URL(originalUrl);\n for (const param of requiredParams) {\n newUrl.searchParams.delete(param);\n }\n\n // let's get rid of the authorization code in the history as we\n // don't redirect to `redirectUrl` if there's a validation error\n // (as the redirectUrl might be malicious!).\n //\n // We use history.replaceState instead of location.assign(...) to\n // prevent an unnecessary reload\n window.history.replaceState({}, \"\", newUrl.toString());\n\n return {\n originalUrl,\n codeVerifier: cookieResult.codeVerifier,\n state: expectedState,\n };\n}\n\nexport async function callOAuthCallback(\n iface: StackClientInterface,\n redirectUrl: string,\n) {\n // note: this part of the function (until the return) needs\n // to be synchronous, to prevent race conditions when\n // callOAuthCallback is called multiple times in parallel\n const consumed = consumeOAuthCallbackQueryParams();\n if (!consumed) return Result.ok(undefined);\n\n // the rest can be asynchronous (we now know that we are the\n // intended recipient of the callback, and the only instance\n // of callOAuthCallback that's running)\n try {\n return Result.ok(await iface.callOAuthCallback({\n oauthParams: consumed.originalUrl.searchParams,\n redirectUri: constructRedirectUrl(redirectUrl),\n codeVerifier: consumed.codeVerifier,\n state: consumed.state,\n }));\n } catch (e) {\n if (e instanceof KnownError) {\n throw e;\n }\n throw new StackAssertionError(\"Error signing in during OAuth callback. Please try again.\", { cause: e });\n }\n}\n"],"mappings":";AAIA,SAAS,kBAAwC;AAEjD,SAAS,qBAAqB,gBAAgB;AAC9C,SAAS,oBAAoB;AAC7B,SAAS,cAAc;AACvB,SAAS,gBAAgB;AACzB,SAAS,4BAA4B;AACrC,SAAS,+BAA+B,4BAA4B;AAEpE,eAAsB,gBACpB,OACA,SAMA;AACA,QAAM,EAAE,eAAe,MAAM,IAAI,MAAM,qBAAqB;AAC5D,QAAM,WAAW,MAAM,MAAM,YAAY;AAAA,IACvC,UAAU,QAAQ;AAAA,IAClB,aAAa,qBAAqB,QAAQ,WAAW;AAAA,IACrD,kBAAkB,qBAAqB,QAAQ,gBAAgB;AAAA,IAC/D;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN,eAAe,QAAQ;AAAA,EACzB,CAAC;AACD,SAAO,SAAS,OAAO,QAAQ;AAC/B,QAAM,aAAa;AACrB;AAEA,eAAsB,2BACpB,OACA,SAMA,SACA;AACA,QAAM,EAAE,eAAe,MAAM,IAAI,MAAM,qBAAqB;AAC5D,QAAM,WAAW,MAAM,MAAM,YAAY;AAAA,IACvC,UAAU,QAAQ;AAAA,IAClB,aAAa,qBAAqB,QAAQ,WAAW;AAAA,IACrD,kBAAkB,qBAAqB,QAAQ,gBAAgB;AAAA,IAC/D,0BAA0B,qBAAqB,OAAO,SAAS,IAAI;AAAA,IACnE;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN;AAAA,IACA,eAAe,QAAQ;AAAA,EACzB,CAAC;AACD,SAAO,SAAS,OAAO,QAAQ;AAC/B,QAAM,aAAa;AACrB;AAOA,SAAS,kCAAkC;AACzC,QAAM,iBAAiB,CAAC,QAAQ,OAAO;AACvC,QAAM,cAAc,IAAI,IAAI,OAAO,SAAS,IAAI;AAChD,aAAW,SAAS,gBAAgB;AAClC,QAAI,CAAC,YAAY,aAAa,IAAI,KAAK,GAAG;AACxC,cAAQ,KAAK,IAAI,MAAM,uDAAuD,KAAK,2EAA2E,CAAC;AAC/J,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,gBAAgB,YAAY,aAAa,IAAI,OAAO,KAAK,SAAS,uDAAuD;AAC/H,QAAM,eAAe,8BAA8B,aAAa;AAEhE,MAAI,CAAC,cAAc;AAGjB,YAAQ,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAWZ;AACD,WAAO;AAAA,EACT;AAGA,QAAM,SAAS,IAAI,IAAI,WAAW;AAClC,aAAW,SAAS,gBAAgB;AAClC,WAAO,aAAa,OAAO,KAAK;AAAA,EAClC;AAQA,SAAO,QAAQ,aAAa,CAAC,GAAG,IAAI,OAAO,SAAS,CAAC;AAErD,SAAO;AAAA,IACL;AAAA,IACA,cAAc,aAAa;AAAA,IAC3B,OAAO;AAAA,EACT;AACF;AAEA,eAAsB,kBACpB,OACA,aACA;AAIA,QAAM,WAAW,gCAAgC;AACjD,MAAI,CAAC,SAAU,QAAO,OAAO,GAAG,MAAS;AAKzC,MAAI;AACF,WAAO,OAAO,GAAG,MAAM,MAAM,kBAAkB;AAAA,MAC7C,aAAa,SAAS,YAAY;AAAA,MAClC,aAAa,qBAAqB,WAAW;AAAA,MAC7C,cAAc,SAAS;AAAA,MACvB,OAAO,SAAS;AAAA,IAClB,CAAC,CAAC;AAAA,EACJ,SAAS,GAAG;AACV,QAAI,aAAa,YAAY;AAC3B,YAAM;AAAA,IACR;AACA,UAAM,IAAI,oBAAoB,6DAA6D,EAAE,OAAO,EAAE,CAAC;AAAA,EACzG;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../src/lib/auth.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\nimport { KnownError, StackClientInterface } from \"@stackframe/stack-shared\";\nimport { InternalSession } from \"@stackframe/stack-shared/dist/sessions\";\nimport { StackAssertionError, throwErr } from \"@stackframe/stack-shared/dist/utils/errors\";\nimport { neverResolve } from \"@stackframe/stack-shared/dist/utils/promises\";\nimport { Result } from \"@stackframe/stack-shared/dist/utils/results\";\nimport { deindent } from \"@stackframe/stack-shared/dist/utils/strings\";\nimport { constructRedirectUrl } from \"../utils/url\";\nimport { consumeVerifierAndStateCookie, saveVerifierAndState } from \"./cookie\";\n\nexport async function signInWithOAuth(\n iface: StackClientInterface,\n options: {\n provider: string,\n redirectUrl: string,\n errorRedirectUrl: string,\n providerScope?: string,\n }\n) {\n const { codeChallenge, state } = await saveVerifierAndState();\n const location = await iface.getOAuthUrl({\n provider: options.provider,\n redirectUrl: constructRedirectUrl(options.redirectUrl),\n errorRedirectUrl: constructRedirectUrl(options.errorRedirectUrl),\n codeChallenge,\n state,\n type: \"authenticate\",\n providerScope: options.providerScope,\n });\n window.location.assign(location);\n await neverResolve();\n}\n\nexport async function addNewOAuthProviderOrScope(\n iface: StackClientInterface,\n options: {\n provider: string,\n redirectUrl: string,\n errorRedirectUrl: string,\n providerScope?: string,\n },\n session: InternalSession,\n) {\n const { codeChallenge, state } = await saveVerifierAndState();\n const location = await iface.getOAuthUrl({\n provider: options.provider,\n redirectUrl: constructRedirectUrl(options.redirectUrl),\n errorRedirectUrl: constructRedirectUrl(options.errorRedirectUrl),\n afterCallbackRedirectUrl: constructRedirectUrl(window.location.href),\n codeChallenge,\n state,\n type: \"link\",\n session,\n providerScope: options.providerScope,\n });\n window.location.assign(location);\n await neverResolve();\n}\n\n/**\n * Checks if the current URL has the query parameters for an OAuth callback, and if so, removes them.\n *\n * Must be synchronous for the logic in callOAuthCallback to work without race conditions.\n */\nfunction consumeOAuthCallbackQueryParams() {\n const requiredParams = [\"code\", \"state\"];\n const originalUrl = new URL(window.location.href);\n for (const param of requiredParams) {\n if (!originalUrl.searchParams.has(param)) {\n console.warn(new Error(`Missing required query parameter on OAuth callback: ${param}. Maybe you opened or reloaded the oauth-callback page from your history?`));\n return null;\n }\n }\n\n const expectedState = originalUrl.searchParams.get(\"state\") ?? throwErr(\"This should never happen; isn't state required above?\");\n const cookieResult = consumeVerifierAndStateCookie(expectedState);\n\n if (!cookieResult) {\n // If the state can't be found in the cookies, then the callback wasn't meant for us.\n // Maybe the website uses another OAuth library?\n console.warn(deindent`\n Stack found an outer OAuth callback state in the query parameters, but not in cookies.\n \n This could have multiple reasons:\n - The cookie expired, because the OAuth flow took too long.\n - The user's browser deleted the cookie, either manually or because of a very strict cookie policy.\n - The cookie was already consumed by this page, and the user already logged in.\n - You are using another OAuth client library with the same callback URL as Stack.\n - The user opened the OAuth callback page from their history.\n\n Either way, it is probably safe to ignore this warning unless you are debugging an OAuth issue.\n `);\n return null;\n }\n\n\n const newUrl = new URL(originalUrl);\n for (const param of requiredParams) {\n newUrl.searchParams.delete(param);\n }\n\n // let's get rid of the authorization code in the history as we\n // don't redirect to `redirectUrl` if there's a validation error\n // (as the redirectUrl might be malicious!).\n //\n // We use history.replaceState instead of location.assign(...) to\n // prevent an unnecessary reload\n window.history.replaceState({}, \"\", newUrl.toString());\n\n return {\n originalUrl,\n codeVerifier: cookieResult.codeVerifier,\n state: expectedState,\n };\n}\n\nexport async function callOAuthCallback(\n iface: StackClientInterface,\n redirectUrl: string,\n) {\n // note: this part of the function (until the return) needs\n // to be synchronous, to prevent race conditions when\n // callOAuthCallback is called multiple times in parallel\n const consumed = consumeOAuthCallbackQueryParams();\n if (!consumed) return Result.ok(undefined);\n\n // the rest can be asynchronous (we now know that we are the\n // intended recipient of the callback, and the only instance\n // of callOAuthCallback that's running)\n try {\n return Result.ok(await iface.callOAuthCallback({\n oauthParams: consumed.originalUrl.searchParams,\n redirectUri: constructRedirectUrl(redirectUrl),\n codeVerifier: consumed.codeVerifier,\n state: consumed.state,\n }));\n } catch (e) {\n if (e instanceof KnownError) {\n throw e;\n }\n throw new StackAssertionError(\"Error signing in during OAuth callback. Please try again.\", { cause: e });\n }\n}\n"],"mappings":";AAIA,SAAS,kBAAwC;AAEjD,SAAS,qBAAqB,gBAAgB;AAC9C,SAAS,oBAAoB;AAC7B,SAAS,cAAc;AACvB,SAAS,gBAAgB;AACzB,SAAS,4BAA4B;AACrC,SAAS,+BAA+B,4BAA4B;AAEpE,eAAsB,gBACpB,OACA,SAMA;AACA,QAAM,EAAE,eAAe,MAAM,IAAI,MAAM,qBAAqB;AAC5D,QAAM,WAAW,MAAM,MAAM,YAAY;AAAA,IACvC,UAAU,QAAQ;AAAA,IAClB,aAAa,qBAAqB,QAAQ,WAAW;AAAA,IACrD,kBAAkB,qBAAqB,QAAQ,gBAAgB;AAAA,IAC/D;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN,eAAe,QAAQ;AAAA,EACzB,CAAC;AACD,SAAO,SAAS,OAAO,QAAQ;AAC/B,QAAM,aAAa;AACrB;AAEA,eAAsB,2BACpB,OACA,SAMA,SACA;AACA,QAAM,EAAE,eAAe,MAAM,IAAI,MAAM,qBAAqB;AAC5D,QAAM,WAAW,MAAM,MAAM,YAAY;AAAA,IACvC,UAAU,QAAQ;AAAA,IAClB,aAAa,qBAAqB,QAAQ,WAAW;AAAA,IACrD,kBAAkB,qBAAqB,QAAQ,gBAAgB;AAAA,IAC/D,0BAA0B,qBAAqB,OAAO,SAAS,IAAI;AAAA,IACnE;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN;AAAA,IACA,eAAe,QAAQ;AAAA,EACzB,CAAC;AACD,SAAO,SAAS,OAAO,QAAQ;AAC/B,QAAM,aAAa;AACrB;AAOA,SAAS,kCAAkC;AACzC,QAAM,iBAAiB,CAAC,QAAQ,OAAO;AACvC,QAAM,cAAc,IAAI,IAAI,OAAO,SAAS,IAAI;AAChD,aAAW,SAAS,gBAAgB;AAClC,QAAI,CAAC,YAAY,aAAa,IAAI,KAAK,GAAG;AACxC,cAAQ,KAAK,IAAI,MAAM,uDAAuD,KAAK,2EAA2E,CAAC;AAC/J,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,gBAAgB,YAAY,aAAa,IAAI,OAAO,KAAK,SAAS,uDAAuD;AAC/H,QAAM,eAAe,8BAA8B,aAAa;AAEhE,MAAI,CAAC,cAAc;AAGjB,YAAQ,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAWZ;AACD,WAAO;AAAA,EACT;AAGA,QAAM,SAAS,IAAI,IAAI,WAAW;AAClC,aAAW,SAAS,gBAAgB;AAClC,WAAO,aAAa,OAAO,KAAK;AAAA,EAClC;AAQA,SAAO,QAAQ,aAAa,CAAC,GAAG,IAAI,OAAO,SAAS,CAAC;AAErD,SAAO;AAAA,IACL;AAAA,IACA,cAAc,aAAa;AAAA,IAC3B,OAAO;AAAA,EACT;AACF;AAEA,eAAsB,kBACpB,OACA,aACA;AAIA,QAAM,WAAW,gCAAgC;AACjD,MAAI,CAAC,SAAU,QAAO,OAAO,GAAG,MAAS;AAKzC,MAAI;AACF,WAAO,OAAO,GAAG,MAAM,MAAM,kBAAkB;AAAA,MAC7C,aAAa,SAAS,YAAY;AAAA,MAClC,aAAa,qBAAqB,WAAW;AAAA,MAC7C,cAAc,SAAS;AAAA,MACvB,OAAO,SAAS;AAAA,IAClB,CAAC,CAAC;AAAA,EACJ,SAAS,GAAG;AACV,QAAI,aAAa,YAAY;AAC3B,YAAM;AAAA,IACR;AACA,UAAM,IAAI,oBAAoB,6DAA6D,EAAE,OAAO,EAAE,CAAC;AAAA,EACzG;AACF;","names":[]}
@@ -136,15 +136,12 @@ function ensureClient() {
136
136
  throw new Error("cookieClient functions can only be called in a browser environment, yet window is undefined");
137
137
  }
138
138
  }
139
- async function createEmptyCookieHelper() {
139
+ async function createPlaceholderCookieHelper() {
140
140
  function throwError() {
141
- throw new StackAssertionError("Empty cookie helper is just a placeholder. This should never be called");
141
+ throw new StackAssertionError("Throwing cookie helper is just a placeholder. This should never be called");
142
142
  }
143
143
  return {
144
- get: () => {
145
- throwError();
146
- return null;
147
- },
144
+ get: throwError,
148
145
  set: throwError,
149
146
  setOrDelete: throwError,
150
147
  delete: throwError
@@ -154,7 +151,7 @@ async function createCookieHelper() {
154
151
  if (isBrowserLike()) {
155
152
  return createBrowserCookieHelper();
156
153
  } else {
157
- return await createEmptyCookieHelper();
154
+ return await createPlaceholderCookieHelper();
158
155
  }
159
156
  }
160
157
  function createBrowserCookieHelper() {
@@ -230,7 +227,7 @@ export {
230
227
  consumeVerifierAndStateCookie,
231
228
  createBrowserCookieHelper,
232
229
  createCookieHelper,
233
- createEmptyCookieHelper,
230
+ createPlaceholderCookieHelper,
234
231
  deleteCookie,
235
232
  deleteCookieClient,
236
233
  getCookie,