@stackframe/stack 2.4.0 → 2.4.3
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/card-frame.js +1 -0
- package/dist/components/card-frame.js.map +1 -0
- package/dist/components/credential-sign-in.js +1 -0
- package/dist/components/credential-sign-in.js.map +1 -0
- package/dist/components/credential-sign-up.js +1 -0
- package/dist/components/credential-sign-up.js.map +1 -0
- package/dist/components/forgot-password.js +1 -0
- package/dist/components/forgot-password.js.map +1 -0
- package/dist/components/form-warning.js +1 -0
- package/dist/components/form-warning.js.map +1 -0
- package/dist/components/magic-link-sign-in.js +1 -0
- package/dist/components/magic-link-sign-in.js.map +1 -0
- package/dist/components/message-card.js +1 -0
- package/dist/components/message-card.js.map +1 -0
- package/dist/components/oauth-button.js +1 -2
- package/dist/components/oauth-button.js.map +1 -0
- package/dist/components/oauth-group.d.mts +3 -1
- package/dist/components/oauth-group.d.ts +3 -1
- package/dist/components/oauth-group.js +4 -2
- package/dist/components/oauth-group.js.map +1 -0
- package/dist/components/password-field.js +2 -1
- package/dist/components/password-field.js.map +1 -0
- package/dist/components/password-reset-inner.js +1 -0
- package/dist/components/password-reset-inner.js.map +1 -0
- package/dist/components/redirect-message-card.js +9 -14
- package/dist/components/redirect-message-card.js.map +1 -0
- package/dist/components/separator-with-text.js +1 -0
- package/dist/components/separator-with-text.js.map +1 -0
- package/dist/components/user-avatar.d.mts +1 -0
- package/dist/components/user-avatar.d.ts +1 -0
- package/dist/components/user-avatar.js +1 -0
- package/dist/components/user-avatar.js.map +1 -0
- package/dist/components/user-button.js +2 -1
- package/dist/components/user-button.js.map +1 -0
- package/dist/components-core/avatar.js +2 -1
- package/dist/components-core/avatar.js.map +1 -0
- package/dist/components-core/button.js +4 -3
- package/dist/components-core/button.js.map +1 -0
- package/dist/components-core/card.js +2 -1
- package/dist/components-core/card.js.map +1 -0
- package/dist/components-core/collapsible.js +1 -0
- package/dist/components-core/collapsible.js.map +1 -0
- package/dist/components-core/container.js +1 -0
- package/dist/components-core/container.js.map +1 -0
- package/dist/components-core/dropdown.js +4 -3
- package/dist/components-core/dropdown.js.map +1 -0
- package/dist/components-core/index.js +1 -0
- package/dist/components-core/index.js.map +1 -0
- package/dist/components-core/input.js +2 -1
- package/dist/components-core/input.js.map +1 -0
- package/dist/components-core/label.js +2 -1
- package/dist/components-core/label.js.map +1 -0
- package/dist/components-core/link.js +2 -1
- package/dist/components-core/link.js.map +1 -0
- package/dist/components-core/loading-indicator.js +2 -1
- package/dist/components-core/loading-indicator.js.map +1 -0
- package/dist/components-core/popover.js +2 -1
- package/dist/components-core/popover.js.map +1 -0
- package/dist/components-core/separator.js +2 -1
- package/dist/components-core/separator.js.map +1 -0
- package/dist/components-core/skeleton.js +2 -1
- package/dist/components-core/skeleton.js.map +1 -0
- package/dist/components-core/tabs.js +9 -6
- package/dist/components-core/tabs.js.map +1 -0
- package/dist/components-core/text.js +2 -1
- package/dist/components-core/text.js.map +1 -0
- package/dist/components-core-joy/button.js +1 -0
- package/dist/components-core-joy/button.js.map +1 -0
- package/dist/components-core-joy/input.js +1 -0
- package/dist/components-core-joy/input.js.map +1 -0
- package/dist/components-core-joy/separator.js +1 -0
- package/dist/components-core-joy/separator.js.map +1 -0
- package/dist/components-core-joy/tabs.js +1 -0
- package/dist/components-core-joy/tabs.js.map +1 -0
- package/dist/components-core-joy/text.js +1 -0
- package/dist/components-core-joy/text.js.map +1 -0
- package/dist/components-page/account-settings.js +1 -0
- package/dist/components-page/account-settings.js.map +1 -0
- 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 +6 -4
- package/dist/components-page/auth-page.js.map +1 -0
- package/dist/components-page/email-verification.js +1 -0
- package/dist/components-page/email-verification.js.map +1 -0
- package/dist/components-page/forgot-password.js +1 -0
- package/dist/components-page/forgot-password.js.map +1 -0
- package/dist/components-page/magic-link-callback.js +3 -2
- package/dist/components-page/magic-link-callback.js.map +1 -0
- package/dist/components-page/oauth-callback.js +1 -0
- package/dist/components-page/oauth-callback.js.map +1 -0
- package/dist/components-page/password-reset.js +1 -0
- package/dist/components-page/password-reset.js.map +1 -0
- package/dist/components-page/sign-in.js +1 -0
- package/dist/components-page/sign-in.js.map +1 -0
- package/dist/components-page/sign-out.js +1 -0
- package/dist/components-page/sign-out.js.map +1 -0
- package/dist/components-page/sign-up.js +1 -0
- package/dist/components-page/sign-up.js.map +1 -0
- package/dist/components-page/stack-handler.d.mts +1 -0
- package/dist/components-page/stack-handler.d.ts +1 -0
- package/dist/components-page/stack-handler.js +1 -0
- package/dist/components-page/stack-handler.js.map +1 -0
- package/dist/esm/components/card-frame.js +1 -0
- package/dist/esm/components/card-frame.js.map +1 -0
- package/dist/esm/components/credential-sign-in.js +1 -0
- package/dist/esm/components/credential-sign-in.js.map +1 -0
- package/dist/esm/components/credential-sign-up.js +1 -0
- package/dist/esm/components/credential-sign-up.js.map +1 -0
- package/dist/esm/components/forgot-password.js +1 -0
- package/dist/esm/components/forgot-password.js.map +1 -0
- package/dist/esm/components/form-warning.js +1 -0
- package/dist/esm/components/form-warning.js.map +1 -0
- package/dist/esm/components/magic-link-sign-in.js +1 -0
- package/dist/esm/components/magic-link-sign-in.js.map +1 -0
- package/dist/esm/components/message-card.js +1 -0
- package/dist/esm/components/message-card.js.map +1 -0
- package/dist/esm/components/oauth-button.js +1 -2
- package/dist/esm/components/oauth-button.js.map +1 -0
- package/dist/esm/components/oauth-group.js +4 -2
- package/dist/esm/components/oauth-group.js.map +1 -0
- package/dist/esm/components/password-field.js +2 -1
- package/dist/esm/components/password-field.js.map +1 -0
- package/dist/esm/components/password-reset-inner.js +1 -0
- package/dist/esm/components/password-reset-inner.js.map +1 -0
- package/dist/esm/components/redirect-message-card.js +9 -14
- package/dist/esm/components/redirect-message-card.js.map +1 -0
- package/dist/esm/components/separator-with-text.js +1 -0
- package/dist/esm/components/separator-with-text.js.map +1 -0
- package/dist/esm/components/user-avatar.js +1 -0
- package/dist/esm/components/user-avatar.js.map +1 -0
- package/dist/esm/components/user-button.js +2 -1
- package/dist/esm/components/user-button.js.map +1 -0
- package/dist/esm/components-core/avatar.js +2 -1
- package/dist/esm/components-core/avatar.js.map +1 -0
- package/dist/esm/components-core/button.js +4 -3
- package/dist/esm/components-core/button.js.map +1 -0
- package/dist/esm/components-core/card.js +2 -1
- package/dist/esm/components-core/card.js.map +1 -0
- package/dist/esm/components-core/collapsible.js +1 -0
- package/dist/esm/components-core/collapsible.js.map +1 -0
- package/dist/esm/components-core/container.js +1 -0
- package/dist/esm/components-core/container.js.map +1 -0
- package/dist/esm/components-core/dropdown.js +4 -3
- package/dist/esm/components-core/dropdown.js.map +1 -0
- package/dist/esm/components-core/index.js +1 -0
- package/dist/esm/components-core/index.js.map +1 -0
- package/dist/esm/components-core/input.js +2 -1
- package/dist/esm/components-core/input.js.map +1 -0
- package/dist/esm/components-core/label.js +2 -1
- package/dist/esm/components-core/label.js.map +1 -0
- package/dist/esm/components-core/link.js +2 -1
- package/dist/esm/components-core/link.js.map +1 -0
- package/dist/esm/components-core/loading-indicator.js +2 -1
- package/dist/esm/components-core/loading-indicator.js.map +1 -0
- package/dist/esm/components-core/popover.js +2 -1
- package/dist/esm/components-core/popover.js.map +1 -0
- package/dist/esm/components-core/separator.js +2 -1
- package/dist/esm/components-core/separator.js.map +1 -0
- package/dist/esm/components-core/skeleton.js +2 -1
- package/dist/esm/components-core/skeleton.js.map +1 -0
- package/dist/esm/components-core/tabs.js +10 -7
- package/dist/esm/components-core/tabs.js.map +1 -0
- package/dist/esm/components-core/text.js +2 -1
- package/dist/esm/components-core/text.js.map +1 -0
- package/dist/esm/components-core-joy/button.js +1 -0
- package/dist/esm/components-core-joy/button.js.map +1 -0
- package/dist/esm/components-core-joy/input.js +1 -0
- package/dist/esm/components-core-joy/input.js.map +1 -0
- package/dist/esm/components-core-joy/separator.js +1 -0
- package/dist/esm/components-core-joy/separator.js.map +1 -0
- package/dist/esm/components-core-joy/tabs.js +1 -0
- package/dist/esm/components-core-joy/tabs.js.map +1 -0
- package/dist/esm/components-core-joy/text.js +1 -0
- package/dist/esm/components-core-joy/text.js.map +1 -0
- package/dist/esm/components-page/account-settings.js +1 -0
- package/dist/esm/components-page/account-settings.js.map +1 -0
- package/dist/esm/components-page/auth-page.js +6 -4
- package/dist/esm/components-page/auth-page.js.map +1 -0
- package/dist/esm/components-page/email-verification.js +1 -0
- package/dist/esm/components-page/email-verification.js.map +1 -0
- package/dist/esm/components-page/forgot-password.js +1 -0
- package/dist/esm/components-page/forgot-password.js.map +1 -0
- package/dist/esm/components-page/magic-link-callback.js +3 -2
- package/dist/esm/components-page/magic-link-callback.js.map +1 -0
- package/dist/esm/components-page/oauth-callback.js +1 -0
- package/dist/esm/components-page/oauth-callback.js.map +1 -0
- package/dist/esm/components-page/password-reset.js +1 -0
- package/dist/esm/components-page/password-reset.js.map +1 -0
- package/dist/esm/components-page/sign-in.js +1 -0
- package/dist/esm/components-page/sign-in.js.map +1 -0
- package/dist/esm/components-page/sign-out.js +1 -0
- package/dist/esm/components-page/sign-out.js.map +1 -0
- package/dist/esm/components-page/sign-up.js +1 -0
- package/dist/esm/components-page/sign-up.js.map +1 -0
- package/dist/esm/components-page/stack-handler.js +1 -0
- package/dist/esm/components-page/stack-handler.js.map +1 -0
- package/dist/esm/index.js +3 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/joy.js +1 -0
- package/dist/esm/joy.js.map +1 -0
- package/dist/esm/lib/auth.js +1 -0
- package/dist/esm/lib/auth.js.map +1 -0
- package/dist/esm/lib/cookie.js +2 -1
- package/dist/esm/lib/cookie.js.map +1 -0
- package/dist/esm/lib/hooks.js +1 -0
- package/dist/esm/lib/hooks.js.map +1 -0
- package/dist/esm/lib/stack-app.js +287 -5
- package/dist/esm/lib/stack-app.js.map +1 -0
- package/dist/esm/providers/component-provider.js +1 -0
- package/dist/esm/providers/component-provider.js.map +1 -0
- package/dist/esm/providers/design-provider.js +1 -0
- package/dist/esm/providers/design-provider.js.map +1 -0
- package/dist/esm/providers/joy-provider.js +1 -0
- package/dist/esm/providers/joy-provider.js.map +1 -0
- package/dist/esm/providers/stack-provider-client.js +1 -0
- package/dist/esm/providers/stack-provider-client.js.map +1 -0
- package/dist/esm/providers/stack-provider.js +1 -0
- package/dist/esm/providers/stack-provider.js.map +1 -0
- package/dist/esm/providers/styled-components-registry.js +1 -0
- package/dist/esm/providers/styled-components-registry.js.map +1 -0
- package/dist/esm/providers/theme-provider.js +1 -0
- package/dist/esm/providers/theme-provider.js.map +1 -0
- package/dist/esm/utils/browser-script.js +15 -6
- package/dist/esm/utils/browser-script.js.map +1 -0
- package/dist/esm/utils/constants.js +1 -0
- package/dist/esm/utils/constants.js.map +1 -0
- package/dist/esm/utils/email.js +1 -0
- package/dist/esm/utils/email.js.map +1 -0
- package/dist/esm/utils/next.js +1 -0
- package/dist/esm/utils/next.js.map +1 -0
- package/dist/esm/utils/url.js +1 -0
- package/dist/esm/utils/url.js.map +1 -0
- package/dist/index.d.mts +3 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/joy.js +1 -0
- package/dist/joy.js.map +1 -0
- package/dist/lib/auth.js +1 -0
- package/dist/lib/auth.js.map +1 -0
- package/dist/lib/cookie.js +5 -4
- package/dist/lib/cookie.js.map +1 -0
- package/dist/lib/hooks.d.mts +1 -0
- package/dist/lib/hooks.d.ts +1 -0
- package/dist/lib/hooks.js +1 -0
- package/dist/lib/hooks.js.map +1 -0
- package/dist/lib/stack-app.d.mts +81 -23
- package/dist/lib/stack-app.d.ts +81 -23
- package/dist/lib/stack-app.js +287 -5
- package/dist/lib/stack-app.js.map +1 -0
- package/dist/providers/component-provider.js +1 -0
- package/dist/providers/component-provider.js.map +1 -0
- package/dist/providers/design-provider.js +1 -0
- package/dist/providers/design-provider.js.map +1 -0
- package/dist/providers/joy-provider.js +1 -0
- package/dist/providers/joy-provider.js.map +1 -0
- package/dist/providers/stack-provider-client.d.mts +1 -0
- package/dist/providers/stack-provider-client.d.ts +1 -0
- package/dist/providers/stack-provider-client.js +1 -0
- package/dist/providers/stack-provider-client.js.map +1 -0
- package/dist/providers/stack-provider.d.mts +1 -0
- package/dist/providers/stack-provider.d.ts +1 -0
- package/dist/providers/stack-provider.js +1 -0
- package/dist/providers/stack-provider.js.map +1 -0
- package/dist/providers/styled-components-registry.js +1 -0
- package/dist/providers/styled-components-registry.js.map +1 -0
- package/dist/providers/theme-provider.js +1 -0
- package/dist/providers/theme-provider.js.map +1 -0
- package/dist/utils/browser-script.js +15 -6
- package/dist/utils/browser-script.js.map +1 -0
- package/dist/utils/constants.js +1 -0
- package/dist/utils/constants.js.map +1 -0
- package/dist/utils/email.js +1 -0
- package/dist/utils/email.js.map +1 -0
- package/dist/utils/next.js +1 -0
- package/dist/utils/next.js.map +1 -0
- package/dist/utils/url.js +1 -0
- package/dist/utils/url.js.map +1 -0
- package/package.json +3 -3
package/dist/lib/stack-app.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { ServerUserJson,
|
|
2
|
-
import { ReadonlyTokenStore, UserJson,
|
|
1
|
+
import { ServerUserJson, OAuthProviderConfigJson, KnownErrors } from '@stackframe/stack-shared';
|
|
2
|
+
import { ReadonlyTokenStore, UserJson, UserUpdateJson, ProjectJson, ProductionModeError, TeamJson, EmailConfigJson, DomainConfigJson, ClientProjectJson } from '@stackframe/stack-shared/dist/interface/clientInterface';
|
|
3
3
|
import { ReadonlyJson } from '@stackframe/stack-shared/dist/utils/json';
|
|
4
4
|
import { ProjectUpdateOptions, ApiKeySetCreateOptions } from '@stackframe/stack-shared/dist/interface/adminInterface';
|
|
5
|
+
import { ServerUserUpdateJson, ServerTeamCustomizableJson, ServerPermissionDefinitionCustomizableJson, ServerPermissionDefinitionJson } from '@stackframe/stack-shared/dist/interface/serverInterface';
|
|
5
6
|
|
|
6
7
|
type TokenStoreOptions<HasTokenStore extends boolean = boolean> = HasTokenStore extends true ? "cookie" | "nextjs-cookie" | "memory" : HasTokenStore extends false ? null : TokenStoreOptions<true> | TokenStoreOptions<false>;
|
|
7
8
|
type HandlerUrls = {
|
|
@@ -42,7 +43,7 @@ type StackClientAppJson<HasTokenStore extends boolean, ProjectId extends string>
|
|
|
42
43
|
declare const stackAppInternalsSymbol: unique symbol;
|
|
43
44
|
type Auth<T, C> = {
|
|
44
45
|
readonly tokenStore: ReadonlyTokenStore;
|
|
45
|
-
update(this: T, user:
|
|
46
|
+
update(this: T, user: C): Promise<void>;
|
|
46
47
|
signOut(this: T): Promise<void>;
|
|
47
48
|
sendVerificationEmail(this: T): Promise<KnownErrors["EmailAlreadyVerified"] | undefined>;
|
|
48
49
|
updatePassword(this: T, options: {
|
|
@@ -51,12 +52,14 @@ type Auth<T, C> = {
|
|
|
51
52
|
}): Promise<KnownErrors["PasswordMismatch"] | KnownErrors["PasswordRequirementsNotMet"] | undefined>;
|
|
52
53
|
};
|
|
53
54
|
type InternalAuth<T> = {
|
|
54
|
-
createProject(this: T, newProject:
|
|
55
|
+
createProject(this: T, newProject: ProjectUpdateOptions & {
|
|
56
|
+
displayName: string;
|
|
57
|
+
}): Promise<Project>;
|
|
55
58
|
listOwnedProjects(this: T): Promise<Project[]>;
|
|
56
59
|
useOwnedProjects(this: T): Project[];
|
|
57
60
|
onOwnedProjectsChange(this: T, callback: (projects: Project[]) => void): void;
|
|
58
61
|
};
|
|
59
|
-
type User = {
|
|
62
|
+
type User = ({
|
|
60
63
|
readonly projectId: string;
|
|
61
64
|
readonly id: string;
|
|
62
65
|
readonly displayName: string | null;
|
|
@@ -74,25 +77,37 @@ type User = {
|
|
|
74
77
|
readonly hasPassword: boolean;
|
|
75
78
|
readonly authWithEmail: boolean;
|
|
76
79
|
readonly oauthProviders: readonly string[];
|
|
80
|
+
hasPermission(this: CurrentUser, scope: Team, permissionId: string): Promise<boolean>;
|
|
77
81
|
toJson(this: CurrentUser): UserJson;
|
|
78
|
-
}
|
|
79
|
-
|
|
82
|
+
} & AsyncStoreProperty<"team", [id: string], Team | null, false> & AsyncStoreProperty<"teams", [], Team[], true> & Omit<AsyncStoreProperty<"permission", [scope: Team, permissionId: string, options?: {
|
|
83
|
+
direct?: boolean;
|
|
84
|
+
}], Permission | null, false>, "onPermissionChange"> & Omit<AsyncStoreProperty<"permissions", [scope: Team, options?: {
|
|
85
|
+
direct?: boolean;
|
|
86
|
+
}], Permission[], true>, "onPermissionsChange">);
|
|
87
|
+
type CurrentUser = Auth<User, UserUpdateJson> & User;
|
|
80
88
|
type CurrentInternalUser = CurrentUser & InternalAuth<CurrentUser>;
|
|
81
89
|
/**
|
|
82
90
|
* A user including sensitive fields that should only be used on the server, never sent to the client
|
|
83
91
|
* (such as sensitive information and serverMetadata).
|
|
84
92
|
*/
|
|
85
|
-
type ServerUser = Omit<User,
|
|
93
|
+
type ServerUser = (Omit<User, 'hasPermission' | 'toJson' | keyof AsyncStoreProperty<"team", [], Team | null, false> | keyof AsyncStoreProperty<"teams", [], Team[], true> | keyof AsyncStoreProperty<"permission", [], Permission[], false> | keyof AsyncStoreProperty<"permissions", [], Permission[], true>> & {
|
|
86
94
|
readonly serverMetadata: ReadonlyJson;
|
|
87
95
|
/**
|
|
88
96
|
* Returns a new user object with the sensitive fields removed.
|
|
89
97
|
*/
|
|
90
98
|
getClientUser(this: ServerUser): User;
|
|
91
|
-
|
|
92
|
-
update(this: ServerUser, user: Partial<ServerUserCustomizableJson>): Promise<void>;
|
|
99
|
+
update(this: ServerUser, user: Partial<ServerUserUpdateJson>): Promise<void>;
|
|
93
100
|
delete(this: ServerUser): Promise<void>;
|
|
94
|
-
|
|
95
|
-
|
|
101
|
+
grantPermission(scope: Team, permissionId: string): Promise<void>;
|
|
102
|
+
revokePermission(scope: Team, permissionId: string): Promise<void>;
|
|
103
|
+
hasPermission(scope: Team, permissionId: string): Promise<boolean>;
|
|
104
|
+
toJson(this: ServerUser): ServerUserJson;
|
|
105
|
+
} & AsyncStoreProperty<"team", [id: string], ServerTeam | null, false> & AsyncStoreProperty<"teams", [], ServerTeam[], true> & Omit<AsyncStoreProperty<"permission", [scope: Team, permissionId: string, options?: {
|
|
106
|
+
direct?: boolean;
|
|
107
|
+
}], ServerPermission | null, false>, "onPermissionChange"> & Omit<AsyncStoreProperty<"permissions", [scope: Team, options?: {
|
|
108
|
+
direct?: boolean;
|
|
109
|
+
}], ServerPermission[], true>, "onPermissionsChange">);
|
|
110
|
+
type CurrentServerUser = Auth<ServerUser, ServerUserUpdateJson> & Omit<ServerUser, "getClientUser"> & {
|
|
96
111
|
getClientUser(this: CurrentServerUser): CurrentUser;
|
|
97
112
|
};
|
|
98
113
|
type CurrentInternalServerUser = CurrentServerUser & InternalAuth<CurrentServerUser>;
|
|
@@ -111,11 +126,47 @@ type Project = {
|
|
|
111
126
|
readonly oauthProviders: OAuthProviderConfig[];
|
|
112
127
|
readonly emailConfig?: EmailConfig;
|
|
113
128
|
readonly domains: DomainConfig[];
|
|
129
|
+
readonly createTeamOnSignUp: boolean;
|
|
114
130
|
};
|
|
115
131
|
update(this: Project, update: ProjectUpdateOptions): Promise<void>;
|
|
116
132
|
toJson(this: Project): ProjectJson;
|
|
117
133
|
getProductionModeErrors(this: Project): ProductionModeError[];
|
|
118
134
|
};
|
|
135
|
+
type Team = {
|
|
136
|
+
id: string;
|
|
137
|
+
displayName: string;
|
|
138
|
+
createdAt: Date;
|
|
139
|
+
toJson(this: Team): TeamJson;
|
|
140
|
+
};
|
|
141
|
+
type ServerTeam = Team & {
|
|
142
|
+
listMembers(): Promise<ServerTeamMember[]>;
|
|
143
|
+
useMembers(): ServerTeamMember[];
|
|
144
|
+
update(update: Partial<ServerTeamCustomizableJson>): Promise<void>;
|
|
145
|
+
delete(): Promise<void>;
|
|
146
|
+
addUser(userId: string): Promise<void>;
|
|
147
|
+
removeUser(userId: string): Promise<void>;
|
|
148
|
+
};
|
|
149
|
+
type TeamMember = {
|
|
150
|
+
userId: string;
|
|
151
|
+
teamId: string;
|
|
152
|
+
displayName: string | null;
|
|
153
|
+
};
|
|
154
|
+
type ServerTeamMember = TeamMember & {
|
|
155
|
+
getUser(): Promise<ServerUser>;
|
|
156
|
+
};
|
|
157
|
+
type Permission = {
|
|
158
|
+
id: string;
|
|
159
|
+
} & ({
|
|
160
|
+
type: "global";
|
|
161
|
+
} | {
|
|
162
|
+
type: "team";
|
|
163
|
+
teamId: string;
|
|
164
|
+
});
|
|
165
|
+
type ServerPermission = Permission & {
|
|
166
|
+
readonly __databaseUniqueId: string;
|
|
167
|
+
readonly description?: string;
|
|
168
|
+
readonly containPermissionIds: string[];
|
|
169
|
+
};
|
|
119
170
|
type ApiKeySetBase = {
|
|
120
171
|
id: string;
|
|
121
172
|
description: string;
|
|
@@ -148,12 +199,12 @@ type OAuthProviderConfig = OAuthProviderConfigJson;
|
|
|
148
199
|
type GetUserOptions = {
|
|
149
200
|
or?: 'redirect' | 'throw' | 'return-null';
|
|
150
201
|
};
|
|
151
|
-
type AsyncStoreProperty<Name extends string, Value, IsMultiple extends boolean> = {
|
|
152
|
-
[key in `${IsMultiple extends true ? "list" : "get"}${Capitalize<Name>}`]: () => Promise<Value>;
|
|
202
|
+
type AsyncStoreProperty<Name extends string, Args extends any[], Value, IsMultiple extends boolean> = {
|
|
203
|
+
[key in `${IsMultiple extends true ? "list" : "get"}${Capitalize<Name>}`]: (...args: Args) => Promise<Value>;
|
|
153
204
|
} & {
|
|
154
|
-
[key in `on${Capitalize<Name>}Change`]: (callback: (value: Value) => void) => void;
|
|
205
|
+
[key in `on${Capitalize<Name>}Change`]: (...tupleArgs: [...args: Args, callback: (value: Value) => void]) => void;
|
|
155
206
|
} & {
|
|
156
|
-
[key in `use${Capitalize<Name>}`]: () => Value;
|
|
207
|
+
[key in `use${Capitalize<Name>}`]: (...args: Args) => Value;
|
|
157
208
|
};
|
|
158
209
|
type StackClientAppConstructor = {
|
|
159
210
|
new <TokenStoreType extends string, HasTokenStore extends (TokenStoreType extends {} ? true : boolean), ProjectId extends string>(options: StackClientAppConstructorOptions<HasTokenStore, ProjectId>): StackClientApp<HasTokenStore, ProjectId>;
|
|
@@ -188,10 +239,10 @@ type StackClientApp<HasTokenStore extends boolean = boolean, ProjectId extends s
|
|
|
188
239
|
toClientJson(): StackClientAppJson<HasTokenStore, ProjectId>;
|
|
189
240
|
setCurrentUser(userJsonPromise: Promise<UserJson | null>): void;
|
|
190
241
|
};
|
|
191
|
-
} & AsyncStoreProperty<"project", ClientProjectJson, false> & {
|
|
192
|
-
[K in `redirectTo${Capitalize<keyof Omit<HandlerUrls, 'handler' | 'oauthCallback'>>}`]: () => Promise<
|
|
242
|
+
} & AsyncStoreProperty<"project", [], ClientProjectJson, false> & {
|
|
243
|
+
[K in `redirectTo${Capitalize<keyof Omit<HandlerUrls, 'handler' | 'oauthCallback'>>}`]: () => Promise<void>;
|
|
193
244
|
} & (HasTokenStore extends false ? {} : {
|
|
194
|
-
redirectToOAuthCallback(): Promise<
|
|
245
|
+
redirectToOAuthCallback(): Promise<void>;
|
|
195
246
|
useUser(options: GetUserOptions & {
|
|
196
247
|
or: 'redirect';
|
|
197
248
|
}): ProjectCurrentUser<ProjectId>;
|
|
@@ -206,22 +257,29 @@ type StackClientApp<HasTokenStore extends boolean = boolean, ProjectId extends s
|
|
|
206
257
|
or: 'throw';
|
|
207
258
|
}): Promise<ProjectCurrentUser<ProjectId>>;
|
|
208
259
|
getUser(options?: GetUserOptions): Promise<ProjectCurrentUser<ProjectId> | null>;
|
|
209
|
-
onUserChange: AsyncStoreProperty<"user", CurrentUser | null, false>["onUserChange"];
|
|
260
|
+
onUserChange: AsyncStoreProperty<"user", [], CurrentUser | null, false>["onUserChange"];
|
|
210
261
|
}));
|
|
211
262
|
declare const StackClientApp: StackClientAppConstructor;
|
|
212
263
|
type StackServerAppConstructor = {
|
|
213
264
|
new <TokenStoreType extends string, HasTokenStore extends (TokenStoreType extends {} ? true : boolean), ProjectId extends string>(options: StackServerAppConstructorOptions<HasTokenStore, ProjectId>): StackServerApp<HasTokenStore, ProjectId>;
|
|
214
265
|
new (options: StackServerAppConstructorOptions<boolean, string>): StackServerApp<boolean, string>;
|
|
215
266
|
};
|
|
216
|
-
type StackServerApp<HasTokenStore extends boolean = boolean, ProjectId extends string = string> = (StackClientApp<HasTokenStore, ProjectId> &
|
|
267
|
+
type StackServerApp<HasTokenStore extends boolean = boolean, ProjectId extends string = string> = (StackClientApp<HasTokenStore, ProjectId> & {
|
|
268
|
+
createTeam(data: ServerTeamCustomizableJson): Promise<ServerTeam>;
|
|
269
|
+
createPermissionDefinition(data: ServerPermissionDefinitionCustomizableJson): Promise<ServerPermission>;
|
|
270
|
+
updatePermissionDefinition(permissionId: string, data: Partial<ServerPermissionDefinitionCustomizableJson>): Promise<void>;
|
|
271
|
+
deletePermissionDefinition(permissionId: string): Promise<void>;
|
|
272
|
+
listPermissionDefinitions(): Promise<ServerPermissionDefinitionJson[]>;
|
|
273
|
+
usePermissionDefinitions(): ServerPermissionDefinitionJson[];
|
|
274
|
+
} & AsyncStoreProperty<"serverUser", [], CurrentServerUser | null, false> & AsyncStoreProperty<"serverUsers", [], ServerUser[], true> & Omit<AsyncStoreProperty<"team", [id: string], ServerTeam | null, false>, "onTeamChange"> & Omit<AsyncStoreProperty<"teams", [], ServerTeam[], true>, "onTeamsChange">);
|
|
217
275
|
declare const StackServerApp: StackServerAppConstructor;
|
|
218
276
|
type StackAdminAppConstructor = {
|
|
219
277
|
new <HasTokenStore extends boolean, ProjectId extends string>(options: StackAdminAppConstructorOptions<HasTokenStore, ProjectId>): StackAdminApp<HasTokenStore, ProjectId>;
|
|
220
278
|
new (options: StackAdminAppConstructorOptions<boolean, string>): StackAdminApp<boolean, string>;
|
|
221
279
|
};
|
|
222
|
-
type StackAdminApp<HasTokenStore extends boolean = boolean, ProjectId extends string = string> = (StackServerApp<HasTokenStore, ProjectId> & AsyncStoreProperty<"projectAdmin", Project, false> & AsyncStoreProperty<"apiKeySets", ApiKeySet[], true> & {
|
|
280
|
+
type StackAdminApp<HasTokenStore extends boolean = boolean, ProjectId extends string = string> = (StackServerApp<HasTokenStore, ProjectId> & AsyncStoreProperty<"projectAdmin", [], Project, false> & AsyncStoreProperty<"apiKeySets", [], ApiKeySet[], true> & {
|
|
223
281
|
createApiKeySet(options: ApiKeySetCreateOptions): Promise<ApiKeySetFirstView>;
|
|
224
282
|
});
|
|
225
283
|
declare const StackAdminApp: StackAdminAppConstructor;
|
|
226
284
|
|
|
227
|
-
export { type ApiKeySet, type ApiKeySetBase, type ApiKeySetFirstView, type CurrentInternalServerUser, type CurrentInternalUser, type CurrentServerUser, type CurrentUser, type DomainConfig, type EmailConfig, type GetUserOptions, type HandlerUrls, type OAuthProviderConfig, type Project, type ServerUser, StackAdminApp, type StackAdminAppConstructorOptions, StackClientApp, type StackClientAppConstructorOptions, type StackClientAppJson, StackServerApp, type StackServerAppConstructorOptions, type TokenStoreOptions, type User, stackAppInternalsSymbol };
|
|
285
|
+
export { type ApiKeySet, type ApiKeySetBase, type ApiKeySetFirstView, type CurrentInternalServerUser, type CurrentInternalUser, type CurrentServerUser, type CurrentUser, type DomainConfig, type EmailConfig, type GetUserOptions, type HandlerUrls, type OAuthProviderConfig, type Permission, type Project, type ServerPermission, type ServerTeam, type ServerTeamMember, type ServerUser, StackAdminApp, type StackAdminAppConstructorOptions, StackClientApp, type StackClientAppConstructorOptions, type StackClientAppJson, StackServerApp, type StackServerAppConstructorOptions, type Team, type TeamMember, type TokenStoreOptions, type User, stackAppInternalsSymbol };
|
package/dist/lib/stack-app.js
CHANGED
|
@@ -53,6 +53,9 @@ var import_objects = require("@stackframe/stack-shared/dist/utils/objects");
|
|
|
53
53
|
var import_promises = require("@stackframe/stack-shared/dist/utils/promises");
|
|
54
54
|
var import_caches = require("@stackframe/stack-shared/dist/utils/caches");
|
|
55
55
|
var import_react3 = require("@stackframe/stack-shared/dist/utils/react");
|
|
56
|
+
function permissionDefinitionScopeToType(scope) {
|
|
57
|
+
return { "any-team": "team", "specific-team": "team", "global": "global" }[scope.type];
|
|
58
|
+
}
|
|
56
59
|
function getUrls(partial) {
|
|
57
60
|
const handler = partial.handler ?? "/handler";
|
|
58
61
|
return {
|
|
@@ -80,10 +83,10 @@ function getDefaultPublishableClientKey() {
|
|
|
80
83
|
return process.env.NEXT_PUBLIC_STACK_PUBLISHABLE_CLIENT_KEY || (0, import_errors.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.");
|
|
81
84
|
}
|
|
82
85
|
function getDefaultSecretServerKey() {
|
|
83
|
-
return process.env.STACK_SECRET_SERVER_KEY || (0, import_errors.throwErr)("No secret server key provided. Please copy your
|
|
86
|
+
return process.env.STACK_SECRET_SERVER_KEY || (0, import_errors.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.");
|
|
84
87
|
}
|
|
85
88
|
function getDefaultSuperSecretAdminKey() {
|
|
86
|
-
return process.env.STACK_SUPER_SECRET_ADMIN_KEY || (0, import_errors.throwErr)("No super secret admin key provided. Please copy your
|
|
89
|
+
return process.env.STACK_SUPER_SECRET_ADMIN_KEY || (0, import_errors.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.");
|
|
87
90
|
}
|
|
88
91
|
function getDefaultBaseUrl() {
|
|
89
92
|
return process.env.NEXT_PUBLIC_STACK_URL || defaultBaseUrl;
|
|
@@ -216,6 +219,12 @@ var _StackClientAppImpl = class __StackClientAppImpl {
|
|
|
216
219
|
_ownedProjectsCache = createCacheByTokenStore(async (tokenStore) => {
|
|
217
220
|
return await this._interface.listProjects(tokenStore);
|
|
218
221
|
});
|
|
222
|
+
_currentUserPermissionsCache = createCacheByTokenStore(async (tokenStore, [teamId, type, direct]) => {
|
|
223
|
+
return await this._interface.listClientUserTeamPermissions({ teamId, type, direct }, tokenStore);
|
|
224
|
+
});
|
|
225
|
+
_currentUserTeamsCache = createCacheByTokenStore(async (tokenStore) => {
|
|
226
|
+
return await this._interface.listClientUserTeams(tokenStore);
|
|
227
|
+
});
|
|
219
228
|
constructor(options) {
|
|
220
229
|
if ("interface" in options) {
|
|
221
230
|
this._interface = options.interface;
|
|
@@ -250,7 +259,33 @@ var _StackClientAppImpl = class __StackClientAppImpl {
|
|
|
250
259
|
throw new Error("Cannot call this function on a Stack app with a project ID other than 'internal'.");
|
|
251
260
|
}
|
|
252
261
|
}
|
|
262
|
+
_permissionFromJson(json) {
|
|
263
|
+
const type = permissionDefinitionScopeToType(json.scope);
|
|
264
|
+
if (type === "team") {
|
|
265
|
+
return {
|
|
266
|
+
id: json.id,
|
|
267
|
+
type,
|
|
268
|
+
teamId: json.scope.teamId
|
|
269
|
+
};
|
|
270
|
+
} else {
|
|
271
|
+
return {
|
|
272
|
+
id: json.id,
|
|
273
|
+
type
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
_teamFromJson(json) {
|
|
278
|
+
return {
|
|
279
|
+
id: json.id,
|
|
280
|
+
displayName: json.displayName,
|
|
281
|
+
createdAt: new Date(json.createdAtMillis),
|
|
282
|
+
toJson() {
|
|
283
|
+
return json;
|
|
284
|
+
}
|
|
285
|
+
};
|
|
286
|
+
}
|
|
253
287
|
_userFromJson(json) {
|
|
288
|
+
const app = this;
|
|
254
289
|
return {
|
|
255
290
|
projectId: json.projectId,
|
|
256
291
|
id: json.id,
|
|
@@ -264,11 +299,69 @@ var _StackClientAppImpl = class __StackClientAppImpl {
|
|
|
264
299
|
hasPassword: json.hasPassword,
|
|
265
300
|
authWithEmail: json.authWithEmail,
|
|
266
301
|
oauthProviders: json.oauthProviders,
|
|
302
|
+
async getTeam(teamId) {
|
|
303
|
+
const teams = await this.listTeams();
|
|
304
|
+
return teams.find((t) => t.id === teamId) ?? null;
|
|
305
|
+
},
|
|
306
|
+
useTeam(teamId) {
|
|
307
|
+
const teams = this.useTeams();
|
|
308
|
+
return (0, import_react.useMemo)(() => {
|
|
309
|
+
return teams.find((t) => t.id === teamId) ?? null;
|
|
310
|
+
}, [teams, teamId]);
|
|
311
|
+
},
|
|
312
|
+
onTeamChange(teamId, callback) {
|
|
313
|
+
return this.onTeamsChange((teams) => {
|
|
314
|
+
const team = teams.find((t) => t.id === teamId) ?? null;
|
|
315
|
+
callback(team);
|
|
316
|
+
});
|
|
317
|
+
},
|
|
318
|
+
async listTeams() {
|
|
319
|
+
const teams = await app._currentUserTeamsCache.getOrWait([getTokenStore(app._tokenStoreOptions)], "write-only");
|
|
320
|
+
return teams.map((json2) => app._teamFromJson(json2));
|
|
321
|
+
},
|
|
322
|
+
useTeams() {
|
|
323
|
+
const teams = useCache(app._currentUserTeamsCache, [getTokenStore(app._tokenStoreOptions)], "user.useTeams()");
|
|
324
|
+
return (0, import_react.useMemo)(() => teams.map((json2) => app._teamFromJson(json2)), [teams]);
|
|
325
|
+
},
|
|
326
|
+
onTeamsChange(callback) {
|
|
327
|
+
return app._currentUserTeamsCache.onChange([getTokenStore(app._tokenStoreOptions)], (value, oldValue) => {
|
|
328
|
+
callback(value.map((json2) => app._teamFromJson(json2)), oldValue?.map((json2) => app._teamFromJson(json2)));
|
|
329
|
+
});
|
|
330
|
+
},
|
|
331
|
+
async listPermissions(scope, options) {
|
|
332
|
+
const permissions = await app._currentUserPermissionsCache.getOrWait([getTokenStore(app._tokenStoreOptions), scope.id, "team", !!options?.direct], "write-only");
|
|
333
|
+
return permissions.map((json2) => app._permissionFromJson(json2));
|
|
334
|
+
},
|
|
335
|
+
usePermissions(scope, options) {
|
|
336
|
+
const permissions = useCache(app._currentUserPermissionsCache, [getTokenStore(app._tokenStoreOptions), scope.id, "team", !!options?.direct], "user.usePermissions()");
|
|
337
|
+
return (0, import_react.useMemo)(() => permissions.map((json2) => app._permissionFromJson(json2)), [permissions]);
|
|
338
|
+
},
|
|
339
|
+
usePermission(scope, permissionId) {
|
|
340
|
+
const permissions = this.usePermissions(scope);
|
|
341
|
+
return (0, import_react.useMemo)(() => permissions.find((p) => p.id === permissionId) ?? null, [permissions, permissionId]);
|
|
342
|
+
},
|
|
343
|
+
async getPermission(scope, permissionId) {
|
|
344
|
+
const permissions = await this.listPermissions(scope);
|
|
345
|
+
return permissions.find((p) => p.id === permissionId) ?? null;
|
|
346
|
+
},
|
|
347
|
+
async hasPermission(scope, permissionId) {
|
|
348
|
+
const permissions = await this.listPermissions(scope);
|
|
349
|
+
return permissions.some((p) => p.id === permissionId);
|
|
350
|
+
},
|
|
267
351
|
toJson() {
|
|
268
352
|
return json;
|
|
269
353
|
}
|
|
270
354
|
};
|
|
271
355
|
}
|
|
356
|
+
_teamMemberFromJson(json) {
|
|
357
|
+
if (json === null)
|
|
358
|
+
return null;
|
|
359
|
+
return {
|
|
360
|
+
teamId: json.teamId,
|
|
361
|
+
userId: json.userId,
|
|
362
|
+
displayName: json.displayName
|
|
363
|
+
};
|
|
364
|
+
}
|
|
272
365
|
_currentUserFromJson(json, tokenStore) {
|
|
273
366
|
if (json === null)
|
|
274
367
|
return null;
|
|
@@ -346,7 +439,8 @@ var _StackClientAppImpl = class __StackClientAppImpl {
|
|
|
346
439
|
allowLocalhost: data.evaluatedConfig.allowLocalhost,
|
|
347
440
|
oauthProviders: data.evaluatedConfig.oauthProviders,
|
|
348
441
|
emailConfig: data.evaluatedConfig.emailConfig,
|
|
349
|
-
domains: data.evaluatedConfig.domains
|
|
442
|
+
domains: data.evaluatedConfig.domains,
|
|
443
|
+
createTeamOnSignUp: data.evaluatedConfig.createTeamOnSignUp
|
|
350
444
|
},
|
|
351
445
|
async update(update) {
|
|
352
446
|
await adminInterface.updateProject(update);
|
|
@@ -378,7 +472,7 @@ var _StackClientAppImpl = class __StackClientAppImpl {
|
|
|
378
472
|
throw new Error(`No URL for handler name ${handlerName}`);
|
|
379
473
|
}
|
|
380
474
|
window.location.href = this.urls[handlerName];
|
|
381
|
-
return (0, import_promises.
|
|
475
|
+
return (0, import_promises.wait)(2e3);
|
|
382
476
|
}
|
|
383
477
|
async redirectToSignIn() {
|
|
384
478
|
return await this._redirectTo("signIn");
|
|
@@ -469,7 +563,7 @@ var _StackClientAppImpl = class __StackClientAppImpl {
|
|
|
469
563
|
case "redirect": {
|
|
470
564
|
router.replace(this.urls.signIn);
|
|
471
565
|
(0, import_react3.suspend)();
|
|
472
|
-
throw new
|
|
566
|
+
throw new import_errors.StackAssertionError("suspend should never return");
|
|
473
567
|
}
|
|
474
568
|
case "throw": {
|
|
475
569
|
throw new Error("User is not signed in but useUser was called with { or: 'throw' }");
|
|
@@ -681,6 +775,22 @@ var _StackServerAppImpl = class extends _StackClientAppImpl {
|
|
|
681
775
|
_serverUsersCache = createCache(async () => {
|
|
682
776
|
return await this._interface.listUsers();
|
|
683
777
|
});
|
|
778
|
+
_serverUserCache = createCache(async ([userId]) => {
|
|
779
|
+
const user = await this._interface.getServerUserById(userId);
|
|
780
|
+
return import_results.Result.or(user, null);
|
|
781
|
+
});
|
|
782
|
+
_serverTeamsCache = createCache(async () => {
|
|
783
|
+
return await this._interface.listTeams();
|
|
784
|
+
});
|
|
785
|
+
_serverTeamMembersCache = createCache(async ([teamId]) => {
|
|
786
|
+
return await this._interface.listTeamMembers(teamId);
|
|
787
|
+
});
|
|
788
|
+
_serverTeamPermissionDefinitionsCache = createCache(async () => {
|
|
789
|
+
return await this._interface.listPermissionDefinitions();
|
|
790
|
+
});
|
|
791
|
+
_serverTeamUserPermissionsCache = createCache(async ([teamId, userId, type, direct]) => {
|
|
792
|
+
return await this._interface.listTeamMemberPermissions({ teamId, userId, type, direct });
|
|
793
|
+
});
|
|
684
794
|
constructor(options) {
|
|
685
795
|
if ("interface" in options) {
|
|
686
796
|
super({
|
|
@@ -721,6 +831,67 @@ var _StackServerAppImpl = class extends _StackClientAppImpl {
|
|
|
721
831
|
getClientUser() {
|
|
722
832
|
return app._userFromJson(json);
|
|
723
833
|
},
|
|
834
|
+
async grantPermission(scope, permissionId) {
|
|
835
|
+
await app._interface.grantTeamUserPermission(scope.id, json.id, permissionId, "team");
|
|
836
|
+
for (const direct of [true, false]) {
|
|
837
|
+
await app._serverTeamUserPermissionsCache.refresh([scope.id, json.id, "team", direct]);
|
|
838
|
+
}
|
|
839
|
+
},
|
|
840
|
+
async revokePermission(scope, permissionId) {
|
|
841
|
+
await app._interface.revokeTeamUserPermission(scope.id, json.id, permissionId, "team");
|
|
842
|
+
for (const direct of [true, false]) {
|
|
843
|
+
await app._serverTeamUserPermissionsCache.refresh([scope.id, json.id, "team", direct]);
|
|
844
|
+
}
|
|
845
|
+
},
|
|
846
|
+
async getTeam(teamId) {
|
|
847
|
+
const teams = await this.listTeams();
|
|
848
|
+
return teams.find((t) => t.id === teamId) ?? null;
|
|
849
|
+
},
|
|
850
|
+
useTeam(teamId) {
|
|
851
|
+
const teams = this.useTeams();
|
|
852
|
+
return (0, import_react.useMemo)(() => {
|
|
853
|
+
return teams.find((t) => t.id === teamId) ?? null;
|
|
854
|
+
}, [teams, teamId]);
|
|
855
|
+
},
|
|
856
|
+
onTeamChange(teamId, callback) {
|
|
857
|
+
return this.onTeamsChange((teams) => {
|
|
858
|
+
const team = teams.find((t) => t.id === teamId) ?? null;
|
|
859
|
+
callback(team);
|
|
860
|
+
});
|
|
861
|
+
},
|
|
862
|
+
async listTeams() {
|
|
863
|
+
const teams = await app._serverTeamsCache.getOrWait([getTokenStore(app._tokenStoreOptions)], "write-only");
|
|
864
|
+
return teams.map((json2) => app._serverTeamFromJson(json2));
|
|
865
|
+
},
|
|
866
|
+
useTeams() {
|
|
867
|
+
const teams = useCache(app._serverTeamsCache, [getTokenStore(app._tokenStoreOptions)], "user.useTeams()");
|
|
868
|
+
return (0, import_react.useMemo)(() => teams.map((json2) => app._serverTeamFromJson(json2)), [teams]);
|
|
869
|
+
},
|
|
870
|
+
onTeamsChange(callback) {
|
|
871
|
+
return app._serverTeamsCache.onChange([getTokenStore(app._tokenStoreOptions)], (value, oldValue) => {
|
|
872
|
+
callback(value.map((json2) => app._serverTeamFromJson(json2)), oldValue?.map((json2) => app._serverTeamFromJson(json2)));
|
|
873
|
+
});
|
|
874
|
+
},
|
|
875
|
+
async listPermissions(scope, options) {
|
|
876
|
+
const permissions = await app._serverTeamUserPermissionsCache.getOrWait([scope.id, json.id, "team", !!options?.direct], "write-only");
|
|
877
|
+
return permissions.map((json2) => app._serverPermissionFromJson(json2));
|
|
878
|
+
},
|
|
879
|
+
usePermissions(scope, options) {
|
|
880
|
+
const permissions = useCache(app._serverTeamUserPermissionsCache, [scope.id, json.id, "team", !!options?.direct], "user.usePermissions()");
|
|
881
|
+
return (0, import_react.useMemo)(() => permissions.map((json2) => app._serverPermissionFromJson(json2)), [permissions]);
|
|
882
|
+
},
|
|
883
|
+
usePermission(scope, permissionId) {
|
|
884
|
+
const permissions = this.usePermissions(scope);
|
|
885
|
+
return (0, import_react.useMemo)(() => permissions.find((p) => p.id === permissionId) ?? null, [permissions, permissionId]);
|
|
886
|
+
},
|
|
887
|
+
async getPermission(scope, permissionId) {
|
|
888
|
+
const permissions = await this.listPermissions(scope);
|
|
889
|
+
return permissions.find((p) => p.id === permissionId) ?? null;
|
|
890
|
+
},
|
|
891
|
+
async hasPermission(scope, permissionId) {
|
|
892
|
+
const permissions = await this.listPermissions(scope);
|
|
893
|
+
return permissions.some((p) => p.id === permissionId);
|
|
894
|
+
},
|
|
724
895
|
toJson() {
|
|
725
896
|
return app._serverUserToJson(this);
|
|
726
897
|
}
|
|
@@ -780,6 +951,20 @@ var _StackServerAppImpl = class extends _StackClientAppImpl {
|
|
|
780
951
|
return currentUser;
|
|
781
952
|
}
|
|
782
953
|
}
|
|
954
|
+
_serverTeamMemberFromJson(json) {
|
|
955
|
+
if (json === null)
|
|
956
|
+
return null;
|
|
957
|
+
const app = this;
|
|
958
|
+
return {
|
|
959
|
+
...app._teamMemberFromJson(json),
|
|
960
|
+
async getUser() {
|
|
961
|
+
const user = app._serverUserFromJson(await app._serverUserCache.getOrWait([json.userId], "write-only"));
|
|
962
|
+
if (!user)
|
|
963
|
+
throw new Error(`User ${json.userId} not found`);
|
|
964
|
+
return user;
|
|
965
|
+
}
|
|
966
|
+
};
|
|
967
|
+
}
|
|
783
968
|
_serverUserToJson(user) {
|
|
784
969
|
return {
|
|
785
970
|
projectId: user.projectId,
|
|
@@ -797,12 +982,56 @@ var _StackServerAppImpl = class extends _StackClientAppImpl {
|
|
|
797
982
|
oauthProviders: user.oauthProviders
|
|
798
983
|
};
|
|
799
984
|
}
|
|
985
|
+
_serverTeamFromJson(json) {
|
|
986
|
+
const app = this;
|
|
987
|
+
return {
|
|
988
|
+
id: json.id,
|
|
989
|
+
displayName: json.displayName,
|
|
990
|
+
createdAt: new Date(json.createdAtMillis),
|
|
991
|
+
async listMembers() {
|
|
992
|
+
return (await app._interface.listTeamMembers(json.id)).map((u) => app._serverTeamMemberFromJson(u));
|
|
993
|
+
},
|
|
994
|
+
async update(update) {
|
|
995
|
+
await app._interface.updateTeam(json.id, update);
|
|
996
|
+
await app._serverTeamsCache.refresh([]);
|
|
997
|
+
},
|
|
998
|
+
async delete() {
|
|
999
|
+
await app._interface.deleteTeam(json.id);
|
|
1000
|
+
await app._serverTeamsCache.refresh([]);
|
|
1001
|
+
},
|
|
1002
|
+
useMembers() {
|
|
1003
|
+
const result = useCache(app._serverTeamMembersCache, [json.id], "team.useUsers()");
|
|
1004
|
+
return (0, import_react.useMemo)(() => result.map((u) => app._serverTeamMemberFromJson(u)), [result]);
|
|
1005
|
+
},
|
|
1006
|
+
async addUser(userId) {
|
|
1007
|
+
await app._interface.addUserToTeam({
|
|
1008
|
+
teamId: json.id,
|
|
1009
|
+
userId
|
|
1010
|
+
});
|
|
1011
|
+
await app._serverTeamMembersCache.refresh([json.id]);
|
|
1012
|
+
},
|
|
1013
|
+
async removeUser(userId) {
|
|
1014
|
+
await app._interface.removeUserFromTeam({
|
|
1015
|
+
teamId: json.id,
|
|
1016
|
+
userId
|
|
1017
|
+
});
|
|
1018
|
+
await app._serverTeamMembersCache.refresh([json.id]);
|
|
1019
|
+
},
|
|
1020
|
+
toJson() {
|
|
1021
|
+
return json;
|
|
1022
|
+
}
|
|
1023
|
+
};
|
|
1024
|
+
}
|
|
800
1025
|
async getServerUser() {
|
|
801
1026
|
this._ensurePersistentTokenStore();
|
|
802
1027
|
const tokenStore = getTokenStore(this._tokenStoreOptions);
|
|
803
1028
|
const userJson = await this._currentServerUserCache.getOrWait([tokenStore], "write-only");
|
|
804
1029
|
return this._currentServerUserFromJson(userJson, tokenStore);
|
|
805
1030
|
}
|
|
1031
|
+
async getServerUserById(userId) {
|
|
1032
|
+
const json = await this._serverUserCache.getOrWait([userId], "write-only");
|
|
1033
|
+
return this._serverUserFromJson(json);
|
|
1034
|
+
}
|
|
806
1035
|
useServerUser(options) {
|
|
807
1036
|
this._ensurePersistentTokenStore();
|
|
808
1037
|
const tokenStore = getTokenStore(this._tokenStoreOptions);
|
|
@@ -836,6 +1065,58 @@ var _StackServerAppImpl = class extends _StackClientAppImpl {
|
|
|
836
1065
|
callback(users.map((j) => this._serverUserFromJson(j)));
|
|
837
1066
|
});
|
|
838
1067
|
}
|
|
1068
|
+
async listPermissionDefinitions() {
|
|
1069
|
+
return await this._serverTeamPermissionDefinitionsCache.getOrWait([], "write-only");
|
|
1070
|
+
}
|
|
1071
|
+
usePermissionDefinitions() {
|
|
1072
|
+
return useCache(this._serverTeamPermissionDefinitionsCache, [], "usePermissions()");
|
|
1073
|
+
}
|
|
1074
|
+
_serverPermissionFromJson(json) {
|
|
1075
|
+
return {
|
|
1076
|
+
...this._permissionFromJson(json),
|
|
1077
|
+
__databaseUniqueId: json.__databaseUniqueId,
|
|
1078
|
+
description: json.description,
|
|
1079
|
+
containPermissionIds: json.containPermissionIds
|
|
1080
|
+
};
|
|
1081
|
+
}
|
|
1082
|
+
async createPermissionDefinition(data) {
|
|
1083
|
+
const permission = await this._serverPermissionFromJson(await this._interface.createPermissionDefinition(data));
|
|
1084
|
+
await this._serverTeamPermissionDefinitionsCache.refresh([]);
|
|
1085
|
+
return permission;
|
|
1086
|
+
}
|
|
1087
|
+
async updatePermissionDefinition(permissionId, data) {
|
|
1088
|
+
await this._interface.updatePermissionDefinition(permissionId, data);
|
|
1089
|
+
await this._serverTeamPermissionDefinitionsCache.refresh([]);
|
|
1090
|
+
}
|
|
1091
|
+
async deletePermissionDefinition(permissionId) {
|
|
1092
|
+
await this._interface.deletePermissionDefinition(permissionId);
|
|
1093
|
+
await this._serverTeamPermissionDefinitionsCache.refresh([]);
|
|
1094
|
+
}
|
|
1095
|
+
async listTeams() {
|
|
1096
|
+
const teams = await this._serverTeamsCache.getOrWait([], "write-only");
|
|
1097
|
+
return teams.map((t) => this._serverTeamFromJson(t));
|
|
1098
|
+
}
|
|
1099
|
+
async createTeam(data) {
|
|
1100
|
+
const team = await this._interface.createTeam(data);
|
|
1101
|
+
await this._serverTeamsCache.refresh([]);
|
|
1102
|
+
return this._serverTeamFromJson(team);
|
|
1103
|
+
}
|
|
1104
|
+
useTeams() {
|
|
1105
|
+
const teams = useCache(this._serverTeamsCache, [], "useServerTeams()");
|
|
1106
|
+
return (0, import_react.useMemo)(() => {
|
|
1107
|
+
return teams.map((t) => this._serverTeamFromJson(t));
|
|
1108
|
+
}, [teams]);
|
|
1109
|
+
}
|
|
1110
|
+
async getTeam(teamId) {
|
|
1111
|
+
const teams = await this.listTeams();
|
|
1112
|
+
return teams.find((t) => t.id === teamId) ?? null;
|
|
1113
|
+
}
|
|
1114
|
+
useTeam(teamId) {
|
|
1115
|
+
const teams = this.useTeams();
|
|
1116
|
+
return (0, import_react.useMemo)(() => {
|
|
1117
|
+
return teams.find((t) => t.id === teamId) ?? null;
|
|
1118
|
+
}, [teams, teamId]);
|
|
1119
|
+
}
|
|
839
1120
|
async _refreshUser(tokenStore) {
|
|
840
1121
|
await Promise.all([
|
|
841
1122
|
super._refreshUser(tokenStore),
|
|
@@ -978,3 +1259,4 @@ var StackAdminApp = _StackAdminAppImpl;
|
|
|
978
1259
|
StackServerApp,
|
|
979
1260
|
stackAppInternalsSymbol
|
|
980
1261
|
});
|
|
1262
|
+
//# sourceMappingURL=stack-app.js.map
|