naystack 1.5.29 → 1.5.31

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.
@@ -20,11 +20,14 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
20
20
  // src/auth/constants.ts
21
21
  var constants_exports = {};
22
22
  __export(constants_exports, {
23
- REFRESH_COOKIE_NAME: () => REFRESH_COOKIE_NAME
23
+ REFRESH_COOKIE_NAME: () => REFRESH_COOKIE_NAME,
24
+ REFRESH_HEADER_NAME: () => REFRESH_HEADER_NAME
24
25
  });
25
26
  module.exports = __toCommonJS(constants_exports);
26
27
  var REFRESH_COOKIE_NAME = "refresh";
28
+ var REFRESH_HEADER_NAME = "X-Refresh-Token";
27
29
  // Annotate the CommonJS export names for ESM import in node:
28
30
  0 && (module.exports = {
29
- REFRESH_COOKIE_NAME
31
+ REFRESH_COOKIE_NAME,
32
+ REFRESH_HEADER_NAME
30
33
  });
@@ -3,5 +3,6 @@
3
3
  * @category Auth
4
4
  */
5
5
  declare const REFRESH_COOKIE_NAME = "refresh";
6
+ declare const REFRESH_HEADER_NAME = "X-Refresh-Token";
6
7
 
7
- export { REFRESH_COOKIE_NAME };
8
+ export { REFRESH_COOKIE_NAME, REFRESH_HEADER_NAME };
@@ -3,5 +3,6 @@
3
3
  * @category Auth
4
4
  */
5
5
  declare const REFRESH_COOKIE_NAME = "refresh";
6
+ declare const REFRESH_HEADER_NAME = "X-Refresh-Token";
6
7
 
7
- export { REFRESH_COOKIE_NAME };
8
+ export { REFRESH_COOKIE_NAME, REFRESH_HEADER_NAME };
@@ -1,5 +1,7 @@
1
1
  // src/auth/constants.ts
2
2
  var REFRESH_COOKIE_NAME = "refresh";
3
+ var REFRESH_HEADER_NAME = "X-Refresh-Token";
3
4
  export {
4
- REFRESH_COOKIE_NAME
5
+ REFRESH_COOKIE_NAME,
6
+ REFRESH_HEADER_NAME
5
7
  };
@@ -45,7 +45,7 @@ module.exports = __toCommonJS(client_exports);
45
45
  var import_react = __toESM(require("react"));
46
46
 
47
47
  // src/auth/constants.ts
48
- var REFRESH_COOKIE_NAME = "refresh";
48
+ var REFRESH_HEADER_NAME = "X-Refresh-Token";
49
49
 
50
50
  // src/env.ts
