@stackframe/stack 2.4.0 → 2.4.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.
Files changed (279) hide show
  1. package/dist/components/card-frame.js +1 -0
  2. package/dist/components/card-frame.js.map +1 -0
  3. package/dist/components/credential-sign-in.js +1 -0
  4. package/dist/components/credential-sign-in.js.map +1 -0
  5. package/dist/components/credential-sign-up.js +1 -0
  6. package/dist/components/credential-sign-up.js.map +1 -0
  7. package/dist/components/forgot-password.js +1 -0
  8. package/dist/components/forgot-password.js.map +1 -0
  9. package/dist/components/form-warning.js +1 -0
  10. package/dist/components/form-warning.js.map +1 -0
  11. package/dist/components/magic-link-sign-in.js +1 -0
  12. package/dist/components/magic-link-sign-in.js.map +1 -0
  13. package/dist/components/message-card.js +1 -0
  14. package/dist/components/message-card.js.map +1 -0
  15. package/dist/components/oauth-button.js +1 -0
  16. package/dist/components/oauth-button.js.map +1 -0
  17. package/dist/components/oauth-group.js +1 -0
  18. package/dist/components/oauth-group.js.map +1 -0
  19. package/dist/components/password-field.js +1 -0
  20. package/dist/components/password-field.js.map +1 -0
  21. package/dist/components/password-reset-inner.js +1 -0
  22. package/dist/components/password-reset-inner.js.map +1 -0
  23. package/dist/components/redirect-message-card.js +9 -14
  24. package/dist/components/redirect-message-card.js.map +1 -0
  25. package/dist/components/separator-with-text.js +1 -0
  26. package/dist/components/separator-with-text.js.map +1 -0
  27. package/dist/components/user-avatar.d.mts +1 -0
  28. package/dist/components/user-avatar.d.ts +1 -0
  29. package/dist/components/user-avatar.js +1 -0
  30. package/dist/components/user-avatar.js.map +1 -0
  31. package/dist/components/user-button.js +1 -0
  32. package/dist/components/user-button.js.map +1 -0
  33. package/dist/components-core/avatar.js +1 -0
  34. package/dist/components-core/avatar.js.map +1 -0
  35. package/dist/components-core/button.js +1 -0
  36. package/dist/components-core/button.js.map +1 -0
  37. package/dist/components-core/card.js +1 -0
  38. package/dist/components-core/card.js.map +1 -0
  39. package/dist/components-core/collapsible.js +1 -0
  40. package/dist/components-core/collapsible.js.map +1 -0
  41. package/dist/components-core/container.js +1 -0
  42. package/dist/components-core/container.js.map +1 -0
  43. package/dist/components-core/dropdown.js +1 -0
  44. package/dist/components-core/dropdown.js.map +1 -0
  45. package/dist/components-core/index.d.mts +4 -4
  46. package/dist/components-core/index.d.ts +4 -4
  47. package/dist/components-core/index.js +1 -0
  48. package/dist/components-core/index.js.map +1 -0
  49. package/dist/components-core/input.js +1 -0
  50. package/dist/components-core/input.js.map +1 -0
  51. package/dist/components-core/label.js +1 -0
  52. package/dist/components-core/label.js.map +1 -0
  53. package/dist/components-core/link.js +1 -0
  54. package/dist/components-core/link.js.map +1 -0
  55. package/dist/components-core/loading-indicator.js +1 -0
  56. package/dist/components-core/loading-indicator.js.map +1 -0
  57. package/dist/components-core/popover.js +1 -0
  58. package/dist/components-core/popover.js.map +1 -0
  59. package/dist/components-core/separator.js +1 -0
  60. package/dist/components-core/separator.js.map +1 -0
  61. package/dist/components-core/skeleton.js +1 -0
  62. package/dist/components-core/skeleton.js.map +1 -0
  63. package/dist/components-core/tabs.js +4 -2
  64. package/dist/components-core/tabs.js.map +1 -0
  65. package/dist/components-core/text.js +1 -0
  66. package/dist/components-core/text.js.map +1 -0
  67. package/dist/components-core-joy/button.js +1 -0
  68. package/dist/components-core-joy/button.js.map +1 -0
  69. package/dist/components-core-joy/input.js +1 -0
  70. package/dist/components-core-joy/input.js.map +1 -0
  71. package/dist/components-core-joy/separator.js +1 -0
  72. package/dist/components-core-joy/separator.js.map +1 -0
  73. package/dist/components-core-joy/tabs.js +1 -0
  74. package/dist/components-core-joy/tabs.js.map +1 -0
  75. package/dist/components-core-joy/text.js +1 -0
  76. package/dist/components-core-joy/text.js.map +1 -0
  77. package/dist/components-page/account-settings.js +1 -0
  78. package/dist/components-page/account-settings.js.map +1 -0
  79. package/dist/components-page/auth-page.js +1 -0
  80. package/dist/components-page/auth-page.js.map +1 -0
  81. package/dist/components-page/email-verification.js +1 -0
  82. package/dist/components-page/email-verification.js.map +1 -0
  83. package/dist/components-page/forgot-password.js +1 -0
  84. package/dist/components-page/forgot-password.js.map +1 -0
  85. package/dist/components-page/magic-link-callback.js +3 -2
  86. package/dist/components-page/magic-link-callback.js.map +1 -0
  87. package/dist/components-page/oauth-callback.js +1 -0
  88. package/dist/components-page/oauth-callback.js.map +1 -0
  89. package/dist/components-page/password-reset.js +1 -0
  90. package/dist/components-page/password-reset.js.map +1 -0
  91. package/dist/components-page/sign-in.js +1 -0
  92. package/dist/components-page/sign-in.js.map +1 -0
  93. package/dist/components-page/sign-out.js +1 -0
  94. package/dist/components-page/sign-out.js.map +1 -0
  95. package/dist/components-page/sign-up.js +1 -0
  96. package/dist/components-page/sign-up.js.map +1 -0
  97. package/dist/components-page/stack-handler.d.mts +1 -0
  98. package/dist/components-page/stack-handler.d.ts +1 -0
  99. package/dist/components-page/stack-handler.js +1 -0
  100. package/dist/components-page/stack-handler.js.map +1 -0
  101. package/dist/esm/components/card-frame.js +1 -0
  102. package/dist/esm/components/card-frame.js.map +1 -0
  103. package/dist/esm/components/credential-sign-in.js +1 -0
  104. package/dist/esm/components/credential-sign-in.js.map +1 -0
  105. package/dist/esm/components/credential-sign-up.js +1 -0
  106. package/dist/esm/components/credential-sign-up.js.map +1 -0
  107. package/dist/esm/components/forgot-password.js +1 -0
  108. package/dist/esm/components/forgot-password.js.map +1 -0
  109. package/dist/esm/components/form-warning.js +1 -0
  110. package/dist/esm/components/form-warning.js.map +1 -0
  111. package/dist/esm/components/magic-link-sign-in.js +1 -0
  112. package/dist/esm/components/magic-link-sign-in.js.map +1 -0
  113. package/dist/esm/components/message-card.js +1 -0
  114. package/dist/esm/components/message-card.js.map +1 -0
  115. package/dist/esm/components/oauth-button.js +1 -0
  116. package/dist/esm/components/oauth-button.js.map +1 -0
  117. package/dist/esm/components/oauth-group.js +1 -0
  118. package/dist/esm/components/oauth-group.js.map +1 -0
  119. package/dist/esm/components/password-field.js +1 -0
  120. package/dist/esm/components/password-field.js.map +1 -0
  121. package/dist/esm/components/password-reset-inner.js +1 -0
  122. package/dist/esm/components/password-reset-inner.js.map +1 -0
  123. package/dist/esm/components/redirect-message-card.js +9 -14
  124. package/dist/esm/components/redirect-message-card.js.map +1 -0
  125. package/dist/esm/components/separator-with-text.js +1 -0
  126. package/dist/esm/components/separator-with-text.js.map +1 -0
  127. package/dist/esm/components/user-avatar.js +1 -0
  128. package/dist/esm/components/user-avatar.js.map +1 -0
  129. package/dist/esm/components/user-button.js +1 -0
  130. package/dist/esm/components/user-button.js.map +1 -0
  131. package/dist/esm/components-core/avatar.js +1 -0
  132. package/dist/esm/components-core/avatar.js.map +1 -0
  133. package/dist/esm/components-core/button.js +1 -0
  134. package/dist/esm/components-core/button.js.map +1 -0
  135. package/dist/esm/components-core/card.js +1 -0
  136. package/dist/esm/components-core/card.js.map +1 -0
  137. package/dist/esm/components-core/collapsible.js +1 -0
  138. package/dist/esm/components-core/collapsible.js.map +1 -0
  139. package/dist/esm/components-core/container.js +1 -0
  140. package/dist/esm/components-core/container.js.map +1 -0
  141. package/dist/esm/components-core/dropdown.js +1 -0
  142. package/dist/esm/components-core/dropdown.js.map +1 -0
  143. package/dist/esm/components-core/index.js +1 -0
  144. package/dist/esm/components-core/index.js.map +1 -0
  145. package/dist/esm/components-core/input.js +1 -0
  146. package/dist/esm/components-core/input.js.map +1 -0
  147. package/dist/esm/components-core/label.js +1 -0
  148. package/dist/esm/components-core/label.js.map +1 -0
  149. package/dist/esm/components-core/link.js +1 -0
  150. package/dist/esm/components-core/link.js.map +1 -0
  151. package/dist/esm/components-core/loading-indicator.js +1 -0
  152. package/dist/esm/components-core/loading-indicator.js.map +1 -0
  153. package/dist/esm/components-core/popover.js +1 -0
  154. package/dist/esm/components-core/popover.js.map +1 -0
  155. package/dist/esm/components-core/separator.js +1 -0
  156. package/dist/esm/components-core/separator.js.map +1 -0
  157. package/dist/esm/components-core/skeleton.js +1 -0
  158. package/dist/esm/components-core/skeleton.js.map +1 -0
  159. package/dist/esm/components-core/tabs.js +4 -2
  160. package/dist/esm/components-core/tabs.js.map +1 -0
  161. package/dist/esm/components-core/text.js +1 -0
  162. package/dist/esm/components-core/text.js.map +1 -0
  163. package/dist/esm/components-core-joy/button.js +1 -0
  164. package/dist/esm/components-core-joy/button.js.map +1 -0
  165. package/dist/esm/components-core-joy/input.js +1 -0
  166. package/dist/esm/components-core-joy/input.js.map +1 -0
  167. package/dist/esm/components-core-joy/separator.js +1 -0
  168. package/dist/esm/components-core-joy/separator.js.map +1 -0
  169. package/dist/esm/components-core-joy/tabs.js +1 -0
  170. package/dist/esm/components-core-joy/tabs.js.map +1 -0
  171. package/dist/esm/components-core-joy/text.js +1 -0
  172. package/dist/esm/components-core-joy/text.js.map +1 -0
  173. package/dist/esm/components-page/account-settings.js +1 -0
  174. package/dist/esm/components-page/account-settings.js.map +1 -0
  175. package/dist/esm/components-page/auth-page.js +1 -0
  176. package/dist/esm/components-page/auth-page.js.map +1 -0
  177. package/dist/esm/components-page/email-verification.js +1 -0
  178. package/dist/esm/components-page/email-verification.js.map +1 -0
  179. package/dist/esm/components-page/forgot-password.js +1 -0
  180. package/dist/esm/components-page/forgot-password.js.map +1 -0
  181. package/dist/esm/components-page/magic-link-callback.js +3 -2
  182. package/dist/esm/components-page/magic-link-callback.js.map +1 -0
  183. package/dist/esm/components-page/oauth-callback.js +1 -0
  184. package/dist/esm/components-page/oauth-callback.js.map +1 -0
  185. package/dist/esm/components-page/password-reset.js +1 -0
  186. package/dist/esm/components-page/password-reset.js.map +1 -0
  187. package/dist/esm/components-page/sign-in.js +1 -0
  188. package/dist/esm/components-page/sign-in.js.map +1 -0
  189. package/dist/esm/components-page/sign-out.js +1 -0
  190. package/dist/esm/components-page/sign-out.js.map +1 -0
  191. package/dist/esm/components-page/sign-up.js +1 -0
  192. package/dist/esm/components-page/sign-up.js.map +1 -0
  193. package/dist/esm/components-page/stack-handler.js +1 -0
  194. package/dist/esm/components-page/stack-handler.js.map +1 -0
  195. package/dist/esm/index.js +1 -0
  196. package/dist/esm/index.js.map +1 -0
  197. package/dist/esm/joy.js +1 -0
  198. package/dist/esm/joy.js.map +1 -0
  199. package/dist/esm/lib/auth.js +1 -0
  200. package/dist/esm/lib/auth.js.map +1 -0
  201. package/dist/esm/lib/cookie.js +2 -1
  202. package/dist/esm/lib/cookie.js.map +1 -0
  203. package/dist/esm/lib/hooks.js +1 -0
  204. package/dist/esm/lib/hooks.js.map +1 -0
  205. package/dist/esm/lib/stack-app.js +287 -5
  206. package/dist/esm/lib/stack-app.js.map +1 -0
  207. package/dist/esm/providers/component-provider.js +1 -0
  208. package/dist/esm/providers/component-provider.js.map +1 -0
  209. package/dist/esm/providers/design-provider.js +1 -0
  210. package/dist/esm/providers/design-provider.js.map +1 -0
  211. package/dist/esm/providers/joy-provider.js +1 -0
  212. package/dist/esm/providers/joy-provider.js.map +1 -0
  213. package/dist/esm/providers/stack-provider-client.js +1 -0
  214. package/dist/esm/providers/stack-provider-client.js.map +1 -0
  215. package/dist/esm/providers/stack-provider.js +1 -0
  216. package/dist/esm/providers/stack-provider.js.map +1 -0
  217. package/dist/esm/providers/styled-components-registry.js +1 -0
  218. package/dist/esm/providers/styled-components-registry.js.map +1 -0
  219. package/dist/esm/providers/theme-provider.js +1 -0
  220. package/dist/esm/providers/theme-provider.js.map +1 -0
  221. package/dist/esm/utils/browser-script.js +1 -0
  222. package/dist/esm/utils/browser-script.js.map +1 -0
  223. package/dist/esm/utils/constants.js +1 -0
  224. package/dist/esm/utils/constants.js.map +1 -0
  225. package/dist/esm/utils/email.js +1 -0
  226. package/dist/esm/utils/email.js.map +1 -0
  227. package/dist/esm/utils/next.js +1 -0
  228. package/dist/esm/utils/next.js.map +1 -0
  229. package/dist/esm/utils/url.js +1 -0
  230. package/dist/esm/utils/url.js.map +1 -0
  231. package/dist/index.d.mts +2 -1
  232. package/dist/index.d.ts +2 -1
  233. package/dist/index.js +1 -0
  234. package/dist/index.js.map +1 -0
  235. package/dist/joy.js +1 -0
  236. package/dist/joy.js.map +1 -0
  237. package/dist/lib/auth.js +1 -0
  238. package/dist/lib/auth.js.map +1 -0
  239. package/dist/lib/cookie.js +5 -4
  240. package/dist/lib/cookie.js.map +1 -0
  241. package/dist/lib/hooks.d.mts +1 -0
  242. package/dist/lib/hooks.d.ts +1 -0
  243. package/dist/lib/hooks.js +1 -0
  244. package/dist/lib/hooks.js.map +1 -0
  245. package/dist/lib/stack-app.d.mts +78 -22
  246. package/dist/lib/stack-app.d.ts +78 -22
  247. package/dist/lib/stack-app.js +287 -5
  248. package/dist/lib/stack-app.js.map +1 -0
  249. package/dist/providers/component-provider.d.mts +6 -6
  250. package/dist/providers/component-provider.d.ts +6 -6
  251. package/dist/providers/component-provider.js +1 -0
  252. package/dist/providers/component-provider.js.map +1 -0
  253. package/dist/providers/design-provider.js +1 -0
  254. package/dist/providers/design-provider.js.map +1 -0
  255. package/dist/providers/joy-provider.js +1 -0
  256. package/dist/providers/joy-provider.js.map +1 -0
  257. package/dist/providers/stack-provider-client.d.mts +1 -0
  258. package/dist/providers/stack-provider-client.d.ts +1 -0
  259. package/dist/providers/stack-provider-client.js +1 -0
  260. package/dist/providers/stack-provider-client.js.map +1 -0
  261. package/dist/providers/stack-provider.d.mts +1 -0
  262. package/dist/providers/stack-provider.d.ts +1 -0
  263. package/dist/providers/stack-provider.js +1 -0
  264. package/dist/providers/stack-provider.js.map +1 -0
  265. package/dist/providers/styled-components-registry.js +1 -0
  266. package/dist/providers/styled-components-registry.js.map +1 -0
  267. package/dist/providers/theme-provider.js +1 -0
  268. package/dist/providers/theme-provider.js.map +1 -0
  269. package/dist/utils/browser-script.js +1 -0
  270. package/dist/utils/browser-script.js.map +1 -0
  271. package/dist/utils/constants.js +1 -0
  272. package/dist/utils/constants.js.map +1 -0
  273. package/dist/utils/email.js +1 -0
  274. package/dist/utils/email.js.map +1 -0
  275. package/dist/utils/next.js +1 -0
  276. package/dist/utils/next.js.map +1 -0
  277. package/dist/utils/url.js +1 -0
  278. package/dist/utils/url.js.map +1 -0
  279. package/package.json +3 -3
