@tern-secure/nextjs 5.1.8 → 5.1.10

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 (284) 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/package.json +21 -7
  200. package/server/node/package.json +5 -0
  201. package/server/package.json +5 -0
  202. package/dist/cjs/app-router/admin/sessionHandler.js +0 -74
  203. package/dist/cjs/app-router/admin/sessionHandler.js.map +0 -1
  204. package/dist/cjs/app-router/client/actions.js +0 -4
  205. package/dist/cjs/app-router/client/actions.js.map +0 -1
  206. package/dist/cjs/components/uiComponents.js.map +0 -1
  207. package/dist/cjs/server/auth.js.map +0 -1
  208. package/dist/cjs/server/ternSecureMiddleware.js +0 -95
  209. package/dist/cjs/server/ternSecureMiddleware.js.map +0 -1
  210. package/dist/cjs/utils/tern-ui-script.js +0 -78
  211. package/dist/cjs/utils/tern-ui-script.js.map +0 -1
  212. package/dist/esm/app-router/admin/sessionHandler.js +0 -50
  213. package/dist/esm/app-router/admin/sessionHandler.js.map +0 -1
  214. package/dist/esm/app-router/client/actions.js +0 -3
  215. package/dist/esm/app-router/client/actions.js.map +0 -1
  216. package/dist/esm/components/uiComponents.js +0 -21
  217. package/dist/esm/components/uiComponents.js.map +0 -1
  218. package/dist/esm/server/auth.js.map +0 -1
  219. package/dist/esm/server/ternSecureMiddleware.js +0 -69
  220. package/dist/esm/server/ternSecureMiddleware.js.map +0 -1
  221. package/dist/esm/utils/tern-ui-script.js +0 -44
  222. package/dist/esm/utils/tern-ui-script.js.map +0 -1
  223. package/dist/types/app-router/admin/index.d.ts +0 -2
  224. package/dist/types/app-router/admin/index.d.ts.map +0 -1
  225. package/dist/types/app-router/admin/sessionHandler.d.ts +0 -3
  226. package/dist/types/app-router/admin/sessionHandler.d.ts.map +0 -1
  227. package/dist/types/app-router/client/TernSecureProvider.d.ts +0 -25
  228. package/dist/types/app-router/client/TernSecureProvider.d.ts.map +0 -1
  229. package/dist/types/app-router/client/actions.d.ts +0 -2
  230. package/dist/types/app-router/client/actions.d.ts.map +0 -1
  231. package/dist/types/app-router/route-handler/internal-route.d.ts +0 -2
  232. package/dist/types/app-router/route-handler/internal-route.d.ts.map +0 -1
  233. package/dist/types/boundary/components.d.ts +0 -2
  234. package/dist/types/boundary/components.d.ts.map +0 -1
  235. package/dist/types/boundary/hooks.d.ts +0 -2
  236. package/dist/types/boundary/hooks.d.ts.map +0 -1
  237. package/dist/types/components/uiComponents.d.ts +0 -6
  238. package/dist/types/components/uiComponents.d.ts.map +0 -1
  239. package/dist/types/errors.d.ts +0 -44
  240. package/dist/types/errors.d.ts.map +0 -1
  241. package/dist/types/index.d.ts +0 -5
  242. package/dist/types/index.d.ts.map +0 -1
  243. package/dist/types/server/auth.d.ts +0 -23
  244. package/dist/types/server/auth.d.ts.map +0 -1
  245. package/dist/types/server/crypto.d.ts +0 -3
  246. package/dist/types/server/crypto.d.ts.map +0 -1
  247. package/dist/types/server/ctx-store.d.ts +0 -24
  248. package/dist/types/server/ctx-store.d.ts.map +0 -1
  249. package/dist/types/server/edge-session.d.ts +0 -4
  250. package/dist/types/server/edge-session.d.ts.map +0 -1
  251. package/dist/types/server/index.d.ts +0 -4
  252. package/dist/types/server/index.d.ts.map +0 -1
  253. package/dist/types/server/jwt-edge.d.ts +0 -20
  254. package/dist/types/server/jwt-edge.d.ts.map +0 -1
  255. package/dist/types/server/jwt.d.ts +0 -20
  256. package/dist/types/server/jwt.d.ts.map +0 -1
  257. package/dist/types/server/session-store.d.ts +0 -30
  258. package/dist/types/server/session-store.d.ts.map +0 -1
  259. package/dist/types/server/ternSecureMiddleware.d.ts +0 -20
  260. package/dist/types/server/ternSecureMiddleware.d.ts.map +0 -1
  261. package/dist/types/server/types.d.ts +0 -26
  262. package/dist/types/server/types.d.ts.map +0 -1
  263. package/dist/types/server/utils.d.ts +0 -22
  264. package/dist/types/server/utils.d.ts.map +0 -1
  265. package/dist/types/types.d.ts +0 -112
  266. package/dist/types/types.d.ts.map +0 -1
  267. package/dist/types/utils/admin-init.d.ts +0 -2
  268. package/dist/types/utils/admin-init.d.ts.map +0 -1
  269. package/dist/types/utils/allNextProviderProps.d.ts +0 -6
  270. package/dist/types/utils/allNextProviderProps.d.ts.map +0 -1
  271. package/dist/types/utils/client-init.d.ts +0 -2
  272. package/dist/types/utils/client-init.d.ts.map +0 -1
  273. package/dist/types/utils/config.d.ts +0 -35
  274. package/dist/types/utils/config.d.ts.map +0 -1
  275. package/dist/types/utils/construct.d.ts +0 -38
  276. package/dist/types/utils/construct.d.ts.map +0 -1
  277. package/dist/types/utils/create-styles.d.ts +0 -99
  278. package/dist/types/utils/create-styles.d.ts.map +0 -1
  279. package/dist/types/utils/redirect.d.ts +0 -9
  280. package/dist/types/utils/redirect.d.ts.map +0 -1
  281. package/dist/types/utils/tern-ui-script.d.ts +0 -9
  282. package/dist/types/utils/tern-ui-script.d.ts.map +0 -1
  283. package/dist/types/utils/ternsecure-sw.d.ts +0 -8
  284. package/dist/types/utils/ternsecure-sw.d.ts.map +0 -1
@@ -0,0 +1,17 @@
1
+ import {
2
+ constants
3
+ } from "@tern-secure/backend";
4
+ import { NextResponse } from "next/server";
5
+ const serverRedirectWithAuth = (ternSecureRequest, res) => {
6
+ const location = res.headers.get("location");
7
+ const shouldAppendDevBrowser = res.headers.get(constants.Headers.TernSecureRedirectTo) === "true";
8
+ if (shouldAppendDevBrowser && !!location && ternSecureRequest.ternUrl.isCrossOrigin(location)) {
9
+ const url = new URL(location);
10
+ return NextResponse.redirect(url.href, res);
11
+ }
12
+ return res;
13
+ };
14
+ export {
15
+ serverRedirectWithAuth
16
+ };
17
+ //# sourceMappingURL=serverRedirectAuth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/utils/serverRedirectAuth.ts"],"sourcesContent":["import type {\n TernSecureRequest,\n} from \"@tern-secure/backend\";\nimport {\n constants\n} from \"@tern-secure/backend\";\nimport { NextResponse } from 'next/server';\n\n/**\n * Grabs the dev browser JWT from cookies and appends it to the redirect URL when redirecting to cross-origin.\n */\nexport const serverRedirectWithAuth = (ternSecureRequest: TernSecureRequest, res: Response) => {\n const location = res.headers.get('location');\n const shouldAppendDevBrowser = res.headers.get(constants.Headers.TernSecureRedirectTo) === 'true';\n\n if (\n shouldAppendDevBrowser &&\n !!location &&\n ternSecureRequest.ternUrl.isCrossOrigin(location)\n ) {\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":"AAGA;AAAA,EACE;AAAA,OACK;AACP,SAAS,oBAAoB;AAKtB,MAAM,yBAAyB,CAAC,mBAAsC,QAAkB;AAC7F,QAAM,WAAW,IAAI,QAAQ,IAAI,UAAU;AAC3C,QAAM,yBAAyB,IAAI,QAAQ,IAAI,UAAU,QAAQ,oBAAoB,MAAM;AAE3F,MACE,0BACA,CAAC,CAAC,YACF,kBAAkB,QAAQ,cAAc,QAAQ,GAChD;AAEA,UAAM,MAAM,IAAI,IAAI,QAAQ;AAC5B,WAAO,aAAa,SAAS,IAAI,MAAM,GAAG;AAAA,EAC5C;AACA,SAAO;AACT;","names":[]}
@@ -1,6 +1,6 @@
1
1
  "use client";
2
- import { useEffect } from "react";
3
2
  import { reg } from "@tern-secure/shared/serviceWorker";
