@stackframe/stack 2.6.19 → 2.6.21

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 (32) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/components-page/stack-handler.d.mts +13 -7
  3. package/dist/components-page/stack-handler.d.ts +13 -7
  4. package/dist/components-page/stack-handler.js +146 -126
  5. package/dist/components-page/stack-handler.js.map +1 -1
  6. package/dist/esm/components-page/stack-handler.js +148 -128
  7. package/dist/esm/components-page/stack-handler.js.map +1 -1
  8. package/dist/esm/generated/global-css.js +1 -1
  9. package/dist/esm/generated/global-css.js.map +1 -1
  10. package/dist/esm/generated/quetzal-translations.js +10 -10
  11. package/dist/esm/generated/quetzal-translations.js.map +1 -1
  12. package/dist/esm/lib/cookie.js +118 -40
  13. package/dist/esm/lib/cookie.js.map +1 -1
  14. package/dist/esm/lib/stack-app.js +124 -101
  15. package/dist/esm/lib/stack-app.js.map +1 -1
  16. package/dist/generated/global-css.d.mts +1 -1
  17. package/dist/generated/global-css.d.ts +1 -1
  18. package/dist/generated/global-css.js +1 -1
  19. package/dist/generated/global-css.js.map +1 -1
  20. package/dist/generated/quetzal-translations.d.mts +2 -2
  21. package/dist/generated/quetzal-translations.d.ts +2 -2
  22. package/dist/generated/quetzal-translations.js +10 -10
  23. package/dist/generated/quetzal-translations.js.map +1 -1
  24. package/dist/lib/cookie.d.mts +21 -5
  25. package/dist/lib/cookie.d.ts +21 -5
  26. package/dist/lib/cookie.js +125 -41
  27. package/dist/lib/cookie.js.map +1 -1
  28. package/dist/lib/stack-app.d.mts +3 -4
  29. package/dist/lib/stack-app.d.ts +3 -4
  30. package/dist/lib/stack-app.js +123 -100
  31. package/dist/lib/stack-app.js.map +1 -1
  32. package/package.json +20 -9
@@ -1,5 +1,7 @@
1
1
  // src/lib/cookie.ts
2
2
  import { cookies as rscCookies, headers as rscHeaders } from "@stackframe/stack-sc/force-react-server";
3
+ import { isBrowserLike } from "@stackframe/stack-shared/dist/utils/env";
4
+ import { StackAssertionError } from "@stackframe/stack-shared/dist/utils/errors";
3
5
  import Cookies from "js-cookie";
4
6
 
5
7
  // ../../node_modules/.pnpm/oauth4webapi@2.10.4/node_modules/oauth4webapi/build/index.js
@@ -130,80 +132,156 @@ var skipStateCheck = Symbol();
130
132
  var expectNoState = Symbol();
131
133
 
132
134
  // src/lib/cookie.ts
