@stackframe/stack 2.3.8 → 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 (281) 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 +12 -2
  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 +14 -4
  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 +38 -16
  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 +297 -13
  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.d.mts +5 -2
  240. package/dist/lib/cookie.d.ts +5 -2
  241. package/dist/lib/cookie.js +40 -18
  242. package/dist/lib/cookie.js.map +1 -0
  243. package/dist/lib/hooks.d.mts +1 -0
  244. package/dist/lib/hooks.d.ts +1 -0
  245. package/dist/lib/hooks.js +1 -0
  246. package/dist/lib/hooks.js.map +1 -0
  247. package/dist/lib/stack-app.d.mts +78 -22
  248. package/dist/lib/stack-app.d.ts +78 -22
  249. package/dist/lib/stack-app.js +297 -13
  250. package/dist/lib/stack-app.js.map +1 -0
  251. package/dist/providers/component-provider.d.mts +6 -6
  252. package/dist/providers/component-provider.d.ts +6 -6
  253. package/dist/providers/component-provider.js +1 -0
  254. package/dist/providers/component-provider.js.map +1 -0
  255. package/dist/providers/design-provider.js +1 -0
  256. package/dist/providers/design-provider.js.map +1 -0
  257. package/dist/providers/joy-provider.js +1 -0
  258. package/dist/providers/joy-provider.js.map +1 -0
  259. package/dist/providers/stack-provider-client.d.mts +1 -0
  260. package/dist/providers/stack-provider-client.d.ts +1 -0
  261. package/dist/providers/stack-provider-client.js +1 -0
  262. package/dist/providers/stack-provider-client.js.map +1 -0
  263. package/dist/providers/stack-provider.d.mts +1 -0
  264. package/dist/providers/stack-provider.d.ts +1 -0
  265. package/dist/providers/stack-provider.js +1 -0
  266. package/dist/providers/stack-provider.js.map +1 -0
  267. package/dist/providers/styled-components-registry.js +1 -0
  268. package/dist/providers/styled-components-registry.js.map +1 -0
  269. package/dist/providers/theme-provider.js +1 -0
  270. package/dist/providers/theme-provider.js.map +1 -0
  271. package/dist/utils/browser-script.js +1 -0
  272. package/dist/utils/browser-script.js.map +1 -0
  273. package/dist/utils/constants.js +1 -0
  274. package/dist/utils/constants.js.map +1 -0
  275. package/dist/utils/email.js +1 -0
  276. package/dist/utils/email.js.map +1 -0
  277. package/dist/utils/next.js +1 -0
  278. package/dist/utils/next.js.map +1 -0
  279. package/dist/utils/url.js +1 -0
  280. package/dist/utils/url.js.map +1 -0
  281. package/package.json +3 -3
@@ -53,6 +53,9 @@ var import_objects = require("@stackframe/stack-shared/dist/utils/objects");
53
53
  var import_promises = require("@stackframe/stack-shared/dist/utils/promises");
54
54
  var import_caches = require("@stackframe/stack-shared/dist/utils/caches");
55
55
  var import_react3 = require("@stackframe/stack-shared/dist/utils/react");