@@ -1,7 +1,8 @@
1
- import { ServerUserJson, ServerUserCustomizableJson, OAuthProviderConfigJson, KnownErrors } from '@stackframe/stack-shared';
2
- import { ReadonlyTokenStore, UserJson, UserCustomizableJson, ProjectJson, ProductionModeError, EmailConfigJson, DomainConfigJson, ClientProjectJson } from '@stackframe/stack-shared/dist/interface/clientInterface';
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: Partial<C>): Promise<void>;
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: {
@@ -56,7 +57,7 @@ type InternalAuth<T> = {
56
57
  useOwnedProjects(this: T): Project[];
57
58
  onOwnedProjectsChange(this: T, callback: (projects: Project[]) => void): void;
58
59
  };
59
- type User = {
60
+ type User = ({
60
61
  readonly projectId: string;
61
62
  readonly id: string;
62
63
  readonly displayName: string | null;
@@ -74,25 +75,37 @@ type User = {
74
75
  readonly hasPassword: boolean;
75
76
  readonly authWithEmail: boolean;
76
77
  readonly oauthProviders: readonly string[];
78
+ hasPermission(this: CurrentUser, scope: Team, permissionId: string): Promise<boolean>;
77
79
  toJson(this: CurrentUser): UserJson;
78
- };
79
- type CurrentUser = Auth<User, UserCustomizableJson> & User;
80
+ } & AsyncStoreProperty<"team", [id: string], Team | null, false> & AsyncStoreProperty<"teams", [], Team[], true> & Omit<AsyncStoreProperty<"permission", [scope: Team, permissionId: string, options?: {
81
+ direct?: boolean;
82
+ }], Permission | null, false>, "onPermissionChange"> & Omit<AsyncStoreProperty<"permissions", [scope: Team, options?: {
83
+ direct?: boolean;
84
+ }], Permission[], true>, "onPermissionsChange">);
85
+ type CurrentUser = Auth<User, UserUpdateJson> & User;
80
86
  type CurrentInternalUser = CurrentUser & InternalAuth<CurrentUser>;
81
87
  /**
82
88
  * A user including sensitive fields that should only be used on the server, never sent to the client
83
89
  * (such as sensitive information and serverMetadata).
84
90
  */
85
- type ServerUser = Omit<User, "toJson"> & {
91
+ 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
92
  readonly serverMetadata: ReadonlyJson;
87
93
  /**
88
94
  * Returns a new user object with the sensitive fields removed.
89
95
  */
90
96
  getClientUser(this: ServerUser): User;
91
- toJson(this: ServerUser): ServerUserJson;
92
- update(this: ServerUser, user: Partial<ServerUserCustomizableJson>): Promise<void>;
97
+ update(this: ServerUser, user: Partial<ServerUserUpdateJson>): Promise<void>;
93
98
  delete(this: ServerUser): Promise<void>;
94
- };
95
- type CurrentServerUser = Auth<ServerUser, ServerUserCustomizableJson> & Omit<ServerUser, "getClientUser"> & {
99
+ grantPermission(scope: Team, permissionId: string): Promise<void>;
100
+ revokePermission(scope: Team, permissionId: string): Promise<void>;
101
+ hasPermission(scope: Team, permissionId: string): Promise<boolean>;
102
+ toJson(this: ServerUser): ServerUserJson;
103
+ } & AsyncStoreProperty<"team", [id: string], ServerTeam | null, false> & AsyncStoreProperty<"teams", [], ServerTeam[], true> & Omit<AsyncStoreProperty<"permission", [scope: Team, permissionId: string, options?: {
104
+ direct?: boolean;
105
+ }], ServerPermission | null, false>, "onPermissionChange"> & Omit<AsyncStoreProperty<"permissions", [scope: Team, options?: {
106
+ direct?: boolean;
107
+ }], ServerPermission[], true>, "onPermissionsChange">);
108
+ type CurrentServerUser = Auth<ServerUser, ServerUserUpdateJson> & Omit<ServerUser, "getClientUser"> & {
96
109
  getClientUser(this: CurrentServerUser): CurrentUser;
97
110
  };
98
111
  type CurrentInternalServerUser = CurrentServerUser & InternalAuth<CurrentServerUser>;
@@ -111,11 +124,47 @@ type Project = {
111
124
  readonly oauthProviders: OAuthProviderConfig[];
112
125
  readonly emailConfig?: EmailConfig;
113
126
  readonly domains: DomainConfig[];
127
+ readonly createTeamOnSignUp: boolean;
114
128
  };
115
129
  update(this: Project, update: ProjectUpdateOptions): Promise<void>;
116
130
  toJson(this: Project): ProjectJson;
117
131
  getProductionModeErrors(this: Project): ProductionModeError[];
118
132
  };