51
51
  var getEnvValue = (key) => {
@@ -116,13 +116,12 @@ var AuthWrapper = ({
116
116
  function useAuthFetch(getRefreshToken) {
117
117
  const setToken = useSetToken();
118
118
  const fetchToken = async () => {
119
- const url = new URL(getEnv("NEXT_PUBLIC_EMAIL_AUTH_ENDPOINT" /* NEXT_PUBLIC_EMAIL_AUTH_ENDPOINT */));
120
- if (getRefreshToken) {
121
- const token = await getRefreshToken();
122
- if (token) url.searchParams.set(REFRESH_COOKIE_NAME, token);
123
- }
124
- fetch(url, {
125
- credentials: "include"
119
+ const token = getRefreshToken ? await getRefreshToken() : null;
120
+ fetch(getEnv("NEXT_PUBLIC_EMAIL_AUTH_ENDPOINT" /* NEXT_PUBLIC_EMAIL_AUTH_ENDPOINT */), {
121
+ credentials: "include",
122
+ headers: token ? {
123
+ [REFRESH_HEADER_NAME]: token
124
+ } : void 0
126
125
  }).then((res) => res.json()).then((data) => setToken(data.accessToken));
127
126
  };
128
127
  (0, import_react.useEffect)(() => {
@@ -10,7 +10,7 @@ import React, {
10
10
  } from "react";
11
11
 
12
12
  // src/auth/constants.ts
13
- var REFRESH_COOKIE_NAME = "refresh";
13
+ var REFRESH_HEADER_NAME = "X-Refresh-Token";
14
14
 
15
15
  // src/env.ts
16
16
  var getEnvValue = (key) => {
@@ -81,13 +81,12 @@ var AuthWrapper = ({
81
81
  function useAuthFetch(getRefreshToken) {
82
82
  const setToken = useSetToken();
83
83
  const fetchToken = async () => {
84
- const url = new URL(getEnv("NEXT_PUBLIC_EMAIL_AUTH_ENDPOINT" /* NEXT_PUBLIC_EMAIL_AUTH_ENDPOINT */));
85
- if (getRefreshToken) {
86
- const token = await getRefreshToken();
87
- if (token) url.searchParams.set(REFRESH_COOKIE_NAME, token);
88
- }
89
- fetch(url, {
90
- credentials: "include"
84
+ const token = getRefreshToken ? await getRefreshToken() : null;
85
+ fetch(getEnv("NEXT_PUBLIC_EMAIL_AUTH_ENDPOINT" /* NEXT_PUBLIC_EMAIL_AUTH_ENDPOINT */), {
86
+ credentials: "include",
87
+ headers: token ? {
88
+ [REFRESH_HEADER_NAME]: token
89
+ } : void 0
91
90
  }).then((res) => res.json()).then((data) => setToken(data.accessToken));
92
91
  };
93
92
  useEffect(() => {
@@ -38,6 +38,39 @@ __export(email_exports, {
38
38
  module.exports = __toCommonJS(email_exports);
39
39
  var import_server4 = require("next/server");
40
40
 
41
+ // src/auth/constants.ts
42
+ var REFRESH_COOKIE_NAME = "refresh";
43
+ var REFRESH_HEADER_NAME = "X-Refresh-Token";
44
+
45
+ // src/utils/route.ts
46
+ function getCorsHeaders(origin, allowedOrigins) {
47
+ if (!origin || !allowedOrigins.includes(origin)) return null;
48
+ return {
49
+ "Access-Control-Allow-Origin": origin,
50
+ "Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, OPTIONS",
51
+ "Access-Control-Allow-Headers": `Content-Type, Authorization, ${REFRESH_HEADER_NAME}`,
52
+ "Access-Control-Allow-Credentials": "true"
53
+ };
54
+ }
55
+ function withCors(handler, allowedOrigins) {
56
+ if (!allowedOrigins?.length) return handler;
57
+ return ((req) => {
58
+ return handler(req).then((response) => {
59
+ if (!response) return response;
60
+ const corsHeaders = getCorsHeaders(
61
+ req.headers.get("origin"),
62
+ allowedOrigins
63
+ );
64
+ if (corsHeaders) {
65
+ Object.entries(corsHeaders).forEach(([key, value]) => {
66
+ response.headers.set(key, value);
67
+ });
68
+ }
69
+ return response;
70
+ });
71
+ });
72
+ }
73
+
41
74
  // src/auth/email/token.ts
42
75
  var import_bcryptjs = require("bcryptjs");
43
76
  var import_jsonwebtoken = require("jsonwebtoken");
@@ -94,9 +127,6 @@ function getEnv(key, skipCheck) {
94
127
  return value;
95
128
  }
96
129
 
97
- // src/auth/constants.ts
98
- var REFRESH_COOKIE_NAME = "refresh";
99
-
100
130
  // src/auth/email/token.ts
101
131
  function generateAccessToken(id, signingKey) {
102
132
  return (0, import_jsonwebtoken.sign)({ id }, signingKey, {
@@ -242,11 +272,11 @@ var getDeleteRoute = (options) => async (req) => {
242
272
 
243
273
  // src/auth/email/routes/get.ts
244
274
  var getGetRoute = (options) => async (req) => {
245
- const refresh = req.cookies.get(REFRESH_COOKIE_NAME)?.value || req.nextUrl.searchParams.get(REFRESH_COOKIE_NAME) || void 0;
275
+ const refresh = req.cookies.get(REFRESH_COOKIE_NAME)?.value || req.headers.get(REFRESH_HEADER_NAME) || void 0;
246
276
  const userID = getUserIdFromRefreshToken(refresh);
247
277
  if (userID) {
248
278
  if (options.onRefresh) {
249
- const body = await req.json();
279
+ const body = await req.json().catch(() => null);
250
280
  await options.onRefresh?.(userID, body);
251
281
  }
252
282
  return getTokenizedResponse(
@@ -367,33 +397,6 @@ function AuthFetch() {
367
397
  }
368
398
 
369
399
  // src/auth/email/index.ts
370
- function getCorsHeaders(origin, allowedOrigins) {
371
- if (!origin || !allowedOrigins.includes(origin)) return null;
372
- return {
373
- "Access-Control-Allow-Origin": origin,
374
- "Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, OPTIONS",
375
- "Access-Control-Allow-Headers": "Content-Type, Authorization",
376
- "Access-Control-Allow-Credentials": "true"
377
- };
378
- }
379
- function withCors(handler, allowedOrigins) {
380
- if (!allowedOrigins?.length) return handler;
381
- return ((req) => {
382
- return handler(req).then((response) => {
383
- if (!response) return response;
384
- const corsHeaders = getCorsHeaders(
385
- req.headers.get("origin"),
386
- allowedOrigins
387
- );
388
- if (corsHeaders) {
389
- Object.entries(corsHeaders).forEach(([key, value]) => {
390
- response.headers.set(key, value);
391
- });
392
- }
393
- return response;
394
- });
395
- });
396
- }
397
400
  function getEmailAuthRoutes(options) {
398
401
  const { allowedOrigins } = options;
399
402
  return {
@@ -1,6 +1,39 @@
1
1
  // src/auth/email/index.ts
2
2
  import { NextResponse as NextResponse3 } from "next/server";
3
3
 
4
+ // src/auth/constants.ts
5
+ var REFRESH_COOKIE_NAME = "refresh";
6
+ var REFRESH_HEADER_NAME = "X-Refresh-Token";
7
+
8
+ // src/utils/route.ts
9
+ function getCorsHeaders(origin, allowedOrigins) {
10
+ if (!origin || !allowedOrigins.includes(origin)) return null;
11
+ return {
12
+ "Access-Control-Allow-Origin": origin,
13
+ "Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, OPTIONS",
14
+ "Access-Control-Allow-Headers": `Content-Type, Authorization, ${REFRESH_HEADER_NAME}`,
15
+ "Access-Control-Allow-Credentials": "true"
16
+ };
17
+ }
18
+ function withCors(handler, allowedOrigins) {
19
+ if (!allowedOrigins?.length) return handler;
20
+ return ((req) => {
21
+ return handler(req).then((response) => {
22
+ if (!response) return response;
23
+ const corsHeaders = getCorsHeaders(
24
+ req.headers.get("origin"),
25
+ allowedOrigins
26
+ );
27
+ if (corsHeaders) {
28
+ Object.entries(corsHeaders).forEach(([key, value]) => {
29
+ response.headers.set(key, value);
30
+ });
31
+ }
32
+ return response;
33
+ });
34
+ });
35
+ }
36
+
4
37
  // src/auth/email/token.ts
5
38
  import { compare } from "bcryptjs";
6
39
  import { JsonWebTokenError, sign, verify } from "jsonwebtoken";
@@ -57,9 +90,6 @@ function getEnv(key, skipCheck) {
57
90
  return value;
58
91
  }
59
92
 
60
- // src/auth/constants.ts
61
- var REFRESH_COOKIE_NAME = "refresh";
62
-
63
93
  // src/auth/email/token.ts
64
94
  function generateAccessToken(id, signingKey) {
65
95
  return sign({ id }, signingKey, {
@@ -205,11 +235,11 @@ var getDeleteRoute = (options) => async (req) => {
205
235
 
206
236
  // src/auth/email/routes/get.ts
207
237
  var getGetRoute = (options) => async (req) => {
208
- const refresh = req.cookies.get(REFRESH_COOKIE_NAME)?.value || req.nextUrl.searchParams.get(REFRESH_COOKIE_NAME) || void 0;
238
+ const refresh = req.cookies.get(REFRESH_COOKIE_NAME)?.value || req.headers.get(REFRESH_HEADER_NAME) || void 0;
209
239
  const userID = getUserIdFromRefreshToken(refresh);
210
240
  if (userID) {
211
241
  if (options.onRefresh) {
212
- const body = await req.json();
242
+ const body = await req.json().catch(() => null);
213
243
  await options.onRefresh?.(userID, body);
214
244
  }
215
245
  return getTokenizedResponse(
@@ -334,33 +364,6 @@ function AuthFetch() {
334
364
  }
335
365
 
336
366
  // src/auth/email/index.ts
337
- function getCorsHeaders(origin, allowedOrigins) {
338
- if (!origin || !allowedOrigins.includes(origin)) return null;
339
- return {
340
- "Access-Control-Allow-Origin": origin,
341
- "Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, OPTIONS",
342
- "Access-Control-Allow-Headers": "Content-Type, Authorization",
343
- "Access-Control-Allow-Credentials": "true"
344
- };
345
- }
346
- function withCors(handler, allowedOrigins) {
347
- if (!allowedOrigins?.length) return handler;
348
- return ((req) => {
349
- return handler(req).then((response) => {
350
- if (!response) return response;
351
- const corsHeaders = getCorsHeaders(
352
- req.headers.get("origin"),
353
- allowedOrigins
354
- );
355
- if (corsHeaders) {
356
- Object.entries(corsHeaders).forEach(([key, value]) => {
357
- response.headers.set(key, value);
358
- });
359
- }
360
- return response;
361
- });
362
- });
363
- }
364
367
  function getEmailAuthRoutes(options) {
365
368
  const { allowedOrigins } = options;
366
369
  return {
@@ -75,6 +75,7 @@ function getEnv(key, skipCheck) {
75
75
 
76
76
  // src/auth/constants.ts
77
77
  var REFRESH_COOKIE_NAME = "refresh";
78
+ var REFRESH_HEADER_NAME = "X-Refresh-Token";
78
79
 
79
80
  // src/auth/email/token.ts
80
81
  var import_bcryptjs = require("bcryptjs");
@@ -123,11 +124,11 @@ function getUserIdFromRefreshToken(refreshToken) {
123
124
 
124
125
  // src/auth/email/routes/get.ts
125
126
  var getGetRoute = (options) => async (req) => {
126
- const refresh = req.cookies.get(REFRESH_COOKIE_NAME)?.value || req.nextUrl.searchParams.get(REFRESH_COOKIE_NAME) || void 0;
127
+ const refresh = req.cookies.get(REFRESH_COOKIE_NAME)?.value || req.headers.get(REFRESH_HEADER_NAME) || void 0;
127
128
  const userID = getUserIdFromRefreshToken(refresh);
128
129
  if (userID) {
129
130
  if (options.onRefresh) {
130
- const body = await req.json();
131
+ const body = await req.json().catch(() => null);
131
132
  await options.onRefresh?.(userID, body);
132
133
  }
133
134
  return getTokenizedResponse(
@@ -49,6 +49,7 @@ function getEnv(key, skipCheck) {
49
49
 
50
50
  // src/auth/constants.ts
51
51
  var REFRESH_COOKIE_NAME = "refresh";
52
+ var REFRESH_HEADER_NAME = "X-Refresh-Token";
52
53
 
53
54
  // src/auth/email/token.ts
54
55
  import { compare } from "bcryptjs";
@@ -97,11 +98,11 @@ function getUserIdFromRefreshToken(refreshToken) {
97
98
 
98
99
  // src/auth/email/routes/get.ts
99
100
  var getGetRoute = (options) => async (req) => {
100
- const refresh = req.cookies.get(REFRESH_COOKIE_NAME)?.value || req.nextUrl.searchParams.get(REFRESH_COOKIE_NAME) || void 0;
101
+ const refresh = req.cookies.get(REFRESH_COOKIE_NAME)?.value || req.headers.get(REFRESH_HEADER_NAME) || void 0;
101
102
  const userID = getUserIdFromRefreshToken(refresh);
102
103
  if (userID) {
103
104
  if (options.onRefresh) {
104
- const body = await req.json();
105
+ const body = await req.json().catch(() => null);
105
106
  await options.onRefresh?.(userID, body);
106
107
  }
107
108
  return getTokenizedResponse(
@@ -44,6 +44,39 @@ module.exports = __toCommonJS(auth_exports);
44
44
  // src/auth/email/index.ts
45
45
  var import_server4 = require("next/server");
46
46
 
47
+ // src/auth/constants.ts
48
+ var REFRESH_COOKIE_NAME = "refresh";
49
+ var REFRESH_HEADER_NAME = "X-Refresh-Token";
50
+
51
+ // src/utils/route.ts
52
+ function getCorsHeaders(origin, allowedOrigins) {
53
+ if (!origin || !allowedOrigins.includes(origin)) return null;
54
+ return {
55
+ "Access-Control-Allow-Origin": origin,
56
+ "Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, OPTIONS",
57
+ "Access-Control-Allow-Headers": `Content-Type, Authorization, ${REFRESH_HEADER_NAME}`,
58
+ "Access-Control-Allow-Credentials": "true"
59
+ };
60
+ }
61
+ function withCors(handler, allowedOrigins) {
62
+ if (!allowedOrigins?.length) return handler;
63
+ return ((req) => {
64
+ return handler(req).then((response) => {
65
+ if (!response) return response;
66
+ const corsHeaders = getCorsHeaders(
67
+ req.headers.get("origin"),
68
+ allowedOrigins
69
+ );
70
+ if (corsHeaders) {
71
+ Object.entries(corsHeaders).forEach(([key, value]) => {
72
+ response.headers.set(key, value);
73
+ });
74
+ }
75
+ return response;
76
+ });
77
+ });
78
+ }
79
+
47
80
  // src/auth/email/token.ts
48
81
  var import_bcryptjs = require("bcryptjs");
49
82
  var import_jsonwebtoken = require("jsonwebtoken");
@@ -100,9 +133,6 @@ function getEnv(key, skipCheck) {
100
133
  return value;
101
134
  }
102
135
 
103
- // src/auth/constants.ts
104
- var REFRESH_COOKIE_NAME = "refresh";
105
-
106
136
  // src/auth/email/token.ts
107
137
  function generateAccessToken(id, signingKey) {
108
138
  return (0, import_jsonwebtoken.sign)({ id }, signingKey, {
@@ -260,11 +290,11 @@ var getDeleteRoute = (options) => async (req) => {
260
290
 
261
291
  // src/auth/email/routes/get.ts
262
292
  var getGetRoute = (options) => async (req) => {
263
- const refresh = req.cookies.get(REFRESH_COOKIE_NAME)?.value || req.nextUrl.searchParams.get(REFRESH_COOKIE_NAME) || void 0;
293
+ const refresh = req.cookies.get(REFRESH_COOKIE_NAME)?.value || req.headers.get(REFRESH_HEADER_NAME) || void 0;
264
294
  const userID = getUserIdFromRefreshToken(refresh);
265
295
  if (userID) {
266
296
  if (options.onRefresh) {
267
- const body = await req.json();
297
+ const body = await req.json().catch(() => null);
268
298
  await options.onRefresh?.(userID, body);
269
299
  }
270
300
  return getTokenizedResponse(
@@ -385,33 +415,6 @@ function AuthFetch() {
385
415
  }
386
416
 
387
417
  // src/auth/email/index.ts
388
- function getCorsHeaders(origin, allowedOrigins) {
389
- if (!origin || !allowedOrigins.includes(origin)) return null;
390
- return {
391
- "Access-Control-Allow-Origin": origin,
392
- "Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, OPTIONS",
393
- "Access-Control-Allow-Headers": "Content-Type, Authorization",
394
- "Access-Control-Allow-Credentials": "true"
395
- };
396
- }
397
- function withCors(handler, allowedOrigins) {
398
- if (!allowedOrigins?.length) return handler;
399
- return ((req) => {
400
- return handler(req).then((response) => {
401
- if (!response) return response;
402
- const corsHeaders = getCorsHeaders(
403
- req.headers.get("origin"),
404
- allowedOrigins
405
- );
406
- if (corsHeaders) {
407
- Object.entries(corsHeaders).forEach(([key, value]) => {
408
- response.headers.set(key, value);
409
- });
410
- }
411
- return response;
412
- });
413
- });
414
- }
415
418
  function getEmailAuthRoutes(options) {
416
419
  const { allowedOrigins } = options;
417
420
  return {
@@ -1,6 +1,39 @@
1
1
  // src/auth/email/index.ts
2
2
  import { NextResponse as NextResponse3 } from "next/server";
3
3
 
4
+ // src/auth/constants.ts
5
+ var REFRESH_COOKIE_NAME = "refresh";
6
+ var REFRESH_HEADER_NAME = "X-Refresh-Token";
7
+
8
+ // src/utils/route.ts
9
+ function getCorsHeaders(origin, allowedOrigins) {
10
+ if (!origin || !allowedOrigins.includes(origin)) return null;
11
+ return {
12
+ "Access-Control-Allow-Origin": origin,
13
+ "Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, OPTIONS",
14
+ "Access-Control-Allow-Headers": `Content-Type, Authorization, ${REFRESH_HEADER_NAME}`,
15
+ "Access-Control-Allow-Credentials": "true"
16
+ };
17
+ }
18
+ function withCors(handler, allowedOrigins) {
19
+ if (!allowedOrigins?.length) return handler;
20
+ return ((req) => {
21
+ return handler(req).then((response) => {
22
+ if (!response) return response;
23
+ const corsHeaders = getCorsHeaders(
24
+ req.headers.get("origin"),
25
+ allowedOrigins
26
+ );
27
+ if (corsHeaders) {
28
+ Object.entries(corsHeaders).forEach(([key, value]) => {
29
+ response.headers.set(key, value);
30
+ });
31
+ }
32
+ return response;
33
+ });
34
+ });
35
+ }
36
+
4
37
  // src/auth/email/token.ts
5
38
  import { compare } from "bcryptjs";
6
39
  import { JsonWebTokenError, sign, verify } from "jsonwebtoken";
@@ -57,9 +90,6 @@ function getEnv(key, skipCheck) {
57
90
  return value;
58
91
  }
59
92
 
60
- // src/auth/constants.ts
61
- var REFRESH_COOKIE_NAME = "refresh";
62
-
63
93
  // src/auth/email/token.ts
64
94
  function generateAccessToken(id, signingKey) {
65
95
  return sign({ id }, signingKey, {
@@ -217,11 +247,11 @@ var getDeleteRoute = (options) => async (req) => {
217
247
 
218
248
  // src/auth/email/routes/get.ts
219
249
  var getGetRoute = (options) => async (req) => {
220
- const refresh = req.cookies.get(REFRESH_COOKIE_NAME)?.value || req.nextUrl.searchParams.get(REFRESH_COOKIE_NAME) || void 0;
250
+ const refresh = req.cookies.get(REFRESH_COOKIE_NAME)?.value || req.headers.get(REFRESH_HEADER_NAME) || void 0;
221
251
  const userID = getUserIdFromRefreshToken(refresh);
222
252
  if (userID) {
223
253
  if (options.onRefresh) {
224
- const body = await req.json();
254
+ const body = await req.json().catch(() => null);
225
255
  await options.onRefresh?.(userID, body);
226
256
  }
227
257
  return getTokenizedResponse(
@@ -346,33 +376,6 @@ function AuthFetch() {
346
376
  }
347
377
 
348
378
  // src/auth/email/index.ts
349
- function getCorsHeaders(origin, allowedOrigins) {
350
- if (!origin || !allowedOrigins.includes(origin)) return null;
351
- return {
352
- "Access-Control-Allow-Origin": origin,
353
- "Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, OPTIONS",
354
- "Access-Control-Allow-Headers": "Content-Type, Authorization",
355
- "Access-Control-Allow-Credentials": "true"
356
- };
357
- }
358
- function withCors(handler, allowedOrigins) {
359
- if (!allowedOrigins?.length) return handler;
360
- return ((req) => {
361
- return handler(req).then((response) => {
362
- if (!response) return response;
363
- const corsHeaders = getCorsHeaders(
364
- req.headers.get("origin"),
365
- allowedOrigins
366
- );
367
- if (corsHeaders) {
368
- Object.entries(corsHeaders).forEach(([key, value]) => {
369
- response.headers.set(key, value);
370
- });
371
- }
372
- return response;
373
- });
374
- });
375
- }
376
379
  function getEmailAuthRoutes(options) {
377
380
  const { allowedOrigins } = options;
378
381
  return {
@@ -574,6 +574,7 @@ var import_reflect_metadata = require("reflect-metadata");
574
574
  var import_server3 = require("@apollo/server");
575
575
  var import_default = require("@apollo/server/plugin/landingPage/default");
576
576
  var import_next = require("@as-integrations/next");
577
+ var import_server4 = require("next/server");
577
578
  var import_type_graphql = require("type-graphql");
578
579
 
579
580
  // src/env.ts
@@ -625,6 +626,39 @@ function getEnv(key, skipCheck) {
625
626
  return value;
626
627
  }
627
628
 
629
+ // src/auth/constants.ts
630
+ var REFRESH_COOKIE_NAME = "refresh";
631
+ var REFRESH_HEADER_NAME = "X-Refresh-Token";
632
+
633
+ // src/utils/route.ts
634
+ function getCorsHeaders(origin, allowedOrigins) {
635
+ if (!origin || !allowedOrigins.includes(origin)) return null;
636
+ return {
637
+ "Access-Control-Allow-Origin": origin,
638
+ "Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, OPTIONS",
639
+ "Access-Control-Allow-Headers": `Content-Type, Authorization, ${REFRESH_HEADER_NAME}`,
640
+ "Access-Control-Allow-Credentials": "true"
641
+ };
642
+ }
643
+ function withCors(handler, allowedOrigins) {
644
+ if (!allowedOrigins?.length) return handler;
645
+ return ((req) => {
646
+ return handler(req).then((response) => {
647
+ if (!response) return response;
648
+ const corsHeaders = getCorsHeaders(
649
+ req.headers.get("origin"),
650
+ allowedOrigins
651
+ );
652
+ if (corsHeaders) {
653
+ Object.entries(corsHeaders).forEach(([key, value]) => {
654
+ response.headers.set(key, value);
655
+ });
656
+ }
657
+ return response;
658
+ });
659
+ });
660
+ }
661
+
628
662
  // src/auth/email/utils.ts
629
663
  var import_jsonwebtoken2 = require("jsonwebtoken");
630
664
 
@@ -634,11 +668,6 @@ var import_jsonwebtoken = require("jsonwebtoken");
634
668
  var import_headers = require("next/headers");
635
669
  var import_navigation = require("next/navigation");
636
670
  var import_server = require("next/server");
637
-
638
- // src/auth/constants.ts
639
- var REFRESH_COOKIE_NAME = "refresh";
640
-
641
- // src/auth/email/token.ts
642
671
  function getUserIdFromRefreshToken(refreshToken) {
643
672
  if (refreshToken)
644
673
  try {
@@ -683,7 +712,8 @@ async function initGraphQLServer({
683
712
  authChecker,
684
713
  resolvers,
685
714
  plugins,
686
- getContext: overrideGetContext
715
+ getContext: overrideGetContext,
716
+ allowedOrigins
687
717
  }) {
688
718
  const { typeDefs, resolvers: builtResolvers } = await (0, import_type_graphql.buildTypeDefsAndResolvers)({
689
719
  validate: true,
@@ -710,8 +740,12 @@ async function initGraphQLServer({
710
740
  context: overrideGetContext || getContext
711
741
  });
712
742
  return {
713
- GET: (request) => handler(request),
714
- POST: (request) => handler(request)
743
+ GET: withCors((request) => handler(request), allowedOrigins),
744
+ POST: withCors((request) => handler(request), allowedOrigins),
745
+ OPTIONS: withCors(
746
+ (_request) => Promise.resolve(new import_server4.NextResponse(null, { status: 204 })),
747
+ allowedOrigins
748
+ )
715
749
  };
716
750
  }
717
751
 
@@ -559,6 +559,7 @@ import {
559
559
  ApolloServerPluginLandingPageProductionDefault
560
560
  } from "@apollo/server/plugin/landingPage/default";
561
561
  import { startServerAndCreateNextHandler } from "@as-integrations/next";
562
+ import { NextResponse as NextResponse3 } from "next/server";
562
563
  import {
563
564
  buildTypeDefsAndResolvers
564
565
  } from "type-graphql";
@@ -612,6 +613,39 @@ function getEnv(key, skipCheck) {
612
613
  return value;
613
614
  }
614
615
 
616
+ // src/auth/constants.ts
617
+ var REFRESH_COOKIE_NAME = "refresh";
618
+ var REFRESH_HEADER_NAME = "X-Refresh-Token";
619
+
620
+ // src/utils/route.ts
621
+ function getCorsHeaders(origin, allowedOrigins) {
622
+ if (!origin || !allowedOrigins.includes(origin)) return null;
623
+ return {
624
+ "Access-Control-Allow-Origin": origin,
625
+ "Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, OPTIONS",
626
+ "Access-Control-Allow-Headers": `Content-Type, Authorization, ${REFRESH_HEADER_NAME}`,
627
+ "Access-Control-Allow-Credentials": "true"
628
+ };
629
+ }
630
+ function withCors(handler, allowedOrigins) {
631
+ if (!allowedOrigins?.length) return handler;
632
+ return ((req) => {
633
+ return handler(req).then((response) => {
634
+ if (!response) return response;
635
+ const corsHeaders = getCorsHeaders(
636
+ req.headers.get("origin"),
637
+ allowedOrigins
638
+ );
639
+ if (corsHeaders) {
640
+ Object.entries(corsHeaders).forEach(([key, value]) => {
641
+ response.headers.set(key, value);
642
+ });
643
+ }
644
+ return response;
645
+ });
646
+ });
647
+ }
648
+
615
649
  // src/auth/email/utils.ts
616
650
  import { verify as verify2 } from "jsonwebtoken";
617
651
 
@@ -621,11 +655,6 @@ import { JsonWebTokenError, sign, verify } from "jsonwebtoken";
621
655
  import { cookies } from "next/headers";
622
656
  import { redirect } from "next/navigation";
623
657
  import { NextResponse } from "next/server";
624
-
625
- // src/auth/constants.ts
626
- var REFRESH_COOKIE_NAME = "refresh";
627
-
628
- // src/auth/email/token.ts
629
658
  function getUserIdFromRefreshToken(refreshToken) {
630
659
  if (refreshToken)
631
660
  try {
@@ -670,7 +699,8 @@ async function initGraphQLServer({
670
699
  authChecker,
671
700
  resolvers,
672
701
  plugins,
673
- getContext: overrideGetContext
702
+ getContext: overrideGetContext,
703
+ allowedOrigins
674
704
  }) {
675
705
  const { typeDefs, resolvers: builtResolvers } = await buildTypeDefsAndResolvers({
676
706
  validate: true,
@@ -697,8 +727,12 @@ async function initGraphQLServer({
697
727
  context: overrideGetContext || getContext
698
728
  });
699
729
  return {
700
- GET: (request) => handler(request),
701
- POST: (request) => handler(request)
730
+ GET: withCors((request) => handler(request), allowedOrigins),
731
+ POST: withCors((request) => handler(request), allowedOrigins),
732
+ OPTIONS: withCors(
733
+ (_request) => Promise.resolve(new NextResponse3(null, { status: 204 })),
734
+ allowedOrigins
735
+ )
702
736
  };
703
737
  }
704
738
 
@@ -27,6 +27,7 @@ var import_reflect_metadata = require("reflect-metadata");
27
27
  var import_server3 = require("@apollo/server");
28
28
  var import_default = require("@apollo/server/plugin/landingPage/default");
29
29
  var import_next = require("@as-integrations/next");
30
+ var import_server4 = require("next/server");
30
31
  var import_type_graphql = require("type-graphql");
31
32
 
32
33
  // src/env.ts
@@ -78,6 +79,39 @@ function getEnv(key, skipCheck) {
78
79
  return value;
79
80
  }
80
81
 
82
+ // src/auth/constants.ts
83
+ var REFRESH_COOKIE_NAME = "refresh";
84
+ var REFRESH_HEADER_NAME = "X-Refresh-Token";
85
+
86
+ // src/utils/route.ts
87
+ function getCorsHeaders(origin, allowedOrigins) {
88
+ if (!origin || !allowedOrigins.includes(origin)) return null;
89
+ return {
90
+ "Access-Control-Allow-Origin": origin,
91
+ "Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, OPTIONS",
92
+ "Access-Control-Allow-Headers": `Content-Type, Authorization, ${REFRESH_HEADER_NAME}`,
93
+ "Access-Control-Allow-Credentials": "true"
94
+ };
95
+ }
96
+ function withCors(handler, allowedOrigins) {
97
+ if (!allowedOrigins?.length) return handler;
98
+ return ((req) => {
99
+ return handler(req).then((response) => {
100
+ if (!response) return response;
101
+ const corsHeaders = getCorsHeaders(
102
+ req.headers.get("origin"),
103
+ allowedOrigins
104
+ );
105
+ if (corsHeaders) {
106
+ Object.entries(corsHeaders).forEach(([key, value]) => {
107
+ response.headers.set(key, value);
108
+ });
109
+ }
110
+ return response;
111
+ });
112
+ });
113
+ }
114
+
81
115
  // src/auth/email/utils.ts
82
116
  var import_jsonwebtoken2 = require("jsonwebtoken");
83
117
 
@@ -87,11 +121,6 @@ var import_jsonwebtoken = require("jsonwebtoken");
87
121
  var import_headers = require("next/headers");
88
122
  var import_navigation = require("next/navigation");
89
123
  var import_server = require("next/server");
90
-
91
- // src/auth/constants.ts
92
- var REFRESH_COOKIE_NAME = "refresh";
93
-
94
- // src/auth/email/token.ts
95
124
  function getUserIdFromRefreshToken(refreshToken) {
96
125
  if (refreshToken)
97
126
  try {
@@ -136,7 +165,8 @@ async function initGraphQLServer({
136
165
  authChecker,
137
166
  resolvers,
138
167
  plugins,
139
- getContext: overrideGetContext
168
+ getContext: overrideGetContext,
169
+ allowedOrigins
140
170
  }) {
141
171
  const { typeDefs, resolvers: builtResolvers } = await (0, import_type_graphql.buildTypeDefsAndResolvers)({
142
172
  validate: true,
@@ -163,8 +193,12 @@ async function initGraphQLServer({
163
193
  context: overrideGetContext || getContext
164
194
  });
165
195
  return {
166
- GET: (request) => handler(request),
167
- POST: (request) => handler(request)
196
+ GET: withCors((request) => handler(request), allowedOrigins),
197
+ POST: withCors((request) => handler(request), allowedOrigins),
198
+ OPTIONS: withCors(
199
+ (_request) => Promise.resolve(new import_server4.NextResponse(null, { status: 204 })),
200
+ allowedOrigins
201
+ )
168
202
  };
169
203
  }
170
204
  // Annotate the CommonJS export names for ESM import in node:
@@ -1,5 +1,5 @@
1
1
  import { ApolloServerPlugin } from '@apollo/server';
2
- import { NextRequest } from 'next/server';
2
+ import { NextRequest, NextResponse } from 'next/server';
3
3
  import { AuthChecker, NonEmptyArray } from 'type-graphql';
4
4
 
5
5
  /**
@@ -35,14 +35,16 @@ import { AuthChecker, NonEmptyArray } from 'type-graphql';
35
35
  *
36
36
  * @category GraphQL
37
37
  */
38
- declare function initGraphQLServer({ authChecker, resolvers, plugins, getContext: overrideGetContext, }: {
38
+ declare function initGraphQLServer({ authChecker, resolvers, plugins, getContext: overrideGetContext, allowedOrigins, }: {
39
39
  authChecker?: AuthChecker<any>;
40
40
  resolvers: NonEmptyArray<Function>;
41
41
  plugins?: ApolloServerPlugin[];
42
42
  getContext?: (req: NextRequest) => Promise<any> | any;
43
+ allowedOrigins?: string[];
43
44
  }): Promise<{
44
45
  GET: (request: NextRequest) => Promise<Response>;
45
46
  POST: (request: NextRequest) => Promise<Response>;
47
+ OPTIONS: (_request: NextRequest) => Promise<NextResponse<unknown>>;
46
48
  }>;
47
49
 
48
50
  export { initGraphQLServer };
@@ -1,5 +1,5 @@
1
1
  import { ApolloServerPlugin } from '@apollo/server';
2
- import { NextRequest } from 'next/server';
2
+ import { NextRequest, NextResponse } from 'next/server';
3
3
  import { AuthChecker, NonEmptyArray } from 'type-graphql';
4
4
 
5
5
  /**
@@ -35,14 +35,16 @@ import { AuthChecker, NonEmptyArray } from 'type-graphql';
35
35
  *
36
36
  * @category GraphQL
37
37
  */
38
- declare function initGraphQLServer({ authChecker, resolvers, plugins, getContext: overrideGetContext, }: {
38
+ declare function initGraphQLServer({ authChecker, resolvers, plugins, getContext: overrideGetContext, allowedOrigins, }: {
39
39
  authChecker?: AuthChecker<any>;
40
40
  resolvers: NonEmptyArray<Function>;
41
41
  plugins?: ApolloServerPlugin[];
42
42
  getContext?: (req: NextRequest) => Promise<any> | any;
43
+ allowedOrigins?: string[];
43
44
  }): Promise<{
44
45
  GET: (request: NextRequest) => Promise<Response>;
45
46
  POST: (request: NextRequest) => Promise<Response>;
47
+ OPTIONS: (_request: NextRequest) => Promise<NextResponse<unknown>>;
46
48
  }>;
47
49
 
48
50
  export { initGraphQLServer };
@@ -6,6 +6,7 @@ import {
6
6
  ApolloServerPluginLandingPageProductionDefault
7
7
  } from "@apollo/server/plugin/landingPage/default";
8
8
  import { startServerAndCreateNextHandler } from "@as-integrations/next";
9
+ import { NextResponse as NextResponse3 } from "next/server";
9
10
  import {
10
11
  buildTypeDefsAndResolvers
11
12
  } from "type-graphql";
@@ -59,6 +60,39 @@ function getEnv(key, skipCheck) {
59
60
  return value;
60
61
  }
61
62
 
63
+ // src/auth/constants.ts
64
+ var REFRESH_COOKIE_NAME = "refresh";
65
+ var REFRESH_HEADER_NAME = "X-Refresh-Token";
66
+
67
+ // src/utils/route.ts
68
+ function getCorsHeaders(origin, allowedOrigins) {
69
+ if (!origin || !allowedOrigins.includes(origin)) return null;
70
+ return {
71
+ "Access-Control-Allow-Origin": origin,
72
+ "Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, OPTIONS",
73
+ "Access-Control-Allow-Headers": `Content-Type, Authorization, ${REFRESH_HEADER_NAME}`,
74
+ "Access-Control-Allow-Credentials": "true"
75
+ };
76
+ }
77
+ function withCors(handler, allowedOrigins) {
78
+ if (!allowedOrigins?.length) return handler;
79
+ return ((req) => {
80
+ return handler(req).then((response) => {
81
+ if (!response) return response;
82
+ const corsHeaders = getCorsHeaders(
83
+ req.headers.get("origin"),
84
+ allowedOrigins
85
+ );
86
+ if (corsHeaders) {
87
+ Object.entries(corsHeaders).forEach(([key, value]) => {
88
+ response.headers.set(key, value);
89
+ });
90
+ }
91
+ return response;
92
+ });
93
+ });
94
+ }
95
+
62
96
  // src/auth/email/utils.ts
63
97
  import { verify as verify2 } from "jsonwebtoken";
64
98
 
@@ -68,11 +102,6 @@ import { JsonWebTokenError, sign, verify } from "jsonwebtoken";
68
102
  import { cookies } from "next/headers";
69
103
  import { redirect } from "next/navigation";
70
104
  import { NextResponse } from "next/server";
71
-
72
- // src/auth/constants.ts
73
- var REFRESH_COOKIE_NAME = "refresh";
74
-
75
- // src/auth/email/token.ts
76
105
  function getUserIdFromRefreshToken(refreshToken) {
77
106
  if (refreshToken)
78
107
  try {
@@ -117,7 +146,8 @@ async function initGraphQLServer({
117
146
  authChecker,
118
147
  resolvers,
119
148
  plugins,
120
- getContext: overrideGetContext
149
+ getContext: overrideGetContext,
150
+ allowedOrigins
121
151
  }) {
122
152
  const { typeDefs, resolvers: builtResolvers } = await buildTypeDefsAndResolvers({
123
153
  validate: true,
@@ -144,8 +174,12 @@ async function initGraphQLServer({
144
174
  context: overrideGetContext || getContext
145
175
  });
146
176
  return {
147
- GET: (request) => handler(request),
148
- POST: (request) => handler(request)
177
+ GET: withCors((request) => handler(request), allowedOrigins),
178
+ POST: withCors((request) => handler(request), allowedOrigins),
179
+ OPTIONS: withCors(
180
+ (_request) => Promise.resolve(new NextResponse3(null, { status: 204 })),
181
+ allowedOrigins
182
+ )
149
183
  };
150
184
  }
151
185
  export {
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/utils/route.ts
21
+ var route_exports = {};
22
+ __export(route_exports, {
23
+ getCorsHeaders: () => getCorsHeaders,
24
+ withCors: () => withCors
25
+ });
26
+ module.exports = __toCommonJS(route_exports);
27
+
28
+ // src/auth/constants.ts
29
+ var REFRESH_HEADER_NAME = "X-Refresh-Token";
30
+
31
+ // src/utils/route.ts
32
+ function getCorsHeaders(origin, allowedOrigins) {
33
+ if (!origin || !allowedOrigins.includes(origin)) return null;
34
+ return {
35
+ "Access-Control-Allow-Origin": origin,
36
+ "Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, OPTIONS",
37
+ "Access-Control-Allow-Headers": `Content-Type, Authorization, ${REFRESH_HEADER_NAME}`,
38
+ "Access-Control-Allow-Credentials": "true"
39
+ };
40
+ }
41
+ function withCors(handler, allowedOrigins) {
42
+ if (!allowedOrigins?.length) return handler;
43
+ return ((req) => {
44
+ return handler(req).then((response) => {
45
+ if (!response) return response;
46
+ const corsHeaders = getCorsHeaders(
47
+ req.headers.get("origin"),
48
+ allowedOrigins
49
+ );
50
+ if (corsHeaders) {
51
+ Object.entries(corsHeaders).forEach(([key, value]) => {
52
+ response.headers.set(key, value);
53
+ });
54
+ }
55
+ return response;
56
+ });
57
+ });
58
+ }
59
+ // Annotate the CommonJS export names for ESM import in node:
60
+ 0 && (module.exports = {
61
+ getCorsHeaders,
62
+ withCors
63
+ });
@@ -0,0 +1,11 @@
1
+ import { NextRequest, NextResponse } from 'next/server';
2
+
3
+ declare function getCorsHeaders(origin: string | null, allowedOrigins: string[]): {
4
+ "Access-Control-Allow-Origin": string;
5
+ "Access-Control-Allow-Methods": string;
6
+ "Access-Control-Allow-Headers": string;
7
+ "Access-Control-Allow-Credentials": string;
8
+ } | null;
9
+ declare function withCors<T extends (req: NextRequest) => Promise<NextResponse | Response | undefined>>(handler: T, allowedOrigins?: string[]): T;
10
+
11
+ export { getCorsHeaders, withCors };
@@ -0,0 +1,11 @@
1
+ import { NextRequest, NextResponse } from 'next/server';
2
+
3
+ declare function getCorsHeaders(origin: string | null, allowedOrigins: string[]): {
4
+ "Access-Control-Allow-Origin": string;
5
+ "Access-Control-Allow-Methods": string;
6
+ "Access-Control-Allow-Headers": string;
7
+ "Access-Control-Allow-Credentials": string;
8
+ } | null;
9
+ declare function withCors<T extends (req: NextRequest) => Promise<NextResponse | Response | undefined>>(handler: T, allowedOrigins?: string[]): T;
10
+
11
+ export { getCorsHeaders, withCors };
@@ -0,0 +1,35 @@
1
+ // src/auth/constants.ts
2
+ var REFRESH_HEADER_NAME = "X-Refresh-Token";
3
+
4
+ // src/utils/route.ts
5
+ function getCorsHeaders(origin, allowedOrigins) {
6
+ if (!origin || !allowedOrigins.includes(origin)) return null;
7
+ return {
8
+ "Access-Control-Allow-Origin": origin,
9
+ "Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, OPTIONS",
10
+ "Access-Control-Allow-Headers": `Content-Type, Authorization, ${REFRESH_HEADER_NAME}`,
11
+ "Access-Control-Allow-Credentials": "true"
12
+ };
13
+ }
14
+ function withCors(handler, allowedOrigins) {
15
+ if (!allowedOrigins?.length) return handler;
16
+ return ((req) => {
17
+ return handler(req).then((response) => {
18
+ if (!response) return response;
19
+ const corsHeaders = getCorsHeaders(
20
+ req.headers.get("origin"),
21
+ allowedOrigins
22
+ );
23
+ if (corsHeaders) {
24
+ Object.entries(corsHeaders).forEach(([key, value]) => {
25
+ response.headers.set(key, value);
26
+ });
27
+ }
28
+ return response;
29
+ });
30
+ });
31
+ }
32
+ export {
33
+ getCorsHeaders,
34
+ withCors
35
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "naystack",
3
- "version": "1.5.29",
3
+ "version": "1.5.31",
4
4
  "description": "A stack built with Next + GraphQL + S3 + Auth",
5
5
  "main": "dist/index.cjs.js",
6
6
  "module": "dist/index.esm.js",