@tern-secure/nextjs 5.1.8 → 5.1.9

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 (329) hide show
  1. package/dist/cjs/__tests__/gemini_fnTernSecureNextHandler.bench.js +31 -0
  2. package/dist/cjs/__tests__/gemini_fnTernSecureNextHandler.bench.js.map +1 -0
  3. package/dist/cjs/app-router/admin/actions.js +62 -0
  4. package/dist/cjs/app-router/admin/actions.js.map +1 -0
  5. package/dist/cjs/app-router/admin/constants.js +29 -0
  6. package/dist/cjs/app-router/admin/constants.js.map +1 -0
  7. package/dist/cjs/app-router/admin/fnValidators.js +295 -0
  8. package/dist/cjs/app-router/admin/fnValidators.js.map +1 -0
  9. package/dist/cjs/app-router/admin/index.js +16 -3
  10. package/dist/cjs/app-router/admin/index.js.map +1 -1
  11. package/dist/cjs/app-router/admin/responses.js +120 -0
  12. package/dist/cjs/app-router/admin/responses.js.map +1 -0
  13. package/dist/cjs/app-router/admin/sessionHandlers.js +167 -0
  14. package/dist/cjs/app-router/admin/sessionHandlers.js.map +1 -0
  15. package/dist/cjs/app-router/admin/ternsecureNextjsHandler.js +84 -0
  16. package/dist/cjs/app-router/admin/ternsecureNextjsHandler.js.map +1 -0
  17. package/dist/cjs/app-router/admin/types.js +127 -0
  18. package/dist/cjs/app-router/admin/types.js.map +1 -0
  19. package/dist/cjs/app-router/admin/utils.js +107 -0
  20. package/dist/cjs/app-router/admin/utils.js.map +1 -0
  21. package/dist/cjs/app-router/admin/validators.js +217 -0
  22. package/dist/cjs/app-router/admin/validators.js.map +1 -0
  23. package/dist/cjs/app-router/client/TernSecureProvider.js +2 -6
  24. package/dist/cjs/app-router/client/TernSecureProvider.js.map +1 -1
  25. package/dist/cjs/app-router/server/auth.js +100 -0
  26. package/dist/cjs/app-router/server/auth.js.map +1 -0
  27. package/dist/cjs/app-router/server/utils.js +87 -0
  28. package/dist/cjs/app-router/server/utils.js.map +1 -0
  29. package/dist/cjs/boundary/components.js +4 -7
  30. package/dist/cjs/boundary/components.js.map +1 -1
  31. package/dist/cjs/{components/uiComponents.js → constants.js} +17 -18
  32. package/dist/cjs/constants.js.map +1 -0
  33. package/dist/cjs/errors.js.map +1 -1
  34. package/dist/cjs/index.js +4 -9
  35. package/dist/cjs/index.js.map +1 -1
  36. package/dist/cjs/server/constant.js +38 -0
  37. package/dist/cjs/server/constant.js.map +1 -0
  38. package/dist/cjs/server/edge-session.js +118 -24
  39. package/dist/cjs/server/edge-session.js.map +1 -1
  40. package/dist/cjs/server/headers-utils.js +70 -0
  41. package/dist/cjs/server/headers-utils.js.map +1 -0
  42. package/dist/cjs/server/index.js +8 -6
  43. package/dist/cjs/server/index.js.map +1 -1
  44. package/dist/cjs/server/jwt-edge.js +47 -19
  45. package/dist/cjs/server/jwt-edge.js.map +1 -1
  46. package/dist/cjs/server/jwt.js +11 -4
  47. package/dist/cjs/server/jwt.js.map +1 -1
  48. package/dist/cjs/server/nextErrors.js +131 -0
  49. package/dist/cjs/server/nextErrors.js.map +1 -0
  50. package/dist/cjs/server/nextFetcher.js +31 -0
  51. package/dist/cjs/server/nextFetcher.js.map +1 -0
  52. package/dist/cjs/server/node/SessionTernSecure.js +55 -0
  53. package/dist/cjs/server/node/SessionTernSecure.js.map +1 -0
  54. package/dist/cjs/server/{auth.js → node/auth.js} +11 -20
  55. package/dist/cjs/server/node/auth.js.map +1 -0
  56. package/dist/cjs/server/node/index.js +40 -0
  57. package/dist/cjs/server/node/index.js.map +1 -0
  58. package/dist/cjs/server/node/node-session.js +60 -0
  59. package/dist/cjs/server/node/node-session.js.map +1 -0
  60. package/dist/cjs/server/node/ternSecureNodeMiddleware.js +182 -0
  61. package/dist/cjs/server/node/ternSecureNodeMiddleware.js.map +1 -0
  62. package/dist/cjs/server/protect.js +90 -0
  63. package/dist/cjs/server/protect.js.map +1 -0
  64. package/dist/cjs/server/redirect.js +84 -0
  65. package/dist/cjs/server/redirect.js.map +1 -0
  66. package/dist/cjs/server/routeMatcher.js +36 -0
  67. package/dist/cjs/server/routeMatcher.js.map +1 -0
  68. package/dist/cjs/server/sdk-versions.js +43 -0
  69. package/dist/cjs/server/sdk-versions.js.map +1 -0
  70. package/dist/cjs/server/session-store.js.map +1 -1
  71. package/dist/cjs/server/ternSecureEdgeMiddleware.js +298 -0
  72. package/dist/cjs/server/ternSecureEdgeMiddleware.js.map +1 -0
  73. package/dist/cjs/server/ternSecureFireMiddleware.js +192 -0
  74. package/dist/cjs/server/ternSecureFireMiddleware.js.map +1 -0
  75. package/dist/cjs/server/types.js.map +1 -1
  76. package/dist/cjs/server/utils.js +115 -2
  77. package/dist/cjs/server/utils.js.map +1 -1
  78. package/dist/cjs/types.js.map +1 -1
  79. package/dist/cjs/utils/NextCookieAdapter.js +44 -0
  80. package/dist/cjs/utils/NextCookieAdapter.js.map +1 -0
  81. package/dist/cjs/utils/allNextProviderProps.js +10 -24
  82. package/dist/cjs/utils/allNextProviderProps.js.map +1 -1
  83. package/dist/cjs/utils/config.js +38 -2
  84. package/dist/cjs/utils/config.js.map +1 -1
  85. package/dist/cjs/utils/construct.js.map +1 -1
  86. package/dist/cjs/utils/fireconfig.js +38 -0
  87. package/dist/cjs/utils/fireconfig.js.map +1 -0
  88. package/dist/cjs/utils/logger.js +101 -0
  89. package/dist/cjs/utils/logger.js.map +1 -0
  90. package/dist/cjs/utils/redis.js +33 -0
  91. package/dist/cjs/utils/redis.js.map +1 -0
  92. package/dist/cjs/utils/response.js +38 -0
  93. package/dist/cjs/utils/response.js.map +1 -0
  94. package/dist/cjs/utils/serverRedirectAuth.js +39 -0
  95. package/dist/cjs/utils/serverRedirectAuth.js.map +1 -0
  96. package/dist/cjs/utils/ternsecure-sw.js +1 -1
  97. package/dist/cjs/utils/ternsecure-sw.js.map +1 -1
  98. package/dist/cjs/utils/withLogger.js +82 -0
  99. package/dist/cjs/utils/withLogger.js.map +1 -0
  100. package/dist/esm/__tests__/gemini_fnTernSecureNextHandler.bench.js +30 -0
  101. package/dist/esm/__tests__/gemini_fnTernSecureNextHandler.bench.js.map +1 -0
  102. package/dist/esm/app-router/admin/actions.js +40 -0
  103. package/dist/esm/app-router/admin/actions.js.map +1 -0
  104. package/dist/esm/app-router/admin/constants.js +5 -0
  105. package/dist/esm/app-router/admin/constants.js.map +1 -0
  106. package/dist/esm/app-router/admin/fnValidators.js +270 -0
  107. package/dist/esm/app-router/admin/fnValidators.js.map +1 -0
  108. package/dist/esm/app-router/admin/index.js +16 -2
  109. package/dist/esm/app-router/admin/index.js.map +1 -1
  110. package/dist/esm/app-router/admin/responses.js +93 -0
  111. package/dist/esm/app-router/admin/responses.js.map +1 -0
  112. package/dist/esm/app-router/admin/sessionHandlers.js +131 -0
  113. package/dist/esm/app-router/admin/sessionHandlers.js.map +1 -0
  114. package/dist/esm/app-router/admin/ternsecureNextjsHandler.js +62 -0
  115. package/dist/esm/app-router/admin/ternsecureNextjsHandler.js.map +1 -0
  116. package/dist/esm/app-router/admin/types.js +98 -0
  117. package/dist/esm/app-router/admin/types.js.map +1 -0
  118. package/dist/esm/app-router/admin/utils.js +80 -0
  119. package/dist/esm/app-router/admin/utils.js.map +1 -0
  120. package/dist/esm/app-router/admin/validators.js +189 -0
  121. package/dist/esm/app-router/admin/validators.js.map +1 -0
  122. package/dist/esm/app-router/client/TernSecureProvider.js +2 -6
  123. package/dist/esm/app-router/client/TernSecureProvider.js.map +1 -1
  124. package/dist/esm/app-router/server/auth.js +81 -0
  125. package/dist/esm/app-router/server/auth.js.map +1 -0
  126. package/dist/esm/app-router/server/utils.js +51 -0
  127. package/dist/esm/app-router/server/utils.js.map +1 -0
  128. package/dist/esm/boundary/components.js +4 -7
  129. package/dist/esm/boundary/components.js.map +1 -1
  130. package/dist/esm/constants.js +17 -0
  131. package/dist/esm/constants.js.map +1 -0
  132. package/dist/esm/errors.js.map +1 -1
  133. package/dist/esm/index.js +5 -11
  134. package/dist/esm/index.js.map +1 -1
  135. package/dist/esm/server/constant.js +11 -0
  136. package/dist/esm/server/constant.js.map +1 -0
  137. package/dist/esm/server/edge-session.js +113 -22
  138. package/dist/esm/server/edge-session.js.map +1 -1
  139. package/dist/esm/server/headers-utils.js +41 -0
  140. package/dist/esm/server/headers-utils.js.map +1 -0
  141. package/dist/esm/server/index.js +9 -3
  142. package/dist/esm/server/index.js.map +1 -1
  143. package/dist/esm/server/jwt-edge.js +48 -20
  144. package/dist/esm/server/jwt-edge.js.map +1 -1
  145. package/dist/esm/server/jwt.js +12 -5
  146. package/dist/esm/server/jwt.js.map +1 -1
  147. package/dist/esm/server/nextErrors.js +97 -0
  148. package/dist/esm/server/nextErrors.js.map +1 -0
  149. package/dist/esm/server/nextFetcher.js +7 -0
  150. package/dist/esm/server/nextFetcher.js.map +1 -0
  151. package/dist/esm/server/node/SessionTernSecure.js +31 -0
  152. package/dist/esm/server/node/SessionTernSecure.js.map +1 -0
  153. package/dist/esm/server/{auth.js → node/auth.js} +11 -20
  154. package/dist/esm/server/node/auth.js.map +1 -0
  155. package/dist/esm/server/node/index.js +19 -0
  156. package/dist/esm/server/node/index.js.map +1 -0
  157. package/dist/esm/server/node/node-session.js +36 -0
  158. package/dist/esm/server/node/node-session.js.map +1 -0
  159. package/dist/esm/server/node/ternSecureNodeMiddleware.js +165 -0
  160. package/dist/esm/server/node/ternSecureNodeMiddleware.js.map +1 -0
  161. package/dist/esm/server/protect.js +66 -0
  162. package/dist/esm/server/protect.js.map +1 -0
  163. package/dist/esm/server/redirect.js +60 -0
  164. package/dist/esm/server/redirect.js.map +1 -0
  165. package/dist/esm/server/routeMatcher.js +12 -0
  166. package/dist/esm/server/routeMatcher.js.map +1 -0
  167. package/dist/esm/server/sdk-versions.js +8 -0
  168. package/dist/esm/server/sdk-versions.js.map +1 -0
  169. package/dist/esm/server/session-store.js.map +1 -1
  170. package/dist/esm/server/ternSecureEdgeMiddleware.js +286 -0
  171. package/dist/esm/server/ternSecureEdgeMiddleware.js.map +1 -0
  172. package/dist/esm/server/ternSecureFireMiddleware.js +179 -0
  173. package/dist/esm/server/ternSecureFireMiddleware.js.map +1 -0
  174. package/dist/esm/server/utils.js +99 -1
  175. package/dist/esm/server/utils.js.map +1 -1
  176. package/dist/esm/types.js.map +1 -1
  177. package/dist/esm/utils/NextCookieAdapter.js +20 -0
  178. package/dist/esm/utils/NextCookieAdapter.js.map +1 -0
  179. package/dist/esm/utils/allNextProviderProps.js +10 -24
  180. package/dist/esm/utils/allNextProviderProps.js.map +1 -1
  181. package/dist/esm/utils/config.js +34 -1
  182. package/dist/esm/utils/config.js.map +1 -1
  183. package/dist/esm/utils/construct.js +1 -1
  184. package/dist/esm/utils/construct.js.map +1 -1
  185. package/dist/esm/utils/fireconfig.js +14 -0
  186. package/dist/esm/utils/fireconfig.js.map +1 -0
  187. package/dist/esm/utils/logger.js +74 -0
  188. package/dist/esm/utils/logger.js.map +1 -0
  189. package/dist/esm/utils/redis.js +9 -0
  190. package/dist/esm/utils/redis.js.map +1 -0
  191. package/dist/esm/utils/response.js +13 -0
  192. package/dist/esm/utils/response.js.map +1 -0
  193. package/dist/esm/utils/serverRedirectAuth.js +17 -0
  194. package/dist/esm/utils/serverRedirectAuth.js.map +1 -0
  195. package/dist/esm/utils/ternsecure-sw.js +1 -1
  196. package/dist/esm/utils/ternsecure-sw.js.map +1 -1
  197. package/dist/esm/utils/withLogger.js +57 -0
  198. package/dist/esm/utils/withLogger.js.map +1 -0
  199. package/dist/types/app-router/admin/actions.d.ts +19 -0
  200. package/dist/types/app-router/admin/actions.d.ts.map +1 -0
  201. package/dist/types/app-router/admin/constants.d.ts +2 -0
  202. package/dist/types/app-router/admin/constants.d.ts.map +1 -0
  203. package/dist/types/app-router/admin/fnValidators.d.ts +35 -0
  204. package/dist/types/app-router/admin/fnValidators.d.ts.map +1 -0
  205. package/dist/types/app-router/admin/index.d.ts +3 -1
  206. package/dist/types/app-router/admin/index.d.ts.map +1 -1
  207. package/dist/types/app-router/admin/responses.d.ts +28 -0
  208. package/dist/types/app-router/admin/responses.d.ts.map +1 -0
  209. package/dist/types/app-router/admin/sessionHandlers.d.ts +26 -0
  210. package/dist/types/app-router/admin/sessionHandlers.d.ts.map +1 -0
  211. package/dist/types/app-router/admin/ternsecureNextjsHandler.d.ts +7 -0
  212. package/dist/types/app-router/admin/ternsecureNextjsHandler.d.ts.map +1 -0
  213. package/dist/types/app-router/admin/types.d.ts +105 -0
  214. package/dist/types/app-router/admin/types.d.ts.map +1 -0
  215. package/dist/types/app-router/admin/utils.d.ts +53 -0
  216. package/dist/types/app-router/admin/utils.d.ts.map +1 -0
  217. package/dist/types/app-router/admin/validators.d.ts +46 -0
  218. package/dist/types/app-router/admin/validators.d.ts.map +1 -0
  219. package/dist/types/app-router/client/TernSecureProvider.d.ts.map +1 -1
  220. package/dist/types/app-router/server/auth.d.ts +26 -0
  221. package/dist/types/app-router/server/auth.d.ts.map +1 -0
  222. package/dist/types/app-router/server/utils.d.ts +5 -0
  223. package/dist/types/app-router/server/utils.d.ts.map +1 -0
  224. package/dist/types/boundary/components.d.ts +1 -1
  225. package/dist/types/boundary/components.d.ts.map +1 -1
  226. package/dist/types/constants.d.ts +11 -0
  227. package/dist/types/constants.d.ts.map +1 -0
  228. package/dist/types/errors.d.ts +1 -1
  229. package/dist/types/errors.d.ts.map +1 -1
  230. package/dist/types/index.d.ts +3 -3
  231. package/dist/types/index.d.ts.map +1 -1
  232. package/dist/types/server/constant.d.ts +5 -0
  233. package/dist/types/server/constant.d.ts.map +1 -0
  234. package/dist/types/server/edge-session.d.ts +13 -1
  235. package/dist/types/server/edge-session.d.ts.map +1 -1
  236. package/dist/types/server/headers-utils.d.ts +10 -0
  237. package/dist/types/server/headers-utils.d.ts.map +1 -0
  238. package/dist/types/server/index.d.ts +6 -3
  239. package/dist/types/server/index.d.ts.map +1 -1
  240. package/dist/types/server/jwt-edge.d.ts +12 -18
  241. package/dist/types/server/jwt-edge.d.ts.map +1 -1
  242. package/dist/types/server/jwt.d.ts +12 -18
  243. package/dist/types/server/jwt.d.ts.map +1 -1
  244. package/dist/types/server/nextErrors.d.ts +54 -0
  245. package/dist/types/server/nextErrors.d.ts.map +1 -0
  246. package/dist/types/server/nextFetcher.d.ts +26 -0
  247. package/dist/types/server/nextFetcher.d.ts.map +1 -0
  248. package/dist/types/server/node/SessionTernSecure.d.ts +3 -0
  249. package/dist/types/server/node/SessionTernSecure.d.ts.map +1 -0
  250. package/dist/types/server/{auth.d.ts → node/auth.d.ts} +5 -5
  251. package/dist/types/server/node/auth.d.ts.map +1 -0
  252. package/dist/types/server/node/index.d.ts +3 -0
  253. package/dist/types/server/node/index.d.ts.map +1 -0
  254. package/dist/types/server/node/node-session.d.ts +4 -0
  255. package/dist/types/server/node/node-session.d.ts.map +1 -0
  256. package/dist/types/server/node/ternSecureNodeMiddleware.d.ts +54 -0
  257. package/dist/types/server/node/ternSecureNodeMiddleware.d.ts.map +1 -0
  258. package/dist/types/server/protect.d.ts +26 -0
  259. package/dist/types/server/protect.d.ts.map +1 -0
  260. package/dist/types/server/redirect.d.ts +20 -0
  261. package/dist/types/server/redirect.d.ts.map +1 -0
  262. package/dist/types/server/routeMatcher.d.ts +13 -0
  263. package/dist/types/server/routeMatcher.d.ts.map +1 -0
  264. package/dist/types/server/sdk-versions.d.ts +8 -0
  265. package/dist/types/server/sdk-versions.d.ts.map +1 -0
  266. package/dist/types/server/session-store.d.ts.map +1 -1
  267. package/dist/types/server/ternSecureEdgeMiddleware.d.ts +47 -0
  268. package/dist/types/server/ternSecureEdgeMiddleware.d.ts.map +1 -0
  269. package/dist/types/server/ternSecureFireMiddleware.d.ts +47 -0
  270. package/dist/types/server/ternSecureFireMiddleware.d.ts.map +1 -0
  271. package/dist/types/server/types.d.ts +16 -2
  272. package/dist/types/server/types.d.ts.map +1 -1
  273. package/dist/types/server/utils.d.ts +7 -0
  274. package/dist/types/server/utils.d.ts.map +1 -1
  275. package/dist/types/types.d.ts +33 -1
  276. package/dist/types/types.d.ts.map +1 -1
  277. package/dist/types/utils/NextCookieAdapter.d.ts +9 -0
  278. package/dist/types/utils/NextCookieAdapter.d.ts.map +1 -0
  279. package/dist/types/utils/allNextProviderProps.d.ts +1 -1
  280. package/dist/types/utils/allNextProviderProps.d.ts.map +1 -1
  281. package/dist/types/utils/config.d.ts +17 -1
  282. package/dist/types/utils/config.d.ts.map +1 -1
  283. package/dist/types/utils/fireconfig.d.ts +4 -0
  284. package/dist/types/utils/fireconfig.d.ts.map +1 -0
  285. package/dist/types/utils/logger.d.ts +27 -0
  286. package/dist/types/utils/logger.d.ts.map +1 -0
  287. package/dist/types/utils/redis.d.ts +8 -0
  288. package/dist/types/utils/redis.d.ts.map +1 -0
  289. package/dist/types/utils/response.d.ts +3 -0
  290. package/dist/types/utils/response.d.ts.map +1 -0
  291. package/dist/types/utils/serverRedirectAuth.d.ts +6 -0
  292. package/dist/types/utils/serverRedirectAuth.d.ts.map +1 -0
  293. package/dist/types/utils/withLogger.d.ts +17 -0
  294. package/dist/types/utils/withLogger.d.ts.map +1 -0
  295. package/package.json +21 -7
  296. package/server/node/package.json +5 -0
  297. package/server/package.json +5 -0
  298. package/dist/cjs/app-router/admin/sessionHandler.js +0 -74
  299. package/dist/cjs/app-router/admin/sessionHandler.js.map +0 -1
  300. package/dist/cjs/app-router/client/actions.js +0 -4
  301. package/dist/cjs/app-router/client/actions.js.map +0 -1
  302. package/dist/cjs/components/uiComponents.js.map +0 -1
  303. package/dist/cjs/server/auth.js.map +0 -1
  304. package/dist/cjs/server/ternSecureMiddleware.js +0 -95
  305. package/dist/cjs/server/ternSecureMiddleware.js.map +0 -1
  306. package/dist/cjs/utils/tern-ui-script.js +0 -78
  307. package/dist/cjs/utils/tern-ui-script.js.map +0 -1
  308. package/dist/esm/app-router/admin/sessionHandler.js +0 -50
  309. package/dist/esm/app-router/admin/sessionHandler.js.map +0 -1
  310. package/dist/esm/app-router/client/actions.js +0 -3
  311. package/dist/esm/app-router/client/actions.js.map +0 -1
  312. package/dist/esm/components/uiComponents.js +0 -21
  313. package/dist/esm/components/uiComponents.js.map +0 -1
  314. package/dist/esm/server/auth.js.map +0 -1
  315. package/dist/esm/server/ternSecureMiddleware.js +0 -69
  316. package/dist/esm/server/ternSecureMiddleware.js.map +0 -1
  317. package/dist/esm/utils/tern-ui-script.js +0 -44
  318. package/dist/esm/utils/tern-ui-script.js.map +0 -1
  319. package/dist/types/app-router/admin/sessionHandler.d.ts +0 -3
  320. package/dist/types/app-router/admin/sessionHandler.d.ts.map +0 -1
  321. package/dist/types/app-router/client/actions.d.ts +0 -2
  322. package/dist/types/app-router/client/actions.d.ts.map +0 -1
  323. package/dist/types/components/uiComponents.d.ts +0 -6
  324. package/dist/types/components/uiComponents.d.ts.map +0 -1
  325. package/dist/types/server/auth.d.ts.map +0 -1
  326. package/dist/types/server/ternSecureMiddleware.d.ts +0 -20
  327. package/dist/types/server/ternSecureMiddleware.d.ts.map +0 -1
  328. package/dist/types/utils/tern-ui-script.d.ts +0 -9
  329. package/dist/types/utils/tern-ui-script.d.ts.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/app-router/admin/ternsecureNextjsHandler.ts"],"sourcesContent":["import type { NextRequest, NextResponse } from 'next/server';\n\nimport { TENANT_ID } from './constants';\nimport type { RequestContext } from './fnValidators';\nimport { createRequestContext, createValidators } from './fnValidators';\nimport { createApiErrorResponse } from './responses';\nimport { SessionEndpointHandler } from './sessionHandlers';\nimport type {\n AuthEndpoint,\n SessionSubEndpoint,\n TernSecureHandlerOptions,\n TernSecureInternalHandlerConfig} from './types';\nimport {\n DEFAULT_HANDLER_OPTIONS\n} from './types';\nimport { ConfigUtils, LoggingUtils } from './utils';\n\n/**\n * Apply all global validations in a clean, sequential manner\n */\nasync function applyGlobalValidations(\n config: Required<TernSecureHandlerOptions>,\n context: RequestContext,\n): Promise<NextResponse | null> {\n const { validateCors, validateSecurity, createCorsOptionsResponse } = createValidators(context);\n const corsError = await validateCors(config.cors);\n if (corsError) return corsError;\n\n if (context.method === 'OPTIONS') {\n return createCorsOptionsResponse(config.cors);\n }\n\n const securityError = await validateSecurity(config.security);\n if (securityError) return securityError;\n\n return null;\n}\n\n/**\n * Route to appropriate endpoint handler based on endpoint type\n */\nasync function routeToEndpointHandler(\n request: NextRequest,\n endpoint: AuthEndpoint,\n subEndpoint: SessionSubEndpoint,\n config: TernSecureInternalHandlerConfig,\n): Promise<NextResponse> {\n switch (endpoint) {\n case 'sessions':\n return SessionEndpointHandler.handle(request, request.method, subEndpoint, config);\n default:\n return createApiErrorResponse('ENDPOINT_NOT_FOUND', 'Endpoint not found', 404);\n }\n}\n\nexport function createTernSecureNextJsHandler(options?: TernSecureHandlerOptions) {\n const baseConfig: Required<TernSecureHandlerOptions> = ConfigUtils.mergeWithDefaults(\n DEFAULT_HANDLER_OPTIONS,\n options,\n );\n\n const internalConfig: TernSecureInternalHandlerConfig = {\n ...baseConfig,\n tenantId: TENANT_ID,\n };\n\n const handler = async (request: NextRequest): Promise<NextResponse> => {\n const context = createRequestContext(request);\n const { pathSegments } = context;\n\n const endpoint = pathSegments[2] as AuthEndpoint;\n const subEndpoint = pathSegments[3] as SessionSubEndpoint;\n\n LoggingUtils.logRequest(request, 'Handler');\n\n try {\n const validationResult = await applyGlobalValidations(internalConfig, context);\n if (validationResult) {\n return validationResult;\n }\n\n return await routeToEndpointHandler(request, endpoint, subEndpoint, internalConfig);\n } catch (error) {\n LoggingUtils.logError(error, 'Handler');\n return createApiErrorResponse('INTERNAL_SERVER_ERROR', 'Internal server error', 500);\n }\n };\n\n return {\n GET: handler,\n POST: handler,\n };\n}\n"],"mappings":"AAEA,SAAS,iBAAiB;AAE1B,SAAS,sBAAsB,wBAAwB;AACvD,SAAS,8BAA8B;AACvC,SAAS,8BAA8B;AAMvC;AAAA,EACE;AAAA,OACK;AACP,SAAS,aAAa,oBAAoB;AAK1C,eAAe,uBACb,QACA,SAC8B;AAC9B,QAAM,EAAE,cAAc,kBAAkB,0BAA0B,IAAI,iBAAiB,OAAO;AAC9F,QAAM,YAAY,MAAM,aAAa,OAAO,IAAI;AAChD,MAAI,UAAW,QAAO;AAEtB,MAAI,QAAQ,WAAW,WAAW;AAChC,WAAO,0BAA0B,OAAO,IAAI;AAAA,EAC9C;AAEA,QAAM,gBAAgB,MAAM,iBAAiB,OAAO,QAAQ;AAC5D,MAAI,cAAe,QAAO;AAE1B,SAAO;AACT;AAKA,eAAe,uBACb,SACA,UACA,aACA,QACuB;AACvB,UAAQ,UAAU;AAAA,IAChB,KAAK;AACH,aAAO,uBAAuB,OAAO,SAAS,QAAQ,QAAQ,aAAa,MAAM;AAAA,IACnF;AACE,aAAO,uBAAuB,sBAAsB,sBAAsB,GAAG;AAAA,EACjF;AACF;AAEO,SAAS,8BAA8B,SAAoC;AAChF,QAAM,aAAiD,YAAY;AAAA,IACjE;AAAA,IACA;AAAA,EACF;AAEA,QAAM,iBAAkD;AAAA,IACtD,GAAG;AAAA,IACH,UAAU;AAAA,EACZ;AAEA,QAAM,UAAU,OAAO,YAAgD;AACrE,UAAM,UAAU,qBAAqB,OAAO;AAC5C,UAAM,EAAE,aAAa,IAAI;AAEzB,UAAM,WAAW,aAAa,CAAC;AAC/B,UAAM,cAAc,aAAa,CAAC;AAElC,iBAAa,WAAW,SAAS,SAAS;AAE1C,QAAI;AACF,YAAM,mBAAmB,MAAM,uBAAuB,gBAAgB,OAAO;AAC7E,UAAI,kBAAkB;AACpB,eAAO;AAAA,MACT;AAEA,aAAO,MAAM,uBAAuB,SAAS,UAAU,aAAa,cAAc;AAAA,IACpF,SAAS,OAAO;AACd,mBAAa,SAAS,OAAO,SAAS;AACtC,aAAO,uBAAuB,yBAAyB,yBAAyB,GAAG;AAAA,IACrF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,KAAK;AAAA,IACL,MAAM;AAAA,EACR;AACF;","names":[]}
