@tern-secure/nextjs 5.0.0 → 5.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/dist/cjs/app-router/admin/index.js +3 -0
  2. package/dist/cjs/app-router/admin/index.js.map +1 -1
  3. package/dist/cjs/app-router/admin/sessionHandler.js +74 -0
  4. package/dist/cjs/app-router/admin/sessionHandler.js.map +1 -0
  5. package/dist/cjs/app-router/client/TernSecureProvider.js +2 -2
  6. package/dist/cjs/app-router/client/TernSecureProvider.js.map +1 -1
  7. package/dist/cjs/server/auth.js.map +1 -1
  8. package/dist/cjs/server/edge-session.js +8 -10
  9. package/dist/cjs/server/edge-session.js.map +1 -1
  10. package/dist/cjs/server/ternSecureMiddleware.js +43 -25
  11. package/dist/cjs/server/ternSecureMiddleware.js.map +1 -1
  12. package/dist/cjs/server/types.js.map +1 -1
  13. package/dist/cjs/utils/admin-init.js +1 -57
  14. package/dist/cjs/utils/admin-init.js.map +1 -1
  15. package/dist/cjs/utils/allNextProviderProps.js +8 -2
  16. package/dist/cjs/utils/allNextProviderProps.js.map +1 -1
  17. package/dist/cjs/utils/tern-ui-script.js +4 -2
  18. package/dist/cjs/utils/tern-ui-script.js.map +1 -1
  19. package/dist/cjs/utils/ternsecure-sw.js +54 -0
  20. package/dist/cjs/utils/ternsecure-sw.js.map +1 -0
  21. package/dist/esm/app-router/admin/index.js +2 -0
  22. package/dist/esm/app-router/admin/index.js.map +1 -1
  23. package/dist/esm/app-router/admin/sessionHandler.js +50 -0
  24. package/dist/esm/app-router/admin/sessionHandler.js.map +1 -0
  25. package/dist/esm/app-router/client/TernSecureProvider.js +2 -2
  26. package/dist/esm/app-router/client/TernSecureProvider.js.map +1 -1
  27. package/dist/esm/server/auth.js.map +1 -1
  28. package/dist/esm/server/edge-session.js +8 -10
  29. package/dist/esm/server/edge-session.js.map +1 -1
  30. package/dist/esm/server/ternSecureMiddleware.js +43 -25
  31. package/dist/esm/server/ternSecureMiddleware.js.map +1 -1
  32. package/dist/esm/utils/admin-init.js +1 -22
  33. package/dist/esm/utils/admin-init.js.map +1 -1
  34. package/dist/esm/utils/allNextProviderProps.js +8 -2
  35. package/dist/esm/utils/allNextProviderProps.js.map +1 -1
  36. package/dist/esm/utils/tern-ui-script.js +4 -2
  37. package/dist/esm/utils/tern-ui-script.js.map +1 -1
  38. package/dist/esm/utils/ternsecure-sw.js +30 -0
  39. package/dist/esm/utils/ternsecure-sw.js.map +1 -0
  40. package/dist/types/app-router/admin/index.d.ts +1 -0
  41. package/dist/types/app-router/admin/index.d.ts.map +1 -1
  42. package/dist/types/app-router/admin/sessionHandler.d.ts +3 -0
  43. package/dist/types/app-router/admin/sessionHandler.d.ts.map +1 -0
  44. package/dist/types/server/auth.d.ts +4 -4
  45. package/dist/types/server/auth.d.ts.map +1 -1
  46. package/dist/types/server/edge-session.d.ts.map +1 -1
  47. package/dist/types/server/ternSecureMiddleware.d.ts +7 -7
  48. package/dist/types/server/ternSecureMiddleware.d.ts.map +1 -1
  49. package/dist/types/server/types.d.ts +15 -3
  50. package/dist/types/server/types.d.ts.map +1 -1
  51. package/dist/types/utils/admin-init.d.ts +1 -4
  52. package/dist/types/utils/admin-init.d.ts.map +1 -1
  53. package/dist/types/utils/allNextProviderProps.d.ts.map +1 -1
  54. package/dist/types/utils/tern-ui-script.d.ts +2 -1
  55. package/dist/types/utils/tern-ui-script.d.ts.map +1 -1
  56. package/dist/types/utils/ternsecure-sw.d.ts +8 -0
  57. package/dist/types/utils/ternsecure-sw.d.ts.map +1 -0
  58. package/package.json +4 -5
  59. package/dist/cjs/app-router/admin/sessionTernSecure.js +0 -165
  60. package/dist/cjs/app-router/admin/sessionTernSecure.js.map +0 -1
  61. package/dist/esm/app-router/admin/sessionTernSecure.js +0 -135
  62. package/dist/esm/app-router/admin/sessionTernSecure.js.map +0 -1
  63. package/dist/types/app-router/admin/sessionTernSecure.d.ts +0 -39
  64. package/dist/types/app-router/admin/sessionTernSecure.d.ts.map +0 -1
@@ -20,14 +20,17 @@ var admin_exports = {};
20
20
  __export(admin_exports, {
21
21
  clearSessionCookie: () => import_backend.clearSessionCookie,
22
22
  createSessionCookie: () => import_backend.createSessionCookie,
23
+ createSessionHandler: () => import_sessionHandler.createSessionHandler,
23
24
  verifyTernSessionCookie: () => import_backend.verifyTernSessionCookie
24
25
  });
25
26
  module.exports = __toCommonJS(admin_exports);
26
27
  var import_backend = require("@tern-secure/backend");
28
+ var import_sessionHandler = require("./sessionHandler");
27
29
  // Annotate the CommonJS export names for ESM import in node:
28
30
  0 && (module.exports = {
29
31
  clearSessionCookie,
30
32
  createSessionCookie,
33
+ createSessionHandler,
31
34
  verifyTernSessionCookie
32
35
  });
33
36
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/app-router/admin/index.ts"],"sourcesContent":["export { \r\n verifyTernSessionCookie, \r\n createSessionCookie, \r\n clearSessionCookie,\r\n} from '@tern-secure/backend'"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAIO;","names":[]}
1
+ {"version":3,"sources":["../../../../src/app-router/admin/index.ts"],"sourcesContent":["export { \r\n verifyTernSessionCookie, \r\n createSessionCookie, \r\n clearSessionCookie,\r\n} from '@tern-secure/backend'\r\n\r\nexport { createSessionHandler } from './sessionHandler'"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAIO;AAEP,4BAAqC;","names":[]}
@@ -0,0 +1,74 @@
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_backend = require("@tern-secure/backend");
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_backend.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
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/app-router/admin/sessionHandler.ts"],"sourcesContent":["import { NextRequest, NextResponse } from \"next/server\"\nimport { createSessionCookie } from \"@tern-secure/backend\"\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,qBAAoC;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,oCAAoB,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":[]}
@@ -26,10 +26,10 @@ var import_react2 = require("@tern-secure/react");
26
26
  var import_allNextProviderProps = require("../../utils/allNextProviderProps");
27
27
  var import_tern_ui_script = require("../../utils/tern-ui-script");
28
28
  function TernSecureProvider(props) {
29
- const { children, ...nextProps } = props;
29
+ const { children, enableServiceWorker, ...nextProps } = props;
30
30
  const providerProps = (0, import_allNextProviderProps.allNextProviderPropsWithEnv)(nextProps);
31
31
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_react2.TernSecureProvider, { ...providerProps, children: [
32
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_tern_ui_script.TernUIScript, {}),
32
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_tern_ui_script.TernUIScript, { router: "app" }),
33
33
  children
34
34
  ] });
