@stackframe/js 2.7.29 → 2.8.1
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/CHANGELOG.md +31 -0
- package/dist/esm/lib/stack-app/apps/implementations/admin-app-impl.js +27 -6
- package/dist/esm/lib/stack-app/apps/implementations/admin-app-impl.js.map +1 -1
- package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.js +65 -12
- package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.js.map +1 -1
- package/dist/esm/lib/stack-app/apps/implementations/common.js +1 -1
- package/dist/esm/lib/stack-app/apps/implementations/common.js.map +1 -1
- package/dist/esm/lib/stack-app/apps/implementations/server-app-impl.js +53 -11
- package/dist/esm/lib/stack-app/apps/implementations/server-app-impl.js.map +1 -1
- package/dist/esm/lib/stack-app/apps/interfaces/admin-app.js.map +1 -1
- package/dist/esm/lib/stack-app/apps/interfaces/client-app.js.map +1 -1
- package/dist/esm/lib/stack-app/apps/interfaces/server-app.js.map +1 -1
- package/dist/esm/lib/stack-app/common.js.map +1 -1
- package/dist/esm/lib/stack-app/index.js.map +1 -1
- package/dist/esm/lib/stack-app/permissions/index.js +16 -0
- package/dist/esm/lib/stack-app/permissions/index.js.map +1 -1
- package/dist/esm/lib/stack-app/projects/index.js +1 -0
- package/dist/esm/lib/stack-app/projects/index.js.map +1 -1
- package/dist/esm/lib/stack-app/users/index.js.map +1 -1
- package/dist/index.d.mts +52 -3
- package/dist/index.d.ts +52 -3
- package/dist/lib/stack-app/apps/implementations/admin-app-impl.js +26 -5
- package/dist/lib/stack-app/apps/implementations/admin-app-impl.js.map +1 -1
- package/dist/lib/stack-app/apps/implementations/client-app-impl.js +65 -12
- package/dist/lib/stack-app/apps/implementations/client-app-impl.js.map +1 -1
- package/dist/lib/stack-app/apps/implementations/common.js +1 -1
- package/dist/lib/stack-app/apps/implementations/common.js.map +1 -1
- package/dist/lib/stack-app/apps/implementations/server-app-impl.js +53 -11
- package/dist/lib/stack-app/apps/implementations/server-app-impl.js.map +1 -1
- package/dist/lib/stack-app/apps/interfaces/admin-app.js.map +1 -1
- package/dist/lib/stack-app/apps/interfaces/client-app.js.map +1 -1
- package/dist/lib/stack-app/apps/interfaces/server-app.js.map +1 -1
- package/dist/lib/stack-app/common.js.map +1 -1
- package/dist/lib/stack-app/index.js.map +1 -1
- package/dist/lib/stack-app/permissions/index.js +18 -0
- package/dist/lib/stack-app/permissions/index.js.map +1 -1
- package/dist/lib/stack-app/project-configs/index.js.map +1 -1
- package/dist/lib/stack-app/projects/index.js +1 -0
- package/dist/lib/stack-app/projects/index.js.map +1 -1
- package/dist/lib/stack-app/users/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.d.mts
CHANGED
|
@@ -29,7 +29,7 @@ type RedirectMethod = "window" | "none" | {
|
|
|
29
29
|
navigate?: (to: string) => void;
|
|
30
30
|
};
|
|
31
31
|
type GetUserOptions<HasTokenStore> = {
|
|
32
|
-
or?: 'redirect' | 'throw' | 'return-null';
|
|
32
|
+
or?: 'redirect' | 'throw' | 'return-null' | 'anonymous' | 'anonymous-if-exists';
|
|
33
33
|
tokenStore?: TokenStoreInit;
|
|
34
34
|
} & (HasTokenStore extends false ? {
|
|
35
35
|
tokenStore: TokenStoreInit;
|
|
@@ -130,13 +130,30 @@ type AdminTeamPermissionDefinition = {
|
|
|
130
130
|
id: string;
|
|
131
131
|
description?: string;
|
|
132
132
|
containedPermissionIds: string[];
|
|
133
|
+
isDefaultUserPermission?: boolean;
|
|
133
134
|
};
|
|
134
135
|
type AdminTeamPermissionDefinitionCreateOptions = {
|
|
135
136
|
id: string;
|
|
136
137
|
description?: string;
|
|
137
138
|
containedPermissionIds: string[];
|
|
139
|
+
isDefaultUserPermission?: boolean;
|
|
138
140
|
};
|
|
139
141
|
type AdminTeamPermissionDefinitionUpdateOptions = Partial<AdminTeamPermissionDefinitionCreateOptions>;
|
|
142
|
+
type ProjectPermission = {
|
|
143
|
+
id: string;
|
|
144
|
+
};
|
|
145
|
+
type AdminProjectPermission = ProjectPermission;
|
|
146
|
+
type AdminProjectPermissionDefinition = {
|
|
147
|
+
id: string;
|
|
148
|
+
description?: string;
|
|
149
|
+
containedPermissionIds: string[];
|
|
150
|
+
};
|
|
151
|
+
type AdminProjectPermissionDefinitionCreateOptions = {
|
|
152
|
+
id: string;
|
|
153
|
+
description?: string;
|
|
154
|
+
containedPermissionIds: string[];
|
|
155
|
+
};
|
|
156
|
+
type AdminProjectPermissionDefinitionUpdateOptions = Partial<AdminProjectPermissionDefinitionCreateOptions>;
|
|
140
157
|
|
|
141
158
|
type Connection = {
|
|
142
159
|
id: string;
|
|
@@ -352,6 +369,15 @@ type UserExtra = {
|
|
|
352
369
|
scopes?: string[];
|
|
353
370
|
}): Promise<OAuthConnection | null>;
|
|
354
371
|
hasPermission(scope: Team, permissionId: string): Promise<boolean>;
|
|
372
|
+
hasPermission(permissionId: string): Promise<boolean>;
|
|
373
|
+
getPermission(scope: Team, permissionId: string): Promise<TeamPermission | null>;
|
|
374
|
+
getPermission(permissionId: string): Promise<TeamPermission | null>;
|
|
375
|
+
listPermissions(scope: Team, options?: {
|
|
376
|
+
recursive?: boolean;
|
|
377
|
+
}): Promise<TeamPermission[]>;
|
|
378
|
+
listPermissions(options?: {
|
|
379
|
+
recursive?: boolean;
|
|
380
|
+
}): Promise<TeamPermission[]>;
|
|
355
381
|
readonly selectedTeam: Team | null;
|
|
356
382
|
setSelectedTeam(team: Team | null): Promise<void>;
|
|
357
383
|
createTeam(data: TeamCreateOptions): Promise<Team>;
|
|
@@ -405,6 +431,16 @@ type ServerBaseUser = {
|
|
|
405
431
|
update(user: ServerUserUpdateOptions): Promise<void>;
|
|
406
432
|
grantPermission(scope: Team, permissionId: string): Promise<void>;
|
|
407
433
|
revokePermission(scope: Team, permissionId: string): Promise<void>;
|
|
434
|
+
getPermission(scope: Team, permissionId: string): Promise<TeamPermission | null>;
|
|
435
|
+
getPermission(permissionId: string): Promise<TeamPermission | null>;
|
|
436
|
+
hasPermission(scope: Team, permissionId: string): Promise<boolean>;
|
|
437
|
+
hasPermission(permissionId: string): Promise<boolean>;
|
|
438
|
+
listPermissions(scope: Team, options?: {
|
|
439
|
+
recursive?: boolean;
|
|
440
|
+
}): Promise<TeamPermission[]>;
|
|
441
|
+
listPermissions(options?: {
|
|
442
|
+
recursive?: boolean;
|
|
443
|
+
}): Promise<TeamPermission[]>;
|
|
408
444
|
/**
|
|
409
445
|
* Creates a new session object with a refresh token for this user. Can be used to impersonate them.
|
|
410
446
|
*/
|
|
@@ -542,6 +578,9 @@ type StackServerApp<HasTokenStore extends boolean = boolean, ProjectId extends s
|
|
|
542
578
|
getUser(options: GetUserOptions<HasTokenStore> & {
|
|
543
579
|
or: 'throw';
|
|
544
580
|
}): Promise<ProjectCurrentServerUser<ProjectId>>;
|
|
581
|
+
getUser(options: GetUserOptions<HasTokenStore> & {
|
|
582
|
+
or: 'anonymous';
|
|
583
|
+
}): Promise<ProjectCurrentServerUser<ProjectId>>;
|
|
545
584
|
getUser(options?: GetUserOptions<HasTokenStore>): Promise<ProjectCurrentServerUser<ProjectId> | null>;
|
|
546
585
|
getUser(id: string): Promise<ServerUser | null>;
|
|
547
586
|
listUsers(options?: ServerListUsersOptions): Promise<ServerUser[] & {
|
|
@@ -559,7 +598,7 @@ type StackAdminAppConstructor = {
|
|
|
559
598
|
new <HasTokenStore extends boolean, ProjectId extends string>(options: StackAdminAppConstructorOptions<HasTokenStore, ProjectId>): StackAdminApp<HasTokenStore, ProjectId>;
|
|
560
599
|
new (options: StackAdminAppConstructorOptions<boolean, string>): StackAdminApp<boolean, string>;
|
|
561
600
|
};
|
|
562
|
-
type StackAdminApp<HasTokenStore extends boolean = boolean, ProjectId extends string = string> = (AsyncStoreProperty<"project", [], AdminProject, false> & AsyncStoreProperty<"apiKeys", [], ApiKey[], true> & AsyncStoreProperty<"teamPermissionDefinitions", [], AdminTeamPermissionDefinition[], true> & {
|
|
601
|
+
type StackAdminApp<HasTokenStore extends boolean = boolean, ProjectId extends string = string> = (AsyncStoreProperty<"project", [], AdminProject, false> & AsyncStoreProperty<"apiKeys", [], ApiKey[], true> & AsyncStoreProperty<"teamPermissionDefinitions", [], AdminTeamPermissionDefinition[], true> & AsyncStoreProperty<"projectPermissionDefinitions", [], AdminProjectPermissionDefinition[], true> & {
|
|
563
602
|
listEmailTemplates(): Promise<AdminEmailTemplate[]>;
|
|
564
603
|
updateEmailTemplate(type: EmailTemplateType, data: AdminEmailTemplateUpdateOptions): Promise<void>;
|
|
565
604
|
resetEmailTemplate(type: EmailTemplateType): Promise<void>;
|
|
@@ -567,6 +606,9 @@ type StackAdminApp<HasTokenStore extends boolean = boolean, ProjectId extends st
|
|
|
567
606
|
createTeamPermissionDefinition(data: AdminTeamPermissionDefinitionCreateOptions): Promise<AdminTeamPermission>;
|
|
568
607
|
updateTeamPermissionDefinition(permissionId: string, data: AdminTeamPermissionDefinitionUpdateOptions): Promise<void>;
|
|
569
608
|
deleteTeamPermissionDefinition(permissionId: string): Promise<void>;
|
|
609
|
+
createProjectPermissionDefinition(data: AdminProjectPermissionDefinitionCreateOptions): Promise<AdminProjectPermission>;
|
|
610
|
+
updateProjectPermissionDefinition(permissionId: string, data: AdminProjectPermissionDefinitionUpdateOptions): Promise<void>;
|
|
611
|
+
deleteProjectPermissionDefinition(permissionId: string): Promise<void>;
|
|
570
612
|
sendTestEmail(options: {
|
|
571
613
|
recipientEmail: string;
|
|
572
614
|
emailConfig: EmailConfig;
|
|
@@ -604,6 +646,7 @@ type AdminProjectConfig = {
|
|
|
604
646
|
readonly createTeamOnSignUp: boolean;
|
|
605
647
|
readonly teamCreatorDefaultPermissions: AdminTeamPermission[];
|
|
606
648
|
readonly teamMemberDefaultPermissions: AdminTeamPermission[];
|
|
649
|
+
readonly userDefaultPermissions: AdminTeamPermission[];
|
|
607
650
|
readonly oauthAccountMergeStrategy: 'link_method' | 'raise_error' | 'allow_duplicates';
|
|
608
651
|
};
|
|
609
652
|
type AdminEmailConfig = ({
|
|
@@ -654,6 +697,9 @@ type AdminProjectConfigUpdateOptions = {
|
|
|
654
697
|
teamMemberDefaultPermissions?: {
|
|
655
698
|
id: string;
|
|
656
699
|
}[];
|
|
700
|
+
userDefaultPermissions?: {
|
|
701
|
+
id: string;
|
|
702
|
+
}[];
|
|
657
703
|
oauthAccountMergeStrategy?: 'link_method' | 'raise_error' | 'allow_duplicates';
|
|
658
704
|
};
|
|
659
705
|
|
|
@@ -763,6 +809,9 @@ type StackClientApp<HasTokenStore extends boolean = boolean, ProjectId extends s
|
|
|
763
809
|
getUser(options: GetUserOptions<HasTokenStore> & {
|
|
764
810
|
or: 'throw';
|
|
765
811
|
}): Promise<ProjectCurrentUser<ProjectId>>;
|
|
812
|
+
getUser(options: GetUserOptions<HasTokenStore> & {
|
|
813
|
+
or: 'anonymous';
|
|
814
|
+
}): Promise<ProjectCurrentUser<ProjectId>>;
|
|
766
815
|
getUser(options?: GetUserOptions<HasTokenStore>): Promise<ProjectCurrentUser<ProjectId> | null>;
|
|
767
816
|
[stackAppInternalsSymbol]: {
|
|
768
817
|
toClientJson(): StackClientAppJson<HasTokenStore, ProjectId>;
|
|
@@ -773,4 +822,4 @@ type StackClientApp<HasTokenStore extends boolean = boolean, ProjectId extends s
|
|
|
773
822
|
});
|
|
774
823
|
declare const StackClientApp: StackClientAppConstructor;
|
|
775
824
|
|
|
776
|
-
export { type AdminDomainConfig, type AdminEmailConfig, type AdminOAuthProviderConfig, type AdminOwnedProject, type AdminProject, type AdminProjectConfig, type AdminProjectConfigUpdateOptions, type AdminProjectCreateOptions, type AdminProjectUpdateOptions, type AdminSentEmail, type AdminTeamPermission, type AdminTeamPermissionDefinition, type AdminTeamPermissionDefinitionCreateOptions, type AdminTeamPermissionDefinitionUpdateOptions, type ApiKey, type ApiKeyBase, type ApiKeyBaseCrudRead, type ApiKeyCreateOptions, type ApiKeyFirstView, type Auth, type Connection, type ContactChannel, type CurrentInternalServerUser, type CurrentInternalUser, type CurrentServerUser, type CurrentUser, type EditableTeamMemberProfile, type GetUserOptions, type HandlerUrls, type OAuthConnection, type OAuthProviderConfig, type OAuthScopesOnSignIn, type Project, type ProjectConfig, type ServerContactChannel, type ServerListUsersOptions, type ServerTeam, type ServerTeamCreateOptions, type ServerTeamMemberProfile, type ServerTeamUpdateOptions, type ServerTeamUser, type ServerUser, type Session, StackAdminApp, type StackAdminAppConstructor, type StackAdminAppConstructorOptions, StackClientApp, type StackClientAppConstructor, type StackClientAppConstructorOptions, type StackClientAppJson, StackServerApp, type StackServerAppConstructor, type StackServerAppConstructorOptions, type Team, type TeamCreateOptions, type TeamInvitation, type TeamMemberProfile, type
|
|
825
|
+
export { type AdminDomainConfig, type AdminEmailConfig, type AdminOAuthProviderConfig, type AdminOwnedProject, type AdminProject, type AdminProjectConfig, type AdminProjectConfigUpdateOptions, type AdminProjectCreateOptions, type AdminProjectPermission, type AdminProjectPermissionDefinition, type AdminProjectPermissionDefinitionCreateOptions, type AdminProjectPermissionDefinitionUpdateOptions, type AdminProjectUpdateOptions, type AdminSentEmail, type AdminTeamPermission, type AdminTeamPermissionDefinition, type AdminTeamPermissionDefinitionCreateOptions, type AdminTeamPermissionDefinitionUpdateOptions, type ApiKey, type ApiKeyBase, type ApiKeyBaseCrudRead, type ApiKeyCreateOptions, type ApiKeyFirstView, type Auth, type Connection, type ContactChannel, type CurrentInternalServerUser, type CurrentInternalUser, type CurrentServerUser, type CurrentUser, type EditableTeamMemberProfile, type GetUserOptions, type HandlerUrls, type OAuthConnection, type OAuthProviderConfig, type OAuthScopesOnSignIn, type Project, type ProjectConfig, type ServerContactChannel, type ServerListUsersOptions, type ServerTeam, type ServerTeamCreateOptions, type ServerTeamMemberProfile, type ServerTeamUpdateOptions, type ServerTeamUser, type ServerUser, type Session, StackAdminApp, type StackAdminAppConstructor, type StackAdminAppConstructorOptions, StackClientApp, type StackClientAppConstructor, type StackClientAppConstructorOptions, type StackClientAppJson, StackServerApp, type StackServerAppConstructor, type StackServerAppConstructorOptions, type Team, type TeamCreateOptions, type TeamInvitation, type TeamMemberProfile, type TeamUpdateOptions, type TeamUser, type User, stackAppInternalsSymbol };
|
package/dist/index.d.ts
CHANGED
|
@@ -29,7 +29,7 @@ type RedirectMethod = "window" | "none" | {
|
|
|
29
29
|
navigate?: (to: string) => void;
|
|
30
30
|
};
|
|
31
31
|
type GetUserOptions<HasTokenStore> = {
|
|
32
|
-
or?: 'redirect' | 'throw' | 'return-null';
|
|
32
|
+
or?: 'redirect' | 'throw' | 'return-null' | 'anonymous' | 'anonymous-if-exists';
|
|
33
33
|
tokenStore?: TokenStoreInit;
|
|
34
34
|
} & (HasTokenStore extends false ? {
|
|
35
35
|
tokenStore: TokenStoreInit;
|
|
@@ -130,13 +130,30 @@ type AdminTeamPermissionDefinition = {
|
|
|
130
130
|
id: string;
|
|
131
131
|
description?: string;
|
|
132
132
|
containedPermissionIds: string[];
|
|
133
|
+
isDefaultUserPermission?: boolean;
|
|
133
134
|
};
|
|
134
135
|
type AdminTeamPermissionDefinitionCreateOptions = {
|
|
135
136
|
id: string;
|
|
136
137
|
description?: string;
|
|
137
138
|
containedPermissionIds: string[];
|
|
139
|
+
isDefaultUserPermission?: boolean;
|
|
138
140
|
};
|
|
139
141
|
type AdminTeamPermissionDefinitionUpdateOptions = Partial<AdminTeamPermissionDefinitionCreateOptions>;
|
|
142
|
+
type ProjectPermission = {
|
|
143
|
+
id: string;
|
|
144
|
+
};
|
|
145
|
+
type AdminProjectPermission = ProjectPermission;
|
|
146
|
+
type AdminProjectPermissionDefinition = {
|
|
147
|
+
id: string;
|
|
148
|
+
description?: string;
|
|
149
|
+
containedPermissionIds: string[];
|
|
150
|
+
};
|
|
151
|
+
type AdminProjectPermissionDefinitionCreateOptions = {
|
|
152
|
+
id: string;
|
|
153
|
+
description?: string;
|
|
154
|
+
containedPermissionIds: string[];
|
|
155
|
+
};
|
|
156
|
+
type AdminProjectPermissionDefinitionUpdateOptions = Partial<AdminProjectPermissionDefinitionCreateOptions>;
|
|
140
157
|
|
|
141
158
|
type Connection = {
|
|
142
159
|
id: string;
|
|
@@ -352,6 +369,15 @@ type UserExtra = {
|
|
|
352
369
|
scopes?: string[];
|
|
353
370
|
}): Promise<OAuthConnection | null>;
|
|
354
371
|
hasPermission(scope: Team, permissionId: string): Promise<boolean>;
|
|
372
|
+
hasPermission(permissionId: string): Promise<boolean>;
|
|
373
|
+
getPermission(scope: Team, permissionId: string): Promise<TeamPermission | null>;
|
|
374
|
+
getPermission(permissionId: string): Promise<TeamPermission | null>;
|
|
375
|
+
listPermissions(scope: Team, options?: {
|
|
376
|
+
recursive?: boolean;
|
|
377
|
+
}): Promise<TeamPermission[]>;
|
|
378
|
+
listPermissions(options?: {
|
|
379
|
+
recursive?: boolean;
|
|
380
|
+
}): Promise<TeamPermission[]>;
|
|
355
381
|
readonly selectedTeam: Team | null;
|
|
356
382
|
setSelectedTeam(team: Team | null): Promise<void>;
|
|
357
383
|
createTeam(data: TeamCreateOptions): Promise<Team>;
|
|
@@ -405,6 +431,16 @@ type ServerBaseUser = {
|
|
|
405
431
|
update(user: ServerUserUpdateOptions): Promise<void>;
|
|
406
432
|
grantPermission(scope: Team, permissionId: string): Promise<void>;
|
|
407
433
|
revokePermission(scope: Team, permissionId: string): Promise<void>;
|
|
434
|
+
getPermission(scope: Team, permissionId: string): Promise<TeamPermission | null>;
|
|
435
|
+
getPermission(permissionId: string): Promise<TeamPermission | null>;
|
|
436
|
+
hasPermission(scope: Team, permissionId: string): Promise<boolean>;
|
|
437
|
+
hasPermission(permissionId: string): Promise<boolean>;
|
|
438
|
+
listPermissions(scope: Team, options?: {
|
|
439
|
+
recursive?: boolean;
|
|
440
|
+
}): Promise<TeamPermission[]>;
|
|
441
|
+
listPermissions(options?: {
|
|
442
|
+
recursive?: boolean;
|
|
443
|
+
}): Promise<TeamPermission[]>;
|
|
408
444
|
/**
|
|
409
445
|
* Creates a new session object with a refresh token for this user. Can be used to impersonate them.
|
|
410
446
|
*/
|
|
@@ -542,6 +578,9 @@ type StackServerApp<HasTokenStore extends boolean = boolean, ProjectId extends s
|
|
|
542
578
|
getUser(options: GetUserOptions<HasTokenStore> & {
|
|
543
579
|
or: 'throw';
|
|
544
580
|
}): Promise<ProjectCurrentServerUser<ProjectId>>;
|
|
581
|
+
getUser(options: GetUserOptions<HasTokenStore> & {
|
|
582
|
+
or: 'anonymous';
|
|
583
|
+
}): Promise<ProjectCurrentServerUser<ProjectId>>;
|
|
545
584
|
getUser(options?: GetUserOptions<HasTokenStore>): Promise<ProjectCurrentServerUser<ProjectId> | null>;
|
|
546
585
|
getUser(id: string): Promise<ServerUser | null>;
|
|
547
586
|
listUsers(options?: ServerListUsersOptions): Promise<ServerUser[] & {
|
|
@@ -559,7 +598,7 @@ type StackAdminAppConstructor = {
|
|
|
559
598
|
new <HasTokenStore extends boolean, ProjectId extends string>(options: StackAdminAppConstructorOptions<HasTokenStore, ProjectId>): StackAdminApp<HasTokenStore, ProjectId>;
|
|
560
599
|
new (options: StackAdminAppConstructorOptions<boolean, string>): StackAdminApp<boolean, string>;
|
|
561
600
|
};
|
|
562
|
-
type StackAdminApp<HasTokenStore extends boolean = boolean, ProjectId extends string = string> = (AsyncStoreProperty<"project", [], AdminProject, false> & AsyncStoreProperty<"apiKeys", [], ApiKey[], true> & AsyncStoreProperty<"teamPermissionDefinitions", [], AdminTeamPermissionDefinition[], true> & {
|
|
601
|
+
type StackAdminApp<HasTokenStore extends boolean = boolean, ProjectId extends string = string> = (AsyncStoreProperty<"project", [], AdminProject, false> & AsyncStoreProperty<"apiKeys", [], ApiKey[], true> & AsyncStoreProperty<"teamPermissionDefinitions", [], AdminTeamPermissionDefinition[], true> & AsyncStoreProperty<"projectPermissionDefinitions", [], AdminProjectPermissionDefinition[], true> & {
|
|
563
602
|
listEmailTemplates(): Promise<AdminEmailTemplate[]>;
|
|
564
603
|
updateEmailTemplate(type: EmailTemplateType, data: AdminEmailTemplateUpdateOptions): Promise<void>;
|
|
565
604
|
resetEmailTemplate(type: EmailTemplateType): Promise<void>;
|
|
@@ -567,6 +606,9 @@ type StackAdminApp<HasTokenStore extends boolean = boolean, ProjectId extends st
|
|
|
567
606
|
createTeamPermissionDefinition(data: AdminTeamPermissionDefinitionCreateOptions): Promise<AdminTeamPermission>;
|
|
568
607
|
updateTeamPermissionDefinition(permissionId: string, data: AdminTeamPermissionDefinitionUpdateOptions): Promise<void>;
|
|
569
608
|
deleteTeamPermissionDefinition(permissionId: string): Promise<void>;
|
|
609
|
+
createProjectPermissionDefinition(data: AdminProjectPermissionDefinitionCreateOptions): Promise<AdminProjectPermission>;
|
|
610
|
+
updateProjectPermissionDefinition(permissionId: string, data: AdminProjectPermissionDefinitionUpdateOptions): Promise<void>;
|
|
611
|
+
deleteProjectPermissionDefinition(permissionId: string): Promise<void>;
|
|
570
612
|
sendTestEmail(options: {
|
|
571
613
|
recipientEmail: string;
|
|
572
614
|
emailConfig: EmailConfig;
|
|
@@ -604,6 +646,7 @@ type AdminProjectConfig = {
|
|
|
604
646
|
readonly createTeamOnSignUp: boolean;
|
|
605
647
|
readonly teamCreatorDefaultPermissions: AdminTeamPermission[];
|
|
606
648
|
readonly teamMemberDefaultPermissions: AdminTeamPermission[];
|
|
649
|
+
readonly userDefaultPermissions: AdminTeamPermission[];
|
|
607
650
|
readonly oauthAccountMergeStrategy: 'link_method' | 'raise_error' | 'allow_duplicates';
|
|
608
651
|
};
|
|
609
652
|
type AdminEmailConfig = ({
|
|
@@ -654,6 +697,9 @@ type AdminProjectConfigUpdateOptions = {
|
|
|
654
697
|
teamMemberDefaultPermissions?: {
|
|
655
698
|
id: string;
|
|
656
699
|
}[];
|
|
700
|
+
userDefaultPermissions?: {
|
|
701
|
+
id: string;
|
|
702
|
+
}[];
|
|
657
703
|
oauthAccountMergeStrategy?: 'link_method' | 'raise_error' | 'allow_duplicates';
|
|
658
704
|
};
|
|
659
705
|
|
|
@@ -763,6 +809,9 @@ type StackClientApp<HasTokenStore extends boolean = boolean, ProjectId extends s
|
|
|
763
809
|
getUser(options: GetUserOptions<HasTokenStore> & {
|
|
764
810
|
or: 'throw';
|
|
765
811
|
}): Promise<ProjectCurrentUser<ProjectId>>;
|
|
812
|
+
getUser(options: GetUserOptions<HasTokenStore> & {
|
|
813
|
+
or: 'anonymous';
|
|
814
|
+
}): Promise<ProjectCurrentUser<ProjectId>>;
|
|
766
815
|
getUser(options?: GetUserOptions<HasTokenStore>): Promise<ProjectCurrentUser<ProjectId> | null>;
|
|
767
816
|
[stackAppInternalsSymbol]: {
|
|
768
817
|
toClientJson(): StackClientAppJson<HasTokenStore, ProjectId>;
|
|
@@ -773,4 +822,4 @@ type StackClientApp<HasTokenStore extends boolean = boolean, ProjectId extends s
|
|
|
773
822
|
});
|
|
774
823
|
declare const StackClientApp: StackClientAppConstructor;
|
|
775
824
|
|
|
776
|
-
export { type AdminDomainConfig, type AdminEmailConfig, type AdminOAuthProviderConfig, type AdminOwnedProject, type AdminProject, type AdminProjectConfig, type AdminProjectConfigUpdateOptions, type AdminProjectCreateOptions, type AdminProjectUpdateOptions, type AdminSentEmail, type AdminTeamPermission, type AdminTeamPermissionDefinition, type AdminTeamPermissionDefinitionCreateOptions, type AdminTeamPermissionDefinitionUpdateOptions, type ApiKey, type ApiKeyBase, type ApiKeyBaseCrudRead, type ApiKeyCreateOptions, type ApiKeyFirstView, type Auth, type Connection, type ContactChannel, type CurrentInternalServerUser, type CurrentInternalUser, type CurrentServerUser, type CurrentUser, type EditableTeamMemberProfile, type GetUserOptions, type HandlerUrls, type OAuthConnection, type OAuthProviderConfig, type OAuthScopesOnSignIn, type Project, type ProjectConfig, type ServerContactChannel, type ServerListUsersOptions, type ServerTeam, type ServerTeamCreateOptions, type ServerTeamMemberProfile, type ServerTeamUpdateOptions, type ServerTeamUser, type ServerUser, type Session, StackAdminApp, type StackAdminAppConstructor, type StackAdminAppConstructorOptions, StackClientApp, type StackClientAppConstructor, type StackClientAppConstructorOptions, type StackClientAppJson, StackServerApp, type StackServerAppConstructor, type StackServerAppConstructorOptions, type Team, type TeamCreateOptions, type TeamInvitation, type TeamMemberProfile, type
|
|
825
|
+
export { type AdminDomainConfig, type AdminEmailConfig, type AdminOAuthProviderConfig, type AdminOwnedProject, type AdminProject, type AdminProjectConfig, type AdminProjectConfigUpdateOptions, type AdminProjectCreateOptions, type AdminProjectPermission, type AdminProjectPermissionDefinition, type AdminProjectPermissionDefinitionCreateOptions, type AdminProjectPermissionDefinitionUpdateOptions, type AdminProjectUpdateOptions, type AdminSentEmail, type AdminTeamPermission, type AdminTeamPermissionDefinition, type AdminTeamPermissionDefinitionCreateOptions, type AdminTeamPermissionDefinitionUpdateOptions, type ApiKey, type ApiKeyBase, type ApiKeyBaseCrudRead, type ApiKeyCreateOptions, type ApiKeyFirstView, type Auth, type Connection, type ContactChannel, type CurrentInternalServerUser, type CurrentInternalUser, type CurrentServerUser, type CurrentUser, type EditableTeamMemberProfile, type GetUserOptions, type HandlerUrls, type OAuthConnection, type OAuthProviderConfig, type OAuthScopesOnSignIn, type Project, type ProjectConfig, type ServerContactChannel, type ServerListUsersOptions, type ServerTeam, type ServerTeamCreateOptions, type ServerTeamMemberProfile, type ServerTeamUpdateOptions, type ServerTeamUser, type ServerUser, type Session, StackAdminApp, type StackAdminAppConstructor, type StackAdminAppConstructorOptions, StackClientApp, type StackClientAppConstructor, type StackClientAppConstructorOptions, type StackClientAppJson, StackServerApp, type StackServerAppConstructor, type StackServerAppConstructorOptions, type Team, type TeamCreateOptions, type TeamInvitation, type TeamMemberProfile, type TeamUpdateOptions, type TeamUser, type User, stackAppInternalsSymbol };
|
|
@@ -69,7 +69,10 @@ var _StackAdminAppImplIncomplete = class extends import_server_app_impl._StackSe
|
|
|
69
69
|
return await this._interface.listEmailTemplates();
|
|
70
70
|
});
|
|
71
71
|
this._adminTeamPermissionDefinitionsCache = (0, import_common2.createCache)(async () => {
|
|
72
|
-
return await this._interface.
|
|
72
|
+
return await this._interface.listTeamPermissionDefinitions();
|
|
73
|
+
});
|
|
74
|
+
this._adminProjectPermissionDefinitionsCache = (0, import_common2.createCache)(async () => {
|
|
75
|
+
return await this._interface.listProjectPermissionDefinitions();
|
|
73
76
|
});
|
|
74
77
|
this._svixTokenCache = (0, import_common2.createCache)(async () => {
|
|
75
78
|
return await this._interface.getSvixToken();
|
|
@@ -140,7 +143,8 @@ var _StackAdminAppImplIncomplete = class extends import_server_app_impl._StackSe
|
|
|
140
143
|
})),
|
|
141
144
|
createTeamOnSignUp: data.config.create_team_on_sign_up,
|
|
142
145
|
teamCreatorDefaultPermissions: data.config.team_creator_default_permissions,
|
|
143
|
-
teamMemberDefaultPermissions: data.config.team_member_default_permissions
|
|
146
|
+
teamMemberDefaultPermissions: data.config.team_member_default_permissions,
|
|
147
|
+
userDefaultPermissions: data.config.user_default_permissions
|
|
144
148
|
},
|
|
145
149
|
async update(update) {
|
|
146
150
|
await app._interface.updateProject((0, import_projects.adminProjectUpdateOptionsToCrud)(update));
|
|
@@ -232,22 +236,39 @@ var _StackAdminAppImplIncomplete = class extends import_server_app_impl._StackSe
|
|
|
232
236
|
await this._adminEmailTemplatesCache.refresh([]);
|
|
233
237
|
}
|
|
234
238
|
async createTeamPermissionDefinition(data) {
|
|
235
|
-
const crud = await this._interface.
|
|
239
|
+
const crud = await this._interface.createTeamPermissionDefinition((0, import_permissions.adminTeamPermissionDefinitionCreateOptionsToCrud)(data));
|
|
236
240
|
await this._adminTeamPermissionDefinitionsCache.refresh([]);
|
|
237
241
|
return this._serverTeamPermissionDefinitionFromCrud(crud);
|
|
238
242
|
}
|
|
239
243
|
async updateTeamPermissionDefinition(permissionId, data) {
|
|
240
|
-
await this._interface.
|
|
244
|
+
await this._interface.updateTeamPermissionDefinition(permissionId, (0, import_permissions.adminTeamPermissionDefinitionUpdateOptionsToCrud)(data));
|
|
241
245
|
await this._adminTeamPermissionDefinitionsCache.refresh([]);
|
|
242
246
|
}
|
|
243
247
|
async deleteTeamPermissionDefinition(permissionId) {
|
|
244
|
-
await this._interface.
|
|
248
|
+
await this._interface.deleteTeamPermissionDefinition(permissionId);
|
|
245
249
|
await this._adminTeamPermissionDefinitionsCache.refresh([]);
|
|
246
250
|
}
|
|
247
251
|
async listTeamPermissionDefinitions() {
|
|
248
252
|
const crud = import_results.Result.orThrow(await this._adminTeamPermissionDefinitionsCache.getOrWait([], "write-only"));
|
|
249
253
|
return crud.map((p) => this._serverTeamPermissionDefinitionFromCrud(p));
|
|
250
254
|
}
|
|
255
|
+
async createProjectPermissionDefinition(data) {
|
|
256
|
+
const crud = await this._interface.createProjectPermissionDefinition((0, import_permissions.adminProjectPermissionDefinitionCreateOptionsToCrud)(data));
|
|
257
|
+
await this._adminProjectPermissionDefinitionsCache.refresh([]);
|
|
258
|
+
return this._serverProjectPermissionDefinitionFromCrud(crud);
|
|
259
|
+
}
|
|
260
|
+
async updateProjectPermissionDefinition(permissionId, data) {
|
|
261
|
+
await this._interface.updateProjectPermissionDefinition(permissionId, (0, import_permissions.adminProjectPermissionDefinitionUpdateOptionsToCrud)(data));
|
|
262
|
+
await this._adminProjectPermissionDefinitionsCache.refresh([]);
|
|
263
|
+
}
|
|
264
|
+
async deleteProjectPermissionDefinition(permissionId) {
|
|
265
|
+
await this._interface.deleteProjectPermissionDefinition(permissionId);
|
|
266
|
+
await this._adminProjectPermissionDefinitionsCache.refresh([]);
|
|
267
|
+
}
|
|
268
|
+
async listProjectPermissionDefinitions() {
|
|
269
|
+
const crud = import_results.Result.orThrow(await this._adminProjectPermissionDefinitionsCache.getOrWait([], "write-only"));
|
|
270
|
+
return crud.map((p) => this._serverProjectPermissionDefinitionFromCrud(p));
|
|
271
|
+
}
|
|
251
272
|
async _refreshProject() {
|
|
252
273
|
await Promise.all([
|
|
253
274
|
super._refreshProject(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/lib/stack-app/apps/implementations/admin-app-impl.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\nimport { StackAdminInterface } from \"@stackframe/stack-shared\";\nimport { getProductionModeErrors } from \"@stackframe/stack-shared/dist/helpers/production-mode\";\nimport { ApiKeyCreateCrudResponse } from \"@stackframe/stack-shared/dist/interface/adminInterface\";\nimport { ApiKeysCrud } from \"@stackframe/stack-shared/dist/interface/crud/api-keys\";\nimport { EmailTemplateCrud, EmailTemplateType } from \"@stackframe/stack-shared/dist/interface/crud/email-templates\";\nimport { InternalProjectsCrud } from \"@stackframe/stack-shared/dist/interface/crud/projects\";\nimport { StackAssertionError, throwErr } from \"@stackframe/stack-shared/dist/utils/errors\";\nimport { pick } from \"@stackframe/stack-shared/dist/utils/objects\";\nimport { Result } from \"@stackframe/stack-shared/dist/utils/results\";\nimport { AdminSentEmail } from \"../..\";\nimport { ApiKey, ApiKeyBase, ApiKeyBaseCrudRead, ApiKeyCreateOptions, ApiKeyFirstView, apiKeyCreateOptionsToCrud } from \"../../api-keys\";\nimport { EmailConfig, stackAppInternalsSymbol } from \"../../common\";\nimport { AdminEmailTemplate, AdminEmailTemplateUpdateOptions, adminEmailTemplateUpdateOptionsToCrud } from \"../../email-templates\";\nimport { AdminTeamPermission, AdminTeamPermissionDefinition, AdminTeamPermissionDefinitionCreateOptions, AdminTeamPermissionDefinitionUpdateOptions, adminTeamPermissionDefinitionCreateOptionsToCrud, adminTeamPermissionDefinitionUpdateOptionsToCrud } from \"../../permissions\";\nimport { AdminOwnedProject, AdminProject, AdminProjectUpdateOptions, adminProjectUpdateOptionsToCrud } from \"../../projects\";\nimport { StackAdminApp, StackAdminAppConstructorOptions } from \"../interfaces/admin-app\";\nimport { clientVersion, createCache, getBaseUrl, getDefaultProjectId, getDefaultPublishableClientKey, getDefaultSecretServerKey, getDefaultSuperSecretAdminKey } from \"./common\";\nimport { _StackServerAppImplIncomplete } from \"./server-app-impl\";\n\n\nexport class _StackAdminAppImplIncomplete<HasTokenStore extends boolean, ProjectId extends string> extends _StackServerAppImplIncomplete<HasTokenStore, ProjectId> implements StackAdminApp<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 _apiKeysCache = createCache(async () => {\n return await this._interface.listApiKeys();\n });\n private readonly _adminEmailTemplatesCache = createCache(async () => {\n return await this._interface.listEmailTemplates();\n });\n private readonly _adminTeamPermissionDefinitionsCache = createCache(async () => {\n return await this._interface.listPermissionDefinitions();\n });\n private readonly _svixTokenCache = createCache(async () => {\n return await this._interface.getSvixToken();\n });\n private readonly _metricsCache = createCache(async () => {\n return await this._interface.getMetrics();\n });\n\n constructor(options: StackAdminAppConstructorOptions<HasTokenStore, ProjectId>) {\n super({\n interface: new StackAdminInterface({\n getBaseUrl: () => getBaseUrl(options.baseUrl),\n projectId: options.projectId ?? getDefaultProjectId(),\n extraRequestHeaders: options.extraRequestHeaders ?? {},\n clientVersion,\n ...\"projectOwnerSession\" in options ? {\n projectOwnerSession: options.projectOwnerSession,\n } : {\n publishableClientKey: options.publishableClientKey ?? getDefaultPublishableClientKey(),\n secretServerKey: options.secretServerKey ?? getDefaultSecretServerKey(),\n superSecretAdminKey: options.superSecretAdminKey ?? getDefaultSuperSecretAdminKey(),\n },\n }),\n baseUrl: options.baseUrl,\n extraRequestHeaders: options.extraRequestHeaders,\n projectId: options.projectId,\n tokenStore: options.tokenStore,\n urls: options.urls,\n oauthScopesOnSignIn: options.oauthScopesOnSignIn,\n redirectMethod: options.redirectMethod,\n });\n }\n\n _adminOwnedProjectFromCrud(data: InternalProjectsCrud['Admin']['Read'], onRefresh: () => Promise<void>): AdminOwnedProject {\n if (this._tokenStoreInit !== null) {\n throw new StackAssertionError(\"Owned apps must always have tokenStore === null — did you not create this project with app._createOwnedApp()?\");;\n }\n return {\n ...this._adminProjectFromCrud(data, onRefresh),\n app: this as StackAdminApp<false>,\n };\n }\n\n _adminProjectFromCrud(data: InternalProjectsCrud['Admin']['Read'], onRefresh: () => Promise<void>): AdminProject {\n if (data.id !== this.projectId) {\n throw new StackAssertionError(`The project ID of the provided project JSON (${data.id}) does not match the project ID of the app (${this.projectId})!`);\n }\n\n const app = this;\n return {\n id: data.id,\n displayName: data.display_name,\n description: data.description,\n createdAt: new Date(data.created_at_millis),\n userCount: data.user_count,\n isProductionMode: data.is_production_mode,\n config: {\n id: data.config.id,\n signUpEnabled: data.config.sign_up_enabled,\n credentialEnabled: data.config.credential_enabled,\n magicLinkEnabled: data.config.magic_link_enabled,\n passkeyEnabled: data.config.passkey_enabled,\n clientTeamCreationEnabled: data.config.client_team_creation_enabled,\n clientUserDeletionEnabled: data.config.client_user_deletion_enabled,\n allowLocalhost: data.config.allow_localhost,\n oauthAccountMergeStrategy: data.config.oauth_account_merge_strategy,\n oauthProviders: data.config.oauth_providers.map((p) => ((p.type === 'shared' ? {\n id: p.id,\n enabled: p.enabled,\n type: 'shared',\n } as const : {\n id: p.id,\n enabled: p.enabled,\n type: 'standard',\n clientId: p.client_id ?? throwErr(\"Client ID is missing\"),\n clientSecret: p.client_secret ?? throwErr(\"Client secret is missing\"),\n facebookConfigId: p.facebook_config_id,\n microsoftTenantId: p.microsoft_tenant_id,\n } as const))),\n emailConfig: data.config.email_config.type === 'shared' ? {\n type: 'shared'\n } : {\n type: 'standard',\n host: data.config.email_config.host ?? throwErr(\"Email host is missing\"),\n port: data.config.email_config.port ?? throwErr(\"Email port is missing\"),\n username: data.config.email_config.username ?? throwErr(\"Email username is missing\"),\n password: data.config.email_config.password ?? throwErr(\"Email password is missing\"),\n senderName: data.config.email_config.sender_name ?? throwErr(\"Email sender name is missing\"),\n senderEmail: data.config.email_config.sender_email ?? throwErr(\"Email sender email is missing\"),\n },\n domains: data.config.domains.map((d) => ({\n domain: d.domain,\n handlerPath: d.handler_path,\n })),\n createTeamOnSignUp: data.config.create_team_on_sign_up,\n teamCreatorDefaultPermissions: data.config.team_creator_default_permissions,\n teamMemberDefaultPermissions: data.config.team_member_default_permissions,\n },\n\n async update(update: AdminProjectUpdateOptions) {\n await app._interface.updateProject(adminProjectUpdateOptionsToCrud(update));\n await onRefresh();\n },\n async delete() {\n await app._interface.deleteProject();\n },\n async getProductionModeErrors() {\n return getProductionModeErrors(data);\n },\n useProductionModeErrors() {\n return getProductionModeErrors(data);\n },\n };\n }\n\n _adminEmailTemplateFromCrud(data: EmailTemplateCrud['Admin']['Read']): AdminEmailTemplate {\n return {\n type: data.type,\n subject: data.subject,\n content: data.content,\n isDefault: data.is_default,\n };\n }\n\n override async getProject(): Promise<AdminProject> {\n return this._adminProjectFromCrud(\n Result.orThrow(await this._adminProjectCache.getOrWait([], \"write-only\")),\n () => this._refreshProject()\n );\n }\n\n\n protected _createApiKeyBaseFromCrud(data: ApiKeyBaseCrudRead): ApiKeyBase {\n const app = this;\n return {\n id: data.id,\n description: data.description,\n expiresAt: new Date(data.expires_at_millis),\n manuallyRevokedAt: data.manually_revoked_at_millis ? new Date(data.manually_revoked_at_millis) : null,\n createdAt: new Date(data.created_at_millis),\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.revokeApiKeyById(data.id);\n await app._refreshApiKeys();\n return res;\n }\n };\n }\n\n protected _createApiKeyFromCrud(data: ApiKeysCrud[\"Admin\"][\"Read\"]): ApiKey {\n return {\n ...this._createApiKeyBaseFromCrud(data),\n publishableClientKey: data.publishable_client_key ? { lastFour: data.publishable_client_key.last_four } : null,\n secretServerKey: data.secret_server_key ? { lastFour: data.secret_server_key.last_four } : null,\n superSecretAdminKey: data.super_secret_admin_key ? { lastFour: data.super_secret_admin_key.last_four } : null,\n };\n }\n\n protected _createApiKeyFirstViewFromCrud(data: ApiKeyCreateCrudResponse): ApiKeyFirstView {\n return {\n ...this._createApiKeyBaseFromCrud(data),\n publishableClientKey: data.publishable_client_key,\n secretServerKey: data.secret_server_key,\n superSecretAdminKey: data.super_secret_admin_key,\n };\n }\n\n async listApiKeys(): Promise<ApiKey[]> {\n const crud = Result.orThrow(await this._apiKeysCache.getOrWait([], \"write-only\"));\n return crud.map((j) => this._createApiKeyFromCrud(j));\n }\n\n\n async createApiKey(options: ApiKeyCreateOptions): Promise<ApiKeyFirstView> {\n const crud = await this._interface.createApiKey(apiKeyCreateOptionsToCrud(options));\n await this._refreshApiKeys();\n return this._createApiKeyFirstViewFromCrud(crud);\n }\n\n async listEmailTemplates(): Promise<AdminEmailTemplate[]> {\n const crud = Result.orThrow(await this._adminEmailTemplatesCache.getOrWait([], \"write-only\"));\n return crud.map((j) => this._adminEmailTemplateFromCrud(j));\n }\n\n async updateEmailTemplate(type: EmailTemplateType, data: AdminEmailTemplateUpdateOptions): Promise<void> {\n await this._interface.updateEmailTemplate(type, adminEmailTemplateUpdateOptionsToCrud(data));\n await this._adminEmailTemplatesCache.refresh([]);\n }\n\n async resetEmailTemplate(type: EmailTemplateType) {\n await this._interface.resetEmailTemplate(type);\n await this._adminEmailTemplatesCache.refresh([]);\n }\n\n async createTeamPermissionDefinition(data: AdminTeamPermissionDefinitionCreateOptions): Promise<AdminTeamPermission>{\n const crud = await this._interface.createPermissionDefinition(adminTeamPermissionDefinitionCreateOptionsToCrud(data));\n await this._adminTeamPermissionDefinitionsCache.refresh([]);\n return this._serverTeamPermissionDefinitionFromCrud(crud);\n }\n\n async updateTeamPermissionDefinition(permissionId: string, data: AdminTeamPermissionDefinitionUpdateOptions) {\n await this._interface.updatePermissionDefinition(permissionId, adminTeamPermissionDefinitionUpdateOptionsToCrud(data));\n await this._adminTeamPermissionDefinitionsCache.refresh([]);\n }\n\n async deleteTeamPermissionDefinition(permissionId: string): Promise<void> {\n await this._interface.deletePermissionDefinition(permissionId);\n await this._adminTeamPermissionDefinitionsCache.refresh([]);\n }\n\n async listTeamPermissionDefinitions(): Promise<AdminTeamPermissionDefinition[]> {\n const crud = Result.orThrow(await this._adminTeamPermissionDefinitionsCache.getOrWait([], \"write-only\"));\n return crud.map((p) => this._serverTeamPermissionDefinitionFromCrud(p));\n }\n\n\n protected override async _refreshProject() {\n await Promise.all([\n super._refreshProject(),\n this._adminProjectCache.refresh([]),\n ]);\n }\n\n protected async _refreshApiKeys() {\n await this._apiKeysCache.refresh([]);\n }\n\n get [stackAppInternalsSymbol]() {\n return {\n ...super[stackAppInternalsSymbol],\n };\n }\n\n async sendTestEmail(options: {\n recipientEmail: string,\n emailConfig: EmailConfig,\n }): Promise<Result<undefined, { errorMessage: string }>> {\n const response = await this._interface.sendTestEmail({\n recipient_email: options.recipientEmail,\n email_config: {\n ...(pick(options.emailConfig, ['host', 'port', 'username', 'password'])),\n sender_email: options.emailConfig.senderEmail,\n sender_name: options.emailConfig.senderName,\n },\n });\n\n if (response.success) {\n return Result.ok(undefined);\n } else {\n return Result.error({ errorMessage: response.error_message ?? throwErr(\"Email test error not specified\") });\n }\n }\n\n async listSentEmails(): Promise<AdminSentEmail[]> {\n const response = await this._interface.listSentEmails();\n return response.items.map((email) => ({\n id: email.id,\n to: email.to ?? [],\n subject: email.subject,\n recipient: email.to?.[0] ?? \"\",\n sentAt: new Date(email.sent_at_millis),\n error: email.error,\n }));\n }\n}\n"],"mappings":"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","names":["import_common"]}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/lib/stack-app/apps/implementations/admin-app-impl.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\nimport { StackAdminInterface } from \"@stackframe/stack-shared\";\nimport { getProductionModeErrors } from \"@stackframe/stack-shared/dist/helpers/production-mode\";\nimport { ApiKeyCreateCrudResponse } from \"@stackframe/stack-shared/dist/interface/adminInterface\";\nimport { ApiKeysCrud } from \"@stackframe/stack-shared/dist/interface/crud/api-keys\";\nimport { EmailTemplateCrud, EmailTemplateType } from \"@stackframe/stack-shared/dist/interface/crud/email-templates\";\nimport { InternalProjectsCrud } from \"@stackframe/stack-shared/dist/interface/crud/projects\";\nimport { StackAssertionError, throwErr } from \"@stackframe/stack-shared/dist/utils/errors\";\nimport { pick } from \"@stackframe/stack-shared/dist/utils/objects\";\nimport { Result } from \"@stackframe/stack-shared/dist/utils/results\";\nimport { AdminSentEmail } from \"../..\";\nimport { ApiKey, ApiKeyBase, ApiKeyBaseCrudRead, ApiKeyCreateOptions, ApiKeyFirstView, apiKeyCreateOptionsToCrud } from \"../../api-keys\";\nimport { EmailConfig, stackAppInternalsSymbol } from \"../../common\";\nimport { AdminEmailTemplate, AdminEmailTemplateUpdateOptions, adminEmailTemplateUpdateOptionsToCrud } from \"../../email-templates\";\nimport { AdminTeamPermission, AdminTeamPermissionDefinition, AdminTeamPermissionDefinitionCreateOptions, AdminTeamPermissionDefinitionUpdateOptions, AdminProjectPermission, AdminProjectPermissionDefinition, AdminProjectPermissionDefinitionCreateOptions, AdminProjectPermissionDefinitionUpdateOptions, adminTeamPermissionDefinitionCreateOptionsToCrud, adminTeamPermissionDefinitionUpdateOptionsToCrud, adminProjectPermissionDefinitionCreateOptionsToCrud, adminProjectPermissionDefinitionUpdateOptionsToCrud } from \"../../permissions\";\nimport { AdminOwnedProject, AdminProject, AdminProjectUpdateOptions, adminProjectUpdateOptionsToCrud } from \"../../projects\";\nimport { StackAdminApp, StackAdminAppConstructorOptions } from \"../interfaces/admin-app\";\nimport { clientVersion, createCache, getBaseUrl, getDefaultProjectId, getDefaultPublishableClientKey, getDefaultSecretServerKey, getDefaultSuperSecretAdminKey } from \"./common\";\nimport { _StackServerAppImplIncomplete } from \"./server-app-impl\";\n\n\nexport class _StackAdminAppImplIncomplete<HasTokenStore extends boolean, ProjectId extends string> extends _StackServerAppImplIncomplete<HasTokenStore, ProjectId> implements StackAdminApp<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 _apiKeysCache = createCache(async () => {\n return await this._interface.listApiKeys();\n });\n private readonly _adminEmailTemplatesCache = createCache(async () => {\n return await this._interface.listEmailTemplates();\n });\n private readonly _adminTeamPermissionDefinitionsCache = createCache(async () => {\n return await this._interface.listTeamPermissionDefinitions();\n });\n private readonly _adminProjectPermissionDefinitionsCache = createCache(async () => {\n return await this._interface.listProjectPermissionDefinitions();\n });\n private readonly _svixTokenCache = createCache(async () => {\n return await this._interface.getSvixToken();\n });\n private readonly _metricsCache = createCache(async () => {\n return await this._interface.getMetrics();\n });\n\n constructor(options: StackAdminAppConstructorOptions<HasTokenStore, ProjectId>) {\n super({\n interface: new StackAdminInterface({\n getBaseUrl: () => getBaseUrl(options.baseUrl),\n projectId: options.projectId ?? getDefaultProjectId(),\n extraRequestHeaders: options.extraRequestHeaders ?? {},\n clientVersion,\n ...\"projectOwnerSession\" in options ? {\n projectOwnerSession: options.projectOwnerSession,\n } : {\n publishableClientKey: options.publishableClientKey ?? getDefaultPublishableClientKey(),\n secretServerKey: options.secretServerKey ?? getDefaultSecretServerKey(),\n superSecretAdminKey: options.superSecretAdminKey ?? getDefaultSuperSecretAdminKey(),\n },\n }),\n baseUrl: options.baseUrl,\n extraRequestHeaders: options.extraRequestHeaders,\n projectId: options.projectId,\n tokenStore: options.tokenStore,\n urls: options.urls,\n oauthScopesOnSignIn: options.oauthScopesOnSignIn,\n redirectMethod: options.redirectMethod,\n });\n }\n\n _adminOwnedProjectFromCrud(data: InternalProjectsCrud['Admin']['Read'], onRefresh: () => Promise<void>): AdminOwnedProject {\n if (this._tokenStoreInit !== null) {\n throw new StackAssertionError(\"Owned apps must always have tokenStore === null — did you not create this project with app._createOwnedApp()?\");;\n }\n return {\n ...this._adminProjectFromCrud(data, onRefresh),\n app: this as StackAdminApp<false>,\n };\n }\n\n _adminProjectFromCrud(data: InternalProjectsCrud['Admin']['Read'], onRefresh: () => Promise<void>): AdminProject {\n if (data.id !== this.projectId) {\n throw new StackAssertionError(`The project ID of the provided project JSON (${data.id}) does not match the project ID of the app (${this.projectId})!`);\n }\n\n const app = this;\n return {\n id: data.id,\n displayName: data.display_name,\n description: data.description,\n createdAt: new Date(data.created_at_millis),\n userCount: data.user_count,\n isProductionMode: data.is_production_mode,\n config: {\n id: data.config.id,\n signUpEnabled: data.config.sign_up_enabled,\n credentialEnabled: data.config.credential_enabled,\n magicLinkEnabled: data.config.magic_link_enabled,\n passkeyEnabled: data.config.passkey_enabled,\n clientTeamCreationEnabled: data.config.client_team_creation_enabled,\n clientUserDeletionEnabled: data.config.client_user_deletion_enabled,\n allowLocalhost: data.config.allow_localhost,\n oauthAccountMergeStrategy: data.config.oauth_account_merge_strategy,\n oauthProviders: data.config.oauth_providers.map((p) => ((p.type === 'shared' ? {\n id: p.id,\n enabled: p.enabled,\n type: 'shared',\n } as const : {\n id: p.id,\n enabled: p.enabled,\n type: 'standard',\n clientId: p.client_id ?? throwErr(\"Client ID is missing\"),\n clientSecret: p.client_secret ?? throwErr(\"Client secret is missing\"),\n facebookConfigId: p.facebook_config_id,\n microsoftTenantId: p.microsoft_tenant_id,\n } as const))),\n emailConfig: data.config.email_config.type === 'shared' ? {\n type: 'shared'\n } : {\n type: 'standard',\n host: data.config.email_config.host ?? throwErr(\"Email host is missing\"),\n port: data.config.email_config.port ?? throwErr(\"Email port is missing\"),\n username: data.config.email_config.username ?? throwErr(\"Email username is missing\"),\n password: data.config.email_config.password ?? throwErr(\"Email password is missing\"),\n senderName: data.config.email_config.sender_name ?? throwErr(\"Email sender name is missing\"),\n senderEmail: data.config.email_config.sender_email ?? throwErr(\"Email sender email is missing\"),\n },\n domains: data.config.domains.map((d) => ({\n domain: d.domain,\n handlerPath: d.handler_path,\n })),\n createTeamOnSignUp: data.config.create_team_on_sign_up,\n teamCreatorDefaultPermissions: data.config.team_creator_default_permissions,\n teamMemberDefaultPermissions: data.config.team_member_default_permissions,\n userDefaultPermissions: data.config.user_default_permissions,\n },\n\n async update(update: AdminProjectUpdateOptions) {\n await app._interface.updateProject(adminProjectUpdateOptionsToCrud(update));\n await onRefresh();\n },\n async delete() {\n await app._interface.deleteProject();\n },\n async getProductionModeErrors() {\n return getProductionModeErrors(data);\n },\n useProductionModeErrors() {\n return getProductionModeErrors(data);\n },\n };\n }\n\n _adminEmailTemplateFromCrud(data: EmailTemplateCrud['Admin']['Read']): AdminEmailTemplate {\n return {\n type: data.type,\n subject: data.subject,\n content: data.content,\n isDefault: data.is_default,\n };\n }\n\n override async getProject(): Promise<AdminProject> {\n return this._adminProjectFromCrud(\n Result.orThrow(await this._adminProjectCache.getOrWait([], \"write-only\")),\n () => this._refreshProject()\n );\n }\n\n\n protected _createApiKeyBaseFromCrud(data: ApiKeyBaseCrudRead): ApiKeyBase {\n const app = this;\n return {\n id: data.id,\n description: data.description,\n expiresAt: new Date(data.expires_at_millis),\n manuallyRevokedAt: data.manually_revoked_at_millis ? new Date(data.manually_revoked_at_millis) : null,\n createdAt: new Date(data.created_at_millis),\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.revokeApiKeyById(data.id);\n await app._refreshApiKeys();\n return res;\n }\n };\n }\n\n protected _createApiKeyFromCrud(data: ApiKeysCrud[\"Admin\"][\"Read\"]): ApiKey {\n return {\n ...this._createApiKeyBaseFromCrud(data),\n publishableClientKey: data.publishable_client_key ? { lastFour: data.publishable_client_key.last_four } : null,\n secretServerKey: data.secret_server_key ? { lastFour: data.secret_server_key.last_four } : null,\n superSecretAdminKey: data.super_secret_admin_key ? { lastFour: data.super_secret_admin_key.last_four } : null,\n };\n }\n\n protected _createApiKeyFirstViewFromCrud(data: ApiKeyCreateCrudResponse): ApiKeyFirstView {\n return {\n ...this._createApiKeyBaseFromCrud(data),\n publishableClientKey: data.publishable_client_key,\n secretServerKey: data.secret_server_key,\n superSecretAdminKey: data.super_secret_admin_key,\n };\n }\n\n async listApiKeys(): Promise<ApiKey[]> {\n const crud = Result.orThrow(await this._apiKeysCache.getOrWait([], \"write-only\"));\n return crud.map((j) => this._createApiKeyFromCrud(j));\n }\n\n\n async createApiKey(options: ApiKeyCreateOptions): Promise<ApiKeyFirstView> {\n const crud = await this._interface.createApiKey(apiKeyCreateOptionsToCrud(options));\n await this._refreshApiKeys();\n return this._createApiKeyFirstViewFromCrud(crud);\n }\n\n async listEmailTemplates(): Promise<AdminEmailTemplate[]> {\n const crud = Result.orThrow(await this._adminEmailTemplatesCache.getOrWait([], \"write-only\"));\n return crud.map((j) => this._adminEmailTemplateFromCrud(j));\n }\n\n async updateEmailTemplate(type: EmailTemplateType, data: AdminEmailTemplateUpdateOptions): Promise<void> {\n await this._interface.updateEmailTemplate(type, adminEmailTemplateUpdateOptionsToCrud(data));\n await this._adminEmailTemplatesCache.refresh([]);\n }\n\n async resetEmailTemplate(type: EmailTemplateType) {\n await this._interface.resetEmailTemplate(type);\n await this._adminEmailTemplatesCache.refresh([]);\n }\n\n async createTeamPermissionDefinition(data: AdminTeamPermissionDefinitionCreateOptions): Promise<AdminTeamPermission>{\n const crud = await this._interface.createTeamPermissionDefinition(adminTeamPermissionDefinitionCreateOptionsToCrud(data));\n await this._adminTeamPermissionDefinitionsCache.refresh([]);\n return this._serverTeamPermissionDefinitionFromCrud(crud);\n }\n\n async updateTeamPermissionDefinition(permissionId: string, data: AdminTeamPermissionDefinitionUpdateOptions) {\n await this._interface.updateTeamPermissionDefinition(permissionId, adminTeamPermissionDefinitionUpdateOptionsToCrud(data));\n await this._adminTeamPermissionDefinitionsCache.refresh([]);\n }\n\n async deleteTeamPermissionDefinition(permissionId: string): Promise<void> {\n await this._interface.deleteTeamPermissionDefinition(permissionId);\n await this._adminTeamPermissionDefinitionsCache.refresh([]);\n }\n\n async listTeamPermissionDefinitions(): Promise<AdminTeamPermissionDefinition[]> {\n const crud = Result.orThrow(await this._adminTeamPermissionDefinitionsCache.getOrWait([], \"write-only\"));\n return crud.map((p) => this._serverTeamPermissionDefinitionFromCrud(p));\n }\n\n\n async createProjectPermissionDefinition(data: AdminProjectPermissionDefinitionCreateOptions): Promise<AdminProjectPermission> {\n const crud = await this._interface.createProjectPermissionDefinition(adminProjectPermissionDefinitionCreateOptionsToCrud(data));\n await this._adminProjectPermissionDefinitionsCache.refresh([]);\n return this._serverProjectPermissionDefinitionFromCrud(crud);\n }\n\n async updateProjectPermissionDefinition(permissionId: string, data: AdminProjectPermissionDefinitionUpdateOptions) {\n await this._interface.updateProjectPermissionDefinition(permissionId, adminProjectPermissionDefinitionUpdateOptionsToCrud(data));\n await this._adminProjectPermissionDefinitionsCache.refresh([]);\n }\n\n async deleteProjectPermissionDefinition(permissionId: string): Promise<void> {\n await this._interface.deleteProjectPermissionDefinition(permissionId);\n await this._adminProjectPermissionDefinitionsCache.refresh([]);\n }\n\n async listProjectPermissionDefinitions(): Promise<AdminProjectPermissionDefinition[]> {\n const crud = Result.orThrow(await this._adminProjectPermissionDefinitionsCache.getOrWait([], \"write-only\"));\n return crud.map((p) => this._serverProjectPermissionDefinitionFromCrud(p));\n }\n\n\n protected override async _refreshProject() {\n await Promise.all([\n super._refreshProject(),\n this._adminProjectCache.refresh([]),\n ]);\n }\n\n protected async _refreshApiKeys() {\n await this._apiKeysCache.refresh([]);\n }\n\n get [stackAppInternalsSymbol]() {\n return {\n ...super[stackAppInternalsSymbol],\n };\n }\n\n async sendTestEmail(options: {\n recipientEmail: string,\n emailConfig: EmailConfig,\n }): Promise<Result<undefined, { errorMessage: string }>> {\n const response = await this._interface.sendTestEmail({\n recipient_email: options.recipientEmail,\n email_config: {\n ...(pick(options.emailConfig, ['host', 'port', 'username', 'password'])),\n sender_email: options.emailConfig.senderEmail,\n sender_name: options.emailConfig.senderName,\n },\n });\n\n if (response.success) {\n return Result.ok(undefined);\n } else {\n return Result.error({ errorMessage: response.error_message ?? throwErr(\"Email test error not specified\") });\n }\n }\n\n async listSentEmails(): Promise<AdminSentEmail[]> {\n const response = await this._interface.listSentEmails();\n return response.items.map((email) => ({\n id: email.id,\n to: email.to ?? [],\n subject: email.subject,\n recipient: email.to?.[0] ?? \"\",\n sentAt: new Date(email.sent_at_millis),\n error: email.error,\n }));\n }\n}\n"],"mappings":"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","names":["import_common"]}
|
|
@@ -83,6 +83,9 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
|
|
|
83
83
|
this._currentUserPermissionsCache = (0, import_common2.createCacheBySession)(async (session, [teamId, recursive]) => {
|
|
84
84
|
return await this._interface.listCurrentUserTeamPermissions({ teamId, recursive }, session);
|
|
85
85
|
});
|
|
86
|
+
this._currentUserProjectPermissionsCache = (0, import_common2.createCacheBySession)(async (session, [recursive]) => {
|
|
87
|
+
return await this._interface.listCurrentUserProjectPermissions({ recursive }, session);
|
|
88
|
+
});
|
|
86
89
|
this._currentUserTeamsCache = (0, import_common2.createCacheBySession)(async (session) => {
|
|
87
90
|
return await this._interface.listCurrentUserTeams(session);
|
|
88
91
|
});
|
|
@@ -131,6 +134,7 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
|
|
|
131
134
|
return await this._interface.listClientContactChannels(session);
|
|
132
135
|
}
|
|
133
136
|
);
|
|
137
|
+
this._anonymousSignUpInProgress = null;
|
|
134
138
|
this._memoryTokenStore = (0, import_common2.createEmptyTokenStore)();
|
|
135
139
|
this._nextServerCookiesTokenStores = /* @__PURE__ */ new WeakMap();
|
|
136
140
|
this._requestTokenStores = /* @__PURE__ */ new WeakMap();
|
|
@@ -446,7 +450,7 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
|
|
|
446
450
|
}
|
|
447
451
|
};
|
|
448
452
|
}
|
|
449
|
-
|
|
453
|
+
_clientPermissionFromCrud(crud) {
|
|
450
454
|
return {
|
|
451
455
|
id: crud.id
|
|
452
456
|
};
|
|
@@ -661,22 +665,44 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
|
|
|
661
665
|
async createTeam(data) {
|
|
662
666
|
const crud2 = await app._interface.createClientTeam((0, import_teams.teamCreateOptionsToCrud)(data, "me"), session);
|
|
663
667
|
await app._currentUserTeamsCache.refresh([session]);
|
|
668
|
+
await this.update({ selectedTeamId: crud2.id });
|
|
664
669
|
return app._clientTeamFromCrud(crud2, session);
|
|
665
670
|
},
|
|
666
671
|
async leaveTeam(team) {
|
|
667
672
|
await app._interface.leaveTeam(team.id, session);
|
|
668
673
|
},
|
|
669
|
-
async listPermissions(
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
674
|
+
async listPermissions(scopeOrOptions, options) {
|
|
675
|
+
if (scopeOrOptions && "id" in scopeOrOptions) {
|
|
676
|
+
const scope = scopeOrOptions;
|
|
677
|
+
const recursive = options?.recursive ?? true;
|
|
678
|
+
const permissions = import_results.Result.orThrow(await app._currentUserPermissionsCache.getOrWait([session, scope.id, recursive], "write-only"));
|
|
679
|
+
return permissions.map((crud2) => app._clientPermissionFromCrud(crud2));
|
|
680
|
+
} else {
|
|
681
|
+
const opts = scopeOrOptions;
|
|
682
|
+
const recursive = opts?.recursive ?? true;
|
|
683
|
+
const permissions = import_results.Result.orThrow(await app._currentUserProjectPermissionsCache.getOrWait([session, recursive], "write-only"));
|
|
684
|
+
return permissions.map((crud2) => app._clientPermissionFromCrud(crud2));
|
|
685
|
+
}
|
|
673
686
|
},
|
|
674
|
-
async getPermission(
|
|
675
|
-
|
|
676
|
-
|
|
687
|
+
async getPermission(scopeOrPermissionId, permissionId) {
|
|
688
|
+
if (scopeOrPermissionId && typeof scopeOrPermissionId !== "string") {
|
|
689
|
+
const scope = scopeOrPermissionId;
|
|
690
|
+
const permissions = await this.listPermissions(scope);
|
|
691
|
+
return permissions.find((p) => p.id === permissionId) ?? null;
|
|
692
|
+
} else {
|
|
693
|
+
const pid = scopeOrPermissionId;
|
|
694
|
+
const permissions = await this.listPermissions();
|
|
695
|
+
return permissions.find((p) => p.id === pid) ?? null;
|
|
696
|
+
}
|
|
677
697
|
},
|
|
678
|
-
async hasPermission(
|
|
679
|
-
|
|
698
|
+
async hasPermission(scopeOrPermissionId, permissionId) {
|
|
699
|
+
if (scopeOrPermissionId && typeof scopeOrPermissionId !== "string") {
|
|
700
|
+
const scope = scopeOrPermissionId;
|
|
701
|
+
return await this.getPermission(scope, permissionId) !== null;
|
|
702
|
+
} else {
|
|
703
|
+
const pid = scopeOrPermissionId;
|
|
704
|
+
return await this.getPermission(pid) !== null;
|
|
705
|
+
}
|
|
680
706
|
},
|
|
681
707
|
async update(update) {
|
|
682
708
|
return await app._updateClientUser(update, session);
|
|
@@ -939,7 +965,10 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
|
|
|
939
965
|
async getUser(options) {
|
|
940
966
|
this._ensurePersistentTokenStore(options?.tokenStore);
|
|
941
967
|
const session = await this._getSession(options?.tokenStore);
|
|
942
|
-
|
|
968
|
+
let crud = import_results.Result.orThrow(await this._currentUserCache.getOrWait([session], "write-only"));
|
|
969
|
+
if (crud?.is_anonymous && options?.or !== "anonymous" && options?.or !== "anonymous-if-exists") {
|
|
970
|
+
crud = null;
|
|
971
|
+
}
|
|
943
972
|
if (crud === null) {
|
|
944
973
|
switch (options?.or) {
|
|
945
974
|
case "redirect": {
|
|
@@ -949,7 +978,13 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
|
|
|
949
978
|
case "throw": {
|
|
950
979
|
throw new Error("User is not signed in but getUser was called with { or: 'throw' }");
|
|
951
980
|
}
|
|
952
|
-
|
|
981
|
+
case "anonymous": {
|
|
982
|
+
const tokens = await this._signUpAnonymously();
|
|
983
|
+
return await this.getUser({ tokenStore: tokens, or: "anonymous-if-exists" }) ?? (0, import_errors.throwErr)("Something went wrong while signing up anonymously");
|
|
984
|
+
}
|
|
985
|
+
case void 0:
|
|
986
|
+
case "anonymous-if-exists":
|
|
987
|
+
case "return-null": {
|
|
953
988
|
return null;
|
|
954
989
|
}
|
|
955
990
|
}
|
|
@@ -1049,6 +1084,24 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
|
|
|
1049
1084
|
return import_results.Result.error(result.error);
|
|
1050
1085
|
}
|
|
1051
1086
|
}
|
|
1087
|
+
async _signUpAnonymously() {
|
|
1088
|
+
this._ensurePersistentTokenStore();
|
|
1089
|
+
if (!this._anonymousSignUpInProgress) {
|
|
1090
|
+
this._anonymousSignUpInProgress = (async () => {
|
|
1091
|
+
this._ensurePersistentTokenStore();
|
|
1092
|
+
const session = await this._getSession();
|
|
1093
|
+
const result = await this._interface.signUpAnonymously(session);
|
|
1094
|
+
if (result.status === "ok") {
|
|
1095
|
+
await this._signInToAccountWithTokens(result.data);
|
|
1096
|
+
} else {
|
|
1097
|
+
throw new import_errors.StackAssertionError("signUpAnonymously() should never return an error");
|
|
1098
|
+
}
|
|
1099
|
+
this._anonymousSignUpInProgress = null;
|
|
1100
|
+
return result.data;
|
|
1101
|
+
})();
|
|
1102
|
+
}
|
|
1103
|
+
return await this._anonymousSignUpInProgress;
|
|
1104
|
+
}
|
|
1052
1105
|
async signInWithMagicLink(code, options) {
|
|
1053
1106
|
this._ensurePersistentTokenStore();
|
|
1054
1107
|
let result;
|