133
+ type Team = {
134
+ id: string;
135
+ displayName: string;
136
+ createdAt: Date;
137
+ toJson(this: Team): TeamJson;
138
+ };
139
+ type ServerTeam = Team & {
140
+ listMembers(): Promise<ServerTeamMember[]>;
141
+ useMembers(): ServerTeamMember[];
142
+ update(update: Partial<ServerTeamCustomizableJson>): Promise<void>;
143
+ delete(): Promise<void>;
144
+ addUser(userId: string): Promise<void>;
145
+ removeUser(userId: string): Promise<void>;
146
+ };
147
+ type TeamMember = {
148
+ userId: string;
149
+ teamId: string;
150
+ displayName: string | null;
151
+ };
152
+ type ServerTeamMember = TeamMember & {
153
+ getUser(): Promise<ServerUser>;
154
+ };
155
+ type Permission = {
156
+ id: string;
157
+ } & ({
158
+ type: "global";
159
+ } | {
160
+ type: "team";
161
+ teamId: string;
162
+ });
163
+ type ServerPermission = Permission & {
164
+ readonly __databaseUniqueId: string;
165
+ readonly description?: string;
166
+ readonly containPermissionIds: string[];
167
+ };
119
168
  type ApiKeySetBase = {
120
169
  id: string;
121
170
  description: string;
@@ -148,12 +197,12 @@ type OAuthProviderConfig = OAuthProviderConfigJson;
148
197
  type GetUserOptions = {
149
198
  or?: 'redirect' | 'throw' | 'return-null';
150
199
  };
151
- type AsyncStoreProperty<Name extends string, Value, IsMultiple extends boolean> = {
152
- [key in `${IsMultiple extends true ? "list" : "get"}${Capitalize<Name>}`]: () => Promise<Value>;
200
+ type AsyncStoreProperty<Name extends string, Args extends any[], Value, IsMultiple extends boolean> = {
201
+ [key in `${IsMultiple extends true ? "list" : "get"}${Capitalize<Name>}`]: (...args: Args) => Promise<Value>;
153
202
  } & {
154
- [key in `on${Capitalize<Name>}Change`]: (callback: (value: Value) => void) => void;
203
+ [key in `on${Capitalize<Name>}Change`]: (...tupleArgs: [...args: Args, callback: (value: Value) => void]) => void;
155
204
  } & {
156
- [key in `use${Capitalize<Name>}`]: () => Value;
205
+ [key in `use${Capitalize<Name>}`]: (...args: Args) => Value;
157
206
  };
158
207
  type StackClientAppConstructor = {
159
208
  new <TokenStoreType extends string, HasTokenStore extends (TokenStoreType extends {} ? true : boolean), ProjectId extends string>(options: StackClientAppConstructorOptions<HasTokenStore, ProjectId>): StackClientApp<HasTokenStore, ProjectId>;
@@ -188,10 +237,10 @@ type StackClientApp<HasTokenStore extends boolean = boolean, ProjectId extends s
188
237
  toClientJson(): StackClientAppJson<HasTokenStore, ProjectId>;
189
238
  setCurrentUser(userJsonPromise: Promise<UserJson | null>): void;
190
239
  };
191
- } & AsyncStoreProperty<"project", ClientProjectJson, false> & {
192
- [K in `redirectTo${Capitalize<keyof Omit<HandlerUrls, 'handler' | 'oauthCallback'>>}`]: () => Promise<never>;
240
+ } & AsyncStoreProperty<"project", [], ClientProjectJson, false> & {
241
+ [K in `redirectTo${Capitalize<keyof Omit<HandlerUrls, 'handler' | 'oauthCallback'>>}`]: () => Promise<void>;
193
242
  } & (HasTokenStore extends false ? {} : {
194
- redirectToOAuthCallback(): Promise<never>;
243
+ redirectToOAuthCallback(): Promise<void>;
195
244
  useUser(options: GetUserOptions & {
196
245
  or: 'redirect';
197
246
  }): ProjectCurrentUser<ProjectId>;
@@ -206,22 +255,29 @@ type StackClientApp<HasTokenStore extends boolean = boolean, ProjectId extends s
206
255
  or: 'throw';
207
256
  }): Promise<ProjectCurrentUser<ProjectId>>;
208
257
  getUser(options?: GetUserOptions): Promise<ProjectCurrentUser<ProjectId> | null>;
209
- onUserChange: AsyncStoreProperty<"user", CurrentUser | null, false>["onUserChange"];
258
+ onUserChange: AsyncStoreProperty<"user", [], CurrentUser | null, false>["onUserChange"];
210
259
  }));