56
+ function permissionDefinitionScopeToType(scope) {
57
+ return { "any-team": "team", "specific-team": "team", "global": "global" }[scope.type];
58
+ }
56
59
  function getUrls(partial) {
57
60
  const handler = partial.handler ?? "/handler";
58
61
  return {
@@ -80,10 +83,10 @@ function getDefaultPublishableClientKey() {
80
83
  return process.env.NEXT_PUBLIC_STACK_PUBLISHABLE_CLIENT_KEY || (0, import_errors.throwErr)("Welcome to Stack! It seems that you haven't provided a publishable client key. Please create an API key for your project on the Stack dashboard at https://app.stack-auth.com and copy your publishable client key into the NEXT_PUBLIC_STACK_PUBLISHABLE_CLIENT_KEY environment variable.");
81
84
  }
82
85
  function getDefaultSecretServerKey() {
83
- return process.env.STACK_SECRET_SERVER_KEY || (0, import_errors.throwErr)("No secret server key provided. Please copy your publishable client key from the Stack dashboard and put your it in the STACK_SECRET_SERVER_KEY environment variable.");
86
+ return process.env.STACK_SECRET_SERVER_KEY || (0, import_errors.throwErr)("No secret server key provided. Please copy your key from the Stack dashboard and put your it in the STACK_SECRET_SERVER_KEY environment variable.");
84
87
  }
85
88
  function getDefaultSuperSecretAdminKey() {
86
- return process.env.STACK_SUPER_SECRET_ADMIN_KEY || (0, import_errors.throwErr)("No super secret admin key provided. Please copy your publishable client key from the Stack dashboard and put it in the STACK_SUPER_SECRET_ADMIN_KEY environment variable.");
89
+ return process.env.STACK_SUPER_SECRET_ADMIN_KEY || (0, import_errors.throwErr)("No super secret admin key provided. Please copy your key from the Stack dashboard and put it in the STACK_SUPER_SECRET_ADMIN_KEY environment variable.");
87
90
  }
88
91
  function getDefaultBaseUrl() {
89
92
  return process.env.NEXT_PUBLIC_STACK_URL || defaultBaseUrl;
@@ -120,8 +123,8 @@ var cookieTokenStoreInitializer = () => {
120
123
  }, 10);
121
124
  cookieTokenStore.onChange((value) => {
122
125
  try {
123
- (0, import_cookie.setOrDeleteCookie)("stack-refresh", value.refreshToken);
124
- (0, import_cookie.setOrDeleteCookie)("stack-access", value.accessToken);
126
+ (0, import_cookie.setOrDeleteCookie)("stack-refresh", value.refreshToken, { maxAge: 60 * 60 * 24 * 365 });
127
+ (0, import_cookie.setOrDeleteCookie)("stack-access", value.accessToken, { maxAge: 60 * 60 * 24 });
125
128
  hasSucceededInWriting = true;
126
129
  } catch (e) {
127
130
  hasSucceededInWriting = false;
@@ -143,8 +146,8 @@ var tokenStoreInitializers = /* @__PURE__ */ new Map([
143
146
  });
144
147
  store.onChange((value) => {
145
148
  try {
146
- (0, import_cookie.setOrDeleteCookie)("stack-refresh", value.refreshToken);
147
- (0, import_cookie.setOrDeleteCookie)("stack-access", value.accessToken);
149
+ (0, import_cookie.setOrDeleteCookie)("stack-refresh", value.refreshToken, { maxAge: 60 * 60 * 24 * 365 });
150
+ (0, import_cookie.setOrDeleteCookie)("stack-access", value.accessToken, { maxAge: 60 * 60 * 24 });
148
151
  } catch (e) {
149
152
  }
150
153
  });
@@ -216,6 +219,12 @@ var _StackClientAppImpl = class __StackClientAppImpl {
216
219
  _ownedProjectsCache = createCacheByTokenStore(async (tokenStore) => {
217
220
  return await this._interface.listProjects(tokenStore);
218
221
  });
222
+ _currentUserPermissionsCache = createCacheByTokenStore(async (tokenStore, [teamId, type, direct]) => {
223
+ return await this._interface.listClientUserTeamPermissions({ teamId, type, direct }, tokenStore);
224
+ });
225
+ _currentUserTeamsCache = createCacheByTokenStore(async (tokenStore) => {
226
+ return await this._interface.listClientUserTeams(tokenStore);
227
+ });
219
228
  constructor(options) {
220
229
  if ("interface" in options) {
221
230
  this._interface = options.interface;
@@ -250,7 +259,33 @@ var _StackClientAppImpl = class __StackClientAppImpl {
250
259
  throw new Error("Cannot call this function on a Stack app with a project ID other than 'internal'.");
251
260
  }
252
261
  }
262
+ _permissionFromJson(json) {
263
+ const type = permissionDefinitionScopeToType(json.scope);
264
+ if (type === "team") {
265
+ return {
266
+ id: json.id,
267
+ type,
268
+ teamId: json.scope.teamId
269
+ };
270
+ } else {
271
+ return {
272
+ id: json.id,
273
+ type
274
+ };
275
+ }
276
+ }
277
+ _teamFromJson(json) {
278
+ return {
279
+ id: json.id,
280
+ displayName: json.displayName,
281
+ createdAt: new Date(json.createdAtMillis),
282
+ toJson() {
283
+ return json;
284
+ }
285
+ };
286
+ }
253
287
  _userFromJson(json) {
288
+ const app = this;
254
289
  return {
255
290
  projectId: json.projectId,
256
291
  id: json.id,
@@ -264,11 +299,69 @@ var _StackClientAppImpl = class __StackClientAppImpl {
264
299
  hasPassword: json.hasPassword,
265
300
  authWithEmail: json.authWithEmail,
266
301
  oauthProviders: json.oauthProviders,
302
+ async getTeam(teamId) {
303
+ const teams = await this.listTeams();
304
+ return teams.find((t) => t.id === teamId) ?? null;
305
+ },
306
+ useTeam(teamId) {
307
+ const teams = this.useTeams();
308
+ return (0, import_react.useMemo)(() => {
309
+ return teams.find((t) => t.id === teamId) ?? null;
310
+ }, [teams, teamId]);
311
+ },
312
+ onTeamChange(teamId, callback) {
313
+ return this.onTeamsChange((teams) => {
314
+ const team = teams.find((t) => t.id === teamId) ?? null;
315
+ callback(team);
316
+ });
317
+ },
318
+ async listTeams() {
319
+ const teams = await app._currentUserTeamsCache.getOrWait([getTokenStore(app._tokenStoreOptions)], "write-only");
320
+ return teams.map((json2) => app._teamFromJson(json2));
321
+ },
322
+ useTeams() {
323
+ const teams = useCache(app._currentUserTeamsCache, [getTokenStore(app._tokenStoreOptions)], "user.useTeams()");
324
+ return (0, import_react.useMemo)(() => teams.map((json2) => app._teamFromJson(json2)), [teams]);
325
+ },
326
+ onTeamsChange(callback) {
327
+ return app._currentUserTeamsCache.onChange([getTokenStore(app._tokenStoreOptions)], (value, oldValue) => {
328
+ callback(value.map((json2) => app._teamFromJson(json2)), oldValue?.map((json2) => app._teamFromJson(json2)));
329
+ });
330
+ },
331
+ async listPermissions(scope, options) {
332
+ const permissions = await app._currentUserPermissionsCache.getOrWait([getTokenStore(app._tokenStoreOptions), scope.id, "team", !!options?.direct], "write-only");
333
+ return permissions.map((json2) => app._permissionFromJson(json2));
334
+ },
335
+ usePermissions(scope, options) {
336
+ const permissions = useCache(app._currentUserPermissionsCache, [getTokenStore(app._tokenStoreOptions), scope.id, "team", !!options?.direct], "user.usePermissions()");
337
+ return (0, import_react.useMemo)(() => permissions.map((json2) => app._permissionFromJson(json2)), [permissions]);
338
+ },
339
+ usePermission(scope, permissionId) {
340
+ const permissions = this.usePermissions(scope);
341
+ return (0, import_react.useMemo)(() => permissions.find((p) => p.id === permissionId) ?? null, [permissions, permissionId]);
342
+ },
343
+ async getPermission(scope, permissionId) {
344
+ const permissions = await this.listPermissions(scope);
345
+ return permissions.find((p) => p.id === permissionId) ?? null;
346
+ },
347
+ async hasPermission(scope, permissionId) {
348
+ const permissions = await this.listPermissions(scope);
349
+ return permissions.some((p) => p.id === permissionId);
350
+ },
267
351
  toJson() {
268
352
  return json;
269
353
  }
270
354
  };
271
355
  }
356
+ _teamMemberFromJson(json) {
357
+ if (json === null)
358
+ return null;
359
+ return {
360
+ teamId: json.teamId,
361
+ userId: json.userId,
362
+ displayName: json.displayName
363
+ };
364
+ }
272
365
  _currentUserFromJson(json, tokenStore) {
273
366
  if (json === null)
274
367
  return null;
@@ -346,7 +439,8 @@ var _StackClientAppImpl = class __StackClientAppImpl {
346
439
  allowLocalhost: data.evaluatedConfig.allowLocalhost,
347
440
  oauthProviders: data.evaluatedConfig.oauthProviders,
348
441
  emailConfig: data.evaluatedConfig.emailConfig,
349
- domains: data.evaluatedConfig.domains
442
+ domains: data.evaluatedConfig.domains,
443
+ createTeamOnSignUp: data.evaluatedConfig.createTeamOnSignUp
350
444
  },
351
445
  async update(update) {
352
446
  await adminInterface.updateProject(update);
@@ -378,7 +472,7 @@ var _StackClientAppImpl = class __StackClientAppImpl {
378
472
  throw new Error(`No URL for handler name ${handlerName}`);
379
473
  }
380
474
  window.location.href = this.urls[handlerName];
381
- return (0, import_promises.neverResolve)();
475
+ return (0, import_promises.wait)(2e3);
382
476
  }
383
477
  async redirectToSignIn() {
384
478
  return await this._redirectTo("signIn");
@@ -469,7 +563,7 @@ var _StackClientAppImpl = class __StackClientAppImpl {
469
563
  case "redirect": {
470
564
  router.replace(this.urls.signIn);
471
565
  (0, import_react3.suspend)();
472
- throw new Error("suspend should never return! This is a bug in Stack.");
566
+ throw new import_errors.StackAssertionError("suspend should never return");
473
567
  }
474
568
  case "throw": {
475
569
  throw new Error("User is not signed in but useUser was called with { or: 'throw' }");
@@ -541,10 +635,12 @@ var _StackClientAppImpl = class __StackClientAppImpl {
541
635
  this._ensurePersistentTokenStore();
542
636
  const tokenStore = getTokenStore(this._tokenStoreOptions);
543
637
  const result = await (0, import_auth.callOAuthCallback)(this._interface, tokenStore, this.urls.oauthCallback);
544
- if (result?.newUser) {
545
- window.location.replace(this.urls.afterSignUp);
546
- } else {
547
- window.location.replace(this.urls.afterSignIn);
638
+ if (result) {
639
+ if (result.newUser) {
640
+ window.location.replace(this.urls.afterSignUp);
641
+ } else {
642
+ window.location.replace(this.urls.afterSignIn);
643
+ }
548
644
  }
549
645
  await (0, import_promises.neverResolve)();
550
646
  }
@@ -679,6 +775,22 @@ var _StackServerAppImpl = class extends _StackClientAppImpl {
679
775
  _serverUsersCache = createCache(async () => {
680
776
  return await this._interface.listUsers();
681
777
  });
778
+ _serverUserCache = createCache(async ([userId]) => {
779
+ const user = await this._interface.getServerUserById(userId);
780
+ return import_results.Result.or(user, null);
781
+ });
782
+ _serverTeamsCache = createCache(async () => {
783
+ return await this._interface.listTeams();
784
+ });
785
+ _serverTeamMembersCache = createCache(async ([teamId]) => {
786
+ return await this._interface.listTeamMembers(teamId);
787
+ });
788
+ _serverTeamPermissionDefinitionsCache = createCache(async () => {
789
+ return await this._interface.listPermissionDefinitions();
790
+ });
791
+ _serverTeamUserPermissionsCache = createCache(async ([teamId, userId, type, direct]) => {
792
+ return await this._interface.listTeamMemberPermissions({ teamId, userId, type, direct });
793
+ });
682
794
  constructor(options) {
683
795
  if ("interface" in options) {
684
796
  super({
@@ -719,6 +831,67 @@ var _StackServerAppImpl = class extends _StackClientAppImpl {
719
831
  getClientUser() {
720
832
  return app._userFromJson(json);
721
833
  },
834
+ async grantPermission(scope, permissionId) {
835
+ await app._interface.grantTeamUserPermission(scope.id, json.id, permissionId, "team");
836
+ for (const direct of [true, false]) {
837
+ await app._serverTeamUserPermissionsCache.refresh([scope.id, json.id, "team", direct]);
838
+ }
839
+ },
840
+ async revokePermission(scope, permissionId) {
841
+ await app._interface.revokeTeamUserPermission(scope.id, json.id, permissionId, "team");
842
+ for (const direct of [true, false]) {
843
+ await app._serverTeamUserPermissionsCache.refresh([scope.id, json.id, "team", direct]);
844
+ }
845
+ },
846
+ async getTeam(teamId) {
847
+ const teams = await this.listTeams();
848
+ return teams.find((t) => t.id === teamId) ?? null;
849
+ },
850
+ useTeam(teamId) {
851
+ const teams = this.useTeams();
852
+ return (0, import_react.useMemo)(() => {
853
+ return teams.find((t) => t.id === teamId) ?? null;
854
+ }, [teams, teamId]);
855
+ },
856
+ onTeamChange(teamId, callback) {
857
+ return this.onTeamsChange((teams) => {
858
+ const team = teams.find((t) => t.id === teamId) ?? null;
859
+ callback(team);
860
+ });
861
+ },
862
+ async listTeams() {
863
+ const teams = await app._serverTeamsCache.getOrWait([getTokenStore(app._tokenStoreOptions)], "write-only");
864
+ return teams.map((json2) => app._serverTeamFromJson(json2));
865
+ },
866
+ useTeams() {
867
+ const teams = useCache(app._serverTeamsCache, [getTokenStore(app._tokenStoreOptions)], "user.useTeams()");
868
+ return (0, import_react.useMemo)(() => teams.map((json2) => app._serverTeamFromJson(json2)), [teams]);
869
+ },
870
+ onTeamsChange(callback) {
871
+ return app._serverTeamsCache.onChange([getTokenStore(app._tokenStoreOptions)], (value, oldValue) => {
872
+ callback(value.map((json2) => app._serverTeamFromJson(json2)), oldValue?.map((json2) => app._serverTeamFromJson(json2)));
873
+ });
874
+ },
875
+ async listPermissions(scope, options) {
876
+ const permissions = await app._serverTeamUserPermissionsCache.getOrWait([scope.id, json.id, "team", !!options?.direct], "write-only");
877
+ return permissions.map((json2) => app._serverPermissionFromJson(json2));
878
+ },
879
+ usePermissions(scope, options) {
880
+ const permissions = useCache(app._serverTeamUserPermissionsCache, [scope.id, json.id, "team", !!options?.direct], "user.usePermissions()");
881
+ return (0, import_react.useMemo)(() => permissions.map((json2) => app._serverPermissionFromJson(json2)), [permissions]);
882
+ },
883
+ usePermission(scope, permissionId) {
884
+ const permissions = this.usePermissions(scope);
885
+ return (0, import_react.useMemo)(() => permissions.find((p) => p.id === permissionId) ?? null, [permissions, permissionId]);
886
+ },
887
+ async getPermission(scope, permissionId) {
888
+ const permissions = await this.listPermissions(scope);
889
+ return permissions.find((p) => p.id === permissionId) ?? null;
890
+ },
891
+ async hasPermission(scope, permissionId) {
892
+ const permissions = await this.listPermissions(scope);
893
+ return permissions.some((p) => p.id === permissionId);
894
+ },
722
895
  toJson() {
723
896
  return app._serverUserToJson(this);
724
897
  }
@@ -778,6 +951,20 @@ var _StackServerAppImpl = class extends _StackClientAppImpl {
778
951
  return currentUser;
779
952
  }
780
953
  }
954
+ _serverTeamMemberFromJson(json) {
955
+ if (json === null)
956
+ return null;
957
+ const app = this;
958
+ return {
959
+ ...app._teamMemberFromJson(json),
960
+ async getUser() {
961
+ const user = app._serverUserFromJson(await app._serverUserCache.getOrWait([json.userId], "write-only"));
962
+ if (!user)
963
+ throw new Error(`User ${json.userId} not found`);
964
+ return user;
965
+ }
966
+ };
967
+ }
781
968
  _serverUserToJson(user) {
782
969
  return {
783
970
  projectId: user.projectId,
@@ -795,12 +982,56 @@ var _StackServerAppImpl = class extends _StackClientAppImpl {
795
982
  oauthProviders: user.oauthProviders
796
983
  };
797
984
  }
985
+ _serverTeamFromJson(json) {
986
+ const app = this;
987
+ return {
988
+ id: json.id,
989
+ displayName: json.displayName,
990
+ createdAt: new Date(json.createdAtMillis),
991
+ async listMembers() {
992
+ return (await app._interface.listTeamMembers(json.id)).map((u) => app._serverTeamMemberFromJson(u));
993
+ },
994
+ async update(update) {
995
+ await app._interface.updateTeam(json.id, update);
996
+ await app._serverTeamsCache.refresh([]);
997
+ },
998
+ async delete() {
999
+ await app._interface.deleteTeam(json.id);
1000
+ await app._serverTeamsCache.refresh([]);
1001
+ },
1002
+ useMembers() {
1003
+ const result = useCache(app._serverTeamMembersCache, [json.id], "team.useUsers()");
1004
+ return (0, import_react.useMemo)(() => result.map((u) => app._serverTeamMemberFromJson(u)), [result]);
1005
+ },
1006
+ async addUser(userId) {
1007
+ await app._interface.addUserToTeam({
1008
+ teamId: json.id,
1009
+ userId
1010
+ });
1011
+ await app._serverTeamMembersCache.refresh([json.id]);
1012
+ },
1013
+ async removeUser(userId) {
1014
+ await app._interface.removeUserFromTeam({
1015
+ teamId: json.id,
1016
+ userId
1017
+ });
1018
+ await app._serverTeamMembersCache.refresh([json.id]);
1019
+ },
1020
+ toJson() {
1021
+ return json;
1022
+ }
1023
+ };
1024
+ }
798
1025
  async getServerUser() {
799
1026
  this._ensurePersistentTokenStore();
800
1027
  const tokenStore = getTokenStore(this._tokenStoreOptions);
801
1028
  const userJson = await this._currentServerUserCache.getOrWait([tokenStore], "write-only");
802
1029
  return this._currentServerUserFromJson(userJson, tokenStore);
803
1030
  }
1031
+ async getServerUserById(userId) {
1032
+ const json = await this._serverUserCache.getOrWait([userId], "write-only");
1033
+ return this._serverUserFromJson(json);
1034
+ }
804
1035
  useServerUser(options) {
805
1036
  this._ensurePersistentTokenStore();
806
1037
  const tokenStore = getTokenStore(this._tokenStoreOptions);
@@ -834,6 +1065,58 @@ var _StackServerAppImpl = class extends _StackClientAppImpl {
834
1065
  callback(users.map((j) => this._serverUserFromJson(j)));
835
1066
  });
836
1067
  }
1068
+ async listPermissionDefinitions() {
1069
+ return await this._serverTeamPermissionDefinitionsCache.getOrWait([], "write-only");
1070
+ }
1071
+ usePermissionDefinitions() {
1072
+ return useCache(this._serverTeamPermissionDefinitionsCache, [], "usePermissions()");
1073
+ }
1074
+ _serverPermissionFromJson(json) {
1075
+ return {
1076
+ ...this._permissionFromJson(json),
1077
+ __databaseUniqueId: json.__databaseUniqueId,
1078
+ description: json.description,
1079
+ containPermissionIds: json.containPermissionIds
1080
+ };
1081
+ }
1082
+ async createPermissionDefinition(data) {
1083
+ const permission = await this._serverPermissionFromJson(await this._interface.createPermissionDefinition(data));
1084
+ await this._serverTeamPermissionDefinitionsCache.refresh([]);
1085
+ return permission;
1086
+ }
1087
+ async updatePermissionDefinition(permissionId, data) {
1088
+ await this._interface.updatePermissionDefinition(permissionId, data);
1089
+ await this._serverTeamPermissionDefinitionsCache.refresh([]);
1090
+ }
1091
+ async deletePermissionDefinition(permissionId) {
1092
+ await this._interface.deletePermissionDefinition(permissionId);
1093
+ await this._serverTeamPermissionDefinitionsCache.refresh([]);
1094
+ }
1095
+ async listTeams() {
1096
+ const teams = await this._serverTeamsCache.getOrWait([], "write-only");
1097
+ return teams.map((t) => this._serverTeamFromJson(t));
1098
+ }
1099
+ async createTeam(data) {
1100
+ const team = await this._interface.createTeam(data);
1101
+ await this._serverTeamsCache.refresh([]);
1102
+ return this._serverTeamFromJson(team);
1103
+ }
1104
+ useTeams() {
1105
+ const teams = useCache(this._serverTeamsCache, [], "useServerTeams()");
1106
+ return (0, import_react.useMemo)(() => {
1107
+ return teams.map((t) => this._serverTeamFromJson(t));
1108
+ }, [teams]);
1109
+ }
1110
+ async getTeam(teamId) {
1111
+ const teams = await this.listTeams();
1112
+ return teams.find((t) => t.id === teamId) ?? null;
1113
+ }
1114
+ useTeam(teamId) {
1115
+ const teams = this.useTeams();
1116
+ return (0, import_react.useMemo)(() => {
1117
+ return teams.find((t) => t.id === teamId) ?? null;
1118
+ }, [teams, teamId]);
1119
+ }
837
1120
  async _refreshUser(tokenStore) {
838
1121
  await Promise.all([
839
1122
  super._refreshUser(tokenStore),
@@ -976,3 +1259,4 @@ var StackAdminApp = _StackAdminAppImpl;
976
1259
  StackServerApp,
977
1260
  stackAppInternalsSymbol
978
1261
  });
1262
+ //# sourceMappingURL=stack-app.js.map