@@ -0,0 +1,98 @@
1
+ const DEFAULT_CORS_OPTIONS = {
2
+ allowedOrigins: [],
3
+ allowedMethods: ["GET", "POST"],
4
+ allowedHeaders: ["Content-Type", "Authorization", "X-Requested-With"],
5
+ allowCredentials: true,
6
+ maxAge: 86400
7
+ // 24 hours
8
+ };
9
+ const DEFAULT_COOKIE_OPTIONS = {
10
+ name: "__session",
11
+ path: "/",
12
+ secure: true,
13
+ httpOnly: true,
14
+ sameSite: "lax",
15
+ maxAge: 3600 * 24 * 7
16
+ // 7 days
17
+ };
18
+ const DEFAULT_SECURITY_OPTIONS = {
19
+ requireCSRF: true,
20
+ allowedReferers: [],
21
+ requiredHeaders: {},
22
+ ipWhitelist: [],
23
+ userAgent: {
24
+ block: [],
25
+ allow: []
26
+ }
27
+ };
28
+ const DEFAULT_ENDPOINT_CONFIG = {
29
+ enabled: true,
30
+ methods: ["GET", "POST"],
31
+ requireAuth: false,
32
+ security: DEFAULT_SECURITY_OPTIONS
33
+ };
34
+ const DEFAULT_SESSIONS_CONFIG = {
35
+ ...DEFAULT_ENDPOINT_CONFIG,
36
+ subEndpoints: {
37
+ verify: {
38
+ enabled: true,
39
+ methods: ["GET"],
40
+ requireAuth: false,
41
+ security: {
42
+ requireCSRF: true,
43
+ allowedReferers: []
44
+ }
45
+ },
46
+ createsession: {
47
+ enabled: true,
48
+ methods: ["POST"],
49
+ requireAuth: false,
50
+ security: {
51
+ requireCSRF: true
52
+ }
53
+ },
54
+ refresh: {
55
+ enabled: true,
56
+ methods: ["POST"],
57
+ requireAuth: true,
58
+ security: {
59
+ requireCSRF: true
60
+ }
61
+ },
62
+ revoke: {
63
+ enabled: true,
64
+ methods: ["POST"],
65
+ requireAuth: true,
66
+ security: {
67
+ requireCSRF: true
68
+ }
69
+ }
70
+ }
71
+ };
72
+ const DEFAULT_HANDLER_OPTIONS = {
73
+ cors: DEFAULT_CORS_OPTIONS,
74
+ cookies: DEFAULT_COOKIE_OPTIONS,
75
+ rateLimit: {
76
+ windowMs: 15 * 60 * 1e3,
77
+ // 15 minutes
78
+ maxRequests: 100,
79
+ skipSuccessful: false,
80
+ skipFailedRequests: false
81
+ },
82
+ security: DEFAULT_SECURITY_OPTIONS,
83
+ endpoints: {
84
+ sessions: DEFAULT_SESSIONS_CONFIG
85
+ },
86
+ debug: false,
87
+ environment: "production",
88
+ basePath: "/api/auth"
89
+ };
90
+ export {
91
+ DEFAULT_COOKIE_OPTIONS,
92
+ DEFAULT_CORS_OPTIONS,
93
+ DEFAULT_ENDPOINT_CONFIG,
94
+ DEFAULT_HANDLER_OPTIONS,
95
+ DEFAULT_SECURITY_OPTIONS,
96
+ DEFAULT_SESSIONS_CONFIG
97
+ };
98
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/app-router/admin/types.ts"],"sourcesContent":["import { type NextResponse } from 'next/server';\n\nexport interface CorsOptions {\n allowedOrigins: string[] | '*';\n allowedMethods?: string[];\n allowedHeaders?: string[];\n allowCredentials?: boolean;\n maxAge?: number;\n skipSameOrigin?: boolean;\n}\n\nexport interface CookieOptions {\n name?: string;\n domain?: string;\n path?: string;\n secure?: boolean;\n httpOnly?: boolean;\n sameSite?: 'strict' | 'lax' | 'none';\n maxAge?: number;\n}\n\nexport interface RateLimitOptions {\n windowMs?: number;\n maxRequests?: number;\n skipSuccessful?: boolean;\n skipFailedRequests?: boolean;\n}\n\nexport interface SecurityOptions {\n requireCSRF?: boolean;\n allowedReferers?: string[];\n requiredHeaders?: Record<string, string>;\n ipWhitelist?: string[];\n userAgent?: {\n block?: string[];\n allow?: string[];\n };\n}\n\nexport interface EndpointConfig {\n enabled: boolean;\n methods: ('GET' | 'POST' | 'PUT' | 'DELETE')[];\n requireAuth?: boolean;\n rateLimit?: RateLimitOptions;\n security?: SecurityOptions;\n cors?: Partial<CorsOptions>;\n}\n\nexport interface SessionEndpointConfig extends EndpointConfig {\n subEndpoints?: {\n [K in SessionSubEndpoint]?: Partial<EndpointConfig>;\n };\n}\n\nexport interface TernSecureHandlerOptions {\n cors?: CorsOptions;\n cookies?: CookieOptions;\n rateLimit?: RateLimitOptions;\n security?: SecurityOptions;\n endpoints?: {\n sessions?: SessionEndpointConfig;\n };\n\n debug?: boolean;\n environment?: 'development' | 'production' | 'test';\n basePath?: string;\n}\n\n/**\n * Define an internal config type that extends the public options\n * with server-side only values like tenantId.\n */\nexport type TernSecureInternalHandlerConfig = Required<TernSecureHandlerOptions> & {\n tenantId?: string;\n};\n\nexport type AuthEndpoint = 'sessions' | 'users';\nexport type SessionSubEndpoint = 'verify' | 'createsession' | 'refresh' | 'revoke';\n\nexport const DEFAULT_CORS_OPTIONS: CorsOptions = {\n allowedOrigins: [],\n allowedMethods: ['GET', 'POST'],\n allowedHeaders: ['Content-Type', 'Authorization', 'X-Requested-With'],\n allowCredentials: true,\n maxAge: 86400, // 24 hours\n};\n\nexport const DEFAULT_COOKIE_OPTIONS: CookieOptions = {\n name: '__session',\n path: '/',\n secure: true,\n httpOnly: true,\n sameSite: 'lax',\n maxAge: 3600 * 24 * 7, // 7 days\n};\n\nexport const DEFAULT_SECURITY_OPTIONS: SecurityOptions = {\n requireCSRF: true,\n allowedReferers: [],\n requiredHeaders: {},\n ipWhitelist: [],\n userAgent: {\n block: [],\n allow: [],\n },\n};\n\nexport const DEFAULT_ENDPOINT_CONFIG: EndpointConfig = {\n enabled: true,\n methods: ['GET', 'POST'],\n requireAuth: false,\n security: DEFAULT_SECURITY_OPTIONS,\n};\n\nexport const DEFAULT_SESSIONS_CONFIG: SessionEndpointConfig = {\n ...DEFAULT_ENDPOINT_CONFIG,\n subEndpoints: {\n verify: {\n enabled: true,\n methods: ['GET'],\n requireAuth: false,\n security: {\n requireCSRF: true,\n allowedReferers: [],\n },\n },\n createsession: {\n enabled: true,\n methods: ['POST'],\n requireAuth: false,\n security: {\n requireCSRF: true,\n },\n },\n refresh: {\n enabled: true,\n methods: ['POST'],\n requireAuth: true,\n security: {\n requireCSRF: true,\n },\n },\n revoke: {\n enabled: true,\n methods: ['POST'],\n requireAuth: true,\n security: {\n requireCSRF: true,\n },\n },\n },\n};\n\nexport const DEFAULT_HANDLER_OPTIONS: Required<TernSecureHandlerOptions> & {\n endpoints: Required<NonNullable<TernSecureHandlerOptions['endpoints']>>;\n} = {\n cors: DEFAULT_CORS_OPTIONS,\n cookies: DEFAULT_COOKIE_OPTIONS,\n rateLimit: {\n windowMs: 15 * 60 * 1000, // 15 minutes\n maxRequests: 100,\n skipSuccessful: false,\n skipFailedRequests: false,\n },\n security: DEFAULT_SECURITY_OPTIONS,\n endpoints: {\n sessions: DEFAULT_SESSIONS_CONFIG,\n },\n debug: false,\n environment: 'production',\n basePath: '/api/auth',\n};\n\n\nexport interface ValidationResult {\n error?: NextResponse;\n data?: any;\n}\n\nexport interface ValidationConfig {\n cors?: CorsOptions;\n security?: SecurityOptions;\n endpoint?: {\n name: AuthEndpoint;\n config: EndpointConfig;\n };\n subEndpoint?: {\n name: SessionSubEndpoint;\n config: EndpointConfig;\n };\n requireIdToken?: boolean;\n requireCsrfToken?: boolean;\n}\n\nexport interface ComprehensiveValidationResult {\n isValid: boolean;\n error?: NextResponse;\n corsResponse?: NextResponse;\n sessionData?: {\n body: any;\n idToken?: string;\n csrfToken?: string;\n };\n}\n"],"mappings":"AA+EO,MAAM,uBAAoC;AAAA,EAC/C,gBAAgB,CAAC;AAAA,EACjB,gBAAgB,CAAC,OAAO,MAAM;AAAA,EAC9B,gBAAgB,CAAC,gBAAgB,iBAAiB,kBAAkB;AAAA,EACpE,kBAAkB;AAAA,EAClB,QAAQ;AAAA;AACV;AAEO,MAAM,yBAAwC;AAAA,EACnD,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,UAAU;AAAA,EACV,QAAQ,OAAO,KAAK;AAAA;AACtB;AAEO,MAAM,2BAA4C;AAAA,EACvD,aAAa;AAAA,EACb,iBAAiB,CAAC;AAAA,EAClB,iBAAiB,CAAC;AAAA,EAClB,aAAa,CAAC;AAAA,EACd,WAAW;AAAA,IACT,OAAO,CAAC;AAAA,IACR,OAAO,CAAC;AAAA,EACV;AACF;AAEO,MAAM,0BAA0C;AAAA,EACrD,SAAS;AAAA,EACT,SAAS,CAAC,OAAO,MAAM;AAAA,EACvB,aAAa;AAAA,EACb,UAAU;AACZ;AAEO,MAAM,0BAAiD;AAAA,EAC5D,GAAG;AAAA,EACH,cAAc;AAAA,IACZ,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,SAAS,CAAC,KAAK;AAAA,MACf,aAAa;AAAA,MACb,UAAU;AAAA,QACR,aAAa;AAAA,QACb,iBAAiB,CAAC;AAAA,MACpB;AAAA,IACF;AAAA,IACA,eAAe;AAAA,MACb,SAAS;AAAA,MACT,SAAS,CAAC,MAAM;AAAA,MAChB,aAAa;AAAA,MACb,UAAU;AAAA,QACR,aAAa;AAAA,MACf;AAAA,IACF;AAAA,IACA,SAAS;AAAA,MACP,SAAS;AAAA,MACT,SAAS,CAAC,MAAM;AAAA,MAChB,aAAa;AAAA,MACb,UAAU;AAAA,QACR,aAAa;AAAA,MACf;AAAA,IACF;AAAA,IACA,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,SAAS,CAAC,MAAM;AAAA,MAChB,aAAa;AAAA,MACb,UAAU;AAAA,QACR,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AACF;AAEO,MAAM,0BAET;AAAA,EACF,MAAM;AAAA,EACN,SAAS;AAAA,EACT,WAAW;AAAA,IACT,UAAU,KAAK,KAAK;AAAA;AAAA,IACpB,aAAa;AAAA,IACb,gBAAgB;AAAA,IAChB,oBAAoB;AAAA,EACtB;AAAA,EACA,UAAU;AAAA,EACV,WAAW;AAAA,IACT,UAAU;AAAA,EACZ;AAAA,EACA,OAAO;AAAA,EACP,aAAa;AAAA,EACb,UAAU;AACZ;","names":[]}
@@ -0,0 +1,80 @@
1
+ class HttpUtils {
2
+ /**
3
+ * Extract client IP address from various headers
4
+ */
5
+ static getClientIP(request) {
6
+ const forwarded = request.headers.get("x-forwarded-for");
7
+ const realIP = request.headers.get("x-real-ip");
8
+ const clientIP = request.headers.get("x-client-ip");
9
+ if (forwarded) {
10
+ return forwarded.split(",")[0].trim();
11
+ }
12
+ return realIP || clientIP || "unknown";
13
+ }
14
+ /**
15
+ * Parse URL path segments for routing
16
+ */
17
+ static parsePathSegments(url) {
18
+ return url.pathname.split("/").filter(Boolean);
19
+ }
20
+ /**
21
+ * Extract authentication headers
22
+ */
23
+ static extractAuthHeaders(request) {
24
+ return {
25
+ origin: request.headers.get("origin"),
26
+ host: request.headers.get("host"),
27
+ referer: request.headers.get("referer"),
28
+ userAgent: request.headers.get("user-agent") || "",
29
+ authorization: request.headers.get("authorization"),
30
+ xRequestedWith: request.headers.get("x-requested-with")
31
+ };
32
+ }
33
+ }
34
+ class ConfigUtils {
35
+ /**
36
+ * Deep merge handler options with defaults
37
+ */
38
+ static mergeWithDefaults(defaults, options) {
39
+ if (!options) return defaults;
40
+ const result = { ...defaults };
41
+ for (const key in options) {
42
+ const value = options[key];
43
+ if (value && typeof value === "object" && !Array.isArray(value)) {
44
+ result[key] = this.mergeWithDefaults(defaults[key] || {}, value);
45
+ } else {
46
+ result[key] = value;
47
+ }
48
+ }
49
+ return result;
50
+ }
51
+ }
52
+ class CookieUtils {
53
+ static extractSessionCookies(request) {
54
+ return {
55
+ sessionCookie: request.cookies.get("_session_cookie")?.value,
56
+ csrfCookie: request.cookies.get("_session_terncf")?.value,
57
+ mainSession: request.cookies.get("__session")?.value
58
+ };
59
+ }
60
+ }
61
+ class LoggingUtils {
62
+ static logRequest(request, context) {
63
+ if (process.env.NODE_ENV === "development") {
64
+ console.log(`[TernSecure${context ? ` ${context}` : ""}] ${request.method} ${request.url}`);
65
+ }
66
+ }
67
+ static logError(error, context) {
68
+ console.error(`[TernSecure${context ? ` ${context}` : ""} Error]`, error);
69
+ }
70
+ static logWarning(message, context) {
71
+ console.warn(`[TernSecure${context ? ` ${context}` : ""} Warning]`, message);
72
+ }
73
+ }
74
+ export {
75
+ ConfigUtils,
76
+ CookieUtils,
77
+ HttpUtils,
78
+ LoggingUtils
79
+ };
80
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/app-router/admin/utils.ts"],"sourcesContent":["import type { NextRequest } from 'next/server';\n\n/**\n * HTTP utilities\n */\nexport class HttpUtils {\n /**\n * Extract client IP address from various headers\n */\n static getClientIP(request: NextRequest): string {\n const forwarded = request.headers.get('x-forwarded-for');\n const realIP = request.headers.get('x-real-ip');\n const clientIP = request.headers.get('x-client-ip');\n\n if (forwarded) {\n return forwarded.split(',')[0].trim();\n }\n\n return realIP || clientIP || 'unknown';\n }\n\n /**\n * Parse URL path segments for routing\n */\n static parsePathSegments(url: URL): string[] {\n return url.pathname.split('/').filter(Boolean);\n }\n\n /**\n * Extract authentication headers\n */\n static extractAuthHeaders(request: NextRequest) {\n return {\n origin: request.headers.get('origin'),\n host: request.headers.get('host'),\n referer: request.headers.get('referer'),\n userAgent: request.headers.get('user-agent') || '',\n authorization: request.headers.get('authorization'),\n xRequestedWith: request.headers.get('x-requested-with'),\n };\n }\n}\n\n/**\n * Configuration utilities\n */\nexport class ConfigUtils {\n /**\n * Deep merge handler options with defaults\n */\n static mergeWithDefaults(\n defaults: any,\n options?: any\n ): any {\n if (!options) return defaults;\n\n const result = { ...defaults };\n \n for (const key in options) {\n const value = options[key];\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n result[key] = this.mergeWithDefaults(defaults[key] || {}, value);\n } else {\n result[key] = value;\n }\n }\n\n return result;\n }\n}\n\n/**\n * Cookie utilities\n */\nexport class CookieUtils {\n static extractSessionCookies(request: NextRequest) {\n return {\n sessionCookie: request.cookies.get('_session_cookie')?.value,\n csrfCookie: request.cookies.get('_session_terncf')?.value,\n mainSession: request.cookies.get('__session')?.value,\n };\n }\n}\n\n/**\n * Logging utilities for debugging\n */\nexport class LoggingUtils {\n static logRequest(request: NextRequest, context?: string) {\n if (process.env.NODE_ENV === 'development') {\n console.log(`[TernSecure${context ? ` ${context}` : ''}] ${request.method} ${request.url}`);\n }\n }\n\n static logError(error: any, context?: string) {\n console.error(`[TernSecure${context ? ` ${context}` : ''} Error]`, error);\n }\n\n static logWarning(message: string, context?: string) {\n console.warn(`[TernSecure${context ? ` ${context}` : ''} Warning]`, message);\n }\n}"],"mappings":"AAKO,MAAM,UAAU;AAAA;AAAA;AAAA;AAAA,EAIrB,OAAO,YAAY,SAA8B;AAC/C,UAAM,YAAY,QAAQ,QAAQ,IAAI,iBAAiB;AACvD,UAAM,SAAS,QAAQ,QAAQ,IAAI,WAAW;AAC9C,UAAM,WAAW,QAAQ,QAAQ,IAAI,aAAa;AAElD,QAAI,WAAW;AACb,aAAO,UAAU,MAAM,GAAG,EAAE,CAAC,EAAE,KAAK;AAAA,IACtC;AAEA,WAAO,UAAU,YAAY;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,kBAAkB,KAAoB;AAC3C,WAAO,IAAI,SAAS,MAAM,GAAG,EAAE,OAAO,OAAO;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,mBAAmB,SAAsB;AAC9C,WAAO;AAAA,MACL,QAAQ,QAAQ,QAAQ,IAAI,QAAQ;AAAA,MACpC,MAAM,QAAQ,QAAQ,IAAI,MAAM;AAAA,MAChC,SAAS,QAAQ,QAAQ,IAAI,SAAS;AAAA,MACtC,WAAW,QAAQ,QAAQ,IAAI,YAAY,KAAK;AAAA,MAChD,eAAe,QAAQ,QAAQ,IAAI,eAAe;AAAA,MAClD,gBAAgB,QAAQ,QAAQ,IAAI,kBAAkB;AAAA,IACxD;AAAA,EACF;AACF;AAKO,MAAM,YAAY;AAAA;AAAA;AAAA;AAAA,EAIvB,OAAO,kBACL,UACA,SACK;AACL,QAAI,CAAC,QAAS,QAAO;AAErB,UAAM,SAAS,EAAE,GAAG,SAAS;AAE7B,eAAW,OAAO,SAAS;AACzB,YAAM,QAAQ,QAAQ,GAAG;AACzB,UAAI,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,GAAG;AAC/D,eAAO,GAAG,IAAI,KAAK,kBAAkB,SAAS,GAAG,KAAK,CAAC,GAAG,KAAK;AAAA,MACjE,OAAO;AACL,eAAO,GAAG,IAAI;AAAA,MAChB;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;AAKO,MAAM,YAAY;AAAA,EACvB,OAAO,sBAAsB,SAAsB;AACjD,WAAO;AAAA,MACL,eAAe,QAAQ,QAAQ,IAAI,iBAAiB,GAAG;AAAA,MACvD,YAAY,QAAQ,QAAQ,IAAI,iBAAiB,GAAG;AAAA,MACpD,aAAa,QAAQ,QAAQ,IAAI,WAAW,GAAG;AAAA,IACjD;AAAA,EACF;AACF;AAKO,MAAM,aAAa;AAAA,EACxB,OAAO,WAAW,SAAsB,SAAkB;AACxD,QAAI,QAAQ,IAAI,aAAa,eAAe;AAC1C,cAAQ,IAAI,cAAc,UAAU,IAAI,OAAO,KAAK,EAAE,KAAK,QAAQ,MAAM,IAAI,QAAQ,GAAG,EAAE;AAAA,IAC5F;AAAA,EACF;AAAA,EAEA,OAAO,SAAS,OAAY,SAAkB;AAC5C,YAAQ,MAAM,cAAc,UAAU,IAAI,OAAO,KAAK,EAAE,WAAW,KAAK;AAAA,EAC1E;AAAA,EAEA,OAAO,WAAW,SAAiB,SAAkB;AACnD,YAAQ,KAAK,cAAc,UAAU,IAAI,OAAO,KAAK,EAAE,aAAa,OAAO;AAAA,EAC7E;AACF;","names":[]}
@@ -0,0 +1,189 @@
1
+ import { NextResponse } from "next/server";
2
+ import { createApiErrorResponse } from "./responses";
3
+ class CorsValidator {
4
+ static async validate(request, corsOptions) {
5
+ const origin = request.headers.get("origin");
6
+ const host = request.headers.get("host");
7
+ if (!origin || host && origin.includes(host)) {
8
+ return null;
9
+ }
10
+ if (corsOptions.allowedOrigins !== "*") {
11
+ const isAllowed = corsOptions.allowedOrigins.some((allowedOrigin) => {
12
+ if (allowedOrigin.startsWith("*")) {
13
+ const domain = allowedOrigin.slice(1);
14
+ return origin?.endsWith(domain);
15
+ }
16
+ return origin === allowedOrigin;
17
+ });
18
+ if (!isAllowed) {
19
+ return createApiErrorResponse("CORS_ORIGIN_NOT_ALLOWED", "Origin not allowed", 403);
20
+ }
21
+ }
22
+ return null;
23
+ }
24
+ static createOptionsResponse(corsOptions) {
25
+ const response = new NextResponse(null, { status: 204 });
26
+ if (corsOptions.allowedOrigins === "*") {
27
+ response.headers.set("Access-Control-Allow-Origin", "*");
28
+ } else {
29
+ response.headers.set("Access-Control-Allow-Origin", corsOptions.allowedOrigins.join(","));
30
+ }
31
+ response.headers.set(
32
+ "Access-Control-Allow-Methods",
33
+ corsOptions.allowedMethods?.join(",") || "GET,POST"
34
+ );
35
+ response.headers.set(
36
+ "Access-Control-Allow-Headers",
37
+ corsOptions.allowedHeaders?.join(",") || "Content-Type,Authorization"
38
+ );
39
+ if (corsOptions.allowCredentials) {
40
+ response.headers.set("Access-Control-Allow-Credentials", "true");
41
+ }
42
+ if (corsOptions.maxAge) {
43
+ response.headers.set("Access-Control-Max-Age", corsOptions.maxAge.toString());
44
+ }
45
+ return response;
46
+ }
47
+ }
48
+ class SecurityValidator {
49
+ static async validate(request, securityOptions) {
50
+ const origin = request.headers.get("origin");
51
+ const host = request.headers.get("host");
52
+ const referer = request.headers.get("referer");
53
+ const userAgent = request.headers.get("user-agent") || "";
54
+ const csrfResult = this.validateCsrf(request, securityOptions, origin, host, referer);
55
+ if (csrfResult) return csrfResult;
56
+ const headersResult = this.validateRequiredHeaders(request, securityOptions);
57
+ if (headersResult) return headersResult;
58
+ const userAgentResult = this.validateUserAgent(userAgent, securityOptions);
59
+ if (userAgentResult) return userAgentResult;
60
+ return null;
61
+ }
62
+ static validateCsrf(request, securityOptions, origin, host, referer) {
63
+ if (securityOptions.requireCSRF && origin && host && !origin.includes(host)) {
64
+ const hasCSRFHeader = request.headers.get("x-requested-with") === "XMLHttpRequest";
65
+ const hasValidReferer = referer && host && referer.includes(host);
66
+ if (!hasCSRFHeader && !hasValidReferer) {
67
+ const isAllowedReferer = securityOptions.allowedReferers?.some(
68
+ (allowedRef) => referer?.includes(allowedRef)
69
+ );
70
+ if (!isAllowedReferer) {
71
+ return createApiErrorResponse("CSRF_PROTECTION", "Access denied", 403);
72
+ }
73
+ }
74
+ }
75
+ return null;
76
+ }
77
+ static validateRequiredHeaders(request, securityOptions) {
78
+ if (securityOptions.requiredHeaders) {
79
+ for (const [headerName, expectedValue] of Object.entries(securityOptions.requiredHeaders)) {
80
+ const actualValue = request.headers.get(headerName);
81
+ if (actualValue !== expectedValue) {
82
+ return createApiErrorResponse(
83
+ "INVALID_HEADERS",
84
+ "Required header missing or invalid",
85
+ 400
86
+ );
87
+ }
88
+ }
89
+ }
90
+ return null;
91
+ }
92
+ static validateUserAgent(userAgent, securityOptions) {
93
+ if (securityOptions.userAgent?.block?.length) {
94
+ const isBlocked = securityOptions.userAgent.block.some(
95
+ (blocked) => userAgent.toLowerCase().includes(blocked.toLowerCase())
96
+ );
97
+ if (isBlocked) {
98
+ return createApiErrorResponse("USER_AGENT_BLOCKED", "Access denied", 403);
99
+ }
100
+ }
101
+ if (securityOptions.userAgent?.allow?.length) {
102
+ const isAllowed = securityOptions.userAgent.allow.some(
103
+ (allowed) => userAgent.toLowerCase().includes(allowed.toLowerCase())
104
+ );
105
+ if (!isAllowed) {
106
+ return createApiErrorResponse("USER_AGENT_NOT_ALLOWED", "Access denied", 403);
107
+ }
108
+ }
109
+ return null;
110
+ }
111
+ }
112
+ class CsrfValidator {
113
+ static validate(csrfToken, csrfCookieValue) {
114
+ if (!csrfToken) {
115
+ return createApiErrorResponse("INVALID_CSRF_TOKEN", "CSRF token is required", 400);
116
+ }
117
+ if (!csrfCookieValue) {
118
+ return createApiErrorResponse("CSRF_COOKIE_MISSING", "CSRF token cookie not found", 403);
119
+ }
120
+ if (csrfToken !== csrfCookieValue) {
121
+ return createApiErrorResponse("CSRF_TOKEN_MISMATCH", "CSRF token mismatch", 403);
122
+ }
123
+ return null;
124
+ }
125
+ }
126
+ class RouteValidator {
127
+ static validatePathStructure(pathSegments) {
128
+ if (pathSegments.length < 3) {
129
+ return createApiErrorResponse(
130
+ "INVALID_ROUTE",
131
+ "Invalid route structure. Expected: /api/auth/{endpoint}",
132
+ 404
133
+ );
134
+ }
135
+ return null;
136
+ }
137
+ static validateEndpoint(_endpoint, endpointConfig, method) {
138
+ if (!endpointConfig || !endpointConfig.enabled) {
139
+ return createApiErrorResponse("ENDPOINT_NOT_FOUND", "Endpoint not found", 404);
140
+ }
141
+ if (method !== "OPTIONS" && !endpointConfig.methods.includes(method)) {
142
+ return createApiErrorResponse("METHOD_NOT_ALLOWED", "Method not allowed", 405);
143
+ }
144
+ return null;
145
+ }
146
+ static validateSubEndpoint(subEndpoint, subEndpointConfig, method) {
147
+ if (!subEndpoint) {
148
+ return createApiErrorResponse("SUB_ENDPOINT_REQUIRED", "Session sub-endpoint required", 400);
149
+ }
150
+ if (!subEndpointConfig || !subEndpointConfig.enabled) {
151
+ return createApiErrorResponse("ENDPOINT_NOT_FOUND", "Endpoint not found", 404);
152
+ }
153
+ if (!subEndpointConfig.methods?.includes(method)) {
154
+ return createApiErrorResponse("METHOD_NOT_ALLOWED", "Method not allowed", 405);
155
+ }
156
+ return null;
157
+ }
158
+ }
159
+ class RequestValidator {
160
+ static async validateSessionRequest(request) {
161
+ try {
162
+ const body = await request.json();
163
+ return { body, idToken: body.idToken, csrfToken: body.csrfToken };
164
+ } catch (error) {
165
+ return {
166
+ body: null,
167
+ error: createApiErrorResponse("INVALID_REQUEST_FORMAT", "Invalid request format", 400)
168
+ };
169
+ }
170
+ }
171
+ static validateIdToken(idToken) {
172
+ if (!idToken) {
173
+ return createApiErrorResponse(
174
+ "INVALID_TOKEN",
175
+ "ID token is required for creating session",
176
+ 400
177
+ );
178
+ }
179
+ return null;
180
+ }
181
+ }
182
+ export {
183
+ CorsValidator,
184
+ CsrfValidator,
185
+ RequestValidator,
186
+ RouteValidator,
187
+ SecurityValidator
188
+ };
189
+ //# sourceMappingURL=validators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/app-router/admin/validators.ts"],"sourcesContent":["import type { NextRequest} from 'next/server';\nimport { NextResponse } from 'next/server';\n\nimport { createApiErrorResponse } from './responses';\nimport type { AuthEndpoint, CorsOptions, SecurityOptions, SessionSubEndpoint } from './types';\n\n/**\n * CORS validation utilities\n */\nexport class CorsValidator {\n static async validate(\n request: NextRequest,\n corsOptions: CorsOptions,\n ): Promise<NextResponse | null> {\n const origin = request.headers.get('origin');\n const host = request.headers.get('host');\n\n // Skip CORS for same-origin requests\n if (!origin || (host && origin.includes(host))) {\n return null;\n }\n\n if (corsOptions.allowedOrigins !== '*') {\n const isAllowed = corsOptions.allowedOrigins.some(allowedOrigin => {\n if (allowedOrigin.startsWith('*')) {\n const domain = allowedOrigin.slice(1);\n return origin?.endsWith(domain);\n }\n return origin === allowedOrigin;\n });\n\n if (!isAllowed) {\n return createApiErrorResponse('CORS_ORIGIN_NOT_ALLOWED', 'Origin not allowed', 403);\n }\n }\n\n return null;\n }\n\n static createOptionsResponse(corsOptions: CorsOptions): NextResponse {\n const response = new NextResponse(null, { status: 204 });\n\n if (corsOptions.allowedOrigins === '*') {\n response.headers.set('Access-Control-Allow-Origin', '*');\n } else {\n response.headers.set('Access-Control-Allow-Origin', corsOptions.allowedOrigins.join(','));\n }\n\n response.headers.set(\n 'Access-Control-Allow-Methods',\n corsOptions.allowedMethods?.join(',') || 'GET,POST',\n );\n response.headers.set(\n 'Access-Control-Allow-Headers',\n corsOptions.allowedHeaders?.join(',') || 'Content-Type,Authorization',\n );\n\n if (corsOptions.allowCredentials) {\n response.headers.set('Access-Control-Allow-Credentials', 'true');\n }\n\n if (corsOptions.maxAge) {\n response.headers.set('Access-Control-Max-Age', corsOptions.maxAge.toString());\n }\n\n return response;\n }\n}\n\n/**\n * Security validation utilities\n */\nexport class SecurityValidator {\n static async validate(\n request: NextRequest,\n securityOptions: SecurityOptions,\n ): Promise<NextResponse | null> {\n const origin = request.headers.get('origin');\n const host = request.headers.get('host');\n const referer = request.headers.get('referer');\n const userAgent = request.headers.get('user-agent') || '';\n\n // CSRF Protection for cross-origin requests\n const csrfResult = this.validateCsrf(request, securityOptions, origin, host, referer);\n if (csrfResult) return csrfResult;\n\n // Required headers validation\n const headersResult = this.validateRequiredHeaders(request, securityOptions);\n if (headersResult) return headersResult;\n\n // User Agent filtering\n const userAgentResult = this.validateUserAgent(userAgent, securityOptions);\n if (userAgentResult) return userAgentResult;\n\n return null;\n }\n\n private static validateCsrf(\n request: NextRequest,\n securityOptions: SecurityOptions,\n origin: string | null,\n host: string | null,\n referer: string | null,\n ): NextResponse | null {\n if (securityOptions.requireCSRF && origin && host && !origin.includes(host)) {\n const hasCSRFHeader = request.headers.get('x-requested-with') === 'XMLHttpRequest';\n const hasValidReferer = referer && host && referer.includes(host);\n\n if (!hasCSRFHeader && !hasValidReferer) {\n const isAllowedReferer = securityOptions.allowedReferers?.some((allowedRef: string) =>\n referer?.includes(allowedRef),\n );\n\n if (!isAllowedReferer) {\n return createApiErrorResponse('CSRF_PROTECTION', 'Access denied', 403);\n }\n }\n }\n return null;\n }\n\n private static validateRequiredHeaders(\n request: NextRequest,\n securityOptions: SecurityOptions,\n ): NextResponse | null {\n if (securityOptions.requiredHeaders) {\n for (const [headerName, expectedValue] of Object.entries(securityOptions.requiredHeaders)) {\n const actualValue = request.headers.get(headerName);\n if (actualValue !== expectedValue) {\n return createApiErrorResponse(\n 'INVALID_HEADERS',\n 'Required header missing or invalid',\n 400,\n );\n }\n }\n }\n return null;\n }\n\n private static validateUserAgent(\n userAgent: string,\n securityOptions: SecurityOptions,\n ): NextResponse | null {\n // User Agent blocking\n if (securityOptions.userAgent?.block?.length) {\n const isBlocked = securityOptions.userAgent.block.some((blocked: string) =>\n userAgent.toLowerCase().includes(blocked.toLowerCase()),\n );\n\n if (isBlocked) {\n return createApiErrorResponse('USER_AGENT_BLOCKED', 'Access denied', 403);\n }\n }\n\n // User Agent allowlist\n if (securityOptions.userAgent?.allow?.length) {\n const isAllowed = securityOptions.userAgent.allow.some((allowed: string) =>\n userAgent.toLowerCase().includes(allowed.toLowerCase()),\n );\n\n if (!isAllowed) {\n return createApiErrorResponse('USER_AGENT_NOT_ALLOWED', 'Access denied', 403);\n }\n }\n\n return null;\n }\n}\n\n/**\n * CSRF token validation utilities\n */\nexport class CsrfValidator {\n static validate(csrfToken: string, csrfCookieValue: string | undefined): NextResponse | null {\n if (!csrfToken) {\n return createApiErrorResponse('INVALID_CSRF_TOKEN', 'CSRF token is required', 400);\n }\n\n if (!csrfCookieValue) {\n return createApiErrorResponse('CSRF_COOKIE_MISSING', 'CSRF token cookie not found', 403);\n }\n\n if (csrfToken !== csrfCookieValue) {\n return createApiErrorResponse('CSRF_TOKEN_MISMATCH', 'CSRF token mismatch', 403);\n }\n\n return null;\n }\n}\n\n/**\n * Route validation utilities\n */\nexport class RouteValidator {\n static validatePathStructure(pathSegments: string[]): NextResponse | null {\n if (pathSegments.length < 3) {\n return createApiErrorResponse(\n 'INVALID_ROUTE',\n 'Invalid route structure. Expected: /api/auth/{endpoint}',\n 404,\n );\n }\n return null;\n }\n\n static validateEndpoint(\n _endpoint: AuthEndpoint,\n endpointConfig: any,\n method: string,\n ): NextResponse | null {\n if (!endpointConfig || !endpointConfig.enabled) {\n return createApiErrorResponse('ENDPOINT_NOT_FOUND', 'Endpoint not found', 404);\n }\n\n if (method !== 'OPTIONS' && !endpointConfig.methods.includes(method as any)) {\n return createApiErrorResponse('METHOD_NOT_ALLOWED', 'Method not allowed', 405);\n }\n\n return null;\n }\n\n static validateSubEndpoint(\n subEndpoint: SessionSubEndpoint | undefined,\n subEndpointConfig: any,\n method: string,\n ): NextResponse | null {\n if (!subEndpoint) {\n return createApiErrorResponse('SUB_ENDPOINT_REQUIRED', 'Session sub-endpoint required', 400);\n }\n\n if (!subEndpointConfig || !subEndpointConfig.enabled) {\n return createApiErrorResponse('ENDPOINT_NOT_FOUND', 'Endpoint not found', 404);\n }\n\n if (!subEndpointConfig.methods?.includes(method as any)) {\n return createApiErrorResponse('METHOD_NOT_ALLOWED', 'Method not allowed', 405);\n }\n\n return null;\n }\n}\n\n/**\n * Request body validation utilities\n */\nexport class RequestValidator {\n static async validateSessionRequest(request: NextRequest): Promise<{\n body: any;\n idToken?: string;\n csrfToken?: string;\n error?: NextResponse;\n }> {\n try {\n const body = await request.json();\n return { body, idToken: body.idToken, csrfToken: body.csrfToken };\n } catch (error) {\n return {\n body: null,\n error: createApiErrorResponse('INVALID_REQUEST_FORMAT', 'Invalid request format', 400),\n };\n }\n }\n\n static validateIdToken(idToken: string | undefined): NextResponse | null {\n if (!idToken) {\n return createApiErrorResponse(\n 'INVALID_TOKEN',\n 'ID token is required for creating session',\n 400,\n );\n }\n return null;\n }\n}\n"],"mappings":"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","names":[]}
@@ -1,16 +1,12 @@
1
- import { jsx, jsxs } from "react/jsx-runtime";
1
+ import { jsx } from "react/jsx-runtime";
2
2
  import {
3
3
  TernSecureProvider as TernSecureReactProvider
4
4
  } from "@tern-secure/react";