211
260
  declare const StackClientApp: StackClientAppConstructor;
212
261
  type StackServerAppConstructor = {
213
262
  new <TokenStoreType extends string, HasTokenStore extends (TokenStoreType extends {} ? true : boolean), ProjectId extends string>(options: StackServerAppConstructorOptions<HasTokenStore, ProjectId>): StackServerApp<HasTokenStore, ProjectId>;
214
263
  new (options: StackServerAppConstructorOptions<boolean, string>): StackServerApp<boolean, string>;
215
264
  };
216
- type StackServerApp<HasTokenStore extends boolean = boolean, ProjectId extends string = string> = (StackClientApp<HasTokenStore, ProjectId> & AsyncStoreProperty<"serverUser", CurrentServerUser | null, false> & AsyncStoreProperty<"serverUsers", ServerUser[], true> & {});
265
+ type StackServerApp<HasTokenStore extends boolean = boolean, ProjectId extends string = string> = (StackClientApp<HasTokenStore, ProjectId> & {
266
+ createTeam(data: ServerTeamCustomizableJson): Promise<ServerTeam>;
267
+ createPermissionDefinition(data: ServerPermissionDefinitionCustomizableJson): Promise<ServerPermission>;
268
+ updatePermissionDefinition(permissionId: string, data: Partial<ServerPermissionDefinitionCustomizableJson>): Promise<void>;
269
+ deletePermissionDefinition(permissionId: string): Promise<void>;
270
+ listPermissionDefinitions(): Promise<ServerPermissionDefinitionJson[]>;
271
+ usePermissionDefinitions(): ServerPermissionDefinitionJson[];
272
+ } & 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
273
  declare const StackServerApp: StackServerAppConstructor;
218
274
  type StackAdminAppConstructor = {
219
275
  new <HasTokenStore extends boolean, ProjectId extends string>(options: StackAdminAppConstructorOptions<HasTokenStore, ProjectId>): StackAdminApp<HasTokenStore, ProjectId>;
220
276
  new (options: StackAdminAppConstructorOptions<boolean, string>): StackAdminApp<boolean, string>;
221
277
  };
222
- type StackAdminApp<HasTokenStore extends boolean = boolean, ProjectId extends string = string> = (StackServerApp<HasTokenStore, ProjectId> & AsyncStoreProperty<"projectAdmin", Project, false> & AsyncStoreProperty<"apiKeySets", ApiKeySet[], true> & {
278
+ type StackAdminApp<HasTokenStore extends boolean = boolean, ProjectId extends string = string> = (StackServerApp<HasTokenStore, ProjectId> & AsyncStoreProperty<"projectAdmin", [], Project, false> & AsyncStoreProperty<"apiKeySets", [], ApiKeySet[], true> & {
223
279
  createApiKeySet(options: ApiKeySetCreateOptions): Promise<ApiKeySetFirstView>;
224
280
  });
225
281
  declare const StackAdminApp: StackAdminAppConstructor;
226
282
 
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 };
283
+ 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 };
@@ -1,7 +1,8 @@
1
- import { ServerUserJson, ServerUserCustomizableJson, OAuthProviderConfigJson, KnownErrors } from '@stackframe/stack-shared';
2
- import { ReadonlyTokenStore, UserJson, UserCustomizableJson, ProjectJson, ProductionModeError, EmailConfigJson, DomainConfigJson, ClientProjectJson } from '@stackframe/stack-shared/dist/interface/clientInterface';
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: Partial<C>): Promise<void>;
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: {
@@ -56,7 +57,7 @@ type InternalAuth<T> = {
56
57
  useOwnedProjects(this: T): Project[];
57
58
  onOwnedProjectsChange(this: T, callback: (projects: Project[]) => void): void;
58
59
  };
59
- type User = {
60
+ type User = ({
60
61
  readonly projectId: string;
61
62
  readonly id: string;
62
63
  readonly displayName: string | null;
@@ -74,25 +75,37 @@ type User = {
74
75
  readonly hasPassword: boolean;
75
76
  readonly authWithEmail: boolean;
76
77
  readonly oauthProviders: readonly string[];
78
+ hasPermission(this: CurrentUser, scope: Team, permissionId: string): Promise<boolean>;
77
79
  toJson(this: CurrentUser): UserJson;
78
- };
79
- type CurrentUser = Auth<User, UserCustomizableJson> & User;
80
+ } & AsyncStoreProperty<"team", [id: string], Team | null, false> & AsyncStoreProperty<"teams", [], Team[], true> & Omit<AsyncStoreProperty<"permission", [scope: Team, permissionId: string, options?: {
81
+ direct?: boolean;
82
+ }], Permission | null, false>, "onPermissionChange"> & Omit<AsyncStoreProperty<"permissions", [scope: Team, options?: {
83
+ direct?: boolean;
84
+ }], Permission[], true>, "onPermissionsChange">);
85
+ type CurrentUser = Auth<User, UserUpdateJson> & User;
80
86
  type CurrentInternalUser = CurrentUser & InternalAuth<CurrentUser>;
81
87
  /**
82
88
  * A user including sensitive fields that should only be used on the server, never sent to the client
83
89
  * (such as sensitive information and serverMetadata).
84
90
  */
85
- type ServerUser = Omit<User, "toJson"> & {
91
+ 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
92
  readonly serverMetadata: ReadonlyJson;
87
93
  /**
88
94
  * Returns a new user object with the sensitive fields removed.
89
95
  */
90
96
  getClientUser(this: ServerUser): User;
91
- toJson(this: ServerUser): ServerUserJson;
92
- update(this: ServerUser, user: Partial<ServerUserCustomizableJson>): Promise<void>;
97
+ update(this: ServerUser, user: Partial<ServerUserUpdateJson>): Promise<void>;
93
98
  delete(this: ServerUser): Promise<void>;
94
- };
95
- type CurrentServerUser = Auth<ServerUser, ServerUserCustomizableJson> & Omit<ServerUser, "getClientUser"> & {
99
+ grantPermission(scope: Team, permissionId: string): Promise<void>;
100
+ revokePermission(scope: Team, permissionId: string): Promise<void>;
101
+ hasPermission(scope: Team, permissionId: string): Promise<boolean>;
102
+ toJson(this: ServerUser): ServerUserJson;
103
+ } & AsyncStoreProperty<"team", [id: string], ServerTeam | null, false> & AsyncStoreProperty<"teams", [], ServerTeam[], true> & Omit<AsyncStoreProperty<"permission", [scope: Team, permissionId: string, options?: {
104
+ direct?: boolean;
105
+ }], ServerPermission | null, false>, "onPermissionChange"> & Omit<AsyncStoreProperty<"permissions", [scope: Team, options?: {
106
+ direct?: boolean;
107
+ }], ServerPermission[], true>, "onPermissionsChange">);
108
+ type CurrentServerUser = Auth<ServerUser, ServerUserUpdateJson> & Omit<ServerUser, "getClientUser"> & {
96
109
  getClientUser(this: CurrentServerUser): CurrentUser;
97
110
  };
98
111
  type CurrentInternalServerUser = CurrentServerUser & InternalAuth<CurrentServerUser>;
@@ -111,11 +124,47 @@ type Project = {
111
124
  readonly oauthProviders: OAuthProviderConfig[];
112
125
  readonly emailConfig?: EmailConfig;
113
126
  readonly domains: DomainConfig[];
127
+ readonly createTeamOnSignUp: boolean;
114
128
  };
115
129
  update(this: Project, update: ProjectUpdateOptions): Promise<void>;
116
130
  toJson(this: Project): ProjectJson;
117
131
  getProductionModeErrors(this: Project): ProductionModeError[];
118
132
  };
