@stackframe/stack 2.4.1 → 2.4.4
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.
- package/dist/components/magic-link-sign-in.js.map +1 -1
- package/dist/components/oauth-button.js +0 -2
- package/dist/components/oauth-button.js.map +1 -1
- package/dist/components/oauth-group.d.mts +3 -1
- package/dist/components/oauth-group.d.ts +3 -1
- package/dist/components/oauth-group.js +3 -2
- package/dist/components/oauth-group.js.map +1 -1
- package/dist/components/password-field.js +1 -1
- package/dist/components/password-field.js.map +1 -1
- package/dist/components/user-button.js +3 -2
- package/dist/components/user-button.js.map +1 -1
- package/dist/components-core/avatar.js +1 -1
- package/dist/components-core/avatar.js.map +1 -1
- package/dist/components-core/button.js +3 -3
- package/dist/components-core/button.js.map +1 -1
- package/dist/components-core/card.js +1 -1
- package/dist/components-core/card.js.map +1 -1
- package/dist/components-core/dropdown.js +6 -3
- package/dist/components-core/dropdown.js.map +1 -1
- package/dist/components-core/index.d.mts +4 -4
- package/dist/components-core/index.d.ts +4 -4
- package/dist/components-core/input.js +1 -1
- package/dist/components-core/input.js.map +1 -1
- package/dist/components-core/label.js +1 -1
- package/dist/components-core/label.js.map +1 -1
- package/dist/components-core/link.js +1 -1
- package/dist/components-core/link.js.map +1 -1
- package/dist/components-core/loading-indicator.js +1 -1
- package/dist/components-core/loading-indicator.js.map +1 -1
- package/dist/components-core/popover.js +1 -1
- package/dist/components-core/popover.js.map +1 -1
- package/dist/components-core/separator.js +1 -1
- package/dist/components-core/separator.js.map +1 -1
- package/dist/components-core/skeleton.js +1 -1
- package/dist/components-core/skeleton.js.map +1 -1
- package/dist/components-core/tabs.js +5 -4
- package/dist/components-core/tabs.js.map +1 -1
- package/dist/components-core/text.js +1 -1
- package/dist/components-core/text.js.map +1 -1
- package/dist/components-page/auth-page.d.mts +3 -1
- package/dist/components-page/auth-page.d.ts +3 -1
- package/dist/components-page/auth-page.js +5 -4
- package/dist/components-page/auth-page.js.map +1 -1
- package/dist/esm/components/magic-link-sign-in.js.map +1 -1
- package/dist/esm/components/oauth-button.js +0 -2
- package/dist/esm/components/oauth-button.js.map +1 -1
- package/dist/esm/components/oauth-group.js +3 -2
- package/dist/esm/components/oauth-group.js.map +1 -1
- package/dist/esm/components/password-field.js +1 -1
- package/dist/esm/components/password-field.js.map +1 -1
- package/dist/esm/components/user-button.js +3 -2
- package/dist/esm/components/user-button.js.map +1 -1
- package/dist/esm/components-core/avatar.js +1 -1
- package/dist/esm/components-core/avatar.js.map +1 -1
- package/dist/esm/components-core/button.js +3 -3
- package/dist/esm/components-core/button.js.map +1 -1
- package/dist/esm/components-core/card.js +1 -1
- package/dist/esm/components-core/card.js.map +1 -1
- package/dist/esm/components-core/dropdown.js +6 -3
- package/dist/esm/components-core/dropdown.js.map +1 -1
- package/dist/esm/components-core/input.js +1 -1
- package/dist/esm/components-core/input.js.map +1 -1
- package/dist/esm/components-core/label.js +1 -1
- package/dist/esm/components-core/label.js.map +1 -1
- package/dist/esm/components-core/link.js +1 -1
- package/dist/esm/components-core/link.js.map +1 -1
- package/dist/esm/components-core/loading-indicator.js +1 -1
- package/dist/esm/components-core/loading-indicator.js.map +1 -1
- package/dist/esm/components-core/popover.js +1 -1
- package/dist/esm/components-core/popover.js.map +1 -1
- package/dist/esm/components-core/separator.js +1 -1
- package/dist/esm/components-core/separator.js.map +1 -1
- package/dist/esm/components-core/skeleton.js +1 -1
- package/dist/esm/components-core/skeleton.js.map +1 -1
- package/dist/esm/components-core/tabs.js +6 -5
- package/dist/esm/components-core/tabs.js.map +1 -1
- package/dist/esm/components-core/text.js +1 -1
- package/dist/esm/components-core/text.js.map +1 -1
- package/dist/esm/components-page/auth-page.js +5 -4
- package/dist/esm/components-page/auth-page.js.map +1 -1
- package/dist/esm/index.js +2 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/lib/stack-app.js +2 -2
- package/dist/esm/lib/stack-app.js.map +1 -1
- package/dist/esm/utils/browser-script.js +14 -6
- package/dist/esm/utils/browser-script.js.map +1 -1
- package/dist/index.d.mts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/stack-app.d.mts +3 -1
- package/dist/lib/stack-app.d.ts +3 -1
- package/dist/lib/stack-app.js +2 -2
- package/dist/lib/stack-app.js.map +1 -1
- package/dist/providers/component-provider.d.mts +6 -6
- package/dist/providers/component-provider.d.ts +6 -6
- package/dist/utils/browser-script.js +14 -6
- package/dist/utils/browser-script.js.map +1 -1
- package/package.json +2 -2
package/dist/lib/stack-app.d.mts
CHANGED
|
@@ -52,7 +52,9 @@ type Auth<T, C> = {
|
|
|
52
52
|
}): Promise<KnownErrors["PasswordMismatch"] | KnownErrors["PasswordRequirementsNotMet"] | undefined>;
|
|
53
53
|
};
|
|
54
54
|
type InternalAuth<T> = {
|
|
55
|
-
createProject(this: T, newProject:
|
|
55
|
+
createProject(this: T, newProject: ProjectUpdateOptions & {
|
|
56
|
+
displayName: string;
|
|
57
|
+
}): Promise<Project>;
|
|
56
58
|
listOwnedProjects(this: T): Promise<Project[]>;
|
|
57
59
|
useOwnedProjects(this: T): Project[];
|
|
58
60
|
onOwnedProjectsChange(this: T, callback: (projects: Project[]) => void): void;
|
package/dist/lib/stack-app.d.ts
CHANGED
|
@@ -52,7 +52,9 @@ type Auth<T, C> = {
|
|
|
52
52
|
}): Promise<KnownErrors["PasswordMismatch"] | KnownErrors["PasswordRequirementsNotMet"] | undefined>;
|
|
53
53
|
};
|
|
54
54
|
type InternalAuth<T> = {
|
|
55
|
-
createProject(this: T, newProject:
|
|
55
|
+
createProject(this: T, newProject: ProjectUpdateOptions & {
|
|
56
|
+
displayName: string;
|
|
57
|
+
}): Promise<Project>;
|
|
56
58
|
listOwnedProjects(this: T): Promise<Project[]>;
|
|
57
59
|
useOwnedProjects(this: T): Project[];
|
|
58
60
|
onOwnedProjectsChange(this: T, callback: (projects: Project[]) => void): void;
|
package/dist/lib/stack-app.js
CHANGED
|
@@ -467,12 +467,12 @@ var _StackClientAppImpl = class __StackClientAppImpl {
|
|
|
467
467
|
get urls() {
|
|
468
468
|
return getUrls(this._urlOptions);
|
|
469
469
|
}
|
|
470
|
-
_redirectTo(handlerName) {
|
|
470
|
+
async _redirectTo(handlerName) {
|
|
471
471
|
if (!this.urls[handlerName]) {
|
|
472
472
|
throw new Error(`No URL for handler name ${handlerName}`);
|
|
473
473
|
}
|
|
474
474
|
window.location.href = this.urls[handlerName];
|
|
475
|
-
return (0, import_promises.wait)(2e3);
|
|
475
|
+
return await (0, import_promises.wait)(2e3);
|
|
476
476
|
}
|
|
477
477
|
async redirectToSignIn() {
|
|
478
478
|
return await this._redirectTo("signIn");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/lib/stack-app.ts"],"sourcesContent":["import React, { use, useCallback, useMemo } from \"react\";\nimport { KnownError, KnownErrors, OAuthProviderConfigJson, ServerUserJson, StackAdminInterface, StackClientInterface, StackServerInterface } from \"@stackframe/stack-shared\";\nimport { getCookie, setOrDeleteCookie } from \"./cookie\";\nimport { StackAssertionError, throwErr } from \"@stackframe/stack-shared/dist/utils/errors\";\nimport { generateUuid } from \"@stackframe/stack-shared/dist/utils/uuids\";\nimport { AsyncResult, Result } from \"@stackframe/stack-shared/dist/utils/results\";\nimport { suspendIfSsr } from \"@stackframe/stack-shared/dist/utils/react\";\nimport { AsyncStore } from \"@stackframe/stack-shared/dist/utils/stores\";\nimport { ClientProjectJson, UserJson, TokenObject, TokenStore, ProjectJson, EmailConfigJson, DomainConfigJson, ReadonlyTokenStore, getProductionModeErrors, ProductionModeError, UserUpdateJson, TeamJson, PermissionDefinitionJson, PermissionDefinitionScopeJson, TeamMemberJson } from \"@stackframe/stack-shared/dist/interface/clientInterface\";\nimport { isClient } from \"../utils/next\";\nimport { callOAuthCallback, signInWithOAuth } from \"./auth\";\nimport * as NextNavigation from \"next/navigation\"; // import the entire module to get around some static compiler warnings emitted by Next.js in some cases\nimport { ReadonlyJson } from \"@stackframe/stack-shared/dist/utils/json\";\nimport { constructRedirectUrl } from \"../utils/url\";\nimport { filterUndefined, omit } from \"@stackframe/stack-shared/dist/utils/objects\";\nimport { neverResolve, resolved, runAsynchronously, wait } from \"@stackframe/stack-shared/dist/utils/promises\";\nimport { AsyncCache } from \"@stackframe/stack-shared/dist/utils/caches\";\nimport { ApiKeySetBaseJson, ApiKeySetCreateOptions, ApiKeySetFirstViewJson, ApiKeySetJson, ProjectUpdateOptions } from \"@stackframe/stack-shared/dist/interface/adminInterface\";\nimport { suspend } from \"@stackframe/stack-shared/dist/utils/react\";\nimport { ServerPermissionDefinitionCustomizableJson, ServerPermissionDefinitionJson, ServerTeamCustomizableJson, ServerTeamJson, ServerTeamMemberJson, ServerUserUpdateJson } from \"@stackframe/stack-shared/dist/interface/serverInterface\";\n\n\nexport type TokenStoreOptions<HasTokenStore extends boolean = boolean> =\n HasTokenStore extends true ? \"cookie\" | \"nextjs-cookie\" | \"memory\" :\n HasTokenStore extends false ? null :\n TokenStoreOptions<true> | TokenStoreOptions<false>;\n\nexport type HandlerUrls = {\n handler: string,\n signIn: string,\n afterSignIn: string,\n signUp: 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}\n\ntype ProjectCurrentUser<ProjectId> = ProjectId extends \"internal\" ? CurrentInternalUser : CurrentUser;\ntype ProjectCurrentSeverUser<ProjectId> = ProjectId extends \"internal\" ? CurrentInternalServerUser : CurrentServerUser;\n\nfunction permissionDefinitionScopeToType(scope: PermissionDefinitionScopeJson): 'team' | 'global' {\n return ({\"any-team\": \"team\", \"specific-team\": \"team\", \"global\": \"global\"} as const)[scope.type];\n}\n\nfunction getUrls(partial: Partial<HandlerUrls>): HandlerUrls {\n const handler = partial.handler ?? \"/handler\";\n return {\n handler,\n signIn: `${handler}/signin`,\n afterSignIn: \"/\",\n signUp: `${handler}/signup`,\n afterSignUp: \"/\",\n signOut: `${handler}/signout`,\n afterSignOut: \"/\",\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: \"/\",\n accountSettings: `${handler}/account-settings`,\n ...filterUndefined(partial),\n };\n}\n\nfunction getDefaultProjectId() {\n return process.env.NEXT_PUBLIC_STACK_PROJECT_ID || throwErr(\"Welcome to Stack! 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\nfunction getDefaultPublishableClientKey() {\n return process.env.NEXT_PUBLIC_STACK_PUBLISHABLE_CLIENT_KEY || throwErr(\"Welcome to Stack! 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\nfunction getDefaultSecretServerKey() {\n return process.env.STACK_SECRET_SERVER_KEY || throwErr(\"No secret server key provided. Please copy your key from the Stack dashboard and put your it in the STACK_SECRET_SERVER_KEY environment variable.\");\n}\n\nfunction getDefaultSuperSecretAdminKey() {\n return process.env.STACK_SUPER_SECRET_ADMIN_KEY || throwErr(\"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\nfunction getDefaultBaseUrl() {\n return process.env.NEXT_PUBLIC_STACK_URL || defaultBaseUrl;\n}\n\nexport type StackClientAppConstructorOptions<HasTokenStore extends boolean, ProjectId extends string> = {\n baseUrl?: string,\n projectId?: ProjectId,\n publishableClientKey?: string,\n urls?: Partial<HandlerUrls>,\n\n // we intersect with TokenStoreOptions in the beginning to make TypeScript error messages easier to read\n tokenStore: TokenStoreOptions<HasTokenStore>,\n};\n\nexport type StackServerAppConstructorOptions<HasTokenStore extends boolean, ProjectId extends string> = StackClientAppConstructorOptions<HasTokenStore, ProjectId> & {\n secretServerKey?: string,\n};\n\nexport type StackAdminAppConstructorOptions<HasTokenStore extends boolean, ProjectId extends string> = (\n | (\n & StackServerAppConstructorOptions<HasTokenStore, ProjectId>\n & {\n superSecretAdminKey?: string,\n }\n )\n | (\n & Omit<StackServerAppConstructorOptions<HasTokenStore, ProjectId>, \"publishableClientKey\" | \"secretServerKey\">\n & {\n projectOwnerTokens: ReadonlyTokenStore,\n }\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\nconst defaultBaseUrl = \"https://app.stack-auth.com\";\n\nfunction createEmptyTokenStore() {\n const store = new AsyncStore<TokenObject>();\n store.set({\n refreshToken: null,\n accessToken: null,\n });\n return store;\n}\n\nconst memoryTokenStore = createEmptyTokenStore();\nlet cookieTokenStore: TokenStore | null = null;\nconst cookieTokenStoreInitializer = (): TokenStore => {\n if (!isClient()) {\n throw new Error(\"Cannot use cookie token store on the server!\");\n }\n\n if (cookieTokenStore === null) {\n cookieTokenStore = new AsyncStore<TokenObject>();\n let hasSucceededInWriting = true;\n\n setInterval(() => {\n if (hasSucceededInWriting) {\n const newValue = {\n refreshToken: getCookie('stack-refresh'),\n accessToken: getCookie('stack-access'),\n };\n const res = cookieTokenStore!.get();\n if (res.status !== \"ok\"\n || res.data.refreshToken !== newValue.refreshToken\n || res.data.accessToken !== newValue.accessToken\n ) {\n cookieTokenStore!.set(newValue);\n }\n }\n }, 10);\n cookieTokenStore.onChange((value) => {\n try {\n setOrDeleteCookie('stack-refresh', value.refreshToken, { maxAge: 60 * 60 * 24 * 365 });\n setOrDeleteCookie('stack-access', value.accessToken, { maxAge: 60 * 60 * 24 });\n hasSucceededInWriting = true;\n } catch (e) {\n hasSucceededInWriting = false;\n }\n });\n }\n\n return cookieTokenStore;\n};\n\nconst tokenStoreInitializers = new Map<TokenStoreOptions, () => TokenStore>([\n [\"cookie\", cookieTokenStoreInitializer],\n [\"nextjs-cookie\", () => {\n if (isClient()) {\n return cookieTokenStoreInitializer();\n } else {\n const store = new AsyncStore<TokenObject>();\n store.set({\n refreshToken: getCookie('stack-refresh'),\n accessToken: getCookie('stack-access'),\n });\n store.onChange((value) => {\n try {\n setOrDeleteCookie('stack-refresh', value.refreshToken, { maxAge: 60 * 60 * 24 * 365 });\n setOrDeleteCookie('stack-access', value.accessToken, { maxAge: 60 * 60 * 24 });\n } catch (e) {\n // ignore\n }\n });\n return store;\n }\n }],\n [\"memory\", () => memoryTokenStore],\n [null, () => createEmptyTokenStore()],\n]);\nfunction getTokenStore(tokenStoreOptions: TokenStoreOptions) {\n return (tokenStoreInitializers.get(tokenStoreOptions) ?? throwErr(`Invalid token store ${tokenStoreOptions}`))();\n}\n\nconst loadingSentinel = Symbol(\"stackAppCacheLoadingSentinel\");\nfunction useCache<D extends any[], T>(cache: AsyncCache<D, T>, dependencies: D, caller: string): T {\n // we explicitly don't want to run this hook in SSR\n suspendIfSsr(caller);\n\n const subscribe = useCallback((cb: () => void) => {\n const { unsubscribe } = cache.onChange(dependencies, () => cb());\n return unsubscribe;\n }, [cache, ...dependencies]);\n const getSnapshot = useCallback(() => {\n return AsyncResult.or(cache.getIfCached(dependencies), loadingSentinel);\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 value = React.useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n\n if (value === loadingSentinel) {\n return use(cache.getOrWait(dependencies, \"read-write\"));\n } else {\n // still need to call `use` because React expects the control flow to not change across two re-renders with the same props/state and it detects that by hook invocations (including `use`)\n return use(resolved(value));\n }\n}\n\nexport const stackAppInternalsSymbol = Symbol.for(\"StackAppInternals\");\n\nconst allClientApps = new Map<string, [checkString: string, app: StackClientApp<any, any>]>();\n\nconst createCache = <D extends any[], T>(fetcher: (dependencies: D) => Promise<T>) => {\n return new AsyncCache<D, T>(\n async (dependencies) => await fetcher(dependencies),\n {},\n );\n};\n\n// note that we intentionally use TokenStore (a reference type) as a key instead of a stringified version of it, as different token stores with the same tokens should be treated differently\n// (if we wouldn't , we would cache users across requests on the server, which may cause issues)\nconst createCacheByTokenStore = <D extends any[], T>(fetcher: (tokenStore: TokenStore, extraDependencies: D) => Promise<T> ) => {\n return new AsyncCache<[TokenStore, ...D], T>(\n async ([tokenStore, ...extraDependencies]) => await fetcher(tokenStore, extraDependencies),\n {\n onSubscribe: ([tokenStore], refresh) => {\n // TODO find a *clean* way to not refresh when the token change was made inside the fetcher (for example due to expired access token)\n const handlerObj = tokenStore.onChange((newValue, oldValue) => {\n if (JSON.stringify(newValue) === JSON.stringify(oldValue)) return;\n refresh();\n });\n return () => handlerObj.unsubscribe();\n },\n },\n );\n};\n\n\nclass _StackClientAppImpl<HasTokenStore extends boolean, ProjectId extends string = string> {\n protected readonly _uniqueIdentifier: string;\n protected _interface: StackClientInterface;\n protected readonly _tokenStoreOptions: TokenStoreOptions<HasTokenStore>;\n protected readonly _urlOptions: Partial<HandlerUrls>;\n\n private readonly __DEMO_ENABLE_SLIGHT_FETCH_DELAY = false;\n\n private readonly _currentUserCache = createCacheByTokenStore(async (tokenStore) => {\n if (this.__DEMO_ENABLE_SLIGHT_FETCH_DELAY) {\n await wait(2000);\n }\n const user = await this._interface.getClientUserByToken(tokenStore);\n return Result.or(user, null);\n });\n private readonly _currentProjectCache = createCache(async () => {\n return Result.orThrow(await this._interface.getClientProject());\n });\n private readonly _ownedProjectsCache = createCacheByTokenStore(async (tokenStore) => {\n return await this._interface.listProjects(tokenStore);\n });\n private readonly _currentUserPermissionsCache = createCacheByTokenStore<\n [string, 'team' | 'global', boolean], \n PermissionDefinitionJson[]\n >(async (tokenStore, [teamId, type, direct]) => {\n return await this._interface.listClientUserTeamPermissions({ teamId, type, direct }, tokenStore);\n });\n private readonly _currentUserTeamsCache = createCacheByTokenStore(async (tokenStore) => {\n return await this._interface.listClientUserTeams(tokenStore);\n });\n\n constructor(options:\n & {\n uniqueIdentifier?: string,\n checkString?: string,\n }\n & (\n | StackClientAppConstructorOptions<HasTokenStore, ProjectId>\n | Pick<StackClientAppConstructorOptions<HasTokenStore, ProjectId>, \"tokenStore\" | \"urls\"> & {\n interface: StackClientInterface,\n }\n )\n ) {\n if (\"interface\" in options) {\n this._interface = options.interface;\n } else {\n this._interface = new StackClientInterface({\n baseUrl: options.baseUrl ?? getDefaultBaseUrl(),\n projectId: options.projectId ?? getDefaultProjectId(),\n publishableClientKey: options.publishableClientKey ?? getDefaultPublishableClientKey(),\n });\n }\n\n this._tokenStoreOptions = options.tokenStore;\n this._urlOptions = options.urls ?? {};\n\n this._uniqueIdentifier = options.uniqueIdentifier ?? generateUuid();\n if (allClientApps.has(this._uniqueIdentifier)) {\n throw new StackAssertionError(\"A Stack client app with the same unique identifier already exists\");\n }\n allClientApps.set(this._uniqueIdentifier, [options.checkString ?? \"default check string\", this]);\n }\n\n protected hasPersistentTokenStore(): this is StackClientApp<true, ProjectId> {\n return this._tokenStoreOptions !== null;\n }\n\n protected _ensurePersistentTokenStore(): asserts this is StackClientApp<true, ProjectId> {\n if (!this.hasPersistentTokenStore()) {\n throw new Error(\"Cannot call this function on a Stack app without a persistent token store. Make sure the tokenStore option is set to a non-null value when initializing Stack.\");\n }\n }\n\n protected isInternalProject(): this is { projectId: \"internal\" } {\n return this.projectId === \"internal\";\n }\n\n protected _ensureInternalProject(): asserts this is { projectId: \"internal\" } {\n if (!this.isInternalProject()) {\n throw new Error(\"Cannot call this function on a Stack app with a project ID other than 'internal'.\");\n }\n }\n\n protected _permissionFromJson(json: PermissionDefinitionJson): Permission {\n const type = permissionDefinitionScopeToType(json.scope);\n \n if (type === 'team') {\n return {\n id: json.id,\n type,\n teamId: (json.scope as { teamId: string }).teamId,\n };\n } else {\n return {\n id: json.id,\n type,\n };\n }\n }\n\n protected _teamFromJson(json: TeamJson): Team {\n return {\n id: json.id,\n displayName: json.displayName,\n createdAt: new Date(json.createdAtMillis),\n toJson() {\n return json;\n },\n };\n }\n\n protected _userFromJson(json: UserJson): User {\n const app = this;\n return {\n projectId: json.projectId,\n id: json.id,\n displayName: json.displayName,\n primaryEmail: json.primaryEmail,\n primaryEmailVerified: json.primaryEmailVerified,\n profileImageUrl: json.profileImageUrl,\n signedUpAt: new Date(json.signedUpAtMillis),\n clientMetadata: json.clientMetadata,\n authMethod: json.authMethod,\n hasPassword: json.hasPassword,\n authWithEmail: json.authWithEmail,\n oauthProviders: json.oauthProviders,\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 onTeamChange(teamId: string, callback: (team: Team | null) => void) {\n return this.onTeamsChange((teams) => {\n // TODO only call callback if the team actually changed\n const team = teams.find((t) => t.id === teamId) ?? null;\n callback(team);\n });\n },\n async listTeams() {\n const teams = await app._currentUserTeamsCache.getOrWait([getTokenStore(app._tokenStoreOptions)], \"write-only\");\n return teams.map((json) => app._teamFromJson(json));\n },\n useTeams() {\n const teams = useCache(app._currentUserTeamsCache, [getTokenStore(app._tokenStoreOptions)], \"user.useTeams()\");\n return useMemo(() => teams.map((json) => app._teamFromJson(json)), [teams]);\n },\n onTeamsChange(callback: (value: Team[], oldValue: Team[] | undefined) => void) {\n return app._currentUserTeamsCache.onChange([getTokenStore(app._tokenStoreOptions)], (value, oldValue) => {\n callback(value.map((json) => app._teamFromJson(json)), oldValue?.map((json) => app._teamFromJson(json)));\n });\n },\n async listPermissions(scope: Team, options?: { direct?: boolean }): Promise<Permission[]> {\n const permissions = await app._currentUserPermissionsCache.getOrWait([getTokenStore(app._tokenStoreOptions), scope.id, 'team', !!options?.direct], \"write-only\");\n return permissions.map((json) => app._permissionFromJson(json));\n },\n usePermissions(scope: Team, options?: { direct?: boolean }): Permission[] {\n const permissions = useCache(app._currentUserPermissionsCache, [getTokenStore(app._tokenStoreOptions), scope.id, 'team', !!options?.direct], \"user.usePermissions()\");\n return useMemo(() => permissions.map((json) => app._permissionFromJson(json)), [permissions]);\n },\n usePermission(scope: Team, permissionId: string): Permission | null {\n const permissions = this.usePermissions(scope);\n return useMemo(() => permissions.find((p) => p.id === permissionId) ?? null, [permissions, permissionId]);\n },\n async getPermission(scope: Team, permissionId: string): Promise<Permission | null> {\n const permissions = await this.listPermissions(scope);\n return permissions.find((p) => p.id === permissionId) ?? null;\n },\n async hasPermission(scope: Team, permissionId: string): Promise<boolean> {\n const permissions = await this.listPermissions(scope);\n return permissions.some((p) => p.id === permissionId);\n },\n toJson() {\n return json;\n },\n };\n }\n\n protected _teamMemberFromJson(json: TeamMemberJson): TeamMember;\n protected _teamMemberFromJson(json: TeamMemberJson | null): TeamMember | null;\n protected _teamMemberFromJson(json: TeamMemberJson): TeamMember | null {\n if (json === null) return null;\n return {\n teamId: json.teamId,\n userId: json.userId,\n displayName: json.displayName,\n };\n }\n\n protected _currentUserFromJson(json: UserJson, tokenStore: TokenStore): ProjectCurrentUser<ProjectId>;\n protected _currentUserFromJson(json: UserJson | null, tokenStore: TokenStore): ProjectCurrentUser<ProjectId> | null;\n protected _currentUserFromJson(json: UserJson | null, tokenStore: TokenStore): ProjectCurrentUser<ProjectId> | null {\n if (json === null) return null;\n const app = this;\n const currentUser: CurrentUser = {\n ...this._userFromJson(json),\n tokenStore,\n update(update) {\n return app._updateUser(update, tokenStore);\n },\n signOut() {\n return app._signOut(tokenStore);\n },\n sendVerificationEmail() {\n return app._sendVerificationEmail(tokenStore);\n },\n updatePassword(options: { oldPassword: string, newPassword: string}) {\n return app._updatePassword(options, tokenStore);\n },\n };\n if (this.isInternalProject()) {\n const internalUser: CurrentInternalUser = {\n ...currentUser,\n createProject(newProject: Pick<Project, \"displayName\" | \"description\">) {\n return app._createProject(newProject);\n },\n listOwnedProjects() {\n return app._listOwnedProjects();\n },\n useOwnedProjects() {\n return app._useOwnedProjects();\n },\n onOwnedProjectsChange(callback: (projects: Project[]) => void) {\n return app._onOwnedProjectsChange(callback);\n }\n };\n Object.freeze(internalUser);\n return internalUser;\n } else {\n Object.freeze(currentUser);\n return currentUser as any;\n }\n }\n\n protected _userToJson(user: User): UserJson {\n return {\n projectId: user.projectId,\n id: user.id,\n displayName: user.displayName,\n primaryEmail: user.primaryEmail,\n primaryEmailVerified: user.primaryEmailVerified,\n profileImageUrl: user.profileImageUrl,\n signedUpAtMillis: user.signedUpAt.getTime(),\n clientMetadata: user.clientMetadata,\n authMethod: user.authMethod,\n hasPassword: user.hasPassword,\n authWithEmail: user.authWithEmail,\n oauthProviders: user.oauthProviders,\n };\n }\n\n protected _projectAdminFromJson(data: ProjectJson, adminInterface: StackAdminInterface, onRefresh: () => Promise<void>): Project {\n if (data.id !== adminInterface.projectId) {\n throw new Error(`The project ID of the provided project JSON (${data.id}) does not match the project ID of the app (${adminInterface.projectId})! This is a Stack bug.`);\n }\n\n return {\n id: data.id,\n displayName: data.displayName,\n description: data.description,\n createdAt: new Date(data.createdAtMillis),\n userCount: data.userCount,\n isProductionMode: data.isProductionMode,\n evaluatedConfig: {\n id: data.evaluatedConfig.id,\n credentialEnabled: data.evaluatedConfig.credentialEnabled,\n magicLinkEnabled: data.evaluatedConfig.magicLinkEnabled,\n allowLocalhost: data.evaluatedConfig.allowLocalhost,\n oauthProviders: data.evaluatedConfig.oauthProviders,\n emailConfig: data.evaluatedConfig.emailConfig,\n domains: data.evaluatedConfig.domains,\n createTeamOnSignUp: data.evaluatedConfig.createTeamOnSignUp,\n },\n\n async update(update: ProjectUpdateOptions) {\n await adminInterface.updateProject(update);\n await onRefresh();\n },\n\n toJson() {\n return data;\n },\n\n getProductionModeErrors() {\n return getProductionModeErrors(this.toJson());\n },\n };\n }\n\n protected _createAdminInterface(forProjectId: string, tokenStore: TokenStore): StackAdminInterface {\n return new StackAdminInterface({\n baseUrl: this._interface.options.baseUrl,\n projectId: forProjectId,\n projectOwnerTokens: tokenStore,\n });\n }\n\n get projectId(): ProjectId {\n return this._interface.projectId as ProjectId;\n }\n\n get urls(): Readonly<HandlerUrls> {\n return getUrls(this._urlOptions);\n }\n\n protected _redirectTo(handlerName: keyof HandlerUrls) {\n if (!this.urls[handlerName]) {\n throw new Error(`No URL for handler name ${handlerName}`);\n }\n window.location.href = this.urls[handlerName];\n return wait(2000);\n }\n\n async redirectToSignIn() { return await this._redirectTo(\"signIn\"); }\n async redirectToSignUp() { return await this._redirectTo(\"signUp\"); }\n async redirectToSignOut() { return await this._redirectTo(\"signOut\"); }\n async redirectToEmailVerification() { return await this._redirectTo(\"emailVerification\"); }\n async redirectToPasswordReset() { return await this._redirectTo(\"passwordReset\"); }\n async redirectToForgotPassword() { return await this._redirectTo(\"forgotPassword\"); }\n async redirectToHome() { return await this._redirectTo(\"home\"); }\n async redirectToOAuthCallback() { return await this._redirectTo(\"oauthCallback\"); }\n async redirectToMagicLinkCallback() { return await this._redirectTo(\"magicLinkCallback\"); }\n async redirectToAfterSignIn() { return await this._redirectTo(\"afterSignIn\"); }\n async redirectToAfterSignUp() { return await this._redirectTo(\"afterSignUp\"); }\n async redirectToAfterSignOut() { return await this._redirectTo(\"afterSignOut\"); }\n async redirectToAccountSettings() { return await this._redirectTo(\"accountSettings\"); }\n\n async sendForgotPasswordEmail(email: string): Promise<KnownErrors[\"UserNotFound\"] | undefined> {\n const redirectUrl = constructRedirectUrl(this.urls.passwordReset);\n const error = await this._interface.sendForgotPasswordEmail(email, redirectUrl);\n return error;\n }\n\n async sendMagicLinkEmail(email: string): Promise<KnownErrors[\"RedirectUrlNotWhitelisted\"] | undefined> {\n const magicLinkRedirectUrl = constructRedirectUrl(this.urls.magicLinkCallback);\n const error = await this._interface.sendMagicLinkEmail(email, magicLinkRedirectUrl);\n return error;\n }\n\n async resetPassword(options: { password: string, code: string }): Promise<KnownErrors[\"PasswordResetError\"] | undefined> {\n const error = await this._interface.resetPassword(options);\n return error;\n }\n\n async verifyPasswordResetCode(code: string): Promise<KnownErrors[\"PasswordResetCodeError\"] | undefined> {\n return await this._interface.verifyPasswordResetCode(code);\n }\n\n async verifyEmail(code: string): Promise<KnownErrors[\"EmailVerificationError\"] | undefined> {\n return await this._interface.verifyEmail(code);\n }\n\n async getUser(options: GetUserOptions & { or: 'redirect' }): Promise<ProjectCurrentUser<ProjectId>>;\n async getUser(options: GetUserOptions & { or: 'throw' }): Promise<ProjectCurrentUser<ProjectId>>;\n async getUser(options?: GetUserOptions): Promise<ProjectCurrentUser<ProjectId> | null>;\n async getUser(options?: GetUserOptions): Promise<ProjectCurrentUser<ProjectId> | null> {\n this._ensurePersistentTokenStore();\n const tokenStore = getTokenStore(this._tokenStoreOptions);\n const userJson = await this._currentUserCache.getOrWait([tokenStore], \"write-only\");\n\n if (userJson === null) {\n switch (options?.or) {\n case 'redirect': {\n NextNavigation.redirect(this.urls.signIn, NextNavigation.RedirectType.replace);\n throw new Error(\"redirect should never return!\");\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 this._currentUserFromJson(userJson, tokenStore);\n }\n\n useUser(options: GetUserOptions & { or: 'redirect' }): ProjectCurrentUser<ProjectId>;\n useUser(options: GetUserOptions & { or: 'throw' }): ProjectCurrentUser<ProjectId>;\n useUser(options?: GetUserOptions): ProjectCurrentUser<ProjectId> | null;\n useUser(options?: GetUserOptions): ProjectCurrentUser<ProjectId> | null {\n this._ensurePersistentTokenStore();\n\n const router = NextNavigation.useRouter();\n const tokenStore = getTokenStore(this._tokenStoreOptions);\n const userJson = useCache(this._currentUserCache, [tokenStore], \"useUser()\");\n\n if (userJson === null) {\n switch (options?.or) {\n case 'redirect': {\n router.replace(this.urls.signIn);\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 this._currentUserFromJson(userJson, tokenStore);\n }, [userJson, tokenStore, options?.or]);\n }\n\n onUserChange(callback: (user: CurrentUser | null) => void) {\n this._ensurePersistentTokenStore();\n const tokenStore = getTokenStore(this._tokenStoreOptions);\n return this._currentUserCache.onChange([tokenStore], (userJson) => {\n callback(this._currentUserFromJson(userJson, tokenStore));\n });\n }\n\n protected async _updateUser(update: UserUpdateJson, tokenStore: TokenStore) {\n const res = await this._interface.setClientUserCustomizableData(update, tokenStore);\n await this._refreshUser(tokenStore);\n return res;\n }\n\n async signInWithOAuth(provider: string) {\n this._ensurePersistentTokenStore();\n await signInWithOAuth(this._interface, { provider, redirectUrl: this.urls.oauthCallback });\n }\n\n async signInWithCredential(options: {\n email: string,\n password: string,\n }): Promise<KnownErrors[\"EmailPasswordMismatch\"] | undefined> {\n this._ensurePersistentTokenStore();\n const tokenStore = getTokenStore(this._tokenStoreOptions);\n const errorCode = await this._interface.signInWithCredential(options.email, options.password, tokenStore);\n if (!errorCode) {\n window.location.assign(this.urls.afterSignIn);\n }\n return errorCode;\n }\n\n async signUpWithCredential(options: {\n email: string,\n password: string,\n }): Promise<KnownErrors[\"UserEmailAlreadyExists\"] | undefined>{\n this._ensurePersistentTokenStore();\n const tokenStore = getTokenStore(this._tokenStoreOptions);\n const emailVerificationRedirectUrl = constructRedirectUrl(this.urls.emailVerification);\n const errorCode = await this._interface.signUpWithCredential(\n options.email, \n options.password, \n emailVerificationRedirectUrl, \n tokenStore\n );\n if (!errorCode) {\n window.location.assign(this.urls.afterSignUp);\n }\n return errorCode;\n }\n\n async signInWithMagicLink(code: string): Promise<KnownErrors[\"MagicLinkError\"] | undefined> {\n this._ensurePersistentTokenStore();\n const tokenStore = getTokenStore(this._tokenStoreOptions);\n const result = await this._interface.signInWithMagicLink(code, tokenStore);\n if (result instanceof KnownError) {\n return result;\n }\n if (result.newUser) {\n window.location.replace(this.urls.afterSignUp);\n } else {\n window.location.replace(this.urls.afterSignIn);\n }\n await neverResolve();\n }\n\n async callOAuthCallback() {\n this._ensurePersistentTokenStore();\n const tokenStore = getTokenStore(this._tokenStoreOptions);\n const result = await callOAuthCallback(this._interface, tokenStore, this.urls.oauthCallback);\n if (result) {\n if (result.newUser) {\n window.location.replace(this.urls.afterSignUp);\n } else {\n window.location.replace(this.urls.afterSignIn);\n }\n }\n await neverResolve();\n }\n\n protected async _signOut(tokenStore: TokenStore): Promise<void> {\n await this._interface.signOut(tokenStore);\n window.location.assign(this.urls.afterSignOut);\n }\n\n protected async _sendVerificationEmail(tokenStore: TokenStore): Promise<KnownErrors[\"EmailAlreadyVerified\"] | undefined> {\n const emailVerificationRedirectUrl = constructRedirectUrl(this.urls.emailVerification);\n return await this._interface.sendVerificationEmail(emailVerificationRedirectUrl, tokenStore);\n }\n\n protected async _updatePassword(\n options: { oldPassword: string, newPassword: string }, \n tokenStore: TokenStore\n ): Promise<KnownErrors[\"PasswordMismatch\"] | KnownErrors[\"PasswordRequirementsNotMet\"] | undefined> {\n return await this._interface.updatePassword(options, tokenStore);\n }\n\n async signOut(): Promise<void> {\n const user = await this.getUser();\n if (user) {\n await user.signOut();\n }\n }\n\n async getProject(): Promise<ClientProjectJson> {\n return await this._currentProjectCache.getOrWait([], \"write-only\");\n }\n\n useProject(): ClientProjectJson {\n return useCache(this._currentProjectCache, [], \"useProject()\");\n }\n\n onProjectChange(callback: (project: ClientProjectJson) => void) {\n return this._currentProjectCache.onChange([], callback);\n }\n\n protected async _listOwnedProjects(): Promise<Project[]> {\n this._ensureInternalProject();\n const tokenStore = getTokenStore(this._tokenStoreOptions);\n const json = await this._ownedProjectsCache.getOrWait([tokenStore], \"write-only\");\n return json.map((j) => this._projectAdminFromJson(\n j,\n this._createAdminInterface(j.id, tokenStore),\n () => this._refreshOwnedProjects(tokenStore),\n ));\n }\n\n protected _useOwnedProjects(): Project[] {\n this._ensureInternalProject();\n const tokenStore = getTokenStore(this._tokenStoreOptions);\n const json = useCache(this._ownedProjectsCache, [tokenStore], \"useOwnedProjects()\");\n return useMemo(() => json.map((j) => this._projectAdminFromJson(\n j,\n this._createAdminInterface(j.id, tokenStore),\n () => this._refreshOwnedProjects(tokenStore),\n )), [json]);\n }\n\n protected _onOwnedProjectsChange(callback: (projects: Project[]) => void) {\n this._ensureInternalProject();\n const tokenStore = getTokenStore(this._tokenStoreOptions);\n return this._ownedProjectsCache.onChange([tokenStore], (projects) => {\n callback(projects.map((j) => this._projectAdminFromJson(\n j,\n this._createAdminInterface(j.id, tokenStore),\n () => this._refreshOwnedProjects(tokenStore),\n )));\n });\n }\n\n protected async _createProject(newProject: Pick<Project, \"displayName\" | \"description\">): Promise<Project> {\n this._ensureInternalProject();\n const tokenStore = getTokenStore(this._tokenStoreOptions);\n const json = await this._interface.createProject(newProject, tokenStore);\n const res = this._projectAdminFromJson(\n json,\n this._createAdminInterface(json.id, tokenStore),\n () => this._refreshOwnedProjects(tokenStore),\n );\n await this._refreshOwnedProjects(tokenStore);\n return res;\n }\n\n protected async _refreshUser(tokenStore: TokenStore) {\n await this._currentUserCache.refresh([tokenStore]);\n }\n\n protected async _refreshUsers() {\n // nothing yet\n }\n \n protected async _refreshProject() {\n await this._currentProjectCache.refresh([]);\n }\n\n protected async _refreshOwnedProjects(tokenStore: TokenStore) {\n await this._ownedProjectsCache.refresh([tokenStore]);\n }\n\n static get [stackAppInternalsSymbol]() {\n return {\n fromClientJson: <HasTokenStore extends boolean, ProjectId extends string>(\n json: StackClientAppJson<HasTokenStore, ProjectId>\n ): StackClientApp<HasTokenStore, ProjectId> => {\n const providedCheckString = JSON.stringify(omit(json, [/* none currently */]));\n const existing = allClientApps.get(json.uniqueIdentifier);\n if (existing) {\n const [existingCheckString, clientApp] = existing;\n if (existingCheckString !== providedCheckString) {\n throw new StackAssertionError(\"The provided app JSON does not match the configuration of the existing client app with the same unique identifier\", { providedObj: json, existingString: existingCheckString });\n }\n return clientApp as any;\n }\n\n return new _StackClientAppImpl<HasTokenStore, ProjectId>({\n ...json,\n checkString: providedCheckString,\n });\n }\n };\n }\n\n get [stackAppInternalsSymbol]() {\n return {\n toClientJson: (): StackClientAppJson<HasTokenStore, ProjectId> => {\n if (!(\"publishableClientKey\" in this._interface.options)) {\n // TODO find a way to do this\n throw Error(\"Cannot serialize to JSON from an application without a publishable client key\");\n }\n\n return {\n baseUrl: this._interface.options.baseUrl,\n projectId: this.projectId,\n publishableClientKey: this._interface.options.publishableClientKey,\n tokenStore: this._tokenStoreOptions,\n urls: this._urlOptions,\n uniqueIdentifier: this._uniqueIdentifier,\n };\n },\n setCurrentUser: (userJsonPromise: Promise<UserJson | null>) => {\n runAsynchronously(this._currentUserCache.forceSetCachedValueAsync([getTokenStore(this._tokenStoreOptions)], userJsonPromise));\n },\n };\n };\n}\n\nclass _StackServerAppImpl<HasTokenStore extends boolean, ProjectId extends string> extends _StackClientAppImpl<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 = createCacheByTokenStore(async (tokenStore) => {\n const user = await this._interface.getServerUserByToken(tokenStore);\n return Result.or(user, null);\n });\n private readonly _serverUsersCache = createCache(async () => {\n return await this._interface.listUsers();\n });\n private readonly _serverUserCache = createCache<string[], ServerUserJson | null>(async ([userId]) => {\n const user = await this._interface.getServerUserById(userId);\n return Result.or(user, null);\n });\n private readonly _serverTeamsCache = createCache(async () => {\n return await this._interface.listTeams();\n });\n private readonly _serverTeamMembersCache = createCache<string[], TeamMemberJson[]>(async ([teamId]) => {\n return await this._interface.listTeamMembers(teamId);\n });\n private readonly _serverTeamPermissionDefinitionsCache = createCache(async () => {\n return await this._interface.listPermissionDefinitions();\n });\n private readonly _serverTeamUserPermissionsCache = createCache<\n [string, string, 'team' | 'global', boolean], \n ServerPermissionDefinitionJson[]\n >(async ([teamId, userId, type, direct]) => {\n return await this._interface.listTeamMemberPermissions({ teamId, userId, type, direct });\n });\n\n\n constructor(options: \n | StackServerAppConstructorOptions<HasTokenStore, ProjectId>\n | {\n interface: StackServerInterface,\n tokenStore: TokenStoreOptions<HasTokenStore>,\n urls: Partial<HandlerUrls> | undefined,\n }\n ) {\n if (\"interface\" in options) {\n super({\n interface: options.interface,\n tokenStore: options.tokenStore,\n urls: options.urls,\n });\n } else {\n super({\n interface: new StackServerInterface({\n baseUrl: options.baseUrl ?? getDefaultBaseUrl(),\n projectId: options.projectId ?? getDefaultProjectId(),\n publishableClientKey: options.publishableClientKey ?? getDefaultPublishableClientKey(),\n secretServerKey: options.secretServerKey ?? getDefaultSecretServerKey(),\n }),\n tokenStore: options.tokenStore,\n urls: options.urls ?? {},\n });\n }\n }\n\n protected _serverUserFromJson(json: ServerUserJson): ServerUser;\n protected _serverUserFromJson(json: ServerUserJson | null): ServerUser | null;\n protected _serverUserFromJson(json: ServerUserJson | null): ServerUser | null {\n if (json === null) return null;\n const app = this;\n return {\n ...this._userFromJson(json),\n serverMetadata: json.serverMetadata,\n async delete() {\n const res = await app._interface.deleteServerUser(this.id);\n await app._refreshUsers();\n return res;\n },\n async update(update: ServerUserUpdateJson) {\n const res = await app._interface.setServerUserCustomizableData(this.id, update);\n await app._refreshUsers();\n return res;\n },\n getClientUser() {\n return app._userFromJson(json);\n },\n async grantPermission(scope: Team, permissionId: string): Promise<void> {\n await app._interface.grantTeamUserPermission(scope.id, json.id, permissionId, 'team');\n for (const direct of [true, false]) {\n await app._serverTeamUserPermissionsCache.refresh([scope.id, json.id, 'team', direct]);\n }\n },\n async revokePermission(scope: Team, permissionId: string): Promise<void> {\n await app._interface.revokeTeamUserPermission(scope.id, json.id, permissionId, 'team');\n for (const direct of [true, false]) {\n await app._serverTeamUserPermissionsCache.refresh([scope.id, json.id, 'team', direct]);\n }\n },\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 onTeamChange(teamId: string, callback: (team: ServerTeam | null) => void) {\n return this.onTeamsChange((teams) => {\n // TODO only call callback if the team actually changed\n const team = teams.find((t) => t.id === teamId) ?? null;\n callback(team);\n });\n },\n async listTeams() {\n const teams = await app._serverTeamsCache.getOrWait([getTokenStore(app._tokenStoreOptions)], \"write-only\");\n return teams.map((json) => app._serverTeamFromJson(json));\n },\n useTeams() {\n const teams = useCache(app._serverTeamsCache, [getTokenStore(app._tokenStoreOptions)], \"user.useTeams()\");\n return useMemo(() => teams.map((json) => app._serverTeamFromJson(json)), [teams]);\n },\n onTeamsChange(callback: (value: ServerTeam[], oldValue: ServerTeam[] | undefined) => void) {\n return app._serverTeamsCache.onChange([getTokenStore(app._tokenStoreOptions)], (value, oldValue) => {\n callback(value.map((json) => app._serverTeamFromJson(json)), oldValue?.map((json) => app._serverTeamFromJson(json)));\n });\n },\n async listPermissions(scope: Team, options?: { direct?: boolean }): Promise<ServerPermission[]> {\n const permissions = await app._serverTeamUserPermissionsCache.getOrWait([scope.id, json.id, 'team', !!options?.direct], \"write-only\");\n return permissions.map((json) => app._serverPermissionFromJson(json));\n },\n usePermissions(scope: Team, options?: { direct?: boolean }): ServerPermission[] {\n const permissions = useCache(app._serverTeamUserPermissionsCache, [scope.id, json.id, 'team', !!options?.direct], \"user.usePermissions()\");\n return useMemo(() => permissions.map((json) => app._serverPermissionFromJson(json)), [permissions]);\n },\n usePermission(scope: Team, permissionId: string): ServerPermission | null {\n const permissions = this.usePermissions(scope);\n return useMemo(() => permissions.find((p) => p.id === permissionId) ?? null, [permissions, permissionId]);\n },\n async getPermission(scope: Team, permissionId: string): Promise<ServerPermission | null> {\n const permissions = await this.listPermissions(scope);\n return permissions.find((p) => p.id === permissionId) ?? null;\n },\n async hasPermission(scope: Team, permissionId: string): Promise<boolean> {\n const permissions = await this.listPermissions(scope);\n return permissions.some((p) => p.id === permissionId);\n },\n toJson() {\n return app._serverUserToJson(this);\n },\n };\n }\n\n protected _currentServerUserFromJson(json: ServerUserJson, tokenStore: TokenStore): ProjectCurrentSeverUser<ProjectId>;\n protected _currentServerUserFromJson(json: ServerUserJson | null, tokenStore: TokenStore): ProjectCurrentSeverUser<ProjectId> | null;\n protected _currentServerUserFromJson(json: ServerUserJson | null, tokenStore: TokenStore): ProjectCurrentSeverUser<ProjectId> | null {\n if (json === null) return null;\n const app = this;\n const nonCurrentServerUser = this._serverUserFromJson(json);\n const currentUser: CurrentServerUser = {\n ...nonCurrentServerUser,\n tokenStore,\n async delete() {\n const res = await nonCurrentServerUser.delete();\n await app._refreshUser(tokenStore);\n return res;\n },\n async update(update: ServerUserUpdateJson) {\n const res = await nonCurrentServerUser.update(update);\n await app._refreshUser(tokenStore);\n return res;\n }, \n signOut() {\n return app._signOut(tokenStore);\n },\n getClientUser() {\n return app._currentUserFromJson(json, tokenStore);\n },\n sendVerificationEmail() {\n return app._sendVerificationEmail(tokenStore);\n },\n updatePassword(options: { oldPassword: string, newPassword: string}) {\n return app._updatePassword(options, tokenStore);\n },\n };\n\n if (this.isInternalProject()) {\n const internalUser: CurrentInternalServerUser = {\n ...currentUser,\n createProject(newProject: Pick<Project, \"displayName\" | \"description\">) {\n return app._createProject(newProject);\n },\n listOwnedProjects() {\n return app._listOwnedProjects();\n },\n useOwnedProjects() {\n return app._useOwnedProjects();\n },\n onOwnedProjectsChange(callback: (projects: Project[]) => void) {\n return app._onOwnedProjectsChange(callback);\n }\n };\n Object.freeze(internalUser);\n return internalUser;\n } else {\n Object.freeze(currentUser);\n return currentUser as any;\n }\n }\n\n protected _serverTeamMemberFromJson(json: ServerTeamMemberJson): ServerTeamMember;\n protected _serverTeamMemberFromJson(json: ServerTeamMemberJson | null): ServerTeamMember | null;\n protected _serverTeamMemberFromJson(json: ServerTeamMemberJson | null): ServerTeamMember | null {\n if (json === null) return null;\n const app = this;\n return {\n ...app._teamMemberFromJson(json),\n async getUser() {\n const user = app._serverUserFromJson(await app._serverUserCache.getOrWait([json.userId], \"write-only\"));\n if (!user) throw new Error(`User ${json.userId} not found`);\n return user;\n }\n };\n }\n\n protected _serverUserToJson(user: ServerUser): ServerUserJson {\n return {\n projectId: user.projectId,\n id: user.id,\n displayName: user.displayName,\n primaryEmail: user.primaryEmail,\n primaryEmailVerified: user.primaryEmailVerified,\n profileImageUrl: user.profileImageUrl,\n signedUpAtMillis: user.signedUpAt.getTime(),\n clientMetadata: user.clientMetadata,\n serverMetadata: user.serverMetadata,\n authMethod: user.authMethod,\n hasPassword: user.hasPassword,\n authWithEmail: user.authWithEmail,\n oauthProviders: user.oauthProviders,\n };\n }\n\n protected _serverTeamFromJson(json: ServerTeamJson): ServerTeam {\n const app = this;\n return {\n id: json.id,\n displayName: json.displayName,\n createdAt: new Date(json.createdAtMillis),\n async listMembers() {\n return (await app._interface.listTeamMembers(json.id)).map((u) => app._serverTeamMemberFromJson(u));\n },\n async update(update: Partial<ServerTeamCustomizableJson>) {\n await app._interface.updateTeam(json.id, update);\n await app._serverTeamsCache.refresh([]);\n },\n async delete() {\n await app._interface.deleteTeam(json.id);\n await app._serverTeamsCache.refresh([]);\n },\n useMembers() {\n const result = useCache(app._serverTeamMembersCache, [json.id], \"team.useUsers()\");\n return useMemo(() => result.map((u) => app._serverTeamMemberFromJson(u)), [result]);\n },\n async addUser(userId) {\n await app._interface.addUserToTeam({\n teamId: json.id,\n userId,\n });\n await app._serverTeamMembersCache.refresh([json.id]);\n },\n async removeUser(userId) {\n await app._interface.removeUserFromTeam({\n teamId: json.id,\n userId,\n });\n await app._serverTeamMembersCache.refresh([json.id]);\n },\n toJson() {\n return json;\n },\n };\n }\n\n async getServerUser(): Promise<ProjectCurrentSeverUser<ProjectId> | null> {\n this._ensurePersistentTokenStore();\n const tokenStore = getTokenStore(this._tokenStoreOptions);\n const userJson = await this._currentServerUserCache.getOrWait([tokenStore], \"write-only\");\n return this._currentServerUserFromJson(userJson, tokenStore);\n }\n\n async getServerUserById(userId: string): Promise<ServerUser | null> {\n const json = await this._serverUserCache.getOrWait([userId], \"write-only\");\n return this._serverUserFromJson(json);\n }\n\n useServerUser(options?: { required: boolean }): ProjectCurrentSeverUser<ProjectId> | null {\n this._ensurePersistentTokenStore();\n\n const tokenStore = getTokenStore(this._tokenStoreOptions);\n const userJson = useCache(this._currentServerUserCache, [tokenStore], \"useServerUser()\");\n\n return useMemo(() => {\n if (options?.required && userJson === null) {\n use(this.redirectToSignIn());\n }\n\n return this._currentServerUserFromJson(userJson, tokenStore);\n }, [userJson, tokenStore, options?.required]);\n }\n\n onServerUserChange(callback: (user: CurrentServerUser | null) => void) {\n this._ensurePersistentTokenStore();\n const tokenStore = getTokenStore(this._tokenStoreOptions);\n return this._currentServerUserCache.onChange([tokenStore], (userJson) => {\n callback(this._currentServerUserFromJson(userJson, tokenStore));\n });\n }\n\n async listServerUsers(): Promise<ServerUser[]> {\n const json = await this._serverUsersCache.getOrWait([], \"write-only\");\n return json.map((j) => this._serverUserFromJson(j));\n }\n\n useServerUsers(): ServerUser[] {\n const json = useCache(this._serverUsersCache, [], \"useServerUsers()\");\n return useMemo(() => {\n return json.map((j) => this._serverUserFromJson(j));\n }, [json]);\n }\n\n onServerUsersChange(callback: (users: ServerUser[]) => void) {\n return this._serverUsersCache.onChange([], (users) => {\n callback(users.map((j) => this._serverUserFromJson(j)));\n });\n }\n\n async listPermissionDefinitions(): Promise<ServerPermissionDefinitionJson[]> {\n return await this._serverTeamPermissionDefinitionsCache.getOrWait([], \"write-only\");\n }\n\n usePermissionDefinitions(): ServerPermissionDefinitionJson[] {\n return useCache(this._serverTeamPermissionDefinitionsCache, [], \"usePermissions()\");\n }\n\n _serverPermissionFromJson(json: ServerPermissionDefinitionJson): ServerPermission {\n return {\n ...this._permissionFromJson(json),\n __databaseUniqueId: json.__databaseUniqueId,\n description: json.description,\n containPermissionIds: json.containPermissionIds,\n };\n }\n\n async createPermissionDefinition(data: ServerPermissionDefinitionCustomizableJson): Promise<ServerPermission>{\n const permission = await this._serverPermissionFromJson(await this._interface.createPermissionDefinition(data));\n await this._serverTeamPermissionDefinitionsCache.refresh([]);\n return permission;\n }\n\n async updatePermissionDefinition(permissionId: string, data: Partial<ServerPermissionDefinitionCustomizableJson>) {\n await this._interface.updatePermissionDefinition(permissionId, data);\n await this._serverTeamPermissionDefinitionsCache.refresh([]);\n }\n\n async deletePermissionDefinition(permissionId: string): Promise<void> {\n await this._interface.deletePermissionDefinition(permissionId);\n await this._serverTeamPermissionDefinitionsCache.refresh([]);\n }\n\n async listTeams(): Promise<ServerTeam[]> {\n const teams = await this._serverTeamsCache.getOrWait([], \"write-only\");\n return teams.map((t) => this._serverTeamFromJson(t));\n }\n\n async createTeam(data: ServerTeamCustomizableJson) : Promise<ServerTeam> {\n const team = await this._interface.createTeam(data);\n await this._serverTeamsCache.refresh([]);\n return this._serverTeamFromJson(team);\n }\n\n useTeams(): ServerTeam[] {\n const teams = useCache(this._serverTeamsCache, [], \"useServerTeams()\");\n return useMemo(() => {\n return teams.map((t) => this._serverTeamFromJson(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 _refreshUser(tokenStore: TokenStore) {\n await Promise.all([\n super._refreshUser(tokenStore),\n this._currentServerUserCache.refresh([tokenStore]),\n ]);\n }\n\n protected override async _refreshUsers() {\n await Promise.all([\n super._refreshUsers(),\n this._serverUsersCache.refresh([]),\n ]);\n }\n}\n\nclass _StackAdminAppImpl<HasTokenStore extends boolean, ProjectId extends string> extends _StackServerAppImpl<HasTokenStore, ProjectId>\n{\n declare protected _interface: StackAdminInterface;\n \n private readonly _adminProjectCache = createCache(async () => {\n return await this._interface.getProject();\n });\n private readonly _apiKeySetsCache = createCache(async () => {\n return await this._interface.listApiKeySets();\n });\n\n constructor(options: StackAdminAppConstructorOptions<HasTokenStore, ProjectId>) {\n super({\n interface: new StackAdminInterface({\n baseUrl: options.baseUrl ?? getDefaultBaseUrl(),\n projectId: options.projectId ?? getDefaultProjectId(),\n ...\"projectOwnerTokens\" in options ? {\n projectOwnerTokens: options.projectOwnerTokens,\n } : {\n publishableClientKey: options.publishableClientKey ?? getDefaultPublishableClientKey(),\n secretServerKey: options.secretServerKey ?? getDefaultSecretServerKey(),\n superSecretAdminKey: options.superSecretAdminKey ?? getDefaultSuperSecretAdminKey(),\n },\n }),\n tokenStore: options.tokenStore,\n urls: options.urls,\n });\n }\n\n\n protected _createApiKeySetBaseFromJson(data: ApiKeySetBaseJson): ApiKeySetBase {\n const app = this;\n return {\n id: data.id,\n description: data.description,\n expiresAt: new Date(data.expiresAtMillis),\n manuallyRevokedAt: data.manuallyRevokedAtMillis ? new Date(data.manuallyRevokedAtMillis) : null,\n createdAt: new Date(data.createdAtMillis),\n isValid() {\n return this.whyInvalid() === null;\n },\n whyInvalid() {\n if (this.expiresAt.getTime() < Date.now()) return \"expired\";\n if (this.manuallyRevokedAt) return \"manually-revoked\";\n return null;\n },\n async revoke() {\n const res = await app._interface.revokeApiKeySetById(data.id);\n await app._refreshApiKeySets();\n return res;\n }\n };\n }\n\n protected _createApiKeySetFromJson(data: ApiKeySetJson): ApiKeySet {\n return {\n ...this._createApiKeySetBaseFromJson(data),\n publishableClientKey: data.publishableClientKey ? { lastFour: data.publishableClientKey.lastFour } : null,\n secretServerKey: data.secretServerKey ? { lastFour: data.secretServerKey.lastFour } : null,\n superSecretAdminKey: data.superSecretAdminKey ? { lastFour: data.superSecretAdminKey.lastFour } : null,\n };\n }\n\n protected _createApiKeySetFirstViewFromJson(data: ApiKeySetFirstViewJson): ApiKeySetFirstView {\n return {\n ...this._createApiKeySetBaseFromJson(data),\n publishableClientKey: data.publishableClientKey,\n secretServerKey: data.secretServerKey,\n superSecretAdminKey: data.superSecretAdminKey,\n };\n }\n\n async getProjectAdmin(): Promise<Project> {\n return this._projectAdminFromJson(\n await this._adminProjectCache.getOrWait([], \"write-only\"),\n this._interface,\n () => this._refreshProject()\n );\n }\n\n useProjectAdmin(): Project {\n const json = useCache(this._adminProjectCache, [], \"useProjectAdmin()\");\n return useMemo(() => this._projectAdminFromJson(\n json,\n this._interface,\n () => this._refreshProject()\n ), [json]);\n }\n\n onProjectAdminChange(callback: (project: Project) => void) {\n return this._adminProjectCache.onChange([], (project) => {\n callback(this._projectAdminFromJson(\n project,\n this._interface,\n () => this._refreshProject()\n ));\n });\n }\n\n async listApiKeySets(): Promise<ApiKeySet[]> {\n const json = await this._apiKeySetsCache.getOrWait([], \"write-only\");\n return json.map((j) => this._createApiKeySetFromJson(j));\n }\n\n useApiKeySets(): ApiKeySet[] {\n const json = useCache(this._apiKeySetsCache, [], \"useApiKeySets()\");\n return useMemo(() => {\n return json.map((j) => this._createApiKeySetFromJson(j));\n }, [json]);\n }\n\n onApiKeySetsChange(callback: (apiKeySets: ApiKeySet[]) => void) {\n return this._apiKeySetsCache.onChange([], (apiKeySets) => {\n callback(apiKeySets.map((j) => this._createApiKeySetFromJson(j)));\n });\n }\n\n async createApiKeySet(options: ApiKeySetCreateOptions): Promise<ApiKeySetFirstView> {\n const json = await this._interface.createApiKeySet(options);\n await this._refreshApiKeySets();\n return this._createApiKeySetFirstViewFromJson(json);\n }\n\n protected override async _refreshProject() {\n await Promise.all([\n super._refreshProject(),\n this._adminProjectCache.refresh([]),\n ]);\n }\n\n protected async _refreshApiKeySets() {\n await this._apiKeySetsCache.refresh([]);\n }\n}\n\ntype Auth<T, C> = {\n readonly tokenStore: ReadonlyTokenStore,\n update(this: T, user: C): Promise<void>,\n signOut(this: T): Promise<void>,\n sendVerificationEmail(this: T): Promise<KnownErrors[\"EmailAlreadyVerified\"] | undefined>,\n updatePassword(this: T, options: { oldPassword: string, newPassword: string}): Promise<KnownErrors[\"PasswordMismatch\"] | KnownErrors[\"PasswordRequirementsNotMet\"] | undefined>,\n};\n\ntype InternalAuth<T> = {\n createProject(this: T, newProject: Pick<Project, \"displayName\" | \"description\">): Promise<Project>,\n listOwnedProjects(this: T): Promise<Project[]>,\n useOwnedProjects(this: T): Project[],\n onOwnedProjectsChange(this: T, callback: (projects: Project[]) => void): void,\n};\n\nexport type User = (\n & {\n readonly projectId: string,\n readonly id: string,\n\n readonly displayName: string | null,\n\n /**\n * The user's email address.\n *\n * Note: This might NOT be unique across multiple users, so always use `id` for unique identification.\n */\n readonly primaryEmail: string | null,\n readonly primaryEmailVerified: boolean,\n\n readonly profileImageUrl: string | null,\n\n readonly signedUpAt: Date,\n\n readonly clientMetadata: ReadonlyJson,\n\n readonly authMethod: 'credential' | 'oauth', // not used anymore, for backwards compatibility\n readonly hasPassword: boolean,\n readonly authWithEmail: boolean,\n readonly oauthProviders: readonly string[],\n\n hasPermission(this: CurrentUser, scope: Team, permissionId: string): Promise<boolean>,\n\n toJson(this: CurrentUser): UserJson,\n }\n & AsyncStoreProperty<\"team\", [id: string], Team | null, false>\n & AsyncStoreProperty<\"teams\", [], Team[], true>\n & Omit<AsyncStoreProperty<\"permission\", [scope: Team, permissionId: string, options?: { direct?: boolean }], Permission | null, false>, \"onPermissionChange\">\n & Omit<AsyncStoreProperty<\"permissions\", [scope: Team, options?: { direct?: boolean }], Permission[], true>, \"onPermissionsChange\">\n);\n\nexport type CurrentUser = Auth<User, UserUpdateJson> & User;\n\nexport type CurrentInternalUser = CurrentUser & InternalAuth<CurrentUser>;\n\n/**\n * A user including sensitive fields that should only be used on the server, never sent to the client\n * (such as sensitive information and serverMetadata).\n */\nexport type ServerUser = (\n Omit<\n User, \n 'hasPermission' | 'toJson' \n | keyof AsyncStoreProperty<\"team\", [], Team | null, false>\n | keyof AsyncStoreProperty<\"teams\", [], Team[], true>\n | keyof AsyncStoreProperty<\"permission\", [], Permission[], false> \n | keyof AsyncStoreProperty<\"permissions\", [], Permission[], true> \n > & {\n readonly serverMetadata: ReadonlyJson,\n\n /**\n * Returns a new user object with the sensitive fields removed.\n */\n getClientUser(this: ServerUser): User,\n\n update(this: ServerUser, user: Partial<ServerUserUpdateJson>): Promise<void>,\n delete(this: ServerUser): Promise<void>,\n\n grantPermission(scope: Team, permissionId: string): Promise<void>,\n revokePermission(scope: Team, permissionId: string): Promise<void>,\n\n hasPermission(scope: Team, permissionId: string): Promise<boolean>,\n\n toJson(this: ServerUser): ServerUserJson,\n } \n & AsyncStoreProperty<\"team\", [id: string], ServerTeam | null, false>\n & AsyncStoreProperty<\"teams\", [], ServerTeam[], true>\n & Omit<AsyncStoreProperty<\"permission\", [scope: Team, permissionId: string, options?: { direct?: boolean }], ServerPermission | null, false>, \"onPermissionChange\">\n & Omit<AsyncStoreProperty<\"permissions\", [scope: Team, options?: { direct?: boolean }], ServerPermission[], true>, \"onPermissionsChange\">\n)\n\nexport type CurrentServerUser = Auth<ServerUser, ServerUserUpdateJson> & Omit<ServerUser, \"getClientUser\"> & {\n getClientUser(this: CurrentServerUser): CurrentUser,\n};\n\nexport type CurrentInternalServerUser = CurrentServerUser & InternalAuth<CurrentServerUser>;\n\nexport type Project = {\n readonly id: string,\n readonly displayName: string,\n readonly description?: string,\n readonly createdAt: Date,\n readonly userCount: number,\n readonly isProductionMode: boolean,\n readonly evaluatedConfig: {\n readonly id: string,\n readonly allowLocalhost: boolean,\n readonly credentialEnabled: boolean,\n readonly magicLinkEnabled: boolean,\n readonly oauthProviders: OAuthProviderConfig[],\n readonly emailConfig?: EmailConfig,\n readonly domains: DomainConfig[],\n readonly createTeamOnSignUp: boolean,\n },\n\n update(this: Project, update: ProjectUpdateOptions): Promise<void>,\n\n toJson(this: Project): ProjectJson,\n\n getProductionModeErrors(this: Project): ProductionModeError[],\n};\n\nexport type Team = {\n id: string,\n displayName: string,\n createdAt: Date,\n\n toJson(this: Team): TeamJson,\n};\n\nexport type ServerTeam = Team & {\n listMembers(): Promise<ServerTeamMember[]>,\n useMembers(): ServerTeamMember[],\n update(update: Partial<ServerTeamCustomizableJson>): Promise<void>,\n delete(): Promise<void>,\n addUser(userId: string): Promise<void>,\n removeUser(userId: string): Promise<void>,\n};\n\nexport type TeamMember = {\n userId: string,\n teamId: string,\n displayName: string | null,\n}\n\nexport type ServerTeamMember = TeamMember & {\n getUser(): Promise<ServerUser>,\n}\n\nexport type Permission = {\n id: string,\n} & (\n | { type: \"global\" }\n | { type: \"team\", teamId: string }\n);\n\nexport type ServerPermission = Permission & {\n readonly __databaseUniqueId: string,\n readonly description?: string,\n readonly containPermissionIds: string[],\n};\n\n\nexport type ApiKeySetBase = {\n id: string,\n description: string,\n expiresAt: Date,\n manuallyRevokedAt: Date | null,\n createdAt: Date,\n isValid(): boolean,\n whyInvalid(): \"expired\" | \"manually-revoked\" | null,\n revoke(): Promise<void>,\n};\n\nexport type ApiKeySetFirstView = ApiKeySetBase & {\n publishableClientKey?: string,\n secretServerKey?: string,\n superSecretAdminKey?: string,\n};\n\nexport type ApiKeySet = ApiKeySetBase & {\n publishableClientKey: null | {\n lastFour: string,\n },\n secretServerKey: null | {\n lastFour: string,\n },\n superSecretAdminKey: null | {\n lastFour: string,\n },\n};\n\n\nexport type EmailConfig = EmailConfigJson;\n\nexport type DomainConfig = DomainConfigJson;\n\nexport type OAuthProviderConfig = OAuthProviderConfigJson;\n\nexport type GetUserOptions = {\n or?: 'redirect' | 'throw' | 'return-null',\n};\n\ntype SplitArgs<T extends any[], U extends number> = [\n ...Parameters<Extract<T[U], (...args: any) => any>>,\n Omit<T, U>\n];\n\ntype 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 `on${Capitalize<Name>}Change`]: (...tupleArgs: [...args: Args, callback: (value: Value) => void]) => void }\n & { [key in `use${Capitalize<Name>}`]: (...args: Args) => Value }\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 }): Promise<KnownErrors[\"EmailPasswordMismatch\"] | undefined>,\n signUpWithCredential(options: { email: string, password: string }): Promise<KnownErrors[\"UserEmailAlreadyExists\"] | undefined>,\n callOAuthCallback(): Promise<void>,\n sendForgotPasswordEmail(email: string): Promise<KnownErrors[\"UserNotFound\"] | undefined>,\n sendMagicLinkEmail(email: string): Promise<KnownErrors[\"RedirectUrlNotWhitelisted\"] | undefined>,\n resetPassword(options: { code: string, password: string }): Promise<KnownErrors[\"PasswordResetError\"] | undefined>,\n verifyPasswordResetCode(code: string): Promise<KnownErrors[\"PasswordResetCodeError\"] | undefined>,\n verifyEmail(code: string): Promise<KnownErrors[\"EmailVerificationError\"] | undefined>,\n signInWithMagicLink(code: string): Promise<KnownErrors[\"MagicLinkError\"] | undefined>,\n\n [stackAppInternalsSymbol]: {\n toClientJson(): StackClientAppJson<HasTokenStore, ProjectId>,\n setCurrentUser(userJsonPromise: Promise<UserJson | null>): void,\n },\n }\n & AsyncStoreProperty<\"project\", [], ClientProjectJson, false>\n & { [K in `redirectTo${Capitalize<keyof Omit<HandlerUrls, 'handler' | 'oauthCallback'>>}`]: () => Promise<void> }\n & (HasTokenStore extends false\n ? {}\n : {\n redirectToOAuthCallback(): Promise<void>,\n useUser(options: GetUserOptions & { or: 'redirect' }): ProjectCurrentUser<ProjectId>,\n useUser(options: GetUserOptions & { or: 'throw' }): ProjectCurrentUser<ProjectId>,\n useUser(options?: GetUserOptions): ProjectCurrentUser<ProjectId> | null,\n getUser(options: GetUserOptions & { or: 'redirect' }): Promise<ProjectCurrentUser<ProjectId>>,\n getUser(options: GetUserOptions & { or: 'throw' }): Promise<ProjectCurrentUser<ProjectId>>,\n getUser(options?: GetUserOptions): Promise<ProjectCurrentUser<ProjectId> | null>,\n onUserChange: AsyncStoreProperty<\"user\", [], CurrentUser | null, false>[\"onUserChange\"],\n })\n);\ntype 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\nexport type StackServerApp<HasTokenStore extends boolean = boolean, ProjectId extends string = string> = (\n & StackClientApp<HasTokenStore, ProjectId>\n & {\n createTeam(data: ServerTeamCustomizableJson): Promise<ServerTeam>,\n createPermissionDefinition(data: ServerPermissionDefinitionCustomizableJson): Promise<ServerPermission>,\n updatePermissionDefinition(permissionId: string, data: Partial<ServerPermissionDefinitionCustomizableJson>): Promise<void>,\n deletePermissionDefinition(permissionId: string): Promise<void>,\n listPermissionDefinitions(): Promise<ServerPermissionDefinitionJson[]>,\n usePermissionDefinitions(): ServerPermissionDefinitionJson[],\n }\n & AsyncStoreProperty<\"serverUser\", [], CurrentServerUser | null, false>\n & AsyncStoreProperty<\"serverUsers\", [], ServerUser[], true>\n & Omit<AsyncStoreProperty<\"team\", [id: string], ServerTeam | null, false>, \"onTeamChange\">\n & Omit<AsyncStoreProperty<\"teams\", [], ServerTeam[], true>, \"onTeamsChange\">\n);\ntype 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\nexport type StackAdminApp<HasTokenStore extends boolean = boolean, ProjectId extends string = string> = (\n & StackServerApp<HasTokenStore, ProjectId>\n & AsyncStoreProperty<\"projectAdmin\", [], Project, false>\n & AsyncStoreProperty<\"apiKeySets\", [], ApiKeySet[], true>\n & {\n createApiKeySet(options: ApiKeySetCreateOptions): Promise<ApiKeySetFirstView>,\n }\n);\ntype StackAdminAppConstructor = {\n new <\n HasTokenStore extends boolean,\n ProjectId extends string\n >(options: StackAdminAppConstructorOptions<HasTokenStore, ProjectId>): StackAdminApp<HasTokenStore, ProjectId>,\n new (options: StackAdminAppConstructorOptions<boolean, string>): StackAdminApp<boolean, string>,\n};\nexport const StackAdminApp: StackAdminAppConstructor = _StackAdminAppImpl;\n"],"mappings":"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","names":["import_react","React","json"]}
|
|
1
|
+
{"version":3,"sources":["../../src/lib/stack-app.ts"],"sourcesContent":["import React, { use, useCallback, useMemo } from \"react\";\nimport { KnownError, KnownErrors, OAuthProviderConfigJson, ServerUserJson, StackAdminInterface, StackClientInterface, StackServerInterface } from \"@stackframe/stack-shared\";\nimport { getCookie, setOrDeleteCookie } from \"./cookie\";\nimport { StackAssertionError, throwErr } from \"@stackframe/stack-shared/dist/utils/errors\";\nimport { generateUuid } from \"@stackframe/stack-shared/dist/utils/uuids\";\nimport { AsyncResult, Result } from \"@stackframe/stack-shared/dist/utils/results\";\nimport { suspendIfSsr } from \"@stackframe/stack-shared/dist/utils/react\";\nimport { AsyncStore } from \"@stackframe/stack-shared/dist/utils/stores\";\nimport { ClientProjectJson, UserJson, TokenObject, TokenStore, ProjectJson, EmailConfigJson, DomainConfigJson, ReadonlyTokenStore, getProductionModeErrors, ProductionModeError, UserUpdateJson, TeamJson, PermissionDefinitionJson, PermissionDefinitionScopeJson, TeamMemberJson } from \"@stackframe/stack-shared/dist/interface/clientInterface\";\nimport { isClient } from \"../utils/next\";\nimport { callOAuthCallback, signInWithOAuth } from \"./auth\";\nimport * as NextNavigation from \"next/navigation\"; // import the entire module to get around some static compiler warnings emitted by Next.js in some cases\nimport { ReadonlyJson } from \"@stackframe/stack-shared/dist/utils/json\";\nimport { constructRedirectUrl } from \"../utils/url\";\nimport { filterUndefined, omit } from \"@stackframe/stack-shared/dist/utils/objects\";\nimport { neverResolve, resolved, runAsynchronously, wait } from \"@stackframe/stack-shared/dist/utils/promises\";\nimport { AsyncCache } from \"@stackframe/stack-shared/dist/utils/caches\";\nimport { ApiKeySetBaseJson, ApiKeySetCreateOptions, ApiKeySetFirstViewJson, ApiKeySetJson, ProjectUpdateOptions } from \"@stackframe/stack-shared/dist/interface/adminInterface\";\nimport { suspend } from \"@stackframe/stack-shared/dist/utils/react\";\nimport { ServerPermissionDefinitionCustomizableJson, ServerPermissionDefinitionJson, ServerTeamCustomizableJson, ServerTeamJson, ServerTeamMemberJson, ServerUserUpdateJson } from \"@stackframe/stack-shared/dist/interface/serverInterface\";\n\n\nexport type TokenStoreOptions<HasTokenStore extends boolean = boolean> =\n HasTokenStore extends true ? \"cookie\" | \"nextjs-cookie\" | \"memory\" :\n HasTokenStore extends false ? null :\n TokenStoreOptions<true> | TokenStoreOptions<false>;\n\nexport type HandlerUrls = {\n handler: string,\n signIn: string,\n afterSignIn: string,\n signUp: 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}\n\ntype ProjectCurrentUser<ProjectId> = ProjectId extends \"internal\" ? CurrentInternalUser : CurrentUser;\ntype ProjectCurrentSeverUser<ProjectId> = ProjectId extends \"internal\" ? CurrentInternalServerUser : CurrentServerUser;\n\nfunction permissionDefinitionScopeToType(scope: PermissionDefinitionScopeJson): 'team' | 'global' {\n return ({\"any-team\": \"team\", \"specific-team\": \"team\", \"global\": \"global\"} as const)[scope.type];\n}\n\nfunction getUrls(partial: Partial<HandlerUrls>): HandlerUrls {\n const handler = partial.handler ?? \"/handler\";\n return {\n handler,\n signIn: `${handler}/signin`,\n afterSignIn: \"/\",\n signUp: `${handler}/signup`,\n afterSignUp: \"/\",\n signOut: `${handler}/signout`,\n afterSignOut: \"/\",\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: \"/\",\n accountSettings: `${handler}/account-settings`,\n ...filterUndefined(partial),\n };\n}\n\nfunction getDefaultProjectId() {\n return process.env.NEXT_PUBLIC_STACK_PROJECT_ID || throwErr(\"Welcome to Stack! 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\nfunction getDefaultPublishableClientKey() {\n return process.env.NEXT_PUBLIC_STACK_PUBLISHABLE_CLIENT_KEY || throwErr(\"Welcome to Stack! 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\nfunction getDefaultSecretServerKey() {\n return process.env.STACK_SECRET_SERVER_KEY || throwErr(\"No secret server key provided. Please copy your key from the Stack dashboard and put your it in the STACK_SECRET_SERVER_KEY environment variable.\");\n}\n\nfunction getDefaultSuperSecretAdminKey() {\n return process.env.STACK_SUPER_SECRET_ADMIN_KEY || throwErr(\"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\nfunction getDefaultBaseUrl() {\n return process.env.NEXT_PUBLIC_STACK_URL || defaultBaseUrl;\n}\n\nexport type StackClientAppConstructorOptions<HasTokenStore extends boolean, ProjectId extends string> = {\n baseUrl?: string,\n projectId?: ProjectId,\n publishableClientKey?: string,\n urls?: Partial<HandlerUrls>,\n\n // we intersect with TokenStoreOptions in the beginning to make TypeScript error messages easier to read\n tokenStore: TokenStoreOptions<HasTokenStore>,\n};\n\nexport type StackServerAppConstructorOptions<HasTokenStore extends boolean, ProjectId extends string> = StackClientAppConstructorOptions<HasTokenStore, ProjectId> & {\n secretServerKey?: string,\n};\n\nexport type StackAdminAppConstructorOptions<HasTokenStore extends boolean, ProjectId extends string> = (\n | (\n & StackServerAppConstructorOptions<HasTokenStore, ProjectId>\n & {\n superSecretAdminKey?: string,\n }\n )\n | (\n & Omit<StackServerAppConstructorOptions<HasTokenStore, ProjectId>, \"publishableClientKey\" | \"secretServerKey\">\n & {\n projectOwnerTokens: ReadonlyTokenStore,\n }\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\nconst defaultBaseUrl = \"https://app.stack-auth.com\";\n\nfunction createEmptyTokenStore() {\n const store = new AsyncStore<TokenObject>();\n store.set({\n refreshToken: null,\n accessToken: null,\n });\n return store;\n}\n\nconst memoryTokenStore = createEmptyTokenStore();\nlet cookieTokenStore: TokenStore | null = null;\nconst cookieTokenStoreInitializer = (): TokenStore => {\n if (!isClient()) {\n throw new Error(\"Cannot use cookie token store on the server!\");\n }\n\n if (cookieTokenStore === null) {\n cookieTokenStore = new AsyncStore<TokenObject>();\n let hasSucceededInWriting = true;\n\n setInterval(() => {\n if (hasSucceededInWriting) {\n const newValue = {\n refreshToken: getCookie('stack-refresh'),\n accessToken: getCookie('stack-access'),\n };\n const res = cookieTokenStore!.get();\n if (res.status !== \"ok\"\n || res.data.refreshToken !== newValue.refreshToken\n || res.data.accessToken !== newValue.accessToken\n ) {\n cookieTokenStore!.set(newValue);\n }\n }\n }, 10);\n cookieTokenStore.onChange((value) => {\n try {\n setOrDeleteCookie('stack-refresh', value.refreshToken, { maxAge: 60 * 60 * 24 * 365 });\n setOrDeleteCookie('stack-access', value.accessToken, { maxAge: 60 * 60 * 24 });\n hasSucceededInWriting = true;\n } catch (e) {\n hasSucceededInWriting = false;\n }\n });\n }\n\n return cookieTokenStore;\n};\n\nconst tokenStoreInitializers = new Map<TokenStoreOptions, () => TokenStore>([\n [\"cookie\", cookieTokenStoreInitializer],\n [\"nextjs-cookie\", () => {\n if (isClient()) {\n return cookieTokenStoreInitializer();\n } else {\n const store = new AsyncStore<TokenObject>();\n store.set({\n refreshToken: getCookie('stack-refresh'),\n accessToken: getCookie('stack-access'),\n });\n store.onChange((value) => {\n try {\n setOrDeleteCookie('stack-refresh', value.refreshToken, { maxAge: 60 * 60 * 24 * 365 });\n setOrDeleteCookie('stack-access', value.accessToken, { maxAge: 60 * 60 * 24 });\n } catch (e) {\n // ignore\n }\n });\n return store;\n }\n }],\n [\"memory\", () => memoryTokenStore],\n [null, () => createEmptyTokenStore()],\n]);\nfunction getTokenStore(tokenStoreOptions: TokenStoreOptions) {\n return (tokenStoreInitializers.get(tokenStoreOptions) ?? throwErr(`Invalid token store ${tokenStoreOptions}`))();\n}\n\nconst loadingSentinel = Symbol(\"stackAppCacheLoadingSentinel\");\nfunction useCache<D extends any[], T>(cache: AsyncCache<D, T>, dependencies: D, caller: string): T {\n // we explicitly don't want to run this hook in SSR\n suspendIfSsr(caller);\n\n const subscribe = useCallback((cb: () => void) => {\n const { unsubscribe } = cache.onChange(dependencies, () => cb());\n return unsubscribe;\n }, [cache, ...dependencies]);\n const getSnapshot = useCallback(() => {\n return AsyncResult.or(cache.getIfCached(dependencies), loadingSentinel);\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 value = React.useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n\n if (value === loadingSentinel) {\n return use(cache.getOrWait(dependencies, \"read-write\"));\n } else {\n // still need to call `use` because React expects the control flow to not change across two re-renders with the same props/state and it detects that by hook invocations (including `use`)\n return use(resolved(value));\n }\n}\n\nexport const stackAppInternalsSymbol = Symbol.for(\"StackAppInternals\");\n\nconst allClientApps = new Map<string, [checkString: string, app: StackClientApp<any, any>]>();\n\nconst createCache = <D extends any[], T>(fetcher: (dependencies: D) => Promise<T>) => {\n return new AsyncCache<D, T>(\n async (dependencies) => await fetcher(dependencies),\n {},\n );\n};\n\n// note that we intentionally use TokenStore (a reference type) as a key instead of a stringified version of it, as different token stores with the same tokens should be treated differently\n// (if we wouldn't , we would cache users across requests on the server, which may cause issues)\nconst createCacheByTokenStore = <D extends any[], T>(fetcher: (tokenStore: TokenStore, extraDependencies: D) => Promise<T> ) => {\n return new AsyncCache<[TokenStore, ...D], T>(\n async ([tokenStore, ...extraDependencies]) => await fetcher(tokenStore, extraDependencies),\n {\n onSubscribe: ([tokenStore], refresh) => {\n // TODO find a *clean* way to not refresh when the token change was made inside the fetcher (for example due to expired access token)\n const handlerObj = tokenStore.onChange((newValue, oldValue) => {\n if (JSON.stringify(newValue) === JSON.stringify(oldValue)) return;\n refresh();\n });\n return () => handlerObj.unsubscribe();\n },\n },\n );\n};\n\n\nclass _StackClientAppImpl<HasTokenStore extends boolean, ProjectId extends string = string> {\n protected readonly _uniqueIdentifier: string;\n protected _interface: StackClientInterface;\n protected readonly _tokenStoreOptions: TokenStoreOptions<HasTokenStore>;\n protected readonly _urlOptions: Partial<HandlerUrls>;\n\n private readonly __DEMO_ENABLE_SLIGHT_FETCH_DELAY = false;\n\n private readonly _currentUserCache = createCacheByTokenStore(async (tokenStore) => {\n if (this.__DEMO_ENABLE_SLIGHT_FETCH_DELAY) {\n await wait(2000);\n }\n const user = await this._interface.getClientUserByToken(tokenStore);\n return Result.or(user, null);\n });\n private readonly _currentProjectCache = createCache(async () => {\n return Result.orThrow(await this._interface.getClientProject());\n });\n private readonly _ownedProjectsCache = createCacheByTokenStore(async (tokenStore) => {\n return await this._interface.listProjects(tokenStore);\n });\n private readonly _currentUserPermissionsCache = createCacheByTokenStore<\n [string, 'team' | 'global', boolean], \n PermissionDefinitionJson[]\n >(async (tokenStore, [teamId, type, direct]) => {\n return await this._interface.listClientUserTeamPermissions({ teamId, type, direct }, tokenStore);\n });\n private readonly _currentUserTeamsCache = createCacheByTokenStore(async (tokenStore) => {\n return await this._interface.listClientUserTeams(tokenStore);\n });\n\n constructor(options:\n & {\n uniqueIdentifier?: string,\n checkString?: string,\n }\n & (\n | StackClientAppConstructorOptions<HasTokenStore, ProjectId>\n | Pick<StackClientAppConstructorOptions<HasTokenStore, ProjectId>, \"tokenStore\" | \"urls\"> & {\n interface: StackClientInterface,\n }\n )\n ) {\n if (\"interface\" in options) {\n this._interface = options.interface;\n } else {\n this._interface = new StackClientInterface({\n baseUrl: options.baseUrl ?? getDefaultBaseUrl(),\n projectId: options.projectId ?? getDefaultProjectId(),\n publishableClientKey: options.publishableClientKey ?? getDefaultPublishableClientKey(),\n });\n }\n\n this._tokenStoreOptions = options.tokenStore;\n this._urlOptions = options.urls ?? {};\n\n this._uniqueIdentifier = options.uniqueIdentifier ?? generateUuid();\n if (allClientApps.has(this._uniqueIdentifier)) {\n throw new StackAssertionError(\"A Stack client app with the same unique identifier already exists\");\n }\n allClientApps.set(this._uniqueIdentifier, [options.checkString ?? \"default check string\", this]);\n }\n\n protected hasPersistentTokenStore(): this is StackClientApp<true, ProjectId> {\n return this._tokenStoreOptions !== null;\n }\n\n protected _ensurePersistentTokenStore(): asserts this is StackClientApp<true, ProjectId> {\n if (!this.hasPersistentTokenStore()) {\n throw new Error(\"Cannot call this function on a Stack app without a persistent token store. Make sure the tokenStore option is set to a non-null value when initializing Stack.\");\n }\n }\n\n protected isInternalProject(): this is { projectId: \"internal\" } {\n return this.projectId === \"internal\";\n }\n\n protected _ensureInternalProject(): asserts this is { projectId: \"internal\" } {\n if (!this.isInternalProject()) {\n throw new Error(\"Cannot call this function on a Stack app with a project ID other than 'internal'.\");\n }\n }\n\n protected _permissionFromJson(json: PermissionDefinitionJson): Permission {\n const type = permissionDefinitionScopeToType(json.scope);\n \n if (type === 'team') {\n return {\n id: json.id,\n type,\n teamId: (json.scope as { teamId: string }).teamId,\n };\n } else {\n return {\n id: json.id,\n type,\n };\n }\n }\n\n protected _teamFromJson(json: TeamJson): Team {\n return {\n id: json.id,\n displayName: json.displayName,\n createdAt: new Date(json.createdAtMillis),\n toJson() {\n return json;\n },\n };\n }\n\n protected _userFromJson(json: UserJson): User {\n const app = this;\n return {\n projectId: json.projectId,\n id: json.id,\n displayName: json.displayName,\n primaryEmail: json.primaryEmail,\n primaryEmailVerified: json.primaryEmailVerified,\n profileImageUrl: json.profileImageUrl,\n signedUpAt: new Date(json.signedUpAtMillis),\n clientMetadata: json.clientMetadata,\n authMethod: json.authMethod,\n hasPassword: json.hasPassword,\n authWithEmail: json.authWithEmail,\n oauthProviders: json.oauthProviders,\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 onTeamChange(teamId: string, callback: (team: Team | null) => void) {\n return this.onTeamsChange((teams) => {\n // TODO only call callback if the team actually changed\n const team = teams.find((t) => t.id === teamId) ?? null;\n callback(team);\n });\n },\n async listTeams() {\n const teams = await app._currentUserTeamsCache.getOrWait([getTokenStore(app._tokenStoreOptions)], \"write-only\");\n return teams.map((json) => app._teamFromJson(json));\n },\n useTeams() {\n const teams = useCache(app._currentUserTeamsCache, [getTokenStore(app._tokenStoreOptions)], \"user.useTeams()\");\n return useMemo(() => teams.map((json) => app._teamFromJson(json)), [teams]);\n },\n onTeamsChange(callback: (value: Team[], oldValue: Team[] | undefined) => void) {\n return app._currentUserTeamsCache.onChange([getTokenStore(app._tokenStoreOptions)], (value, oldValue) => {\n callback(value.map((json) => app._teamFromJson(json)), oldValue?.map((json) => app._teamFromJson(json)));\n });\n },\n async listPermissions(scope: Team, options?: { direct?: boolean }): Promise<Permission[]> {\n const permissions = await app._currentUserPermissionsCache.getOrWait([getTokenStore(app._tokenStoreOptions), scope.id, 'team', !!options?.direct], \"write-only\");\n return permissions.map((json) => app._permissionFromJson(json));\n },\n usePermissions(scope: Team, options?: { direct?: boolean }): Permission[] {\n const permissions = useCache(app._currentUserPermissionsCache, [getTokenStore(app._tokenStoreOptions), scope.id, 'team', !!options?.direct], \"user.usePermissions()\");\n return useMemo(() => permissions.map((json) => app._permissionFromJson(json)), [permissions]);\n },\n usePermission(scope: Team, permissionId: string): Permission | null {\n const permissions = this.usePermissions(scope);\n return useMemo(() => permissions.find((p) => p.id === permissionId) ?? null, [permissions, permissionId]);\n },\n async getPermission(scope: Team, permissionId: string): Promise<Permission | null> {\n const permissions = await this.listPermissions(scope);\n return permissions.find((p) => p.id === permissionId) ?? null;\n },\n async hasPermission(scope: Team, permissionId: string): Promise<boolean> {\n const permissions = await this.listPermissions(scope);\n return permissions.some((p) => p.id === permissionId);\n },\n toJson() {\n return json;\n },\n };\n }\n\n protected _teamMemberFromJson(json: TeamMemberJson): TeamMember;\n protected _teamMemberFromJson(json: TeamMemberJson | null): TeamMember | null;\n protected _teamMemberFromJson(json: TeamMemberJson): TeamMember | null {\n if (json === null) return null;\n return {\n teamId: json.teamId,\n userId: json.userId,\n displayName: json.displayName,\n };\n }\n\n protected _currentUserFromJson(json: UserJson, tokenStore: TokenStore): ProjectCurrentUser<ProjectId>;\n protected _currentUserFromJson(json: UserJson | null, tokenStore: TokenStore): ProjectCurrentUser<ProjectId> | null;\n protected _currentUserFromJson(json: UserJson | null, tokenStore: TokenStore): ProjectCurrentUser<ProjectId> | null {\n if (json === null) return null;\n const app = this;\n const currentUser: CurrentUser = {\n ...this._userFromJson(json),\n tokenStore,\n update(update) {\n return app._updateUser(update, tokenStore);\n },\n signOut() {\n return app._signOut(tokenStore);\n },\n sendVerificationEmail() {\n return app._sendVerificationEmail(tokenStore);\n },\n updatePassword(options: { oldPassword: string, newPassword: string}) {\n return app._updatePassword(options, tokenStore);\n },\n };\n if (this.isInternalProject()) {\n const internalUser: CurrentInternalUser = {\n ...currentUser,\n createProject(newProject: ProjectUpdateOptions & { displayName: string }) {\n return app._createProject(newProject);\n },\n listOwnedProjects() {\n return app._listOwnedProjects();\n },\n useOwnedProjects() {\n return app._useOwnedProjects();\n },\n onOwnedProjectsChange(callback: (projects: Project[]) => void) {\n return app._onOwnedProjectsChange(callback);\n }\n };\n Object.freeze(internalUser);\n return internalUser;\n } else {\n Object.freeze(currentUser);\n return currentUser as any;\n }\n }\n\n protected _userToJson(user: User): UserJson {\n return {\n projectId: user.projectId,\n id: user.id,\n displayName: user.displayName,\n primaryEmail: user.primaryEmail,\n primaryEmailVerified: user.primaryEmailVerified,\n profileImageUrl: user.profileImageUrl,\n signedUpAtMillis: user.signedUpAt.getTime(),\n clientMetadata: user.clientMetadata,\n authMethod: user.authMethod,\n hasPassword: user.hasPassword,\n authWithEmail: user.authWithEmail,\n oauthProviders: user.oauthProviders,\n };\n }\n\n protected _projectAdminFromJson(data: ProjectJson, adminInterface: StackAdminInterface, onRefresh: () => Promise<void>): Project {\n if (data.id !== adminInterface.projectId) {\n throw new Error(`The project ID of the provided project JSON (${data.id}) does not match the project ID of the app (${adminInterface.projectId})! This is a Stack bug.`);\n }\n\n return {\n id: data.id,\n displayName: data.displayName,\n description: data.description,\n createdAt: new Date(data.createdAtMillis),\n userCount: data.userCount,\n isProductionMode: data.isProductionMode,\n evaluatedConfig: {\n id: data.evaluatedConfig.id,\n credentialEnabled: data.evaluatedConfig.credentialEnabled,\n magicLinkEnabled: data.evaluatedConfig.magicLinkEnabled,\n allowLocalhost: data.evaluatedConfig.allowLocalhost,\n oauthProviders: data.evaluatedConfig.oauthProviders,\n emailConfig: data.evaluatedConfig.emailConfig,\n domains: data.evaluatedConfig.domains,\n createTeamOnSignUp: data.evaluatedConfig.createTeamOnSignUp,\n },\n\n async update(update: ProjectUpdateOptions) {\n await adminInterface.updateProject(update);\n await onRefresh();\n },\n\n toJson() {\n return data;\n },\n\n getProductionModeErrors() {\n return getProductionModeErrors(this.toJson());\n },\n };\n }\n\n protected _createAdminInterface(forProjectId: string, tokenStore: TokenStore): StackAdminInterface {\n return new StackAdminInterface({\n baseUrl: this._interface.options.baseUrl,\n projectId: forProjectId,\n projectOwnerTokens: tokenStore,\n });\n }\n\n get projectId(): ProjectId {\n return this._interface.projectId as ProjectId;\n }\n\n get urls(): Readonly<HandlerUrls> {\n return getUrls(this._urlOptions);\n }\n\n protected async _redirectTo(handlerName: keyof HandlerUrls) {\n if (!this.urls[handlerName]) {\n throw new Error(`No URL for handler name ${handlerName}`);\n }\n window.location.href = this.urls[handlerName];\n return await wait(2000);\n }\n\n async redirectToSignIn() { return await this._redirectTo(\"signIn\"); }\n async redirectToSignUp() { return await this._redirectTo(\"signUp\"); }\n async redirectToSignOut() { return await this._redirectTo(\"signOut\"); }\n async redirectToEmailVerification() { return await this._redirectTo(\"emailVerification\"); }\n async redirectToPasswordReset() { return await this._redirectTo(\"passwordReset\"); }\n async redirectToForgotPassword() { return await this._redirectTo(\"forgotPassword\"); }\n async redirectToHome() { return await this._redirectTo(\"home\"); }\n async redirectToOAuthCallback() { return await this._redirectTo(\"oauthCallback\"); }\n async redirectToMagicLinkCallback() { return await this._redirectTo(\"magicLinkCallback\"); }\n async redirectToAfterSignIn() { return await this._redirectTo(\"afterSignIn\"); }\n async redirectToAfterSignUp() { return await this._redirectTo(\"afterSignUp\"); }\n async redirectToAfterSignOut() { return await this._redirectTo(\"afterSignOut\"); }\n async redirectToAccountSettings() { return await this._redirectTo(\"accountSettings\"); }\n\n async sendForgotPasswordEmail(email: string): Promise<KnownErrors[\"UserNotFound\"] | undefined> {\n const redirectUrl = constructRedirectUrl(this.urls.passwordReset);\n const error = await this._interface.sendForgotPasswordEmail(email, redirectUrl);\n return error;\n }\n\n async sendMagicLinkEmail(email: string): Promise<KnownErrors[\"RedirectUrlNotWhitelisted\"] | undefined> {\n const magicLinkRedirectUrl = constructRedirectUrl(this.urls.magicLinkCallback);\n const error = await this._interface.sendMagicLinkEmail(email, magicLinkRedirectUrl);\n return error;\n }\n\n async resetPassword(options: { password: string, code: string }): Promise<KnownErrors[\"PasswordResetError\"] | undefined> {\n const error = await this._interface.resetPassword(options);\n return error;\n }\n\n async verifyPasswordResetCode(code: string): Promise<KnownErrors[\"PasswordResetCodeError\"] | undefined> {\n return await this._interface.verifyPasswordResetCode(code);\n }\n\n async verifyEmail(code: string): Promise<KnownErrors[\"EmailVerificationError\"] | undefined> {\n return await this._interface.verifyEmail(code);\n }\n\n async getUser(options: GetUserOptions & { or: 'redirect' }): Promise<ProjectCurrentUser<ProjectId>>;\n async getUser(options: GetUserOptions & { or: 'throw' }): Promise<ProjectCurrentUser<ProjectId>>;\n async getUser(options?: GetUserOptions): Promise<ProjectCurrentUser<ProjectId> | null>;\n async getUser(options?: GetUserOptions): Promise<ProjectCurrentUser<ProjectId> | null> {\n this._ensurePersistentTokenStore();\n const tokenStore = getTokenStore(this._tokenStoreOptions);\n const userJson = await this._currentUserCache.getOrWait([tokenStore], \"write-only\");\n\n if (userJson === null) {\n switch (options?.or) {\n case 'redirect': {\n NextNavigation.redirect(this.urls.signIn, NextNavigation.RedirectType.replace);\n throw new Error(\"redirect should never return!\");\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 this._currentUserFromJson(userJson, tokenStore);\n }\n\n useUser(options: GetUserOptions & { or: 'redirect' }): ProjectCurrentUser<ProjectId>;\n useUser(options: GetUserOptions & { or: 'throw' }): ProjectCurrentUser<ProjectId>;\n useUser(options?: GetUserOptions): ProjectCurrentUser<ProjectId> | null;\n useUser(options?: GetUserOptions): ProjectCurrentUser<ProjectId> | null {\n this._ensurePersistentTokenStore();\n\n const router = NextNavigation.useRouter();\n const tokenStore = getTokenStore(this._tokenStoreOptions);\n const userJson = useCache(this._currentUserCache, [tokenStore], \"useUser()\");\n\n if (userJson === null) {\n switch (options?.or) {\n case 'redirect': {\n router.replace(this.urls.signIn);\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 this._currentUserFromJson(userJson, tokenStore);\n }, [userJson, tokenStore, options?.or]);\n }\n\n onUserChange(callback: (user: CurrentUser | null) => void) {\n this._ensurePersistentTokenStore();\n const tokenStore = getTokenStore(this._tokenStoreOptions);\n return this._currentUserCache.onChange([tokenStore], (userJson) => {\n callback(this._currentUserFromJson(userJson, tokenStore));\n });\n }\n\n protected async _updateUser(update: UserUpdateJson, tokenStore: TokenStore) {\n const res = await this._interface.setClientUserCustomizableData(update, tokenStore);\n await this._refreshUser(tokenStore);\n return res;\n }\n\n async signInWithOAuth(provider: string) {\n this._ensurePersistentTokenStore();\n await signInWithOAuth(this._interface, { provider, redirectUrl: this.urls.oauthCallback });\n }\n\n async signInWithCredential(options: {\n email: string,\n password: string,\n }): Promise<KnownErrors[\"EmailPasswordMismatch\"] | undefined> {\n this._ensurePersistentTokenStore();\n const tokenStore = getTokenStore(this._tokenStoreOptions);\n const errorCode = await this._interface.signInWithCredential(options.email, options.password, tokenStore);\n if (!errorCode) {\n window.location.assign(this.urls.afterSignIn);\n }\n return errorCode;\n }\n\n async signUpWithCredential(options: {\n email: string,\n password: string,\n }): Promise<KnownErrors[\"UserEmailAlreadyExists\"] | undefined>{\n this._ensurePersistentTokenStore();\n const tokenStore = getTokenStore(this._tokenStoreOptions);\n const emailVerificationRedirectUrl = constructRedirectUrl(this.urls.emailVerification);\n const errorCode = await this._interface.signUpWithCredential(\n options.email, \n options.password, \n emailVerificationRedirectUrl, \n tokenStore\n );\n if (!errorCode) {\n window.location.assign(this.urls.afterSignUp);\n }\n return errorCode;\n }\n\n async signInWithMagicLink(code: string): Promise<KnownErrors[\"MagicLinkError\"] | undefined> {\n this._ensurePersistentTokenStore();\n const tokenStore = getTokenStore(this._tokenStoreOptions);\n const result = await this._interface.signInWithMagicLink(code, tokenStore);\n if (result instanceof KnownError) {\n return result;\n }\n if (result.newUser) {\n window.location.replace(this.urls.afterSignUp);\n } else {\n window.location.replace(this.urls.afterSignIn);\n }\n await neverResolve();\n }\n\n async callOAuthCallback() {\n this._ensurePersistentTokenStore();\n const tokenStore = getTokenStore(this._tokenStoreOptions);\n const result = await callOAuthCallback(this._interface, tokenStore, this.urls.oauthCallback);\n if (result) {\n if (result.newUser) {\n window.location.replace(this.urls.afterSignUp);\n } else {\n window.location.replace(this.urls.afterSignIn);\n }\n }\n await neverResolve();\n }\n\n protected async _signOut(tokenStore: TokenStore): Promise<void> {\n await this._interface.signOut(tokenStore);\n window.location.assign(this.urls.afterSignOut);\n }\n\n protected async _sendVerificationEmail(tokenStore: TokenStore): Promise<KnownErrors[\"EmailAlreadyVerified\"] | undefined> {\n const emailVerificationRedirectUrl = constructRedirectUrl(this.urls.emailVerification);\n return await this._interface.sendVerificationEmail(emailVerificationRedirectUrl, tokenStore);\n }\n\n protected async _updatePassword(\n options: { oldPassword: string, newPassword: string }, \n tokenStore: TokenStore\n ): Promise<KnownErrors[\"PasswordMismatch\"] | KnownErrors[\"PasswordRequirementsNotMet\"] | undefined> {\n return await this._interface.updatePassword(options, tokenStore);\n }\n\n async signOut(): Promise<void> {\n const user = await this.getUser();\n if (user) {\n await user.signOut();\n }\n }\n\n async getProject(): Promise<ClientProjectJson> {\n return await this._currentProjectCache.getOrWait([], \"write-only\");\n }\n\n useProject(): ClientProjectJson {\n return useCache(this._currentProjectCache, [], \"useProject()\");\n }\n\n onProjectChange(callback: (project: ClientProjectJson) => void) {\n return this._currentProjectCache.onChange([], callback);\n }\n\n protected async _listOwnedProjects(): Promise<Project[]> {\n this._ensureInternalProject();\n const tokenStore = getTokenStore(this._tokenStoreOptions);\n const json = await this._ownedProjectsCache.getOrWait([tokenStore], \"write-only\");\n return json.map((j) => this._projectAdminFromJson(\n j,\n this._createAdminInterface(j.id, tokenStore),\n () => this._refreshOwnedProjects(tokenStore),\n ));\n }\n\n protected _useOwnedProjects(): Project[] {\n this._ensureInternalProject();\n const tokenStore = getTokenStore(this._tokenStoreOptions);\n const json = useCache(this._ownedProjectsCache, [tokenStore], \"useOwnedProjects()\");\n return useMemo(() => json.map((j) => this._projectAdminFromJson(\n j,\n this._createAdminInterface(j.id, tokenStore),\n () => this._refreshOwnedProjects(tokenStore),\n )), [json]);\n }\n\n protected _onOwnedProjectsChange(callback: (projects: Project[]) => void) {\n this._ensureInternalProject();\n const tokenStore = getTokenStore(this._tokenStoreOptions);\n return this._ownedProjectsCache.onChange([tokenStore], (projects) => {\n callback(projects.map((j) => this._projectAdminFromJson(\n j,\n this._createAdminInterface(j.id, tokenStore),\n () => this._refreshOwnedProjects(tokenStore),\n )));\n });\n }\n\n protected async _createProject(newProject: ProjectUpdateOptions & { displayName: string }): Promise<Project> {\n this._ensureInternalProject();\n const tokenStore = getTokenStore(this._tokenStoreOptions);\n const json = await this._interface.createProject(newProject, tokenStore);\n const res = this._projectAdminFromJson(\n json,\n this._createAdminInterface(json.id, tokenStore),\n () => this._refreshOwnedProjects(tokenStore),\n );\n await this._refreshOwnedProjects(tokenStore);\n return res;\n }\n\n protected async _refreshUser(tokenStore: TokenStore) {\n await this._currentUserCache.refresh([tokenStore]);\n }\n\n protected async _refreshUsers() {\n // nothing yet\n }\n \n protected async _refreshProject() {\n await this._currentProjectCache.refresh([]);\n }\n\n protected async _refreshOwnedProjects(tokenStore: TokenStore) {\n await this._ownedProjectsCache.refresh([tokenStore]);\n }\n\n static get [stackAppInternalsSymbol]() {\n return {\n fromClientJson: <HasTokenStore extends boolean, ProjectId extends string>(\n json: StackClientAppJson<HasTokenStore, ProjectId>\n ): StackClientApp<HasTokenStore, ProjectId> => {\n const providedCheckString = JSON.stringify(omit(json, [/* none currently */]));\n const existing = allClientApps.get(json.uniqueIdentifier);\n if (existing) {\n const [existingCheckString, clientApp] = existing;\n if (existingCheckString !== providedCheckString) {\n throw new StackAssertionError(\"The provided app JSON does not match the configuration of the existing client app with the same unique identifier\", { providedObj: json, existingString: existingCheckString });\n }\n return clientApp as any;\n }\n\n return new _StackClientAppImpl<HasTokenStore, ProjectId>({\n ...json,\n checkString: providedCheckString,\n });\n }\n };\n }\n\n get [stackAppInternalsSymbol]() {\n return {\n toClientJson: (): StackClientAppJson<HasTokenStore, ProjectId> => {\n if (!(\"publishableClientKey\" in this._interface.options)) {\n // TODO find a way to do this\n throw Error(\"Cannot serialize to JSON from an application without a publishable client key\");\n }\n\n return {\n baseUrl: this._interface.options.baseUrl,\n projectId: this.projectId,\n publishableClientKey: this._interface.options.publishableClientKey,\n tokenStore: this._tokenStoreOptions,\n urls: this._urlOptions,\n uniqueIdentifier: this._uniqueIdentifier,\n };\n },\n setCurrentUser: (userJsonPromise: Promise<UserJson | null>) => {\n runAsynchronously(this._currentUserCache.forceSetCachedValueAsync([getTokenStore(this._tokenStoreOptions)], userJsonPromise));\n },\n };\n };\n}\n\nclass _StackServerAppImpl<HasTokenStore extends boolean, ProjectId extends string> extends _StackClientAppImpl<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 = createCacheByTokenStore(async (tokenStore) => {\n const user = await this._interface.getServerUserByToken(tokenStore);\n return Result.or(user, null);\n });\n private readonly _serverUsersCache = createCache(async () => {\n return await this._interface.listUsers();\n });\n private readonly _serverUserCache = createCache<string[], ServerUserJson | null>(async ([userId]) => {\n const user = await this._interface.getServerUserById(userId);\n return Result.or(user, null);\n });\n private readonly _serverTeamsCache = createCache(async () => {\n return await this._interface.listTeams();\n });\n private readonly _serverTeamMembersCache = createCache<string[], TeamMemberJson[]>(async ([teamId]) => {\n return await this._interface.listTeamMembers(teamId);\n });\n private readonly _serverTeamPermissionDefinitionsCache = createCache(async () => {\n return await this._interface.listPermissionDefinitions();\n });\n private readonly _serverTeamUserPermissionsCache = createCache<\n [string, string, 'team' | 'global', boolean], \n ServerPermissionDefinitionJson[]\n >(async ([teamId, userId, type, direct]) => {\n return await this._interface.listTeamMemberPermissions({ teamId, userId, type, direct });\n });\n\n\n constructor(options: \n | StackServerAppConstructorOptions<HasTokenStore, ProjectId>\n | {\n interface: StackServerInterface,\n tokenStore: TokenStoreOptions<HasTokenStore>,\n urls: Partial<HandlerUrls> | undefined,\n }\n ) {\n if (\"interface\" in options) {\n super({\n interface: options.interface,\n tokenStore: options.tokenStore,\n urls: options.urls,\n });\n } else {\n super({\n interface: new StackServerInterface({\n baseUrl: options.baseUrl ?? getDefaultBaseUrl(),\n projectId: options.projectId ?? getDefaultProjectId(),\n publishableClientKey: options.publishableClientKey ?? getDefaultPublishableClientKey(),\n secretServerKey: options.secretServerKey ?? getDefaultSecretServerKey(),\n }),\n tokenStore: options.tokenStore,\n urls: options.urls ?? {},\n });\n }\n }\n\n protected _serverUserFromJson(json: ServerUserJson): ServerUser;\n protected _serverUserFromJson(json: ServerUserJson | null): ServerUser | null;\n protected _serverUserFromJson(json: ServerUserJson | null): ServerUser | null {\n if (json === null) return null;\n const app = this;\n return {\n ...this._userFromJson(json),\n serverMetadata: json.serverMetadata,\n async delete() {\n const res = await app._interface.deleteServerUser(this.id);\n await app._refreshUsers();\n return res;\n },\n async update(update: ServerUserUpdateJson) {\n const res = await app._interface.setServerUserCustomizableData(this.id, update);\n await app._refreshUsers();\n return res;\n },\n getClientUser() {\n return app._userFromJson(json);\n },\n async grantPermission(scope: Team, permissionId: string): Promise<void> {\n await app._interface.grantTeamUserPermission(scope.id, json.id, permissionId, 'team');\n for (const direct of [true, false]) {\n await app._serverTeamUserPermissionsCache.refresh([scope.id, json.id, 'team', direct]);\n }\n },\n async revokePermission(scope: Team, permissionId: string): Promise<void> {\n await app._interface.revokeTeamUserPermission(scope.id, json.id, permissionId, 'team');\n for (const direct of [true, false]) {\n await app._serverTeamUserPermissionsCache.refresh([scope.id, json.id, 'team', direct]);\n }\n },\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 onTeamChange(teamId: string, callback: (team: ServerTeam | null) => void) {\n return this.onTeamsChange((teams) => {\n // TODO only call callback if the team actually changed\n const team = teams.find((t) => t.id === teamId) ?? null;\n callback(team);\n });\n },\n async listTeams() {\n const teams = await app._serverTeamsCache.getOrWait([getTokenStore(app._tokenStoreOptions)], \"write-only\");\n return teams.map((json) => app._serverTeamFromJson(json));\n },\n useTeams() {\n const teams = useCache(app._serverTeamsCache, [getTokenStore(app._tokenStoreOptions)], \"user.useTeams()\");\n return useMemo(() => teams.map((json) => app._serverTeamFromJson(json)), [teams]);\n },\n onTeamsChange(callback: (value: ServerTeam[], oldValue: ServerTeam[] | undefined) => void) {\n return app._serverTeamsCache.onChange([getTokenStore(app._tokenStoreOptions)], (value, oldValue) => {\n callback(value.map((json) => app._serverTeamFromJson(json)), oldValue?.map((json) => app._serverTeamFromJson(json)));\n });\n },\n async listPermissions(scope: Team, options?: { direct?: boolean }): Promise<ServerPermission[]> {\n const permissions = await app._serverTeamUserPermissionsCache.getOrWait([scope.id, json.id, 'team', !!options?.direct], \"write-only\");\n return permissions.map((json) => app._serverPermissionFromJson(json));\n },\n usePermissions(scope: Team, options?: { direct?: boolean }): ServerPermission[] {\n const permissions = useCache(app._serverTeamUserPermissionsCache, [scope.id, json.id, 'team', !!options?.direct], \"user.usePermissions()\");\n return useMemo(() => permissions.map((json) => app._serverPermissionFromJson(json)), [permissions]);\n },\n usePermission(scope: Team, permissionId: string): ServerPermission | null {\n const permissions = this.usePermissions(scope);\n return useMemo(() => permissions.find((p) => p.id === permissionId) ?? null, [permissions, permissionId]);\n },\n async getPermission(scope: Team, permissionId: string): Promise<ServerPermission | null> {\n const permissions = await this.listPermissions(scope);\n return permissions.find((p) => p.id === permissionId) ?? null;\n },\n async hasPermission(scope: Team, permissionId: string): Promise<boolean> {\n const permissions = await this.listPermissions(scope);\n return permissions.some((p) => p.id === permissionId);\n },\n toJson() {\n return app._serverUserToJson(this);\n },\n };\n }\n\n protected _currentServerUserFromJson(json: ServerUserJson, tokenStore: TokenStore): ProjectCurrentSeverUser<ProjectId>;\n protected _currentServerUserFromJson(json: ServerUserJson | null, tokenStore: TokenStore): ProjectCurrentSeverUser<ProjectId> | null;\n protected _currentServerUserFromJson(json: ServerUserJson | null, tokenStore: TokenStore): ProjectCurrentSeverUser<ProjectId> | null {\n if (json === null) return null;\n const app = this;\n const nonCurrentServerUser = this._serverUserFromJson(json);\n const currentUser: CurrentServerUser = {\n ...nonCurrentServerUser,\n tokenStore,\n async delete() {\n const res = await nonCurrentServerUser.delete();\n await app._refreshUser(tokenStore);\n return res;\n },\n async update(update: ServerUserUpdateJson) {\n const res = await nonCurrentServerUser.update(update);\n await app._refreshUser(tokenStore);\n return res;\n }, \n signOut() {\n return app._signOut(tokenStore);\n },\n getClientUser() {\n return app._currentUserFromJson(json, tokenStore);\n },\n sendVerificationEmail() {\n return app._sendVerificationEmail(tokenStore);\n },\n updatePassword(options: { oldPassword: string, newPassword: string}) {\n return app._updatePassword(options, tokenStore);\n },\n };\n\n if (this.isInternalProject()) {\n const internalUser: CurrentInternalServerUser = {\n ...currentUser,\n createProject(newProject: ProjectUpdateOptions & { displayName: string }) {\n return app._createProject(newProject);\n },\n listOwnedProjects() {\n return app._listOwnedProjects();\n },\n useOwnedProjects() {\n return app._useOwnedProjects();\n },\n onOwnedProjectsChange(callback: (projects: Project[]) => void) {\n return app._onOwnedProjectsChange(callback);\n }\n };\n Object.freeze(internalUser);\n return internalUser;\n } else {\n Object.freeze(currentUser);\n return currentUser as any;\n }\n }\n\n protected _serverTeamMemberFromJson(json: ServerTeamMemberJson): ServerTeamMember;\n protected _serverTeamMemberFromJson(json: ServerTeamMemberJson | null): ServerTeamMember | null;\n protected _serverTeamMemberFromJson(json: ServerTeamMemberJson | null): ServerTeamMember | null {\n if (json === null) return null;\n const app = this;\n return {\n ...app._teamMemberFromJson(json),\n async getUser() {\n const user = app._serverUserFromJson(await app._serverUserCache.getOrWait([json.userId], \"write-only\"));\n if (!user) throw new Error(`User ${json.userId} not found`);\n return user;\n }\n };\n }\n\n protected _serverUserToJson(user: ServerUser): ServerUserJson {\n return {\n projectId: user.projectId,\n id: user.id,\n displayName: user.displayName,\n primaryEmail: user.primaryEmail,\n primaryEmailVerified: user.primaryEmailVerified,\n profileImageUrl: user.profileImageUrl,\n signedUpAtMillis: user.signedUpAt.getTime(),\n clientMetadata: user.clientMetadata,\n serverMetadata: user.serverMetadata,\n authMethod: user.authMethod,\n hasPassword: user.hasPassword,\n authWithEmail: user.authWithEmail,\n oauthProviders: user.oauthProviders,\n };\n }\n\n protected _serverTeamFromJson(json: ServerTeamJson): ServerTeam {\n const app = this;\n return {\n id: json.id,\n displayName: json.displayName,\n createdAt: new Date(json.createdAtMillis),\n async listMembers() {\n return (await app._interface.listTeamMembers(json.id)).map((u) => app._serverTeamMemberFromJson(u));\n },\n async update(update: Partial<ServerTeamCustomizableJson>) {\n await app._interface.updateTeam(json.id, update);\n await app._serverTeamsCache.refresh([]);\n },\n async delete() {\n await app._interface.deleteTeam(json.id);\n await app._serverTeamsCache.refresh([]);\n },\n useMembers() {\n const result = useCache(app._serverTeamMembersCache, [json.id], \"team.useUsers()\");\n return useMemo(() => result.map((u) => app._serverTeamMemberFromJson(u)), [result]);\n },\n async addUser(userId) {\n await app._interface.addUserToTeam({\n teamId: json.id,\n userId,\n });\n await app._serverTeamMembersCache.refresh([json.id]);\n },\n async removeUser(userId) {\n await app._interface.removeUserFromTeam({\n teamId: json.id,\n userId,\n });\n await app._serverTeamMembersCache.refresh([json.id]);\n },\n toJson() {\n return json;\n },\n };\n }\n\n async getServerUser(): Promise<ProjectCurrentSeverUser<ProjectId> | null> {\n this._ensurePersistentTokenStore();\n const tokenStore = getTokenStore(this._tokenStoreOptions);\n const userJson = await this._currentServerUserCache.getOrWait([tokenStore], \"write-only\");\n return this._currentServerUserFromJson(userJson, tokenStore);\n }\n\n async getServerUserById(userId: string): Promise<ServerUser | null> {\n const json = await this._serverUserCache.getOrWait([userId], \"write-only\");\n return this._serverUserFromJson(json);\n }\n\n useServerUser(options?: { required: boolean }): ProjectCurrentSeverUser<ProjectId> | null {\n this._ensurePersistentTokenStore();\n\n const tokenStore = getTokenStore(this._tokenStoreOptions);\n const userJson = useCache(this._currentServerUserCache, [tokenStore], \"useServerUser()\");\n\n return useMemo(() => {\n if (options?.required && userJson === null) {\n use(this.redirectToSignIn());\n }\n\n return this._currentServerUserFromJson(userJson, tokenStore);\n }, [userJson, tokenStore, options?.required]);\n }\n\n onServerUserChange(callback: (user: CurrentServerUser | null) => void) {\n this._ensurePersistentTokenStore();\n const tokenStore = getTokenStore(this._tokenStoreOptions);\n return this._currentServerUserCache.onChange([tokenStore], (userJson) => {\n callback(this._currentServerUserFromJson(userJson, tokenStore));\n });\n }\n\n async listServerUsers(): Promise<ServerUser[]> {\n const json = await this._serverUsersCache.getOrWait([], \"write-only\");\n return json.map((j) => this._serverUserFromJson(j));\n }\n\n useServerUsers(): ServerUser[] {\n const json = useCache(this._serverUsersCache, [], \"useServerUsers()\");\n return useMemo(() => {\n return json.map((j) => this._serverUserFromJson(j));\n }, [json]);\n }\n\n onServerUsersChange(callback: (users: ServerUser[]) => void) {\n return this._serverUsersCache.onChange([], (users) => {\n callback(users.map((j) => this._serverUserFromJson(j)));\n });\n }\n\n async listPermissionDefinitions(): Promise<ServerPermissionDefinitionJson[]> {\n return await this._serverTeamPermissionDefinitionsCache.getOrWait([], \"write-only\");\n }\n\n usePermissionDefinitions(): ServerPermissionDefinitionJson[] {\n return useCache(this._serverTeamPermissionDefinitionsCache, [], \"usePermissions()\");\n }\n\n _serverPermissionFromJson(json: ServerPermissionDefinitionJson): ServerPermission {\n return {\n ...this._permissionFromJson(json),\n __databaseUniqueId: json.__databaseUniqueId,\n description: json.description,\n containPermissionIds: json.containPermissionIds,\n };\n }\n\n async createPermissionDefinition(data: ServerPermissionDefinitionCustomizableJson): Promise<ServerPermission>{\n const permission = await this._serverPermissionFromJson(await this._interface.createPermissionDefinition(data));\n await this._serverTeamPermissionDefinitionsCache.refresh([]);\n return permission;\n }\n\n async updatePermissionDefinition(permissionId: string, data: Partial<ServerPermissionDefinitionCustomizableJson>) {\n await this._interface.updatePermissionDefinition(permissionId, data);\n await this._serverTeamPermissionDefinitionsCache.refresh([]);\n }\n\n async deletePermissionDefinition(permissionId: string): Promise<void> {\n await this._interface.deletePermissionDefinition(permissionId);\n await this._serverTeamPermissionDefinitionsCache.refresh([]);\n }\n\n async listTeams(): Promise<ServerTeam[]> {\n const teams = await this._serverTeamsCache.getOrWait([], \"write-only\");\n return teams.map((t) => this._serverTeamFromJson(t));\n }\n\n async createTeam(data: ServerTeamCustomizableJson) : Promise<ServerTeam> {\n const team = await this._interface.createTeam(data);\n await this._serverTeamsCache.refresh([]);\n return this._serverTeamFromJson(team);\n }\n\n useTeams(): ServerTeam[] {\n const teams = useCache(this._serverTeamsCache, [], \"useServerTeams()\");\n return useMemo(() => {\n return teams.map((t) => this._serverTeamFromJson(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 _refreshUser(tokenStore: TokenStore) {\n await Promise.all([\n super._refreshUser(tokenStore),\n this._currentServerUserCache.refresh([tokenStore]),\n ]);\n }\n\n protected override async _refreshUsers() {\n await Promise.all([\n super._refreshUsers(),\n this._serverUsersCache.refresh([]),\n ]);\n }\n}\n\nclass _StackAdminAppImpl<HasTokenStore extends boolean, ProjectId extends string> extends _StackServerAppImpl<HasTokenStore, ProjectId>\n{\n declare protected _interface: StackAdminInterface;\n \n private readonly _adminProjectCache = createCache(async () => {\n return await this._interface.getProject();\n });\n private readonly _apiKeySetsCache = createCache(async () => {\n return await this._interface.listApiKeySets();\n });\n\n constructor(options: StackAdminAppConstructorOptions<HasTokenStore, ProjectId>) {\n super({\n interface: new StackAdminInterface({\n baseUrl: options.baseUrl ?? getDefaultBaseUrl(),\n projectId: options.projectId ?? getDefaultProjectId(),\n ...\"projectOwnerTokens\" in options ? {\n projectOwnerTokens: options.projectOwnerTokens,\n } : {\n publishableClientKey: options.publishableClientKey ?? getDefaultPublishableClientKey(),\n secretServerKey: options.secretServerKey ?? getDefaultSecretServerKey(),\n superSecretAdminKey: options.superSecretAdminKey ?? getDefaultSuperSecretAdminKey(),\n },\n }),\n tokenStore: options.tokenStore,\n urls: options.urls,\n });\n }\n\n\n protected _createApiKeySetBaseFromJson(data: ApiKeySetBaseJson): ApiKeySetBase {\n const app = this;\n return {\n id: data.id,\n description: data.description,\n expiresAt: new Date(data.expiresAtMillis),\n manuallyRevokedAt: data.manuallyRevokedAtMillis ? new Date(data.manuallyRevokedAtMillis) : null,\n createdAt: new Date(data.createdAtMillis),\n isValid() {\n return this.whyInvalid() === null;\n },\n whyInvalid() {\n if (this.expiresAt.getTime() < Date.now()) return \"expired\";\n if (this.manuallyRevokedAt) return \"manually-revoked\";\n return null;\n },\n async revoke() {\n const res = await app._interface.revokeApiKeySetById(data.id);\n await app._refreshApiKeySets();\n return res;\n }\n };\n }\n\n protected _createApiKeySetFromJson(data: ApiKeySetJson): ApiKeySet {\n return {\n ...this._createApiKeySetBaseFromJson(data),\n publishableClientKey: data.publishableClientKey ? { lastFour: data.publishableClientKey.lastFour } : null,\n secretServerKey: data.secretServerKey ? { lastFour: data.secretServerKey.lastFour } : null,\n superSecretAdminKey: data.superSecretAdminKey ? { lastFour: data.superSecretAdminKey.lastFour } : null,\n };\n }\n\n protected _createApiKeySetFirstViewFromJson(data: ApiKeySetFirstViewJson): ApiKeySetFirstView {\n return {\n ...this._createApiKeySetBaseFromJson(data),\n publishableClientKey: data.publishableClientKey,\n secretServerKey: data.secretServerKey,\n superSecretAdminKey: data.superSecretAdminKey,\n };\n }\n\n async getProjectAdmin(): Promise<Project> {\n return this._projectAdminFromJson(\n await this._adminProjectCache.getOrWait([], \"write-only\"),\n this._interface,\n () => this._refreshProject()\n );\n }\n\n useProjectAdmin(): Project {\n const json = useCache(this._adminProjectCache, [], \"useProjectAdmin()\");\n return useMemo(() => this._projectAdminFromJson(\n json,\n this._interface,\n () => this._refreshProject()\n ), [json]);\n }\n\n onProjectAdminChange(callback: (project: Project) => void) {\n return this._adminProjectCache.onChange([], (project) => {\n callback(this._projectAdminFromJson(\n project,\n this._interface,\n () => this._refreshProject()\n ));\n });\n }\n\n async listApiKeySets(): Promise<ApiKeySet[]> {\n const json = await this._apiKeySetsCache.getOrWait([], \"write-only\");\n return json.map((j) => this._createApiKeySetFromJson(j));\n }\n\n useApiKeySets(): ApiKeySet[] {\n const json = useCache(this._apiKeySetsCache, [], \"useApiKeySets()\");\n return useMemo(() => {\n return json.map((j) => this._createApiKeySetFromJson(j));\n }, [json]);\n }\n\n onApiKeySetsChange(callback: (apiKeySets: ApiKeySet[]) => void) {\n return this._apiKeySetsCache.onChange([], (apiKeySets) => {\n callback(apiKeySets.map((j) => this._createApiKeySetFromJson(j)));\n });\n }\n\n async createApiKeySet(options: ApiKeySetCreateOptions): Promise<ApiKeySetFirstView> {\n const json = await this._interface.createApiKeySet(options);\n await this._refreshApiKeySets();\n return this._createApiKeySetFirstViewFromJson(json);\n }\n\n protected override async _refreshProject() {\n await Promise.all([\n super._refreshProject(),\n this._adminProjectCache.refresh([]),\n ]);\n }\n\n protected async _refreshApiKeySets() {\n await this._apiKeySetsCache.refresh([]);\n }\n}\n\ntype Auth<T, C> = {\n readonly tokenStore: ReadonlyTokenStore,\n update(this: T, user: C): Promise<void>,\n signOut(this: T): Promise<void>,\n sendVerificationEmail(this: T): Promise<KnownErrors[\"EmailAlreadyVerified\"] | undefined>,\n updatePassword(this: T, options: { oldPassword: string, newPassword: string}): Promise<KnownErrors[\"PasswordMismatch\"] | KnownErrors[\"PasswordRequirementsNotMet\"] | undefined>,\n};\n\ntype InternalAuth<T> = {\n createProject(this: T, newProject: ProjectUpdateOptions & { displayName: string }): Promise<Project>,\n listOwnedProjects(this: T): Promise<Project[]>,\n useOwnedProjects(this: T): Project[],\n onOwnedProjectsChange(this: T, callback: (projects: Project[]) => void): void,\n};\n\nexport type User = (\n & {\n readonly projectId: string,\n readonly id: string,\n\n readonly displayName: string | null,\n\n /**\n * The user's email address.\n *\n * Note: This might NOT be unique across multiple users, so always use `id` for unique identification.\n */\n readonly primaryEmail: string | null,\n readonly primaryEmailVerified: boolean,\n\n readonly profileImageUrl: string | null,\n\n readonly signedUpAt: Date,\n\n readonly clientMetadata: ReadonlyJson,\n\n readonly authMethod: 'credential' | 'oauth', // not used anymore, for backwards compatibility\n readonly hasPassword: boolean,\n readonly authWithEmail: boolean,\n readonly oauthProviders: readonly string[],\n\n hasPermission(this: CurrentUser, scope: Team, permissionId: string): Promise<boolean>,\n\n toJson(this: CurrentUser): UserJson,\n }\n & AsyncStoreProperty<\"team\", [id: string], Team | null, false>\n & AsyncStoreProperty<\"teams\", [], Team[], true>\n & Omit<AsyncStoreProperty<\"permission\", [scope: Team, permissionId: string, options?: { direct?: boolean }], Permission | null, false>, \"onPermissionChange\">\n & Omit<AsyncStoreProperty<\"permissions\", [scope: Team, options?: { direct?: boolean }], Permission[], true>, \"onPermissionsChange\">\n);\n\nexport type CurrentUser = Auth<User, UserUpdateJson> & User;\n\nexport type CurrentInternalUser = CurrentUser & InternalAuth<CurrentUser>;\n\n/**\n * A user including sensitive fields that should only be used on the server, never sent to the client\n * (such as sensitive information and serverMetadata).\n */\nexport type ServerUser = (\n Omit<\n User, \n 'hasPermission' | 'toJson' \n | keyof AsyncStoreProperty<\"team\", [], Team | null, false>\n | keyof AsyncStoreProperty<\"teams\", [], Team[], true>\n | keyof AsyncStoreProperty<\"permission\", [], Permission[], false> \n | keyof AsyncStoreProperty<\"permissions\", [], Permission[], true> \n > & {\n readonly serverMetadata: ReadonlyJson,\n\n /**\n * Returns a new user object with the sensitive fields removed.\n */\n getClientUser(this: ServerUser): User,\n\n update(this: ServerUser, user: Partial<ServerUserUpdateJson>): Promise<void>,\n delete(this: ServerUser): Promise<void>,\n\n grantPermission(scope: Team, permissionId: string): Promise<void>,\n revokePermission(scope: Team, permissionId: string): Promise<void>,\n\n hasPermission(scope: Team, permissionId: string): Promise<boolean>,\n\n toJson(this: ServerUser): ServerUserJson,\n } \n & AsyncStoreProperty<\"team\", [id: string], ServerTeam | null, false>\n & AsyncStoreProperty<\"teams\", [], ServerTeam[], true>\n & Omit<AsyncStoreProperty<\"permission\", [scope: Team, permissionId: string, options?: { direct?: boolean }], ServerPermission | null, false>, \"onPermissionChange\">\n & Omit<AsyncStoreProperty<\"permissions\", [scope: Team, options?: { direct?: boolean }], ServerPermission[], true>, \"onPermissionsChange\">\n)\n\nexport type CurrentServerUser = Auth<ServerUser, ServerUserUpdateJson> & Omit<ServerUser, \"getClientUser\"> & {\n getClientUser(this: CurrentServerUser): CurrentUser,\n};\n\nexport type CurrentInternalServerUser = CurrentServerUser & InternalAuth<CurrentServerUser>;\n\nexport type Project = {\n readonly id: string,\n readonly displayName: string,\n readonly description?: string,\n readonly createdAt: Date,\n readonly userCount: number,\n readonly isProductionMode: boolean,\n readonly evaluatedConfig: {\n readonly id: string,\n readonly allowLocalhost: boolean,\n readonly credentialEnabled: boolean,\n readonly magicLinkEnabled: boolean,\n readonly oauthProviders: OAuthProviderConfig[],\n readonly emailConfig?: EmailConfig,\n readonly domains: DomainConfig[],\n readonly createTeamOnSignUp: boolean,\n },\n\n update(this: Project, update: ProjectUpdateOptions): Promise<void>,\n\n toJson(this: Project): ProjectJson,\n\n getProductionModeErrors(this: Project): ProductionModeError[],\n};\n\nexport type Team = {\n id: string,\n displayName: string,\n createdAt: Date,\n\n toJson(this: Team): TeamJson,\n};\n\nexport type ServerTeam = Team & {\n listMembers(): Promise<ServerTeamMember[]>,\n useMembers(): ServerTeamMember[],\n update(update: Partial<ServerTeamCustomizableJson>): Promise<void>,\n delete(): Promise<void>,\n addUser(userId: string): Promise<void>,\n removeUser(userId: string): Promise<void>,\n};\n\nexport type TeamMember = {\n userId: string,\n teamId: string,\n displayName: string | null,\n}\n\nexport type ServerTeamMember = TeamMember & {\n getUser(): Promise<ServerUser>,\n}\n\nexport type Permission = {\n id: string,\n} & (\n | { type: \"global\" }\n | { type: \"team\", teamId: string }\n);\n\nexport type ServerPermission = Permission & {\n readonly __databaseUniqueId: string,\n readonly description?: string,\n readonly containPermissionIds: string[],\n};\n\n\nexport type ApiKeySetBase = {\n id: string,\n description: string,\n expiresAt: Date,\n manuallyRevokedAt: Date | null,\n createdAt: Date,\n isValid(): boolean,\n whyInvalid(): \"expired\" | \"manually-revoked\" | null,\n revoke(): Promise<void>,\n};\n\nexport type ApiKeySetFirstView = ApiKeySetBase & {\n publishableClientKey?: string,\n secretServerKey?: string,\n superSecretAdminKey?: string,\n};\n\nexport type ApiKeySet = ApiKeySetBase & {\n publishableClientKey: null | {\n lastFour: string,\n },\n secretServerKey: null | {\n lastFour: string,\n },\n superSecretAdminKey: null | {\n lastFour: string,\n },\n};\n\n\nexport type EmailConfig = EmailConfigJson;\n\nexport type DomainConfig = DomainConfigJson;\n\nexport type OAuthProviderConfig = OAuthProviderConfigJson;\n\nexport type GetUserOptions = {\n or?: 'redirect' | 'throw' | 'return-null',\n};\n\ntype SplitArgs<T extends any[], U extends number> = [\n ...Parameters<Extract<T[U], (...args: any) => any>>,\n Omit<T, U>\n];\n\ntype 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 `on${Capitalize<Name>}Change`]: (...tupleArgs: [...args: Args, callback: (value: Value) => void]) => void }\n & { [key in `use${Capitalize<Name>}`]: (...args: Args) => Value }\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 }): Promise<KnownErrors[\"EmailPasswordMismatch\"] | undefined>,\n signUpWithCredential(options: { email: string, password: string }): Promise<KnownErrors[\"UserEmailAlreadyExists\"] | undefined>,\n callOAuthCallback(): Promise<void>,\n sendForgotPasswordEmail(email: string): Promise<KnownErrors[\"UserNotFound\"] | undefined>,\n sendMagicLinkEmail(email: string): Promise<KnownErrors[\"RedirectUrlNotWhitelisted\"] | undefined>,\n resetPassword(options: { code: string, password: string }): Promise<KnownErrors[\"PasswordResetError\"] | undefined>,\n verifyPasswordResetCode(code: string): Promise<KnownErrors[\"PasswordResetCodeError\"] | undefined>,\n verifyEmail(code: string): Promise<KnownErrors[\"EmailVerificationError\"] | undefined>,\n signInWithMagicLink(code: string): Promise<KnownErrors[\"MagicLinkError\"] | undefined>,\n\n [stackAppInternalsSymbol]: {\n toClientJson(): StackClientAppJson<HasTokenStore, ProjectId>,\n setCurrentUser(userJsonPromise: Promise<UserJson | null>): void,\n },\n }\n & AsyncStoreProperty<\"project\", [], ClientProjectJson, false>\n & { [K in `redirectTo${Capitalize<keyof Omit<HandlerUrls, 'handler' | 'oauthCallback'>>}`]: () => Promise<void> }\n & (HasTokenStore extends false\n ? {}\n : {\n redirectToOAuthCallback(): Promise<void>,\n useUser(options: GetUserOptions & { or: 'redirect' }): ProjectCurrentUser<ProjectId>,\n useUser(options: GetUserOptions & { or: 'throw' }): ProjectCurrentUser<ProjectId>,\n useUser(options?: GetUserOptions): ProjectCurrentUser<ProjectId> | null,\n getUser(options: GetUserOptions & { or: 'redirect' }): Promise<ProjectCurrentUser<ProjectId>>,\n getUser(options: GetUserOptions & { or: 'throw' }): Promise<ProjectCurrentUser<ProjectId>>,\n getUser(options?: GetUserOptions): Promise<ProjectCurrentUser<ProjectId> | null>,\n onUserChange: AsyncStoreProperty<\"user\", [], CurrentUser | null, false>[\"onUserChange\"],\n })\n);\ntype 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\nexport type StackServerApp<HasTokenStore extends boolean = boolean, ProjectId extends string = string> = (\n & StackClientApp<HasTokenStore, ProjectId>\n & {\n createTeam(data: ServerTeamCustomizableJson): Promise<ServerTeam>,\n createPermissionDefinition(data: ServerPermissionDefinitionCustomizableJson): Promise<ServerPermission>,\n updatePermissionDefinition(permissionId: string, data: Partial<ServerPermissionDefinitionCustomizableJson>): Promise<void>,\n deletePermissionDefinition(permissionId: string): Promise<void>,\n listPermissionDefinitions(): Promise<ServerPermissionDefinitionJson[]>,\n usePermissionDefinitions(): ServerPermissionDefinitionJson[],\n }\n & AsyncStoreProperty<\"serverUser\", [], CurrentServerUser | null, false>\n & AsyncStoreProperty<\"serverUsers\", [], ServerUser[], true>\n & Omit<AsyncStoreProperty<\"team\", [id: string], ServerTeam | null, false>, \"onTeamChange\">\n & Omit<AsyncStoreProperty<\"teams\", [], ServerTeam[], true>, \"onTeamsChange\">\n);\ntype 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\nexport type StackAdminApp<HasTokenStore extends boolean = boolean, ProjectId extends string = string> = (\n & StackServerApp<HasTokenStore, ProjectId>\n & AsyncStoreProperty<\"projectAdmin\", [], Project, false>\n & AsyncStoreProperty<\"apiKeySets\", [], ApiKeySet[], true>\n & {\n createApiKeySet(options: ApiKeySetCreateOptions): Promise<ApiKeySetFirstView>,\n }\n);\ntype StackAdminAppConstructor = {\n new <\n HasTokenStore extends boolean,\n ProjectId extends string\n >(options: StackAdminAppConstructorOptions<HasTokenStore, ProjectId>): StackAdminApp<HasTokenStore, ProjectId>,\n new (options: StackAdminAppConstructorOptions<boolean, string>): StackAdminApp<boolean, string>,\n};\nexport const StackAdminApp: StackAdminAppConstructor = _StackAdminAppImpl;\n"],"mappings":"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","names":["import_react","React","json"]}
|
|
@@ -18,13 +18,13 @@ declare const Components: {
|
|
|
18
18
|
readonly Separator: React__default.ForwardRefExoticComponent<Omit<_radix_ui_react_separator.SeparatorProps & React__default.RefAttributes<HTMLDivElement>, "ref"> & React__default.RefAttributes<HTMLDivElement>>;
|
|
19
19
|
readonly Label: React__default.ForwardRefExoticComponent<Omit<_radix_ui_react_label.LabelProps & React__default.RefAttributes<HTMLLabelElement>, "ref"> & React__default.RefAttributes<HTMLLabelElement>>;
|
|
20
20
|
readonly Link: React__default.ForwardRefExoticComponent<Omit<{
|
|
21
|
-
size?: "
|
|
21
|
+
size?: "xs" | "sm" | "md" | "lg" | "xl" | undefined;
|
|
22
22
|
href: string | url.Url;
|
|
23
23
|
} & Omit<React__default.HTMLProps<HTMLLinkElement>, "size" | "href">, "ref"> & React__default.RefAttributes<HTMLAnchorElement>>;
|
|
24
24
|
readonly Text: React__default.ForwardRefExoticComponent<Omit<{
|
|
25
25
|
variant?: "primary" | "secondary" | "warning" | "success" | undefined;
|
|
26
|
-
as?: "
|
|
27
|
-
size?: "
|
|
26
|
+
as?: "h1" | "h2" | "h3" | "h4" | "h5" | "h6" | "p" | undefined;
|
|
27
|
+
size?: "xs" | "sm" | "md" | "lg" | "xl" | undefined;
|
|
28
28
|
} & Omit<React__default.HTMLProps<HTMLParagraphElement>, "size">, "ref"> & React__default.RefAttributes<HTMLParagraphElement>>;
|
|
29
29
|
readonly Popover: React__default.FC<_radix_ui_react_popover.PopoverProps>;
|
|
30
30
|
readonly PopoverTrigger: React__default.ForwardRefExoticComponent<_radix_ui_react_popover.PopoverTriggerProps & React__default.RefAttributes<HTMLButtonElement>>;
|
|
@@ -67,13 +67,13 @@ declare function useComponents(): {
|
|
|
67
67
|
readonly Separator: React__default.ForwardRefExoticComponent<Omit<_radix_ui_react_separator.SeparatorProps & React__default.RefAttributes<HTMLDivElement>, "ref"> & React__default.RefAttributes<HTMLDivElement>>;
|
|
68
68
|
readonly Label: React__default.ForwardRefExoticComponent<Omit<_radix_ui_react_label.LabelProps & React__default.RefAttributes<HTMLLabelElement>, "ref"> & React__default.RefAttributes<HTMLLabelElement>>;
|
|
69
69
|
readonly Link: React__default.ForwardRefExoticComponent<Omit<{
|
|
70
|
-
size?: "
|
|
70
|
+
size?: "xs" | "sm" | "md" | "lg" | "xl" | undefined;
|
|
71
71
|
href: string | url.Url;
|
|
72
72
|
} & Omit<React__default.HTMLProps<HTMLLinkElement>, "size" | "href">, "ref"> & React__default.RefAttributes<HTMLAnchorElement>>;
|
|
73
73
|
readonly Text: React__default.ForwardRefExoticComponent<Omit<{
|
|
74
74
|
variant?: "primary" | "secondary" | "warning" | "success" | undefined;
|
|
75
|
-
as?: "
|
|
76
|
-
size?: "
|
|
75
|
+
as?: "h1" | "h2" | "h3" | "h4" | "h5" | "h6" | "p" | undefined;
|
|
76
|
+
size?: "xs" | "sm" | "md" | "lg" | "xl" | undefined;
|
|
77
77
|
} & Omit<React__default.HTMLProps<HTMLParagraphElement>, "size">, "ref"> & React__default.RefAttributes<HTMLParagraphElement>>;
|
|
78
78
|
readonly Popover: React__default.FC<_radix_ui_react_popover.PopoverProps>;
|
|
79
79
|
readonly PopoverTrigger: React__default.ForwardRefExoticComponent<_radix_ui_react_popover.PopoverTriggerProps & React__default.RefAttributes<HTMLButtonElement>>;
|