5
5
  import { allNextProviderPropsWithEnv } from "../../utils/allNextProviderProps";
6
- import { TernUIScript } from "../../utils/tern-ui-script";
7
6
  function TernSecureProvider(props) {
8
7
  const { children, enableServiceWorker, ...nextProps } = props;
9
8
  const providerProps = allNextProviderPropsWithEnv(nextProps);
10
- return /* @__PURE__ */ jsxs(TernSecureReactProvider, { ...providerProps, children: [
11
- /* @__PURE__ */ jsx(TernUIScript, { router: "app" }),
12
- children
13
- ] });
9
+ return /* @__PURE__ */ jsx(TernSecureReactProvider, { ...providerProps, children });
14
10
  }
15
11
  export {
16
12
  TernSecureProvider
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/app-router/client/TernSecureProvider.tsx"],"sourcesContent":["import React from \"react\"\r\nimport { \r\n TernSecureProvider as TernSecureReactProvider \r\n} from \"@tern-secure/react\"\r\nimport type { TernSecureNextProps } from \"../../types\"\r\nimport { allNextProviderPropsWithEnv } from \"../../utils/allNextProviderProps\"\r\nimport { TernUIScript } from \"../../utils/tern-ui-script\";\r\n\r\n\r\n\r\n// Loading fallback component\r\n/*function TernSecureLoadingFallback() {\r\n return (\r\n <div>\r\n <span className=\"sr-only\">Loading...</span>\r\n </div>\r\n )\r\n}*/\r\n/**\r\n * Root Provider for TernSecure\r\n * Use this in your Next.js App Router root layout\r\n * Automatically handles client/server boundary and authentication state\r\n * \r\n * @example\r\n * /// app/layout.tsx\r\n * import { TernSecureProvider } from '@tern/secure'\r\n * \r\n * export default function RootLayout({ children }) {\r\n * return (\r\n * <html>\r\n * <body>\r\n * <TernSecureProvider>\r\n * {children}\r\n * </TernSecureProvider>\r\n * </body>\r\n * </html>\r\n * )\r\n * }\r\n */\r\nexport function TernSecureProvider(props: React.PropsWithChildren<TernSecureNextProps>) {\r\n const {children, enableServiceWorker, ...nextProps } = props;\r\n const providerProps = allNextProviderPropsWithEnv(nextProps);\r\n return (\r\n <TernSecureReactProvider {...providerProps}>\r\n <TernUIScript router='app' />\r\n {children}\r\n </TernSecureReactProvider>\r\n )\r\n}"],"mappings":"AA2CI,SACE,KADF;AA1CJ;AAAA,EACE,sBAAsB;AAAA,OACjB;AAEP,SAAS,mCAAmC;AAC5C,SAAS,oBAAoB;AAiCtB,SAAS,mBAAmB,OAAqD;AACtF,QAAM,EAAC,UAAU,qBAAqB,GAAG,UAAU,IAAI;AACvD,QAAM,gBAAgB,4BAA4B,SAAS;AAC3D,SACE,qBAAC,2BAAyB,GAAG,eAC3B;AAAA,wBAAC,gBAAa,QAAO,OAAM;AAAA,IACxB;AAAA,KACL;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../../src/app-router/client/TernSecureProvider.tsx"],"sourcesContent":["import { \r\n TernSecureProvider as TernSecureReactProvider \r\n} from \"@tern-secure/react\"\r\nimport React from \"react\"\r\n\r\nimport type { TernSecureNextProps } from \"../../types\"\r\nimport { allNextProviderPropsWithEnv } from \"../../utils/allNextProviderProps\"\r\n\r\n\r\n\r\n// Loading fallback component\r\n/*function TernSecureLoadingFallback() {\r\n return (\r\n <div>\r\n <span className=\"sr-only\">Loading...</span>\r\n </div>\r\n )\r\n}*/\r\n/**\r\n * Root Provider for TernSecure\r\n * Use this in your Next.js App Router root layout\r\n * Automatically handles client/server boundary and authentication state\r\n * \r\n * @example\r\n * /// app/layout.tsx\r\n * import { TernSecureProvider } from '@tern/secure'\r\n * \r\n * export default function RootLayout({ children }) {\r\n * return (\r\n * <html>\r\n * <body>\r\n * <TernSecureProvider>\r\n * {children}\r\n * </TernSecureProvider>\r\n * </body>\r\n * </html>\r\n * )\r\n * }\r\n */\r\nexport function TernSecureProvider(props: React.PropsWithChildren<TernSecureNextProps>) {\r\n const {children, enableServiceWorker, ...nextProps } = props;\r\n const providerProps = allNextProviderPropsWithEnv(nextProps);\r\n return (\r\n <TernSecureReactProvider {...providerProps}>\r\n {children}\r\n </TernSecureReactProvider>\r\n )\r\n}"],"mappings":"AA2CI;AA3CJ;AAAA,EACE,sBAAsB;AAAA,OACjB;AAIP,SAAS,mCAAmC;AAiCrC,SAAS,mBAAmB,OAAqD;AACtF,QAAM,EAAC,UAAU,qBAAqB,GAAG,UAAU,IAAI;AACvD,QAAM,gBAAgB,4BAA4B,SAAS;AAC3D,SACE,oBAAC,2BAAyB,GAAG,eACxB,UACL;AAEJ;","names":[]}
@@ -0,0 +1,81 @@
1
+ import {
2
+ AuthStatus,
3
+ createTernSecureRequest,
4
+ signedInAuthObject,
5
+ signedOutAuthObject
6
+ } from "@tern-secure/backend";
7
+ import { ternDecodeJwt } from "@tern-secure/backend/jwt";
8
+ import { notFound, redirect } from "next/navigation";
9
+ import { SIGN_IN_URL, SIGN_UP_URL } from "../../server/constant";
10
+ import { getAuthKeyFromRequest } from "../../server/headers-utils";
11
+ import { createProtect } from "../../server/protect";
12
+ import { createRedirect } from "../../server/redirect";
13
+ import { buildRequestLike } from "./utils";
14
+ const createAuthObject = () => {
15
+ return async (req) => {
16
+ return getAuthDataFromRequest(req);
17
+ };
18
+ };
19
+ function getAuthDataFromRequest(req) {
20
+ const authStatus = getAuthKeyFromRequest(req, "AuthStatus");
21
+ const authToken = getAuthKeyFromRequest(req, "AuthToken");
22
+ const authSignature = getAuthKeyFromRequest(req, "AuthSignature");
23
+ const authReason = getAuthKeyFromRequest(req, "AuthReason");
24
+ let authObject;
25
+ if (!authStatus || authStatus !== AuthStatus.SignedIn) {
26
+ authObject = signedOutAuthObject();
27
+ } else {
28
+ const jwt = ternDecodeJwt(authToken);
29
+ authObject = signedInAuthObject(jwt.raw.text, jwt.payload);
30
+ }
31
+ return authObject;
32
+ }
33
+ const auth = async () => {
34
+ require("server-only");
35
+ const request = await buildRequestLike();
36
+ const authObject = await createAuthObject()(request);
37
+ const ternUrl = getAuthKeyFromRequest(request, "TernSecureUrl");
38
+ const createRedirectForRequest = (...args) => {
39
+ const { returnBackUrl } = args[0] || {};
40
+ const ternSecureRequest = createTernSecureRequest(request);
41
+ return [
42
+ createRedirect({
43
+ redirectAdapter: redirect,
44
+ baseUrl: ternSecureRequest.ternUrl.toString(),
45
+ signInUrl: SIGN_IN_URL,
46
+ signUpUrl: SIGN_UP_URL
47
+ }),
48
+ returnBackUrl === null ? "" : returnBackUrl || ternUrl?.toString()
49
+ ];
50
+ };
51
+ const redirectToSignIn = (opts = {}) => {
52
+ const [r, returnBackUrl] = createRedirectForRequest(opts);
53
+ return r.redirectToSignIn({
54
+ returnBackUrl
55
+ });
56
+ };
57
+ const redirectToSignUp = (opts = {}) => {
58
+ const [r, returnBackUrl] = createRedirectForRequest(opts);
59
+ return r.redirectToSignUp({
60
+ returnBackUrl
61
+ });
62
+ };
63
+ return Object.assign(authObject, { redirectToSignIn, redirectToSignUp });
64
+ };
65
+ auth.protect = async (...args) => {
66
+ require("server-only");
67
+ const request = await buildRequestLike();
68
+ const authObject = await auth();
69
+ const protect = createProtect({
70
+ request,
71
+ authObject,
72
+ redirectToSignIn: authObject.redirectToSignIn,
73
+ notFound,
74
+ redirect
75
+ });
76
+ return protect(...args);
77
+ };
78
+ export {
79
+ auth
80
+ };
81
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/app-router/server/auth.ts"],"sourcesContent":["import type { AuthObject } from '@tern-secure/backend';\r\nimport {\r\n AuthStatus,\r\n createTernSecureRequest,\r\n signedInAuthObject,\r\n signedOutAuthObject,\r\n} from '@tern-secure/backend';\r\nimport { ternDecodeJwt } from '@tern-secure/backend/jwt';\r\nimport { notFound, redirect } from 'next/navigation';\r\n\r\nimport { SIGN_IN_URL, SIGN_UP_URL } from '../../server/constant';\r\nimport { getAuthKeyFromRequest } from '../../server/headers-utils';\r\nimport { type AuthProtect,createProtect } from '../../server/protect';\r\nimport { createRedirect, type RedirectFun } from '../../server/redirect';\r\nimport type { BaseUser, RequestLike } from '../../server/types';\r\nimport { buildRequestLike } from './utils';\r\n\r\nexport interface AuthResult {\r\n user: BaseUser | null;\r\n error: Error | null;\r\n}\r\n\r\n/**\r\n * `Auth` object of the currently active user and the `redirectToSignIn()` method.\r\n */\r\ntype Auth = AuthObject & {\r\n redirectToSignIn: RedirectFun<ReturnType<typeof redirect>>;\r\n redirectToSignUp: RedirectFun<ReturnType<typeof redirect>>;\r\n};\r\n\r\nexport interface AuthFn {\r\n (): Promise<Auth>;\r\n\r\n protect: AuthProtect;\r\n}\r\n\r\nconst createAuthObject = () => {\r\n return async (req: RequestLike) => {\r\n return getAuthDataFromRequest(req);\r\n };\r\n};\r\n\r\nfunction getAuthDataFromRequest(req: RequestLike): AuthObject {\r\n const authStatus = getAuthKeyFromRequest(req, 'AuthStatus');\r\n const authToken = getAuthKeyFromRequest(req, 'AuthToken');\r\n const authSignature = getAuthKeyFromRequest(req, 'AuthSignature');\r\n const authReason = getAuthKeyFromRequest(req, 'AuthReason');\r\n\r\n let authObject;\r\n if (!authStatus || authStatus !== AuthStatus.SignedIn) {\r\n authObject = signedOutAuthObject();\r\n } else {\r\n const jwt = ternDecodeJwt(authToken as string);\r\n\r\n authObject = signedInAuthObject(jwt.raw.text, jwt.payload);\r\n }\r\n return authObject;\r\n}\r\n\r\n/**\r\n * Get the current authenticated user from the session or token\r\n */\r\nexport const auth: AuthFn = async () => {\r\n // eslint-disable-next-line @typescript-eslint/no-require-imports\r\n require('server-only');\r\n\r\n const request = await buildRequestLike();\r\n\r\n const authObject = await createAuthObject()(request);\r\n\r\n const ternUrl = getAuthKeyFromRequest(request, 'TernSecureUrl');\r\n\r\n const createRedirectForRequest = (...args: Parameters<RedirectFun<never>>) => {\r\n const { returnBackUrl } = args[0] || {};\r\n const ternSecureRequest = createTernSecureRequest(request);\r\n\r\n return [\r\n createRedirect({\r\n redirectAdapter: redirect,\r\n baseUrl: ternSecureRequest.ternUrl.toString(),\r\n signInUrl: SIGN_IN_URL,\r\n signUpUrl: SIGN_UP_URL,\r\n }),\r\n returnBackUrl === null ? '' : returnBackUrl || ternUrl?.toString(),\r\n ] as const;\r\n };\r\n\r\n const redirectToSignIn: RedirectFun<never> = (opts = {}) => {\r\n const [r, returnBackUrl] = createRedirectForRequest(opts);\r\n return r.redirectToSignIn({\r\n returnBackUrl,\r\n });\r\n };\r\n\r\n const redirectToSignUp: RedirectFun<never> = (opts = {}) => {\r\n const [r, returnBackUrl] = createRedirectForRequest(opts);\r\n return r.redirectToSignUp({\r\n returnBackUrl,\r\n });\r\n };\r\n\r\n return Object.assign(authObject, { redirectToSignIn, redirectToSignUp });\r\n};\r\n\r\nauth.protect = async (...args: any[]) => {\r\n // eslint-disable-next-line @typescript-eslint/no-require-imports\r\n require('server-only');\r\n\r\n const request = await buildRequestLike();\r\n const authObject = await auth();\r\n\r\n const protect = createProtect({\r\n request,\r\n authObject,\r\n redirectToSignIn: authObject.redirectToSignIn,\r\n notFound,\r\n redirect,\r\n });\r\n\r\n return protect(...args);\r\n};\r\n"],"mappings":"AACA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,qBAAqB;AAC9B,SAAS,UAAU,gBAAgB;AAEnC,SAAS,aAAa,mBAAmB;AACzC,SAAS,6BAA6B;AACtC,SAA0B,qBAAqB;AAC/C,SAAS,sBAAwC;AAEjD,SAAS,wBAAwB;AAqBjC,MAAM,mBAAmB,MAAM;AAC7B,SAAO,OAAO,QAAqB;AACjC,WAAO,uBAAuB,GAAG;AAAA,EACnC;AACF;AAEA,SAAS,uBAAuB,KAA8B;AAC5D,QAAM,aAAa,sBAAsB,KAAK,YAAY;AAC1D,QAAM,YAAY,sBAAsB,KAAK,WAAW;AACxD,QAAM,gBAAgB,sBAAsB,KAAK,eAAe;AAChE,QAAM,aAAa,sBAAsB,KAAK,YAAY;AAE1D,MAAI;AACJ,MAAI,CAAC,cAAc,eAAe,WAAW,UAAU;AACrD,iBAAa,oBAAoB;AAAA,EACnC,OAAO;AACL,UAAM,MAAM,cAAc,SAAmB;AAE7C,iBAAa,mBAAmB,IAAI,IAAI,MAAM,IAAI,OAAO;AAAA,EAC3D;AACA,SAAO;AACT;AAKO,MAAM,OAAe,YAAY;AAEtC,UAAQ,aAAa;AAErB,QAAM,UAAU,MAAM,iBAAiB;AAEvC,QAAM,aAAa,MAAM,iBAAiB,EAAE,OAAO;AAEnD,QAAM,UAAU,sBAAsB,SAAS,eAAe;AAE9D,QAAM,2BAA2B,IAAI,SAAyC;AAC5E,UAAM,EAAE,cAAc,IAAI,KAAK,CAAC,KAAK,CAAC;AACtC,UAAM,oBAAoB,wBAAwB,OAAO;AAEzD,WAAO;AAAA,MACL,eAAe;AAAA,QACb,iBAAiB;AAAA,QACjB,SAAS,kBAAkB,QAAQ,SAAS;AAAA,QAC5C,WAAW;AAAA,QACX,WAAW;AAAA,MACb,CAAC;AAAA,MACD,kBAAkB,OAAO,KAAK,iBAAiB,SAAS,SAAS;AAAA,IACnE;AAAA,EACF;AAEA,QAAM,mBAAuC,CAAC,OAAO,CAAC,MAAM;AAC1D,UAAM,CAAC,GAAG,aAAa,IAAI,yBAAyB,IAAI;AACxD,WAAO,EAAE,iBAAiB;AAAA,MACxB;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,mBAAuC,CAAC,OAAO,CAAC,MAAM;AAC1D,UAAM,CAAC,GAAG,aAAa,IAAI,yBAAyB,IAAI;AACxD,WAAO,EAAE,iBAAiB;AAAA,MACxB;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,OAAO,OAAO,YAAY,EAAE,kBAAkB,iBAAiB,CAAC;AACzE;AAEA,KAAK,UAAU,UAAU,SAAgB;AAEvC,UAAQ,aAAa;AAErB,QAAM,UAAU,MAAM,iBAAiB;AACvC,QAAM,aAAa,MAAM,KAAK;AAE9B,QAAM,UAAU,cAAc;AAAA,IAC5B;AAAA,IACA;AAAA,IACA,kBAAkB,WAAW;AAAA,IAC7B;AAAA,IACA;AAAA,EACF,CAAC;AAED,SAAO,QAAQ,GAAG,IAAI;AACxB;","names":[]}
@@ -0,0 +1,51 @@
1
+ import { NextRequest } from "next/server";
2
+ const isPrerenderingBailout = (e) => {
3
+ if (!(e instanceof Error) || !("message" in e)) {
4
+ return false;
5
+ }
6
+ const { message } = e;
7
+ const lowerCaseInput = message.toLowerCase();
8
+ const dynamicServerUsage = lowerCaseInput.includes("dynamic server usage");
9
+ const bailOutPrerendering = lowerCaseInput.includes("this page needs to bail out of prerendering");
10
+ const routeRegex = /Route .*? needs to bail out of prerendering at this point because it used .*?./;
11
+ return routeRegex.test(message) || dynamicServerUsage || bailOutPrerendering;
12
+ };
13
+ async function buildRequestLike() {
14
+ try {
15
+ const { headers } = await import("next/headers");
16
+ const resolvedHeaders = await headers();
17
+ return new NextRequest("https://placeholder.com", { headers: resolvedHeaders });
18
+ } catch (e) {
19
+ if (e && isPrerenderingBailout(e)) {
20
+ throw e;
21
+ }
22
+ throw new Error(
23
+ `Clerk: auth(), currentUser() and clerkClient(), are only supported in App Router (/app directory).
24
+ If you're using /pages, try getAuth() instead.
25
+ Original error: ${e}`
26
+ );
27
+ }
28
+ }
29
+ function getScriptNonceFromHeader(cspHeaderValue) {
30
+ const directives = cspHeaderValue.split(";").map((directive2) => directive2.trim());
31
+ const directive = directives.find((dir) => dir.startsWith("script-src")) || directives.find((dir) => dir.startsWith("default-src"));
32
+ if (!directive) {
33
+ return;
34
+ }
35
+ const nonce = directive.split(" ").slice(1).map((source) => source.trim()).find((source) => source.startsWith("'nonce-") && source.length > 8 && source.endsWith("'"))?.slice(7, -1);
36
+ if (!nonce) {
37
+ return;
38
+ }
39
+ if (/[&><\u2028\u2029]/g.test(nonce)) {
40
+ throw new Error(
41
+ "Nonce value from Content-Security-Policy contained invalid HTML escape characters, which is disallowed for security reasons. Make sure that your nonce value does not contain the following characters: `<`, `>`, `&`"
42
+ );
43
+ }
44
+ return nonce;
45
+ }
46
+ export {
47
+ buildRequestLike,
48
+ getScriptNonceFromHeader,
49
+ isPrerenderingBailout
50
+ };
51
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/app-router/server/utils.ts"],"sourcesContent":["import { NextRequest } from 'next/server';\r\n\r\nexport const isPrerenderingBailout = (e: unknown) => {\r\n if (!(e instanceof Error) || !('message' in e)) {\r\n return false;\r\n }\r\n\r\n const { message } = e;\r\n\r\n const lowerCaseInput = message.toLowerCase();\r\n const dynamicServerUsage = lowerCaseInput.includes('dynamic server usage');\r\n const bailOutPrerendering = lowerCaseInput.includes('this page needs to bail out of prerendering');\r\n\r\n // note: new error message syntax introduced in next@14.1.1-canary.21\r\n // but we still want to support older versions.\r\n // https://github.com/vercel/next.js/pull/61332 (dynamic-rendering.ts:153)\r\n const routeRegex = /Route .*? needs to bail out of prerendering at this point because it used .*?./;\r\n\r\n return routeRegex.test(message) || dynamicServerUsage || bailOutPrerendering;\r\n};\r\n\r\nexport async function buildRequestLike(): Promise<NextRequest> {\r\n try {\r\n // Dynamically import next/headers, otherwise Next12 apps will break\r\n // @ts-expect-error: Cannot find module 'next/headers' or its corresponding type declarations.ts(2307)\r\n const { headers } = await import('next/headers');\r\n const resolvedHeaders = await headers();\r\n return new NextRequest('https://placeholder.com', { headers: resolvedHeaders });\r\n } catch (e: any) {\r\n // rethrow the error when react throws a prerendering bailout\r\n // https://nextjs.org/docs/messages/ppr-caught-error\r\n if (e && isPrerenderingBailout(e)) {\r\n throw e;\r\n }\r\n\r\n throw new Error(\r\n `Clerk: auth(), currentUser() and clerkClient(), are only supported in App Router (/app directory).\\nIf you're using /pages, try getAuth() instead.\\nOriginal error: ${e}`,\r\n );\r\n }\r\n}\r\n\r\n// Original source: https://github.com/vercel/next.js/blob/canary/packages/next/src/server/app-render/get-script-nonce-from-header.tsx\r\nexport function getScriptNonceFromHeader(cspHeaderValue: string): string | undefined {\r\n const directives = cspHeaderValue\r\n // Directives are split by ';'.\r\n .split(';')\r\n .map(directive => directive.trim());\r\n\r\n // First try to find the directive for the 'script-src', otherwise try to\r\n // fallback to the 'default-src'.\r\n const directive =\r\n directives.find(dir => dir.startsWith('script-src')) || directives.find(dir => dir.startsWith('default-src'));\r\n\r\n // If no directive could be found, then we're done.\r\n if (!directive) {\r\n return;\r\n }\r\n\r\n // Extract the nonce from the directive\r\n const nonce = directive\r\n .split(' ')\r\n // Remove the 'strict-src'/'default-src' string, this can't be the nonce.\r\n .slice(1)\r\n .map(source => source.trim())\r\n // Find the first source with the 'nonce-' prefix.\r\n .find(source => source.startsWith(\"'nonce-\") && source.length > 8 && source.endsWith(\"'\"))\r\n // Grab the nonce by trimming the 'nonce-' prefix.\r\n ?.slice(7, -1);\r\n\r\n // If we couldn't find the nonce, then we're done.\r\n if (!nonce) {\r\n return;\r\n }\r\n\r\n // Don't accept the nonce value if it contains HTML escape characters.\r\n // Technically, the spec requires a base64'd value, but this is just an\r\n // extra layer.\r\n if (/[&><\\u2028\\u2029]/g.test(nonce)) {\r\n throw new Error(\r\n 'Nonce value from Content-Security-Policy contained invalid HTML escape characters, which is disallowed for security reasons. Make sure that your nonce value does not contain the following characters: `<`, `>`, `&`',\r\n );\r\n }\r\n\r\n return nonce;\r\n}\r\n"],"mappings":"AAAA,SAAS,mBAAmB;AAErB,MAAM,wBAAwB,CAAC,MAAe;AACnD,MAAI,EAAE,aAAa,UAAU,EAAE,aAAa,IAAI;AAC9C,WAAO;AAAA,EACT;AAEA,QAAM,EAAE,QAAQ,IAAI;AAEpB,QAAM,iBAAiB,QAAQ,YAAY;AAC3C,QAAM,qBAAqB,eAAe,SAAS,sBAAsB;AACzE,QAAM,sBAAsB,eAAe,SAAS,6CAA6C;AAKjG,QAAM,aAAa;AAEnB,SAAO,WAAW,KAAK,OAAO,KAAK,sBAAsB;AAC3D;AAEA,eAAsB,mBAAyC;AAC7D,MAAI;AAGF,UAAM,EAAE,QAAQ,IAAI,MAAM,OAAO,cAAc;AAC/C,UAAM,kBAAkB,MAAM,QAAQ;AACtC,WAAO,IAAI,YAAY,2BAA2B,EAAE,SAAS,gBAAgB,CAAC;AAAA,EAChF,SAAS,GAAQ;AAGf,QAAI,KAAK,sBAAsB,CAAC,GAAG;AACjC,YAAM;AAAA,IACR;AAEA,UAAM,IAAI;AAAA,MACR;AAAA;AAAA,kBAAuK,CAAC;AAAA,IAC1K;AAAA,EACF;AACF;AAGO,SAAS,yBAAyB,gBAA4C;AACnF,QAAM,aAAa,eAEhB,MAAM,GAAG,EACT,IAAI,CAAAA,eAAaA,WAAU,KAAK,CAAC;AAIpC,QAAM,YACJ,WAAW,KAAK,SAAO,IAAI,WAAW,YAAY,CAAC,KAAK,WAAW,KAAK,SAAO,IAAI,WAAW,aAAa,CAAC;AAG9G,MAAI,CAAC,WAAW;AACd;AAAA,EACF;AAGA,QAAM,QAAQ,UACX,MAAM,GAAG,EAET,MAAM,CAAC,EACP,IAAI,YAAU,OAAO,KAAK,CAAC,EAE3B,KAAK,YAAU,OAAO,WAAW,SAAS,KAAK,OAAO,SAAS,KAAK,OAAO,SAAS,GAAG,CAAC,GAEvF,MAAM,GAAG,EAAE;AAGf,MAAI,CAAC,OAAO;AACV;AAAA,EACF;AAKA,MAAI,qBAAqB,KAAK,KAAK,GAAG;AACpC,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;","names":["directive"]}
@@ -1,18 +1,15 @@
1
- "use client";
2
1
  import {
3
2
  useAuth,
4
3
  useIdToken,
5
- useSignUp,
6
4
  useSession,
7
- SignIn,
8
- SignUp
5
+ useSignIn,
6
+ signIn
9
7
  } from "@tern-secure/react";
10
8
  export {
11
- SignIn,
12
- SignUp,
9
+ signIn,
13
10
  useAuth,
14
11
  useIdToken,
15
12
  useSession,
16
- useSignUp
13
+ useSignIn
17
14
  };
18
15
  //# sourceMappingURL=components.js.map