133
+ type Team = {
134
+ id: string;
135
+ displayName: string;
136
+ createdAt: Date;
137
+ toJson(this: Team): TeamJson;
138
+ };
139
+ type ServerTeam = Team & {
140
+ listMembers(): Promise<ServerTeamMember[]>;
141
+ useMembers(): ServerTeamMember[];
142
+ update(update: Partial<ServerTeamCustomizableJson>): Promise<void>;
143
+ delete(): Promise<void>;
144
+ addUser(userId: string): Promise<void>;
145
+ removeUser(userId: string): Promise<void>;
146
+ };
147
+ type TeamMember = {
148
+ userId: string;
149
+ teamId: string;
150
+ displayName: string | null;
151
+ };
152
+ type ServerTeamMember = TeamMember & {
153
+ getUser(): Promise<ServerUser>;
154
+ };
155
+ type Permission = {
156
+ id: string;
157
+ } & ({
158
+ type: "global";
159
+ } | {
160
+ type: "team";
161
+ teamId: string;
162
+ });
163
+ type ServerPermission = Permission & {
164
+ readonly __databaseUniqueId: string;
165
+ readonly description?: string;
166
+ readonly containPermissionIds: string[];
167
+ };
119
168
  type ApiKeySetBase = {
120
169
  id: string;
121
170
  description: string;
@@ -148,12 +197,12 @@ type OAuthProviderConfig = OAuthProviderConfigJson;
148
197
  type GetUserOptions = {
149
198
  or?: 'redirect' | 'throw' | 'return-null';
150
199
  };
151
- type AsyncStoreProperty<Name extends string, Value, IsMultiple extends boolean> = {
152
- [key in `${IsMultiple extends true ? "list" : "get"}${Capitalize<Name>}`]: () => Promise<Value>;
200
+ type AsyncStoreProperty<Name extends string, Args extends any[], Value, IsMultiple extends boolean> = {
201
+ [key in `${IsMultiple extends true ? "list" : "get"}${Capitalize<Name>}`]: (...args: Args) => Promise<Value>;
153
202
  } & {
154
- [key in `on${Capitalize<Name>}Change`]: (callback: (value: Value) => void) => void;
203
+ [key in `on${Capitalize<Name>}Change`]: (...tupleArgs: [...args: Args, callback: (value: Value) => void]) => void;
155
204
  } & {
156
- [key in `use${Capitalize<Name>}`]: () => Value;
205
+ [key in `use${Capitalize<Name>}`]: (...args: Args) => Value;
157
206
  };
158
207
  type StackClientAppConstructor = {
159
208
  new <TokenStoreType extends string, HasTokenStore extends (TokenStoreType extends {} ? true : boolean), ProjectId extends string>(options: StackClientAppConstructorOptions<HasTokenStore, ProjectId>): StackClientApp<HasTokenStore, ProjectId>;
@@ -188,10 +237,10 @@ type StackClientApp<HasTokenStore extends boolean = boolean, ProjectId extends s
188
237
  toClientJson(): StackClientAppJson<HasTokenStore, ProjectId>;
189
238
  setCurrentUser(userJsonPromise: Promise<UserJson | null>): void;
190
239
  };
191
- } & AsyncStoreProperty<"project", ClientProjectJson, false> & {
192
- [K in `redirectTo${Capitalize<keyof Omit<HandlerUrls, 'handler' | 'oauthCallback'>>}`]: () => Promise<never>;
240
+ } & AsyncStoreProperty<"project", [], ClientProjectJson, false> & {
241
+ [K in `redirectTo${Capitalize<keyof Omit<HandlerUrls, 'handler' | 'oauthCallback'>>}`]: () => Promise<void>;
193
242
  } & (HasTokenStore extends false ? {} : {
194
- redirectToOAuthCallback(): Promise<never>;
243
+ redirectToOAuthCallback(): Promise<void>;
195
244
  useUser(options: GetUserOptions & {
196
245
  or: 'redirect';
197
246
  }): ProjectCurrentUser<ProjectId>;
@@ -206,22 +255,29 @@ type StackClientApp<HasTokenStore extends boolean = boolean, ProjectId extends s
206
255
  or: 'throw';
207
256
  }): Promise<ProjectCurrentUser<ProjectId>>;
208
257
  getUser(options?: GetUserOptions): Promise<ProjectCurrentUser<ProjectId> | null>;
209
- onUserChange: AsyncStoreProperty<"user", CurrentUser | null, false>["onUserChange"];
258
+ onUserChange: AsyncStoreProperty<"user", [], CurrentUser | null, false>["onUserChange"];
210
259
  }));
