@stackframe/stack 2.7.28 → 2.7.30

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 (26) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.js +52 -8
  3. package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.js.map +1 -1
  4. package/dist/esm/lib/stack-app/apps/implementations/common.js +6 -6
  5. package/dist/esm/lib/stack-app/apps/implementations/common.js.map +1 -1
  6. package/dist/esm/lib/stack-app/apps/implementations/server-app-impl.js +27 -4
  7. package/dist/esm/lib/stack-app/apps/implementations/server-app-impl.js.map +1 -1
  8. package/dist/esm/lib/stack-app/apps/interfaces/client-app.js.map +1 -1
  9. package/dist/esm/lib/stack-app/apps/interfaces/server-app.js.map +1 -1
  10. package/dist/esm/lib/stack-app/common.js.map +1 -1
  11. package/dist/esm/providers/stack-provider.js +1 -1
  12. package/dist/esm/providers/stack-provider.js.map +1 -1
  13. package/dist/index.d.mts +17 -3
  14. package/dist/index.d.ts +17 -3
  15. package/dist/lib/stack-app/apps/implementations/client-app-impl.js +52 -8
  16. package/dist/lib/stack-app/apps/implementations/client-app-impl.js.map +1 -1
  17. package/dist/lib/stack-app/apps/implementations/common.js +6 -6
  18. package/dist/lib/stack-app/apps/implementations/common.js.map +1 -1
  19. package/dist/lib/stack-app/apps/implementations/server-app-impl.js +26 -3
  20. package/dist/lib/stack-app/apps/implementations/server-app-impl.js.map +1 -1
  21. package/dist/lib/stack-app/apps/interfaces/client-app.js.map +1 -1
  22. package/dist/lib/stack-app/apps/interfaces/server-app.js.map +1 -1
  23. package/dist/lib/stack-app/common.js.map +1 -1
  24. package/dist/providers/stack-provider.js +1 -1
  25. package/dist/providers/stack-provider.js.map +1 -1
  26. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../src/lib/stack-app/apps/implementations/common.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\nimport { InternalSession } from \"@stackframe/stack-shared/dist/sessions\";\nimport { AsyncCache } from \"@stackframe/stack-shared/dist/utils/caches\";\nimport { isBrowserLike } from \"@stackframe/stack-shared/dist/utils/env\";\nimport { StackAssertionError, concatStacktraces, throwErr } from \"@stackframe/stack-shared/dist/utils/errors\";\nimport { filterUndefined } from \"@stackframe/stack-shared/dist/utils/objects\";\nimport { ReactPromise } from \"@stackframe/stack-shared/dist/utils/promises\";\nimport { suspendIfSsr } from \"@stackframe/stack-shared/dist/utils/react\";\nimport { Result } from \"@stackframe/stack-shared/dist/utils/results\";\nimport { Store } from \"@stackframe/stack-shared/dist/utils/stores\";\nimport React, { useCallback } from \"react\"; // THIS_LINE_PLATFORM react-like\nimport { HandlerUrls } from \"../../common\";\n\n// hack to make sure process is defined in non-node environments\n\nexport const clientVersion = \"js @stackframe/stack@2.7.28\";\nif (clientVersion.startsWith(\"STACK_COMPILE_TIME\")) {\n throw new StackAssertionError(\"Client version was not replaced. Something went wrong during build!\");\n}\n\n\nexport const createCache = <D extends any[], T>(fetcher: (dependencies: D) => Promise<T>) => {\n return new AsyncCache<D, Result<T>>(\n async (dependencies) => await Result.fromThrowingAsync(async () => await fetcher(dependencies)),\n {},\n );\n};\n\nexport const createCacheBySession = <D extends any[], T>(fetcher: (session: InternalSession, extraDependencies: D) => Promise<T> ) => {\n return new AsyncCache<[InternalSession, ...D], Result<T>>(\n async ([session, ...extraDependencies]) => await Result.fromThrowingAsync(async () => await fetcher(session, extraDependencies)),\n {\n onSubscribe: ([session], refresh) => {\n const handler = session.onInvalidate(() => refresh());\n return () => handler.unsubscribe();\n },\n },\n );\n};\n\nexport function getUrls(partial: Partial<HandlerUrls>): HandlerUrls {\n const handler = partial.handler ?? \"/handler\";\n const home = partial.home ?? \"/\";\n const afterSignIn = partial.afterSignIn ?? home;\n return {\n handler,\n signIn: `${handler}/sign-in`,\n afterSignIn: home,\n signUp: `${handler}/sign-up`,\n afterSignUp: afterSignIn,\n signOut: `${handler}/sign-out`,\n afterSignOut: home,\n emailVerification: `${handler}/email-verification`,\n passwordReset: `${handler}/password-reset`,\n forgotPassword: `${handler}/forgot-password`,\n oauthCallback: `${handler}/oauth-callback`,\n magicLinkCallback: `${handler}/magic-link-callback`,\n home: home,\n accountSettings: `${handler}/account-settings`,\n error: `${handler}/error`,\n teamInvitation: `${handler}/team-invitation`,\n ...filterUndefined(partial),\n };\n}\n\nexport function getDefaultProjectId() {\n return process.env.NEXT_PUBLIC_STACK_PROJECT_ID || throwErr(new Error(\"Welcome to Stack Auth! It seems that you haven't provided a project ID. Please create a project on the Stack dashboard at https://app.stack-auth.com and put it in the NEXT_PUBLIC_STACK_PROJECT_ID environment variable.\"));\n}\n\nexport function getDefaultPublishableClientKey() {\n return process.env.NEXT_PUBLIC_STACK_PUBLISHABLE_CLIENT_KEY || throwErr(new Error(\"Welcome to Stack Auth! It seems that you haven't provided a publishable client key. Please create an API key for your project on the Stack dashboard at https://app.stack-auth.com and copy your publishable client key into the NEXT_PUBLIC_STACK_PUBLISHABLE_CLIENT_KEY environment variable.\"));\n}\n\nexport function getDefaultSecretServerKey() {\n return process.env.STACK_SECRET_SERVER_KEY || throwErr(new Error(\"No secret server key provided. Please copy your key from the Stack dashboard and put it in the STACK_SECRET_SERVER_KEY environment variable.\"));\n}\n\nexport function getDefaultSuperSecretAdminKey() {\n return process.env.STACK_SUPER_SECRET_ADMIN_KEY || throwErr(new Error(\"No super secret admin key provided. Please copy your key from the Stack dashboard and put it in the STACK_SUPER_SECRET_ADMIN_KEY environment variable.\"));\n}\n\nexport function getDefaultExtraRequestHeaders() {\n return JSON.parse(process.env.NEXT_PUBLIC_STACK_EXTRA_REQUEST_HEADERS || '{}');\n}\n\n/**\n * Returns the base URL for the Stack API.\n *\n * The URL can be specified in several ways, in order of precedence:\n * 1. Directly through userSpecifiedBaseUrl parameter as string or browser/server object\n * 2. Through environment variables:\n * - Browser: NEXT_PUBLIC_BROWSER_STACK_API_URL\n * - Server: NEXT_PUBLIC_SERVER_STACK_API_URL\n * - Fallback: NEXT_PUBLIC_STACK_API_URL or NEXT_PUBLIC_STACK_URL\n * 3. Default base URL if none of the above are specified\n *\n * The function also ensures the URL doesn't end with a trailing slash\n * by removing it if present.\n *\n * @param userSpecifiedBaseUrl - Optional URL override as string or {browser, server} object\n * @returns The configured base URL without trailing slash\n\n */\nexport function getBaseUrl(userSpecifiedBaseUrl: string | { browser: string, server: string } | undefined) {\n let url;\n if (userSpecifiedBaseUrl) {\n if (typeof userSpecifiedBaseUrl === \"string\") {\n url = userSpecifiedBaseUrl;\n } else {\n if (isBrowserLike()) {\n url = userSpecifiedBaseUrl.browser;\n } else {\n url = userSpecifiedBaseUrl.server;\n }\n }\n } else {\n if (isBrowserLike()) {\n url = process.env.NEXT_PUBLIC_BROWSER_STACK_API_URL;\n } else {\n url = process.env.NEXT_PUBLIC_SERVER_STACK_API_URL;\n }\n url = url || process.env.NEXT_PUBLIC_STACK_API_URL || process.env.NEXT_PUBLIC_STACK_URL || defaultBaseUrl;\n }\n\n return url.endsWith('/') ? url.slice(0, -1) : url;\n}\nconst defaultBaseUrl = \"https://api.stack-auth.com\";\n\nexport type TokenObject = {\n accessToken: string | null,\n refreshToken: string | null,\n};\n\nexport function createEmptyTokenStore() {\n return new Store<TokenObject>({\n refreshToken: null,\n accessToken: null,\n });\n}\n\n\nconst cachePromiseByComponentId = new Map<string, ReactPromise<Result<unknown>>>();\nexport function useAsyncCache<D extends any[], T>(cache: AsyncCache<D, Result<T>>, dependencies: D, caller: string): T {\n // we explicitly don't want to run this hook in SSR\n suspendIfSsr(caller);\n\n const id = React.useId();\n\n const subscribe = useCallback((cb: () => void) => {\n const { unsubscribe } = cache.onStateChange(dependencies, () => {\n cachePromiseByComponentId.delete(id);\n cb();\n });\n return unsubscribe;\n }, [cache, ...dependencies]);\n const getSnapshot = useCallback(() => {\n // React checks whether a promise passed to `use` is still the same as the previous one by comparing the reference.\n // If we didn't cache here, this wouldn't work because the promise would be recreated every time the value changes.\n if (!cachePromiseByComponentId.has(id)) {\n cachePromiseByComponentId.set(id, cache.getOrWait(dependencies, \"read-write\"));\n }\n return cachePromiseByComponentId.get(id) as ReactPromise<Result<T>>;\n }, [cache, ...dependencies]);\n\n // note: we must use React.useSyncExternalStore instead of importing the function directly, as it will otherwise\n // throw an error (\"can't import useSyncExternalStore from the server\")\n const promise = React.useSyncExternalStore(\n subscribe,\n getSnapshot,\n () => throwErr(new Error(\"getServerSnapshot should never be called in useAsyncCache because we restrict to CSR earlier\"))\n );\n\n const result = React.use(promise);\n if (result.status === \"error\") {\n const error = result.error;\n if (error instanceof Error && !(error as any).__stackHasConcatenatedStacktraces) {\n concatStacktraces(error, new Error());\n (error as any).__stackHasConcatenatedStacktraces = true;\n }\n throw error;\n }\n return result.data;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../../../src/lib/stack-app/apps/implementations/common.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\nimport { InternalSession } from \"@stackframe/stack-shared/dist/sessions\";\nimport { AsyncCache } from \"@stackframe/stack-shared/dist/utils/caches\";\nimport { isBrowserLike } from \"@stackframe/stack-shared/dist/utils/env\";\nimport { StackAssertionError, concatStacktraces, throwErr } from \"@stackframe/stack-shared/dist/utils/errors\";\nimport { filterUndefined } from \"@stackframe/stack-shared/dist/utils/objects\";\nimport { ReactPromise } from \"@stackframe/stack-shared/dist/utils/promises\";\nimport { suspendIfSsr } from \"@stackframe/stack-shared/dist/utils/react\";\nimport { Result } from \"@stackframe/stack-shared/dist/utils/results\";\nimport { Store } from \"@stackframe/stack-shared/dist/utils/stores\";\nimport React, { useCallback } from \"react\"; // THIS_LINE_PLATFORM react-like\nimport { HandlerUrls } from \"../../common\";\n\n// hack to make sure process is defined in non-node environments\n\nexport const clientVersion = \"js @stackframe/stack@2.7.30\";\nif (clientVersion.startsWith(\"STACK_COMPILE_TIME\")) {\n throw new StackAssertionError(\"Client version was not replaced. Something went wrong during build!\");\n}\n\n\nexport const createCache = <D extends any[], T>(fetcher: (dependencies: D) => Promise<T>) => {\n return new AsyncCache<D, Result<T>>(\n async (dependencies) => await Result.fromThrowingAsync(async () => await fetcher(dependencies)),\n {},\n );\n};\n\nexport const createCacheBySession = <D extends any[], T>(fetcher: (session: InternalSession, extraDependencies: D) => Promise<T> ) => {\n return new AsyncCache<[InternalSession, ...D], Result<T>>(\n async ([session, ...extraDependencies]) => await Result.fromThrowingAsync(async () => await fetcher(session, extraDependencies)),\n {\n onSubscribe: ([session], refresh) => {\n const handler = session.onInvalidate(() => refresh());\n return () => handler.unsubscribe();\n },\n },\n );\n};\n\nexport function getUrls(partial: Partial<HandlerUrls>): HandlerUrls {\n const handler = partial.handler ?? \"/handler\";\n const home = partial.home ?? \"/\";\n const afterSignIn = partial.afterSignIn ?? home;\n return {\n handler,\n signIn: `${handler}/sign-in`,\n afterSignIn: home,\n signUp: `${handler}/sign-up`,\n afterSignUp: afterSignIn,\n signOut: `${handler}/sign-out`,\n afterSignOut: home,\n emailVerification: `${handler}/email-verification`,\n passwordReset: `${handler}/password-reset`,\n forgotPassword: `${handler}/forgot-password`,\n oauthCallback: `${handler}/oauth-callback`,\n magicLinkCallback: `${handler}/magic-link-callback`,\n home: home,\n accountSettings: `${handler}/account-settings`,\n error: `${handler}/error`,\n teamInvitation: `${handler}/team-invitation`,\n ...filterUndefined(partial),\n };\n}\n\nexport function getDefaultProjectId() {\n return process.env.NEXT_PUBLIC_STACK_PROJECT_ID || throwErr(new Error(\"Welcome to Stack Auth! It seems that you haven't provided a project ID. Please create a project on the Stack dashboard at https://app.stack-auth.com and put it in the NEXT_PUBLIC_STACK_PROJECT_ID environment variable.\"));\n}\n\nexport function getDefaultPublishableClientKey() {\n return process.env.NEXT_PUBLIC_STACK_PUBLISHABLE_CLIENT_KEY || throwErr(new Error(\"Welcome to Stack Auth! It seems that you haven't provided a publishable client key. Please create an API key for your project on the Stack dashboard at https://app.stack-auth.com and copy your publishable client key into the NEXT_PUBLIC_STACK_PUBLISHABLE_CLIENT_KEY environment variable.\"));\n}\n\nexport function getDefaultSecretServerKey() {\n return process.env.STACK_SECRET_SERVER_KEY || throwErr(new Error(\"No secret server key provided. Please copy your key from the Stack dashboard and put it in the STACK_SECRET_SERVER_KEY environment variable.\"));\n}\n\nexport function getDefaultSuperSecretAdminKey() {\n return process.env.STACK_SUPER_SECRET_ADMIN_KEY || throwErr(new Error(\"No super secret admin key provided. Please copy your key from the Stack dashboard and put it in the STACK_SUPER_SECRET_ADMIN_KEY environment variable.\"));\n}\n\nexport function getDefaultExtraRequestHeaders() {\n return JSON.parse(process.env.NEXT_PUBLIC_STACK_EXTRA_REQUEST_HEADERS || '{}');\n}\n\n/**\n * Returns the base URL for the Stack API.\n *\n * The URL can be specified in several ways, in order of precedence:\n * 1. Directly through userSpecifiedBaseUrl parameter as string or browser/server object\n * 2. Through environment variables:\n * - Browser: NEXT_PUBLIC_BROWSER_STACK_API_URL\n * - Server: NEXT_PUBLIC_SERVER_STACK_API_URL\n * - Fallback: NEXT_PUBLIC_STACK_API_URL or NEXT_PUBLIC_STACK_URL\n * 3. Default base URL if none of the above are specified\n *\n * The function also ensures the URL doesn't end with a trailing slash\n * by removing it if present.\n *\n * @param userSpecifiedBaseUrl - Optional URL override as string or {browser, server} object\n * @returns The configured base URL without trailing slash\n\n */\nexport function getBaseUrl(userSpecifiedBaseUrl: string | { browser: string, server: string } | undefined) {\n let url;\n if (userSpecifiedBaseUrl) {\n if (typeof userSpecifiedBaseUrl === \"string\") {\n url = userSpecifiedBaseUrl;\n } else {\n if (isBrowserLike()) {\n url = userSpecifiedBaseUrl.browser;\n } else {\n url = userSpecifiedBaseUrl.server;\n }\n }\n } else {\n if (isBrowserLike()) {\n url = process.env.NEXT_PUBLIC_BROWSER_STACK_API_URL;\n } else {\n url = process.env.NEXT_PUBLIC_SERVER_STACK_API_URL;\n }\n url = url || process.env.NEXT_PUBLIC_STACK_API_URL || process.env.NEXT_PUBLIC_STACK_URL || defaultBaseUrl;\n }\n\n return url.endsWith('/') ? url.slice(0, -1) : url;\n}\nconst defaultBaseUrl = \"https://api.stack-auth.com\";\n\nexport type TokenObject = {\n accessToken: string | null,\n refreshToken: string | null,\n};\n\nexport function createEmptyTokenStore() {\n return new Store<TokenObject>({\n refreshToken: null,\n accessToken: null,\n });\n}\n\n\nconst cachePromiseByHookId = new Map<string, ReactPromise<Result<unknown>>>();\nexport function useAsyncCache<D extends any[], T>(cache: AsyncCache<D, Result<T>>, dependencies: D, caller: string): T {\n // we explicitly don't want to run this hook in SSR\n suspendIfSsr(caller);\n\n const id = React.useId();\n\n const subscribe = useCallback((cb: () => void) => {\n const { unsubscribe } = cache.onStateChange(dependencies, () => {\n cachePromiseByHookId.delete(id);\n cb();\n });\n return unsubscribe;\n }, [cache, ...dependencies]);\n const getSnapshot = useCallback(() => {\n // React checks whether a promise passed to `use` is still the same as the previous one by comparing the reference.\n // If we didn't cache here, this wouldn't work because the promise would be recreated every time the value changes.\n if (!cachePromiseByHookId.has(id)) {\n cachePromiseByHookId.set(id, cache.getOrWait(dependencies, \"read-write\"));\n }\n return cachePromiseByHookId.get(id) as ReactPromise<Result<T>>;\n }, [cache, ...dependencies]);\n\n // note: we must use React.useSyncExternalStore instead of importing the function directly, as it will otherwise\n // throw an error on Next.js (\"can't import useSyncExternalStore from the server\")\n const promise = React.useSyncExternalStore(\n subscribe,\n getSnapshot,\n () => throwErr(new Error(\"getServerSnapshot should never be called in useAsyncCache because we restrict to CSR earlier\"))\n );\n\n const result = React.use(promise);\n if (result.status === \"error\") {\n const error = result.error;\n if (error instanceof Error && !(error as any).__stackHasConcatenatedStacktraces) {\n concatStacktraces(error, new Error());\n (error as any).__stackHasConcatenatedStacktraces = true;\n }\n throw error;\n }\n return result.data;\n}\n"],"mappings":"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","names":[]}
