@stackframe/stack 2.6.17 → 2.6.20

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.
@@ -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,71 +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
- sameSite: "Strict"
208
- });
209
- } else {
210
- let isSecureCookie = !!(0, import_force_react_server.cookies)().get("stack-is-https");
211
- if ((0, import_force_react_server.headers)().get("x-forwarded-proto") === "https") {
212
- 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
+ }
213
253
  }
214
- (0, import_force_react_server.cookies)().set(name, value, {
215
- secure: isSecureCookie,
216
- maxAge: options.maxAge
217
- });
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);
218
272
  }
219
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
+ }
220
296
  async function saveVerifierAndState() {
221
297
  const codeVerifier = generateRandomCodeVerifier();
222
298
  const codeChallenge = await calculatePKCECodeChallenge(codeVerifier);
223
299
  const state = generateRandomState();
224
- setCookie("stack-oauth-outer-" + state, codeVerifier, { maxAge: 60 * 60 });
300
+ await setCookie("stack-oauth-outer-" + state, codeVerifier, { maxAge: 60 * 60 });
225
301
  return {
226
302
  codeChallenge,
227
303
  state
228
304
  };
229
305
  }
230
306
  function consumeVerifierAndStateCookie(state) {
307
+ ensureClient();
231
308
  const cookieName = "stack-oauth-outer-" + state;
232
- const codeVerifier = getCookie(cookieName);
309
+ const codeVerifier = getCookieClient(cookieName);
233
310
  if (!codeVerifier) {
234
311
  return null;
235
312
  }
236
- deleteCookie(cookieName);
313
+ deleteCookieClient(cookieName);
237
314
  return {
238
315
  codeVerifier
239
316
  };
@@ -241,10 +318,16 @@ function consumeVerifierAndStateCookie(state) {
241
318
  // Annotate the CommonJS export names for ESM import in node:
242
319
  0 && (module.exports = {
243
320
  consumeVerifierAndStateCookie,
321
+ createBrowserCookieHelper,
322
+ createCookieHelper,
244
323
  deleteCookie,
324
+ deleteCookieClient,
245
325
  getCookie,
326
+ getCookieClient,
246
327
  saveVerifierAndState,
247
328
  setCookie,
248
- setOrDeleteCookie
329
+ setCookieClient,
330
+ setOrDeleteCookie,
331
+ setOrDeleteCookieClient
249
332
  });
250
333
  //# sourceMappingURL=cookie.js.map