211
260
  declare const StackClientApp: StackClientAppConstructor;
212
261
  type StackServerAppConstructor = {
213
262
  new <TokenStoreType extends string, HasTokenStore extends (TokenStoreType extends {} ? true : boolean), ProjectId extends string>(options: StackServerAppConstructorOptions<HasTokenStore, ProjectId>): StackServerApp<HasTokenStore, ProjectId>;
214
263
  new (options: StackServerAppConstructorOptions<boolean, string>): StackServerApp<boolean, string>;
215
264
  };
216
- type StackServerApp<HasTokenStore extends boolean = boolean, ProjectId extends string = string> = (StackClientApp<HasTokenStore, ProjectId> & AsyncStoreProperty<"serverUser", CurrentServerUser | null, false> & AsyncStoreProperty<"serverUsers", ServerUser[], true> & {});
265
+ type StackServerApp<HasTokenStore extends boolean = boolean, ProjectId extends string = string> = (StackClientApp<HasTokenStore, ProjectId> & {
266
+ createTeam(data: ServerTeamCustomizableJson): Promise<ServerTeam>;
267
+ createPermissionDefinition(data: ServerPermissionDefinitionCustomizableJson): Promise<ServerPermission>;
268
+ updatePermissionDefinition(permissionId: string, data: Partial<ServerPermissionDefinitionCustomizableJson>): Promise<void>;
269
+ deletePermissionDefinition(permissionId: string): Promise<void>;
270
+ listPermissionDefinitions(): Promise<ServerPermissionDefinitionJson[]>;
271
+ usePermissionDefinitions(): ServerPermissionDefinitionJson[];
272
+ } & 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
273
  declare const StackServerApp: StackServerAppConstructor;
218
274
  type StackAdminAppConstructor = {
219
275
  new <HasTokenStore extends boolean, ProjectId extends string>(options: StackAdminAppConstructorOptions<HasTokenStore, ProjectId>): StackAdminApp<HasTokenStore, ProjectId>;
220
276
  new (options: StackAdminAppConstructorOptions<boolean, string>): StackAdminApp<boolean, string>;
221
277
  };
222
- type StackAdminApp<HasTokenStore extends boolean = boolean, ProjectId extends string = string> = (StackServerApp<HasTokenStore, ProjectId> & AsyncStoreProperty<"projectAdmin", Project, false> & AsyncStoreProperty<"apiKeySets", ApiKeySet[], true> & {
278
+ type StackAdminApp<HasTokenStore extends boolean = boolean, ProjectId extends string = string> = (StackServerApp<HasTokenStore, ProjectId> & AsyncStoreProperty<"projectAdmin", [], Project, false> & AsyncStoreProperty<"apiKeySets", [], ApiKeySet[], true> & {
223
279
  createApiKeySet(options: ApiKeySetCreateOptions): Promise<ApiKeySetFirstView>;
224
280
  });
225
281
  declare const StackAdminApp: StackAdminAppConstructor;
226
282
 
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 };
283
+ 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 };