@@ -1,6 +1,6 @@
1
1
  // src/lib/stack-app/apps/implementations/server-app-impl.ts
2
2
  import { KnownErrors, StackServerInterface } from "@stackframe/stack-shared";
3
- import { StackAssertionError } from "@stackframe/stack-shared/dist/utils/errors";
3
+ import { StackAssertionError, throwErr } from "@stackframe/stack-shared/dist/utils/errors";
4
4
  import { runAsynchronously } from "@stackframe/stack-shared/dist/utils/promises";
5
5
  import { suspend } from "@stackframe/stack-shared/dist/utils/react";
6
6
  import { Result } from "@stackframe/stack-shared/dist/utils/results";
@@ -419,7 +419,10 @@ var _StackServerAppImplIncomplete = class extends _StackClientAppImplIncomplete
419
419
  } else {
420
420
  this._ensurePersistentTokenStore(options?.tokenStore);
421
421
  const session = await this._getSession(options?.tokenStore);
422
- const crud = Result.orThrow(await this._currentServerUserCache.getOrWait([session], "write-only"));
422
+ let crud = Result.orThrow(await this._currentServerUserCache.getOrWait([session], "write-only"));
423
+ if (crud?.is_anonymous && options?.or !== "anonymous" && options?.or !== "anonymous-if-exists") {
424
+ crud = null;
425
+ }
423
426
  if (crud === null) {
424
427
  switch (options?.or) {
425
428
  case "redirect": {
@@ -429,7 +432,13 @@ var _StackServerAppImplIncomplete = class extends _StackClientAppImplIncomplete
429
432
  case "throw": {
430
433
  throw new Error("User is not signed in but getUser was called with { or: 'throw' }");
431
434
  }
432
- default: {
435
+ case "anonymous": {
436
+ const tokens = await this._signUpAnonymously();
437
+ return await this.getUser({ tokenStore: tokens }) ?? throwErr("Something went wrong while signing up anonymously");
438
+ }
439
+ case void 0:
440
+ case "anonymous-if-exists":
441
+ case "return-null": {
433
442
  return null;
434
443
  }
435
444
  }
@@ -451,7 +460,10 @@ var _StackServerAppImplIncomplete = class extends _StackClientAppImplIncomplete
451
460
  } else {
452
461
  this._ensurePersistentTokenStore(options?.tokenStore);
453
462
  const session = this._useSession(options?.tokenStore);
454
- const crud = useAsyncCache(this._currentServerUserCache, [session], "useUser()");
463
+ let crud = useAsyncCache(this._currentServerUserCache, [session], "useUser()");
464
+ if (crud?.is_anonymous && options?.or !== "anonymous" && options?.or !== "anonymous-if-exists") {
465
+ crud = null;
466
+ }
455
467
  if (crud === null) {
456
468
  switch (options?.or) {
457
469
  case "redirect": {
@@ -462,7 +474,18 @@ var _StackServerAppImplIncomplete = class extends _StackClientAppImplIncomplete
462
474
  case "throw": {
463
475
  throw new Error("User is not signed in but useUser was called with { or: 'throw' }");
464
476
  }
477
+ case "anonymous": {
478
+ runAsynchronously(async () => {
479
+ await this._signUpAnonymously();
480
+ if (typeof window !== "undefined") {
481
+ window.location.reload();
482
+ }
483
+ });
484
+ suspend();
485
+ throw new StackAssertionError("suspend should never return");
486
+ }
465
487
  case void 0:
488
+ case "anonymous-if-exists":
466
489
  case "return-null": {
467
490
  }
468
491
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../src/lib/stack-app/apps/implementations/server-app-impl.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\nimport { KnownErrors, StackServerInterface } from \"@stackframe/stack-shared\";\nimport { ContactChannelsCrud } from \"@stackframe/stack-shared/dist/interface/crud/contact-channels\";\nimport { TeamInvitationCrud } from \"@stackframe/stack-shared/dist/interface/crud/team-invitation\";\nimport { TeamMemberProfilesCrud } from \"@stackframe/stack-shared/dist/interface/crud/team-member-profiles\";\nimport { TeamPermissionDefinitionsCrud, TeamPermissionsCrud } from \"@stackframe/stack-shared/dist/interface/crud/team-permissions\";\nimport { TeamsCrud } from \"@stackframe/stack-shared/dist/interface/crud/teams\";\nimport { UsersCrud } from \"@stackframe/stack-shared/dist/interface/crud/users\";\nimport { InternalSession } from \"@stackframe/stack-shared/dist/sessions\";\nimport { StackAssertionError } from \"@stackframe/stack-shared/dist/utils/errors\";\nimport { ProviderType } from \"@stackframe/stack-shared/dist/utils/oauth\";\nimport { runAsynchronously } from \"@stackframe/stack-shared/dist/utils/promises\";\nimport { suspend } from \"@stackframe/stack-shared/dist/utils/react\";\nimport { Result } from \"@stackframe/stack-shared/dist/utils/results\";\nimport { useMemo } from \"react\"; // THIS_LINE_PLATFORM react-like\nimport { constructRedirectUrl } from \"../../../../utils/url\";\nimport { GetUserOptions, HandlerUrls, OAuthScopesOnSignIn, TokenStoreInit } from \"../../common\";\nimport { OAuthConnection } from \"../../connected-accounts\";\nimport { ServerContactChannel, ServerContactChannelCreateOptions, ServerContactChannelUpdateOptions, serverContactChannelCreateOptionsToCrud, serverContactChannelUpdateOptionsToCrud } from \"../../contact-channels\";\nimport { AdminTeamPermission, AdminTeamPermissionDefinition } from \"../../permissions\";\nimport { EditableTeamMemberProfile, ServerListUsersOptions, ServerTeam, ServerTeamCreateOptions, ServerTeamUpdateOptions, ServerTeamUser, Team, TeamInvitation, serverTeamCreateOptionsToCrud, serverTeamUpdateOptionsToCrud } from \"../../teams\";\nimport { ProjectCurrentServerUser, ServerUser, ServerUserCreateOptions, ServerUserUpdateOptions, serverUserCreateOptionsToCrud, serverUserUpdateOptionsToCrud } from \"../../users\";\nimport { StackServerAppConstructorOptions } from \"../interfaces/server-app\";\nimport { _StackClientAppImplIncomplete } from \"./client-app-impl\";\nimport { clientVersion, createCache, createCacheBySession, getBaseUrl, getDefaultProjectId, getDefaultPublishableClientKey, getDefaultSecretServerKey } from \"./common\";\n\nimport { useAsyncCache } from \"./common\";\n\nexport class _StackServerAppImplIncomplete<HasTokenStore extends boolean, ProjectId extends string> extends _StackClientAppImplIncomplete<HasTokenStore, ProjectId>\n{\n declare protected _interface: StackServerInterface;\n\n // TODO override the client user cache to use the server user cache, so we save some requests\n private readonly _currentServerUserCache = createCacheBySession(async (session) => {\n if (session.isKnownToBeInvalid()) {\n // see comment in _currentUserCache for more details on why we do this\n return null;\n }\n return await this._interface.getServerUserByToken(session);\n });\n private readonly _serverUsersCache = createCache<[\n cursor?: string,\n limit?: number,\n orderBy?: 'signedUpAt',\n desc?: boolean,\n query?: string,\n ], UsersCrud['Server']['List']>(async ([cursor, limit, orderBy, desc, query]) => {\n return await this._interface.listServerUsers({ cursor, limit, orderBy, desc, query });\n });\n private readonly _serverUserCache = createCache<string[], UsersCrud['Server']['Read'] | null>(async ([userId]) => {\n const user = await this._interface.getServerUserById(userId);\n return Result.or(user, null);\n });\n private readonly _serverTeamsCache = createCache<[string | undefined], TeamsCrud['Server']['Read'][]>(async ([userId]) => {\n return await this._interface.listServerTeams({ userId });\n });\n private readonly _serverTeamUserPermissionsCache = createCache<\n [string, string, boolean],\n TeamPermissionsCrud['Server']['Read'][]\n >(async ([teamId, userId, recursive]) => {\n return await this._interface.listServerTeamPermissions({ teamId, userId, recursive }, null);\n });\n private readonly _serverUserOAuthConnectionAccessTokensCache = createCache<[string, string, string], { accessToken: string } | null>(\n async ([userId, providerId, scope]) => {\n try {\n const result = await this._interface.createServerProviderAccessToken(userId, providerId, scope || \"\");\n return { accessToken: result.access_token };\n } catch (err) {\n if (!(err instanceof KnownErrors.OAuthConnectionDoesNotHaveRequiredScope || err instanceof KnownErrors.OAuthConnectionNotConnectedToUser)) {\n throw err;\n }\n }\n return null;\n }\n );\n private readonly _serverUserOAuthConnectionCache = createCache<[string, ProviderType, string, boolean], OAuthConnection | null>(\n async ([userId, providerId, scope, redirect]) => {\n return await this._getUserOAuthConnectionCacheFn({\n getUser: async () => Result.orThrow(await this._serverUserCache.getOrWait([userId], \"write-only\")),\n getOrWaitOAuthToken: async () => Result.orThrow(await this._serverUserOAuthConnectionAccessTokensCache.getOrWait([userId, providerId, scope || \"\"] as const, \"write-only\")),\n useOAuthToken: () => useAsyncCache(this._serverUserOAuthConnectionAccessTokensCache, [userId, providerId, scope || \"\"] as const, \"user.useConnectedAccount()\"),\n providerId,\n scope,\n redirect,\n session: null,\n });\n }\n );\n private readonly _serverTeamMemberProfilesCache = createCache<[string], TeamMemberProfilesCrud['Server']['Read'][]>(\n async ([teamId]) => {\n return await this._interface.listServerTeamMemberProfiles({ teamId });\n }\n );\n private readonly _serverTeamInvitationsCache = createCache<[string], TeamInvitationCrud['Server']['Read'][]>(\n async ([teamId]) => {\n return await this._interface.listServerTeamInvitations({ teamId });\n }\n );\n private readonly _serverUserTeamProfileCache = createCache<[string, string], TeamMemberProfilesCrud['Client']['Read']>(\n async ([teamId, userId]) => {\n return await this._interface.getServerTeamMemberProfile({ teamId, userId });\n }\n );\n private readonly _serverContactChannelsCache = createCache<[string], ContactChannelsCrud['Server']['Read'][]>(\n async ([userId]) => {\n return await this._interface.listServerContactChannels(userId);\n }\n );\n\n private async _updateServerUser(userId: string, update: ServerUserUpdateOptions): Promise<UsersCrud['Server']['Read']> {\n const result = await this._interface.updateServerUser(userId, serverUserUpdateOptionsToCrud(update));\n await this._refreshUsers();\n return result;\n }\n\n protected _serverEditableTeamProfileFromCrud(crud: TeamMemberProfilesCrud['Client']['Read']): EditableTeamMemberProfile {\n const app = this;\n return {\n displayName: crud.display_name,\n profileImageUrl: crud.profile_image_url,\n async update(update: { displayName?: string, profileImageUrl?: string }) {\n await app._interface.updateServerTeamMemberProfile({\n teamId: crud.team_id,\n userId: crud.user_id,\n profile: {\n display_name: update.displayName,\n profile_image_url: update.profileImageUrl,\n },\n });\n await app._serverUserTeamProfileCache.refresh([crud.team_id, crud.user_id]);\n }\n };\n }\n\n protected _serverContactChannelFromCrud(userId: string, crud: ContactChannelsCrud['Server']['Read']): ServerContactChannel {\n const app = this;\n return {\n id: crud.id,\n value: crud.value,\n type: crud.type,\n isVerified: crud.is_verified,\n isPrimary: crud.is_primary,\n usedForAuth: crud.used_for_auth,\n async sendVerificationEmail(options?: { callbackUrl?: string }) {\n if (!options?.callbackUrl && !await app._getCurrentUrl()) {\n throw new Error(\"Cannot send verification email without a callback URL from the server or without a redirect method. Make sure you pass the `callbackUrl` option: `sendVerificationEmail({ callbackUrl: ... })`\");\n }\n\n await app._interface.sendServerContactChannelVerificationEmail(userId, crud.id, options?.callbackUrl ?? constructRedirectUrl(app.urls.emailVerification));\n },\n async update(data: ServerContactChannelUpdateOptions) {\n await app._interface.updateServerContactChannel(userId, crud.id, serverContactChannelUpdateOptionsToCrud(data));\n await Promise.all([\n app._serverContactChannelsCache.refresh([userId]),\n app._serverUserCache.refresh([userId])\n ]);\n },\n async delete() {\n await app._interface.deleteServerContactChannel(userId, crud.id);\n await Promise.all([\n app._serverContactChannelsCache.refresh([userId]),\n app._serverUserCache.refresh([userId])\n ]);\n },\n };\n }\n\n constructor(options:\n | StackServerAppConstructorOptions<HasTokenStore, ProjectId>\n | {\n interface: StackServerInterface,\n tokenStore: TokenStoreInit<HasTokenStore>,\n urls: Partial<HandlerUrls> | undefined,\n oauthScopesOnSignIn?: Partial<OAuthScopesOnSignIn> | undefined,\n }\n ) {\n super(\"interface\" in options ? {\n interface: options.interface,\n tokenStore: options.tokenStore,\n urls: options.urls,\n oauthScopesOnSignIn: options.oauthScopesOnSignIn,\n } : {\n interface: new StackServerInterface({\n getBaseUrl: () => getBaseUrl(options.baseUrl),\n projectId: options.projectId ?? getDefaultProjectId(),\n extraRequestHeaders: options.extraRequestHeaders ?? {},\n clientVersion,\n publishableClientKey: options.publishableClientKey ?? getDefaultPublishableClientKey(),\n secretServerKey: options.secretServerKey ?? getDefaultSecretServerKey(),\n }),\n baseUrl: options.baseUrl,\n extraRequestHeaders: options.extraRequestHeaders,\n projectId: options.projectId,\n publishableClientKey: options.publishableClientKey,\n tokenStore: options.tokenStore,\n urls: options.urls,\n oauthScopesOnSignIn: options.oauthScopesOnSignIn,\n redirectMethod: options.redirectMethod,\n });\n }\n\n protected _serverUserFromCrud(crud: UsersCrud['Server']['Read']): ServerUser {\n const app = this;\n\n async function getConnectedAccount(id: ProviderType, options?: { scopes?: string[] }): Promise<OAuthConnection | null>;\n async function getConnectedAccount(id: ProviderType, options: { or: 'redirect', scopes?: string[] }): Promise<OAuthConnection>;\n async function getConnectedAccount(id: ProviderType, options?: { or?: 'redirect', scopes?: string[] }): Promise<OAuthConnection | null> {\n const scopeString = options?.scopes?.join(\" \");\n return Result.orThrow(await app._serverUserOAuthConnectionCache.getOrWait([crud.id, id, scopeString || \"\", options?.or === 'redirect'], \"write-only\"));\n }\n\n function useConnectedAccount(id: ProviderType, options?: { scopes?: string[] }): OAuthConnection | null;\n function useConnectedAccount(id: ProviderType, options: { or: 'redirect', scopes?: string[] }): OAuthConnection;\n function useConnectedAccount(id: ProviderType, options?: { or?: 'redirect', scopes?: string[] }): OAuthConnection | null {\n const scopeString = options?.scopes?.join(\" \");\n return useAsyncCache(app._serverUserOAuthConnectionCache, [crud.id, id, scopeString || \"\", options?.or === 'redirect'] as const, \"user.useConnectedAccount()\");\n }\n\n return {\n ...super._createBaseUser(crud),\n lastActiveAt: new Date(crud.last_active_at_millis),\n serverMetadata: crud.server_metadata,\n async setPrimaryEmail(email: string | null, options?: { verified?: boolean }) {\n await app._updateServerUser(crud.id, { primaryEmail: email, primaryEmailVerified: options?.verified });\n },\n async grantPermission(scope: Team, permissionId: string): Promise<void> {\n await app._interface.grantServerTeamUserPermission(scope.id, crud.id, permissionId);\n for (const recursive of [true, false]) {\n await app._serverTeamUserPermissionsCache.refresh([scope.id, crud.id, recursive]);\n }\n },\n async revokePermission(scope: Team, permissionId: string): Promise<void> {\n await app._interface.revokeServerTeamUserPermission(scope.id, crud.id, permissionId);\n for (const recursive of [true, false]) {\n await app._serverTeamUserPermissionsCache.refresh([scope.id, crud.id, recursive]);\n }\n },\n async delete() {\n const res = await app._interface.deleteServerUser(crud.id);\n await app._refreshUsers();\n return res;\n },\n async createSession(options: { expiresInMillis?: number, isImpersonation?: boolean }) {\n // TODO this should also refresh the access token when it expires (like InternalSession)\n const tokens = await app._interface.createServerUserSession(crud.id, options.expiresInMillis ?? 1000 * 60 * 60 * 24 * 365, options.isImpersonation ?? false);\n return {\n async getTokens() {\n return tokens;\n },\n };\n },\n\n async getActiveSessions() {\n const sessions = await app._interface.listServerSessions(crud.id);\n return sessions.map((session) => app._clientSessionFromCrud(session));\n },\n\n async revokeSession(sessionId: string) {\n await app._interface.deleteServerSession(sessionId);\n },\n async setDisplayName(displayName: string) {\n return await this.update({ displayName });\n },\n async setClientMetadata(metadata: Record<string, any>) {\n return await this.update({ clientMetadata: metadata });\n },\n async setClientReadOnlyMetadata(metadata: Record<string, any>) {\n return await this.update({ clientReadOnlyMetadata: metadata });\n },\n async setServerMetadata(metadata: Record<string, any>) {\n return await this.update({ serverMetadata: metadata });\n },\n async setSelectedTeam(team: Team | null) {\n return await this.update({ selectedTeamId: team?.id ?? null });\n },\n getConnectedAccount,\n useConnectedAccount, // THIS_LINE_PLATFORM react-like\n selectedTeam: crud.selected_team ? app._serverTeamFromCrud(crud.selected_team) : null,\n async getTeam(teamId: string) {\n const teams = await this.listTeams();\n return teams.find((t) => t.id === teamId) ?? null;\n },\n useTeam(teamId: string) {\n const teams = this.useTeams();\n return useMemo(() => {\n return teams.find((t) => t.id === teamId) ?? null;\n }, [teams, teamId]);\n },\n async listTeams() {\n const teams = Result.orThrow(await app._serverTeamsCache.getOrWait([crud.id], \"write-only\"));\n return teams.map((t) => app._serverTeamFromCrud(t));\n },\n useTeams() {\n const teams = useAsyncCache(app._serverTeamsCache, [crud.id], \"user.useTeams()\");\n return useMemo(() => teams.map((t) => app._serverTeamFromCrud(t)), [teams]);\n },\n createTeam: async (data: Omit<ServerTeamCreateOptions, \"creatorUserId\">) => {\n const team = await app._interface.createServerTeam(serverTeamCreateOptionsToCrud({\n creatorUserId: crud.id,\n ...data,\n }));\n await app._serverTeamsCache.refresh([undefined]);\n return app._serverTeamFromCrud(team);\n },\n leaveTeam: async (team: Team) => {\n await app._interface.leaveServerTeam({ teamId: team.id, userId: crud.id });\n // TODO: refresh cache\n },\n async listPermissions(scope: Team, options?: { recursive?: boolean }): Promise<AdminTeamPermission[]> {\n const recursive = options?.recursive ?? true;\n const permissions = Result.orThrow(await app._serverTeamUserPermissionsCache.getOrWait([scope.id, crud.id, recursive], \"write-only\"));\n return permissions.map((crud) => app._serverPermissionFromCrud(crud));\n },\n usePermissions(scope: Team, options?: { recursive?: boolean }): AdminTeamPermission[] {\n const recursive = options?.recursive ?? true;\n const permissions = useAsyncCache(app._serverTeamUserPermissionsCache, [scope.id, crud.id, recursive] as const, \"user.usePermissions()\");\n return useMemo(() => permissions.map((crud) => app._serverPermissionFromCrud(crud)), [permissions]);\n },\n async getPermission(scope: Team, permissionId: string): Promise<AdminTeamPermission | null> {\n const permissions = await this.listPermissions(scope);\n return permissions.find((p) => p.id === permissionId) ?? null;\n },\n usePermission(scope: Team, permissionId: string): AdminTeamPermission | null {\n const permissions = this.usePermissions(scope);\n return useMemo(() => permissions.find((p) => p.id === permissionId) ?? null, [permissions, permissionId]);\n },\n async hasPermission(scope: Team, permissionId: string): Promise<boolean> {\n return await this.getPermission(scope, permissionId) !== null;\n },\n async update(update: ServerUserUpdateOptions) {\n await app._updateServerUser(crud.id, update);\n },\n async sendVerificationEmail() {\n return await app._checkFeatureSupport(\"sendVerificationEmail() on ServerUser\", {});\n },\n async updatePassword(options: { oldPassword: string, newPassword: string}) {\n const result = await app._interface.updatePassword(options);\n await app._serverUserCache.refresh([crud.id]);\n return result;\n },\n async setPassword(options: { password: string }) {\n const result = await this.update(options);\n await app._serverUserCache.refresh([crud.id]);\n return result;\n },\n async getTeamProfile(team: Team) {\n const result = Result.orThrow(await app._serverUserTeamProfileCache.getOrWait([team.id, crud.id], \"write-only\"));\n return app._serverEditableTeamProfileFromCrud(result);\n },\n useTeamProfile(team: Team) {\n const result = useAsyncCache(app._serverUserTeamProfileCache, [team.id, crud.id] as const, \"user.useTeamProfile()\");\n return useMemo(() => app._serverEditableTeamProfileFromCrud(result), [result]);\n },\n async listContactChannels() {\n const result = Result.orThrow(await app._serverContactChannelsCache.getOrWait([crud.id], \"write-only\"));\n return result.map((data) => app._serverContactChannelFromCrud(crud.id, data));\n },\n useContactChannels() {\n const result = useAsyncCache(app._serverContactChannelsCache, [crud.id] as const, \"user.useContactChannels()\");\n return useMemo(() => result.map((data) => app._serverContactChannelFromCrud(crud.id, data)), [result]);\n },\n createContactChannel: async (data: ServerContactChannelCreateOptions) => {\n const contactChannel = await app._interface.createServerContactChannel(serverContactChannelCreateOptionsToCrud(crud.id, data));\n await Promise.all([\n app._serverContactChannelsCache.refresh([crud.id]),\n app._serverUserCache.refresh([crud.id])\n ]);\n return app._serverContactChannelFromCrud(crud.id, contactChannel);\n },\n };\n }\n\n protected _serverTeamUserFromCrud(crud: TeamMemberProfilesCrud[\"Server\"][\"Read\"]): ServerTeamUser {\n return {\n ...this._serverUserFromCrud(crud.user),\n teamProfile: {\n displayName: crud.display_name,\n profileImageUrl: crud.profile_image_url,\n },\n };\n }\n\n protected _serverTeamInvitationFromCrud(crud: TeamInvitationCrud['Server']['Read']): TeamInvitation {\n return {\n id: crud.id,\n recipientEmail: crud.recipient_email,\n expiresAt: new Date(crud.expires_at_millis),\n revoke: async () => {\n await this._interface.revokeServerTeamInvitation(crud.id, crud.team_id);\n },\n };\n }\n\n protected override _currentUserFromCrud(crud: UsersCrud['Server']['Read'], session: InternalSession): ProjectCurrentServerUser<ProjectId> {\n const app = this;\n const currentUser = {\n ...this._serverUserFromCrud(crud),\n ...this._createAuth(session),\n ...this._isInternalProject() ? this._createInternalUserExtra(session) : {},\n } satisfies ServerUser;\n\n Object.freeze(currentUser);\n return currentUser as ProjectCurrentServerUser<ProjectId>;\n }\n\n protected _serverTeamFromCrud(crud: TeamsCrud['Server']['Read']): ServerTeam {\n const app = this;\n return {\n id: crud.id,\n displayName: crud.display_name,\n profileImageUrl: crud.profile_image_url,\n createdAt: new Date(crud.created_at_millis),\n clientMetadata: crud.client_metadata,\n clientReadOnlyMetadata: crud.client_read_only_metadata,\n serverMetadata: crud.server_metadata,\n async update(update: Partial<ServerTeamUpdateOptions>) {\n await app._interface.updateServerTeam(crud.id, serverTeamUpdateOptionsToCrud(update));\n await app._serverTeamsCache.refresh([undefined]);\n },\n async delete() {\n await app._interface.deleteServerTeam(crud.id);\n await app._serverTeamsCache.refresh([undefined]);\n },\n async listUsers() {\n const result = Result.orThrow(await app._serverTeamMemberProfilesCache.getOrWait([crud.id], \"write-only\"));\n return result.map(u => app._serverTeamUserFromCrud(u));\n },\n useUsers() {\n const result = useAsyncCache(app._serverTeamMemberProfilesCache, [crud.id] as const, \"team.useUsers()\");\n return useMemo(() => result.map(u => app._serverTeamUserFromCrud(u)), [result]);\n },\n async addUser(userId) {\n await app._interface.addServerUserToTeam({\n teamId: crud.id,\n userId,\n });\n await app._serverTeamMemberProfilesCache.refresh([crud.id]);\n },\n async removeUser(userId) {\n await app._interface.removeServerUserFromTeam({\n teamId: crud.id,\n userId,\n });\n await app._serverTeamMemberProfilesCache.refresh([crud.id]);\n },\n async inviteUser(options: { email: string, callbackUrl?: string }) {\n if (!options.callbackUrl && !await app._getCurrentUrl()) {\n throw new Error(\"Cannot invite user without a callback URL from the server or without a redirect method. Make sure you pass the `callbackUrl` option: `inviteUser({ email, callbackUrl: ... })`\");\n }\n\n await app._interface.sendServerTeamInvitation({\n teamId: crud.id,\n email: options.email,\n callbackUrl: options.callbackUrl ?? constructRedirectUrl(app.urls.teamInvitation),\n });\n await app._serverTeamInvitationsCache.refresh([crud.id]);\n },\n async listInvitations() {\n const result = Result.orThrow(await app._serverTeamInvitationsCache.getOrWait([crud.id], \"write-only\"));\n return result.map((crud) => app._serverTeamInvitationFromCrud(crud));\n },\n useInvitations() {\n const result = useAsyncCache(app._serverTeamInvitationsCache, [crud.id] as const, \"team.useInvitations()\");\n return useMemo(() => result.map((crud) => app._serverTeamInvitationFromCrud(crud)), [result]);\n },\n };\n }\n\n async createUser(options: ServerUserCreateOptions): Promise<ServerUser> {\n const crud = await this._interface.createServerUser(serverUserCreateOptionsToCrud(options));\n await this._refreshUsers();\n return this._serverUserFromCrud(crud);\n }\n\n async getUser(options: GetUserOptions<HasTokenStore> & { or: 'redirect' }): Promise<ProjectCurrentServerUser<ProjectId>>;\n async getUser(options: GetUserOptions<HasTokenStore> & { or: 'throw' }): Promise<ProjectCurrentServerUser<ProjectId>>;\n async getUser(options?: GetUserOptions<HasTokenStore>): Promise<ProjectCurrentServerUser<ProjectId> | null>;\n async getUser(id: string): Promise<ServerUser | null>;\n async getUser(options?: string | GetUserOptions<HasTokenStore>): Promise<ProjectCurrentServerUser<ProjectId> | ServerUser | null> {\n if (typeof options === \"string\") {\n return await this.getServerUserById(options);\n } else {\n // TODO this code is duplicated from the client app; fix that\n this._ensurePersistentTokenStore(options?.tokenStore);\n const session = await this._getSession(options?.tokenStore);\n const crud = Result.orThrow(await this._currentServerUserCache.getOrWait([session], \"write-only\"));\n\n if (crud === null) {\n switch (options?.or) {\n case 'redirect': {\n await this.redirectToSignIn({ replace: true });\n break;\n }\n case 'throw': {\n throw new Error(\"User is not signed in but getUser was called with { or: 'throw' }\");\n }\n default: {\n return null;\n }\n }\n }\n\n return crud && this._currentUserFromCrud(crud, session);\n }\n }\n\n async getServerUser(): Promise<ProjectCurrentServerUser<ProjectId> | null> {\n console.warn(\"stackServerApp.getServerUser is deprecated; use stackServerApp.getUser instead\");\n return await this.getUser();\n }\n\n async getServerUserById(userId: string): Promise<ServerUser | null> {\n const crud = Result.orThrow(await this._serverUserCache.getOrWait([userId], \"write-only\"));\n return crud && this._serverUserFromCrud(crud);\n }\n\n useUser(options: GetUserOptions<HasTokenStore> & { or: 'redirect' }): ProjectCurrentServerUser<ProjectId>;\n useUser(options: GetUserOptions<HasTokenStore> & { or: 'throw' }): ProjectCurrentServerUser<ProjectId>;\n useUser(options?: GetUserOptions<HasTokenStore>): ProjectCurrentServerUser<ProjectId> | null;\n useUser(id: string): ServerUser | null;\n useUser(options?: GetUserOptions<HasTokenStore> | string): ProjectCurrentServerUser<ProjectId> | ServerUser | null {\n if (typeof options === \"string\") {\n return this.useUserById(options);\n } else {\n // TODO this code is duplicated from the client app; fix that\n this._ensurePersistentTokenStore(options?.tokenStore);\n\n const session = this._useSession(options?.tokenStore);\n const crud = useAsyncCache(this._currentServerUserCache, [session], \"useUser()\");\n\n if (crud === null) {\n switch (options?.or) {\n case 'redirect': {\n runAsynchronously(this.redirectToSignIn({ replace: true }));\n suspend();\n throw new StackAssertionError(\"suspend should never return\");\n }\n case 'throw': {\n throw new Error(\"User is not signed in but useUser was called with { or: 'throw' }\");\n }\n case undefined:\n case \"return-null\": {\n // do nothing\n }\n }\n }\n\n return useMemo(() => {\n return crud && this._currentUserFromCrud(crud, session);\n }, [crud, session, options?.or]);\n }\n }\n useUserById(userId: string): ServerUser | null {\n const crud = useAsyncCache(this._serverUserCache, [userId], \"useUserById()\");\n return useMemo(() => {\n return crud && this._serverUserFromCrud(crud);\n }, [crud]);\n }\n\n async listUsers(options?: ServerListUsersOptions): Promise<ServerUser[] & { nextCursor: string | null }> {\n const crud = Result.orThrow(await this._serverUsersCache.getOrWait([options?.cursor, options?.limit, options?.orderBy, options?.desc, options?.query], \"write-only\"));\n const result: any = crud.items.map((j) => this._serverUserFromCrud(j));\n result.nextCursor = crud.pagination?.next_cursor ?? null;\n return result as any;\n }\n\n useUsers(options?: ServerListUsersOptions): ServerUser[] & { nextCursor: string | null } {\n const crud = useAsyncCache(this._serverUsersCache, [options?.cursor, options?.limit, options?.orderBy, options?.desc, options?.query] as const, \"useServerUsers()\");\n const result: any = crud.items.map((j) => this._serverUserFromCrud(j));\n result.nextCursor = crud.pagination?.next_cursor ?? null;\n return result as any;\n }\n\n _serverPermissionFromCrud(crud: TeamPermissionsCrud['Server']['Read']): AdminTeamPermission {\n return {\n id: crud.id,\n };\n }\n\n _serverTeamPermissionDefinitionFromCrud(crud: TeamPermissionDefinitionsCrud['Admin']['Read']): AdminTeamPermissionDefinition {\n return {\n id: crud.id,\n description: crud.description,\n containedPermissionIds: crud.contained_permission_ids,\n };\n }\n\n async listTeams(): Promise<ServerTeam[]> {\n const teams = Result.orThrow(await this._serverTeamsCache.getOrWait([undefined], \"write-only\"));\n return teams.map((t) => this._serverTeamFromCrud(t));\n }\n\n async createTeam(data: ServerTeamCreateOptions): Promise<ServerTeam> {\n const team = await this._interface.createServerTeam(serverTeamCreateOptionsToCrud(data));\n await this._serverTeamsCache.refresh([undefined]);\n return this._serverTeamFromCrud(team);\n }\n\n useTeams(): ServerTeam[] {\n const teams = useAsyncCache(this._serverTeamsCache, [undefined], \"useServerTeams()\");\n return useMemo(() => {\n return teams.map((t) => this._serverTeamFromCrud(t));\n }, [teams]);\n }\n\n async getTeam(teamId: string): Promise<ServerTeam | null> {\n const teams = await this.listTeams();\n return teams.find((t) => t.id === teamId) ?? null;\n }\n\n useTeam(teamId: string): ServerTeam | null {\n const teams = this.useTeams();\n return useMemo(() => {\n return teams.find((t) => t.id === teamId) ?? null;\n }, [teams, teamId]);\n }\n\n protected override async _refreshSession(session: InternalSession) {\n await Promise.all([\n super._refreshUser(session),\n this._currentServerUserCache.refresh([session]),\n ]);\n }\n\n protected override async _refreshUsers() {\n await Promise.all([\n super._refreshUsers(),\n this._serverUserCache.refreshWhere(() => true),\n this._serverUsersCache.refreshWhere(() => true),\n this._serverContactChannelsCache.refreshWhere(() => true),\n ]);\n }\n}\n"],"mappings":"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","names":["crud"]}
1
+ {"version":3,"sources":["../../../../../../src/lib/stack-app/apps/implementations/server-app-impl.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\nimport { KnownErrors, StackServerInterface } from \"@stackframe/stack-shared\";\nimport { ContactChannelsCrud } from \"@stackframe/stack-shared/dist/interface/crud/contact-channels\";\nimport { TeamInvitationCrud } from \"@stackframe/stack-shared/dist/interface/crud/team-invitation\";\nimport { TeamMemberProfilesCrud } from \"@stackframe/stack-shared/dist/interface/crud/team-member-profiles\";\nimport { TeamPermissionDefinitionsCrud, TeamPermissionsCrud } from \"@stackframe/stack-shared/dist/interface/crud/team-permissions\";\nimport { TeamsCrud } from \"@stackframe/stack-shared/dist/interface/crud/teams\";\nimport { UsersCrud } from \"@stackframe/stack-shared/dist/interface/crud/users\";\nimport { InternalSession } from \"@stackframe/stack-shared/dist/sessions\";\nimport { StackAssertionError, throwErr } from \"@stackframe/stack-shared/dist/utils/errors\";\nimport { ProviderType } from \"@stackframe/stack-shared/dist/utils/oauth\";\nimport { runAsynchronously } from \"@stackframe/stack-shared/dist/utils/promises\";\nimport { suspend } from \"@stackframe/stack-shared/dist/utils/react\";\nimport { Result } from \"@stackframe/stack-shared/dist/utils/results\";\nimport { useMemo } from \"react\"; // THIS_LINE_PLATFORM react-like\nimport { constructRedirectUrl } from \"../../../../utils/url\";\nimport { GetUserOptions, HandlerUrls, OAuthScopesOnSignIn, TokenStoreInit } from \"../../common\";\nimport { OAuthConnection } from \"../../connected-accounts\";\nimport { ServerContactChannel, ServerContactChannelCreateOptions, ServerContactChannelUpdateOptions, serverContactChannelCreateOptionsToCrud, serverContactChannelUpdateOptionsToCrud } from \"../../contact-channels\";\nimport { AdminTeamPermission, AdminTeamPermissionDefinition } from \"../../permissions\";\nimport { EditableTeamMemberProfile, ServerListUsersOptions, ServerTeam, ServerTeamCreateOptions, ServerTeamUpdateOptions, ServerTeamUser, Team, TeamInvitation, serverTeamCreateOptionsToCrud, serverTeamUpdateOptionsToCrud } from \"../../teams\";\nimport { ProjectCurrentServerUser, ServerUser, ServerUserCreateOptions, ServerUserUpdateOptions, serverUserCreateOptionsToCrud, serverUserUpdateOptionsToCrud } from \"../../users\";\nimport { StackServerAppConstructorOptions } from \"../interfaces/server-app\";\nimport { _StackClientAppImplIncomplete } from \"./client-app-impl\";\nimport { clientVersion, createCache, createCacheBySession, getBaseUrl, getDefaultProjectId, getDefaultPublishableClientKey, getDefaultSecretServerKey } from \"./common\";\n\nimport { useAsyncCache } from \"./common\";\n\nexport class _StackServerAppImplIncomplete<HasTokenStore extends boolean, ProjectId extends string> extends _StackClientAppImplIncomplete<HasTokenStore, ProjectId>\n{\n declare protected _interface: StackServerInterface;\n\n // TODO override the client user cache to use the server user cache, so we save some requests\n private readonly _currentServerUserCache = createCacheBySession(async (session) => {\n if (session.isKnownToBeInvalid()) {\n // see comment in _currentUserCache for more details on why we do this\n return null;\n }\n return await this._interface.getServerUserByToken(session);\n });\n private readonly _serverUsersCache = createCache<[\n cursor?: string,\n limit?: number,\n orderBy?: 'signedUpAt',\n desc?: boolean,\n query?: string,\n ], UsersCrud['Server']['List']>(async ([cursor, limit, orderBy, desc, query]) => {\n return await this._interface.listServerUsers({ cursor, limit, orderBy, desc, query });\n });\n private readonly _serverUserCache = createCache<string[], UsersCrud['Server']['Read'] | null>(async ([userId]) => {\n const user = await this._interface.getServerUserById(userId);\n return Result.or(user, null);\n });\n private readonly _serverTeamsCache = createCache<[string | undefined], TeamsCrud['Server']['Read'][]>(async ([userId]) => {\n return await this._interface.listServerTeams({ userId });\n });\n private readonly _serverTeamUserPermissionsCache = createCache<\n [string, string, boolean],\n TeamPermissionsCrud['Server']['Read'][]\n >(async ([teamId, userId, recursive]) => {\n return await this._interface.listServerTeamPermissions({ teamId, userId, recursive }, null);\n });\n private readonly _serverUserOAuthConnectionAccessTokensCache = createCache<[string, string, string], { accessToken: string } | null>(\n async ([userId, providerId, scope]) => {\n try {\n const result = await this._interface.createServerProviderAccessToken(userId, providerId, scope || \"\");\n return { accessToken: result.access_token };\n } catch (err) {\n if (!(err instanceof KnownErrors.OAuthConnectionDoesNotHaveRequiredScope || err instanceof KnownErrors.OAuthConnectionNotConnectedToUser)) {\n throw err;\n }\n }\n return null;\n }\n );\n private readonly _serverUserOAuthConnectionCache = createCache<[string, ProviderType, string, boolean], OAuthConnection | null>(\n async ([userId, providerId, scope, redirect]) => {\n return await this._getUserOAuthConnectionCacheFn({\n getUser: async () => Result.orThrow(await this._serverUserCache.getOrWait([userId], \"write-only\")),\n getOrWaitOAuthToken: async () => Result.orThrow(await this._serverUserOAuthConnectionAccessTokensCache.getOrWait([userId, providerId, scope || \"\"] as const, \"write-only\")),\n useOAuthToken: () => useAsyncCache(this._serverUserOAuthConnectionAccessTokensCache, [userId, providerId, scope || \"\"] as const, \"user.useConnectedAccount()\"),\n providerId,\n scope,\n redirect,\n session: null,\n });\n }\n );\n private readonly _serverTeamMemberProfilesCache = createCache<[string], TeamMemberProfilesCrud['Server']['Read'][]>(\n async ([teamId]) => {\n return await this._interface.listServerTeamMemberProfiles({ teamId });\n }\n );\n private readonly _serverTeamInvitationsCache = createCache<[string], TeamInvitationCrud['Server']['Read'][]>(\n async ([teamId]) => {\n return await this._interface.listServerTeamInvitations({ teamId });\n }\n );\n private readonly _serverUserTeamProfileCache = createCache<[string, string], TeamMemberProfilesCrud['Client']['Read']>(\n async ([teamId, userId]) => {\n return await this._interface.getServerTeamMemberProfile({ teamId, userId });\n }\n );\n private readonly _serverContactChannelsCache = createCache<[string], ContactChannelsCrud['Server']['Read'][]>(\n async ([userId]) => {\n return await this._interface.listServerContactChannels(userId);\n }\n );\n\n private async _updateServerUser(userId: string, update: ServerUserUpdateOptions): Promise<UsersCrud['Server']['Read']> {\n const result = await this._interface.updateServerUser(userId, serverUserUpdateOptionsToCrud(update));\n await this._refreshUsers();\n return result;\n }\n\n protected _serverEditableTeamProfileFromCrud(crud: TeamMemberProfilesCrud['Client']['Read']): EditableTeamMemberProfile {\n const app = this;\n return {\n displayName: crud.display_name,\n profileImageUrl: crud.profile_image_url,\n async update(update: { displayName?: string, profileImageUrl?: string }) {\n await app._interface.updateServerTeamMemberProfile({\n teamId: crud.team_id,\n userId: crud.user_id,\n profile: {\n display_name: update.displayName,\n profile_image_url: update.profileImageUrl,\n },\n });\n await app._serverUserTeamProfileCache.refresh([crud.team_id, crud.user_id]);\n }\n };\n }\n\n protected _serverContactChannelFromCrud(userId: string, crud: ContactChannelsCrud['Server']['Read']): ServerContactChannel {\n const app = this;\n return {\n id: crud.id,\n value: crud.value,\n type: crud.type,\n isVerified: crud.is_verified,\n isPrimary: crud.is_primary,\n usedForAuth: crud.used_for_auth,\n async sendVerificationEmail(options?: { callbackUrl?: string }) {\n if (!options?.callbackUrl && !await app._getCurrentUrl()) {\n throw new Error(\"Cannot send verification email without a callback URL from the server or without a redirect method. Make sure you pass the `callbackUrl` option: `sendVerificationEmail({ callbackUrl: ... })`\");\n }\n\n await app._interface.sendServerContactChannelVerificationEmail(userId, crud.id, options?.callbackUrl ?? constructRedirectUrl(app.urls.emailVerification));\n },\n async update(data: ServerContactChannelUpdateOptions) {\n await app._interface.updateServerContactChannel(userId, crud.id, serverContactChannelUpdateOptionsToCrud(data));\n await Promise.all([\n app._serverContactChannelsCache.refresh([userId]),\n app._serverUserCache.refresh([userId])\n ]);\n },\n async delete() {\n await app._interface.deleteServerContactChannel(userId, crud.id);\n await Promise.all([\n app._serverContactChannelsCache.refresh([userId]),\n app._serverUserCache.refresh([userId])\n ]);\n },\n };\n }\n\n constructor(options:\n | StackServerAppConstructorOptions<HasTokenStore, ProjectId>\n | {\n interface: StackServerInterface,\n tokenStore: TokenStoreInit<HasTokenStore>,\n urls: Partial<HandlerUrls> | undefined,\n oauthScopesOnSignIn?: Partial<OAuthScopesOnSignIn> | undefined,\n }\n ) {\n super(\"interface\" in options ? {\n interface: options.interface,\n tokenStore: options.tokenStore,\n urls: options.urls,\n oauthScopesOnSignIn: options.oauthScopesOnSignIn,\n } : {\n interface: new StackServerInterface({\n getBaseUrl: () => getBaseUrl(options.baseUrl),\n projectId: options.projectId ?? getDefaultProjectId(),\n extraRequestHeaders: options.extraRequestHeaders ?? {},\n clientVersion,\n publishableClientKey: options.publishableClientKey ?? getDefaultPublishableClientKey(),\n secretServerKey: options.secretServerKey ?? getDefaultSecretServerKey(),\n }),\n baseUrl: options.baseUrl,\n extraRequestHeaders: options.extraRequestHeaders,\n projectId: options.projectId,\n publishableClientKey: options.publishableClientKey,\n tokenStore: options.tokenStore,\n urls: options.urls,\n oauthScopesOnSignIn: options.oauthScopesOnSignIn,\n redirectMethod: options.redirectMethod,\n });\n }\n\n protected _serverUserFromCrud(crud: UsersCrud['Server']['Read']): ServerUser {\n const app = this;\n\n async function getConnectedAccount(id: ProviderType, options?: { scopes?: string[] }): Promise<OAuthConnection | null>;\n async function getConnectedAccount(id: ProviderType, options: { or: 'redirect', scopes?: string[] }): Promise<OAuthConnection>;\n async function getConnectedAccount(id: ProviderType, options?: { or?: 'redirect', scopes?: string[] }): Promise<OAuthConnection | null> {\n const scopeString = options?.scopes?.join(\" \");\n return Result.orThrow(await app._serverUserOAuthConnectionCache.getOrWait([crud.id, id, scopeString || \"\", options?.or === 'redirect'], \"write-only\"));\n }\n\n function useConnectedAccount(id: ProviderType, options?: { scopes?: string[] }): OAuthConnection | null;\n function useConnectedAccount(id: ProviderType, options: { or: 'redirect', scopes?: string[] }): OAuthConnection;\n function useConnectedAccount(id: ProviderType, options?: { or?: 'redirect', scopes?: string[] }): OAuthConnection | null {\n const scopeString = options?.scopes?.join(\" \");\n return useAsyncCache(app._serverUserOAuthConnectionCache, [crud.id, id, scopeString || \"\", options?.or === 'redirect'] as const, \"user.useConnectedAccount()\");\n }\n\n return {\n ...super._createBaseUser(crud),\n lastActiveAt: new Date(crud.last_active_at_millis),\n serverMetadata: crud.server_metadata,\n async setPrimaryEmail(email: string | null, options?: { verified?: boolean }) {\n await app._updateServerUser(crud.id, { primaryEmail: email, primaryEmailVerified: options?.verified });\n },\n async grantPermission(scope: Team, permissionId: string): Promise<void> {\n await app._interface.grantServerTeamUserPermission(scope.id, crud.id, permissionId);\n for (const recursive of [true, false]) {\n await app._serverTeamUserPermissionsCache.refresh([scope.id, crud.id, recursive]);\n }\n },\n async revokePermission(scope: Team, permissionId: string): Promise<void> {\n await app._interface.revokeServerTeamUserPermission(scope.id, crud.id, permissionId);\n for (const recursive of [true, false]) {\n await app._serverTeamUserPermissionsCache.refresh([scope.id, crud.id, recursive]);\n }\n },\n async delete() {\n const res = await app._interface.deleteServerUser(crud.id);\n await app._refreshUsers();\n return res;\n },\n async createSession(options: { expiresInMillis?: number, isImpersonation?: boolean }) {\n // TODO this should also refresh the access token when it expires (like InternalSession)\n const tokens = await app._interface.createServerUserSession(crud.id, options.expiresInMillis ?? 1000 * 60 * 60 * 24 * 365, options.isImpersonation ?? false);\n return {\n async getTokens() {\n return tokens;\n },\n };\n },\n\n async getActiveSessions() {\n const sessions = await app._interface.listServerSessions(crud.id);\n return sessions.map((session) => app._clientSessionFromCrud(session));\n },\n\n async revokeSession(sessionId: string) {\n await app._interface.deleteServerSession(sessionId);\n },\n async setDisplayName(displayName: string) {\n return await this.update({ displayName });\n },\n async setClientMetadata(metadata: Record<string, any>) {\n return await this.update({ clientMetadata: metadata });\n },\n async setClientReadOnlyMetadata(metadata: Record<string, any>) {\n return await this.update({ clientReadOnlyMetadata: metadata });\n },\n async setServerMetadata(metadata: Record<string, any>) {\n return await this.update({ serverMetadata: metadata });\n },\n async setSelectedTeam(team: Team | null) {\n return await this.update({ selectedTeamId: team?.id ?? null });\n },\n getConnectedAccount,\n useConnectedAccount, // THIS_LINE_PLATFORM react-like\n selectedTeam: crud.selected_team ? app._serverTeamFromCrud(crud.selected_team) : null,\n async getTeam(teamId: string) {\n const teams = await this.listTeams();\n return teams.find((t) => t.id === teamId) ?? null;\n },\n useTeam(teamId: string) {\n const teams = this.useTeams();\n return useMemo(() => {\n return teams.find((t) => t.id === teamId) ?? null;\n }, [teams, teamId]);\n },\n async listTeams() {\n const teams = Result.orThrow(await app._serverTeamsCache.getOrWait([crud.id], \"write-only\"));\n return teams.map((t) => app._serverTeamFromCrud(t));\n },\n useTeams() {\n const teams = useAsyncCache(app._serverTeamsCache, [crud.id], \"user.useTeams()\");\n return useMemo(() => teams.map((t) => app._serverTeamFromCrud(t)), [teams]);\n },\n createTeam: async (data: Omit<ServerTeamCreateOptions, \"creatorUserId\">) => {\n const team = await app._interface.createServerTeam(serverTeamCreateOptionsToCrud({\n creatorUserId: crud.id,\n ...data,\n }));\n await app._serverTeamsCache.refresh([undefined]);\n return app._serverTeamFromCrud(team);\n },\n leaveTeam: async (team: Team) => {\n await app._interface.leaveServerTeam({ teamId: team.id, userId: crud.id });\n // TODO: refresh cache\n },\n async listPermissions(scope: Team, options?: { recursive?: boolean }): Promise<AdminTeamPermission[]> {\n const recursive = options?.recursive ?? true;\n const permissions = Result.orThrow(await app._serverTeamUserPermissionsCache.getOrWait([scope.id, crud.id, recursive], \"write-only\"));\n return permissions.map((crud) => app._serverPermissionFromCrud(crud));\n },\n usePermissions(scope: Team, options?: { recursive?: boolean }): AdminTeamPermission[] {\n const recursive = options?.recursive ?? true;\n const permissions = useAsyncCache(app._serverTeamUserPermissionsCache, [scope.id, crud.id, recursive] as const, \"user.usePermissions()\");\n return useMemo(() => permissions.map((crud) => app._serverPermissionFromCrud(crud)), [permissions]);\n },\n async getPermission(scope: Team, permissionId: string): Promise<AdminTeamPermission | null> {\n const permissions = await this.listPermissions(scope);\n return permissions.find((p) => p.id === permissionId) ?? null;\n },\n usePermission(scope: Team, permissionId: string): AdminTeamPermission | null {\n const permissions = this.usePermissions(scope);\n return useMemo(() => permissions.find((p) => p.id === permissionId) ?? null, [permissions, permissionId]);\n },\n async hasPermission(scope: Team, permissionId: string): Promise<boolean> {\n return await this.getPermission(scope, permissionId) !== null;\n },\n async update(update: ServerUserUpdateOptions) {\n await app._updateServerUser(crud.id, update);\n },\n async sendVerificationEmail() {\n return await app._checkFeatureSupport(\"sendVerificationEmail() on ServerUser\", {});\n },\n async updatePassword(options: { oldPassword: string, newPassword: string}) {\n const result = await app._interface.updatePassword(options);\n await app._serverUserCache.refresh([crud.id]);\n return result;\n },\n async setPassword(options: { password: string }) {\n const result = await this.update(options);\n await app._serverUserCache.refresh([crud.id]);\n return result;\n },\n async getTeamProfile(team: Team) {\n const result = Result.orThrow(await app._serverUserTeamProfileCache.getOrWait([team.id, crud.id], \"write-only\"));\n return app._serverEditableTeamProfileFromCrud(result);\n },\n useTeamProfile(team: Team) {\n const result = useAsyncCache(app._serverUserTeamProfileCache, [team.id, crud.id] as const, \"user.useTeamProfile()\");\n return useMemo(() => app._serverEditableTeamProfileFromCrud(result), [result]);\n },\n async listContactChannels() {\n const result = Result.orThrow(await app._serverContactChannelsCache.getOrWait([crud.id], \"write-only\"));\n return result.map((data) => app._serverContactChannelFromCrud(crud.id, data));\n },\n useContactChannels() {\n const result = useAsyncCache(app._serverContactChannelsCache, [crud.id] as const, \"user.useContactChannels()\");\n return useMemo(() => result.map((data) => app._serverContactChannelFromCrud(crud.id, data)), [result]);\n },\n createContactChannel: async (data: ServerContactChannelCreateOptions) => {\n const contactChannel = await app._interface.createServerContactChannel(serverContactChannelCreateOptionsToCrud(crud.id, data));\n await Promise.all([\n app._serverContactChannelsCache.refresh([crud.id]),\n app._serverUserCache.refresh([crud.id])\n ]);\n return app._serverContactChannelFromCrud(crud.id, contactChannel);\n },\n };\n }\n\n protected _serverTeamUserFromCrud(crud: TeamMemberProfilesCrud[\"Server\"][\"Read\"]): ServerTeamUser {\n return {\n ...this._serverUserFromCrud(crud.user),\n teamProfile: {\n displayName: crud.display_name,\n profileImageUrl: crud.profile_image_url,\n },\n };\n }\n\n protected _serverTeamInvitationFromCrud(crud: TeamInvitationCrud['Server']['Read']): TeamInvitation {\n return {\n id: crud.id,\n recipientEmail: crud.recipient_email,\n expiresAt: new Date(crud.expires_at_millis),\n revoke: async () => {\n await this._interface.revokeServerTeamInvitation(crud.id, crud.team_id);\n },\n };\n }\n\n protected override _currentUserFromCrud(crud: UsersCrud['Server']['Read'], session: InternalSession): ProjectCurrentServerUser<ProjectId> {\n const app = this;\n const currentUser = {\n ...this._serverUserFromCrud(crud),\n ...this._createAuth(session),\n ...this._isInternalProject() ? this._createInternalUserExtra(session) : {},\n } satisfies ServerUser;\n\n Object.freeze(currentUser);\n return currentUser as ProjectCurrentServerUser<ProjectId>;\n }\n\n protected _serverTeamFromCrud(crud: TeamsCrud['Server']['Read']): ServerTeam {\n const app = this;\n return {\n id: crud.id,\n displayName: crud.display_name,\n profileImageUrl: crud.profile_image_url,\n createdAt: new Date(crud.created_at_millis),\n clientMetadata: crud.client_metadata,\n clientReadOnlyMetadata: crud.client_read_only_metadata,\n serverMetadata: crud.server_metadata,\n async update(update: Partial<ServerTeamUpdateOptions>) {\n await app._interface.updateServerTeam(crud.id, serverTeamUpdateOptionsToCrud(update));\n await app._serverTeamsCache.refresh([undefined]);\n },\n async delete() {\n await app._interface.deleteServerTeam(crud.id);\n await app._serverTeamsCache.refresh([undefined]);\n },\n async listUsers() {\n const result = Result.orThrow(await app._serverTeamMemberProfilesCache.getOrWait([crud.id], \"write-only\"));\n return result.map(u => app._serverTeamUserFromCrud(u));\n },\n useUsers() {\n const result = useAsyncCache(app._serverTeamMemberProfilesCache, [crud.id] as const, \"team.useUsers()\");\n return useMemo(() => result.map(u => app._serverTeamUserFromCrud(u)), [result]);\n },\n async addUser(userId) {\n await app._interface.addServerUserToTeam({\n teamId: crud.id,\n userId,\n });\n await app._serverTeamMemberProfilesCache.refresh([crud.id]);\n },\n async removeUser(userId) {\n await app._interface.removeServerUserFromTeam({\n teamId: crud.id,\n userId,\n });\n await app._serverTeamMemberProfilesCache.refresh([crud.id]);\n },\n async inviteUser(options: { email: string, callbackUrl?: string }) {\n if (!options.callbackUrl && !await app._getCurrentUrl()) {\n throw new Error(\"Cannot invite user without a callback URL from the server or without a redirect method. Make sure you pass the `callbackUrl` option: `inviteUser({ email, callbackUrl: ... })`\");\n }\n\n await app._interface.sendServerTeamInvitation({\n teamId: crud.id,\n email: options.email,\n callbackUrl: options.callbackUrl ?? constructRedirectUrl(app.urls.teamInvitation),\n });\n await app._serverTeamInvitationsCache.refresh([crud.id]);\n },\n async listInvitations() {\n const result = Result.orThrow(await app._serverTeamInvitationsCache.getOrWait([crud.id], \"write-only\"));\n return result.map((crud) => app._serverTeamInvitationFromCrud(crud));\n },\n useInvitations() {\n const result = useAsyncCache(app._serverTeamInvitationsCache, [crud.id] as const, \"team.useInvitations()\");\n return useMemo(() => result.map((crud) => app._serverTeamInvitationFromCrud(crud)), [result]);\n },\n };\n }\n\n async createUser(options: ServerUserCreateOptions): Promise<ServerUser> {\n const crud = await this._interface.createServerUser(serverUserCreateOptionsToCrud(options));\n await this._refreshUsers();\n return this._serverUserFromCrud(crud);\n }\n\n async getUser(options: GetUserOptions<HasTokenStore> & { or: 'redirect' }): Promise<ProjectCurrentServerUser<ProjectId>>;\n async getUser(options: GetUserOptions<HasTokenStore> & { or: 'throw' }): Promise<ProjectCurrentServerUser<ProjectId>>;\n async getUser(options: GetUserOptions<HasTokenStore> & { or: 'anonymous' }): Promise<ProjectCurrentServerUser<ProjectId>>;\n async getUser(options?: GetUserOptions<HasTokenStore>): Promise<ProjectCurrentServerUser<ProjectId> | null>;\n async getUser(id: string): Promise<ServerUser | null>;\n async getUser(options?: string | GetUserOptions<HasTokenStore>): Promise<ProjectCurrentServerUser<ProjectId> | ServerUser | null> {\n if (typeof options === \"string\") {\n return await this.getServerUserById(options);\n } else {\n // TODO this code is duplicated from the client app; fix that\n this._ensurePersistentTokenStore(options?.tokenStore);\n const session = await this._getSession(options?.tokenStore);\n let crud = Result.orThrow(await this._currentServerUserCache.getOrWait([session], \"write-only\"));\n if (crud?.is_anonymous && options?.or !== \"anonymous\" && options?.or !== \"anonymous-if-exists\") {\n crud = null;\n }\n\n if (crud === null) {\n switch (options?.or) {\n case 'redirect': {\n await this.redirectToSignIn({ replace: true });\n break;\n }\n case 'throw': {\n throw new Error(\"User is not signed in but getUser was called with { or: 'throw' }\");\n }\n case 'anonymous': {\n const tokens = await this._signUpAnonymously();\n return await this.getUser({ tokenStore: tokens }) ?? throwErr(\"Something went wrong while signing up anonymously\");\n }\n case undefined:\n case \"anonymous-if-exists\":\n case \"return-null\": {\n return null;\n }\n }\n }\n\n return crud && this._currentUserFromCrud(crud, session);\n }\n }\n\n async getServerUser(): Promise<ProjectCurrentServerUser<ProjectId> | null> {\n console.warn(\"stackServerApp.getServerUser is deprecated; use stackServerApp.getUser instead\");\n return await this.getUser();\n }\n\n async getServerUserById(userId: string): Promise<ServerUser | null> {\n const crud = Result.orThrow(await this._serverUserCache.getOrWait([userId], \"write-only\"));\n return crud && this._serverUserFromCrud(crud);\n }\n\n useUser(options: GetUserOptions<HasTokenStore> & { or: 'redirect' }): ProjectCurrentServerUser<ProjectId>;\n useUser(options: GetUserOptions<HasTokenStore> & { or: 'throw' }): ProjectCurrentServerUser<ProjectId>;\n useUser(options: GetUserOptions<HasTokenStore> & { or: 'anonymous' }): ProjectCurrentServerUser<ProjectId>;\n useUser(options?: GetUserOptions<HasTokenStore>): ProjectCurrentServerUser<ProjectId> | null;\n useUser(id: string): ServerUser | null;\n useUser(options?: GetUserOptions<HasTokenStore> | string): ProjectCurrentServerUser<ProjectId> | ServerUser | null {\n if (typeof options === \"string\") {\n return this.useUserById(options);\n } else {\n // TODO this code is duplicated from the client app; fix that\n this._ensurePersistentTokenStore(options?.tokenStore);\n\n const session = this._useSession(options?.tokenStore);\n let crud = useAsyncCache(this._currentServerUserCache, [session] as const, \"useUser()\");\n if (crud?.is_anonymous && options?.or !== \"anonymous\" && options?.or !== \"anonymous-if-exists\") {\n crud = null;\n }\n\n if (crud === null) {\n switch (options?.or) {\n case 'redirect': {\n runAsynchronously(this.redirectToSignIn({ replace: true }));\n suspend();\n throw new StackAssertionError(\"suspend should never return\");\n }\n case 'throw': {\n throw new Error(\"User is not signed in but useUser was called with { or: 'throw' }\");\n }\n case 'anonymous': {\n // TODO we should think about the behavior when calling useUser (or getUser) in anonymous with a custom token store. signUpAnonymously always sets the current token store on app level, instead of the one passed to this function\n // TODO we shouldn't reload & suspend here, instead we should use a promise that resolves to the new anonymous user\n runAsynchronously(async () => {\n await this._signUpAnonymously();\n if (typeof window !== \"undefined\") {\n window.location.reload();\n }\n });\n suspend();\n throw new StackAssertionError(\"suspend should never return\");\n }\n case undefined:\n case \"anonymous-if-exists\":\n case \"return-null\": {\n // do nothing\n }\n }\n }\n\n return useMemo(() => {\n return crud && this._currentUserFromCrud(crud, session);\n }, [crud, session, options?.or]);\n }\n }\n useUserById(userId: string): ServerUser | null {\n const crud = useAsyncCache(this._serverUserCache, [userId], \"useUserById()\");\n return useMemo(() => {\n return crud && this._serverUserFromCrud(crud);\n }, [crud]);\n }\n\n async listUsers(options?: ServerListUsersOptions): Promise<ServerUser[] & { nextCursor: string | null }> {\n const crud = Result.orThrow(await this._serverUsersCache.getOrWait([options?.cursor, options?.limit, options?.orderBy, options?.desc, options?.query], \"write-only\"));\n const result: any = crud.items.map((j) => this._serverUserFromCrud(j));\n result.nextCursor = crud.pagination?.next_cursor ?? null;\n return result as any;\n }\n\n useUsers(options?: ServerListUsersOptions): ServerUser[] & { nextCursor: string | null } {\n const crud = useAsyncCache(this._serverUsersCache, [options?.cursor, options?.limit, options?.orderBy, options?.desc, options?.query] as const, \"useServerUsers()\");\n const result: any = crud.items.map((j) => this._serverUserFromCrud(j));\n result.nextCursor = crud.pagination?.next_cursor ?? null;\n return result as any;\n }\n\n _serverPermissionFromCrud(crud: TeamPermissionsCrud['Server']['Read']): AdminTeamPermission {\n return {\n id: crud.id,\n };\n }\n\n _serverTeamPermissionDefinitionFromCrud(crud: TeamPermissionDefinitionsCrud['Admin']['Read']): AdminTeamPermissionDefinition {\n return {\n id: crud.id,\n description: crud.description,\n containedPermissionIds: crud.contained_permission_ids,\n };\n }\n\n async listTeams(): Promise<ServerTeam[]> {\n const teams = Result.orThrow(await this._serverTeamsCache.getOrWait([undefined], \"write-only\"));\n return teams.map((t) => this._serverTeamFromCrud(t));\n }\n\n async createTeam(data: ServerTeamCreateOptions): Promise<ServerTeam> {\n const team = await this._interface.createServerTeam(serverTeamCreateOptionsToCrud(data));\n await this._serverTeamsCache.refresh([undefined]);\n return this._serverTeamFromCrud(team);\n }\n\n useTeams(): ServerTeam[] {\n const teams = useAsyncCache(this._serverTeamsCache, [undefined], \"useServerTeams()\");\n return useMemo(() => {\n return teams.map((t) => this._serverTeamFromCrud(t));\n }, [teams]);\n }\n\n async getTeam(teamId: string): Promise<ServerTeam | null> {\n const teams = await this.listTeams();\n return teams.find((t) => t.id === teamId) ?? null;\n }\n\n useTeam(teamId: string): ServerTeam | null {\n const teams = this.useTeams();\n return useMemo(() => {\n return teams.find((t) => t.id === teamId) ?? null;\n }, [teams, teamId]);\n }\n\n protected override async _refreshSession(session: InternalSession) {\n await Promise.all([\n super._refreshUser(session),\n this._currentServerUserCache.refresh([session]),\n ]);\n }\n\n protected override async _refreshUsers() {\n await Promise.all([\n super._refreshUsers(),\n this._serverUserCache.refreshWhere(() => true),\n this._serverUsersCache.refreshWhere(() => true),\n this._serverContactChannelsCache.refreshWhere(() => true),\n ]);\n }\n}\n"],"mappings":"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","names":["crud"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../src/lib/stack-app/apps/interfaces/client-app.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\nimport { KnownErrors } from \"@stackframe/stack-shared\";\nimport { CurrentUserCrud } from \"@stackframe/stack-shared/dist/interface/crud/current-user\";\nimport { Result } from \"@stackframe/stack-shared/dist/utils/results\";\nimport { AsyncStoreProperty, GetUserOptions, HandlerUrls, OAuthScopesOnSignIn, RedirectMethod, RedirectToOptions, TokenStoreInit, stackAppInternalsSymbol } from \"../../common\";\nimport { Project } from \"../../projects\";\nimport { ProjectCurrentUser } from \"../../users\";\nimport { _StackClientAppImpl } from \"../implementations\";\n\n\nexport type StackClientAppConstructorOptions<HasTokenStore extends boolean, ProjectId extends string> = {\n baseUrl?: string | { browser: string, server: string },\n extraRequestHeaders?: Record<string, string>,\n projectId?: ProjectId,\n publishableClientKey?: string,\n urls?: Partial<HandlerUrls>,\n oauthScopesOnSignIn?: Partial<OAuthScopesOnSignIn>,\n tokenStore: TokenStoreInit<HasTokenStore>,\n redirectMethod?: RedirectMethod,\n\n /**\n * By default, the Stack app will automatically prefetch some data from Stack's server when this app is first\n * constructed. This improves the performance of your app, but will create network requests that are unnecessary if\n * the app is never used or disposed of immediately. To disable this behavior, set this option to true.\n */\n noAutomaticPrefetch?: boolean,\n};\n\n\nexport type StackClientAppJson<HasTokenStore extends boolean, ProjectId extends string> = StackClientAppConstructorOptions<HasTokenStore, ProjectId> & {\n uniqueIdentifier: string,\n // note: if you add more fields here, make sure to ensure the checkString in the constructor has/doesn't have them\n};\n\nexport type StackClientApp<HasTokenStore extends boolean = boolean, ProjectId extends string = string> = (\n & {\n readonly projectId: ProjectId,\n\n readonly urls: Readonly<HandlerUrls>,\n\n signInWithOAuth(provider: string): Promise<void>,\n signInWithCredential(options: { email: string, password: string, noRedirect?: boolean }): Promise<Result<undefined, KnownErrors[\"EmailPasswordMismatch\"] | KnownErrors[\"InvalidTotpCode\"]>>,\n signUpWithCredential(options: { email: string, password: string, noRedirect?: boolean, verificationCallbackUrl?: string }): Promise<Result<undefined, KnownErrors[\"UserEmailAlreadyExists\"] | KnownErrors[\"PasswordRequirementsNotMet\"]>>,\n signInWithPasskey(): Promise<Result<undefined, KnownErrors[\"PasskeyAuthenticationFailed\"]| KnownErrors[\"InvalidTotpCode\"] | KnownErrors[\"PasskeyWebAuthnError\"]>>,\n callOAuthCallback(): Promise<boolean>,\n sendForgotPasswordEmail(email: string, options?: { callbackUrl?: string }): Promise<Result<undefined, KnownErrors[\"UserNotFound\"]>>,\n sendMagicLinkEmail(email: string, options?: { callbackUrl?: string }): Promise<Result<{ nonce: string }, KnownErrors[\"RedirectUrlNotWhitelisted\"]>>,\n resetPassword(options: { code: string, password: string }): Promise<Result<undefined, KnownErrors[\"VerificationCodeError\"]>>,\n verifyPasswordResetCode(code: string): Promise<Result<undefined, KnownErrors[\"VerificationCodeError\"]>>,\n verifyTeamInvitationCode(code: string): Promise<Result<undefined, KnownErrors[\"VerificationCodeError\"]>>,\n acceptTeamInvitation(code: string): Promise<Result<undefined, KnownErrors[\"VerificationCodeError\"]>>,\n getTeamInvitationDetails(code: string): Promise<Result<{ teamDisplayName: string }, KnownErrors[\"VerificationCodeError\"]>>,\n verifyEmail(code: string): Promise<Result<undefined, KnownErrors[\"VerificationCodeError\"]>>,\n signInWithMagicLink(code: string): Promise<Result<undefined, KnownErrors[\"VerificationCodeError\"] | KnownErrors[\"InvalidTotpCode\"]>>,\n\n redirectToOAuthCallback(): Promise<void>,\n\n useUser(options: GetUserOptions<HasTokenStore> & { or: 'redirect' }): ProjectCurrentUser<ProjectId>,\n useUser(options: GetUserOptions<HasTokenStore> & { or: 'throw' }): ProjectCurrentUser<ProjectId>,\n useUser(options?: GetUserOptions<HasTokenStore>): ProjectCurrentUser<ProjectId> | null,\n\n getUser(options: GetUserOptions<HasTokenStore> & { or: 'redirect' }): Promise<ProjectCurrentUser<ProjectId>>,\n getUser(options: GetUserOptions<HasTokenStore> & { or: 'throw' }): Promise<ProjectCurrentUser<ProjectId>>,\n getUser(options?: GetUserOptions<HasTokenStore>): Promise<ProjectCurrentUser<ProjectId> | null>,\n\n useNavigate(): (to: string) => void, // THIS_LINE_PLATFORM react-like\n\n [stackAppInternalsSymbol]: {\n toClientJson(): StackClientAppJson<HasTokenStore, ProjectId>,\n setCurrentUser(userJsonPromise: Promise<CurrentUserCrud['Client']['Read'] | null>): void,\n },\n }\n & AsyncStoreProperty<\"project\", [], Project, false>\n & { [K in `redirectTo${Capitalize<keyof Omit<HandlerUrls, 'handler' | 'oauthCallback'>>}`]: (options?: RedirectToOptions) => Promise<void> }\n);\nexport type StackClientAppConstructor = {\n new <\n TokenStoreType extends string,\n HasTokenStore extends (TokenStoreType extends {} ? true : boolean),\n ProjectId extends string\n >(options: StackClientAppConstructorOptions<HasTokenStore, ProjectId>): StackClientApp<HasTokenStore, ProjectId>,\n new (options: StackClientAppConstructorOptions<boolean, string>): StackClientApp<boolean, string>,\n\n [stackAppInternalsSymbol]: {\n fromClientJson<HasTokenStore extends boolean, ProjectId extends string>(\n json: StackClientAppJson<HasTokenStore, ProjectId>\n ): StackClientApp<HasTokenStore, ProjectId>,\n },\n};\nexport const StackClientApp: StackClientAppConstructor = _StackClientAppImpl;\n"],"mappings":";AAUA,SAAS,2BAA2B;AAkF7B,IAAM,iBAA4C;","names":[]}
1
+ {"version":3,"sources":["../../../../../../src/lib/stack-app/apps/interfaces/client-app.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\nimport { KnownErrors } from \"@stackframe/stack-shared\";\nimport { CurrentUserCrud } from \"@stackframe/stack-shared/dist/interface/crud/current-user\";\nimport { Result } from \"@stackframe/stack-shared/dist/utils/results\";\nimport { AsyncStoreProperty, GetUserOptions, HandlerUrls, OAuthScopesOnSignIn, RedirectMethod, RedirectToOptions, TokenStoreInit, stackAppInternalsSymbol } from \"../../common\";\nimport { Project } from \"../../projects\";\nimport { ProjectCurrentUser } from \"../../users\";\nimport { _StackClientAppImpl } from \"../implementations\";\n\n\nexport type StackClientAppConstructorOptions<HasTokenStore extends boolean, ProjectId extends string> = {\n baseUrl?: string | { browser: string, server: string },\n extraRequestHeaders?: Record<string, string>,\n projectId?: ProjectId,\n publishableClientKey?: string,\n urls?: Partial<HandlerUrls>,\n oauthScopesOnSignIn?: Partial<OAuthScopesOnSignIn>,\n tokenStore: TokenStoreInit<HasTokenStore>,\n redirectMethod?: RedirectMethod,\n\n /**\n * By default, the Stack app will automatically prefetch some data from Stack's server when this app is first\n * constructed. This improves the performance of your app, but will create network requests that are unnecessary if\n * the app is never used or disposed of immediately. To disable this behavior, set this option to true.\n */\n noAutomaticPrefetch?: boolean,\n};\n\n\nexport type StackClientAppJson<HasTokenStore extends boolean, ProjectId extends string> = StackClientAppConstructorOptions<HasTokenStore, ProjectId> & {\n uniqueIdentifier: string,\n // note: if you add more fields here, make sure to ensure the checkString in the constructor has/doesn't have them\n};\n\nexport type StackClientApp<HasTokenStore extends boolean = boolean, ProjectId extends string = string> = (\n & {\n readonly projectId: ProjectId,\n\n readonly urls: Readonly<HandlerUrls>,\n\n signInWithOAuth(provider: string): Promise<void>,\n signInWithCredential(options: { email: string, password: string, noRedirect?: boolean }): Promise<Result<undefined, KnownErrors[\"EmailPasswordMismatch\"] | KnownErrors[\"InvalidTotpCode\"]>>,\n signUpWithCredential(options: { email: string, password: string, noRedirect?: boolean, verificationCallbackUrl?: string }): Promise<Result<undefined, KnownErrors[\"UserWithEmailAlreadyExists\"] | KnownErrors[\"PasswordRequirementsNotMet\"]>>,\n signInWithPasskey(): Promise<Result<undefined, KnownErrors[\"PasskeyAuthenticationFailed\"]| KnownErrors[\"InvalidTotpCode\"] | KnownErrors[\"PasskeyWebAuthnError\"]>>,\n callOAuthCallback(): Promise<boolean>,\n sendForgotPasswordEmail(email: string, options?: { callbackUrl?: string }): Promise<Result<undefined, KnownErrors[\"UserNotFound\"]>>,\n sendMagicLinkEmail(email: string, options?: { callbackUrl?: string }): Promise<Result<{ nonce: string }, KnownErrors[\"RedirectUrlNotWhitelisted\"]>>,\n resetPassword(options: { code: string, password: string }): Promise<Result<undefined, KnownErrors[\"VerificationCodeError\"]>>,\n verifyPasswordResetCode(code: string): Promise<Result<undefined, KnownErrors[\"VerificationCodeError\"]>>,\n verifyTeamInvitationCode(code: string): Promise<Result<undefined, KnownErrors[\"VerificationCodeError\"]>>,\n acceptTeamInvitation(code: string): Promise<Result<undefined, KnownErrors[\"VerificationCodeError\"]>>,\n getTeamInvitationDetails(code: string): Promise<Result<{ teamDisplayName: string }, KnownErrors[\"VerificationCodeError\"]>>,\n verifyEmail(code: string): Promise<Result<undefined, KnownErrors[\"VerificationCodeError\"]>>,\n signInWithMagicLink(code: string, options?: { noRedirect?: boolean }): Promise<Result<undefined, KnownErrors[\"VerificationCodeError\"] | KnownErrors[\"InvalidTotpCode\"]>>,\n\n redirectToOAuthCallback(): Promise<void>,\n\n useUser(options: GetUserOptions<HasTokenStore> & { or: 'redirect' }): ProjectCurrentUser<ProjectId>,\n useUser(options: GetUserOptions<HasTokenStore> & { or: 'throw' }): ProjectCurrentUser<ProjectId>,\n useUser(options: GetUserOptions<HasTokenStore> & { or: 'anonymous' }): ProjectCurrentUser<ProjectId>,\n useUser(options?: GetUserOptions<HasTokenStore>): ProjectCurrentUser<ProjectId> | null,\n\n getUser(options: GetUserOptions<HasTokenStore> & { or: 'redirect' }): Promise<ProjectCurrentUser<ProjectId>>,\n getUser(options: GetUserOptions<HasTokenStore> & { or: 'throw' }): Promise<ProjectCurrentUser<ProjectId>>,\n getUser(options: GetUserOptions<HasTokenStore> & { or: 'anonymous' }): Promise<ProjectCurrentUser<ProjectId>>,\n getUser(options?: GetUserOptions<HasTokenStore>): Promise<ProjectCurrentUser<ProjectId> | null>,\n\n useNavigate(): (to: string) => void, // THIS_LINE_PLATFORM react-like\n\n [stackAppInternalsSymbol]: {\n toClientJson(): StackClientAppJson<HasTokenStore, ProjectId>,\n setCurrentUser(userJsonPromise: Promise<CurrentUserCrud['Client']['Read'] | null>): void,\n },\n }\n & AsyncStoreProperty<\"project\", [], Project, false>\n & { [K in `redirectTo${Capitalize<keyof Omit<HandlerUrls, 'handler' | 'oauthCallback'>>}`]: (options?: RedirectToOptions) => Promise<void> }\n);\nexport type StackClientAppConstructor = {\n new <\n TokenStoreType extends string,\n HasTokenStore extends (TokenStoreType extends {} ? true : boolean),\n ProjectId extends string\n >(options: StackClientAppConstructorOptions<HasTokenStore, ProjectId>): StackClientApp<HasTokenStore, ProjectId>,\n new (options: StackClientAppConstructorOptions<boolean, string>): StackClientApp<boolean, string>,\n\n [stackAppInternalsSymbol]: {\n fromClientJson<HasTokenStore extends boolean, ProjectId extends string>(\n json: StackClientAppJson<HasTokenStore, ProjectId>\n ): StackClientApp<HasTokenStore, ProjectId>,\n },\n};\nexport const StackClientApp: StackClientAppConstructor = _StackClientAppImpl;\n"],"mappings":";AAUA,SAAS,2BAA2B;AAoF7B,IAAM,iBAA4C;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../src/lib/stack-app/apps/interfaces/server-app.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\nimport { AsyncStoreProperty, GetUserOptions } from \"../../common\";\nimport { ServerListUsersOptions, ServerTeam, ServerTeamCreateOptions } from \"../../teams\";\nimport { ProjectCurrentServerUser, ServerUser, ServerUserCreateOptions } from \"../../users\";\nimport { _StackServerAppImpl } from \"../implementations\";\nimport { StackClientApp, StackClientAppConstructorOptions } from \"./client-app\";\n\n\nexport type StackServerAppConstructorOptions<HasTokenStore extends boolean, ProjectId extends string> = StackClientAppConstructorOptions<HasTokenStore, ProjectId> & {\n secretServerKey?: string,\n};\n\nexport type StackServerApp<HasTokenStore extends boolean = boolean, ProjectId extends string = string> = (\n & {\n createTeam(data: ServerTeamCreateOptions): Promise<ServerTeam>,\n /**\n * @deprecated use `getUser()` instead\n */\n getServerUser(): Promise<ProjectCurrentServerUser<ProjectId> | null>,\n\n createUser(options: ServerUserCreateOptions): Promise<ServerUser>,\n\n useUser(options: GetUserOptions<HasTokenStore> & { or: 'redirect' }): ProjectCurrentServerUser<ProjectId>,\n useUser(options: GetUserOptions<HasTokenStore> & { or: 'throw' }): ProjectCurrentServerUser<ProjectId>,\n useUser(options?: GetUserOptions<HasTokenStore>): ProjectCurrentServerUser<ProjectId> | null,\n\n getUser(options: GetUserOptions<HasTokenStore> & { or: 'redirect' }): Promise<ProjectCurrentServerUser<ProjectId>>,\n getUser(options: GetUserOptions<HasTokenStore> & { or: 'throw' }): Promise<ProjectCurrentServerUser<ProjectId>>,\n getUser(options?: GetUserOptions<HasTokenStore>): Promise<ProjectCurrentServerUser<ProjectId> | null>,\n getUser(id: string): Promise<ServerUser | null>,\n\n useUsers(options?: ServerListUsersOptions): ServerUser[] & { nextCursor: string | null }, // THIS_LINE_PLATFORM react-like\n listUsers(options?: ServerListUsersOptions): Promise<ServerUser[] & { nextCursor: string | null }>,\n }\n & AsyncStoreProperty<\"user\", [id: string], ServerUser | null, false>\n & Omit<AsyncStoreProperty<\"users\", [], ServerUser[], true>, \"listUsers\" | \"useUsers\">\n & AsyncStoreProperty<\"team\", [id: string], ServerTeam | null, false>\n & AsyncStoreProperty<\"teams\", [], ServerTeam[], true>\n & StackClientApp<HasTokenStore, ProjectId>\n);\nexport type StackServerAppConstructor = {\n new <\n TokenStoreType extends string,\n HasTokenStore extends (TokenStoreType extends {} ? true : boolean),\n ProjectId extends string\n >(options: StackServerAppConstructorOptions<HasTokenStore, ProjectId>): StackServerApp<HasTokenStore, ProjectId>,\n new (options: StackServerAppConstructorOptions<boolean, string>): StackServerApp<boolean, string>,\n};\nexport const StackServerApp: StackServerAppConstructor = _StackServerAppImpl;\n"],"mappings":";AAOA,SAAS,2BAA2B;AA4C7B,IAAM,iBAA4C;","names":[]}
1
+ {"version":3,"sources":["../../../../../../src/lib/stack-app/apps/interfaces/server-app.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\nimport { AsyncStoreProperty, GetUserOptions } from \"../../common\";\nimport { ServerListUsersOptions, ServerTeam, ServerTeamCreateOptions } from \"../../teams\";\nimport { ProjectCurrentServerUser, ServerUser, ServerUserCreateOptions } from \"../../users\";\nimport { _StackServerAppImpl } from \"../implementations\";\nimport { StackClientApp, StackClientAppConstructorOptions } from \"./client-app\";\n\n\nexport type StackServerAppConstructorOptions<HasTokenStore extends boolean, ProjectId extends string> = StackClientAppConstructorOptions<HasTokenStore, ProjectId> & {\n secretServerKey?: string,\n};\n\nexport type StackServerApp<HasTokenStore extends boolean = boolean, ProjectId extends string = string> = (\n & {\n createTeam(data: ServerTeamCreateOptions): Promise<ServerTeam>,\n /**\n * @deprecated use `getUser()` instead\n */\n getServerUser(): Promise<ProjectCurrentServerUser<ProjectId> | null>,\n\n createUser(options: ServerUserCreateOptions): Promise<ServerUser>,\n\n useUser(options: GetUserOptions<HasTokenStore> & { or: 'redirect' }): ProjectCurrentServerUser<ProjectId>,\n useUser(options: GetUserOptions<HasTokenStore> & { or: 'throw' }): ProjectCurrentServerUser<ProjectId>,\n useUser(options: GetUserOptions<HasTokenStore> & { or: 'anonymous' }): ProjectCurrentServerUser<ProjectId>,\n useUser(options?: GetUserOptions<HasTokenStore>): ProjectCurrentServerUser<ProjectId> | null,\n\n getUser(options: GetUserOptions<HasTokenStore> & { or: 'redirect' }): Promise<ProjectCurrentServerUser<ProjectId>>,\n getUser(options: GetUserOptions<HasTokenStore> & { or: 'throw' }): Promise<ProjectCurrentServerUser<ProjectId>>,\n getUser(options: GetUserOptions<HasTokenStore> & { or: 'anonymous' }): Promise<ProjectCurrentServerUser<ProjectId>>,\n getUser(options?: GetUserOptions<HasTokenStore>): Promise<ProjectCurrentServerUser<ProjectId> | null>,\n getUser(id: string): Promise<ServerUser | null>,\n\n useUsers(options?: ServerListUsersOptions): ServerUser[] & { nextCursor: string | null }, // THIS_LINE_PLATFORM react-like\n listUsers(options?: ServerListUsersOptions): Promise<ServerUser[] & { nextCursor: string | null }>,\n }\n & AsyncStoreProperty<\"user\", [id: string], ServerUser | null, false>\n & Omit<AsyncStoreProperty<\"users\", [], ServerUser[], true>, \"listUsers\" | \"useUsers\">\n & AsyncStoreProperty<\"team\", [id: string], ServerTeam | null, false>\n & AsyncStoreProperty<\"teams\", [], ServerTeam[], true>\n & StackClientApp<HasTokenStore, ProjectId>\n);\nexport type StackServerAppConstructor = {\n new <\n TokenStoreType extends string,\n HasTokenStore extends (TokenStoreType extends {} ? true : boolean),\n ProjectId extends string\n >(options: StackServerAppConstructorOptions<HasTokenStore, ProjectId>): StackServerApp<HasTokenStore, ProjectId>,\n new (options: StackServerAppConstructorOptions<boolean, string>): StackServerApp<boolean, string>,\n};\nexport const StackServerApp: StackServerAppConstructor = _StackServerAppImpl;\n"],"mappings":";AAOA,SAAS,2BAA2B;AA8C7B,IAAM,iBAA4C;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/lib/stack-app/common.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\nimport { ProviderType } from \"@stackframe/stack-shared/dist/utils/oauth\";\n\nexport type RedirectToOptions = {\n replace?: boolean,\n noRedirectBack?: boolean,\n};\n\nexport type AsyncStoreProperty<Name extends string, Args extends any[], Value, IsMultiple extends boolean> =\n & { [key in `${IsMultiple extends true ? \"list\" : \"get\"}${Capitalize<Name>}`]: (...args: Args) => Promise<Value> }\n & { [key in `use${Capitalize<Name>}`]: (...args: Args) => Value } // THIS_LINE_PLATFORM react-like\n\nexport type EmailConfig = {\n host: string,\n port: number,\n username: string,\n password: string,\n senderEmail: string,\n senderName: string,\n}\n\nexport type RedirectMethod = \"window\"\n | \"nextjs\" // THIS_LINE_PLATFORM next\n | \"none\"\n | {\n useNavigate: () => (to: string) => void,\n navigate?: (to: string) => void,\n }\n\n\nexport type GetUserOptions<HasTokenStore> =\n & {\n or?: 'redirect' | 'throw' | 'return-null',\n tokenStore?: TokenStoreInit,\n }\n & (HasTokenStore extends false ? {\n tokenStore: TokenStoreInit,\n } : {});\n\nexport type RequestLike = {\n headers: {\n get: (name: string) => string | null,\n },\n};\n\nexport type TokenStoreInit<HasTokenStore extends boolean = boolean> =\n HasTokenStore extends true ? (\n | \"cookie\"\n | \"nextjs-cookie\"\n | \"memory\"\n | RequestLike\n | { accessToken: string, refreshToken: string }\n )\n : HasTokenStore extends false ? null\n : TokenStoreInit<true> | TokenStoreInit<false>;\n\nexport type HandlerUrls = {\n handler: string,\n signIn: string,\n signUp: string,\n afterSignIn: string,\n afterSignUp: string,\n signOut: string,\n afterSignOut: string,\n emailVerification: string,\n passwordReset: string,\n forgotPassword: string,\n home: string,\n oauthCallback: string,\n magicLinkCallback: string,\n accountSettings: string,\n teamInvitation: string,\n error: string,\n}\n\nexport type OAuthScopesOnSignIn = {\n [key in ProviderType]: string[];\n};\n\n/** @internal */\nexport const stackAppInternalsSymbol = Symbol.for(\"StackAuth--DO-NOT-USE-OR-YOU-WILL-BE-FIRED--StackAppInternals\");\n"],"mappings":";AAmFO,IAAM,0BAA0B,OAAO,IAAI,+DAA+D;","names":[]}
1
+ {"version":3,"sources":["../../../../src/lib/stack-app/common.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\nimport { ProviderType } from \"@stackframe/stack-shared/dist/utils/oauth\";\n\nexport type RedirectToOptions = {\n replace?: boolean,\n noRedirectBack?: boolean,\n};\n\nexport type AsyncStoreProperty<Name extends string, Args extends any[], Value, IsMultiple extends boolean> =\n & { [key in `${IsMultiple extends true ? \"list\" : \"get\"}${Capitalize<Name>}`]: (...args: Args) => Promise<Value> }\n & { [key in `use${Capitalize<Name>}`]: (...args: Args) => Value } // THIS_LINE_PLATFORM react-like\n\nexport type EmailConfig = {\n host: string,\n port: number,\n username: string,\n password: string,\n senderEmail: string,\n senderName: string,\n}\n\nexport type RedirectMethod = \"window\"\n | \"nextjs\" // THIS_LINE_PLATFORM next\n | \"none\"\n | {\n useNavigate: () => (to: string) => void,\n navigate?: (to: string) => void,\n }\n\n\nexport type GetUserOptions<HasTokenStore> =\n & {\n or?: 'redirect' | 'throw' | 'return-null' | 'anonymous' | 'anonymous-if-exists',\n tokenStore?: TokenStoreInit,\n }\n & (HasTokenStore extends false ? {\n tokenStore: TokenStoreInit,\n } : {});\n\nexport type RequestLike = {\n headers: {\n get: (name: string) => string | null,\n },\n};\n\nexport type TokenStoreInit<HasTokenStore extends boolean = boolean> =\n HasTokenStore extends true ? (\n | \"cookie\"\n | \"nextjs-cookie\"\n | \"memory\"\n | RequestLike\n | { accessToken: string, refreshToken: string }\n )\n : HasTokenStore extends false ? null\n : TokenStoreInit<true> | TokenStoreInit<false>;\n\nexport type HandlerUrls = {\n handler: string,\n signIn: string,\n signUp: string,\n afterSignIn: string,\n afterSignUp: string,\n signOut: string,\n afterSignOut: string,\n emailVerification: string,\n passwordReset: string,\n forgotPassword: string,\n home: string,\n oauthCallback: string,\n magicLinkCallback: string,\n accountSettings: string,\n teamInvitation: string,\n error: string,\n}\n\nexport type OAuthScopesOnSignIn = {\n [key in ProviderType]: string[];\n};\n\n/** @internal */\nexport const stackAppInternalsSymbol = Symbol.for(\"StackAuth--DO-NOT-USE-OR-YOU-WILL-BE-FIRED--StackAppInternals\");\n"],"mappings":";AAmFO,IAAM,0BAA0B,OAAO,IAAI,+DAA+D;","names":[]}
@@ -5,7 +5,7 @@ import { StackProviderClient, UserSetter } from "./stack-provider-client";
5
5
  import { TranslationProvider } from "./translation-provider";
6
6
  import { jsx, jsxs } from "react/jsx-runtime";
7
7
  function UserFetcher(props) {
8
- const userPromise = props.app.getUser().then((user) => user?.toClientJson() ?? null);
8
+ const userPromise = props.app.getUser({ or: "anonymous-if-exists" }).then((user) => user?.toClientJson() ?? null);
9
9
  return /* @__PURE__ */ jsx(UserSetter, { userJsonPromise: userPromise });
10
10
  }
11
11
  function NextStackProvider({
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/providers/stack-provider.tsx"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\nimport React, { Suspense } from 'react';\nimport { StackAdminApp, StackClientApp, StackServerApp, stackAppInternalsSymbol } from '../lib/stack-app';\nimport { StackProviderClient, UserSetter } from './stack-provider-client';\nimport { TranslationProvider } from './translation-provider';\n\nfunction UserFetcher(props: { app: StackClientApp<true> }) {\n const userPromise = props.app.getUser().then((user) => user?.toClientJson() ?? null);\n return <UserSetter userJsonPromise={userPromise} />;\n}\n\nfunction NextStackProvider({\n children,\n app,\n lang,\n translationOverrides,\n}: {\n lang?: React.ComponentProps<typeof TranslationProvider>['lang'],\n /**\n * A mapping of English translations to translated equivalents.\n *\n * These will take priority over the translations from the language specified in the `lang` property. Note that the\n * keys are case-sensitive.\n */\n translationOverrides?: Record<string, string>,\n children: React.ReactNode,\n // list all three types of apps even though server and admin are subclasses of client so it's clear that you can pass any\n app: StackClientApp<true> | StackServerApp<true> | StackAdminApp<true>,\n}) {\n return (\n <StackProviderClient app={app[stackAppInternalsSymbol].toClientJson()} serialized={true}>\n <Suspense fallback={null}>\n <UserFetcher app={app} />\n </Suspense>\n <TranslationProvider lang={lang} translationOverrides={translationOverrides}>\n {children}\n </TranslationProvider>\n </StackProviderClient>\n );\n}\n\nexport default NextStackProvider;\n"],"mappings":";AAIA,SAAgB,gBAAgB;AAChC,SAAwD,+BAA+B;AACvF,SAAS,qBAAqB,kBAAkB;AAChD,SAAS,2BAA2B;AAI3B,cAsBL,YAtBK;AAFT,SAAS,YAAY,OAAsC;AACzD,QAAM,cAAc,MAAM,IAAI,QAAQ,EAAE,KAAK,CAAC,SAAS,MAAM,aAAa,KAAK,IAAI;AACnF,SAAO,oBAAC,cAAW,iBAAiB,aAAa;AACnD;AAEA,SAAS,kBAAkB;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAYG;AACD,SACE,qBAAC,uBAAoB,KAAK,IAAI,uBAAuB,EAAE,aAAa,GAAG,YAAY,MACjF;AAAA,wBAAC,YAAS,UAAU,MAClB,8BAAC,eAAY,KAAU,GACzB;AAAA,IACA,oBAAC,uBAAoB,MAAY,sBAC9B,UACH;AAAA,KACF;AAEJ;AAEA,IAAO,yBAAQ;","names":[]}
1
+ {"version":3,"sources":["../../../src/providers/stack-provider.tsx"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\nimport React, { Suspense } from 'react';\nimport { StackAdminApp, StackClientApp, StackServerApp, stackAppInternalsSymbol } from '../lib/stack-app';\nimport { StackProviderClient, UserSetter } from './stack-provider-client';\nimport { TranslationProvider } from './translation-provider';\n\nfunction UserFetcher(props: { app: StackClientApp<true> }) {\n const userPromise = props.app.getUser({ or: \"anonymous-if-exists\" }).then((user) => user?.toClientJson() ?? null);\n return <UserSetter userJsonPromise={userPromise} />;\n}\n\nfunction NextStackProvider({\n children,\n app,\n lang,\n translationOverrides,\n}: {\n lang?: React.ComponentProps<typeof TranslationProvider>['lang'],\n /**\n * A mapping of English translations to translated equivalents.\n *\n * These will take priority over the translations from the language specified in the `lang` property. Note that the\n * keys are case-sensitive.\n */\n translationOverrides?: Record<string, string>,\n children: React.ReactNode,\n // list all three types of apps even though server and admin are subclasses of client so it's clear that you can pass any\n app: StackClientApp<true> | StackServerApp<true> | StackAdminApp<true>,\n}) {\n return (\n <StackProviderClient app={app[stackAppInternalsSymbol].toClientJson()} serialized={true}>\n <Suspense fallback={null}>\n <UserFetcher app={app} />\n </Suspense>\n <TranslationProvider lang={lang} translationOverrides={translationOverrides}>\n {children}\n </TranslationProvider>\n </StackProviderClient>\n );\n}\n\nexport default NextStackProvider;\n"],"mappings":";AAIA,SAAgB,gBAAgB;AAChC,SAAwD,+BAA+B;AACvF,SAAS,qBAAqB,kBAAkB;AAChD,SAAS,2BAA2B;AAI3B,cAsBL,YAtBK;AAFT,SAAS,YAAY,OAAsC;AACzD,QAAM,cAAc,MAAM,IAAI,QAAQ,EAAE,IAAI,sBAAsB,CAAC,EAAE,KAAK,CAAC,SAAS,MAAM,aAAa,KAAK,IAAI;AAChH,SAAO,oBAAC,cAAW,iBAAiB,aAAa;AACnD;AAEA,SAAS,kBAAkB;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAYG;AACD,SACE,qBAAC,uBAAoB,KAAK,IAAI,uBAAuB,EAAE,aAAa,GAAG,YAAY,MACjF;AAAA,wBAAC,YAAS,UAAU,MAClB,8BAAC,eAAY,KAAU,GACzB;AAAA,IACA,oBAAC,uBAAoB,MAAY,sBAC9B,UACH;AAAA,KACF;AAEJ;AAEA,IAAO,yBAAQ;","names":[]}
package/dist/index.d.mts CHANGED
@@ -34,7 +34,7 @@ type RedirectMethod = "window" | "nextjs" | "none" | {
34
34
  navigate?: (to: string) => void;
35
35
  };
36
36
  type GetUserOptions$1<HasTokenStore> = {
37
- or?: 'redirect' | 'throw' | 'return-null';
37
+ or?: 'redirect' | 'throw' | 'return-null' | 'anonymous' | 'anonymous-if-exists';
38
38
  tokenStore?: TokenStoreInit;
39
39
  } & (HasTokenStore extends false ? {
40
40
  tokenStore: TokenStoreInit;
@@ -564,6 +564,9 @@ type StackServerApp<HasTokenStore extends boolean = boolean, ProjectId extends s
564
564
  useUser(options: GetUserOptions$1<HasTokenStore> & {
565
565
  or: 'throw';
566
566
  }): ProjectCurrentServerUser<ProjectId>;
567
+ useUser(options: GetUserOptions$1<HasTokenStore> & {
568
+ or: 'anonymous';
569
+ }): ProjectCurrentServerUser<ProjectId>;
567
570
  useUser(options?: GetUserOptions$1<HasTokenStore>): ProjectCurrentServerUser<ProjectId> | null;
568
571
  getUser(options: GetUserOptions$1<HasTokenStore> & {
569
572
  or: 'redirect';
@@ -571,6 +574,9 @@ type StackServerApp<HasTokenStore extends boolean = boolean, ProjectId extends s
571
574
  getUser(options: GetUserOptions$1<HasTokenStore> & {
572
575
  or: 'throw';
573
576
  }): Promise<ProjectCurrentServerUser<ProjectId>>;
577
+ getUser(options: GetUserOptions$1<HasTokenStore> & {
578
+ or: 'anonymous';
579
+ }): Promise<ProjectCurrentServerUser<ProjectId>>;
574
580
  getUser(options?: GetUserOptions$1<HasTokenStore>): Promise<ProjectCurrentServerUser<ProjectId> | null>;
575
581
  getUser(id: string): Promise<ServerUser | null>;
576
582
  useUsers(options?: ServerListUsersOptions): ServerUser[] & {
@@ -765,7 +771,7 @@ type StackClientApp<HasTokenStore extends boolean = boolean, ProjectId extends s
765
771
  password: string;
766
772
  noRedirect?: boolean;
767
773
  verificationCallbackUrl?: string;
768
- }): Promise<Result<undefined, KnownErrors["UserEmailAlreadyExists"] | KnownErrors["PasswordRequirementsNotMet"]>>;
774
+ }): Promise<Result<undefined, KnownErrors["UserWithEmailAlreadyExists"] | KnownErrors["PasswordRequirementsNotMet"]>>;
769
775
  signInWithPasskey(): Promise<Result<undefined, KnownErrors["PasskeyAuthenticationFailed"] | KnownErrors["InvalidTotpCode"] | KnownErrors["PasskeyWebAuthnError"]>>;
770
776
  callOAuthCallback(): Promise<boolean>;
771
777
  sendForgotPasswordEmail(email: string, options?: {
@@ -787,7 +793,9 @@ type StackClientApp<HasTokenStore extends boolean = boolean, ProjectId extends s
787
793
  teamDisplayName: string;
788
794
  }, KnownErrors["VerificationCodeError"]>>;
789
795
  verifyEmail(code: string): Promise<Result<undefined, KnownErrors["VerificationCodeError"]>>;
790
- signInWithMagicLink(code: string): Promise<Result<undefined, KnownErrors["VerificationCodeError"] | KnownErrors["InvalidTotpCode"]>>;
796
+ signInWithMagicLink(code: string, options?: {
797
+ noRedirect?: boolean;
798
+ }): Promise<Result<undefined, KnownErrors["VerificationCodeError"] | KnownErrors["InvalidTotpCode"]>>;
791
799
  redirectToOAuthCallback(): Promise<void>;
792
800
  useUser(options: GetUserOptions$1<HasTokenStore> & {
793
801
  or: 'redirect';
@@ -795,6 +803,9 @@ type StackClientApp<HasTokenStore extends boolean = boolean, ProjectId extends s
795
803
  useUser(options: GetUserOptions$1<HasTokenStore> & {
796
804
  or: 'throw';
797
805
  }): ProjectCurrentUser<ProjectId>;
806
+ useUser(options: GetUserOptions$1<HasTokenStore> & {
807
+ or: 'anonymous';
808
+ }): ProjectCurrentUser<ProjectId>;
798
809
  useUser(options?: GetUserOptions$1<HasTokenStore>): ProjectCurrentUser<ProjectId> | null;
799
810
  getUser(options: GetUserOptions$1<HasTokenStore> & {
800
811
  or: 'redirect';
@@ -802,6 +813,9 @@ type StackClientApp<HasTokenStore extends boolean = boolean, ProjectId extends s
802
813
  getUser(options: GetUserOptions$1<HasTokenStore> & {
803
814
  or: 'throw';
804
815
  }): Promise<ProjectCurrentUser<ProjectId>>;
816
+ getUser(options: GetUserOptions$1<HasTokenStore> & {
817
+ or: 'anonymous';
818
+ }): Promise<ProjectCurrentUser<ProjectId>>;
805
819
  getUser(options?: GetUserOptions$1<HasTokenStore>): Promise<ProjectCurrentUser<ProjectId> | null>;
806
820
  useNavigate(): (to: string) => void;
807
821
  [stackAppInternalsSymbol]: {
package/dist/index.d.ts CHANGED
@@ -34,7 +34,7 @@ type RedirectMethod = "window" | "nextjs" | "none" | {
34
34
  navigate?: (to: string) => void;
35
35
  };
36
36
  type GetUserOptions$1<HasTokenStore> = {
37
- or?: 'redirect' | 'throw' | 'return-null';
37
+ or?: 'redirect' | 'throw' | 'return-null' | 'anonymous' | 'anonymous-if-exists';
38
38
  tokenStore?: TokenStoreInit;
39
39
  } & (HasTokenStore extends false ? {
40
40
  tokenStore: TokenStoreInit;
@@ -564,6 +564,9 @@ type StackServerApp<HasTokenStore extends boolean = boolean, ProjectId extends s
564
564
  useUser(options: GetUserOptions$1<HasTokenStore> & {
565
565
  or: 'throw';
566
566
  }): ProjectCurrentServerUser<ProjectId>;
567
+ useUser(options: GetUserOptions$1<HasTokenStore> & {
568
+ or: 'anonymous';
569
+ }): ProjectCurrentServerUser<ProjectId>;
567
570
  useUser(options?: GetUserOptions$1<HasTokenStore>): ProjectCurrentServerUser<ProjectId> | null;
568
571
  getUser(options: GetUserOptions$1<HasTokenStore> & {
569
572
  or: 'redirect';
@@ -571,6 +574,9 @@ type StackServerApp<HasTokenStore extends boolean = boolean, ProjectId extends s
571
574
  getUser(options: GetUserOptions$1<HasTokenStore> & {
572
575
  or: 'throw';
573
576
  }): Promise<ProjectCurrentServerUser<ProjectId>>;
577
+ getUser(options: GetUserOptions$1<HasTokenStore> & {
578
+ or: 'anonymous';
579
+ }): Promise<ProjectCurrentServerUser<ProjectId>>;
574
580
  getUser(options?: GetUserOptions$1<HasTokenStore>): Promise<ProjectCurrentServerUser<ProjectId> | null>;
575
581
  getUser(id: string): Promise<ServerUser | null>;
576
582
  useUsers(options?: ServerListUsersOptions): ServerUser[] & {
@@ -765,7 +771,7 @@ type StackClientApp<HasTokenStore extends boolean = boolean, ProjectId extends s
765
771
  password: string;
766
772
  noRedirect?: boolean;
767
773
  verificationCallbackUrl?: string;
768
- }): Promise<Result<undefined, KnownErrors["UserEmailAlreadyExists"] | KnownErrors["PasswordRequirementsNotMet"]>>;
774
+ }): Promise<Result<undefined, KnownErrors["UserWithEmailAlreadyExists"] | KnownErrors["PasswordRequirementsNotMet"]>>;
769
775
  signInWithPasskey(): Promise<Result<undefined, KnownErrors["PasskeyAuthenticationFailed"] | KnownErrors["InvalidTotpCode"] | KnownErrors["PasskeyWebAuthnError"]>>;
770
776
  callOAuthCallback(): Promise<boolean>;
771
777
  sendForgotPasswordEmail(email: string, options?: {
@@ -787,7 +793,9 @@ type StackClientApp<HasTokenStore extends boolean = boolean, ProjectId extends s
787
793
  teamDisplayName: string;
788
794
  }, KnownErrors["VerificationCodeError"]>>;
789
795
  verifyEmail(code: string): Promise<Result<undefined, KnownErrors["VerificationCodeError"]>>;
790
- signInWithMagicLink(code: string): Promise<Result<undefined, KnownErrors["VerificationCodeError"] | KnownErrors["InvalidTotpCode"]>>;
796
+ signInWithMagicLink(code: string, options?: {
797
+ noRedirect?: boolean;
798
+ }): Promise<Result<undefined, KnownErrors["VerificationCodeError"] | KnownErrors["InvalidTotpCode"]>>;
791
799
  redirectToOAuthCallback(): Promise<void>;
792
800
  useUser(options: GetUserOptions$1<HasTokenStore> & {
793
801
  or: 'redirect';
@@ -795,6 +803,9 @@ type StackClientApp<HasTokenStore extends boolean = boolean, ProjectId extends s
795
803
  useUser(options: GetUserOptions$1<HasTokenStore> & {
796
804
  or: 'throw';
797
805
  }): ProjectCurrentUser<ProjectId>;
806
+ useUser(options: GetUserOptions$1<HasTokenStore> & {
807
+ or: 'anonymous';
808
+ }): ProjectCurrentUser<ProjectId>;
798
809
  useUser(options?: GetUserOptions$1<HasTokenStore>): ProjectCurrentUser<ProjectId> | null;
799
810
  getUser(options: GetUserOptions$1<HasTokenStore> & {
800
811
  or: 'redirect';
@@ -802,6 +813,9 @@ type StackClientApp<HasTokenStore extends boolean = boolean, ProjectId extends s
802
813
  getUser(options: GetUserOptions$1<HasTokenStore> & {
803
814
  or: 'throw';
804
815
  }): Promise<ProjectCurrentUser<ProjectId>>;
816
+ getUser(options: GetUserOptions$1<HasTokenStore> & {
817
+ or: 'anonymous';
818
+ }): Promise<ProjectCurrentUser<ProjectId>>;
805
819
  getUser(options?: GetUserOptions$1<HasTokenStore>): Promise<ProjectCurrentUser<ProjectId> | null>;
806
820
  useNavigate(): (to: string) => void;
807
821
  [stackAppInternalsSymbol]: {