@cabin-id/nextjs 0.1.7 → 0.2.0

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 (251) hide show
  1. package/dist/cjs/api/{getUserInfo.js → endpoints/AbstractApi.js} +14 -18
  2. package/dist/cjs/api/endpoints/AbstractApi.js.map +1 -0
  3. package/dist/cjs/api/endpoints/UserApi.js +40 -0
  4. package/dist/cjs/api/endpoints/UserApi.js.map +1 -0
  5. package/dist/cjs/api/endpoints/index.js +32 -0
  6. package/dist/cjs/api/endpoints/index.js.map +1 -0
  7. package/dist/cjs/api/factory.js +60 -0
  8. package/dist/cjs/api/factory.js.map +1 -0
  9. package/dist/cjs/api/request.js +97 -0
  10. package/dist/cjs/api/request.js.map +1 -0
  11. package/dist/cjs/component.client.js +2 -2
  12. package/dist/cjs/component.client.js.map +1 -1
  13. package/dist/cjs/component.server.js +5 -2
  14. package/dist/cjs/component.server.js.map +1 -1
  15. package/dist/cjs/components/SignInButton.js +15 -6
  16. package/dist/cjs/components/SignInButton.js.map +1 -1
  17. package/dist/cjs/constants.js +20 -19
  18. package/dist/cjs/constants.js.map +1 -1
  19. package/dist/cjs/hooks/createContextAndHook.js +62 -0
  20. package/dist/cjs/hooks/createContextAndHook.js.map +1 -0
  21. package/dist/cjs/hooks/useSafeLayoutEffect.js +40 -0
  22. package/dist/cjs/hooks/useSafeLayoutEffect.js.map +1 -0
  23. package/dist/cjs/hooks/useUser.js +9 -16
  24. package/dist/cjs/hooks/useUser.js.map +1 -1
  25. package/dist/cjs/index.js +2 -2
  26. package/dist/cjs/index.js.map +1 -1
  27. package/dist/cjs/provider/context.js +62 -0
  28. package/dist/cjs/provider/context.js.map +1 -0
  29. package/dist/cjs/provider/core.provider.js +49 -0
  30. package/dist/cjs/provider/core.provider.js.map +1 -0
  31. package/dist/cjs/{client/provider.js → provider/main.provider.js} +9 -21
  32. package/dist/cjs/provider/main.provider.js.map +1 -0
  33. package/dist/cjs/server/auth.js +31 -7
  34. package/dist/cjs/server/auth.js.map +1 -1
  35. package/dist/cjs/{client/request.js → server/client.js} +12 -20
  36. package/dist/cjs/server/client.js.map +1 -0
  37. package/dist/cjs/server/createGetAuth.js +45 -0
  38. package/dist/cjs/server/createGetAuth.js.map +1 -0
  39. package/dist/cjs/server/createRedirect.js +36 -35
  40. package/dist/cjs/server/createRedirect.js.map +1 -1
  41. package/dist/cjs/server/errors.js +110 -0
  42. package/dist/cjs/server/errors.js.map +1 -0
  43. package/dist/cjs/server/getCurrentUser.js +3 -10
  44. package/dist/cjs/server/getCurrentUser.js.map +1 -1
  45. package/dist/cjs/server/index.js +32 -0
  46. package/dist/cjs/server/index.js.map +1 -0
  47. package/dist/cjs/server/middleware.js +122 -102
  48. package/dist/cjs/server/middleware.js.map +1 -1
  49. package/dist/cjs/server/protect.js +69 -0
  50. package/dist/cjs/server/protect.js.map +1 -0
  51. package/dist/cjs/server/routeMatcher.js +1 -0
  52. package/dist/cjs/server/routeMatcher.js.map +1 -1
  53. package/dist/cjs/server/serverRedirectWithAuth.js +2 -2
  54. package/dist/cjs/server/serverRedirectWithAuth.js.map +1 -1
  55. package/dist/cjs/server/type.js.map +1 -1
  56. package/dist/cjs/server/utils.js +58 -0
  57. package/dist/cjs/server/utils.js.map +1 -1
  58. package/dist/cjs/styles/global.css +30 -2
  59. package/dist/cjs/styles/global.css.map +1 -1
  60. package/dist/cjs/tokens/authObjects.js +45 -0
  61. package/dist/cjs/tokens/authObjects.js.map +1 -0
  62. package/dist/cjs/tokens/authStatus.js +86 -0
  63. package/dist/cjs/tokens/authStatus.js.map +1 -0
  64. package/dist/cjs/tokens/authenticateContext.js +69 -0
  65. package/dist/cjs/tokens/authenticateContext.js.map +1 -0
  66. package/dist/cjs/tokens/cabinIdRequest.js +79 -0
  67. package/dist/cjs/tokens/cabinIdRequest.js.map +1 -0
  68. package/dist/cjs/tokens/cabinIdUrl.js +36 -0
  69. package/dist/cjs/tokens/cabinIdUrl.js.map +1 -0
  70. package/dist/cjs/tokens/request.js +58 -0
  71. package/dist/cjs/tokens/request.js.map +1 -0
  72. package/dist/cjs/types.js.map +1 -1
  73. package/dist/cjs/utils/createCabinIdClient.js +38 -0
  74. package/dist/cjs/utils/createCabinIdClient.js.map +1 -0
  75. package/dist/cjs/utils/http.js +31 -0
  76. package/dist/cjs/utils/http.js.map +1 -0
  77. package/dist/cjs/utils/initial.js +51 -0
  78. package/dist/cjs/utils/initial.js.map +1 -0
  79. package/dist/cjs/utils.js +10 -0
  80. package/dist/cjs/utils.js.map +1 -1
  81. package/dist/esm/api/endpoints/AbstractApi.js +14 -0
  82. package/dist/esm/api/endpoints/AbstractApi.js.map +1 -0
  83. package/dist/esm/api/endpoints/UserApi.js +16 -0
  84. package/dist/esm/api/endpoints/UserApi.js.map +1 -0
  85. package/dist/esm/api/endpoints/index.js +7 -0
  86. package/dist/esm/api/endpoints/index.js.map +1 -0
  87. package/dist/esm/api/factory.js +35 -0
  88. package/dist/esm/api/factory.js.map +1 -0
  89. package/dist/esm/api/request.js +63 -0
  90. package/dist/esm/api/request.js.map +1 -0
  91. package/dist/esm/component.client.js +1 -1
  92. package/dist/esm/component.client.js.map +1 -1
  93. package/dist/esm/component.server.js +3 -1
  94. package/dist/esm/component.server.js.map +1 -1
  95. package/dist/esm/components/SignInButton.js +17 -8
  96. package/dist/esm/components/SignInButton.js.map +1 -1
  97. package/dist/esm/constants.js +16 -15
  98. package/dist/esm/constants.js.map +1 -1
  99. package/dist/esm/hooks/createContextAndHook.js +27 -0
  100. package/dist/esm/hooks/createContextAndHook.js.map +1 -0
  101. package/dist/esm/hooks/useSafeLayoutEffect.js +6 -0
  102. package/dist/esm/hooks/useSafeLayoutEffect.js.map +1 -0
  103. package/dist/esm/hooks/useUser.js +12 -6
  104. package/dist/esm/hooks/useUser.js.map +1 -1
  105. package/dist/esm/index.js +1 -1
  106. package/dist/esm/index.js.map +1 -1
  107. package/dist/esm/provider/context.js +24 -0
  108. package/dist/esm/provider/context.js.map +1 -0
  109. package/dist/esm/provider/core.provider.js +15 -0
  110. package/dist/esm/provider/core.provider.js.map +1 -0
  111. package/dist/esm/provider/main.provider.js +11 -0
  112. package/dist/esm/provider/main.provider.js.map +1 -0
  113. package/dist/esm/server/auth.js +32 -8
  114. package/dist/esm/server/auth.js.map +1 -1
  115. package/dist/esm/server/client.js +11 -0
  116. package/dist/esm/server/client.js.map +1 -0
  117. package/dist/esm/server/createGetAuth.js +23 -0
  118. package/dist/esm/server/createGetAuth.js.map +1 -0
  119. package/dist/esm/server/createRedirect.js +36 -35
  120. package/dist/esm/server/createRedirect.js.map +1 -1
  121. package/dist/esm/server/errors.js +78 -0
  122. package/dist/esm/server/errors.js.map +1 -0
  123. package/dist/esm/server/getCurrentUser.js +3 -10
  124. package/dist/esm/server/getCurrentUser.js.map +1 -1
  125. package/dist/esm/server/index.js +7 -0
  126. package/dist/esm/server/index.js.map +1 -0
  127. package/dist/esm/server/middleware.js +125 -106
  128. package/dist/esm/server/middleware.js.map +1 -1
  129. package/dist/esm/server/protect.js +45 -0
  130. package/dist/esm/server/protect.js.map +1 -0
  131. package/dist/esm/server/routeMatcher.js +1 -0
  132. package/dist/esm/server/routeMatcher.js.map +1 -1
  133. package/dist/esm/server/serverRedirectWithAuth.js +2 -2
  134. package/dist/esm/server/serverRedirectWithAuth.js.map +1 -1
  135. package/dist/esm/server/utils.js +54 -1
  136. package/dist/esm/server/utils.js.map +1 -1
  137. package/dist/esm/styles/global.css +30 -2
  138. package/dist/esm/styles/global.css.map +1 -1
  139. package/dist/esm/tokens/authObjects.js +20 -0
  140. package/dist/esm/tokens/authObjects.js.map +1 -0
  141. package/dist/esm/tokens/authStatus.js +59 -0
  142. package/dist/esm/tokens/authStatus.js.map +1 -0
  143. package/dist/esm/tokens/authenticateContext.js +45 -0
  144. package/dist/esm/tokens/authenticateContext.js.map +1 -0
  145. package/dist/esm/tokens/cabinIdRequest.js +55 -0
  146. package/dist/esm/tokens/cabinIdRequest.js.map +1 -0
  147. package/dist/esm/tokens/cabinIdUrl.js +12 -0
  148. package/dist/esm/tokens/cabinIdUrl.js.map +1 -0
  149. package/dist/esm/tokens/request.js +34 -0
  150. package/dist/esm/tokens/request.js.map +1 -0
  151. package/dist/esm/utils/createCabinIdClient.js +17 -0
  152. package/dist/esm/utils/createCabinIdClient.js.map +1 -0
  153. package/dist/esm/utils/http.js +7 -0
  154. package/dist/esm/utils/http.js.map +1 -0
  155. package/dist/esm/utils/initial.js +26 -0
  156. package/dist/esm/utils/initial.js.map +1 -0
  157. package/dist/esm/utils.js +9 -0
  158. package/dist/esm/utils.js.map +1 -1
  159. package/dist/types/api/endpoints/AbstractApi.d.ts +7 -0
  160. package/dist/types/api/endpoints/AbstractApi.d.ts.map +1 -0
  161. package/dist/types/api/endpoints/UserApi.d.ts +6 -0
  162. package/dist/types/api/endpoints/UserApi.d.ts.map +1 -0
  163. package/dist/types/api/endpoints/index.d.ts +3 -0
  164. package/dist/types/api/endpoints/index.d.ts.map +1 -0
  165. package/dist/types/api/factory.d.ts +35 -0
  166. package/dist/types/api/factory.d.ts.map +1 -0
  167. package/dist/types/api/request.d.ts +33 -0
  168. package/dist/types/api/request.d.ts.map +1 -0
  169. package/dist/types/component.client.d.ts +1 -1
  170. package/dist/types/component.client.d.ts.map +1 -1
  171. package/dist/types/component.server.d.ts +1 -0
  172. package/dist/types/component.server.d.ts.map +1 -1
  173. package/dist/types/components/SignInButton.d.ts.map +1 -1
  174. package/dist/types/constants.d.ts +11 -10
  175. package/dist/types/constants.d.ts.map +1 -1
  176. package/dist/types/hooks/createContextAndHook.d.ts +18 -0
  177. package/dist/types/hooks/createContextAndHook.d.ts.map +1 -0
  178. package/dist/types/hooks/useSafeLayoutEffect.d.ts +3 -0
  179. package/dist/types/hooks/useSafeLayoutEffect.d.ts.map +1 -0
  180. package/dist/types/hooks/useUser.d.ts +16 -1
  181. package/dist/types/hooks/useUser.d.ts.map +1 -1
  182. package/dist/types/index.d.ts +1 -1
  183. package/dist/types/index.d.ts.map +1 -1
  184. package/dist/types/provider/context.d.ts +15 -0
  185. package/dist/types/provider/context.d.ts.map +1 -0
  186. package/dist/types/provider/core.provider.d.ts +6 -0
  187. package/dist/types/provider/core.provider.d.ts.map +1 -0
  188. package/dist/types/provider/main.provider.d.ts +5 -0
  189. package/dist/types/provider/main.provider.d.ts.map +1 -0
  190. package/dist/types/server/auth.d.ts +10 -3
  191. package/dist/types/server/auth.d.ts.map +1 -1
  192. package/dist/types/server/client.d.ts +3 -0
  193. package/dist/types/server/client.d.ts.map +1 -0
  194. package/dist/types/server/createGetAuth.d.ts +5 -0
  195. package/dist/types/server/createGetAuth.d.ts.map +1 -0
  196. package/dist/types/server/createRedirect.d.ts.map +1 -1
  197. package/dist/types/server/errors.d.ts +10 -0
  198. package/dist/types/server/errors.d.ts.map +1 -0
  199. package/dist/types/server/getCurrentUser.d.ts.map +1 -1
  200. package/dist/types/server/index.d.ts +3 -0
  201. package/dist/types/server/index.d.ts.map +1 -0
  202. package/dist/types/server/middleware.d.ts +22 -77
  203. package/dist/types/server/middleware.d.ts.map +1 -1
  204. package/dist/types/server/protect.d.ts +34 -0
  205. package/dist/types/server/protect.d.ts.map +1 -0
  206. package/dist/types/server/routeMatcher.d.ts +4 -4
  207. package/dist/types/server/serverRedirectWithAuth.d.ts +2 -1
  208. package/dist/types/server/serverRedirectWithAuth.d.ts.map +1 -1
  209. package/dist/types/server/type.d.ts +10 -1
  210. package/dist/types/server/type.d.ts.map +1 -1
  211. package/dist/types/server/utils.d.ts +10 -3
  212. package/dist/types/server/utils.d.ts.map +1 -1
  213. package/dist/types/tokens/authObjects.d.ts +37 -0
  214. package/dist/types/tokens/authObjects.d.ts.map +1 -0
  215. package/dist/types/tokens/authStatus.d.ts +51 -0
  216. package/dist/types/tokens/authStatus.d.ts.map +1 -0
  217. package/dist/types/tokens/authenticateContext.d.ts +40 -0
  218. package/dist/types/tokens/authenticateContext.d.ts.map +1 -0
  219. package/dist/types/tokens/cabinIdRequest.d.ts +24 -0
  220. package/dist/types/tokens/cabinIdRequest.d.ts.map +1 -0
  221. package/dist/types/tokens/cabinIdUrl.d.ts +18 -0
  222. package/dist/types/tokens/cabinIdUrl.d.ts.map +1 -0
  223. package/dist/types/tokens/request.d.ts +4 -0
  224. package/dist/types/tokens/request.d.ts.map +1 -0
  225. package/dist/types/types.d.ts +1 -3
  226. package/dist/types/types.d.ts.map +1 -1
  227. package/dist/types/utils/createCabinIdClient.d.ts +5 -0
  228. package/dist/types/utils/createCabinIdClient.d.ts.map +1 -0
  229. package/dist/types/utils/http.d.ts +4 -0
  230. package/dist/types/utils/http.d.ts.map +1 -0
  231. package/dist/types/utils/initial.d.ts +8 -0
  232. package/dist/types/utils/initial.d.ts.map +1 -0
  233. package/dist/types/utils.d.ts +1 -0
  234. package/dist/types/utils.d.ts.map +1 -1
  235. package/package.json +6 -2
  236. package/server/package.json +5 -0
  237. package/dist/cjs/api/getUserInfo.js.map +0 -1
  238. package/dist/cjs/client/provider.js.map +0 -1
  239. package/dist/cjs/client/request.js.map +0 -1
  240. package/dist/esm/api/getUserInfo.js +0 -18
  241. package/dist/esm/api/getUserInfo.js.map +0 -1
  242. package/dist/esm/client/provider.js +0 -22
  243. package/dist/esm/client/provider.js.map +0 -1
  244. package/dist/esm/client/request.js +0 -19
  245. package/dist/esm/client/request.js.map +0 -1
  246. package/dist/types/api/getUserInfo.d.ts +0 -2
  247. package/dist/types/api/getUserInfo.d.ts.map +0 -1
  248. package/dist/types/client/provider.d.ts +0 -7
  249. package/dist/types/client/provider.d.ts.map +0 -1
  250. package/dist/types/client/request.d.ts +0 -3
  251. package/dist/types/client/request.d.ts.map +0 -1