133
- function getCookie(name) {
134
- if (typeof window !== "undefined") {
135
- Cookies.set("stack-is-https", "true", { secure: true });
136
- return Cookies.get(name) ?? null;
137
- } else {
138
- try {
139
- rscCookies().set("stack-is-https", "true", { secure: true });
140
- } catch (e) {
141
- if (typeof e === "object" && e !== null && "message" in e && typeof e.message === "string" && e.message.includes("Cookies can only be modified in a Server Action or Route Handler")) {
142
- } else {
143
- throw e;
144
- }
145
- }
146
- return rscCookies().get(name)?.value ?? null;
135
+ function ensureClient() {
136
+ if (!isBrowserLike()) {
137
+ throw new Error("cookieClient functions can only be called in a browser environment, yet window is undefined");
147
138
  }
148
139
  }
149
- function setOrDeleteCookie(name, value, options = {}) {
150
- if (value === null) {
151
- deleteCookie(name);
140
+ async function createCookieHelper() {
141
+ if (isBrowserLike()) {
142
+ return createBrowserCookieHelper();
152
143
  } else {
153
- setCookie(name, value, options);
144
+ return createNextCookieHelper(
145
+ await rscCookies(),
146
+ await rscHeaders()
147
+ );
154
148
  }
155
149
  }
156
- function deleteCookie(name) {
157
- if (typeof window !== "undefined") {
158
- Cookies.remove(name);
150
+ function createBrowserCookieHelper() {
151
+ return {
152
+ get: getCookieClient,
153
+ set: setCookieClient,
154
+ setOrDelete: setOrDeleteCookieClient,
155
+ delete: deleteCookieClient
156
+ };
157
+ }
158
+ function handleCookieError(e, options) {
159
+ if (e instanceof Error && e.message.includes("Cookies can only be modified in")) {
160
+ if (options.noOpIfServerComponent) {
161
+ } else {
162
+ throw new StackAssertionError("Attempted to set cookie in server component. Pass { noOpIfServerComponent: true } in the options of Stack's cookie functions if this is intentional and you want to ignore this error. Read more: https://nextjs.org/docs/app/api-reference/functions/cookies#options");
163
+ }
159
164
  } else {
160
- rscCookies().delete(name);
165
+ throw e;
161
166
  }
162
167
  }
163
- function setCookie(name, value, options = {}) {
164
- if (typeof window !== "undefined") {
165
- Cookies.set(name, value, {
166
- secure: window.location.protocol === "https:",
167
- expires: options.maxAge === void 0 ? void 0 : new Date(Date.now() + options.maxAge * 1e3)
168
- });
169
- } else {
170
- let isSecureCookie = !!rscCookies().get("stack-is-https");
171
- if (rscHeaders().get("x-forwarded-proto") === "https") {
172
- isSecureCookie = true;
168
+ function createNextCookieHelper(rscCookiesAwaited, rscHeadersAwaited) {
169
+ const cookieHelper = {
170
+ get: (name) => {
171
+ try {
172
+ rscCookiesAwaited.set("stack-is-https", "true", { secure: true });
173
+ } catch (e) {
174
+ if (typeof e === "object" && e !== null && "message" in e && typeof e.message === "string" && e.message.includes("Cookies can only be modified in a Server Action or Route Handler")) {
175
+ } else {
176
+ throw e;
177
+ }
178
+ }
179
+ return rscCookiesAwaited.get(name)?.value ?? null;
180
+ },
181
+ set: (name, value, options) => {
182
+ let isSecureCookie = !!rscCookiesAwaited.get("stack-is-https");
183
+ if (rscHeadersAwaited.get("x-forwarded-proto") === "https") {
184
+ isSecureCookie = true;
185
+ }
186
+ try {
187
+ rscCookiesAwaited.set(name, value, {
188
+ secure: isSecureCookie,
189
+ maxAge: options.maxAge
190
+ });
191
+ } catch (e) {
192
+ handleCookieError(e, options);
193
+ }
194
+ },
195
+ setOrDelete(name, value, options = {}) {
196
+ if (value === null) {
197
+ this.delete(name, options);
198
+ } else {
199
+ this.set(name, value, options);
200
+ }
201
+ },
202
+ delete(name, options = {}) {
203
+ try {
204
+ rscCookiesAwaited.delete(name);
205
+ } catch (e) {
206
+ handleCookieError(e, options);
207
+ }
173
208
  }
174
- rscCookies().set(name, value, {
175
- secure: isSecureCookie,
176
- maxAge: options.maxAge
177
- });
209
+ };
210
+ return cookieHelper;
211
+ }
212
+ function getCookieClient(name) {
213
+ ensureClient();
214
+ Cookies.set("stack-is-https", "true", { secure: true });
215
+ return Cookies.get(name) ?? null;
216
+ }
217
+ async function getCookie(name) {
218
+ const cookieHelper = await createCookieHelper();
219
+ return cookieHelper.get(name);
220
+ }
221
+ function setOrDeleteCookieClient(name, value, options = {}) {
222
+ ensureClient();
223
+ if (value === null) {
224
+ deleteCookieClient(name, options);
225
+ } else {
226
+ setCookieClient(name, value, options);
178
227
  }
179
228
  }
229
+ async function setOrDeleteCookie(name, value, options = {}) {
230
+ const cookieHelper = await createCookieHelper();
231
+ cookieHelper.setOrDelete(name, value, options);
232
+ }
233
+ function deleteCookieClient(name, options = {}) {
234
+ ensureClient();
235
+ Cookies.remove(name);
236
+ }
237
+ async function deleteCookie(name, options = {}) {
238
+ const cookieHelper = await createCookieHelper();
239
+ cookieHelper.delete(name, options);
240
+ }
241
+ function setCookieClient(name, value, options = {}) {
242
+ ensureClient();
243
+ Cookies.set(name, value, {
244
+ expires: options.maxAge === void 0 ? void 0 : new Date(Date.now() + options.maxAge * 1e3)
245
+ });
246
+ }
247
+ async function setCookie(name, value, options = {}) {
248
+ const cookieHelper = await createCookieHelper();
249
+ cookieHelper.set(name, value, options);
250
+ }
180
251
  async function saveVerifierAndState() {
181
252
  const codeVerifier = generateRandomCodeVerifier();
182
253
  const codeChallenge = await calculatePKCECodeChallenge(codeVerifier);
183
254
  const state = generateRandomState();
184
- setCookie("stack-oauth-outer-" + state, codeVerifier, { maxAge: 60 * 60 });
255
+ await setCookie("stack-oauth-outer-" + state, codeVerifier, { maxAge: 60 * 60 });
185
256
  return {
186
257
  codeChallenge,
187
258
  state
188
259
  };
189
260
  }
190
261
  function consumeVerifierAndStateCookie(state) {
262
+ ensureClient();
191
263
  const cookieName = "stack-oauth-outer-" + state;
192
- const codeVerifier = getCookie(cookieName);
264
+ const codeVerifier = getCookieClient(cookieName);
193
265
  if (!codeVerifier) {
194
266
  return null;
195
267
  }
196
- deleteCookie(cookieName);
268
+ deleteCookieClient(cookieName);
197
269
  return {
198
270
  codeVerifier
199
271
  };
200
272
  }
201
273
  export {
202
274
  consumeVerifierAndStateCookie,
275
+ createBrowserCookieHelper,
276
+ createCookieHelper,
203
277
  deleteCookie,
278
+ deleteCookieClient,
204
279
  getCookie,
280
+ getCookieClient,
205
281
  saveVerifierAndState,
206
282
  setCookie,
207
- setOrDeleteCookie
283
+ setCookieClient,
284
+ setOrDeleteCookie,
285
+ setOrDeleteCookieClient
208
286
  };
209
287
  //# sourceMappingURL=cookie.js.map