35
35
  }
@@ -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, ...nextProps } = props;\r\n const providerProps = allNextProviderPropsWithEnv(nextProps);\r\n return (\r\n <TernSecureReactProvider {...providerProps}>\r\n <TernUIScript />\r\n {children}\r\n </TernSecureReactProvider>\r\n )\r\n}"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA2CI;AA1CJ,IAAAA,gBAEO;AAEP,kCAA4C;AAC5C,4BAA6B;AAiCtB,SAAS,mBAAmB,OAAqD;AACtF,QAAM,EAAC,UAAU,GAAG,UAAU,IAAI;AAClC,QAAM,oBAAgB,yDAA4B,SAAS;AAC3D,SACE,6CAAC,cAAAC,oBAAA,EAAyB,GAAG,eAC3B;AAAA,gDAAC,sCAAa;AAAA,IACX;AAAA,KACL;AAEJ;","names":["import_react","TernSecureReactProvider"]}
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":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA2CI;AA1CJ,IAAAA,gBAEO;AAEP,kCAA4C;AAC5C,4BAA6B;AAiCtB,SAAS,mBAAmB,OAAqD;AACtF,QAAM,EAAC,UAAU,qBAAqB,GAAG,UAAU,IAAI;AACvD,QAAM,oBAAgB,yDAA4B,SAAS;AAC3D,SACE,6CAAC,cAAAC,oBAAA,EAAyB,GAAG,eAC3B;AAAA,gDAAC,sCAAa,QAAO,OAAM;AAAA,IACxB;AAAA,KACL;AAEJ;","names":["import_react","TernSecureReactProvider"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/server/auth.ts"],"sourcesContent":["import { cache } from \"react\"\r\nimport { cookies } from \"next/headers\"\r\nimport type { User } 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: User | 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: User = {\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: User = {\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<User | 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<User> => {\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,OAAa;AAAA,UACjB,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,OAAa;AAAA,UACjB,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,YAAkC;AAC7D,QAAM,EAAE,KAAK,IAAI,MAAM,KAAK;AAC5B,SAAO;AACT,CAAC;AAMM,MAAM,kBAAc,oBAAM,YAA2B;AAC1D,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
+ {"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":[]}
@@ -33,12 +33,12 @@ async function verifySession(request) {
33
33
  uid: result.uid ?? "",
34
34
  email: result.email || null,
35
35
  emailVerified: result.emailVerified ?? false,
36
+ disabled: false,
36
37
  authTime: result.authTime
37
38
  };
38
39
  return {
39
- user,
40
- token: sessionCookie,
41
- sessionId: sessionCookie
40
+ isAuthenticated: true,
41
+ user
42
42
  };
43
43
  }
44
44
  }
@@ -49,27 +49,25 @@ async function verifySession(request) {
49
49
  uid: result.uid ?? "",
50
50
  email: result.email || null,
51
51
  emailVerified: result.emailVerified ?? false,
52
+ disabled: false,
52
53
  authTime: result.authTime
53
54
  };
54
55
  return {
55
- user,
56
- token: idToken,
57
- sessionId: idToken
56
+ isAuthenticated: true,
57
+ user
58
58
  };
59
59
  }
60
60
  }
61
61
  return {
62
+ isAuthenticated: false,
62
63
  user: null,
63
- token: null,
64
- sessionId: null,
65
64
  error: "No valid session found"
66
65
  };