@@ -1,28 +1,38 @@
1
1
  import { NextResponse } from "next/server";
2
2
  import {
3
3
  constants,
4
- CUSTOM_AFTER_SIGN_IN_URL,
5
- CUSTOM_SIGN_IN_URL,
6
- frontendApi,
7
4
  PUBLISHABLE_KEY,
8
- SECRET_KEY
5
+ SECRET_KEY,
6
+ SIGN_IN_URL,
7
+ SIGN_UP_URL
9
8
  } from "../constants";
10
- import { createRouteMatcher } from "./routeMatcher";
11
- import {
12
- apiEndpointUnauthorizedNextResponse,
13
- assertKey,
14
- redirectAdapter
15
- } from "./utils";
9
+ import { assertKey, decorateRequest, redirectAdapter } from "./utils";
10
+ import { cabinIdClient } from "./client";
11
+ import { createCabinIdRequest } from "../tokens/cabinIdRequest";
12
+ import { createProtect } from "./protect";
16
13
  import { createRedirect } from "./createRedirect";
17
- const DEFAULT_CONFIG_MATCHER = [
18
- "/((?!.+\\.[\\w]+$|_next).*)",
19
- "/",
20
- "/(api|trpc)(.*)"
21
- ];
22
- const DEFAULT_IGNORED_ROUTES = [`/((?!api|trpc))(_next.*|.+\\.[\\w]+$)`];
23
- const DEFAULT_API_ROUTES = ["/api/(.*)", "/trpc/(.*)"];
14
+ import { isRedirect, setHeader } from "../utils/response";
15
+ import { serverRedirectWithAuth } from "./serverRedirectWithAuth";
16
+ const CONTROL_FLOW_ERROR = {
17
+ FORCE_NOT_FOUND: "CABIN_ID_PROTECT_REWRITE",
18
+ REDIRECT_TO_URL: "CABIN_ID_PROTECT_REDIRECT_TO_URL",
19
+ REDIRECT_TO_SIGN_IN: "CABIN_ID_PROTECT_REDIRECT_TO_SIGN_IN"
20
+ };
21
+ const parseRequestAndEvent = (args) => {
22
+ return [
23
+ args[0] instanceof Request ? args[0] : void 0,
24
+ args[0] instanceof Request ? args[1] : void 0
25
+ ];
26
+ };
27
+ const parseHandlerAndOptions = (args) => {
28
+ return [
29
+ typeof args[0] === "function" ? args[0] : void 0,
30
+ (args.length === 2 ? args[1] : typeof args[0] === "function" ? {} : args[0]) || {}
31
+ ];
32
+ };
24
33
  const authMiddleware = (...args) => {
25
- const [params = {}] = args;
34
+ const [request, event] = parseRequestAndEvent(args);
35
+ const [handler, params] = parseHandlerAndOptions(args);
26
36
  const publishableKey = assertKey(
27
37
  params.publishableKey || PUBLISHABLE_KEY,
28
38
  () => {
@@ -32,8 +42,8 @@ const authMiddleware = (...args) => {
32
42
  const secretKey = assertKey(params.secretKey || SECRET_KEY, () => {
33
43
  throw new Error("Secret Key is not valid");
34
44
  });
35
- const signInUrl = params.signInUrl || CUSTOM_SIGN_IN_URL;
36
- const signUpUrl = params.signUpUrl || CUSTOM_SIGN_IN_URL;
45
+ const signInUrl = params.signInUrl || SIGN_IN_URL;
46
+ const signUpUrl = params.signUpUrl || SIGN_UP_URL;
37
47
  const options = {
38
48
  ...params,
39
49
  publishableKey,
@@ -41,108 +51,117 @@ const authMiddleware = (...args) => {
41
51
  signInUrl,
42
52
  signUpUrl
43
53
  };
44
- const isIgnoredRoute = createRouteMatcher(
45
- options.ignoredRoutes || DEFAULT_IGNORED_ROUTES
46
- );
47
- const isPublicRoute = createRouteMatcher(
48
- withDefaultPublicRoutes(options.publicRoutes)
49
- );
50
- return async (_req) => {
51
- const url = _req.nextUrl;
52
- const accessToken = url.searchParams.get(constants.QueryParams.Token);
53
- const userId = url.searchParams.get(constants.QueryParams.UserId);
54
+ const nextMiddleware = async (_request, _event) => {
55
+ const accessToken = _request.nextUrl.searchParams.get(
56
+ constants.QueryParams.Token
57
+ );
58
+ const userId = _request.nextUrl.searchParams.get(
59
+ constants.QueryParams.UserId
60
+ );
54
61
  if (accessToken && userId) {
62
+ const url = _request.nextUrl;
55
63
  const path = url.pathname;
56
- const response = NextResponse.redirect(new URL(path || "/", _req.url));
64
+ const response = NextResponse.redirect(
65
+ new URL(path || "/", _request.url)
66
+ );
57
67
  response.cookies.set(constants.Cookies.Client, accessToken);
58
68
  response.cookies.set(constants.Cookies.User, userId);
59
69
  return response;
60
70
  }
61
- if (isIgnoredRoute(_req) || isPublicRoute(_req)) {
62
- return;
71
+ const cabinIdRequest = createCabinIdRequest(_request);
72
+ const requestState = await cabinIdClient.authenticateRequest(
73
+ cabinIdRequest,
74
+ options
75
+ );
76
+ const authObject = requestState.toAuth();
77
+ const redirectToSignIn = createMiddlewareRedirectToSignIn(cabinIdRequest);
78
+ const protect = createMiddlewareProtect(
79
+ cabinIdRequest,
80
+ authObject,
81
+ redirectToSignIn
82
+ );
83
+ const authObjWithMethods = Object.assign(
84
+ authObject,
85
+ { protect, redirectToSignIn }
86
+ );
87
+ let handlerResult = NextResponse.next();
88
+ try {
89
+ handlerResult = await (handler == null ? void 0 : handler(() => authObjWithMethods, _request, _event)) || handlerResult;
90
+ } catch (e) {
91
+ handlerResult = handleControlFlowErrors(e, cabinIdRequest, requestState);
92
+ }
93
+ if (isRedirect(handlerResult)) {
94
+ return serverRedirectWithAuth(cabinIdRequest, handlerResult);
63
95
  }
64
- const result = checkAuth(_req);
65
- return result;
96
+ decorateRequest(
97
+ cabinIdRequest,
98
+ handlerResult,
99
+ requestState,
100
+ options.secretKey
101
+ );
102
+ if (requestState.headers) {
103
+ requestState.headers.forEach((value, key) => {
104
+ handlerResult.headers.append(key, value);
105
+ });
106
+ }
107
+ return handlerResult;
66
108
  };
67
- };
68
- const withDefaultPublicRoutes = (publicRoutes) => {
69
- if (typeof publicRoutes === "function") {
70
- return publicRoutes;
109
+ if (request && event) {
110
+ return nextMiddleware(request, event);
71
111
  }
72
- const routes = [publicRoutes || ""].flat().filter(Boolean);
73
- const signInUrl = process.env.NEXT_PUBLIC_CLERK_SIGN_IN_URL || "";
74
- if (signInUrl) {
75
- routes.push(matchRoutesStartingWith(signInUrl));
76
- }
77
- const signUpUrl = process.env.NEXT_PUBLIC_CLERK_SIGN_UP_URL || "";
78
- if (signUpUrl) {
79
- routes.push(matchRoutesStartingWith(signUpUrl));
80
- }
81
- return routes;
82
- };
83
- const matchRoutesStartingWith = (path) => {
84
- path = path.replace(/\/$/, "");
85
- return new RegExp(`^${path}(/.*)?$`);
86
- };
87
- const isRequestMethodIndicatingApiRoute = (req) => {
88
- const requestMethod = req.method.toLowerCase();
89
- return !["get", "head", "options"].includes(requestMethod);
112
+ return nextMiddleware;
90
113
  };
91
- const isRequestContentTypeJson = (req) => {
92
- const requestContentType = req.headers.get(constants.Headers.ContentType);
93
- return requestContentType === constants.ContentTypes.Json;
94
- };
95
- const createApiRoutes = (apiRoutes) => {
96
- if (apiRoutes) {
97
- return createRouteMatcher(apiRoutes);
98
- }
99
- const isDefaultApiRoute = createRouteMatcher(DEFAULT_API_ROUTES);
100
- return (req) => isDefaultApiRoute(req) || isRequestMethodIndicatingApiRoute(req) || isRequestContentTypeJson(req);
114
+ const createMiddlewareRedirectToSignIn = (cabinIdRequest) => {
115
+ return (opts = {}) => {
116
+ const err = new Error(CONTROL_FLOW_ERROR.REDIRECT_TO_SIGN_IN);
117
+ err.returnBackUrl = opts.returnBackUrl === null ? "" : opts.returnBackUrl || cabinIdRequest.cabinIdUrl.toString();
118
+ throw err;
119
+ };
101
120
  };
102
- const createDefaultAfterAuth = (isPublicRoute, isApiRoute, options) => {
103
- return (auth, req) => {
104
- if (!auth.userId && !isPublicRoute(req)) {
105
- if (isApiRoute(req)) {
106
- return apiEndpointUnauthorizedNextResponse();
107
- }
108
- return createRedirect({
109
- redirectAdapter,
110
- signInUrl: options.signInUrl,
111
- signUpUrl: options.signUpUrl,
112
- publishableKey: options.publishableKey,
113
- // We're setting baseUrl to '' here as we want to keep the legacy behavior of
114
- // the redirectToSignIn, redirectToSignUp helpers in the backend package.
115
- baseUrl: ""
116
- }).redirectToSignIn({ returnBackUrl: req.nextUrl.href });
117
- }
118
- return NextResponse.next();
121
+ const createMiddlewareProtect = (cabinIdRequest, authObject, redirectToSignIn) => {
122
+ return (_, options) => {
123
+ const notFound = () => {
124
+ throw new Error(CONTROL_FLOW_ERROR.FORCE_NOT_FOUND);
125
+ };
126
+ const redirect = (url) => {
127
+ const err = new Error(CONTROL_FLOW_ERROR.REDIRECT_TO_URL);
128
+ err.redirectUrl = url;
129
+ throw err;
130
+ };
131
+ return createProtect({
132
+ request: cabinIdRequest,
133
+ redirect,
134
+ notFound,
135
+ authObject,
136
+ redirectToSignIn
137
+ })(options);
119
138
  };
120
139
  };
121
- const checkAuth = (req) => {
122
- const accessToken = req.cookies.get(constants.Cookies.Client);
123
- if (!accessToken && req.nextUrl.href !== CUSTOM_SIGN_IN_URL) {
124
- if (CUSTOM_SIGN_IN_URL) {
125
- return NextResponse.redirect(new URL(CUSTOM_SIGN_IN_URL));
126
- }
127
- if (frontendApi) {
128
- const params = new URLSearchParams({
129
- redirect_url: CUSTOM_AFTER_SIGN_IN_URL || "/"
130
- });
131
- return NextResponse.redirect(
132
- new URL(`${frontendApi}/sign-in?${params.toString()}`)
140
+ const handleControlFlowErrors = (e, cabinIdRequest, requestState) => {
141
+ switch (e.message) {
142
+ case CONTROL_FLOW_ERROR.FORCE_NOT_FOUND:
143
+ return setHeader(
144
+ NextResponse.rewrite(
145
+ `${cabinIdRequest.cabinIdUrl.origin}/cabin_${Date.now()}`
146
+ ),
147
+ constants.Headers.AuthReason,
148
+ "protect-rewrite"
133
149
  );
134
- }
135
- throw new Error(
136
- "You are not authentication. Please provide CABIN ID PUBLISH KEY to redirect to authentication page"
137
- );
150
+ case CONTROL_FLOW_ERROR.REDIRECT_TO_URL:
151
+ return redirectAdapter(e.redirectUrl);
152
+ case CONTROL_FLOW_ERROR.REDIRECT_TO_SIGN_IN:
153
+ return createRedirect({
154
+ redirectAdapter,
155
+ baseUrl: cabinIdRequest.cabinIdUrl,
156
+ signInUrl: requestState.signInUrl,
157
+ signUpUrl: requestState.signUpUrl,
158
+ publishableKey: requestState.publishableKey
159
+ }).redirectToSignIn({ returnBackUrl: e.returnBackUrl });
160
+ default:
161
+ throw e;
138
162
  }
139
- return NextResponse.next();
140
163
  };
141
164
  export {
142
- DEFAULT_API_ROUTES,
143
- DEFAULT_CONFIG_MATCHER,
144
- DEFAULT_IGNORED_ROUTES,
145
- authMiddleware,
146
- createDefaultAfterAuth
165
+ authMiddleware
147
166
  };
148
167
  //# sourceMappingURL=middleware.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/server/middleware.ts"],"sourcesContent":["import { NextFetchEvent, NextMiddleware, NextResponse } from 'next/server';\nimport { NextRequest } from 'next/server';\nimport {\n constants,\n CUSTOM_AFTER_SIGN_IN_URL,\n CUSTOM_SIGN_IN_URL,\n frontendApi,\n PUBLISHABLE_KEY,\n SECRET_KEY,\n} from '../constants';\nimport { createRouteMatcher, RouteMatcherParam } from './routeMatcher';\nimport {\n apiEndpointUnauthorizedNextResponse,\n assertKey,\n // decorateRequest,\n redirectAdapter,\n} from './utils';\nimport { NextMiddlewareReturn } from './type';\n// import { isRedirect, setHeader } from '../utils/response';\nimport { createRedirect } from './createRedirect';\n// import { serverRedirectWithAuth } from './serverRedirectWithAuth';\n\ntype BeforeAuthHandler = (\n req: NextRequest,\n evt: NextFetchEvent\n) => NextMiddlewareReturn | false | Promise<false>;\n\ntype AfterAuthHandler = (\n auth: { isPublicRoute: boolean; isApiRoute: boolean },\n req: NextRequest,\n evt: NextFetchEvent\n) => NextMiddlewareReturn;\n\nexport type AuthenticateRequestOptions = {\n publishableKey?: string;\n secretKey?: string;\n domain?: string;\n isSatellite?: boolean;\n proxyUrl?: string;\n signInUrl?: string;\n signUpUrl?: string;\n afterSignInUrl?: string;\n afterSignUpUrl?: string;\n};\n\ntype AuthMiddlewareParams = AuthenticateRequestOptions & {\n /**\n * A function that is called before the authentication middleware is executed.\n * If a redirect response is returned, the middleware will respect it and redirect the user.\n * If false is returned, the auth middleware will not execute and the request will be handled as if the auth middleware was not present.\n */\n beforeAuth?: BeforeAuthHandler;\n /**\n * A function that is called after the authentication middleware is executed.\n * This function has access to the auth object and can be used to execute logic based on the auth state.\n */\n afterAuth?: AfterAuthHandler;\n /**\n * A list of routes that should be accessible without authentication.\n * You can use glob patterns to match multiple routes or a function to match against the request object.\n * Path patterns and regular expressions are supported, for example: `['/foo', '/bar(.*)'] or `[/^\\/foo\\/.*$/]`\n * The sign in and sign up URLs are included by default, unless a function is provided.\n * For more information, see: https://clerk.com/docs\n */\n publicRoutes?: RouteMatcherParam;\n /**\n * A list of routes that should be ignored by the middleware.\n * This list typically includes routes for static files or Next.js internals.\n * For improved performance, these routes should be skipped using the default config.matcher instead.\n */\n ignoredRoutes?: IgnoredRoutesParam;\n /**\n * A list of routes that should be treated as API endpoints.\n * When user is signed out, the middleware will return a 401 response for these routes, instead of redirecting the user.\n *\n * If omitted, the following heuristics will be used to determine an API endpoint:\n * - The route path is ['/api/(.*)', '/trpc/(.*)'],\n * - or the request has `Content-Type` set to `application/json`,\n * - or the request method is not one of: `GET`, `OPTIONS` ,` HEAD`\n *\n * @default undefined\n */\n apiRoutes?: ApiRoutesParam;\n};\n\nexport interface AuthMiddleware {\n (params?: AuthMiddlewareParams): NextMiddleware;\n}\n\n/**\n * The default ideal matcher that excludes the _next directory (internals) and all static files,\n * but it will match the root route (/) and any routes that start with /api or /trpc.\n */\nexport const DEFAULT_CONFIG_MATCHER = [\n '/((?!.+\\\\.[\\\\w]+$|_next).*)',\n '/',\n '/(api|trpc)(.*)',\n];\n\n/**\n * Any routes matching this path will be ignored by the middleware.\n * This is the inverted version of DEFAULT_CONFIG_MATCHER.\n */\nexport const DEFAULT_IGNORED_ROUTES = [`/((?!api|trpc))(_next.*|.+\\\\.[\\\\w]+$)`];\n/**\n * Any routes matching this path will be treated as API endpoints by the middleware.\n */\nexport const DEFAULT_API_ROUTES = ['/api/(.*)', '/trpc/(.*)'];\n\ntype IgnoredRoutesParam =\n | Array<RegExp | string>\n | RegExp\n | string\n | ((req: NextRequest) => boolean);\n\ntype ApiRoutesParam = IgnoredRoutesParam;\n\nconst authMiddleware: AuthMiddleware = (...args: unknown[]) => {\n const [params = {}] = args as [AuthMiddlewareParams?];\n\n const publishableKey = assertKey(\n params.publishableKey || PUBLISHABLE_KEY,\n () => {\n throw new Error('Publish Key is not exist');\n }\n );\n const secretKey = assertKey(params.secretKey || SECRET_KEY, () => {\n throw new Error('Secret Key is not valid');\n });\n\n const signInUrl = params.signInUrl || CUSTOM_SIGN_IN_URL;\n const signUpUrl = params.signUpUrl || CUSTOM_SIGN_IN_URL;\n\n const options = {\n ...params,\n publishableKey,\n secretKey,\n signInUrl,\n signUpUrl,\n };\n\n const isIgnoredRoute = createRouteMatcher(\n options.ignoredRoutes || DEFAULT_IGNORED_ROUTES\n );\n const isPublicRoute = createRouteMatcher(\n withDefaultPublicRoutes(options.publicRoutes)\n );\n // const isApiRoute = createApiRoutes(options.apiRoutes);\n // const defaultAfterAuth = createDefaultAfterAuth(\n // isPublicRoute,\n // isApiRoute,\n // options\n // );\n\n return async (_req: NextRequest) => {\n const url = _req.nextUrl;\n\n const accessToken = url.searchParams.get(constants.QueryParams.Token);\n const userId = url.searchParams.get(constants.QueryParams.UserId);\n\n if (accessToken && userId) {\n const path = url.pathname;\n const response = NextResponse.redirect(new URL(path || '/', _req.url));\n response.cookies.set(constants.Cookies.Client, accessToken);\n response.cookies.set(constants.Cookies.User, userId);\n return response;\n }\n\n if (isIgnoredRoute(_req) || isPublicRoute(_req)) {\n return;\n }\n // const nextRequest = _req;\n\n // const beforeAuthRes = await (options.beforeAuth &&\n // options.beforeAuth(nextRequest, evt));\n\n // if (beforeAuthRes === false) {\n // return setHeader(\n // NextResponse.next(),\n // constants.Headers.AuthReason,\n // 'skip'\n // );\n // } else if (beforeAuthRes && isRedirect(beforeAuthRes)) {\n // return setHeader(\n // beforeAuthRes,\n // constants.Headers.AuthReason,\n // 'before-auth-redirect'\n // );\n // }\n\n // const requestState = {\n // token: accessToken,\n // userId,\n // };\n\n // const auth = {\n // ...requestState,\n // isPublicRoute: isPublicRoute(nextRequest),\n // isApiRoute: isApiRoute(nextRequest),\n // };\n\n // const afterAuthRes = await (options.afterAuth || defaultAfterAuth)(\n // auth,\n // nextRequest,\n // evt\n // );\n\n // const finalRes =\n // mergeResponses(beforeAuthRes, afterAuthRes) || NextResponse.next();\n\n // console.log(finalRes);\n\n // if (isRedirect(finalRes)) {\n // const res = serverRedirectWithAuth(finalRes);\n // return res;\n // }\n\n const result = checkAuth(_req);\n\n return result;\n };\n};\n\nconst withDefaultPublicRoutes = (\n publicRoutes: RouteMatcherParam | undefined\n) => {\n if (typeof publicRoutes === 'function') {\n return publicRoutes;\n }\n\n const routes = [publicRoutes || ''].flat().filter(Boolean);\n // TODO: refactor it to use common config file eg SIGN_IN_URL from ./clerkClient\n // we use process.env for now to support testing\n const signInUrl = process.env.NEXT_PUBLIC_CLERK_SIGN_IN_URL || '';\n if (signInUrl) {\n routes.push(matchRoutesStartingWith(signInUrl));\n }\n // TODO: refactor it to use common config file eg SIGN_UP_URL from ./clerkClient\n // we use process.env for now to support testing\n const signUpUrl = process.env.NEXT_PUBLIC_CLERK_SIGN_UP_URL || '';\n if (signUpUrl) {\n routes.push(matchRoutesStartingWith(signUpUrl));\n }\n return routes;\n};\n\nconst matchRoutesStartingWith = (path: string) => {\n path = path.replace(/\\/$/, '');\n return new RegExp(`^${path}(/.*)?$`);\n};\n\nconst isRequestMethodIndicatingApiRoute = (req: NextRequest): boolean => {\n const requestMethod = req.method.toLowerCase();\n return !['get', 'head', 'options'].includes(requestMethod);\n};\n\nconst isRequestContentTypeJson = (req: NextRequest): boolean => {\n const requestContentType = req.headers.get(constants.Headers.ContentType);\n return requestContentType === constants.ContentTypes.Json;\n};\n\n// - Default behavior:\n// If the route path is `['/api/(.*)*', '*/trpc/(.*)']`\n// or Request has `Content-Type: application/json`\n// or Request method is not-GET,OPTIONS,HEAD,\n// then this is considered an API route.\n//\n// - If the user has provided a specific `apiRoutes` prop in `authMiddleware` then all the above are discarded,\n// and only routes that match the user’s provided paths are considered API routes.\nconst createApiRoutes = (\n apiRoutes: RouteMatcherParam | undefined\n): ((req: NextRequest) => boolean) => {\n if (apiRoutes) {\n return createRouteMatcher(apiRoutes);\n }\n const isDefaultApiRoute = createRouteMatcher(DEFAULT_API_ROUTES);\n return (req: NextRequest) =>\n isDefaultApiRoute(req) ||\n isRequestMethodIndicatingApiRoute(req) ||\n isRequestContentTypeJson(req);\n};\n\nexport const createDefaultAfterAuth = (\n isPublicRoute: ReturnType<typeof createRouteMatcher>,\n isApiRoute: ReturnType<typeof createApiRoutes>,\n options: {\n signInUrl: string;\n signUpUrl: string;\n publishableKey: string;\n secretKey: string;\n }\n) => {\n return (auth: any, req: NextRequest) => {\n if (!auth.userId && !isPublicRoute(req)) {\n if (isApiRoute(req)) {\n return apiEndpointUnauthorizedNextResponse();\n }\n return createRedirect({\n redirectAdapter,\n signInUrl: options.signInUrl,\n signUpUrl: options.signUpUrl,\n publishableKey: options.publishableKey,\n // We're setting baseUrl to '' here as we want to keep the legacy behavior of\n // the redirectToSignIn, redirectToSignUp helpers in the backend package.\n baseUrl: '',\n }).redirectToSignIn({ returnBackUrl: req.nextUrl.href });\n }\n return NextResponse.next();\n };\n};\n\nconst checkAuth = (req: NextRequest): any => {\n const accessToken = req.cookies.get(constants.Cookies.Client);\n\n if (!accessToken && req.nextUrl.href !== CUSTOM_SIGN_IN_URL) {\n if (CUSTOM_SIGN_IN_URL) {\n return NextResponse.redirect(new URL(CUSTOM_SIGN_IN_URL));\n }\n\n if (frontendApi) {\n const params = new URLSearchParams({\n redirect_url: CUSTOM_AFTER_SIGN_IN_URL || '/',\n });\n return NextResponse.redirect(\n new URL(`${frontendApi}/sign-in?${params.toString()}`)\n );\n }\n throw new Error(\n 'You are not authentication. Please provide CABIN ID PUBLISH KEY to redirect to authentication page'\n );\n }\n return NextResponse.next();\n};\n\nexport { authMiddleware };\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/server/middleware.ts"],"sourcesContent":["import { NextMiddleware, NextResponse } from 'next/server';\nimport {\n constants,\n PUBLISHABLE_KEY,\n SECRET_KEY,\n SIGN_IN_URL,\n SIGN_UP_URL,\n} from '../constants';\nimport { assertKey, decorateRequest, redirectAdapter } from './utils';\nimport {\n NextMiddlewareEvtParam,\n NextMiddlewareRequestParam,\n NextMiddlewareReturn,\n} from './type';\nimport { cabinIdClient } from './client';\nimport { CabinIdRequest, createCabinIdRequest } from '../tokens/cabinIdRequest';\nimport { AuthProtect, createProtect } from './protect';\nimport { createRedirect, RedirectFun } from './createRedirect';\nimport { isRedirect, setHeader } from '../utils/response';\nimport { RequestState } from '../tokens/authStatus';\nimport { AuthObject } from '../tokens/authObjects';\nimport { serverRedirectWithAuth } from './serverRedirectWithAuth';\nimport { AuthenticateRequestOptions } from '../api/factory';\n\nconst CONTROL_FLOW_ERROR = {\n FORCE_NOT_FOUND: 'CABIN_ID_PROTECT_REWRITE',\n REDIRECT_TO_URL: 'CABIN_ID_PROTECT_REDIRECT_TO_URL',\n REDIRECT_TO_SIGN_IN: 'CABIN_ID_PROTECT_REDIRECT_TO_SIGN_IN',\n};\n\nexport type CabinIdMiddlewareAuthObject = AuthObject & {\n protect: AuthProtect;\n redirectToSignIn: RedirectFun<Response>;\n};\n\nexport type CabinIdMiddlewareAuth = () => CabinIdMiddlewareAuthObject;\n\nexport interface AuthMiddleware {\n /**\n * @example\n * export default clerkMiddleware((auth, request, event) => { ... }, options);\n */\n (\n handler: CabinIdMiddlewareHandler,\n options?: CabinIdMiddlewareOptions\n ): NextMiddleware;\n /**\n * @example\n * export default clerkMiddleware(options);\n */\n (options?: CabinIdMiddlewareOptions): NextMiddleware;\n /**\n * @example\n * export default clerkMiddleware;\n */\n (\n request: NextMiddlewareRequestParam,\n event: NextMiddlewareEvtParam\n ): NextMiddlewareReturn;\n}\n\ntype CabinIdMiddlewareHandler = (\n auth: CabinIdMiddlewareAuth,\n request: NextMiddlewareRequestParam,\n event: NextMiddlewareEvtParam\n) => NextMiddlewareReturn;\n\nexport type CabinIdMiddlewareOptions = AuthenticateRequestOptions;\n\nconst parseRequestAndEvent = (args: unknown[]) => {\n return [\n args[0] instanceof Request ? args[0] : undefined,\n args[0] instanceof Request ? args[1] : undefined,\n ] as [\n NextMiddlewareRequestParam | undefined,\n NextMiddlewareEvtParam | undefined,\n ];\n};\n\nconst parseHandlerAndOptions = (args: unknown[]) => {\n return [\n typeof args[0] === 'function' ? args[0] : undefined,\n (args.length === 2\n ? args[1]\n : typeof args[0] === 'function'\n ? {}\n : args[0]) || {},\n ] as [CabinIdMiddlewareHandler | undefined, CabinIdMiddlewareOptions];\n};\n\nconst authMiddleware: AuthMiddleware = (...args: unknown[]): any => {\n const [request, event] = parseRequestAndEvent(args);\n const [handler, params] = parseHandlerAndOptions(args);\n\n const publishableKey = assertKey(\n params.publishableKey || PUBLISHABLE_KEY,\n () => {\n throw new Error('Publish Key is not exist');\n }\n );\n const secretKey = assertKey(params.secretKey || SECRET_KEY, () => {\n throw new Error('Secret Key is not valid');\n });\n\n const signInUrl = params.signInUrl || SIGN_IN_URL;\n const signUpUrl = params.signUpUrl || SIGN_UP_URL;\n\n const options = {\n ...params,\n publishableKey,\n secretKey,\n signInUrl,\n signUpUrl,\n };\n\n const nextMiddleware: NextMiddleware = async (_request, _event) => {\n const accessToken = _request.nextUrl.searchParams.get(\n constants.QueryParams.Token\n );\n const userId = _request.nextUrl.searchParams.get(\n constants.QueryParams.UserId\n );\n\n if (accessToken && userId) {\n const url = _request.nextUrl;\n const path = url.pathname;\n const response = NextResponse.redirect(\n new URL(path || '/', _request.url)\n );\n response.cookies.set(constants.Cookies.Client, accessToken);\n response.cookies.set(constants.Cookies.User, userId);\n return response;\n }\n\n const cabinIdRequest = createCabinIdRequest(_request);\n\n const requestState = await cabinIdClient.authenticateRequest(\n cabinIdRequest,\n options\n );\n\n const authObject = requestState.toAuth();\n\n const redirectToSignIn = createMiddlewareRedirectToSignIn(cabinIdRequest);\n\n const protect = createMiddlewareProtect(\n cabinIdRequest,\n authObject,\n redirectToSignIn\n );\n\n const authObjWithMethods: CabinIdMiddlewareAuthObject = Object.assign(\n authObject,\n { protect, redirectToSignIn }\n );\n\n let handlerResult: Response = NextResponse.next();\n\n try {\n handlerResult =\n (await handler?.(() => authObjWithMethods, _request, _event)) ||\n handlerResult;\n } catch (e: any) {\n handlerResult = handleControlFlowErrors(e, cabinIdRequest, requestState);\n }\n\n if (isRedirect(handlerResult)) {\n return serverRedirectWithAuth(cabinIdRequest, handlerResult);\n }\n\n decorateRequest(\n cabinIdRequest,\n handlerResult,\n requestState,\n options.secretKey\n );\n\n // TODO @nikos: we need to make this more generic\n // and move the logic in clerk/backend\n if (requestState.headers) {\n requestState.headers.forEach((value, key) => {\n handlerResult.headers.append(key, value);\n });\n }\n\n return handlerResult;\n };\n\n // If we have a request and event, we're being called as a middleware directly\n // eg, export default clerkMiddleware;\n if (request && event) {\n return nextMiddleware(request, event);\n }\n\n // Otherwise, return a middleware that can be called with a request and event\n // eg, export default clerkMiddleware(auth => { ... });\n return nextMiddleware;\n};\n\nexport { authMiddleware };\n\nconst createMiddlewareRedirectToSignIn = (\n cabinIdRequest: CabinIdRequest\n): CabinIdMiddlewareAuthObject['redirectToSignIn'] => {\n return (opts = {}) => {\n const err = new Error(CONTROL_FLOW_ERROR.REDIRECT_TO_SIGN_IN) as any;\n err.returnBackUrl =\n opts.returnBackUrl === null\n ? ''\n : opts.returnBackUrl || cabinIdRequest.cabinIdUrl.toString();\n throw err;\n };\n};\n\nconst createMiddlewareProtect = (\n cabinIdRequest: CabinIdRequest,\n authObject: AuthObject,\n redirectToSignIn: RedirectFun<Response>\n): CabinIdMiddlewareAuthObject['protect'] => {\n return ((_: any, options: any) => {\n const notFound = () => {\n throw new Error(CONTROL_FLOW_ERROR.FORCE_NOT_FOUND) as any;\n };\n\n const redirect = (url: string) => {\n const err = new Error(CONTROL_FLOW_ERROR.REDIRECT_TO_URL) as any;\n err.redirectUrl = url;\n throw err;\n };\n\n return createProtect({\n request: cabinIdRequest,\n redirect,\n notFound,\n authObject,\n redirectToSignIn,\n })(options);\n }) as AuthProtect;\n};\n\n// Handle errors thrown by protect() and redirectToSignIn() calls,\n// as we want to align the APIs between middleware, pages and route handlers\n// Normally, middleware requires to explicitly return a response, but we want to\n// avoid discrepancies between the APIs as it's easy to miss the `return` statement\n// especially when copy-pasting code from one place to another.\n// This function handles the known errors thrown by the APIs described above,\n// and returns the appropriate response.\nconst handleControlFlowErrors = (\n e: any,\n cabinIdRequest: CabinIdRequest,\n requestState: RequestState\n): Response => {\n switch (e.message) {\n case CONTROL_FLOW_ERROR.FORCE_NOT_FOUND:\n // Rewrite to a bogus URL to force not found error\n return setHeader(\n NextResponse.rewrite(\n `${cabinIdRequest.cabinIdUrl.origin}/cabin_${Date.now()}`\n ),\n constants.Headers.AuthReason,\n 'protect-rewrite'\n );\n case CONTROL_FLOW_ERROR.REDIRECT_TO_URL:\n return redirectAdapter(e.redirectUrl);\n case CONTROL_FLOW_ERROR.REDIRECT_TO_SIGN_IN:\n return createRedirect({\n redirectAdapter,\n baseUrl: cabinIdRequest.cabinIdUrl,\n signInUrl: requestState.signInUrl,\n signUpUrl: requestState.signUpUrl,\n publishableKey: requestState.publishableKey,\n }).redirectToSignIn({ returnBackUrl: e.returnBackUrl });\n default:\n throw e;\n }\n};\n"],"mappings":"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","names":[]}
@@ -0,0 +1,45 @@
1
+ import { constants } from "../constants";
2
+ const createProtect = (opts) => {
3
+ const { redirectToSignIn, authObject, redirect, notFound, request } = opts;
4
+ return (...args) => {
5
+ var _a, _b, _c, _d, _e, _f;
6
+ const optionValuesAsParam = ((_a = args[0]) == null ? void 0 : _a.unauthenticatedUrl) || ((_b = args[0]) == null ? void 0 : _b.unauthorizedUrl);
7
+ const paramsOrFunction = optionValuesAsParam ? void 0 : args[0];
8
+ const unauthenticatedUrl = ((_c = args[0]) == null ? void 0 : _c.unauthenticatedUrl) || ((_d = args[1]) == null ? void 0 : _d.unauthenticatedUrl);
9
+ const unauthorizedUrl = ((_e = args[0]) == null ? void 0 : _e.unauthorizedUrl) || ((_f = args[1]) == null ? void 0 : _f.unauthorizedUrl);
10
+ const handleUnauthenticated = () => {
11
+ if (unauthenticatedUrl) {
12
+ return redirect(unauthenticatedUrl);
13
+ }
14
+ if (isPageRequest(request)) {
15
+ return redirectToSignIn();
16
+ }
17
+ return notFound();
18
+ };
19
+ const handleUnauthorized = () => {
20
+ if (unauthorizedUrl) {
21
+ return redirect(unauthorizedUrl);
22
+ }
23
+ return notFound();
24
+ };
25
+ if (!authObject.userId) {
26
+ return handleUnauthenticated();
27
+ }
28
+ if (!paramsOrFunction) {
29
+ return authObject;
30
+ }
31
+ return handleUnauthorized();
32
+ };
33
+ };
34
+ const isServerActionRequest = (req) => {
35
+ var _a, _b;
36
+ return !!req.headers.get(constants.NextHeaders.NextUrl) && (((_a = req.headers.get(constants.Headers.Accept)) == null ? void 0 : _a.includes("text/x-component")) || ((_b = req.headers.get(constants.Headers.ContentType)) == null ? void 0 : _b.includes("multipart/form-data")) || !!req.headers.get(constants.NextHeaders.NextAction));
37
+ };
38
+ const isPageRequest = (req) => {
39
+ var _a;
40
+ return req.headers.get(constants.Headers.SecFetchDest) === "document" || ((_a = req.headers.get(constants.Headers.Accept)) == null ? void 0 : _a.includes("text/html")) || !!req.headers.get(constants.NextHeaders.NextUrl) && !isServerActionRequest(req) || !!req.headers.get(constants.NextHeaders.NextjsData);
41
+ };
42
+ export {
43
+ createProtect
44
+ };
45
+ //# sourceMappingURL=protect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/server/protect.ts"],"sourcesContent":["import { AuthObject, SignedInAuthObject } from '../tokens/authObjects';\nimport { constants } from '../constants';\nimport { RedirectFun } from './createRedirect';\n\ntype AuthProtectOptions = {\n unauthorizedUrl?: string;\n unauthenticatedUrl?: string;\n};\n\n/**\n * Throws a Nextjs notFound error if user is not authenticated or authorized.\n */\nexport interface AuthProtect {\n // (\n // params?: CheckAuthorizationParamsWithCustomPermissions,\n // options?: AuthProtectOptions\n // ): SignedInAuthObject;\n\n // (\n // params?: (has: CheckAuthorizationWithCustomPermissions) => boolean,\n // options?: AuthProtectOptions\n // ): SignedInAuthObject;\n\n (options?: AuthProtectOptions): SignedInAuthObject;\n}\n\nexport const createProtect = (opts: {\n request: Request;\n authObject: AuthObject;\n /**\n * middleware and pages throw a notFound error if signed out\n * but the middleware needs to throw an error it can catch\n * use this callback to customise the behavior\n */\n notFound: () => never;\n /**\n * see {@link notFound} above\n */\n redirect: (url: string) => void;\n /**\n * protect() in middleware redirects to signInUrl if signed out\n * protect() in pages throws a notFound error if signed out\n * use this callback to customise the behavior\n */\n redirectToSignIn: RedirectFun<unknown>;\n}): AuthProtect => {\n const { redirectToSignIn, authObject, redirect, notFound, request } = opts;\n\n return ((...args: any[]) => {\n const optionValuesAsParam =\n args[0]?.unauthenticatedUrl || args[0]?.unauthorizedUrl;\n const paramsOrFunction = optionValuesAsParam ? undefined : args[0];\n const unauthenticatedUrl = (args[0]?.unauthenticatedUrl ||\n args[1]?.unauthenticatedUrl) as string | undefined;\n const unauthorizedUrl = (args[0]?.unauthorizedUrl ||\n args[1]?.unauthorizedUrl) as string | undefined;\n\n const handleUnauthenticated = () => {\n if (unauthenticatedUrl) {\n return redirect(unauthenticatedUrl);\n }\n if (isPageRequest(request)) {\n // TODO: Handle runtime values. What happens if runtime values are set in middleware and in ClerkProvider as well?\n return redirectToSignIn();\n }\n return notFound();\n };\n\n const handleUnauthorized = () => {\n if (unauthorizedUrl) {\n return redirect(unauthorizedUrl);\n }\n return notFound();\n };\n\n /**\n * User is not authenticated\n */\n if (!authObject.userId) {\n return handleUnauthenticated();\n }\n\n /**\n * User is authenticated\n */\n if (!paramsOrFunction) {\n return authObject;\n }\n\n /**\n * if a function is passed and returns false then throw not found\n */\n // if (typeof paramsOrFunction === 'function') {\n // if (paramsOrFunction(authObject.has)) {\n // return authObject;\n // }\n // return handleUnauthorized();\n // }\n\n /**\n * Checking if user is authorized when permission or role is passed\n */\n // if (authObject.has(paramsOrFunction)) {\n // return authObject;\n // }\n\n return handleUnauthorized();\n }) as AuthProtect;\n};\n\nconst isServerActionRequest = (req: Request) => {\n return (\n !!req.headers.get(constants.NextHeaders.NextUrl) &&\n (req.headers.get(constants.Headers.Accept)?.includes('text/x-component') ||\n req.headers\n .get(constants.Headers.ContentType)\n ?.includes('multipart/form-data') ||\n !!req.headers.get(constants.NextHeaders.NextAction))\n );\n};\n\nconst isPageRequest = (req: Request): boolean => {\n return (\n req.headers.get(constants.Headers.SecFetchDest) === 'document' ||\n req.headers.get(constants.Headers.Accept)?.includes('text/html') ||\n (!!req.headers.get(constants.NextHeaders.NextUrl) &&\n !isServerActionRequest(req)) ||\n !!req.headers.get(constants.NextHeaders.NextjsData)\n );\n};\n\n// In case we want to handle router handlers and server actions differently in the future\n// const isRouteHandler = (req: Request) => {\n// return !isPageRequest(req) && !isServerAction(req);\n// };\n"],"mappings":"AACA,SAAS,iBAAiB;AAyBnB,MAAM,gBAAgB,CAAC,SAmBX;AACjB,QAAM,EAAE,kBAAkB,YAAY,UAAU,UAAU,QAAQ,IAAI;AAEtE,SAAQ,IAAI,SAAgB;AAhD9B;AAiDI,UAAM,wBACJ,UAAK,CAAC,MAAN,mBAAS,yBAAsB,UAAK,CAAC,MAAN,mBAAS;AAC1C,UAAM,mBAAmB,sBAAsB,SAAY,KAAK,CAAC;AACjE,UAAM,uBAAsB,UAAK,CAAC,MAAN,mBAAS,yBACnC,UAAK,CAAC,MAAN,mBAAS;AACX,UAAM,oBAAmB,UAAK,CAAC,MAAN,mBAAS,sBAChC,UAAK,CAAC,MAAN,mBAAS;AAEX,UAAM,wBAAwB,MAAM;AAClC,UAAI,oBAAoB;AACtB,eAAO,SAAS,kBAAkB;AAAA,MACpC;AACA,UAAI,cAAc,OAAO,GAAG;AAE1B,eAAO,iBAAiB;AAAA,MAC1B;AACA,aAAO,SAAS;AAAA,IAClB;AAEA,UAAM,qBAAqB,MAAM;AAC/B,UAAI,iBAAiB;AACnB,eAAO,SAAS,eAAe;AAAA,MACjC;AACA,aAAO,SAAS;AAAA,IAClB;AAKA,QAAI,CAAC,WAAW,QAAQ;AACtB,aAAO,sBAAsB;AAAA,IAC/B;AAKA,QAAI,CAAC,kBAAkB;AACrB,aAAO;AAAA,IACT;AAmBA,WAAO,mBAAmB;AAAA,EAC5B;AACF;AAEA,MAAM,wBAAwB,CAAC,QAAiB;AA9GhD;AA+GE,SACE,CAAC,CAAC,IAAI,QAAQ,IAAI,UAAU,YAAY,OAAO,QAC9C,SAAI,QAAQ,IAAI,UAAU,QAAQ,MAAM,MAAxC,mBAA2C,SAAS,0BACnD,SAAI,QACD,IAAI,UAAU,QAAQ,WAAW,MADpC,mBAEI,SAAS,2BACb,CAAC,CAAC,IAAI,QAAQ,IAAI,UAAU,YAAY,UAAU;AAExD;AAEA,MAAM,gBAAgB,CAAC,QAA0B;AAzHjD;AA0HE,SACE,IAAI,QAAQ,IAAI,UAAU,QAAQ,YAAY,MAAM,gBACpD,SAAI,QAAQ,IAAI,UAAU,QAAQ,MAAM,MAAxC,mBAA2C,SAAS,iBACnD,CAAC,CAAC,IAAI,QAAQ,IAAI,UAAU,YAAY,OAAO,KAC9C,CAAC,sBAAsB,GAAG,KAC5B,CAAC,CAAC,IAAI,QAAQ,IAAI,UAAU,YAAY,UAAU;AAEtD;","names":[]}
@@ -5,6 +5,7 @@ const createRouteMatcher = (routes) => {
5
5
  }
6
6
  const routePatterns = [routes || ""].flat().filter(Boolean);
7
7
  const matchers = precomputePathRegex(routePatterns);
8
+ console.log(matchers);
8
9
  return (req) => matchers.some((matcher) => matcher.test(req.nextUrl.pathname));
9
10
  };
10
11
  const precomputePathRegex = (patterns) => {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/server/routeMatcher.ts"],"sourcesContent":["import type Link from \"next/link\";\nimport type { NextRequest } from \"next/server\";\nimport type { Autocomplete } from \"../types\";\nimport { paths } from \"../utils\";\n\ntype WithPathPatternWildcard<T> = `${T & string}(.*)`;\ntype NextTypedRoute<T = Parameters<typeof Link>[\"0\"][\"href\"]> = T extends string\n ? T\n : never;\n\ntype RouteMatcherWithNextTypedRoutes = Autocomplete<\n WithPathPatternWildcard<NextTypedRoute> | NextTypedRoute\n>;\n\nexport type RouteMatcherParam =\n | Array<RegExp | RouteMatcherWithNextTypedRoutes>\n | RegExp\n | RouteMatcherWithNextTypedRoutes\n | ((req: NextRequest) => boolean);\n\nexport const createRouteMatcher = (routes: RouteMatcherParam) => {\n if (typeof routes === \"function\") {\n return (req: NextRequest) => routes(req);\n }\n\n const routePatterns = [routes || \"\"].flat().filter(Boolean);\n const matchers = precomputePathRegex(routePatterns);\n return (req: NextRequest) =>\n matchers.some((matcher) => matcher.test(req.nextUrl.pathname));\n};\n\nconst precomputePathRegex = (patterns: Array<string | RegExp>) => {\n return patterns.map((pattern) =>\n pattern instanceof RegExp ? pattern : paths.toRegexp(pattern),\n );\n};\n"],"mappings":"AAGA,SAAS,aAAa;AAiBf,MAAM,qBAAqB,CAAC,WAA8B;AAC/D,MAAI,OAAO,WAAW,YAAY;AAChC,WAAO,CAAC,QAAqB,OAAO,GAAG;AAAA,EACzC;AAEA,QAAM,gBAAgB,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,OAAO,OAAO;AAC1D,QAAM,WAAW,oBAAoB,aAAa;AAClD,SAAO,CAAC,QACN,SAAS,KAAK,CAAC,YAAY,QAAQ,KAAK,IAAI,QAAQ,QAAQ,CAAC;AACjE;AAEA,MAAM,sBAAsB,CAAC,aAAqC;AAChE,SAAO,SAAS;AAAA,IAAI,CAAC,YACnB,mBAAmB,SAAS,UAAU,MAAM,SAAS,OAAO;AAAA,EAC9D;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../src/server/routeMatcher.ts"],"sourcesContent":["import type Link from 'next/link';\nimport type { NextRequest } from 'next/server';\nimport type { Autocomplete } from '../types';\nimport { paths } from '../utils';\n\ntype WithPathPatternWildcard<T> = `${T & string}(.*)`;\ntype NextTypedRoute<T = Parameters<typeof Link>['0']['href']> = T extends string\n ? T\n : never;\n\ntype RouteMatcherWithNextTypedRoutes = Autocomplete<\n WithPathPatternWildcard<NextTypedRoute> | NextTypedRoute\n>;\n\nexport type RouteMatcherParam =\n | Array<RegExp | RouteMatcherWithNextTypedRoutes>\n | RegExp\n | RouteMatcherWithNextTypedRoutes\n | ((req: NextRequest) => boolean);\n\nexport const createRouteMatcher = (routes: RouteMatcherParam) => {\n if (typeof routes === 'function') {\n return (req: NextRequest) => routes(req);\n }\n const routePatterns = [routes || ''].flat().filter(Boolean);\n const matchers = precomputePathRegex(routePatterns);\n console.log(matchers);\n return (req: NextRequest) =>\n matchers.some((matcher) => matcher.test(req.nextUrl.pathname));\n};\n\nconst precomputePathRegex = (patterns: Array<string | RegExp>) => {\n return patterns.map((pattern) =>\n pattern instanceof RegExp ? pattern : paths.toRegexp(pattern)\n );\n};\n"],"mappings":"AAGA,SAAS,aAAa;AAiBf,MAAM,qBAAqB,CAAC,WAA8B;AAC/D,MAAI,OAAO,WAAW,YAAY;AAChC,WAAO,CAAC,QAAqB,OAAO,GAAG;AAAA,EACzC;AACA,QAAM,gBAAgB,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,OAAO,OAAO;AAC1D,QAAM,WAAW,oBAAoB,aAAa;AAClD,UAAQ,IAAI,QAAQ;AACpB,SAAO,CAAC,QACN,SAAS,KAAK,CAAC,YAAY,QAAQ,KAAK,IAAI,QAAQ,QAAQ,CAAC;AACjE;AAEA,MAAM,sBAAsB,CAAC,aAAqC;AAChE,SAAO,SAAS;AAAA,IAAI,CAAC,YACnB,mBAAmB,SAAS,UAAU,MAAM,SAAS,OAAO;AAAA,EAC9D;AACF;","names":[]}
@@ -1,9 +1,9 @@
1
1
  import { NextResponse } from "next/server";
2
2
  import { constants } from "../constants";
3
- const serverRedirectWithAuth = (res) => {
3
+ const serverRedirectWithAuth = (cabinIdRequest, res) => {
4
4
  const location = res.headers.get("location");
5
5
  const shouldAppendDevBrowser = res.headers.get(constants.Headers.CabinIdRedirectTo) === "true";
6
- if (shouldAppendDevBrowser && !!location) {
6
+ if (shouldAppendDevBrowser && !!location && cabinIdRequest.cabinIdUrl.isCrossOrigin(location)) {
7
7
  const url = new URL(location);
8
8
  return NextResponse.redirect(url.href, res);
9
9
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/server/serverRedirectWithAuth.ts"],"sourcesContent":["import { NextResponse } from 'next/server';\nimport { constants } from '../constants';\n\nexport const serverRedirectWithAuth = (res: Response) => {\n const location = res.headers.get('location');\n const shouldAppendDevBrowser =\n res.headers.get(constants.Headers.CabinIdRedirectTo) === 'true';\n if (shouldAppendDevBrowser && !!location) {\n // Next.js 12.1+ allows redirects only to absolute URLs\n const url = new URL(location);\n return NextResponse.redirect(url.href, res);\n }\n return res;\n};\n"],"mappings":"AAAA,SAAS,oBAAoB;AAC7B,SAAS,iBAAiB;AAEnB,MAAM,yBAAyB,CAAC,QAAkB;AACvD,QAAM,WAAW,IAAI,QAAQ,IAAI,UAAU;AAC3C,QAAM,yBACJ,IAAI,QAAQ,IAAI,UAAU,QAAQ,iBAAiB,MAAM;AAC3D,MAAI,0BAA0B,CAAC,CAAC,UAAU;AAExC,UAAM,MAAM,IAAI,IAAI,QAAQ;AAC5B,WAAO,aAAa,SAAS,IAAI,MAAM,GAAG;AAAA,EAC5C;AACA,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../../src/server/serverRedirectWithAuth.ts"],"sourcesContent":["import { NextResponse } from 'next/server';\nimport { constants } from '../constants';\nimport { CabinIdRequest } from 'src/tokens/cabinIdRequest';\n\nexport const serverRedirectWithAuth = (\n cabinIdRequest: CabinIdRequest,\n res: Response\n) => {\n const location = res.headers.get('location');\n const shouldAppendDevBrowser =\n res.headers.get(constants.Headers.CabinIdRedirectTo) === 'true';\n\n if (\n shouldAppendDevBrowser &&\n !!location &&\n cabinIdRequest.cabinIdUrl.isCrossOrigin(location)\n ) {\n const url = new URL(location);\n return NextResponse.redirect(url.href, res);\n }\n return res;\n};\n"],"mappings":"AAAA,SAAS,oBAAoB;AAC7B,SAAS,iBAAiB;AAGnB,MAAM,yBAAyB,CACpC,gBACA,QACG;AACH,QAAM,WAAW,IAAI,QAAQ,IAAI,UAAU;AAC3C,QAAM,yBACJ,IAAI,QAAQ,IAAI,UAAU,QAAQ,iBAAiB,MAAM;AAE3D,MACE,0BACA,CAAC,CAAC,YACF,eAAe,WAAW,cAAc,QAAQ,GAChD;AACA,UAAM,MAAM,IAAI,IAAI,QAAQ;AAC5B,WAAO,aAAa,SAAS,IAAI,MAAM,GAAG;AAAA,EAC5C;AACA,SAAO;AACT;","names":[]}
@@ -1,4 +1,4 @@
1
- import { NextResponse } from "next/server";
1
+ import { NextResponse, NextRequest } from "next/server";
2
2
  import { constants } from "../constants";
3
3
  function assertKey(key, onError) {
4
4
  if (!key) {
@@ -69,10 +69,63 @@ function decorateRequest(req, res, requestState, secretKey) {
69
69
  }
70
70
  return res;
71
71
  }
72
+ const buildRequestLike = () => {
73
+ try {
74
+ const { headers } = require("next/headers");
75
+ return new NextRequest("https://placeholder.com", { headers: headers() });
76
+ } catch (e) {
77
+ if (e && "message" in e && typeof e.message === "string" && (e.message.toLowerCase().includes("Dynamic server usage".toLowerCase()) || e.message.toLowerCase().includes(
78
+ "This page needs to bail out of prerendering".toLowerCase()
79
+ ))) {
80
+ throw e;
81
+ }
82
+ throw new Error(
83
+ `CabinID: auth() and currentUser() are only supported in App Router (/app directory).
84
+ If you're using /pages, try getAuth() instead.
85
+ Original error: ${e}`
86
+ );
87
+ }
88
+ };
89
+ function getCustomAttributeFromRequest(req, key) {
90
+ return key in req ? req[key] : void 0;
91
+ }
92
+ function getAuthKeyFromRequest(req, key) {
93
+ return getCustomAttributeFromRequest(req, constants.Attributes[key]) || getHeader(req, constants.Headers[key]);
94
+ }
95
+ function getHeader(req, name) {
96
+ var _a, _b;
97
+ if (isNextRequest(req)) {
98
+ return req.headers.get(name);
99
+ }
100
+ return req.headers[name] || req.headers[name.toLowerCase()] || ((_b = (_a = req.socket) == null ? void 0 : _a._httpMessage) == null ? void 0 : _b.getHeader(name));
101
+ }
102
+ function isNextRequest(val) {
103
+ try {
104
+ const { headers, nextUrl, cookies } = val || {};
105
+ return typeof (headers == null ? void 0 : headers.get) === "function" && typeof (nextUrl == null ? void 0 : nextUrl.searchParams.get) === "function" && typeof (cookies == null ? void 0 : cookies.get) === "function";
106
+ } catch (e) {
107
+ return false;
108
+ }
109
+ }
110
+ function getCookie(req, name) {
111
+ if (isNextRequest(req)) {
112
+ const reqCookieOrString = req.cookies.get(name);
113
+ if (!reqCookieOrString) {
114
+ return void 0;
115
+ }
116
+ return typeof reqCookieOrString === "string" ? reqCookieOrString : reqCookieOrString.value;
117
+ }
118
+ return req.cookies[name];
119
+ }
72
120
  export {
73
121
  apiEndpointUnauthorizedNextResponse,
74
122
  assertKey,
123
+ buildRequestLike,
75
124
  decorateRequest,
125
+ getAuthKeyFromRequest,
126
+ getCookie,
127
+ getCustomAttributeFromRequest,
128
+ getHeader,
76
129
  redirectAdapter,
77
130
  setRequestHeadersOnNextResponse
78
131
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/server/utils.ts"],"sourcesContent":["import { NextResponse } from 'next/server';\nimport type { NextRequest } from 'next/server';\nimport { constants } from '../constants';\n\nexport function assertKey(key: string, onError: () => never): string {\n if (!key) {\n onError();\n }\n\n return key;\n}\n\nexport const apiEndpointUnauthorizedNextResponse = () => {\n return NextResponse.json(null, { status: 401, statusText: 'Unauthorized' });\n};\n\nexport const redirectAdapter = (url: string | URL) => {\n return NextResponse.redirect(url, {\n headers: { [constants.Headers.CabinIdRedirectTo]: 'true' },\n });\n};\n\nconst OVERRIDE_HEADERS = 'x-middleware-override-headers';\nconst MIDDLEWARE_HEADER_PREFIX = 'x-middleware-request' as string;\n\nexport const setRequestHeadersOnNextResponse = (\n res: NextResponse | Response,\n req: Request,\n newHeaders: Record<string, string>\n) => {\n if (!res.headers.get(OVERRIDE_HEADERS)) {\n // Emulate a user setting overrides by explicitly adding the required nextjs headers\n // https://github.com/vercel/next.js/pull/41380\n // @ts-expect-error\n res.headers.set(OVERRIDE_HEADERS, [...req.headers.keys()]);\n req.headers.forEach((val, key) => {\n res.headers.set(`${MIDDLEWARE_HEADER_PREFIX}-${key}`, val);\n });\n }\n\n // Now that we have normalised res to include overrides, just append the new header\n Object.entries(newHeaders).forEach(([key, val]) => {\n res.headers.set(\n OVERRIDE_HEADERS,\n `${res.headers.get(OVERRIDE_HEADERS)},${key}`\n );\n res.headers.set(`${MIDDLEWARE_HEADER_PREFIX}-${key}`, val);\n });\n};\n\n/**\n * Compute a cryptographic signature from a session token and provided secret key. Used to validate that the token has not been modified when transferring between middleware and the Next.js origin.\n */\nfunction createTokenSignature(token: string, key: string): string {\n return `${token}${key}`;\n}\n\ntype RequestState = any;\n\n// Auth result will be set as both a query param & header when applicable\nexport function decorateRequest(\n req: NextRequest,\n res: Response,\n requestState: RequestState,\n secretKey: string\n): Response {\n const { token } = requestState;\n // pass-through case, convert to next()\n if (!res) {\n res = NextResponse.next();\n }\n\n // redirect() case, return early\n if (res.headers.get(constants.NextHeaders.NextRedirect)) {\n return res;\n }\n\n let rewriteURL;\n\n // next() case, convert to a rewrite\n if (res.headers.get(constants.NextHeaders.NextResume) === '1') {\n res.headers.delete(constants.NextHeaders.NextResume);\n rewriteURL = new URL(req.url);\n }\n\n // rewrite() case, set auth result only if origin remains the same\n const rewriteURLHeader = res.headers.get(constants.NextHeaders.NextRewrite);\n\n if (rewriteURLHeader) {\n const reqURL = new URL(req.url);\n rewriteURL = new URL(rewriteURLHeader);\n\n // if the origin has changed, return early\n if (rewriteURL.origin !== reqURL.origin) {\n return res;\n }\n }\n\n if (rewriteURL) {\n setRequestHeadersOnNextResponse(res, req, {\n [constants.Headers.AuthToken]: token || '',\n [constants.Headers.AuthSignature]: token\n ? createTokenSignature(token, secretKey)\n : '',\n });\n const origin = rewriteURL?.origin;\n const pathName = rewriteURL?.pathname;\n\n res.headers.set(\n constants.NextHeaders.NextRewrite,\n `${origin}${pathName || ''}`\n );\n }\n return res;\n}\n"],"mappings":"AAAA,SAAS,oBAAoB;AAE7B,SAAS,iBAAiB;AAEnB,SAAS,UAAU,KAAa,SAA8B;AACnE,MAAI,CAAC,KAAK;AACR,YAAQ;AAAA,EACV;AAEA,SAAO;AACT;AAEO,MAAM,sCAAsC,MAAM;AACvD,SAAO,aAAa,KAAK,MAAM,EAAE,QAAQ,KAAK,YAAY,eAAe,CAAC;AAC5E;AAEO,MAAM,kBAAkB,CAAC,QAAsB;AACpD,SAAO,aAAa,SAAS,KAAK;AAAA,IAChC,SAAS,EAAE,CAAC,UAAU,QAAQ,iBAAiB,GAAG,OAAO;AAAA,EAC3D,CAAC;AACH;AAEA,MAAM,mBAAmB;AACzB,MAAM,2BAA2B;AAE1B,MAAM,kCAAkC,CAC7C,KACA,KACA,eACG;AACH,MAAI,CAAC,IAAI,QAAQ,IAAI,gBAAgB,GAAG;AAItC,QAAI,QAAQ,IAAI,kBAAkB,CAAC,GAAG,IAAI,QAAQ,KAAK,CAAC,CAAC;AACzD,QAAI,QAAQ,QAAQ,CAAC,KAAK,QAAQ;AAChC,UAAI,QAAQ,IAAI,GAAG,wBAAwB,IAAI,GAAG,IAAI,GAAG;AAAA,IAC3D,CAAC;AAAA,EACH;AAGA,SAAO,QAAQ,UAAU,EAAE,QAAQ,CAAC,CAAC,KAAK,GAAG,MAAM;AACjD,QAAI,QAAQ;AAAA,MACV;AAAA,MACA,GAAG,IAAI,QAAQ,IAAI,gBAAgB,CAAC,IAAI,GAAG;AAAA,IAC7C;AACA,QAAI,QAAQ,IAAI,GAAG,wBAAwB,IAAI,GAAG,IAAI,GAAG;AAAA,EAC3D,CAAC;AACH;AAKA,SAAS,qBAAqB,OAAe,KAAqB;AAChE,SAAO,GAAG,KAAK,GAAG,GAAG;AACvB;AAKO,SAAS,gBACd,KACA,KACA,cACA,WACU;AACV,QAAM,EAAE,MAAM,IAAI;AAElB,MAAI,CAAC,KAAK;AACR,UAAM,aAAa,KAAK;AAAA,EAC1B;AAGA,MAAI,IAAI,QAAQ,IAAI,UAAU,YAAY,YAAY,GAAG;AACvD,WAAO;AAAA,EACT;AAEA,MAAI;AAGJ,MAAI,IAAI,QAAQ,IAAI,UAAU,YAAY,UAAU,MAAM,KAAK;AAC7D,QAAI,QAAQ,OAAO,UAAU,YAAY,UAAU;AACnD,iBAAa,IAAI,IAAI,IAAI,GAAG;AAAA,EAC9B;AAGA,QAAM,mBAAmB,IAAI,QAAQ,IAAI,UAAU,YAAY,WAAW;AAE1E,MAAI,kBAAkB;AACpB,UAAM,SAAS,IAAI,IAAI,IAAI,GAAG;AAC9B,iBAAa,IAAI,IAAI,gBAAgB;AAGrC,QAAI,WAAW,WAAW,OAAO,QAAQ;AACvC,aAAO;AAAA,IACT;AAAA,EACF;AAEA,MAAI,YAAY;AACd,oCAAgC,KAAK,KAAK;AAAA,MACxC,CAAC,UAAU,QAAQ,SAAS,GAAG,SAAS;AAAA,MACxC,CAAC,UAAU,QAAQ,aAAa,GAAG,QAC/B,qBAAqB,OAAO,SAAS,IACrC;AAAA,IACN,CAAC;AACD,UAAM,SAAS,yCAAY;AAC3B,UAAM,WAAW,yCAAY;AAE7B,QAAI,QAAQ;AAAA,MACV,UAAU,YAAY;AAAA,MACtB,GAAG,MAAM,GAAG,YAAY,EAAE;AAAA,IAC5B;AAAA,EACF;AACA,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../../src/server/utils.ts"],"sourcesContent":["import { NextResponse, NextRequest } from 'next/server';\nimport { constants } from '../constants';\nimport { CabinIdRequest } from '../tokens/cabinIdRequest';\nimport { RequestLike } from './type';\n\nexport function assertKey(key: string, onError: () => never): string {\n if (!key) {\n onError();\n }\n\n return key;\n}\n\nexport const apiEndpointUnauthorizedNextResponse = () => {\n return NextResponse.json(null, { status: 401, statusText: 'Unauthorized' });\n};\n\nexport const redirectAdapter = (url: string | URL) => {\n return NextResponse.redirect(url, {\n headers: { [constants.Headers.CabinIdRedirectTo]: 'true' },\n });\n};\n\nconst OVERRIDE_HEADERS = 'x-middleware-override-headers';\nconst MIDDLEWARE_HEADER_PREFIX = 'x-middleware-request' as string;\n\nexport const setRequestHeadersOnNextResponse = (\n res: NextResponse | Response,\n req: Request,\n newHeaders: Record<string, string>\n) => {\n if (!res.headers.get(OVERRIDE_HEADERS)) {\n // Emulate a user setting overrides by explicitly adding the required nextjs headers\n // https://github.com/vercel/next.js/pull/41380\n // @ts-expect-error\n res.headers.set(OVERRIDE_HEADERS, [...req.headers.keys()]);\n req.headers.forEach((val, key) => {\n res.headers.set(`${MIDDLEWARE_HEADER_PREFIX}-${key}`, val);\n });\n }\n\n // Now that we have normalised res to include overrides, just append the new header\n Object.entries(newHeaders).forEach(([key, val]) => {\n res.headers.set(\n OVERRIDE_HEADERS,\n `${res.headers.get(OVERRIDE_HEADERS)},${key}`\n );\n res.headers.set(`${MIDDLEWARE_HEADER_PREFIX}-${key}`, val);\n });\n};\n\n/**\n * Compute a cryptographic signature from a session token and provided secret key. Used to validate that the token has not been modified when transferring between middleware and the Next.js origin.\n */\nfunction createTokenSignature(token: string, key: string): string {\n return `${token}${key}`;\n}\n\ntype RequestState = any;\n\n// Auth result will be set as both a query param & header when applicable\nexport function decorateRequest(\n req: CabinIdRequest,\n res: Response,\n requestState: RequestState,\n secretKey: string\n): Response {\n const { token } = requestState;\n\n // pass-through case, convert to next()\n if (!res) {\n res = NextResponse.next();\n }\n\n // redirect() case, return early\n if (res.headers.get(constants.NextHeaders.NextRedirect)) {\n return res;\n }\n\n let rewriteURL;\n\n // next() case, convert to a rewrite\n if (res.headers.get(constants.NextHeaders.NextResume) === '1') {\n res.headers.delete(constants.NextHeaders.NextResume);\n rewriteURL = new URL(req.url);\n }\n\n // rewrite() case, set auth result only if origin remains the same\n const rewriteURLHeader = res.headers.get(constants.NextHeaders.NextRewrite);\n\n if (rewriteURLHeader) {\n const reqURL = new URL(req.url);\n rewriteURL = new URL(rewriteURLHeader);\n\n // if the origin has changed, return early\n if (rewriteURL.origin !== reqURL.origin) {\n return res;\n }\n }\n\n if (rewriteURL) {\n setRequestHeadersOnNextResponse(res, req, {\n [constants.Headers.AuthToken]: token || '',\n [constants.Headers.AuthSignature]: token\n ? createTokenSignature(token, secretKey)\n : '',\n });\n const origin = rewriteURL?.origin;\n const pathName = rewriteURL?.pathname;\n\n res.headers.set(\n constants.NextHeaders.NextRewrite,\n `${origin}${pathName || ''}`\n );\n }\n return res;\n}\n\nexport const buildRequestLike = () => {\n try {\n // Dynamically import next/headers, otherwise Next12 apps will break\n // because next/headers was introduced in next@13\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const { headers } = require('next/headers');\n return new NextRequest('https://placeholder.com', { headers: headers() });\n } catch (e: any) {\n if (\n e &&\n 'message' in e &&\n typeof e.message === 'string' &&\n (e.message.toLowerCase().includes('Dynamic server usage'.toLowerCase()) ||\n e.message\n .toLowerCase()\n .includes(\n 'This page needs to bail out of prerendering'.toLowerCase()\n ))\n ) {\n throw e;\n }\n\n throw new Error(\n `CabinID: auth() and currentUser() are only supported in App Router (/app directory).\\nIf you're using /pages, try getAuth() instead.\\nOriginal error: ${e}`\n );\n }\n};\n\nexport function getCustomAttributeFromRequest(\n req: RequestLike,\n key: string\n): string | null | undefined {\n // @ts-expect-error - TS doesn't like indexing into RequestLike\n return key in req ? req[key] : undefined;\n}\n\nexport function getAuthKeyFromRequest(\n req: RequestLike,\n key: keyof typeof constants.Attributes\n): string | null | undefined {\n return (\n getCustomAttributeFromRequest(req, constants.Attributes[key]) ||\n getHeader(req, constants.Headers[key])\n );\n}\n\nexport function getHeader(\n req: RequestLike,\n name: string\n): string | null | undefined {\n if (isNextRequest(req)) {\n return req.headers.get(name);\n }\n\n // If no header has been determined for IncomingMessage case, check if available within private `socket` headers\n // When deployed to vercel, req.headers for API routes is a `IncomingHttpHeaders` key-val object which does not follow\n // the Headers spec so the name is no longer case-insensitive.\n return (\n req.headers[name] ||\n req.headers[name.toLowerCase()] ||\n (req.socket as any)?._httpMessage?.getHeader(name)\n );\n}\n\nfunction isNextRequest(val: unknown): val is NextRequest {\n try {\n const { headers, nextUrl, cookies } = (val || {}) as NextRequest;\n return (\n typeof headers?.get === 'function' &&\n typeof nextUrl?.searchParams.get === 'function' &&\n typeof cookies?.get === 'function'\n );\n } catch (e) {\n return false;\n }\n}\n\nexport function getCookie(req: RequestLike, name: string): string | undefined {\n if (isNextRequest(req)) {\n // Nextjs broke semver in the 13.0.0 -> 13.0.1 release, so even though\n // this should be RequestCookie in all updated apps. In order to support apps\n // using v13.0.0 still, we explicitly add the string type\n // https://github.com/vercel/next.js/pull/41526\n const reqCookieOrString = req.cookies.get(name) as\n | ReturnType<NextRequest['cookies']['get']>\n | string\n | undefined;\n if (!reqCookieOrString) {\n return undefined;\n }\n return typeof reqCookieOrString === 'string'\n ? reqCookieOrString\n : reqCookieOrString.value;\n }\n return req.cookies[name];\n}\n"],"mappings":"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","names":[]}
@@ -331,8 +331,36 @@ video {
331
331
  --tw-contain-paint: ;
332
332
  --tw-contain-style: ;
333
333
  }
334
- .static {
335
- position: static;
334
+ .container {
335
+ width: 100%;
336
+ }
337
+ @media (min-width: 640px) {
338
+ .container {
339
+ max-width: 640px;
340
+ }
341
+ }
342
+ @media (min-width: 768px) {
343
+ .container {
344
+ max-width: 768px;
345
+ }
346
+ }
347
+ @media (min-width: 1024px) {
348
+ .container {
349
+ max-width: 1024px;
350
+ }
351
+ }
352
+ @media (min-width: 1280px) {
353
+ .container {
354
+ max-width: 1280px;
355
+ }
356
+ }
357
+ @media (min-width: 1536px) {
358
+ .container {
359
+ max-width: 1536px;
360
+ }
361
+ }
362
+ .fixed {
363
+ position: fixed;
336
364
  }
337
365
  .absolute {
338
366
  position: absolute;