@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,10 +1,26 @@
1
1
  type SetCookieOptions = {
2
2
  maxAge?: number;
3
+ noOpIfServerComponent?: boolean;
3
4
  };
4
- declare function getCookie(name: string): string | null;
5
- declare function setOrDeleteCookie(name: string, value: string | null, options?: SetCookieOptions): void;
6
- declare function deleteCookie(name: string): void;
7
- declare function setCookie(name: string, value: string, options?: SetCookieOptions): void;
5
+ type DeleteCookieOptions = {
6
+ noOpIfServerComponent?: boolean;
7
+ };
8
+ type CookieHelper = {
9
+ get: (name: string) => string | null;
10
+ set: (name: string, value: string, options: SetCookieOptions) => void;
11
+ setOrDelete: (name: string, value: string | null, options: SetCookieOptions & DeleteCookieOptions) => void;
12
+ delete: (name: string, options: DeleteCookieOptions) => void;
13
+ };
14
+ declare function createCookieHelper(): Promise<CookieHelper>;
15
+ declare function createBrowserCookieHelper(): CookieHelper;
16
+ declare function getCookieClient(name: string): string | null;
17
+ declare function getCookie(name: string): Promise<string | null>;
18
+ declare function setOrDeleteCookieClient(name: string, value: string | null, options?: SetCookieOptions & DeleteCookieOptions): void;
19
+ declare function setOrDeleteCookie(name: string, value: string | null, options?: SetCookieOptions & DeleteCookieOptions): Promise<void>;
20
+ declare function deleteCookieClient(name: string, options?: DeleteCookieOptions): void;
21
+ declare function deleteCookie(name: string, options?: DeleteCookieOptions): Promise<void>;
22
+ declare function setCookieClient(name: string, value: string, options?: SetCookieOptions): void;
23
+ declare function setCookie(name: string, value: string, options?: SetCookieOptions): Promise<void>;
8
24
  declare function saveVerifierAndState(): Promise<{
9
25
  codeChallenge: string;
10
26
  state: string;
@@ -13,4 +29,4 @@ declare function consumeVerifierAndStateCookie(state: string): {
13
29
  codeVerifier: string;
14
30
  } | null;
15
31
 
16
- export { consumeVerifierAndStateCookie, deleteCookie, getCookie, saveVerifierAndState, setCookie, setOrDeleteCookie };
32
+ export { type CookieHelper, consumeVerifierAndStateCookie, createBrowserCookieHelper, createCookieHelper, deleteCookie, deleteCookieClient, getCookie, getCookieClient, saveVerifierAndState, setCookie, setCookieClient, setOrDeleteCookie, setOrDeleteCookieClient };
@@ -1,10 +1,26 @@
1
1
  type SetCookieOptions = {
2
2
  maxAge?: number;
3
+ noOpIfServerComponent?: boolean;
3
4
  };
4
- declare function getCookie(name: string): string | null;
5
- declare function setOrDeleteCookie(name: string, value: string | null, options?: SetCookieOptions): void;
6
- declare function deleteCookie(name: string): void;
7
- declare function setCookie(name: string, value: string, options?: SetCookieOptions): void;
5
+ type DeleteCookieOptions = {
6
+ noOpIfServerComponent?: boolean;
7
+ };
8
+ type CookieHelper = {
9
+ get: (name: string) => string | null;
10
+ set: (name: string, value: string, options: SetCookieOptions) => void;
11
+ setOrDelete: (name: string, value: string | null, options: SetCookieOptions & DeleteCookieOptions) => void;
12
+ delete: (name: string, options: DeleteCookieOptions) => void;
13
+ };
14
+ declare function createCookieHelper(): Promise<CookieHelper>;
15
+ declare function createBrowserCookieHelper(): CookieHelper;
16
+ declare function getCookieClient(name: string): string | null;
17
+ declare function getCookie(name: string): Promise<string | null>;
18
+ declare function setOrDeleteCookieClient(name: string, value: string | null, options?: SetCookieOptions & DeleteCookieOptions): void;
19
+ declare function setOrDeleteCookie(name: string, value: string | null, options?: SetCookieOptions & DeleteCookieOptions): Promise<void>;
20
+ declare function deleteCookieClient(name: string, options?: DeleteCookieOptions): void;
21
+ declare function deleteCookie(name: string, options?: DeleteCookieOptions): Promise<void>;
22
+ declare function setCookieClient(name: string, value: string, options?: SetCookieOptions): void;
23
+ declare function setCookie(name: string, value: string, options?: SetCookieOptions): Promise<void>;
8
24
  declare function saveVerifierAndState(): Promise<{
9
25
  codeChallenge: string;
10
26
  state: string;
@@ -13,4 +29,4 @@ declare function consumeVerifierAndStateCookie(state: string): {
13
29
  codeVerifier: string;
14
30
  } | null;
15
31
 
16
- export { consumeVerifierAndStateCookie, deleteCookie, getCookie, saveVerifierAndState, setCookie, setOrDeleteCookie };
32
+ export { type CookieHelper, consumeVerifierAndStateCookie, createBrowserCookieHelper, createCookieHelper, deleteCookie, deleteCookieClient, getCookie, getCookieClient, saveVerifierAndState, setCookie, setCookieClient, setOrDeleteCookie, setOrDeleteCookieClient };
@@ -31,14 +31,22 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
31
31
  var cookie_exports = {};
32
32
  __export(cookie_exports, {
33
33
  consumeVerifierAndStateCookie: () => consumeVerifierAndStateCookie,
34
+ createBrowserCookieHelper: () => createBrowserCookieHelper,
35
+ createCookieHelper: () => createCookieHelper,
34
36
  deleteCookie: () => deleteCookie,
37
+ deleteCookieClient: () => deleteCookieClient,
35
38
  getCookie: () => getCookie,
39
+ getCookieClient: () => getCookieClient,
36
40
  saveVerifierAndState: () => saveVerifierAndState,
37
41
  setCookie: () => setCookie,
38
- setOrDeleteCookie: () => setOrDeleteCookie
42
+ setCookieClient: () => setCookieClient,
43
+ setOrDeleteCookie: () => setOrDeleteCookie,
44
+ setOrDeleteCookieClient: () => setOrDeleteCookieClient
39
45
  });
40
46
  module.exports = __toCommonJS(cookie_exports);
41
47
  var import_force_react_server = require("@stackframe/stack-sc/force-react-server");
48
+ var import_env = require("@stackframe/stack-shared/dist/utils/env");
49
+ var import_errors = require("@stackframe/stack-shared/dist/utils/errors");
42
50
  var import_js_cookie = __toESM(require("js-cookie"));
43
51
 
44
52
  // ../../node_modules/.pnpm/oauth4webapi@2.10.4/node_modules/oauth4webapi/build/index.js
@@ -169,70 +177,140 @@ var skipStateCheck = Symbol();
169
177
  var expectNoState = Symbol();
170
178
 
171
179
  // src/lib/cookie.ts
172
- function getCookie(name) {
173
- if (typeof window !== "undefined") {
174
- import_js_cookie.default.set("stack-is-https", "true", { secure: true });
175
- return import_js_cookie.default.get(name) ?? null;
176
- } else {
177
- try {
178
- (0, import_force_react_server.cookies)().set("stack-is-https", "true", { secure: true });
179
- } catch (e) {
180
- 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")) {
181
- } else {
182
- throw e;
183
- }
184
- }
185
- return (0, import_force_react_server.cookies)().get(name)?.value ?? null;
180
+ function ensureClient() {
181
+ if (!(0, import_env.isBrowserLike)()) {
182
+ throw new Error("cookieClient functions can only be called in a browser environment, yet window is undefined");
186
183
  }
187
184
  }
188
- function setOrDeleteCookie(name, value, options = {}) {
189
- if (value === null) {
190
- deleteCookie(name);
185
+ async function createCookieHelper() {
186
+ if ((0, import_env.isBrowserLike)()) {
187
+ return createBrowserCookieHelper();
191
188
  } else {
192
- setCookie(name, value, options);
189
+ return createNextCookieHelper(
190
+ await (0, import_force_react_server.cookies)(),
191
+ await (0, import_force_react_server.headers)()
192
+ );
193
193
  }
194
194
  }
195
- function deleteCookie(name) {
196
- if (typeof window !== "undefined") {
197
- import_js_cookie.default.remove(name);
195
+ function createBrowserCookieHelper() {
196
+ return {
197
+ get: getCookieClient,
198
+ set: setCookieClient,
199
+ setOrDelete: setOrDeleteCookieClient,
200
+ delete: deleteCookieClient
201
+ };
202
+ }
203
+ function handleCookieError(e, options) {
204
+ if (e instanceof Error && e.message.includes("Cookies can only be modified in")) {
205
+ if (options.noOpIfServerComponent) {
206
+ } else {
207
+ throw new import_errors.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");
208
+ }
198
209
  } else {
199
- (0, import_force_react_server.cookies)().delete(name);
210
+ throw e;
200
211
  }
201
212
  }
202
- function setCookie(name, value, options = {}) {
203
- if (typeof window !== "undefined") {
204
- import_js_cookie.default.set(name, value, {
205
- secure: window.location.protocol === "https:",
206
- expires: options.maxAge === void 0 ? void 0 : new Date(Date.now() + options.maxAge * 1e3)
207
- });
208
- } else {
209
- let isSecureCookie = !!(0, import_force_react_server.cookies)().get("stack-is-https");
210
- if ((0, import_force_react_server.headers)().get("x-forwarded-proto") === "https") {
211
- isSecureCookie = true;
213
+ function createNextCookieHelper(rscCookiesAwaited, rscHeadersAwaited) {
214
+ const cookieHelper = {
215
+ get: (name) => {
216
+ try {
217
+ rscCookiesAwaited.set("stack-is-https", "true", { secure: true });
218
+ } catch (e) {
219
+ 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")) {
220
+ } else {
221
+ throw e;
222
+ }
223
+ }
224
+ return rscCookiesAwaited.get(name)?.value ?? null;
225
+ },
226
+ set: (name, value, options) => {
227
+ let isSecureCookie = !!rscCookiesAwaited.get("stack-is-https");
228
+ if (rscHeadersAwaited.get("x-forwarded-proto") === "https") {
229
+ isSecureCookie = true;
230
+ }
231
+ try {
232
+ rscCookiesAwaited.set(name, value, {
233
+ secure: isSecureCookie,
234
+ maxAge: options.maxAge
235
+ });
236
+ } catch (e) {
237
+ handleCookieError(e, options);
238
+ }
239
+ },
240
+ setOrDelete(name, value, options = {}) {
241
+ if (value === null) {
242
+ this.delete(name, options);
243
+ } else {
244
+ this.set(name, value, options);
245
+ }
246
+ },
247
+ delete(name, options = {}) {
248
+ try {
249
+ rscCookiesAwaited.delete(name);
250
+ } catch (e) {
251
+ handleCookieError(e, options);
252
+ }
212
253
  }
213
- (0, import_force_react_server.cookies)().set(name, value, {
214
- secure: isSecureCookie,
215
- maxAge: options.maxAge
216
- });
254
+ };
255
+ return cookieHelper;
256
+ }
257
+ function getCookieClient(name) {
258
+ ensureClient();
259
+ import_js_cookie.default.set("stack-is-https", "true", { secure: true });
260
+ return import_js_cookie.default.get(name) ?? null;
261
+ }
262
+ async function getCookie(name) {
263
+ const cookieHelper = await createCookieHelper();
264
+ return cookieHelper.get(name);
265
+ }
266
+ function setOrDeleteCookieClient(name, value, options = {}) {
267
+ ensureClient();
268
+ if (value === null) {
269
+ deleteCookieClient(name, options);
270
+ } else {
271
+ setCookieClient(name, value, options);
217
272
  }
218
273
  }
274
+ async function setOrDeleteCookie(name, value, options = {}) {
275
+ const cookieHelper = await createCookieHelper();
276
+ cookieHelper.setOrDelete(name, value, options);
277
+ }
278
+ function deleteCookieClient(name, options = {}) {
279
+ ensureClient();
280
+ import_js_cookie.default.remove(name);
281
+ }
282
+ async function deleteCookie(name, options = {}) {
283
+ const cookieHelper = await createCookieHelper();
284
+ cookieHelper.delete(name, options);
285
+ }
286
+ function setCookieClient(name, value, options = {}) {
287
+ ensureClient();
288
+ import_js_cookie.default.set(name, value, {
289
+ expires: options.maxAge === void 0 ? void 0 : new Date(Date.now() + options.maxAge * 1e3)
290
+ });
291
+ }
292
+ async function setCookie(name, value, options = {}) {
293
+ const cookieHelper = await createCookieHelper();
294
+ cookieHelper.set(name, value, options);
295
+ }
219
296
  async function saveVerifierAndState() {
220
297
  const codeVerifier = generateRandomCodeVerifier();
221
298
  const codeChallenge = await calculatePKCECodeChallenge(codeVerifier);
222
299
  const state = generateRandomState();
223
- setCookie("stack-oauth-outer-" + state, codeVerifier, { maxAge: 60 * 60 });
300
+ await setCookie("stack-oauth-outer-" + state, codeVerifier, { maxAge: 60 * 60 });
224
301
  return {
225
302
  codeChallenge,
226
303
  state
227
304
  };
228
305
  }
229
306
  function consumeVerifierAndStateCookie(state) {
307
+ ensureClient();
230
308
  const cookieName = "stack-oauth-outer-" + state;
231
- const codeVerifier = getCookie(cookieName);
309
+ const codeVerifier = getCookieClient(cookieName);
232
310
  if (!codeVerifier) {
233
311
  return null;
234
312
  }
235
- deleteCookie(cookieName);
313
+ deleteCookieClient(cookieName);
236
314
  return {
237
315
  codeVerifier
238
316
  };
@@ -240,10 +318,16 @@ function consumeVerifierAndStateCookie(state) {
240
318
  // Annotate the CommonJS export names for ESM import in node:
241
319
  0 && (module.exports = {
242
320
  consumeVerifierAndStateCookie,
321
+ createBrowserCookieHelper,
322
+ createCookieHelper,
243
323
  deleteCookie,
324
+ deleteCookieClient,
244
325
  getCookie,
326
+ getCookieClient,
245
327
  saveVerifierAndState,
246
328
  setCookie,
247
- setOrDeleteCookie
329
+ setCookieClient,
330
+ setOrDeleteCookie,
331
+ setOrDeleteCookieClient
248
332
  });
249
333
  //# sourceMappingURL=cookie.js.map