67
66
  } catch (error) {
68
67
  console.error("Session verification error:", error);
69
68
  return {
69
+ isAuthenticated: false,
70
70
  user: null,
71
- token: null,
72
- sessionId: null,
73
71
  error: error instanceof Error ? error.message : "Session verification failed"
74
72
  };
75
73
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/server/edge-session.ts"],"sourcesContent":["import { verifyFirebaseToken } from \"./jwt-edge\"\r\nimport type { NextRequest } from \"next/server\"\r\nimport type { SessionResult, User } from \"./types\"\r\n\r\n\r\n\r\nexport async function verifySession(request: NextRequest): Promise<SessionResult> {\r\n try {\r\n //const cookieStore = await cookies()\r\n\r\n // First try session cookie\r\n\r\n const sessionCookie = request.cookies.get(\"_session_cookie\")?.value\r\n const idToken = request.cookies.get(\"_session_token\")?.value\r\n\r\n //const sessionCookie = request.cookies.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: User = {\r\n uid: result.uid ?? '',\r\n email: result.email || null,\r\n emailVerified: result.emailVerified ?? false,\r\n authTime: result.authTime,\r\n }\r\n\r\n return {\r\n user,\r\n token: sessionCookie,\r\n sessionId: sessionCookie,\r\n }\r\n }\r\n }\r\n\r\n // Then try ID token\r\n //const idToken = request.cookies.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: User = {\r\n uid: result.uid ?? '',\r\n email: result.email || null,\r\n emailVerified: result.emailVerified ?? false,\r\n authTime: result.authTime,\r\n }\r\n\r\n\r\n return {\r\n user,\r\n token: idToken,\r\n sessionId: idToken,\r\n }\r\n }\r\n }\r\n\r\n return {\r\n user: null,\r\n token: null,\r\n sessionId: null,\r\n error: \"No valid session found\",\r\n }\r\n } catch (error) {\r\n console.error(\"Session verification error:\", error)\r\n return {\r\n user: null,\r\n token: null,\r\n sessionId: null,\r\n error: error instanceof Error ? error.message : \"Session verification failed\",\r\n }\r\n }\r\n}"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAAoC;AAMpC,eAAsB,cAAc,SAA8C;AAChF,MAAI;AAKF,UAAM,gBAAgB,QAAQ,QAAQ,IAAI,iBAAiB,GAAG;AAC9D,UAAM,UAAU,QAAQ,QAAQ,IAAI,gBAAgB,GAAG;AAGvD,QAAI,eAAe;AACjB,YAAM,SAAS,UAAM,qCAAoB,eAAe,IAAI;AAC5D,UAAI,OAAO,OAAO;AACd,cAAM,OAAa;AAAA,UACjB,KAAK,OAAO,OAAO;AAAA,UACnB,OAAO,OAAO,SAAS;AAAA,UACvB,eAAe,OAAO,iBAAiB;AAAA,UACvC,UAAU,OAAO;AAAA,QACrB;AAEA,eAAO;AAAA,UACL;AAAA,UACA,OAAO;AAAA,UACP,WAAW;AAAA,QACb;AAAA,MACF;AAAA,IACF;AAIA,QAAI,SAAS;AACX,YAAM,SAAS,UAAM,qCAAoB,SAAS,KAAK;AACvD,UAAI,OAAO,OAAO;AAChB,cAAM,OAAc;AAAA,UAChB,KAAK,OAAO,OAAO;AAAA,UACnB,OAAO,OAAO,SAAS;AAAA,UACvB,eAAe,OAAO,iBAAiB;AAAA,UACvC,UAAU,OAAO;AAAA,QACrB;AAGA,eAAO;AAAA,UACL;AAAA,UACA,OAAO;AAAA,UACP,WAAW;AAAA,QACb;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,MACP,WAAW;AAAA,MACX,OAAO;AAAA,IACT;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,MAAM,+BAA+B,KAAK;AAClD,WAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,MACP,WAAW;AAAA,MACX,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,IAClD;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../src/server/edge-session.ts"],"sourcesContent":["import { verifyFirebaseToken } from \"./jwt-edge\"\r\nimport type { NextRequest } from \"next/server\"\r\nimport type { SessionResult, UserInfo } from \"./types\"\r\n\r\n\r\n\r\nexport async function verifySession(request: NextRequest): Promise<SessionResult> {\r\n try {\r\n //const cookieStore = await cookies()\r\n\r\n // First try session cookie\r\n\r\n const sessionCookie = request.cookies.get(\"_session_cookie\")?.value\r\n const idToken = request.cookies.get(\"_session_token\")?.value\r\n\r\n //const sessionCookie = request.cookies.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 emailVerified: result.emailVerified ?? false,\r\n disabled: false,\r\n authTime: result.authTime,\r\n }\r\n\r\n return {\r\n isAuthenticated: true,\r\n user\r\n }\r\n }\r\n }\r\n\r\n // Then try ID token\r\n //const idToken = request.cookies.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 emailVerified: result.emailVerified ?? false,\r\n disabled: false,\r\n authTime: result.authTime,\r\n }\r\n \r\n return {\r\n isAuthenticated: true,\r\n user\r\n }\r\n }\r\n }\r\n\r\n return {\r\n isAuthenticated: false,\r\n user: null,\r\n error: \"No valid session found\"\r\n }\r\n } catch (error) {\r\n console.error(\"Session verification error:\", error)\r\n return {\r\n isAuthenticated: false,\r\n user: null,\r\n error: error instanceof Error ? error.message : \"Session verification failed\",\r\n }\r\n }\r\n}"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAAoC;AAMpC,eAAsB,cAAc,SAA8C;AAChF,MAAI;AAKF,UAAM,gBAAgB,QAAQ,QAAQ,IAAI,iBAAiB,GAAG;AAC9D,UAAM,UAAU,QAAQ,QAAQ,IAAI,gBAAgB,GAAG;AAGvD,QAAI,eAAe;AACjB,YAAM,SAAS,UAAM,qCAAoB,eAAe,IAAI;AAC5D,UAAI,OAAO,OAAO;AACd,cAAM,OAAiB;AAAA,UACrB,KAAK,OAAO,OAAO;AAAA,UACnB,OAAO,OAAO,SAAS;AAAA,UACvB,eAAe,OAAO,iBAAiB;AAAA,UACvC,UAAU;AAAA,UACV,UAAU,OAAO;AAAA,QACrB;AAEA,eAAO;AAAA,UACL,iBAAiB;AAAA,UACjB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAIA,QAAI,SAAS;AACX,YAAM,SAAS,UAAM,qCAAoB,SAAS,KAAK;AACvD,UAAI,OAAO,OAAO;AAChB,cAAM,OAAkB;AAAA,UACpB,KAAK,OAAO,OAAO;AAAA,UACnB,OAAO,OAAO,SAAS;AAAA,UACvB,eAAe,OAAO,iBAAiB;AAAA,UACvC,UAAU;AAAA,UACV,UAAU,OAAO;AAAA,QACrB;AAEA,eAAO;AAAA,UACL,iBAAiB;AAAA,UACjB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL,iBAAiB;AAAA,MACjB,MAAM;AAAA,MACN,OAAO;AAAA,IACT;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,MAAM,+BAA+B,KAAK;AAClD,WAAO;AAAA,MACL,iBAAiB;AAAA,MACjB,MAAM;AAAA,MACN,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,IAClD;AAAA,EACF;AACF;","names":[]}
@@ -24,45 +24,63 @@ __export(ternSecureMiddleware_exports, {
24
24
  });
25
25
  module.exports = __toCommonJS(ternSecureMiddleware_exports);
26
26
  var import_server = require("next/server");
27
+ var import_edge_session = require("./edge-session");
27
28
  const runtime = "edge";
28
29
  function createRouteMatcher(patterns) {
29
30
  return (request) => {
30
31
  const { pathname } = request.nextUrl;
31
32
  return patterns.some((pattern) => {
32
- const regexPattern = new RegExp(`^${pattern.replace(/\*/g, ".*").replace(/$$(.*)$$/, "(?:$1)?")}$`);
33
- return regexPattern.test(pathname);
33
+ const regexPattern = pattern.replace(/[.*+?^${}()|[\]\\]/g, "\\$&").replace(/\\\*/g, ".*");
34
+ return new RegExp(`^${regexPattern}$`).test(pathname);
34
35
  });
35
36
  };
36
37
  }
37
- function ternSecureMiddleware(callback) {
38
- return async function middleware(request) {
39
- try {
40
- const sessionCookie = request.cookies.get("_session_cookie");
41
- const idToken = request.cookies.get("_session_token");
42
- const hasCookies = !!sessionCookie || !!idToken;
43
- const auth = {
44
- user: null,
45
- sessionId: null,
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,
46
48
  protect: async () => {
47
- if (!hasCookies) {
48
- const currentPath = request.nextUrl.pathname;
49
- if (currentPath !== "/sign-in") {
50
- const redirectUrl = new URL("/sign-in", request.url);
51
- redirectUrl.searchParams.set("redirect", currentPath);
52
- return import_server.NextResponse.redirect(redirectUrl);
53
- }
54
- }
55
49
  }
56
50
  };
57
- if (callback) {
58
- const result = await callback(auth, request);
59
- if (result instanceof Response) {
60
- return result;
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);
61
79
  }
80
+ throw error;
62
81
  }
63
- return import_server.NextResponse.next();
64
82
  } catch (error) {
65
- console.error("Middleware error:", error);
83
+ console.error("Middleware error:", error instanceof Error ? error.message : "Unknown error");
66
84
  const redirectUrl = new URL("/sign-in", request.url);
67
85
  return import_server.NextResponse.redirect(redirectUrl);
68
86
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/server/ternSecureMiddleware.ts"],"sourcesContent":["import { NextResponse, type NextMiddleware, type NextRequest } from 'next/server';\r\nimport type { User } from './types'\r\n\r\nexport const runtime = \"edge\"\r\n\r\ninterface Auth {\r\n user: User | null\r\n sessionId: string | null\r\n protect: () => Promise<void | Response>\r\n}\r\n\r\ntype MiddlewareCallback = (\r\n auth: Auth,\r\n request: NextRequest\r\n) => Promise<void | Response>\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 route pattern to regex\r\n const regexPattern = new RegExp(`^${pattern.replace(/\\*/g, \".*\").replace(/$$(.*)$$/, \"(?:$1)?\")}$`)\r\n return regexPattern.test(pathname)\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): NextMiddleware {\r\n return async function middleware(request: NextRequest) {\r\n try {\r\n\r\n const sessionCookie = request.cookies.get(\"_session_cookie\")\r\n const idToken = request.cookies.get(\"_session_token\")\r\n const hasCookies = !!sessionCookie || !!idToken\r\n\r\n const auth: Auth = {\r\n user: null,\r\n sessionId: null,\r\n protect: async () => {\r\n if (!hasCookies) {\r\n const currentPath = request.nextUrl.pathname\r\n if (currentPath !== '/sign-in') {\r\n const redirectUrl = new URL('/sign-in', request.url)\r\n redirectUrl.searchParams.set('redirect', currentPath)\r\n return NextResponse.redirect(redirectUrl)\r\n }\r\n }\r\n },\r\n }\r\n\r\n if (callback) {\r\n const result = await callback(auth, request)\r\n if (result instanceof Response) {\r\n return result\r\n }\r\n }\r\n\r\n\r\n // Continue to the next middleware or route handler\r\n return NextResponse.next()\r\n } catch (error) {\r\n console.error(\"Middleware error:\", 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,oBAAoE;AAG7D,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,IAAI,OAAO,IAAI,QAAQ,QAAQ,OAAO,IAAI,EAAE,QAAQ,YAAY,SAAS,CAAC,GAAG;AAClG,aAAO,aAAa,KAAK,QAAQ;AAAA,IACnC,CAAC;AAAA,EACH;AACF;AAQO,SAAS,qBAAqB,UAA+C;AAClF,SAAO,eAAe,WAAW,SAAsB;AACrD,QAAI;AAEF,YAAM,gBAAgB,QAAQ,QAAQ,IAAI,iBAAiB;AAC3D,YAAM,UAAU,QAAQ,QAAQ,IAAI,gBAAgB;AACpD,YAAM,aAAa,CAAC,CAAC,iBAAiB,CAAC,CAAC;AAExC,YAAM,OAAa;AAAA,QACjB,MAAM;AAAA,QACN,WAAW;AAAA,QACX,SAAS,YAAY;AACnB,cAAI,CAAC,YAAY;AACf,kBAAM,cAAc,QAAQ,QAAQ;AACpC,gBAAI,gBAAgB,YAAY;AAC9B,oBAAM,cAAc,IAAI,IAAI,YAAY,QAAQ,GAAG;AACnD,0BAAY,aAAa,IAAI,YAAY,WAAW;AACpD,qBAAO,2BAAa,SAAS,WAAW;AAAA,YAC1C;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEF,UAAI,UAAU;AACV,cAAM,SAAS,MAAM,SAAS,MAAM,OAAO;AAC3C,YAAI,kBAAkB,UAAU;AAC9B,iBAAO;AAAA,QACT;AAAA,MACJ;AAIE,aAAQ,2BAAa,KAAK;AAAA,IAC5B,SAAS,OAAO;AACd,cAAQ,MAAM,qBAAqB,KAAK;AACxC,YAAM,cAAc,IAAI,IAAI,YAAY,QAAQ,GAAG;AACnD,aAAO,2BAAa,SAAS,WAAW;AAAA,IAC1C;AAAA,EACF;AACF;","names":[]}
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 +1 @@
1
- {"version":3,"sources":["../../../src/server/types.ts"],"sourcesContent":["export interface User {\r\n uid: string\r\n email: string | null\r\n emailVerified?: boolean\r\n authTime?: number\r\n disabled?: boolean\r\n}\r\n \r\n \r\n export interface SessionResult {\r\n user: User | null\r\n token: string | null\r\n sessionId: string | null\r\n error?: string\r\n }"],"mappings":";;;;;;;;;;;;;;AAAA;AAAA;","names":[]}
1
+ {"version":3,"sources":["../../../src/server/types.ts"],"sourcesContent":["export interface User {\r\n uid: string\r\n email: string | null\r\n emailVerified?: boolean\r\n authTime?: number\r\n disabled?: boolean\r\n}\r\n \r\n\r\n\r\n export interface UserInfo {\r\n uid: string\r\n email: string | null\r\n emailVerified?: boolean\r\n authTime?: number\r\n disabled?: boolean\r\n }\r\n \r\n export interface SessionUser {\r\n uid: string\r\n email: string | null\r\n emailVerified: boolean\r\n disabled?: boolean\r\n }\r\n \r\n export interface SessionResult {\r\n isAuthenticated: boolean\r\n user: UserInfo | null\r\n error?: string\r\n }"],"mappings":";;;;;;;;;;;;;;AAAA;AAAA;","names":[]}
@@ -1,60 +1,4 @@
1
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 admin_init_exports = {};
30
- __export(admin_init_exports, {
31
- TernSecureTenantManager: () => TernSecureTenantManager,
32
- adminTernSecureAuth: () => adminTernSecureAuth,
33
- adminTernSecureDb: () => adminTernSecureDb
34
- });
35
- module.exports = __toCommonJS(admin_init_exports);
36
- var import_firebase_admin = __toESM(require("firebase-admin"));
37
- var import_config = require("./config");
38
- if (!import_firebase_admin.default.apps.length) {
39
- try {
40
- const config = (0, import_config.initializeAdminConfig)();
41
- import_firebase_admin.default.initializeApp({
42
- credential: import_firebase_admin.default.credential.cert({
43
- ...config,
44
- privateKey: config.privateKey.replace(/\\n/g, "\n")
45
- })
46
- });
47
- } catch (error) {
48
- console.error("Firebase admin initialization error", error);
49
- }
2
+ {
50
3
  }
51
- const adminTernSecureAuth = import_firebase_admin.default.auth();
52
- const adminTernSecureDb = import_firebase_admin.default.firestore();
53
- const TernSecureTenantManager = import_firebase_admin.default.auth().tenantManager();
54
- // Annotate the CommonJS export names for ESM import in node:
55
- 0 && (module.exports = {
56
- TernSecureTenantManager,
57
- adminTernSecureAuth,
58
- adminTernSecureDb
59
- });
60
4
  //# sourceMappingURL=admin-init.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utils/admin-init.ts"],"sourcesContent":["import admin from 'firebase-admin';\r\nimport { initializeAdminConfig } from './config';\r\n\r\n// Initialize Firebase Admin if not already initialized\r\nif (!admin.apps.length) {\r\n try {\r\n const config = initializeAdminConfig();\r\n admin.initializeApp({\r\n credential: admin.credential.cert({\r\n ...config,\r\n privateKey: config.privateKey.replace(/\\\\n/g, '\\n'),\r\n }),\r\n });\r\n } catch (error) {\r\n console.error('Firebase admin initialization error', error);\r\n }\r\n}\r\n\r\n// Add explicit type annotations using the types from the admin namespace\r\nexport const adminTernSecureAuth: admin.auth.Auth = admin.auth();\r\nexport const adminTernSecureDb: admin.firestore.Firestore = admin.firestore();\r\nexport const TernSecureTenantManager: admin.auth.TenantManager = admin.auth().tenantManager();"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAAkB;AAClB,oBAAsC;AAGtC,IAAI,CAAC,sBAAAA,QAAM,KAAK,QAAQ;AACtB,MAAI;AACF,UAAM,aAAS,qCAAsB;AACrC,0BAAAA,QAAM,cAAc;AAAA,MAClB,YAAY,sBAAAA,QAAM,WAAW,KAAK;AAAA,QAChC,GAAG;AAAA,QACH,YAAY,OAAO,WAAW,QAAQ,QAAQ,IAAI;AAAA,MACpD,CAAC;AAAA,IACH,CAAC;AAAA,EACH,SAAS,OAAO;AACd,YAAQ,MAAM,uCAAuC,KAAK;AAAA,EAC5D;AACF;AAGO,MAAM,sBAAuC,sBAAAA,QAAM,KAAK;AACxD,MAAM,oBAA+C,sBAAAA,QAAM,UAAU;AACrE,MAAM,0BAAoD,sBAAAA,QAAM,KAAK,EAAE,cAAc;","names":["admin"]}
1
+ {"version":3,"sources":["../../../src/utils/admin-init.ts"],"sourcesContent":["{/*import admin from 'firebase-admin';\r\nimport { initializeAdminConfig } from './config';\r\n\r\n// Initialize Firebase Admin if not already initialized\r\nif (!admin.apps.length) {\r\n try {\r\n const config = initializeAdminConfig();\r\n admin.initializeApp({\r\n credential: admin.credential.cert({\r\n ...config,\r\n privateKey: config.privateKey.replace(/\\\\n/g, '\\n'),\r\n }),\r\n });\r\n } catch (error) {\r\n console.error('Firebase admin initialization error', error);\r\n }\r\n}\r\n\r\n// Add explicit type annotations using the types from the admin namespace\r\nexport const adminTernSecureAuth: admin.auth.Auth = admin.auth();\r\nexport const adminTernSecureDb: admin.firestore.Firestore = admin.firestore();\r\nexport const TernSecureTenantManager: admin.auth.TenantManager = admin.auth().tenantManager();*/}"],"mappings":";AAAA;AAqBgG;","names":[]}
@@ -33,6 +33,8 @@ const allNextProviderPropsWithEnv = (nextProps) => {
33
33
  proxyUrl: propsProxyUrl,
34
34
  environment: propsEnvironment,
35
35
  requiresVerification: propsRequiresVerification,
36
+ isTernSecureDev: propsIsTernSecureDev,
37
+ enableServiceWorker: propsEnableServiceWorker,
36
38
  loadingComponent: propsLoadingComponent,
37
39
  ...baseProps
38
40
  } = nextProps;
@@ -45,7 +47,10 @@ const allNextProviderPropsWithEnv = (nextProps) => {
45
47
  signInUrl: process.env.NEXT_PUBLIC_SIGN_IN_URL,
46
48
  signUpUrl: process.env.NEXT_PUBLIC_SIGN_UP_URL,
47
49
  signInForceRedirectUrl: process.env.NEXT_PUBLIC_SIGN_IN_FORCE_REDIRECT_URL,
48
- signUpForceRedirectUrl: process.env.NEXT_PUBLIC_SIGN_UP_FORCE_REDIRECT_URL
50
+ signUpForceRedirectUrl: process.env.NEXT_PUBLIC_SIGN_UP_FORCE_REDIRECT_URL,
51
+ projectIdAdmin: process.env.FIREBASE_PROJECT_ID,
52
+ clientEmail: process.env.FIREBASE_CLIENT_EMAIL,
53
+ privateKey: process.env.FIREBASE_PRIVATE_KEY
49
54
  };
50
55
  const ternSecureConfig = {
51
56
  apiKey: process.env.NEXT_PUBLIC_FIREBASE_API_KEY || "",
@@ -79,8 +84,9 @@ const allNextProviderPropsWithEnv = (nextProps) => {
79
84
  // Set properties explicitly taken from TernSecureNextProps (props version)
80
85
  // These are part of the TernSecureProviderProps interface.
81
86
  requiresVerification: propsRequiresVerification,
87
+ isTernSecureDev: propsIsTernSecureDev,
88
+ enableServiceWorker: propsEnableServiceWorker,
82
89
  loadingComponent: propsLoadingComponent,
83
- ...propsRequiresVerification !== void 0 && { requireverification: propsRequiresVerification },
84
90
  //TernSecure: baseProps.Instance,
85
91
  initialState: baseProps.initialState,
86
92
  bypassApiKey: baseProps.bypassApiKey,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utils/allNextProviderProps.ts"],"sourcesContent":["import type { TernSecureNextProps } from \"../types\";\nimport type { \n TernSecureProviderProps, \n IsomorphicTernSecureOptions \n} from \"@tern-secure/react\";\n\n// Helper type for the return value, as children are handled by the consuming component\ntype NextProviderProcessedProps = Omit<TernSecureProviderProps, 'children'>;\n\nexport const allNextProviderPropsWithEnv = (\n nextProps: Omit<TernSecureNextProps, 'children'>\n): NextProviderProcessedProps => {\n const {\n signInUrl,\n signUpUrl,\n signInForceRedirectUrl: propsSignInForceRedirectUrl,\n signUpForceRedirectUrl: propsSignUpForceRedirectUrl,\n apiKey: propsApiKey,\n projectId: propsProjectId,\n customDomain: propsCustomDomain,\n proxyUrl: propsProxyUrl,\n environment: propsEnvironment,\n requiresVerification: propsRequiresVerification,\n loadingComponent: propsLoadingComponent,\n ...baseProps \n } = nextProps;\n\n const envConfig = {\n apiKey: process.env.NEXT_PUBLIC_TERN_API_KEY,\n projectId: process.env.NEXT_PUBLIC_TERN_PROJECT_ID,\n customDomain: process.env.NEXT_PUBLIC_TERN_CUSTOM_DOMAIN,\n proxyUrl: process.env.NEXT_PUBLIC_TERN_PROXY_URL,\n environment: process.env.NEXT_PUBLIC_TERN_ENVIRONMENT,\n signInUrl: process.env.NEXT_PUBLIC_SIGN_IN_URL,\n signUpUrl: process.env.NEXT_PUBLIC_SIGN_UP_URL,\n signInForceRedirectUrl: process.env.NEXT_PUBLIC_SIGN_IN_FORCE_REDIRECT_URL,\n signUpForceRedirectUrl: process.env.NEXT_PUBLIC_SIGN_UP_FORCE_REDIRECT_URL,\n };\n\n const ternSecureConfig = {\n apiKey: process.env.NEXT_PUBLIC_FIREBASE_API_KEY || '',\n authDomain: process.env.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN || '',\n appName: process.env.NEXT_PUBLIC_FIREBASE_APP_NAME || '',\n projectId: process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID || '',\n storageBucket: process.env.NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET || '',\n messagingSenderId: process.env.NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID || '',\n appId: process.env.NEXT_PUBLIC_FIREBASE_APP_ID || '',\n measurementId: process.env.NEXT_PUBLIC_FIREBASE_MEASUREMENTID\n };\n\n // Merge config values: props take precedence over environment variables\n const finalApiKey = propsApiKey ?? envConfig.apiKey;\n const finalProjectId = propsProjectId ?? envConfig.projectId;\n const finalCustomDomain = propsCustomDomain ?? envConfig.customDomain;\n const finalProxyUrl = propsProxyUrl ?? envConfig.proxyUrl;\n const finalEnvironment = propsEnvironment ?? envConfig.environment;\n const finalSignInUrl = signInUrl ?? envConfig.signInUrl;\n const finalSignUpUrl = signUpUrl ?? envConfig.signUpUrl;\n const finalSignInForceRedirectUrl = propsSignInForceRedirectUrl ?? envConfig.signInForceRedirectUrl;\n const finalSignUpForceRedirectUrl = propsSignUpForceRedirectUrl ?? envConfig.signUpForceRedirectUrl\n\n // Construct the result, ensuring it conforms to NextProviderProcessedProps\n // (Omit<TernSecureProviderProps, 'children'>)\n const result: NextProviderProcessedProps = {\n ...(baseProps as Omit<TernSecureProviderProps, 'children' | keyof IsomorphicTernSecureOptions | 'requiresVerification' | 'loadingComponent'>),\n \n // Set the merged/prioritized instance configuration properties\n apiKey: finalApiKey,\n projectId: finalProjectId,\n customDomain: finalCustomDomain,\n proxyUrl: finalProxyUrl,\n environment: finalEnvironment,\n\n // Set the Firebase configuration properties\n ternSecureConfig,\n \n // Set properties explicitly taken from TernSecureNextProps (props version)\n // These are part of the TernSecureProviderProps interface.\n requiresVerification: propsRequiresVerification,\n loadingComponent: propsLoadingComponent,\n ...(propsRequiresVerification !== undefined && { requireverification: propsRequiresVerification }),\n\n //TernSecure: baseProps.Instance,\n initialState: baseProps.initialState,\n bypassApiKey: baseProps.bypassApiKey,\n initialSession: baseProps.initialSession,\n defaultAppearance: baseProps.defaultAppearance,\n signInUrl: finalSignInUrl,\n signUpUrl: finalSignUpUrl,\n signInForceRedirectUrl: finalSignInForceRedirectUrl,\n signUpForceRedirectUrl: finalSignUpForceRedirectUrl,\n mode: baseProps.mode,\n onAuthStateChanged: baseProps.onAuthStateChanged,\n onError: baseProps.onError,\n };\n\n // Clean up undefined keys that might have resulted from spreading if not present in baseProps\n // and also not set by merged values (e.g. if env var is also undefined)\n Object.keys(result).forEach(key => {\n if (result[key as keyof NextProviderProcessedProps] === undefined) {\n delete result[key as keyof NextProviderProcessedProps];\n }\n });\n\n return result;\n};"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AASO,MAAM,8BAA8B,CACzC,cAC+B;AAC/B,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,wBAAwB;AAAA,IACxB,wBAAwB;AAAA,IACxB,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,cAAc;AAAA,IACd,UAAU;AAAA,IACV,aAAa;AAAA,IACb,sBAAsB;AAAA,IACtB,kBAAkB;AAAA,IAClB,GAAG;AAAA,EACL,IAAI;AAEJ,QAAM,YAAY;AAAA,IAChB,QAAQ,QAAQ,IAAI;AAAA,IACpB,WAAW,QAAQ,IAAI;AAAA,IACvB,cAAc,QAAQ,IAAI;AAAA,IAC1B,UAAU,QAAQ,IAAI;AAAA,IACtB,aAAa,QAAQ,IAAI;AAAA,IACzB,WAAW,QAAQ,IAAI;AAAA,IACvB,WAAW,QAAQ,IAAI;AAAA,IACvB,wBAAwB,QAAQ,IAAI;AAAA,IACpC,wBAAwB,QAAQ,IAAI;AAAA,EACtC;AAEA,QAAM,mBAAmB;AAAA,IACvB,QAAQ,QAAQ,IAAI,gCAAgC;AAAA,IACpD,YAAY,QAAQ,IAAI,oCAAoC;AAAA,IAC5D,SAAS,QAAQ,IAAI,iCAAiC;AAAA,IACtD,WAAW,QAAQ,IAAI,mCAAmC;AAAA,IAC1D,eAAe,QAAQ,IAAI,uCAAuC;AAAA,IAClE,mBAAmB,QAAQ,IAAI,4CAA4C;AAAA,IAC3E,OAAO,QAAQ,IAAI,+BAA+B;AAAA,IAClD,eAAe,QAAQ,IAAI;AAAA,EAC7B;AAGA,QAAM,cAAc,eAAe,UAAU;AAC7C,QAAM,iBAAiB,kBAAkB,UAAU;AACnD,QAAM,oBAAoB,qBAAqB,UAAU;AACzD,QAAM,gBAAgB,iBAAiB,UAAU;AACjD,QAAM,mBAAmB,oBAAoB,UAAU;AACvD,QAAM,iBAAiB,aAAa,UAAU;AAC9C,QAAM,iBAAiB,aAAa,UAAU;AAC9C,QAAM,8BAA8B,+BAA+B,UAAU;AAC7E,QAAM,8BAA8B,+BAA+B,UAAU;AAI7E,QAAM,SAAqC;AAAA,IACzC,GAAI;AAAA;AAAA,IAGJ,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,cAAc;AAAA,IACd,UAAU;AAAA,IACV,aAAa;AAAA;AAAA,IAGb;AAAA;AAAA;AAAA,IAIA,sBAAsB;AAAA,IACtB,kBAAkB;AAAA,IAClB,GAAI,8BAA8B,UAAa,EAAE,qBAAqB,0BAA0B;AAAA;AAAA,IAGhG,cAAc,UAAU;AAAA,IACxB,cAAc,UAAU;AAAA,IACxB,gBAAgB,UAAU;AAAA,IAC1B,mBAAmB,UAAU;AAAA,IAC7B,WAAW;AAAA,IACX,WAAW;AAAA,IACX,wBAAwB;AAAA,IACxB,wBAAwB;AAAA,IACxB,MAAM,UAAU;AAAA,IAChB,oBAAoB,UAAU;AAAA,IAC9B,SAAS,UAAU;AAAA,EACrB;AAIA,SAAO,KAAK,MAAM,EAAE,QAAQ,SAAO;AACjC,QAAI,OAAO,GAAuC,MAAM,QAAW;AACjE,aAAO,OAAO,GAAuC;AAAA,IACvD;AAAA,EACF,CAAC;AAED,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../../src/utils/allNextProviderProps.ts"],"sourcesContent":["import type { TernSecureNextProps } from \"../types\";\nimport type { \n TernSecureProviderProps, \n IsomorphicTernSecureOptions \n} from \"@tern-secure/react\";\n\n// Helper type for the return value, as children are handled by the consuming component\ntype NextProviderProcessedProps = Omit<TernSecureProviderProps, 'children'>;\n\nexport const allNextProviderPropsWithEnv = (\n nextProps: Omit<TernSecureNextProps, 'children'>\n): NextProviderProcessedProps => {\n const {\n signInUrl,\n signUpUrl,\n signInForceRedirectUrl: propsSignInForceRedirectUrl,\n signUpForceRedirectUrl: propsSignUpForceRedirectUrl,\n apiKey: propsApiKey,\n projectId: propsProjectId,\n customDomain: propsCustomDomain,\n proxyUrl: propsProxyUrl,\n environment: propsEnvironment,\n requiresVerification: propsRequiresVerification,\n isTernSecureDev: propsIsTernSecureDev,\n enableServiceWorker: propsEnableServiceWorker,\n loadingComponent: propsLoadingComponent,\n ...baseProps \n } = nextProps;\n\n const envConfig = {\n apiKey: process.env.NEXT_PUBLIC_TERN_API_KEY,\n projectId: process.env.NEXT_PUBLIC_TERN_PROJECT_ID,\n customDomain: process.env.NEXT_PUBLIC_TERN_CUSTOM_DOMAIN,\n proxyUrl: process.env.NEXT_PUBLIC_TERN_PROXY_URL,\n environment: process.env.NEXT_PUBLIC_TERN_ENVIRONMENT,\n signInUrl: process.env.NEXT_PUBLIC_SIGN_IN_URL,\n signUpUrl: process.env.NEXT_PUBLIC_SIGN_UP_URL,\n signInForceRedirectUrl: process.env.NEXT_PUBLIC_SIGN_IN_FORCE_REDIRECT_URL,\n signUpForceRedirectUrl: process.env.NEXT_PUBLIC_SIGN_UP_FORCE_REDIRECT_URL,\n projectIdAdmin: process.env.FIREBASE_PROJECT_ID,\n clientEmail: process.env.FIREBASE_CLIENT_EMAIL,\n privateKey: process.env.FIREBASE_PRIVATE_KEY,\n };\n\n const ternSecureConfig = {\n apiKey: process.env.NEXT_PUBLIC_FIREBASE_API_KEY || '',\n authDomain: process.env.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN || '',\n appName: process.env.NEXT_PUBLIC_FIREBASE_APP_NAME || '',\n projectId: process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID || '',\n storageBucket: process.env.NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET || '',\n messagingSenderId: process.env.NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID || '',\n appId: process.env.NEXT_PUBLIC_FIREBASE_APP_ID || '',\n measurementId: process.env.NEXT_PUBLIC_FIREBASE_MEASUREMENTID\n };\n\n // Merge config values: props take precedence over environment variables\n const finalApiKey = propsApiKey ?? envConfig.apiKey;\n const finalProjectId = propsProjectId ?? envConfig.projectId;\n const finalCustomDomain = propsCustomDomain ?? envConfig.customDomain;\n const finalProxyUrl = propsProxyUrl ?? envConfig.proxyUrl;\n const finalEnvironment = propsEnvironment ?? envConfig.environment;\n const finalSignInUrl = signInUrl ?? envConfig.signInUrl;\n const finalSignUpUrl = signUpUrl ?? envConfig.signUpUrl;\n const finalSignInForceRedirectUrl = propsSignInForceRedirectUrl ?? envConfig.signInForceRedirectUrl;\n const finalSignUpForceRedirectUrl = propsSignUpForceRedirectUrl ?? envConfig.signUpForceRedirectUrl\n\n // Construct the result, ensuring it conforms to NextProviderProcessedProps\n // (Omit<TernSecureProviderProps, 'children'>)\n const result: NextProviderProcessedProps = {\n ...(baseProps as Omit<TernSecureProviderProps, 'children' | keyof IsomorphicTernSecureOptions | 'requiresVerification' | 'loadingComponent'>),\n \n // Set the merged/prioritized instance configuration properties\n apiKey: finalApiKey,\n projectId: finalProjectId,\n customDomain: finalCustomDomain,\n proxyUrl: finalProxyUrl,\n environment: finalEnvironment,\n\n // Set the Firebase configuration properties\n ternSecureConfig,\n \n // Set properties explicitly taken from TernSecureNextProps (props version)\n // These are part of the TernSecureProviderProps interface.\n requiresVerification: propsRequiresVerification,\n isTernSecureDev: propsIsTernSecureDev,\n enableServiceWorker: propsEnableServiceWorker,\n loadingComponent: propsLoadingComponent,\n\n //TernSecure: baseProps.Instance,\n initialState: baseProps.initialState,\n bypassApiKey: baseProps.bypassApiKey,\n initialSession: baseProps.initialSession,\n defaultAppearance: baseProps.defaultAppearance,\n signInUrl: finalSignInUrl,\n signUpUrl: finalSignUpUrl,\n signInForceRedirectUrl: finalSignInForceRedirectUrl,\n signUpForceRedirectUrl: finalSignUpForceRedirectUrl,\n mode: baseProps.mode,\n onAuthStateChanged: baseProps.onAuthStateChanged,\n onError: baseProps.onError,\n };\n\n // Clean up undefined keys that might have resulted from spreading if not present in baseProps\n // and also not set by merged values (e.g. if env var is also undefined)\n Object.keys(result).forEach(key => {\n if (result[key as keyof NextProviderProcessedProps] === undefined) {\n delete result[key as keyof NextProviderProcessedProps];\n }\n });\n\n return result;\n};"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AASO,MAAM,8BAA8B,CACzC,cAC+B;AAC/B,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,wBAAwB;AAAA,IACxB,wBAAwB;AAAA,IACxB,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,cAAc;AAAA,IACd,UAAU;AAAA,IACV,aAAa;AAAA,IACb,sBAAsB;AAAA,IACtB,iBAAiB;AAAA,IACjB,qBAAqB;AAAA,IACrB,kBAAkB;AAAA,IAClB,GAAG;AAAA,EACL,IAAI;AAEJ,QAAM,YAAY;AAAA,IAChB,QAAQ,QAAQ,IAAI;AAAA,IACpB,WAAW,QAAQ,IAAI;AAAA,IACvB,cAAc,QAAQ,IAAI;AAAA,IAC1B,UAAU,QAAQ,IAAI;AAAA,IACtB,aAAa,QAAQ,IAAI;AAAA,IACzB,WAAW,QAAQ,IAAI;AAAA,IACvB,WAAW,QAAQ,IAAI;AAAA,IACvB,wBAAwB,QAAQ,IAAI;AAAA,IACpC,wBAAwB,QAAQ,IAAI;AAAA,IACpC,gBAAgB,QAAQ,IAAI;AAAA,IAC5B,aAAa,QAAQ,IAAI;AAAA,IACzB,YAAY,QAAQ,IAAI;AAAA,EAC1B;AAEA,QAAM,mBAAmB;AAAA,IACvB,QAAQ,QAAQ,IAAI,gCAAgC;AAAA,IACpD,YAAY,QAAQ,IAAI,oCAAoC;AAAA,IAC5D,SAAS,QAAQ,IAAI,iCAAiC;AAAA,IACtD,WAAW,QAAQ,IAAI,mCAAmC;AAAA,IAC1D,eAAe,QAAQ,IAAI,uCAAuC;AAAA,IAClE,mBAAmB,QAAQ,IAAI,4CAA4C;AAAA,IAC3E,OAAO,QAAQ,IAAI,+BAA+B;AAAA,IAClD,eAAe,QAAQ,IAAI;AAAA,EAC7B;AAGA,QAAM,cAAc,eAAe,UAAU;AAC7C,QAAM,iBAAiB,kBAAkB,UAAU;AACnD,QAAM,oBAAoB,qBAAqB,UAAU;AACzD,QAAM,gBAAgB,iBAAiB,UAAU;AACjD,QAAM,mBAAmB,oBAAoB,UAAU;AACvD,QAAM,iBAAiB,aAAa,UAAU;AAC9C,QAAM,iBAAiB,aAAa,UAAU;AAC9C,QAAM,8BAA8B,+BAA+B,UAAU;AAC7E,QAAM,8BAA8B,+BAA+B,UAAU;AAI7E,QAAM,SAAqC;AAAA,IACzC,GAAI;AAAA;AAAA,IAGJ,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,cAAc;AAAA,IACd,UAAU;AAAA,IACV,aAAa;AAAA;AAAA,IAGb;AAAA;AAAA;AAAA,IAIA,sBAAsB;AAAA,IACtB,iBAAiB;AAAA,IACjB,qBAAqB;AAAA,IACrB,kBAAkB;AAAA;AAAA,IAGlB,cAAc,UAAU;AAAA,IACxB,cAAc,UAAU;AAAA,IACxB,gBAAgB,UAAU;AAAA,IAC1B,mBAAmB,UAAU;AAAA,IAC7B,WAAW;AAAA,IACX,WAAW;AAAA,IACX,wBAAwB;AAAA,IACxB,wBAAwB;AAAA,IACxB,MAAM,UAAU;AAAA,IAChB,oBAAoB,UAAU;AAAA,IAC9B,SAAS,UAAU;AAAA,EACrB;AAIA,SAAO,KAAK,MAAM,EAAE,QAAQ,SAAO;AACjC,QAAI,OAAO,GAAuC,MAAM,QAAW;AACjE,aAAO,OAAO,GAAuC;AAAA,IACvD;AAAA,EACF,CAAC;AAED,SAAO;AACT;","names":[]}
@@ -41,7 +41,8 @@ function TernUIScript({
41
41
  customDomain,
42
42
  proxyUrl,
43
43
  version,
44
- nonce
44
+ nonce,
45
+ router = "app"
45
46
  }) {
46
47
  const effectiveDomain = isDevelopment ? devDomain : customDomain;
47
48
  console.log("[TernSecure] TernUIScript: Using effective domain:", effectiveDomain);
@@ -53,7 +54,8 @@ function TernUIScript({
53
54
  customDomain: effectiveDomain,
54
55
  proxyUrl,
55
56
  version,
56
- nonce
57
+ nonce,
58
+ router
57
59
  };
58
60
  const scriptUrl = (0, import_react.ternUIgetScriptUrl)(scriptOptions);
59
61
  const scriptAttributes = (0, import_react.constructScriptAttributes)(scriptOptions);
@@ -1 +1 @@
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}\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}: 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 };\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;AA0CQ;AA1CR,oBAAmB;AACnB,mBAA8D;AAG9D,MAAM,gBAAgB,QAAQ,IAAI,aAAa;AAC/C,MAAM,YAAY,QAAQ,IAAI,gBAAgB;AAO9C,MAAM,YAAY,gBACZ,oBAAoB,aAAa,QAAQ,IAAI,4BAA4B,MAAM,KAC/E;AAGC,SAAS,aAAa;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,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,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
+ {"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"]}
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ "use client";
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
+ var ternsecure_sw_exports = {};
21
+ __export(ternsecure_sw_exports, {
22
+ TernUIServiceWorker: () => TernUIServiceWorker
23
+ });
24
+ module.exports = __toCommonJS(ternsecure_sw_exports);
25
+ var import_react = require("react");
26
+ var import_serviceWorker = require("@tern-secure/shared/serviceWorker");
27
+ const TernUIServiceWorker = ({
28
+ ternSecureConfig,
29
+ baseUrl = window.location.origin
30
+ }) => {
31
+ (0, import_react.useEffect)(() => {
32
+ const registerServiceWorker = async () => {
33
+ if (!ternSecureConfig) {
34
+ console.warn("[TernSecure] Service worker registration skipped: config not provided");
35
+ return;
36
+ }
37
+ try {
38
+ await (0, import_serviceWorker.reg)({
39
+ firebaseConfig: ternSecureConfig,
40
+ domain: baseUrl
41
+ });
42
+ } catch (error) {
43
+ console.error("[TernSecure] Service worker registration failed:", error);
44
+ }
45
+ };
46
+ registerServiceWorker();
47
+ }, [ternSecureConfig, baseUrl]);
48
+ return null;
49
+ };
50
+ // Annotate the CommonJS export names for ESM import in node:
51
+ 0 && (module.exports = {
52
+ TernUIServiceWorker
53
+ });
54
+ //# sourceMappingURL=ternsecure-sw.js.map
@@ -0,0 +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":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,mBAA0B;AAE1B,2BAAoB;AAOb,MAAM,sBAA0D,CAAC;AAAA,EACpE;AAAA,EACA,UAAU,OAAO,SAAS;AAC9B,MAAM;AACJ,8BAAU,MAAM;AACd,UAAM,wBAAwB,YAAY;AACxC,UAAI,CAAC,kBAAkB;AACrB,gBAAQ,KAAK,uEAAuE;AACpF;AAAA,MACF;AAEA,UAAI;AACF,kBAAM,0BAAI;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":[]}
@@ -3,9 +3,11 @@ import {
3
3
  createSessionCookie,
4
4
  clearSessionCookie
5
5
  } from "@tern-secure/backend";
6
+ import { createSessionHandler } from "./sessionHandler";
6
7
  export {
7
8
  clearSessionCookie,
8
9
  createSessionCookie,
10
+ createSessionHandler,
9
11
  verifyTernSessionCookie
10
12
  };
11
13
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/app-router/admin/index.ts"],"sourcesContent":["export { \r\n verifyTernSessionCookie, \r\n createSessionCookie, \r\n clearSessionCookie,\r\n} from '@tern-secure/backend'"],"mappings":"AAAA;AAAA,EACI;AAAA,EACA;AAAA,EACA;AAAA,OACG;","names":[]}
1
+ {"version":3,"sources":["../../../../src/app-router/admin/index.ts"],"sourcesContent":["export { \r\n verifyTernSessionCookie, \r\n createSessionCookie, \r\n clearSessionCookie,\r\n} from '@tern-secure/backend'\r\n\r\nexport { createSessionHandler } from './sessionHandler'"],"mappings":"AAAA;AAAA,EACI;AAAA,EACA;AAAA,EACA;AAAA,OACG;AAEP,SAAS,4BAA4B;","names":[]}