3
+ import { useEffect } from "react";
4
4
  const TernUIServiceWorker = ({
5
5
  ternSecureConfig,
6
6
  baseUrl = window.location.origin
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utils/ternsecure-sw.ts"],"sourcesContent":["'use client';\n\nimport { useEffect } from 'react';\nimport type { TernSecureConfig } from '@tern-secure/types';\nimport { reg } from '@tern-secure/shared/serviceWorker';\n\ninterface TernUIServiceWorkerProps {\n ternSecureConfig?: TernSecureConfig;\n baseUrl?: string;\n}\n\nexport const TernUIServiceWorker: React.FC<TernUIServiceWorkerProps> = ({ \n ternSecureConfig,\n baseUrl = window.location.origin \n}) => {\n useEffect(() => {\n const registerServiceWorker = async () => {\n if (!ternSecureConfig) {\n console.warn('[TernSecure] Service worker registration skipped: config not provided');\n return;\n }\n\n try {\n await reg({\n firebaseConfig: ternSecureConfig,\n domain: baseUrl\n });\n } catch (error) {\n console.error('[TernSecure] Service worker registration failed:', error);\n }\n };\n\n registerServiceWorker();\n }, [ternSecureConfig, baseUrl]);\n\n return null;\n};"],"mappings":";AAEA,SAAS,iBAAiB;AAE1B,SAAS,WAAW;AAOb,MAAM,sBAA0D,CAAC;AAAA,EACpE;AAAA,EACA,UAAU,OAAO,SAAS;AAC9B,MAAM;AACJ,YAAU,MAAM;AACd,UAAM,wBAAwB,YAAY;AACxC,UAAI,CAAC,kBAAkB;AACrB,gBAAQ,KAAK,uEAAuE;AACpF;AAAA,MACF;AAEA,UAAI;AACF,cAAM,IAAI;AAAA,UACR,gBAAgB;AAAA,UAChB,QAAQ;AAAA,QACV,CAAC;AAAA,MACH,SAAS,OAAO;AACd,gBAAQ,MAAM,oDAAoD,KAAK;AAAA,MACzE;AAAA,IACF;AAEA,0BAAsB;AAAA,EACxB,GAAG,CAAC,kBAAkB,OAAO,CAAC;AAE9B,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../../src/utils/ternsecure-sw.ts"],"sourcesContent":["'use client';\n\nimport { reg } from '@tern-secure/shared/serviceWorker';\nimport type { TernSecureConfig } from '@tern-secure/types';\nimport { useEffect } from 'react';\n\ninterface TernUIServiceWorkerProps {\n ternSecureConfig?: TernSecureConfig;\n baseUrl?: string;\n}\n\nexport const TernUIServiceWorker: React.FC<TernUIServiceWorkerProps> = ({ \n ternSecureConfig,\n baseUrl = window.location.origin \n}) => {\n useEffect(() => {\n const registerServiceWorker = async () => {\n if (!ternSecureConfig) {\n console.warn('[TernSecure] Service worker registration skipped: config not provided');\n return;\n }\n\n try {\n await reg({\n firebaseConfig: ternSecureConfig,\n domain: baseUrl\n });\n } catch (error) {\n console.error('[TernSecure] Service worker registration failed:', error);\n }\n };\n\n registerServiceWorker();\n }, [ternSecureConfig, baseUrl]);\n\n return null;\n};"],"mappings":";AAEA,SAAS,WAAW;AAEpB,SAAS,iBAAiB;AAOnB,MAAM,sBAA0D,CAAC;AAAA,EACpE;AAAA,EACA,UAAU,OAAO,SAAS;AAC9B,MAAM;AACJ,YAAU,MAAM;AACd,UAAM,wBAAwB,YAAY;AACxC,UAAI,CAAC,kBAAkB;AACrB,gBAAQ,KAAK,uEAAuE;AACpF;AAAA,MACF;AAEA,UAAI;AACF,cAAM,IAAI;AAAA,UACR,gBAAgB;AAAA,UAChB,QAAQ;AAAA,QACV,CAAC;AAAA,MACH,SAAS,OAAO;AACd,gBAAQ,MAAM,oDAAoD,KAAK;AAAA,MACzE;AAAA,IACF;AAEA,0BAAsB;AAAA,EACxB,GAAG,CAAC,kBAAkB,OAAO,CAAC;AAE9B,SAAO;AACT;","names":[]}
@@ -0,0 +1,57 @@
1
+ import { LogLevel, middlewareLogger } from "./logger";
2
+ function createEdgeCompatibleLogger(debug = false) {
3
+ if (debug) {
4
+ middlewareLogger.enable();
5
+ middlewareLogger.setLevel(LogLevel.DEBUG);
6
+ }
7
+ return {
8
+ logStart: (requestId, method, url) => {
9
+ middlewareLogger.debug(`[${requestId}] Middleware started for ${method} ${url}`);
10
+ },
11
+ logEnd: (requestId, duration) => {
12
+ middlewareLogger.debug(`[${requestId}] Middleware completed in ${duration.toFixed(2)}ms`);
13
+ },
14
+ logError: (requestId, duration, error) => {
15
+ middlewareLogger.error(
16
+ `[${requestId}] Middleware failed after ${duration.toFixed(2)}ms:`,
17
+ error instanceof Error ? error.message : "Unknown error"
18
+ );
19
+ },
20
+ debug: (message, ...args) => middlewareLogger.debug(message, ...args),
21
+ info: (message, ...args) => middlewareLogger.info(message, ...args),
22
+ warn: (message, ...args) => middlewareLogger.warn(message, ...args),
23
+ error: (message, ...args) => middlewareLogger.error(message, ...args)
24
+ };
25
+ }
26
+ const withLogger = (middleware, options = {}) => {
27
+ const { debug = false, logLevel = LogLevel.INFO } = options;
28
+ if (debug) {
29
+ middlewareLogger.enable();
30
+ middlewareLogger.setLevel(LogLevel.DEBUG);
31
+ } else {
32
+ middlewareLogger.setLevel(logLevel);
33
+ }
34
+ return async (request, event) => {
35
+ const startTime = performance.now();
36
+ const requestId = crypto.randomUUID().slice(0, 8);
37
+ middlewareLogger.debug(`[${requestId}] Middleware started for ${request.method} ${request.url}`);
38
+ try {
39
+ const result = await middleware(request, event);
40
+ const duration = performance.now() - startTime;
41
+ middlewareLogger.debug(`[${requestId}] Middleware completed in ${duration.toFixed(2)}ms`);
42
+ return result;
43
+ } catch (error) {
44
+ const duration = performance.now() - startTime;
45
+ middlewareLogger.error(
46
+ `[${requestId}] Middleware failed after ${duration.toFixed(2)}ms:`,
47
+ error instanceof Error ? error.message : "Unknown error"
48
+ );
49
+ throw error;
50
+ }
51
+ };
52
+ };
53
+ export {
54
+ createEdgeCompatibleLogger,
55
+ withLogger
56
+ };
57
+ //# sourceMappingURL=withLogger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/utils/withLogger.ts"],"sourcesContent":["import type { NextMiddleware } from \"next/server\"\n\nimport { LogLevel,middlewareLogger } from \"./logger\"\n\nexport interface WithLoggerOptions {\n debug?: boolean\n logLevel?: LogLevel\n}\n\nexport function createEdgeCompatibleLogger(debug: boolean = false) {\n if (debug) {\n middlewareLogger.enable()\n middlewareLogger.setLevel(LogLevel.DEBUG)\n }\n \n return {\n logStart: (requestId: string, method: string, url: string) => {\n middlewareLogger.debug(`[${requestId}] Middleware started for ${method} ${url}`)\n },\n logEnd: (requestId: string, duration: number) => {\n middlewareLogger.debug(`[${requestId}] Middleware completed in ${duration.toFixed(2)}ms`)\n },\n logError: (requestId: string, duration: number, error: unknown) => {\n middlewareLogger.error(\n `[${requestId}] Middleware failed after ${duration.toFixed(2)}ms:`,\n error instanceof Error ? error.message : 'Unknown error'\n )\n },\n debug: (message: string, ...args: any[]) => middlewareLogger.debug(message, ...args),\n info: (message: string, ...args: any[]) => middlewareLogger.info(message, ...args),\n warn: (message: string, ...args: any[]) => middlewareLogger.warn(message, ...args),\n error: (message: string, ...args: any[]) => middlewareLogger.error(message, ...args),\n }\n}\n\nexport const withLogger = (\n middleware: NextMiddleware,\n options: WithLoggerOptions = {}\n): NextMiddleware => {\n const { debug = false, logLevel = LogLevel.INFO } = options\n\n if (debug) {\n middlewareLogger.enable()\n middlewareLogger.setLevel(LogLevel.DEBUG)\n } else {\n middlewareLogger.setLevel(logLevel)\n }\n\n return async (request, event) => {\n const startTime = performance.now()\n const requestId = crypto.randomUUID().slice(0, 8)\n \n middlewareLogger.debug(`[${requestId}] Middleware started for ${request.method} ${request.url}`)\n\n try {\n const result = await middleware(request, event)\n const duration = performance.now() - startTime\n \n middlewareLogger.debug(`[${requestId}] Middleware completed in ${duration.toFixed(2)}ms`)\n \n return result\n } catch (error) {\n const duration = performance.now() - startTime\n \n middlewareLogger.error(\n `[${requestId}] Middleware failed after ${duration.toFixed(2)}ms:`,\n error instanceof Error ? error.message : 'Unknown error'\n )\n \n throw error\n }\n }\n}"],"mappings":"AAEA,SAAS,UAAS,wBAAwB;AAOnC,SAAS,2BAA2B,QAAiB,OAAO;AACjE,MAAI,OAAO;AACT,qBAAiB,OAAO;AACxB,qBAAiB,SAAS,SAAS,KAAK;AAAA,EAC1C;AAEA,SAAO;AAAA,IACL,UAAU,CAAC,WAAmB,QAAgB,QAAgB;AAC5D,uBAAiB,MAAM,IAAI,SAAS,4BAA4B,MAAM,IAAI,GAAG,EAAE;AAAA,IACjF;AAAA,IACA,QAAQ,CAAC,WAAmB,aAAqB;AAC/C,uBAAiB,MAAM,IAAI,SAAS,6BAA6B,SAAS,QAAQ,CAAC,CAAC,IAAI;AAAA,IAC1F;AAAA,IACA,UAAU,CAAC,WAAmB,UAAkB,UAAmB;AACjE,uBAAiB;AAAA,QACf,IAAI,SAAS,6BAA6B,SAAS,QAAQ,CAAC,CAAC;AAAA,QAC7D,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAC3C;AAAA,IACF;AAAA,IACA,OAAO,CAAC,YAAoB,SAAgB,iBAAiB,MAAM,SAAS,GAAG,IAAI;AAAA,IACnF,MAAM,CAAC,YAAoB,SAAgB,iBAAiB,KAAK,SAAS,GAAG,IAAI;AAAA,IACjF,MAAM,CAAC,YAAoB,SAAgB,iBAAiB,KAAK,SAAS,GAAG,IAAI;AAAA,IACjF,OAAO,CAAC,YAAoB,SAAgB,iBAAiB,MAAM,SAAS,GAAG,IAAI;AAAA,EACrF;AACF;AAEO,MAAM,aAAa,CACxB,YACA,UAA6B,CAAC,MACX;AACnB,QAAM,EAAE,QAAQ,OAAO,WAAW,SAAS,KAAK,IAAI;AAEpD,MAAI,OAAO;AACT,qBAAiB,OAAO;AACxB,qBAAiB,SAAS,SAAS,KAAK;AAAA,EAC1C,OAAO;AACL,qBAAiB,SAAS,QAAQ;AAAA,EACpC;AAEA,SAAO,OAAO,SAAS,UAAU;AAC/B,UAAM,YAAY,YAAY,IAAI;AAClC,UAAM,YAAY,OAAO,WAAW,EAAE,MAAM,GAAG,CAAC;AAEhD,qBAAiB,MAAM,IAAI,SAAS,4BAA4B,QAAQ,MAAM,IAAI,QAAQ,GAAG,EAAE;AAE/F,QAAI;AACF,YAAM,SAAS,MAAM,WAAW,SAAS,KAAK;AAC9C,YAAM,WAAW,YAAY,IAAI,IAAI;AAErC,uBAAiB,MAAM,IAAI,SAAS,6BAA6B,SAAS,QAAQ,CAAC,CAAC,IAAI;AAExF,aAAO;AAAA,IACT,SAAS,OAAO;AACd,YAAM,WAAW,YAAY,IAAI,IAAI;AAErC,uBAAiB;AAAA,QACf,IAAI,SAAS,6BAA6B,SAAS,QAAQ,CAAC,CAAC;AAAA,QAC7D,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAC3C;AAEA,YAAM;AAAA,IACR;AAAA,EACF;AACF;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tern-secure/nextjs",
3
- "version": "5.1.8",
3
+ "version": "5.1.10",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -25,7 +25,9 @@
25
25
  "description": "Firebase authentication solution for Next.js applications",
26
26
  "types": "./dist/types/index.d.ts",
27
27
  "files": [
28
- "dist"
28
+ "dist",
29
+ "admin",
30
+ "server"
29
31
  ],
30
32
  "sideEffects": false,
31
33
  "exports": {
@@ -39,6 +41,11 @@
39
41
  "import": "./dist/esm/server/index.js",
40
42
  "require": "./dist/cjs/server/index.js"
41
43
  },
44
+ "./server/node": {
45
+ "types": "./dist/types/server/node/index.d.ts",
46
+ "import": "./dist/esm/server/node/index.js",
47
+ "require": "./dist/cjs/server/node/index.js"
48
+ },
42
49
  "./admin": {
43
50
  "types": "./dist/types/app-router/admin/index.d.ts",
44
51
  "import": "./dist/esm/app-router/admin/index.js",
@@ -52,11 +59,14 @@
52
59
  "typescript": "^5.7.2"
53
60
  },
54
61
  "dependencies": {
62
+ "@upstash/redis": "^1.35.2",
55
63
  "jose": "^5.9.6",
64
+ "server-only": "^0.0.1",
56
65
  "tslib": "2.4.1",
57
- "@tern-secure/react": "1.1.5",
58
- "@tern-secure/shared": "1.2.0",
59
- "@tern-secure/types": "1.0.4"
66
+ "@tern-secure/backend": "1.1.8",
67
+ "@tern-secure/react": "1.1.7",
68
+ "@tern-secure/shared": "1.2.2",
69
+ "@tern-secure/types": "1.0.6"
60
70
  },
61
71
  "peerDependencies": {
62
72
  "next": "^13.0.0 || ^14.0.0 || ^15.0.0",
@@ -68,9 +78,13 @@
68
78
  },
69
79
  "scripts": {
70
80
  "clean": "rimraf dist",
71
- "build": "pnpm clean && tsup && tsc -p tsconfig.add.json",
81
+ "build": "pnpm clean && tsup",
82
+ "build:add": "tsc -p tsconfig.add.json",
72
83
  "dev": "tsup --watch",
73
84
  "lint": "eslint src",
74
- "format": "prettier --write \"src/**/*.{ts,tsx}\""
85
+ "format": "prettier --write \"src/**/*.{ts,tsx}\"",
86
+ "test": "vitest run",
87
+ "test:watch": "vitest watch",
88
+ "bench": "vitest bench"
75
89
  }
76
90
  }
@@ -0,0 +1,5 @@
1
+ {
2
+ "main": "../../dist/cjs/server/node/index.js",
3
+ "module": "../../dist/esm/server/node/index.js",
4
+ "types": "../../dist/types/server/node/index.d.ts"
5
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "main": "../dist/cjs/server/index.js",
3
+ "module": "../dist/esm/server/index.js",
4
+ "types": "../dist/types/server/index.d.ts"
5
+ }
@@ -1,74 +0,0 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
- var sessionHandler_exports = {};
20
- __export(sessionHandler_exports, {
21
- createSessionHandler: () => createSessionHandler
22
- });
23
- module.exports = __toCommonJS(sessionHandler_exports);
24
- var import_server = require("next/server");
25
- var import_react = require("@tern-secure/react");
26
- async function createSessionHandler(request) {
27
- try {
28
- const body = await request.json();
29
- const { idToken, csrfToken } = body;
30
- if (!idToken) {
31
- return import_server.NextResponse.json(
32
- {
33
- success: false,
34
- message: "ID token is required",
35
- error: "INVALID_TOKEN"
36
- },
37
- { status: 400 }
38
- );
39
- }
40
- if (!csrfToken) {
41
- return import_server.NextResponse.json(
42
- {
43
- success: false,
44
- message: "CSRF token is required",
45
- error: "INVALID_CSRF_TOKEN"
46
- },
47
- { status: 400 }
48
- );
49
- }
50
- const res = await (0, import_react.createSessionCookie)(idToken);
51
- if (!res.success) {
52
- console.error("[createSessionHandler] Error creating session cookie:", {
53
- error: res.error,
54
- message: res.message,
55
- cookieSet: res.cookieSet
56
- });
57
- }
58
- const statusCode = res.success ? 200 : res.error === "INVALID_TOKEN" ? 400 : res.error === "EXPIRED_TOKEN" ? 401 : 500;
59
- return import_server.NextResponse.json(res, { status: statusCode });
60
- } catch (error) {
61
- return import_server.NextResponse.json(
62
- {
63
- success: false,
64
- message: "Invalid request format"
65
- },
66
- { status: 400 }
67
- );
68
- }
69
- }
70
- // Annotate the CommonJS export names for ESM import in node:
71
- 0 && (module.exports = {
72
- createSessionHandler
73
- });
74
- //# sourceMappingURL=sessionHandler.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../src/app-router/admin/sessionHandler.ts"],"sourcesContent":["import { NextRequest, NextResponse } from \"next/server\"\nimport { createSessionCookie } from \"@tern-secure/react\"\n\nexport async function createSessionHandler(request: NextRequest): Promise<NextResponse> {\n try {\n const body = await request.json()\n const { idToken, csrfToken } = body\n\n if (!idToken) {\n return NextResponse.json(\n {\n success: false, \n message: 'ID token is required', \n error: 'INVALID_TOKEN'\n },\n { status: 400 }\n );\n }\n\n if (!csrfToken) {\n return NextResponse.json(\n {\n success: false, \n message: 'CSRF token is required', \n error: 'INVALID_CSRF_TOKEN'\n },\n { status: 400 }\n );\n }\n\n const res = await createSessionCookie(idToken);\n\n if (!res.success) {\n console.error('[createSessionHandler] Error creating session cookie:', {\n error: res.error,\n message: res.message,\n cookieSet: res.cookieSet\n });\n }\n\n const statusCode = res.success ? 200 : \n res.error === 'INVALID_TOKEN' ? 400 :\n res.error === 'EXPIRED_TOKEN' ? 401 : 500;\n\n return NextResponse.json(res, { status: statusCode })\n\n } catch (error) {\n return NextResponse.json(\n {\n success: false,\n message: 'Invalid request format'\n },\n { status: 400 }\n )\n }\n}"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAA0C;AAC1C,mBAAoC;AAEpC,eAAsB,qBAAqB,SAA6C;AACpF,MAAI;AACA,UAAM,OAAO,MAAM,QAAQ,KAAK;AAChC,UAAM,EAAE,SAAS,UAAU,IAAI;AAE/B,QAAI,CAAC,SAAS;AACV,aAAO,2BAAa;AAAA,QAChB;AAAA,UACI,SAAS;AAAA,UACT,SAAS;AAAA,UACT,OAAO;AAAA,QACX;AAAA,QACA,EAAE,QAAQ,IAAI;AAAA,MAClB;AAAA,IACJ;AAEA,QAAI,CAAC,WAAW;AACZ,aAAO,2BAAa;AAAA,QAChB;AAAA,UACI,SAAS;AAAA,UACT,SAAS;AAAA,UACT,OAAO;AAAA,QACX;AAAA,QACA,EAAE,QAAQ,IAAI;AAAA,MAClB;AAAA,IACJ;AAEA,UAAM,MAAM,UAAM,kCAAoB,OAAO;AAE7C,QAAI,CAAC,IAAI,SAAS;AACd,cAAQ,MAAM,yDAAyD;AAAA,QACnE,OAAO,IAAI;AAAA,QACX,SAAS,IAAI;AAAA,QACb,WAAW,IAAI;AAAA,MACnB,CAAC;AAAA,IACL;AAEA,UAAM,aAAa,IAAI,UAAU,MACd,IAAI,UAAU,kBAAkB,MAC/B,IAAI,UAAU,kBAAkB,MAAM;AAE1D,WAAO,2BAAa,KAAK,KAAK,EAAE,QAAQ,WAAW,CAAC;AAAA,EAExD,SAAS,OAAO;AACZ,WAAO,2BAAa;AAAA,MAChB;AAAA,QACI,SAAS;AAAA,QACT,SAAS;AAAA,MACb;AAAA,MACA,EAAE,QAAQ,IAAI;AAAA,IAClB;AAAA,EACJ;AACJ;","names":[]}
@@ -1,4 +0,0 @@
1
- "use strict";
2
- {
3
- }
4
- //# sourceMappingURL=actions.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../src/app-router/client/actions.ts"],"sourcesContent":["{/*import { TernSecureAuth } from '../../utils/client-init'\r\nimport { \r\n signInWithEmailAndPassword, \r\n signInWithRedirect, \r\n getRedirectResult, \r\n GoogleAuthProvider, \r\n OAuthProvider, \r\n createUserWithEmailAndPassword, \r\n sendEmailVerification \r\n} from 'firebase/auth'\r\nimport type { SignInResponse } from '@tern-secure/types'\r\nimport { handleFirebaseAuthError } from '@tern-secure/types'\r\n\r\n\r\nexport async function createUser(email: string, password: string): Promise<SignInResponse> {\r\n const auth = TernSecureAuth()\r\n \r\n try {\r\n \r\n const actionCodeSettings = {\r\n url: `${window.location.origin}/sign-in`,\r\n handleCodeInApp: true\r\n };\r\n\r\n const userCredential = await createUserWithEmailAndPassword(auth, email, password);\r\n\r\n await sendEmailVerification(userCredential.user, actionCodeSettings)\r\n \r\n return { \r\n success: true, \r\n message: 'Account created successfully. Please check your email for verification', \r\n user: userCredential.user \r\n };\r\n\r\n } catch (error) {\r\n const authError = handleFirebaseAuthError(error)\r\n return { \r\n success: false, \r\n message: authError.message, \r\n error: authError.code,\r\n user: null\r\n }\r\n }\r\n}\r\n\r\n\r\nexport async function signInWithEmail(email: string, password: string): Promise<SignInResponse> {\r\n const auth = TernSecureAuth()\r\n try {\r\n const UserCredential = await signInWithEmailAndPassword(auth, email, password)\r\n const user = UserCredential.user\r\n \r\n return { \r\n success: true, \r\n message: 'Authentication successful',\r\n user: user,\r\n error: !user.emailVerified ? 'REQUIRES_VERIFICATION' : 'AUTHENTICATED'\r\n };\r\n\r\n} catch (error){\r\n const authError = handleFirebaseAuthError(error)\r\n return { \r\n success: false,\r\n message: authError.message,\r\n error: authError.code,\r\n user: null\r\n }\r\n}\r\n}\r\n\r\nexport async function signInWithRedirectGoogle() {\r\n const auth = TernSecureAuth()\r\n const provider = new GoogleAuthProvider()\r\n provider.setCustomParameters({\r\n login_hint: 'user@example.com',\r\n prompt: 'select_account'\r\n })\r\n\r\n try {\r\n await signInWithRedirect(auth, provider)\r\n return { success: true, message: 'Redirect initiated' }\r\n } catch (error) {\r\n const authError = handleFirebaseAuthError(error)\r\n return {\r\n success: false,\r\n message: authError.message,\r\n error: authError.code,\r\n user: null\r\n }\r\n }\r\n}\r\n\r\n\r\nexport async function signInWithMicrosoft() {\r\n const auth = TernSecureAuth()\r\n const provider = new OAuthProvider('microsoft.com')\r\n provider.setCustomParameters({\r\n prompt: 'consent'\r\n })\r\n\r\n try {\r\n await signInWithRedirect(auth, provider)\r\n return { success: true, message: 'Redirect initiated' }\r\n } catch (error) {\r\n const authError = handleFirebaseAuthError(error)\r\n return {\r\n success: false, \r\n message: authError.message,\r\n error: authError.code,\r\n user: null\r\n }\r\n }\r\n}\r\n\r\n\r\nexport async function handleAuthRedirectResult() {\r\n const auth = TernSecureAuth()\r\n try {\r\n const result = await getRedirectResult(auth)\r\n if (result) {\r\n const user = result.user\r\n return { success: true, user }\r\n } else {\r\n return { success: false, error: 'No redirect result' }\r\n }\r\n } catch (error: any) {\r\n const authError = handleFirebaseAuthError(error)\r\n return {\r\n success: false,\r\n message: authError.message,\r\n error: authError.code,\r\n user: null\r\n }\r\n }\r\n}\r\n\r\n\r\nexport async function resendEmailVerification() {\r\n const auth = TernSecureAuth()\r\n try {\r\n const user = auth.currentUser;\r\n if (!user) {\r\n throw new Error('No user found. Please try signing up again.');\r\n }\r\n\r\n await user.reload();\r\n\r\n if (user.emailVerified) {\r\n return { \r\n success: true, \r\n message: 'Email is already verified. You can sign in.',\r\n isVerified: true \r\n };\r\n }\r\n\r\n const actionCodeSettings = {\r\n url: `${window.location.origin}/sign-in`,\r\n handleCodeInApp: true,\r\n };\r\n\r\n await sendEmailVerification(user, actionCodeSettings);\r\n return { \r\n success: true, \r\n message: 'Verification email sent successfully.',\r\n isVerified: false\r\n };\r\n } catch (error) {\r\n const authError = handleFirebaseAuthError(error)\r\n return {\r\n success: false,\r\n message: authError.message,\r\n error: authError.code,\r\n user: null\r\n }\r\n }\r\n}*/}"],"mappings":";AAAA;AA+KG;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/components/uiComponents.tsx"],"sourcesContent":["'use client'\n\nimport { \n SignIn as BaseSignIn,\n SignUp as BaseSignUp,\n} from '@tern-secure/react'\nimport type { ComponentProps } from 'react';\n\nexport {\n UserButton\n} from '@tern-secure/react';\n\nexport const SignIn = (props: ComponentProps<typeof BaseSignIn>) => {\n return <BaseSignIn {...props} />;\n};\n\nexport const SignUp = (props: ComponentProps<typeof BaseSignUp>) => {\n return <BaseSignUp {...props} />; \n};"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAaS;AAXT,mBAGO;AAGP,IAAAA,gBAEO;AAEA,MAAM,SAAS,CAAC,UAA6C;AAClE,SAAO,4CAAC,aAAAC,QAAA,EAAY,GAAG,OAAO;AAChC;AAEO,MAAM,SAAS,CAAC,UAA6C;AAClE,SAAO,4CAAC,aAAAC,QAAA,EAAY,GAAG,OAAO;AAChC;","names":["import_react","BaseSignIn","BaseSignUp"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/server/auth.ts"],"sourcesContent":["import { cache } from \"react\"\r\nimport { cookies } from \"next/headers\"\r\nimport type { UserInfo } from \"./types\"\r\nimport { verifyFirebaseToken } from \"./jwt-edge\"\r\nimport { TernSecureError } from \"../errors\"\r\n\r\n\r\n\r\nexport interface AuthResult {\r\n user: UserInfo | null\r\n error: Error | null\r\n}\r\n\r\n /**\r\n * Get the current authenticated user from the session or token\r\n */\r\nexport const auth = cache(async (): Promise<AuthResult> => {\r\n try {\r\n // Get all active sessions for debugging\r\n console.log(\"auth: Starting auth check...\")\r\n const cookieStore = await cookies()\r\n\r\n // First try session cookie as it's more secure\r\n const sessionCookie = cookieStore.get(\"_session_cookie\")?.value\r\n if (sessionCookie) {\r\n const result = await verifyFirebaseToken(sessionCookie, true)\r\n if (result.valid) {\r\n const user: UserInfo = {\r\n uid: result.uid ?? '',\r\n email: result.email || null,\r\n authTime: result.authTime\r\n }\r\n return { user, error: null }\r\n }\r\n }\r\n\r\n // Fallback to ID token\r\n const idToken = cookieStore.get(\"_session_token\")?.value\r\n if (idToken) {\r\n const result = await verifyFirebaseToken(idToken, false)\r\n if (result.valid) {\r\n const user: UserInfo = {\r\n uid: result.uid ?? '',\r\n email: result.email || null,\r\n authTime: result.authTime\r\n }\r\n return { user, error: null }\r\n }\r\n }\r\n\r\n return {\r\n user: null,\r\n error: new TernSecureError('UNAUTHENTICATED', 'No valid session found')\r\n }\r\n\r\n } catch (error) {\r\n console.error(\"Error in Auth:\", error)\r\n if (error instanceof TernSecureError) {\r\n return {\r\n user: null,\r\n error\r\n }\r\n }\r\n return {\r\n user: null,\r\n error: new TernSecureError('INTERNAL_ERROR', 'An unexpected error occurred')\r\n }\r\n }\r\n })\r\n\r\n/**\r\n * Type guard to check if user is authenticated\r\n */\r\nexport const isAuthenticated = cache(async (): Promise<boolean> => {\r\n const { user } = await auth()\r\n return user !== null\r\n})\r\n\r\n/**\r\n * Get user info from auth result\r\n */\r\nexport const getUser = cache(async (): Promise<UserInfo | null> => {\r\n const { user } = await auth()\r\n return user\r\n})\r\n\r\n/**\r\n * Require authentication\r\n * Throws error if not authenticated\r\n */\r\nexport const requireAuth = cache(async (): Promise<UserInfo> => {\r\n const { user, error } = await auth()\r\n\r\n if (!user) {\r\n throw error || new Error(\"Authentication required\")\r\n }\r\n\r\n return user\r\n})"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAsB;AACtB,qBAAwB;AAExB,sBAAoC;AACpC,oBAAgC;AAYzB,MAAM,WAAO,oBAAM,YAAiC;AACzD,MAAI;AAEH,YAAQ,IAAI,8BAA8B;AAC1C,UAAM,cAAc,UAAM,wBAAQ;AAGjC,UAAM,gBAAgB,YAAY,IAAI,iBAAiB,GAAG;AAC1D,QAAI,eAAe;AACjB,YAAM,SAAS,UAAM,qCAAoB,eAAe,IAAI;AAC5D,UAAI,OAAO,OAAO;AAChB,cAAM,OAAiB;AAAA,UACrB,KAAK,OAAO,OAAO;AAAA,UACnB,OAAO,OAAO,SAAS;AAAA,UACvB,UAAU,OAAO;AAAA,QACnB;AACA,eAAO,EAAE,MAAM,OAAO,KAAK;AAAA,MAC7B;AAAA,IACF;AAGA,UAAM,UAAU,YAAY,IAAI,gBAAgB,GAAG;AACnD,QAAI,SAAS;AACX,YAAM,SAAS,UAAM,qCAAoB,SAAS,KAAK;AACvD,UAAI,OAAO,OAAO;AAChB,cAAM,OAAiB;AAAA,UACrB,KAAK,OAAO,OAAO;AAAA,UACnB,OAAO,OAAO,SAAS;AAAA,UACvB,UAAU,OAAO;AAAA,QACnB;AACA,eAAO,EAAE,MAAM,OAAO,KAAK;AAAA,MAC7B;AAAA,IACF;AAEE,WAAO;AAAA,MACH,MAAM;AAAA,MACN,OAAO,IAAI,8BAAgB,mBAAmB,wBAAwB;AAAA,IAC1E;AAAA,EAEF,SAAS,OAAO;AACd,YAAQ,MAAM,kBAAkB,KAAK;AACrC,QAAI,iBAAiB,+BAAiB;AACpC,aAAO;AAAA,QACL,MAAM;AAAA,QACN;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO,IAAI,8BAAgB,kBAAkB,8BAA8B;AAAA,IAC7E;AAAA,EACF;AACF,CAAC;AAKI,MAAM,sBAAkB,oBAAM,YAA+B;AAClE,QAAM,EAAE,KAAK,IAAI,MAAM,KAAK;AAC5B,SAAO,SAAS;AAClB,CAAC;AAKM,MAAM,cAAU,oBAAM,YAAsC;AACjE,QAAM,EAAE,KAAK,IAAI,MAAM,KAAK;AAC5B,SAAO;AACT,CAAC;AAMM,MAAM,kBAAc,oBAAM,YAA+B;AAC9D,QAAM,EAAE,MAAM,MAAM,IAAI,MAAM,KAAK;AAEnC,MAAI,CAAC,MAAM;AACT,UAAM,SAAS,IAAI,MAAM,yBAAyB;AAAA,EACpD;AAEA,SAAO;AACT,CAAC;","names":[]}
@@ -1,95 +0,0 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
- var ternSecureMiddleware_exports = {};
20
- __export(ternSecureMiddleware_exports, {
21
- createRouteMatcher: () => createRouteMatcher,
22
- runtime: () => runtime,
23
- ternSecureMiddleware: () => ternSecureMiddleware
24
- });
25
- module.exports = __toCommonJS(ternSecureMiddleware_exports);
26
- var import_server = require("next/server");
27
- var import_edge_session = require("./edge-session");
28
- const runtime = "edge";
29
- function createRouteMatcher(patterns) {
30
- return (request) => {
31
- const { pathname } = request.nextUrl;
32
- return patterns.some((pattern) => {
33
- const regexPattern = pattern.replace(/[.*+?^${}()|[\]\\]/g, "\\$&").replace(/\\\*/g, ".*");
34
- return new RegExp(`^${regexPattern}$`).test(pathname);
35
- });
36
- };
37
- }
38
- async function edgeAuth(request) {
39
- async function protect() {
40
- throw new Error("Unauthorized access");
41
- }
42
- try {
43
- const sessionResult = await (0, import_edge_session.verifySession)(request);
44
- if (sessionResult.isAuthenticated && sessionResult.user) {
45
- return {
46
- user: sessionResult.user,
47
- token: request.cookies.get("_session_cookie")?.value || request.cookies.get("_session_token")?.value || null,
48
- protect: async () => {
49
- }
50
- };
51
- }
52
- return {
53
- user: null,
54
- token: null,
55
- protect
56
- };
57
- } catch (error) {
58
- console.error("Auth check error:", error instanceof Error ? error.message : "Unknown error");
59
- return {
60
- user: null,
61
- token: null,
62
- protect
63
- };
64
- }
65
- }
66
- function ternSecureMiddleware(callback) {
67
- return async function middleware(request) {
68
- try {
69
- const auth = await edgeAuth(request);
70
- try {
71
- await callback(auth, request);
72
- const response = import_server.NextResponse.next();
73
- return response;
74
- } catch (error) {
75
- if (error instanceof Error && error.message === "Unauthorized access") {
76
- const redirectUrl = new URL("/sign-in", request.url);
77
- redirectUrl.searchParams.set("redirect", request.nextUrl.pathname);
78
- return import_server.NextResponse.redirect(redirectUrl);
79
- }
80
- throw error;
81
- }
82
- } catch (error) {
83
- console.error("Middleware error:", error instanceof Error ? error.message : "Unknown error");
84
- const redirectUrl = new URL("/sign-in", request.url);
85
- return import_server.NextResponse.redirect(redirectUrl);
86
- }
87
- };
88
- }
89
- // Annotate the CommonJS export names for ESM import in node:
90
- 0 && (module.exports = {
91
- createRouteMatcher,
92
- runtime,
93
- ternSecureMiddleware
94
- });
95
- //# sourceMappingURL=ternSecureMiddleware.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/server/ternSecureMiddleware.ts"],"sourcesContent":["import { type NextRequest, NextResponse } from 'next/server';\r\nimport { verifySession } from './edge-session'\r\nimport type { UserInfo } from \"./types\"\r\n\r\nexport const runtime = \"edge\"\r\n\r\ninterface Auth {\r\n user: UserInfo | null\r\n token: string | null\r\n protect: () => Promise<void>\r\n}\r\n\r\ntype MiddlewareCallback = (\r\n auth: Auth,\r\n request: NextRequest\r\n) => Promise<void>\r\n\r\n\r\n/**\r\n * Create a route matcher function for public paths\r\n */\r\nexport function createRouteMatcher(patterns: string[]) {\r\n return (request: NextRequest): boolean => {\r\n const { pathname } = request.nextUrl\r\n return patterns.some((pattern) => {\r\n // Convert glob pattern to regex safely without dynamic evaluation\r\n const regexPattern = pattern\r\n .replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")\r\n .replace(/\\\\\\*/g, \".*\")\r\n \r\n return new RegExp(`^${regexPattern}$`).test(pathname)\r\n })\r\n }\r\n}\r\n\r\n\r\n/**\r\n * Edge-compatible auth check\r\n */\r\nasync function edgeAuth(request: NextRequest): Promise<Auth> {\r\n async function protect() {\r\n throw new Error(\"Unauthorized access\")\r\n }\r\n\r\n try {\r\n const sessionResult = await verifySession(request)\r\n\r\n if (sessionResult.isAuthenticated && sessionResult.user) {\r\n return {\r\n user: sessionResult.user,\r\n token: request.cookies.get(\"_session_cookie\")?.value || request.cookies.get(\"_session_token\")?.value || null,\r\n protect: async () => {},\r\n }\r\n }\r\n\r\n return {\r\n user: null,\r\n token: null,\r\n protect,\r\n }\r\n } catch (error) {\r\n console.error(\"Auth check error:\", error instanceof Error ? error\r\n .message : \"Unknown error\")\r\n return {\r\n user: null,\r\n token: null,\r\n protect,\r\n }\r\n }\r\n}\r\n\r\n\r\n\r\n/**\r\n * Middleware factory that handles authentication and custom logic\r\n * @param customHandler Optional function for additional custom logic\r\n */\r\n\r\nexport function ternSecureMiddleware(callback: MiddlewareCallback) {\r\n return async function middleware(request: NextRequest) {\r\n try {\r\n const auth = await edgeAuth(request)\r\n\r\n try {\r\n \r\n await callback(auth, request)\r\n\r\n const response = NextResponse.next()\r\n\r\n\r\n return response\r\n } catch (error) {\r\n // Handle unauthorized access\r\n if (error instanceof Error && error.message === 'Unauthorized access') {\r\n const redirectUrl = new URL(\"/sign-in\", request.url)\r\n redirectUrl.searchParams.set(\"redirect\", request.nextUrl.pathname)\r\n return NextResponse.redirect(redirectUrl)\r\n }\r\n throw error\r\n }\r\n } catch (error) {\r\n console.error(\"Middleware error:\", error instanceof Error ? error.message : \"Unknown error\")\r\n const redirectUrl = new URL(\"/sign-in\", request.url)\r\n return NextResponse.redirect(redirectUrl)\r\n }\r\n }\r\n}"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAA+C;AAC/C,0BAA8B;AAGvB,MAAM,UAAU;AAiBhB,SAAS,mBAAmB,UAAoB;AACrD,SAAO,CAAC,YAAkC;AACxC,UAAM,EAAE,SAAS,IAAI,QAAQ;AAC7B,WAAO,SAAS,KAAK,CAAC,YAAY;AAEhC,YAAM,eAAe,QACpB,QAAQ,uBAAuB,MAAM,EACrC,QAAQ,SAAS,IAAI;AAEtB,aAAO,IAAI,OAAO,IAAI,YAAY,GAAG,EAAE,KAAK,QAAQ;AAAA,IACtD,CAAC;AAAA,EACH;AACF;AAMA,eAAe,SAAS,SAAqC;AAC3D,iBAAe,UAAU;AACvB,UAAM,IAAI,MAAM,qBAAqB;AAAA,EACvC;AAEA,MAAI;AACF,UAAM,gBAAgB,UAAM,mCAAc,OAAO;AAEjD,QAAI,cAAc,mBAAmB,cAAc,MAAM;AACvD,aAAO;AAAA,QACL,MAAM,cAAc;AAAA,QACpB,OAAO,QAAQ,QAAQ,IAAI,iBAAiB,GAAG,SAAS,QAAQ,QAAQ,IAAI,gBAAgB,GAAG,SAAS;AAAA,QACxG,SAAS,YAAY;AAAA,QAAC;AAAA,MACxB;AAAA,IACF;AAEA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,MACP;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,MAAM,qBAAqB,iBAAiB,QAAQ,MAC3D,UAAU,eAAe;AAC1B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,MACP;AAAA,IACF;AAAA,EACF;AACF;AASO,SAAS,qBAAqB,UAA8B;AACjE,SAAO,eAAe,WAAW,SAAsB;AACrD,QAAI;AACF,YAAM,OAAO,MAAM,SAAS,OAAO;AAEnC,UAAI;AAEF,cAAM,SAAS,MAAM,OAAO;AAE5B,cAAM,WAAW,2BAAa,KAAK;AAGnC,eAAO;AAAA,MACT,SAAS,OAAO;AAEd,YAAI,iBAAiB,SAAS,MAAM,YAAY,uBAAuB;AACrE,gBAAM,cAAc,IAAI,IAAI,YAAY,QAAQ,GAAG;AACnD,sBAAY,aAAa,IAAI,YAAY,QAAQ,QAAQ,QAAQ;AACjE,iBAAO,2BAAa,SAAS,WAAW;AAAA,QAC1C;AACA,cAAM;AAAA,MACR;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,MAAM,qBAAqB,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAC3F,YAAM,cAAc,IAAI,IAAI,YAAY,QAAQ,GAAG;AACnD,aAAO,2BAAa,SAAS,WAAW;AAAA,IAC1C;AAAA,EACF;AACF;","names":[]}
@@ -1,78 +0,0 @@
1
- "use strict";
2
- var __create = Object.create;
3
- var __defProp = Object.defineProperty;
4
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
- var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
- var __hasOwnProp = Object.prototype.hasOwnProperty;
8
- var __export = (target, all) => {
9
- for (var name in all)
10
- __defProp(target, name, { get: all[name], enumerable: true });
11
- };
12
- var __copyProps = (to, from, except, desc) => {
13
- if (from && typeof from === "object" || typeof from === "function") {
14
- for (let key of __getOwnPropNames(from))
15
- if (!__hasOwnProp.call(to, key) && key !== except)
16
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
- }
18
- return to;
19
- };
20
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
- // If the importer is in node compatibility mode or this is not an ESM
22
- // file that has been converted to a CommonJS file using a Babel-
23
- // compatible transform (i.e. "__esModule" has not been set), then set
24
- // "default" to the CommonJS "module.exports" for node compatibility.
25
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
- mod
27
- ));
28
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
- var tern_ui_script_exports = {};
30
- __export(tern_ui_script_exports, {
31
- TernUIScript: () => TernUIScript
32
- });
33
- module.exports = __toCommonJS(tern_ui_script_exports);
34
- var import_jsx_runtime = require("react/jsx-runtime");
35
- var import_script = __toESM(require("next/script"));
36
- var import_react = require("@tern-secure/react");
37
- const isDevelopment = process.env.NODE_ENV === "development";
38
- const localPort = process.env.TERN_UI_PORT || "4000";
39
- const devDomain = isDevelopment ? `http://localhost:${localPort || process.env.NEXT_PUBLIC_TERN_UI_PORT || "4000"}` : void 0;
40
- function TernUIScript({
41
- customDomain,
42
- proxyUrl,
43
- version,
44
- nonce,
45
- router = "app"
46
- }) {
47
- const effectiveDomain = isDevelopment ? devDomain : customDomain;
48
- console.log("[TernSecure] TernUIScript: Using effective domain:", effectiveDomain);
49
- if (!effectiveDomain) {
50
- console.warn("[TernSecure] TernUIScript: No custom domain or proxy URL provided. The script will not be loaded.");
51
- return null;
52
- }
53
- const scriptOptions = {
54
- customDomain: effectiveDomain,
55
- proxyUrl,
56
- version,
57
- nonce,
58
- router
59
- };
60
- const scriptUrl = (0, import_react.ternUIgetScriptUrl)(scriptOptions);
61
- const scriptAttributes = (0, import_react.constructScriptAttributes)(scriptOptions);
62
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
63
- import_script.default,
64
- {
65
- src: scriptUrl,
66
- "data-ternui-script": true,
67
- async: true,
68
- nonce,
69
- strategy: void 0,
70
- ...scriptAttributes
71
- }
72
- );
73
- }
74
- // Annotate the CommonJS export names for ESM import in node:
75
- 0 && (module.exports = {
76
- TernUIScript
77
- });
78
- //# sourceMappingURL=tern-ui-script.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/utils/tern-ui-script.tsx"],"sourcesContent":["import Script from 'next/script'\nimport { ternUIgetScriptUrl, constructScriptAttributes } from '@tern-secure/react'\nimport type { TernSecureNextProps } from '../types'\n\nconst isDevelopment = process.env.NODE_ENV === 'development';\nconst localPort = process.env.TERN_UI_PORT || '4000';\n\ntype TernUIScriptProps = Pick<TernSecureNextProps, 'customDomain' | 'proxyUrl'> & {\n version?: string;\n nonce?: string;\n router: 'app' | 'pages';\n}\n\nconst devDomain = isDevelopment \n ? `http://localhost:${localPort || process.env.NEXT_PUBLIC_TERN_UI_PORT || '4000'}`\n : undefined\n\n\nexport function TernUIScript({\n customDomain,\n proxyUrl,\n version,\n nonce,\n router = 'app'\n}: TernUIScriptProps) {\n const effectiveDomain = isDevelopment ? devDomain : customDomain\n console.log('[TernSecure] TernUIScript: Using effective domain:', effectiveDomain);\n\n if (!effectiveDomain) {\n console.warn('[TernSecure] TernUIScript: No custom domain or proxy URL provided. The script will not be loaded.');\n return null;\n }\n\n const scriptOptions = {\n customDomain: effectiveDomain,\n proxyUrl,\n version,\n nonce,\n router\n };\n\n const scriptUrl = ternUIgetScriptUrl(scriptOptions);\n const scriptAttributes = constructScriptAttributes(scriptOptions);\n\n return (\n <Script\n src={scriptUrl}\n data-ternui-script\n async\n nonce={nonce}\n strategy={undefined}\n {...scriptAttributes}\n //crossOrigin= {undefined}\n />\n )\n}"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA6CQ;AA7CR,oBAAmB;AACnB,mBAA8D;AAG9D,MAAM,gBAAgB,QAAQ,IAAI,aAAa;AAC/C,MAAM,YAAY,QAAQ,IAAI,gBAAgB;AAQ9C,MAAM,YAAY,gBACZ,oBAAoB,aAAa,QAAQ,IAAI,4BAA4B,MAAM,KAC/E;AAGC,SAAS,aAAa;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS;AACb,GAAsB;AAClB,QAAM,kBAAkB,gBAAgB,YAAY;AACpD,UAAQ,IAAI,sDAAsD,eAAe;AAEjF,MAAI,CAAC,iBAAiB;AAClB,YAAQ,KAAK,mGAAmG;AAChH,WAAO;AAAA,EACX;AAEA,QAAM,gBAAgB;AAAA,IAClB,cAAc;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AAEA,QAAM,gBAAY,iCAAmB,aAAa;AAClD,QAAM,uBAAmB,wCAA0B,aAAa;AAEhE,SACI;AAAA,IAAC,cAAAA;AAAA,IAAA;AAAA,MACC,KAAK;AAAA,MACL,sBAAkB;AAAA,MAClB,OAAK;AAAA,MACL;AAAA,MACA,UAAU;AAAA,MACP,GAAG;AAAA;AAAA,EAER;AAER;","names":["Script"]}
@@ -1,50 +0,0 @@
1
- import { NextResponse } from "next/server";
2
- import { createSessionCookie } from "@tern-secure/react";
3
- async function createSessionHandler(request) {
4
- try {
5
- const body = await request.json();
6
- const { idToken, csrfToken } = body;
7
- if (!idToken) {
8
- return NextResponse.json(
9
- {
10
- success: false,
11
- message: "ID token is required",
12
- error: "INVALID_TOKEN"
13
- },
14
- { status: 400 }
15
- );
16
- }
17
- if (!csrfToken) {
18
- return NextResponse.json(
19
- {
20
- success: false,
21
- message: "CSRF token is required",
22
- error: "INVALID_CSRF_TOKEN"
23
- },
24
- { status: 400 }
25
- );
26
- }
27
- const res = await createSessionCookie(idToken);
28
- if (!res.success) {
29
- console.error("[createSessionHandler] Error creating session cookie:", {
30
- error: res.error,
31
- message: res.message,
32
- cookieSet: res.cookieSet
33
- });
34
- }
35
- const statusCode = res.success ? 200 : res.error === "INVALID_TOKEN" ? 400 : res.error === "EXPIRED_TOKEN" ? 401 : 500;
36
- return NextResponse.json(res, { status: statusCode });
37
- } catch (error) {
38
- return NextResponse.json(
39
- {
40
- success: false,
41
- message: "Invalid request format"
42
- },
43
- { status: 400 }
44
- );
45
- }
46
- }
47
- export {
48
- createSessionHandler
49
- };
50
- //# sourceMappingURL=sessionHandler.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../src/app-router/admin/sessionHandler.ts"],"sourcesContent":["import { NextRequest, NextResponse } from \"next/server\"\nimport { createSessionCookie } from \"@tern-secure/react\"\n\nexport async function createSessionHandler(request: NextRequest): Promise<NextResponse> {\n try {\n const body = await request.json()\n const { idToken, csrfToken } = body\n\n if (!idToken) {\n return NextResponse.json(\n {\n success: false, \n message: 'ID token is required', \n error: 'INVALID_TOKEN'\n },\n { status: 400 }\n );\n }\n\n if (!csrfToken) {\n return NextResponse.json(\n {\n success: false, \n message: 'CSRF token is required', \n error: 'INVALID_CSRF_TOKEN'\n },\n { status: 400 }\n );\n }\n\n const res = await createSessionCookie(idToken);\n\n if (!res.success) {\n console.error('[createSessionHandler] Error creating session cookie:', {\n error: res.error,\n message: res.message,\n cookieSet: res.cookieSet\n });\n }\n\n const statusCode = res.success ? 200 : \n res.error === 'INVALID_TOKEN' ? 400 :\n res.error === 'EXPIRED_TOKEN' ? 401 : 500;\n\n return NextResponse.json(res, { status: statusCode })\n\n } catch (error) {\n return NextResponse.json(\n {\n success: false,\n message: 'Invalid request format'\n },\n { status: 400 }\n )\n }\n}"],"mappings":"AAAA,SAAsB,oBAAoB;AAC1C,SAAS,2BAA2B;AAEpC,eAAsB,qBAAqB,SAA6C;AACpF,MAAI;AACA,UAAM,OAAO,MAAM,QAAQ,KAAK;AAChC,UAAM,EAAE,SAAS,UAAU,IAAI;AAE/B,QAAI,CAAC,SAAS;AACV,aAAO,aAAa;AAAA,QAChB;AAAA,UACI,SAAS;AAAA,UACT,SAAS;AAAA,UACT,OAAO;AAAA,QACX;AAAA,QACA,EAAE,QAAQ,IAAI;AAAA,MAClB;AAAA,IACJ;AAEA,QAAI,CAAC,WAAW;AACZ,aAAO,aAAa;AAAA,QAChB;AAAA,UACI,SAAS;AAAA,UACT,SAAS;AAAA,UACT,OAAO;AAAA,QACX;AAAA,QACA,EAAE,QAAQ,IAAI;AAAA,MAClB;AAAA,IACJ;AAEA,UAAM,MAAM,MAAM,oBAAoB,OAAO;AAE7C,QAAI,CAAC,IAAI,SAAS;AACd,cAAQ,MAAM,yDAAyD;AAAA,QACnE,OAAO,IAAI;AAAA,QACX,SAAS,IAAI;AAAA,QACb,WAAW,IAAI;AAAA,MACnB,CAAC;AAAA,IACL;AAEA,UAAM,aAAa,IAAI,UAAU,MACd,IAAI,UAAU,kBAAkB,MAC/B,IAAI,UAAU,kBAAkB,MAAM;AAE1D,WAAO,aAAa,KAAK,KAAK,EAAE,QAAQ,WAAW,CAAC;AAAA,EAExD,SAAS,OAAO;AACZ,WAAO,aAAa;AAAA,MAChB;AAAA,QACI,SAAS;AAAA,QACT,SAAS;AAAA,MACb;AAAA,MACA,EAAE,QAAQ,IAAI;AAAA,IAClB;AAAA,EACJ;AACJ;","names":[]}
@@ -1,3 +0,0 @@
1
- {
2
- }
3
- //# sourceMappingURL=actions.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../src/app-router/client/actions.ts"],"sourcesContent":["{/*import { TernSecureAuth } from '../../utils/client-init'\r\nimport { \r\n signInWithEmailAndPassword, \r\n signInWithRedirect, \r\n getRedirectResult, \r\n GoogleAuthProvider, \r\n OAuthProvider, \r\n createUserWithEmailAndPassword, \r\n sendEmailVerification \r\n} from 'firebase/auth'\r\nimport type { SignInResponse } from '@tern-secure/types'\r\nimport { handleFirebaseAuthError } from '@tern-secure/types'\r\n\r\n\r\nexport async function createUser(email: string, password: string): Promise<SignInResponse> {\r\n const auth = TernSecureAuth()\r\n \r\n try {\r\n \r\n const actionCodeSettings = {\r\n url: `${window.location.origin}/sign-in`,\r\n handleCodeInApp: true\r\n };\r\n\r\n const userCredential = await createUserWithEmailAndPassword(auth, email, password);\r\n\r\n await sendEmailVerification(userCredential.user, actionCodeSettings)\r\n \r\n return { \r\n success: true, \r\n message: 'Account created successfully. Please check your email for verification', \r\n user: userCredential.user \r\n };\r\n\r\n } catch (error) {\r\n const authError = handleFirebaseAuthError(error)\r\n return { \r\n success: false, \r\n message: authError.message, \r\n error: authError.code,\r\n user: null\r\n }\r\n }\r\n}\r\n\r\n\r\nexport async function signInWithEmail(email: string, password: string): Promise<SignInResponse> {\r\n const auth = TernSecureAuth()\r\n try {\r\n const UserCredential = await signInWithEmailAndPassword(auth, email, password)\r\n const user = UserCredential.user\r\n \r\n return { \r\n success: true, \r\n message: 'Authentication successful',\r\n user: user,\r\n error: !user.emailVerified ? 'REQUIRES_VERIFICATION' : 'AUTHENTICATED'\r\n };\r\n\r\n} catch (error){\r\n const authError = handleFirebaseAuthError(error)\r\n return { \r\n success: false,\r\n message: authError.message,\r\n error: authError.code,\r\n user: null\r\n }\r\n}\r\n}\r\n\r\nexport async function signInWithRedirectGoogle() {\r\n const auth = TernSecureAuth()\r\n const provider = new GoogleAuthProvider()\r\n provider.setCustomParameters({\r\n login_hint: 'user@example.com',\r\n prompt: 'select_account'\r\n })\r\n\r\n try {\r\n await signInWithRedirect(auth, provider)\r\n return { success: true, message: 'Redirect initiated' }\r\n } catch (error) {\r\n const authError = handleFirebaseAuthError(error)\r\n return {\r\n success: false,\r\n message: authError.message,\r\n error: authError.code,\r\n user: null\r\n }\r\n }\r\n}\r\n\r\n\r\nexport async function signInWithMicrosoft() {\r\n const auth = TernSecureAuth()\r\n const provider = new OAuthProvider('microsoft.com')\r\n provider.setCustomParameters({\r\n prompt: 'consent'\r\n })\r\n\r\n try {\r\n await signInWithRedirect(auth, provider)\r\n return { success: true, message: 'Redirect initiated' }\r\n } catch (error) {\r\n const authError = handleFirebaseAuthError(error)\r\n return {\r\n success: false, \r\n message: authError.message,\r\n error: authError.code,\r\n user: null\r\n }\r\n }\r\n}\r\n\r\n\r\nexport async function handleAuthRedirectResult() {\r\n const auth = TernSecureAuth()\r\n try {\r\n const result = await getRedirectResult(auth)\r\n if (result) {\r\n const user = result.user\r\n return { success: true, user }\r\n } else {\r\n return { success: false, error: 'No redirect result' }\r\n }\r\n } catch (error: any) {\r\n const authError = handleFirebaseAuthError(error)\r\n return {\r\n success: false,\r\n message: authError.message,\r\n error: authError.code,\r\n user: null\r\n }\r\n }\r\n}\r\n\r\n\r\nexport async function resendEmailVerification() {\r\n const auth = TernSecureAuth()\r\n try {\r\n const user = auth.currentUser;\r\n if (!user) {\r\n throw new Error('No user found. Please try signing up again.');\r\n }\r\n\r\n await user.reload();\r\n\r\n if (user.emailVerified) {\r\n return { \r\n success: true, \r\n message: 'Email is already verified. You can sign in.',\r\n isVerified: true \r\n };\r\n }\r\n\r\n const actionCodeSettings = {\r\n url: `${window.location.origin}/sign-in`,\r\n handleCodeInApp: true,\r\n };\r\n\r\n await sendEmailVerification(user, actionCodeSettings);\r\n return { \r\n success: true, \r\n message: 'Verification email sent successfully.',\r\n isVerified: false\r\n };\r\n } catch (error) {\r\n const authError = handleFirebaseAuthError(error)\r\n return {\r\n success: false,\r\n message: authError.message,\r\n error: authError.code,\r\n user: null\r\n }\r\n }\r\n}*/}"],"mappings":"AAAA;AA+KG;","names":[]}
@@ -1,21 +0,0 @@
1
- "use client";
2
- import { jsx } from "react/jsx-runtime";
3
- import {
4
- SignIn as BaseSignIn,
5
- SignUp as BaseSignUp
6
- } from "@tern-secure/react";
7
- import {
8
- UserButton
9
- } from "@tern-secure/react";
10
- const SignIn = (props) => {
11
- return /* @__PURE__ */ jsx(BaseSignIn, { ...props });
12
- };
13
- const SignUp = (props) => {
14
- return /* @__PURE__ */ jsx(BaseSignUp, { ...props });
15
- };
16
- export {
17
- SignIn,
18
- SignUp,
19
- UserButton
20
- };
21
- //# sourceMappingURL=uiComponents.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/components/uiComponents.tsx"],"sourcesContent":["'use client'\n\nimport { \n SignIn as BaseSignIn,\n SignUp as BaseSignUp,\n} from '@tern-secure/react'\nimport type { ComponentProps } from 'react';\n\nexport {\n UserButton\n} from '@tern-secure/react';\n\nexport const SignIn = (props: ComponentProps<typeof BaseSignIn>) => {\n return <BaseSignIn {...props} />;\n};\n\nexport const SignUp = (props: ComponentProps<typeof BaseSignUp>) => {\n return <BaseSignUp {...props} />; \n};"],"mappings":";AAaS;AAXT;AAAA,EACI,UAAU;AAAA,EACV,UAAU;AAAA,OACP;AAGP;AAAA,EACE;AAAA,OACK;AAEA,MAAM,SAAS,CAAC,UAA6C;AAClE,SAAO,oBAAC,cAAY,GAAG,OAAO;AAChC;AAEO,MAAM,SAAS,CAAC,UAA6C;AAClE,SAAO,oBAAC,cAAY,GAAG,OAAO;AAChC;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/server/auth.ts"],"sourcesContent":["import { cache } from \"react\"\r\nimport { cookies } from \"next/headers\"\r\nimport type { UserInfo } from \"./types\"\r\nimport { verifyFirebaseToken } from \"./jwt-edge\"\r\nimport { TernSecureError } from \"../errors\"\r\n\r\n\r\n\r\nexport interface AuthResult {\r\n user: UserInfo | null\r\n error: Error | null\r\n}\r\n\r\n /**\r\n * Get the current authenticated user from the session or token\r\n */\r\nexport const auth = cache(async (): Promise<AuthResult> => {\r\n try {\r\n // Get all active sessions for debugging\r\n console.log(\"auth: Starting auth check...\")\r\n const cookieStore = await cookies()\r\n\r\n // First try session cookie as it's more secure\r\n const sessionCookie = cookieStore.get(\"_session_cookie\")?.value\r\n if (sessionCookie) {\r\n const result = await verifyFirebaseToken(sessionCookie, true)\r\n if (result.valid) {\r\n const user: UserInfo = {\r\n uid: result.uid ?? '',\r\n email: result.email || null,\r\n authTime: result.authTime\r\n }\r\n return { user, error: null }\r\n }\r\n }\r\n\r\n // Fallback to ID token\r\n const idToken = cookieStore.get(\"_session_token\")?.value\r\n if (idToken) {\r\n const result = await verifyFirebaseToken(idToken, false)\r\n if (result.valid) {\r\n const user: UserInfo = {\r\n uid: result.uid ?? '',\r\n email: result.email || null,\r\n authTime: result.authTime\r\n }\r\n return { user, error: null }\r\n }\r\n }\r\n\r\n return {\r\n user: null,\r\n error: new TernSecureError('UNAUTHENTICATED', 'No valid session found')\r\n }\r\n\r\n } catch (error) {\r\n console.error(\"Error in Auth:\", error)\r\n if (error instanceof TernSecureError) {\r\n return {\r\n user: null,\r\n error\r\n }\r\n }\r\n return {\r\n user: null,\r\n error: new TernSecureError('INTERNAL_ERROR', 'An unexpected error occurred')\r\n }\r\n }\r\n })\r\n\r\n/**\r\n * Type guard to check if user is authenticated\r\n */\r\nexport const isAuthenticated = cache(async (): Promise<boolean> => {\r\n const { user } = await auth()\r\n return user !== null\r\n})\r\n\r\n/**\r\n * Get user info from auth result\r\n */\r\nexport const getUser = cache(async (): Promise<UserInfo | null> => {\r\n const { user } = await auth()\r\n return user\r\n})\r\n\r\n/**\r\n * Require authentication\r\n * Throws error if not authenticated\r\n */\r\nexport const requireAuth = cache(async (): Promise<UserInfo> => {\r\n const { user, error } = await auth()\r\n\r\n if (!user) {\r\n throw error || new Error(\"Authentication required\")\r\n }\r\n\r\n return user\r\n})"],"mappings":"AAAA,SAAS,aAAa;AACtB,SAAS,eAAe;AAExB,SAAS,2BAA2B;AACpC,SAAS,uBAAuB;AAYzB,MAAM,OAAO,MAAM,YAAiC;AACzD,MAAI;AAEH,YAAQ,IAAI,8BAA8B;AAC1C,UAAM,cAAc,MAAM,QAAQ;AAGjC,UAAM,gBAAgB,YAAY,IAAI,iBAAiB,GAAG;AAC1D,QAAI,eAAe;AACjB,YAAM,SAAS,MAAM,oBAAoB,eAAe,IAAI;AAC5D,UAAI,OAAO,OAAO;AAChB,cAAM,OAAiB;AAAA,UACrB,KAAK,OAAO,OAAO;AAAA,UACnB,OAAO,OAAO,SAAS;AAAA,UACvB,UAAU,OAAO;AAAA,QACnB;AACA,eAAO,EAAE,MAAM,OAAO,KAAK;AAAA,MAC7B;AAAA,IACF;AAGA,UAAM,UAAU,YAAY,IAAI,gBAAgB,GAAG;AACnD,QAAI,SAAS;AACX,YAAM,SAAS,MAAM,oBAAoB,SAAS,KAAK;AACvD,UAAI,OAAO,OAAO;AAChB,cAAM,OAAiB;AAAA,UACrB,KAAK,OAAO,OAAO;AAAA,UACnB,OAAO,OAAO,SAAS;AAAA,UACvB,UAAU,OAAO;AAAA,QACnB;AACA,eAAO,EAAE,MAAM,OAAO,KAAK;AAAA,MAC7B;AAAA,IACF;AAEE,WAAO;AAAA,MACH,MAAM;AAAA,MACN,OAAO,IAAI,gBAAgB,mBAAmB,wBAAwB;AAAA,IAC1E;AAAA,EAEF,SAAS,OAAO;AACd,YAAQ,MAAM,kBAAkB,KAAK;AACrC,QAAI,iBAAiB,iBAAiB;AACpC,aAAO;AAAA,QACL,MAAM;AAAA,QACN;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO,IAAI,gBAAgB,kBAAkB,8BAA8B;AAAA,IAC7E;AAAA,EACF;AACF,CAAC;AAKI,MAAM,kBAAkB,MAAM,YAA+B;AAClE,QAAM,EAAE,KAAK,IAAI,MAAM,KAAK;AAC5B,SAAO,SAAS;AAClB,CAAC;AAKM,MAAM,UAAU,MAAM,YAAsC;AACjE,QAAM,EAAE,KAAK,IAAI,MAAM,KAAK;AAC5B,SAAO;AACT,CAAC;AAMM,MAAM,cAAc,MAAM,YAA+B;AAC9D,QAAM,EAAE,MAAM,MAAM,IAAI,MAAM,KAAK;AAEnC,MAAI,CAAC,MAAM;AACT,UAAM,SAAS,IAAI,MAAM,yBAAyB;AAAA,EACpD;AAEA,SAAO;AACT,CAAC;","names":[]}