@tern-secure/nextjs 3.3.3 → 3.4.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 (174) hide show
  1. package/README.md +33 -33
  2. package/dist/types/index.d.ts +1 -0
  3. package/package.json +79 -79
  4. package/dist/cjs/app-router/client/TernSecureProvider.js +0 -33
  5. package/dist/cjs/app-router/client/TernSecureProvider.js.map +0 -1
  6. package/dist/cjs/app-router/client/actions.js +0 -97
  7. package/dist/cjs/app-router/client/actions.js.map +0 -1
  8. package/dist/cjs/app-router/server/auth.js +0 -71
  9. package/dist/cjs/app-router/server/auth.js.map +0 -1
  10. package/dist/cjs/app-router/server/index.js +0 -42
  11. package/dist/cjs/app-router/server/index.js.map +0 -1
  12. package/dist/cjs/app-router/server/sessionTernSecure.js +0 -159
  13. package/dist/cjs/app-router/server/sessionTernSecure.js.map +0 -1
  14. package/dist/cjs/app-router/server/ternSecureMiddleware.js +0 -50
  15. package/dist/cjs/app-router/server/ternSecureMiddleware.js.map +0 -1
  16. package/dist/cjs/boundary/TernSecureClientProvider.js +0 -94
  17. package/dist/cjs/boundary/TernSecureClientProvider.js.map +0 -1
  18. package/dist/cjs/boundary/TernSecureCtx.js +0 -49
  19. package/dist/cjs/boundary/TernSecureCtx.js.map +0 -1
  20. package/dist/cjs/boundary/hooks/useAuth.js +0 -51
  21. package/dist/cjs/boundary/hooks/useAuth.js.map +0 -1
  22. package/dist/cjs/boundary/hooks/useUser.js +0 -44
  23. package/dist/cjs/boundary/hooks/useUser.js.map +0 -1
  24. package/dist/cjs/components/background.js +0 -65
  25. package/dist/cjs/components/background.js.map +0 -1
  26. package/dist/cjs/components/sign-in.js +0 -243
  27. package/dist/cjs/components/sign-in.js.map +0 -1
  28. package/dist/cjs/components/sign-out.js +0 -69
  29. package/dist/cjs/components/sign-out.js.map +0 -1
  30. package/dist/cjs/components/ui/alert.js +0 -88
  31. package/dist/cjs/components/ui/alert.js.map +0 -1
  32. package/dist/cjs/components/ui/button.js +0 -84
  33. package/dist/cjs/components/ui/button.js.map +0 -1
  34. package/dist/cjs/components/ui/card.js +0 -101
  35. package/dist/cjs/components/ui/card.js.map +0 -1
  36. package/dist/cjs/components/ui/input.js +0 -58
  37. package/dist/cjs/components/ui/input.js.map +0 -1
  38. package/dist/cjs/components/ui/label.js +0 -55
  39. package/dist/cjs/components/ui/label.js.map +0 -1
  40. package/dist/cjs/components/ui/separator.js +0 -59
  41. package/dist/cjs/components/ui/separator.js.map +0 -1
  42. package/dist/cjs/errors.js +0 -41
  43. package/dist/cjs/errors.js.map +0 -1
  44. package/dist/cjs/index.js +0 -56
  45. package/dist/cjs/index.js.map +0 -1
  46. package/dist/cjs/lib/utils.d.js +0 -17
  47. package/dist/cjs/lib/utils.d.js.map +0 -1
  48. package/dist/cjs/lib/utils.js +0 -33
  49. package/dist/cjs/lib/utils.js.map +0 -1
  50. package/dist/cjs/types.js +0 -17
  51. package/dist/cjs/types.js.map +0 -1
  52. package/dist/cjs/utils/admin-init.js +0 -57
  53. package/dist/cjs/utils/admin-init.js.map +0 -1
  54. package/dist/cjs/utils/client-init.js +0 -49
  55. package/dist/cjs/utils/client-init.js.map +0 -1
  56. package/dist/cjs/utils/config.js +0 -113
  57. package/dist/cjs/utils/config.js.map +0 -1
  58. package/dist/cjs/utils/construct.js +0 -63
  59. package/dist/cjs/utils/construct.js.map +0 -1
  60. package/dist/cjs/utils/create-styles.js +0 -149
  61. package/dist/cjs/utils/create-styles.js.map +0 -1
  62. package/dist/esm/app-router/client/TernSecureProvider.js +0 -9
  63. package/dist/esm/app-router/client/TernSecureProvider.js.map +0 -1
  64. package/dist/esm/app-router/client/actions.js +0 -70
  65. package/dist/esm/app-router/client/actions.js.map +0 -1
  66. package/dist/esm/app-router/server/auth.js +0 -47
  67. package/dist/esm/app-router/server/auth.js.map +0 -1
  68. package/dist/esm/app-router/server/index.js +0 -13
  69. package/dist/esm/app-router/server/index.js.map +0 -1
  70. package/dist/esm/app-router/server/sessionTernSecure.js +0 -129
  71. package/dist/esm/app-router/server/sessionTernSecure.js.map +0 -1
  72. package/dist/esm/app-router/server/ternSecureMiddleware.js +0 -26
  73. package/dist/esm/app-router/server/ternSecureMiddleware.js.map +0 -1
  74. package/dist/esm/boundary/TernSecureClientProvider.js +0 -70
  75. package/dist/esm/boundary/TernSecureClientProvider.js.map +0 -1
  76. package/dist/esm/boundary/TernSecureCtx.js +0 -23
  77. package/dist/esm/boundary/TernSecureCtx.js.map +0 -1
  78. package/dist/esm/boundary/hooks/useAuth.js +0 -27
  79. package/dist/esm/boundary/hooks/useAuth.js.map +0 -1
  80. package/dist/esm/boundary/hooks/useUser.js +0 -20
  81. package/dist/esm/boundary/hooks/useUser.js.map +0 -1
  82. package/dist/esm/components/background.js +0 -41
  83. package/dist/esm/components/background.js.map +0 -1
  84. package/dist/esm/components/sign-in.js +0 -219
  85. package/dist/esm/components/sign-in.js.map +0 -1
  86. package/dist/esm/components/sign-out.js +0 -45
  87. package/dist/esm/components/sign-out.js.map +0 -1
  88. package/dist/esm/components/ui/alert.js +0 -52
  89. package/dist/esm/components/ui/alert.js.map +0 -1
  90. package/dist/esm/components/ui/button.js +0 -49
  91. package/dist/esm/components/ui/button.js.map +0 -1
  92. package/dist/esm/components/ui/card.js +0 -62
  93. package/dist/esm/components/ui/card.js.map +0 -1
  94. package/dist/esm/components/ui/input.js +0 -24
  95. package/dist/esm/components/ui/input.js.map +0 -1
  96. package/dist/esm/components/ui/label.js +0 -21
  97. package/dist/esm/components/ui/label.js.map +0 -1
  98. package/dist/esm/components/ui/separator.js +0 -25
  99. package/dist/esm/components/ui/separator.js.map +0 -1
  100. package/dist/esm/errors.js +0 -16
  101. package/dist/esm/errors.js.map +0 -1
  102. package/dist/esm/index.js +0 -22
  103. package/dist/esm/index.js.map +0 -1
  104. package/dist/esm/lib/utils.d.js +0 -1
  105. package/dist/esm/lib/utils.d.js.map +0 -1
  106. package/dist/esm/lib/utils.js +0 -9
  107. package/dist/esm/lib/utils.js.map +0 -1
  108. package/dist/esm/types.js +0 -1
  109. package/dist/esm/types.js.map +0 -1
  110. package/dist/esm/utils/admin-init.js +0 -22
  111. package/dist/esm/utils/admin-init.js.map +0 -1
  112. package/dist/esm/utils/client-init.js +0 -22
  113. package/dist/esm/utils/client-init.js.map +0 -1
  114. package/dist/esm/utils/config.js +0 -84
  115. package/dist/esm/utils/config.js.map +0 -1
  116. package/dist/esm/utils/construct.js +0 -37
  117. package/dist/esm/utils/construct.js.map +0 -1
  118. package/dist/esm/utils/create-styles.js +0 -123
  119. package/dist/esm/utils/create-styles.js.map +0 -1
  120. package/dist/types/app-router/client/TernSecureProvider.d.ts +0 -26
  121. package/dist/types/app-router/client/TernSecureProvider.d.ts.map +0 -1
  122. package/dist/types/app-router/client/actions.d.ts +0 -39
  123. package/dist/types/app-router/client/actions.d.ts.map +0 -1
  124. package/dist/types/app-router/server/auth.d.ts +0 -7
  125. package/dist/types/app-router/server/auth.d.ts.map +0 -1
  126. package/dist/types/app-router/server/index.d.ts +0 -5
  127. package/dist/types/app-router/server/index.d.ts.map +0 -1
  128. package/dist/types/app-router/server/sessionTernSecure.d.ts +0 -37
  129. package/dist/types/app-router/server/sessionTernSecure.d.ts.map +0 -1
  130. package/dist/types/app-router/server/ternSecureMiddleware.d.ts +0 -7
  131. package/dist/types/app-router/server/ternSecureMiddleware.d.ts.map +0 -1
  132. package/dist/types/boundary/TernSecureClientProvider.d.ts +0 -11
  133. package/dist/types/boundary/TernSecureClientProvider.d.ts.map +0 -1
  134. package/dist/types/boundary/TernSecureCtx.d.ts +0 -15
  135. package/dist/types/boundary/TernSecureCtx.d.ts.map +0 -1
  136. package/dist/types/boundary/hooks/useAuth.d.ts +0 -11
  137. package/dist/types/boundary/hooks/useAuth.d.ts.map +0 -1
  138. package/dist/types/boundary/hooks/useUser.d.ts +0 -7
  139. package/dist/types/boundary/hooks/useUser.d.ts.map +0 -1
  140. package/dist/types/components/background.d.ts +0 -2
  141. package/dist/types/components/background.d.ts.map +0 -1
  142. package/dist/types/components/sign-in.d.ts +0 -18
  143. package/dist/types/components/sign-in.d.ts.map +0 -1
  144. package/dist/types/components/sign-out.d.ts +0 -10
  145. package/dist/types/components/sign-out.d.ts.map +0 -1
  146. package/dist/types/components/ui/alert.d.ts +0 -9
  147. package/dist/types/components/ui/alert.d.ts.map +0 -1
  148. package/dist/types/components/ui/button.d.ts +0 -12
  149. package/dist/types/components/ui/button.d.ts.map +0 -1
  150. package/dist/types/components/ui/card.d.ts +0 -9
  151. package/dist/types/components/ui/card.d.ts.map +0 -1
  152. package/dist/types/components/ui/input.d.ts +0 -4
  153. package/dist/types/components/ui/input.d.ts.map +0 -1
  154. package/dist/types/components/ui/label.d.ts +0 -6
  155. package/dist/types/components/ui/label.d.ts.map +0 -1
  156. package/dist/types/components/ui/separator.d.ts +0 -5
  157. package/dist/types/components/ui/separator.d.ts.map +0 -1
  158. package/dist/types/errors.d.ts +0 -9
  159. package/dist/types/errors.d.ts.map +0 -1
  160. package/dist/types/index.d.ts.map +0 -1
  161. package/dist/types/lib/utils.d.ts +0 -3
  162. package/dist/types/lib/utils.d.ts.map +0 -1
  163. package/dist/types/types.d.ts +0 -63
  164. package/dist/types/types.d.ts.map +0 -1
  165. package/dist/types/utils/admin-init.d.ts +0 -4
  166. package/dist/types/utils/admin-init.d.ts.map +0 -1
  167. package/dist/types/utils/client-init.d.ts +0 -5
  168. package/dist/types/utils/client-init.d.ts.map +0 -1
  169. package/dist/types/utils/config.d.ts +0 -35
  170. package/dist/types/utils/config.d.ts.map +0 -1
  171. package/dist/types/utils/construct.d.ts +0 -22
  172. package/dist/types/utils/construct.d.ts.map +0 -1
  173. package/dist/types/utils/create-styles.d.ts +0 -99
  174. package/dist/types/utils/create-styles.d.ts.map +0 -1
@@ -1,63 +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 construct_exports = {};
20
- __export(construct_exports, {
21
- constructFullUrl: () => constructFullUrl,
22
- constructUrlWithRedirect: () => constructUrlWithRedirect,
23
- getValidRedirectUrl: () => getValidRedirectUrl
24
- });
25
- module.exports = __toCommonJS(construct_exports);
26
- const constructFullUrl = (path) => {
27
- const baseUrl = window.location.origin;
28
- if (path.startsWith("http")) {
29
- return path;
30
- }
31
- return `${baseUrl}${path.startsWith("/") ? path : `/${path}`}`;
32
- };
33
- const constructUrlWithRedirect = (path, redirectUrl, loginPath) => {
34
- const url = new URL(path, window.location.origin);
35
- if (redirectUrl && !redirectUrl.startsWith(loginPath)) {
36
- const fullRedirectUrl = redirectUrl.startsWith("http") ? redirectUrl : constructFullUrl(redirectUrl);
37
- url.searchParams.set("redirect_url", fullRedirectUrl);
38
- }
39
- return url.toString();
40
- };
41
- const getValidRedirectUrl = (redirectUrl, searchParams) => {
42
- const redirect = redirectUrl || searchParams.get("redirect_url") || "/";
43
- try {
44
- if (redirect.startsWith("http")) {
45
- const url = new URL(redirect);
46
- if (url.origin === window.location.origin) {
47
- return redirect;
48
- }
49
- return "/";
50
- }
51
- return constructFullUrl(redirect);
52
- } catch (e) {
53
- console.error("Invalid redirect URL:", e);
54
- return constructFullUrl("/");
55
- }
56
- };
57
- // Annotate the CommonJS export names for ESM import in node:
58
- 0 && (module.exports = {
59
- constructFullUrl,
60
- constructUrlWithRedirect,
61
- getValidRedirectUrl
62
- });
63
- //# sourceMappingURL=construct.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/utils/construct.ts"],"sourcesContent":["/**\r\n * Constructs a full URL with the current origin\r\n * @param path - The path to construct the URL for\r\n * @returns The full URL with origin\r\n */\r\nexport const constructFullUrl = (path: string) => {\r\n const baseUrl = window.location.origin\r\n if (path.startsWith('http')) {\r\n return path\r\n }\r\n return `${baseUrl}${path.startsWith('/') ? path : `/${path}`}`\r\n }\r\n \r\n /**\r\n * Constructs a URL with redirect parameters\r\n * @param path - The base path (usually login path)\r\n * @param redirectUrl - The URL to redirect to after action completes\r\n * @param loginPath - The login path to check against\r\n * @returns The full URL with redirect parameters\r\n */\r\n export const constructUrlWithRedirect = (path: string, redirectUrl: string, loginPath: string) => {\r\n // Create the URL with the full origin\r\n const url = new URL(path, window.location.origin)\r\n \r\n // Add redirect parameter if provided and not redirecting to login\r\n if (redirectUrl && !redirectUrl.startsWith(loginPath)) {\r\n // Ensure redirect URL is also absolute if it's not already\r\n const fullRedirectUrl = redirectUrl.startsWith('http') \r\n ? redirectUrl \r\n : constructFullUrl(redirectUrl)\r\n \r\n url.searchParams.set('redirect_url', fullRedirectUrl)\r\n }\r\n \r\n return url.toString()\r\n }\r\n \r\n /**\r\n * Gets a validated redirect URL ensuring it's from the same origin\r\n * @param redirectUrl - The URL to validate\r\n * @param searchParams - The search parameters to check for redirect_url\r\n * @returns A validated redirect URL\r\n */\r\n export const getValidRedirectUrl = (\r\n redirectUrl: string | undefined,\r\n searchParams: URLSearchParams\r\n ): string => {\r\n const redirect = redirectUrl || searchParams.get('redirect_url') || '/'\r\n \r\n try {\r\n if (redirect.startsWith('http')) {\r\n const url = new URL(redirect)\r\n if (url.origin === window.location.origin) {\r\n return redirect\r\n }\r\n return '/'\r\n }\r\n return constructFullUrl(redirect)\r\n } catch (e) {\r\n console.error('Invalid redirect URL:', e)\r\n return constructFullUrl('/')\r\n }\r\n }\r\n \r\n "],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAKO,MAAM,mBAAmB,CAAC,SAAiB;AAC9C,QAAM,UAAU,OAAO,SAAS;AAChC,MAAI,KAAK,WAAW,MAAM,GAAG;AAC3B,WAAO;AAAA,EACT;AACA,SAAO,GAAG,OAAO,GAAG,KAAK,WAAW,GAAG,IAAI,OAAO,IAAI,IAAI,EAAE;AAC9D;AASO,MAAM,2BAA2B,CAAC,MAAc,aAAqB,cAAsB;AAEhG,QAAM,MAAM,IAAI,IAAI,MAAM,OAAO,SAAS,MAAM;AAGhD,MAAI,eAAe,CAAC,YAAY,WAAW,SAAS,GAAG;AAErD,UAAM,kBAAkB,YAAY,WAAW,MAAM,IACjD,cACA,iBAAiB,WAAW;AAEhC,QAAI,aAAa,IAAI,gBAAgB,eAAe;AAAA,EACtD;AAEA,SAAO,IAAI,SAAS;AACtB;AAQO,MAAM,sBAAsB,CACjC,aACA,iBACW;AACX,QAAM,WAAW,eAAe,aAAa,IAAI,cAAc,KAAK;AAEpE,MAAI;AACF,QAAI,SAAS,WAAW,MAAM,GAAG;AAC/B,YAAM,MAAM,IAAI,IAAI,QAAQ;AAC5B,UAAI,IAAI,WAAW,OAAO,SAAS,QAAQ;AACzC,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AACA,WAAO,iBAAiB,QAAQ;AAAA,EAClC,SAAS,GAAG;AACV,YAAQ,MAAM,yBAAyB,CAAC;AACxC,WAAO,iBAAiB,GAAG;AAAA,EAC7B;AACF;","names":[]}
@@ -1,149 +0,0 @@
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 create_styles_exports = {};
21
- __export(create_styles_exports, {
22
- defaultClassNames: () => defaultClassNames,
23
- styleConfig: () => styleConfig,
24
- styles: () => styles
25
- });
26
- module.exports = __toCommonJS(create_styles_exports);
27
- const PREFIX = "tern";
28
- const styleInjection = {
29
- isInjected: false,
30
- styleElement: null
31
- };
32
- const defaultClassNames = {
33
- container: `${PREFIX}-container`,
34
- header: `${PREFIX}-header`,
35
- title: `${PREFIX}-title`,
36
- formWrapper: `${PREFIX}-formWrapper`,
37
- formContainer: `${PREFIX}-formContainer`,
38
- form: `${PREFIX}-form`,
39
- label: `${PREFIX}-label`,
40
- input: `${PREFIX}-input`,
41
- button: `${PREFIX}-button`,
42
- error: `${PREFIX}-error`
43
- };
44
- function createStyleSheet(styles2) {
45
- if (typeof window === "undefined") return defaultClassNames;
46
- if (styleInjection.isInjected) {
47
- return defaultClassNames;
48
- }
49
- let styleElement = document.querySelector("[data-tern-secure]");
50
- if (!styleElement) {
51
- styleElement = document.createElement("style");
52
- styleElement.setAttribute("data-tern-secure", "");
53
- document.head.appendChild(styleElement);
54
- styleInjection.styleElement = styleElement;
55
- }
56
- const cssRules = Object.entries(styles2).map(([key, rules]) => {
57
- const className = defaultClassNames[key];
58
- const cssProperties = Object.entries(rules).map(([prop, value]) => {
59
- const cssProperty = prop.replace(/([A-Z])/g, "-$1").toLowerCase();
60
- return `${cssProperty}: ${value};`;
61
- }).join(" ");
62
- return `.${className} { ${cssProperties} }`;
63
- }).join("\n");
64
- styleElement.textContent = cssRules;
65
- styleInjection.isInjected = true;
66
- return defaultClassNames;
67
- }
68
- const styleConfig = {
69
- container: {
70
- display: "flex",
71
- minHeight: "100%",
72
- flex: "1",
73
- flexDirection: "column",
74
- justifyContent: "center",
75
- padding: "3rem 1.5rem"
76
- },
77
- header: {
78
- margin: "0 auto",
79
- width: "100%",
80
- maxWidth: "28rem"
81
- },
82
- title: {
83
- marginTop: "1.5rem",
84
- textAlign: "center",
85
- fontSize: "1.875rem",
86
- fontWeight: "700",
87
- lineHeight: "2.25rem",
88
- letterSpacing: "-0.025em",
89
- color: "var(--tern-text-primary, #111827)"
90
- },
91
- formWrapper: {
92
- marginTop: "2.5rem",
93
- margin: "0 auto",
94
- width: "100%",
95
- maxWidth: "30rem"
96
- },
97
- formContainer: {
98
- padding: "3rem 1.5rem",
99
- boxShadow: "0 1px 3px 0 rgb(0 0 0 / 0.1)",
100
- borderRadius: "0.5rem",
101
- backgroundColor: "var(--tern-background, white)"
102
- },
103
- form: {
104
- display: "flex",
105
- flexDirection: "column",
106
- gap: "1rem"
107
- },
108
- label: {
109
- display: "block",
110
- fontSize: "0.875rem",
111
- fontWeight: "500",
112
- color: "var(--tern-text-secondary, #374151)"
113
- },
114
- input: {
115
- marginTop: "0.25rem",
116
- display: "block",
117
- width: "100%",
118
- padding: "0.5rem 0.75rem",
119
- borderRadius: "0.375rem",
120
- border: "1px solid var(--tern-border, #D1D5DB)",
121
- backgroundColor: "var(--tern-input-background, white)",
122
- color: "var(--tern-text-primary, #111827)"
123
- },
124
- button: {
125
- display: "flex",
126
- width: "100%",
127
- justifyContent: "center",
128
- padding: "0.5rem 1rem",
129
- fontSize: "0.875rem",
130
- fontWeight: "500",
131
- color: "white",
132
- backgroundColor: "var(--tern-primary, #2563EB)",
133
- border: "none",
134
- borderRadius: "0.375rem",
135
- cursor: "pointer"
136
- },
137
- error: {
138
- color: "var(--tern-error, #DC2626)",
139
- fontSize: "0.875rem"
140
- }
141
- };
142
- const styles = createStyleSheet(styleConfig);
143
- // Annotate the CommonJS export names for ESM import in node:
144
- 0 && (module.exports = {
145
- defaultClassNames,
146
- styleConfig,
147
- styles
148
- });
149
- //# sourceMappingURL=create-styles.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/utils/create-styles.ts"],"sourcesContent":["'use client'\r\n\r\nconst PREFIX = 'tern'\r\n\r\n// Singleton to track style injection\r\nconst styleInjection = {\r\n isInjected: false,\r\n styleElement: null as HTMLStyleElement | null\r\n}\r\n\r\nexport const defaultClassNames = {\r\n container: `${PREFIX}-container`,\r\n header: `${PREFIX}-header`,\r\n title: `${PREFIX}-title`,\r\n formWrapper: `${PREFIX}-formWrapper`,\r\n formContainer: `${PREFIX}-formContainer`,\r\n form: `${PREFIX}-form`,\r\n label: `${PREFIX}-label`,\r\n input: `${PREFIX}-input`,\r\n button: `${PREFIX}-button`,\r\n error: `${PREFIX}-error`\r\n} as const\r\n\r\n// Create styles once and cache them\r\nfunction createStyleSheet(styles: Record<string, React.CSSProperties>) {\r\n if (typeof window === 'undefined') return defaultClassNames\r\n\r\n // Return early if styles are already injected\r\n if (styleInjection.isInjected) {\r\n return defaultClassNames\r\n }\r\n\r\n // Find existing style element or create new one\r\n let styleElement = document.querySelector<HTMLStyleElement>('[data-tern-secure]')\r\n \r\n if (!styleElement) {\r\n styleElement = document.createElement('style')\r\n styleElement.setAttribute('data-tern-secure', '')\r\n document.head.appendChild(styleElement)\r\n styleInjection.styleElement = styleElement\r\n }\r\n\r\n // Create CSS rules\r\n const cssRules = Object.entries(styles).map(([key, rules]) => {\r\n const className = defaultClassNames[key as keyof typeof defaultClassNames]\r\n const cssProperties = Object.entries(rules).map(([prop, value]) => {\r\n const cssProperty = prop.replace(/([A-Z])/g, '-$1').toLowerCase()\r\n return `${cssProperty}: ${value};`\r\n }).join(' ')\r\n\r\n return `.${className} { ${cssProperties} }`\r\n }).join('\\n')\r\n\r\n // Insert styles only once\r\n styleElement.textContent = cssRules\r\n styleInjection.isInjected = true\r\n\r\n return defaultClassNames\r\n}\r\n\r\n// Style configuration\r\nexport const styleConfig = {\r\n container: {\r\n display: 'flex',\r\n minHeight: '100%',\r\n flex: '1',\r\n flexDirection: 'column',\r\n justifyContent: 'center',\r\n padding: '3rem 1.5rem'\r\n },\r\n header: {\r\n margin: '0 auto',\r\n width: '100%',\r\n maxWidth: '28rem'\r\n },\r\n title: {\r\n marginTop: '1.5rem',\r\n textAlign: 'center',\r\n fontSize: '1.875rem',\r\n fontWeight: '700',\r\n lineHeight: '2.25rem',\r\n letterSpacing: '-0.025em',\r\n color: 'var(--tern-text-primary, #111827)'\r\n },\r\n formWrapper: {\r\n marginTop: '2.5rem',\r\n margin: '0 auto',\r\n width: '100%',\r\n maxWidth: '30rem'\r\n },\r\n formContainer: {\r\n padding: '3rem 1.5rem',\r\n boxShadow: '0 1px 3px 0 rgb(0 0 0 / 0.1)',\r\n borderRadius: '0.5rem',\r\n backgroundColor: 'var(--tern-background, white)'\r\n },\r\n form: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: '1rem'\r\n },\r\n label: {\r\n display: 'block',\r\n fontSize: '0.875rem',\r\n fontWeight: '500',\r\n color: 'var(--tern-text-secondary, #374151)'\r\n },\r\n input: {\r\n marginTop: '0.25rem',\r\n display: 'block',\r\n width: '100%',\r\n padding: '0.5rem 0.75rem',\r\n borderRadius: '0.375rem',\r\n border: '1px solid var(--tern-border, #D1D5DB)',\r\n backgroundColor: 'var(--tern-input-background, white)',\r\n color: 'var(--tern-text-primary, #111827)'\r\n },\r\n button: {\r\n display: 'flex',\r\n width: '100%',\r\n justifyContent: 'center',\r\n padding: '0.5rem 1rem',\r\n fontSize: '0.875rem',\r\n fontWeight: '500',\r\n color: 'white',\r\n backgroundColor: 'var(--tern-primary, #2563EB)',\r\n border: 'none',\r\n borderRadius: '0.375rem',\r\n cursor: 'pointer'\r\n },\r\n error: {\r\n color: 'var(--tern-error, #DC2626)',\r\n fontSize: '0.875rem'\r\n }\r\n} as const\r\n\r\n// Export pre-created styles\r\nexport const styles = createStyleSheet(styleConfig)\r\n\r\n"],"mappings":"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","names":["styles"]}
@@ -1,9 +0,0 @@
1
- import { jsx } from "react/jsx-runtime";
2
- import { TernSecureClientProvider } from "../../boundary/TernSecureClientProvider";
3
- async function TernSecureProvider({ children }) {
4
- return /* @__PURE__ */ jsx(TernSecureClientProvider, { children });
5
- }
6
- export {
7
- TernSecureProvider
8
- };
9
- //# sourceMappingURL=TernSecureProvider.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../src/app-router/client/TernSecureProvider.tsx"],"sourcesContent":["import React from \"react\"\r\nimport { TernSecureClientProvider } from \"../../boundary/TernSecureClientProvider\"\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 async function TernSecureProvider({ children }: { children: React.ReactNode }) {\r\n return (\r\n <TernSecureClientProvider>\r\n {children}\r\n </TernSecureClientProvider>\r\n )\r\n}"],"mappings":"AAmCI;AAlCJ,SAAS,gCAAgC;AAgCzC,eAAsB,mBAAmB,EAAE,SAAS,GAAkC;AACpF,SACE,oBAAC,4BACI,UACL;AAEJ;","names":[]}
@@ -1,70 +0,0 @@
1
- import { TernSecureAuth } from "../../utils/client-init";
2
- import { signInWithEmailAndPassword, signInWithRedirect, getRedirectResult, GoogleAuthProvider, OAuthProvider } from "firebase/auth";
3
- import { createSessionCookie } from "../server/sessionTernSecure";
4
- async function signInWithEmail(email, password) {
5
- const auth = TernSecureAuth();
6
- try {
7
- const UserCredential = await signInWithEmailAndPassword(auth, email, password);
8
- const idToken = await UserCredential.user.getIdToken();
9
- const res = await createSessionCookie(idToken);
10
- if (res.success) {
11
- return { success: true, message: "Connected." };
12
- } else {
13
- throw new Error(res.message);
14
- }
15
- } catch (error) {
16
- const errorMessage = error instanceof Error ? error.message : "Failed to sign in";
17
- throw new Error(errorMessage);
18
- }
19
- }
20
- async function signInWithRedirectGoogle() {
21
- const auth = TernSecureAuth();
22
- const provider = new GoogleAuthProvider();
23
- provider.setCustomParameters({
24
- login_hint: "user@example.com",
25
- prompt: "select_account"
26
- });
27
- try {
28
- await signInWithRedirect(auth, provider);
29
- return { success: true, message: "Redirect initiated" };
30
- } catch (error) {
31
- console.error("Error during Google sign-in:", error);
32
- return { success: false, error: "Failed to sign in with Google" };
33
- }
34
- }
35
- async function signInWithMicrosoft() {
36
- const auth = TernSecureAuth();
37
- const provider = new OAuthProvider("microsoft.com");
38
- provider.setCustomParameters({
39
- prompt: "consent"
40
- });
41
- try {
42
- await signInWithRedirect(auth, provider);
43
- return { success: true, message: "Redirect initiated" };
44
- } catch (error) {
45
- console.error("Error during Google sign-in:", error);
46
- return { success: false, error: "Failed to sign in with Google" };
47
- }
48
- }
49
- async function handleAuthRedirectResult() {
50
- const auth = TernSecureAuth();
51
- try {
52
- const result = await getRedirectResult(auth);
53
- if (result) {
54
- const user = result.user;
55
- return { success: true, user };
56
- } else {
57
- return { success: false, error: "No redirect result" };
58
- }
59
- } catch (error) {
60
- console.error("Error handling auth redirect result:", error);
61
- return { success: false, error: error.message || "Failed to handle auth redirect", code: error.code };
62
- }
63
- }
64
- export {
65
- handleAuthRedirectResult,
66
- signInWithEmail,
67
- signInWithMicrosoft,
68
- signInWithRedirectGoogle
69
- };
70
- //# 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 { signInWithEmailAndPassword, signInWithRedirect, getRedirectResult, GoogleAuthProvider, OAuthProvider } from 'firebase/auth'\r\nimport { createSessionCookie } from '../server/sessionTernSecure'\r\n\r\n\r\nexport async function signInWithEmail(email: string, password: string){\r\n const auth = TernSecureAuth()\r\n try {\r\n const UserCredential = await signInWithEmailAndPassword(auth, email, password)\r\n const idToken = await UserCredential.user.getIdToken();\r\n\r\n const res = await createSessionCookie(idToken);\r\n\r\n if(res.success) {\r\n return { success: true, message: 'Connected.' };\r\n } else {\r\n throw new Error(res.message);\r\n }\r\n} catch (error){\r\n const errorMessage = error instanceof Error ? error.message : 'Failed to sign in';\r\n throw new Error(errorMessage);\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 console.error('Error during Google sign-in:', error)\r\n return { success: false, error: 'Failed to sign in with Google' }\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 console.error('Error during Google sign-in:', error)\r\n return { success: false, error: 'Failed to sign in with Google' }\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 console.error('Error handling auth redirect result:', error)\r\n return { success: false, error: error.message || 'Failed to handle auth redirect', code: error.code }\r\n }\r\n}"],"mappings":"AAAA,SAAS,sBAAsB;AAC/B,SAAS,4BAA4B,oBAAoB,mBAAmB,oBAAoB,qBAAqB;AACrH,SAAS,2BAA2B;AAGpC,eAAsB,gBAAgB,OAAe,UAAiB;AACpE,QAAM,OAAO,eAAe;AAC5B,MAAI;AACJ,UAAM,iBAAiB,MAAM,2BAA2B,MAAM,OAAO,QAAQ;AAC7E,UAAM,UAAU,MAAM,eAAe,KAAK,WAAW;AAErD,UAAM,MAAM,MAAM,oBAAoB,OAAO;AAE7C,QAAG,IAAI,SAAS;AACd,aAAO,EAAE,SAAS,MAAM,SAAS,aAAa;AAAA,IAChD,OAAO;AACL,YAAM,IAAI,MAAM,IAAI,OAAO;AAAA,IAC7B;AAAA,EACF,SAAS,OAAM;AACb,UAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU;AAC9D,UAAM,IAAI,MAAM,YAAY;AAAA,EAC9B;AACA;AAEA,eAAsB,2BAA2B;AAC/C,QAAM,OAAO,eAAe;AAC5B,QAAM,WAAW,IAAI,mBAAmB;AACxC,WAAS,oBAAoB;AAAA,IAC3B,YAAY;AAAA,IACZ,QAAQ;AAAA,EACV,CAAC;AAED,MAAI;AACF,UAAM,mBAAmB,MAAM,QAAQ;AACvC,WAAO,EAAE,SAAS,MAAM,SAAS,qBAAqB;AAAA,EACxD,SAAS,OAAO;AACd,YAAQ,MAAM,gCAAgC,KAAK;AACnD,WAAO,EAAE,SAAS,OAAO,OAAO,gCAAgC;AAAA,EAClE;AACF;AAGA,eAAsB,sBAAsB;AAC1C,QAAM,OAAO,eAAe;AAC5B,QAAM,WAAW,IAAI,cAAc,eAAe;AAClD,WAAS,oBAAoB;AAAA,IAC3B,QAAQ;AAAA,EACV,CAAC;AAED,MAAI;AACF,UAAM,mBAAmB,MAAM,QAAQ;AACvC,WAAO,EAAE,SAAS,MAAM,SAAS,qBAAqB;AAAA,EACxD,SAAS,OAAO;AACd,YAAQ,MAAM,gCAAgC,KAAK;AACnD,WAAO,EAAE,SAAS,OAAO,OAAO,gCAAgC;AAAA,EAClE;AACF;AAGA,eAAsB,2BAA2B;AAC/C,QAAM,OAAO,eAAe;AAC5B,MAAI;AACF,UAAM,SAAS,MAAM,kBAAkB,IAAI;AAC3C,QAAI,QAAQ;AACV,YAAM,OAAO,OAAO;AACpB,aAAO,EAAE,SAAS,MAAM,KAAK;AAAA,IAC/B,OAAO;AACL,aAAO,EAAE,SAAS,OAAO,OAAO,qBAAqB;AAAA,IACvD;AAAA,EACF,SAAS,OAAY;AACnB,YAAQ,MAAM,wCAAwC,KAAK;AAC3D,WAAO,EAAE,SAAS,OAAO,OAAO,MAAM,WAAW,kCAAkC,MAAM,MAAM,KAAK;AAAA,EACtG;AACF;","names":[]}
@@ -1,47 +0,0 @@
1
- "use server";
2
- import { cookies } from "next/headers";
3
- import { verifyTernIdToken, verifyTernSessionCookie } from "./sessionTernSecure";
4
- async function auth() {
5
- var _a, _b, _c;
6
- try {
7
- const cookieStore = await cookies();
8
- const sessionCookie = (_a = cookieStore.get("_session_cookie")) == null ? void 0 : _a.value;
9
- if (sessionCookie) {
10
- const sessionResult = await verifyTernSessionCookie(sessionCookie);
11
- if (sessionResult.valid) {
12
- return {
13
- userId: sessionResult.uid,
14
- token: sessionCookie,
15
- error: null
16
- };
17
- }
18
- }
19
- const idToken = (_b = cookieStore.get("_session_token")) == null ? void 0 : _b.value;
20
- if (idToken) {
21
- const tokenResult = await verifyTernIdToken(idToken);
22
- if (tokenResult.valid) {
23
- return {
24
- userId: (_c = tokenResult.uid) != null ? _c : null,
25
- token: idToken,
26
- error: null
27
- };
28
- }
29
- }
30
- return {
31
- userId: null,
32
- token: null,
33
- error: new Error("No valid session or token found")
34
- };
35
- } catch (error) {
36
- console.error("Error in auth function:", error);
37
- return {
38
- userId: null,
39
- token: null,
40
- error: error instanceof Error ? error : new Error("An unknown error occurred")
41
- };
42
- }
43
- }
44
- export {
45
- auth
46
- };
47
- //# sourceMappingURL=auth.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../src/app-router/server/auth.ts"],"sourcesContent":["'use server'\r\n\r\nimport { cookies } from 'next/headers';\r\nimport { verifyTernIdToken, verifyTernSessionCookie } from './sessionTernSecure';\r\n\r\nexport interface AuthResult {\r\n userId: string | null;\r\n token: string | null;\r\n error: Error | null;\r\n}\r\n\r\nexport async function auth(): Promise<AuthResult> {\r\n try {\r\n const cookieStore = await cookies();\r\n const sessionCookie = cookieStore.get('_session_cookie')?.value;\r\n if (sessionCookie) {\r\n const sessionResult = await verifyTernSessionCookie(sessionCookie);\r\n if (sessionResult.valid) {\r\n return {\r\n userId: sessionResult.uid,\r\n token: sessionCookie,\r\n error: null\r\n };\r\n }\r\n }\r\n\r\n // If session cookie is not present or invalid, try the ID token\r\n const idToken = cookieStore.get('_session_token')?.value;\r\n if (idToken) {\r\n const tokenResult = await verifyTernIdToken(idToken);\r\n if (tokenResult.valid) {\r\n return {\r\n userId: tokenResult.uid ?? null,\r\n token: idToken,\r\n error: null\r\n };\r\n }\r\n }\r\n\r\n /// If both checks fail, return null values\r\n return {\r\n userId: null,\r\n token: null,\r\n error: new Error('No valid session or token found')\r\n };\r\n } catch (error) {\r\n console.error('Error in auth function:', error);\r\n return {\r\n userId: null,\r\n token: null,\r\n error: error instanceof Error ? error : new Error('An unknown error occurred')\r\n };\r\n }\r\n}\r\n\r\n"],"mappings":";AAEA,SAAS,eAAe;AACxB,SAAU,mBAAmB,+BAA+B;AAQ5D,eAAsB,OAA4B;AAXlD;AAYE,MAAI;AACF,UAAM,cAAc,MAAM,QAAQ;AAClC,UAAM,iBAAgB,iBAAY,IAAI,iBAAiB,MAAjC,mBAAoC;AAC1D,QAAI,eAAe;AACjB,YAAM,gBAAgB,MAAM,wBAAwB,aAAa;AACjE,UAAI,cAAc,OAAO;AACvB,eAAO;AAAA,UACL,QAAQ,cAAc;AAAA,UACtB,OAAO;AAAA,UACP,OAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAGA,UAAM,WAAU,iBAAY,IAAI,gBAAgB,MAAhC,mBAAmC;AACnD,QAAI,SAAS;AACX,YAAM,cAAc,MAAM,kBAAkB,OAAO;AACnD,UAAI,YAAY,OAAO;AACrB,eAAO;AAAA,UACL,SAAQ,iBAAY,QAAZ,YAAmB;AAAA,UAC3B,OAAO;AAAA,UACP,OAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAGA,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,OAAO,IAAI,MAAM,iCAAiC;AAAA,IACpD;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,MAAM,2BAA2B,KAAK;AAC9C,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,OAAO,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,2BAA2B;AAAA,IAC/E;AAAA,EACF;AACF;","names":[]}
@@ -1,13 +0,0 @@
1
- import { adminTernSecureAuth, adminTernSecureDb } from "../../utils/admin-init";
2
- import { ternSecureMiddleware } from "./ternSecureMiddleware";
3
- import { verifyTernSessionCookie, createSessionCookie } from "./sessionTernSecure";
4
- import { auth } from "./auth";
5
- export {
6
- adminTernSecureAuth,
7
- adminTernSecureDb,
8
- auth,
9
- createSessionCookie,
10
- ternSecureMiddleware,
11
- verifyTernSessionCookie
12
- };
13
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../src/app-router/server/index.ts"],"sourcesContent":["export { adminTernSecureAuth, adminTernSecureDb } from '../../utils/admin-init'\r\nexport { ternSecureMiddleware } from './ternSecureMiddleware'\r\nexport { verifyTernSessionCookie, createSessionCookie } from './sessionTernSecure'\r\nexport { auth } from './auth'"],"mappings":"AAAA,SAAS,qBAAqB,yBAAyB;AACvD,SAAS,4BAA4B;AACrC,SAAS,yBAAyB,2BAA2B;AAC7D,SAAS,YAAY;","names":[]}
@@ -1,129 +0,0 @@
1
- "use server";
2
- import { cookies } from "next/headers";
3
- import { adminTernSecureAuth as adminAuth } from "../../utils/admin-init";
4
- async function createSessionCookie(idToken) {
5
- try {
6
- const expiresIn = 60 * 60 * 24 * 5 * 1e3;
7
- const sessionCookie = await adminAuth.createSessionCookie(idToken, { expiresIn });
8
- const cookieStore = await cookies();
9
- cookieStore.set("_session_cookie", sessionCookie, {
10
- maxAge: expiresIn,
11
- httpOnly: true,
12
- secure: process.env.NODE_ENV === "production",
13
- path: "/"
14
- });
15
- return { success: true, message: "Session created" };
16
- } catch (error) {
17
- return { success: false, message: "Failed to create session" };
18
- }
19
- }
20
- async function getServerSessionCookie() {
21
- var _a;
22
- const cookieStore = await cookies();
23
- const sessionCookie = (_a = cookieStore.get("_session_cookie")) == null ? void 0 : _a.value;
24
- if (!sessionCookie) {
25
- throw new Error("No session cookie found");
26
- }
27
- try {
28
- const decondeClaims = await adminAuth.verifySessionCookie(sessionCookie, true);
29
- return {
30
- token: sessionCookie,
31
- userId: decondeClaims.uid
32
- };
33
- } catch (error) {
34
- console.error("Error verifying session:", error);
35
- throw new Error("Invalid Session");
36
- }
37
- }
38
- async function getIdToken() {
39
- var _a;
40
- const cookieStore = await cookies();
41
- const token = (_a = cookieStore.get("_session_token")) == null ? void 0 : _a.value;
42
- if (!token) {
43
- throw new Error("No session cookie found");
44
- }
45
- try {
46
- const decodedClaims = await adminAuth.verifyIdToken(token);
47
- return {
48
- token,
49
- userId: decodedClaims.uid
50
- };
51
- } catch (error) {
52
- console.error("Error verifying session:", error);
53
- throw new Error("Invalid Session");
54
- }
55
- }
56
- async function setServerSession(token) {
57
- const cookieStore = await cookies();
58
- cookieStore.set("_session", token, {
59
- httpOnly: true,
60
- secure: process.env.NODE_ENV === "production",
61
- sameSite: "strict",
62
- maxAge: 60 * 60,
63
- // 1 hour
64
- path: "/"
65
- });
66
- }
67
- async function verifyTernIdToken(token) {
68
- try {
69
- const decodedToken = await adminAuth.verifyIdToken(token, true);
70
- return { valid: true, uid: decodedToken.uid };
71
- } catch (error) {
72
- if (error instanceof Error) {
73
- const firebaseError = error;
74
- if (error.name === "FirebaseAuthError") {
75
- switch (firebaseError.code) {
76
- case "auth/id-token-expired":
77
- return { valid: false, error: "Token has expired" };
78
- case "auth/id-token-revoked":
79
- return { valid: false, error: "Token has been revoked" };
80
- case "auth/user-disabled":
81
- return { valid: false, error: "User account has been disabled" };
82
- default:
83
- return { valid: false, error: "Invalid token" };
84
- }
85
- }
86
- }
87
- return { valid: false, error: "Error verifying token" };
88
- }
89
- }
90
- async function verifyTernSessionCookie(session) {
91
- try {
92
- const res = await adminAuth.verifySessionCookie(session, true);
93
- if (res) {
94
- return { valid: true, uid: res.uid };
95
- } else {
96
- return { valid: false, error: "Invalid session" };
97
- }
98
- } catch (error) {
99
- return { error, valid: false };
100
- }
101
- }
102
- async function clearSessionCookie() {
103
- var _a;
104
- const cookieStore = await cookies();
105
- cookieStore.delete("_session_cookie");
106
- cookieStore.delete("_session_token");
107
- cookieStore.delete("_session");
108
- try {
109
- const sessionCookie = (_a = cookieStore.get("_session_cookie")) == null ? void 0 : _a.value;
110
- if (sessionCookie) {
111
- const decodedClaims = await adminAuth.verifySessionCookie(sessionCookie);
112
- await adminAuth.revokeRefreshTokens(decodedClaims.uid);
113
- }
114
- return { success: true, message: "Session cleared successfully" };
115
- } catch (error) {
116
- console.error("Error clearing session:", error);
117
- return { success: true, message: "Session cookies cleared" };
118
- }
119
- }
120
- export {
121
- clearSessionCookie,
122
- createSessionCookie,
123
- getIdToken,
124
- getServerSessionCookie,
125
- setServerSession,
126
- verifyTernIdToken,
127
- verifyTernSessionCookie
128
- };
129
- //# sourceMappingURL=sessionTernSecure.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../src/app-router/server/sessionTernSecure.ts"],"sourcesContent":["'use server'\r\n\r\nimport { cookies } from 'next/headers';\r\nimport { adminTernSecureAuth as adminAuth } from '../../utils/admin-init';\r\n\r\ninterface FirebaseAuthError extends Error {\r\n code?: string;\r\n}\r\n\r\nexport interface User {\r\n uid: string | null;\r\n email: string | null;\r\n }\r\n\r\nexport interface Session {\r\n user: User | null;\r\n token: string | null;\r\n error: Error | null;\r\n}\r\n\r\nexport async function createSessionCookie(idToken: string) {\r\n try {\r\n const expiresIn = 60 * 60 * 24 * 5 * 1000;\r\n const sessionCookie = await adminAuth.createSessionCookie(idToken, { expiresIn });\r\n\r\n const cookieStore = await cookies();\r\n cookieStore.set('_session_cookie', sessionCookie, {\r\n maxAge: expiresIn,\r\n httpOnly: true,\r\n secure: process.env.NODE_ENV === 'production',\r\n path: '/',\r\n });\r\n return { success: true, message: 'Session created' };\r\n } catch (error) {\r\n return { success: false, message: 'Failed to create session' };\r\n }\r\n}\r\n\r\n\r\n\r\nexport async function getServerSessionCookie() {\r\n const cookieStore = await cookies();\r\n const sessionCookie = cookieStore.get('_session_cookie')?.value;\r\n\r\n if (!sessionCookie) {\r\n throw new Error('No session cookie found')\r\n }\r\n \r\n try {\r\n const decondeClaims = await adminAuth.verifySessionCookie(sessionCookie, true)\r\n return {\r\n token: sessionCookie,\r\n userId: decondeClaims.uid\r\n }\r\n } catch (error) {\r\n console.error('Error verifying session:', error)\r\n throw new Error('Invalid Session')\r\n }\r\n}\r\n\r\n\r\nexport async function getIdToken() {\r\n const cookieStore = await cookies();\r\n const token = cookieStore.get('_session_token')?.value;\r\n\r\n if (!token) {\r\n throw new Error('No session cookie found')\r\n }\r\n \r\n try {\r\n const decodedClaims = await adminAuth.verifyIdToken(token)\r\n return {\r\n token: token,\r\n userId: decodedClaims.uid\r\n }\r\n } catch (error) {\r\n console.error('Error verifying session:', error)\r\n throw new Error('Invalid Session')\r\n }\r\n}\r\n\r\nexport async function setServerSession(token: string) {\r\n const cookieStore = await cookies();\r\n cookieStore.set('_session', token, {\r\n httpOnly: true,\r\n secure: process.env.NODE_ENV === 'production',\r\n sameSite: 'strict',\r\n maxAge: 60 * 60, // 1 hour\r\n path: '/',\r\n });\r\n }\r\n\r\n export async function verifyTernIdToken(token: string): Promise<{ valid: boolean; uid?: string; error?: string }> {\r\n try {\r\n const decodedToken = await adminAuth.verifyIdToken(token, true);\r\n return { valid: true, uid: decodedToken.uid };\r\n } catch (error) {\r\n if (error instanceof Error) {\r\n const firebaseError = error as FirebaseAuthError;\r\n if (error.name === 'FirebaseAuthError') {\r\n // Handle specific Firebase Auth errors\r\n switch (firebaseError.code) {\r\n case 'auth/id-token-expired':\r\n return { valid: false, error: 'Token has expired' };\r\n case 'auth/id-token-revoked':\r\n return { valid: false, error: 'Token has been revoked' };\r\n case 'auth/user-disabled':\r\n return { valid: false, error: 'User account has been disabled' };\r\n default:\r\n return { valid: false, error: 'Invalid token' };\r\n }\r\n }\r\n }\r\n return { valid: false, error: 'Error verifying token' };\r\n }\r\n }\r\n \r\n\r\n export async function verifyTernSessionCookie(session: string): Promise<{ valid: boolean; uid?: any; error?: any }>{\r\n try {\r\n const res = await adminAuth.verifySessionCookie(session, true);\r\n if (res) {\r\n return { valid: true, uid: res.uid };\r\n } else {\r\n return { valid: false, error: 'Invalid session'};\r\n }\r\n } catch (error) {\r\n return {error: error, valid: false}\r\n }\r\n }\r\n\r\n\r\n export async function clearSessionCookie() {\r\n const cookieStore = await cookies()\r\n \r\n cookieStore.delete('_session_cookie')\r\n cookieStore.delete('_session_token')\r\n cookieStore.delete('_session')\r\n \r\n try {\r\n // Verify if there's an active session before revoking\r\n const sessionCookie = cookieStore.get('_session_cookie')?.value\r\n if (sessionCookie) {\r\n // Get the decoded claims to get the user's ID\r\n const decodedClaims = await adminAuth.verifySessionCookie(sessionCookie)\r\n \r\n // Revoke all sessions for the user\r\n await adminAuth.revokeRefreshTokens(decodedClaims.uid)\r\n }\r\n \r\n return { success: true, message: 'Session cleared successfully' }\r\n } catch (error) {\r\n console.error('Error clearing session:', error)\r\n // Still return success even if revoking fails, as cookies are cleared\r\n return { success: true, message: 'Session cookies cleared' }\r\n }\r\n }\r\n\r\n\r\n\r\n/*\r\n export async function GET(request: NextRequest) {\r\n const cookieStore = await cookies();\r\n const sessionCookie = cookieStore.get('session')?.value\r\n \r\n if (!sessionCookie) {\r\n return NextResponse.json({ isAuthenticated: false }, { status: 401 })\r\n }\r\n \r\n try {\r\n const decodedClaims = await adminAuth.verifySessionCookie(sessionCookie, true)\r\n return NextResponse.json({ isAuthenticated: true, user: decodedClaims }, { status: 200 })\r\n } catch (error) {\r\n console.error('Error verifying session cookie:', error)\r\n return NextResponse.json({ isAuthenticated: false }, { status: 401 })\r\n }\r\n }\r\n\r\n*/"],"mappings":"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","names":[]}
@@ -1,26 +0,0 @@
1
- import { NextResponse } from "next/server";
2
- import { auth } from "./auth";
3
- function ternSecureMiddleware(options = {}) {
4
- const { publicPaths = [], redirectTo = "/login" } = options;
5
- return async function middleware(request) {
6
- const { pathname } = request.nextUrl;
7
- if (publicPaths.includes(pathname)) {
8
- return NextResponse.next();
9
- }
10
- try {
11
- const { userId, token, error } = await auth();
12
- if (error || !userId || !token) {
13
- return NextResponse.redirect(new URL(redirectTo, request.url));
14
- }
15
- const response = NextResponse.next();
16
- return response;
17
- } catch (error) {
18
- console.error("Error in ternSecureMiddleware:", error);
19
- return NextResponse.redirect(new URL(redirectTo, request.url));
20
- }
21
- };
22
- }
23
- export {
24
- ternSecureMiddleware
25
- };
26
- //# sourceMappingURL=ternSecureMiddleware.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../src/app-router/server/ternSecureMiddleware.ts"],"sourcesContent":["import { NextRequest, NextResponse } from 'next/server';\r\nimport { auth } from './auth';\r\n\r\nexport interface TernSecureMiddlewareOptions {\r\n publicPaths?: string[];\r\n redirectTo?: string;\r\n}\r\n\r\nexport function ternSecureMiddleware(options: TernSecureMiddlewareOptions = {}) {\r\n const { publicPaths = [], redirectTo = '/login' } = options;\r\n\r\n return async function middleware(request: NextRequest) {\r\n const { pathname } = request.nextUrl;\r\n\r\n // Check if the path is public\r\n if (publicPaths.includes(pathname)) {\r\n return NextResponse.next();\r\n }\r\n\r\n try {\r\n const { userId, token, error } = await auth();\r\n\r\n if (error || !userId || !token) {\r\n // If there's no valid session, redirect to login\r\n return NextResponse.redirect(new URL(redirectTo, request.url));\r\n }\r\n\r\n // If there's a valid session, allow the request to proceed\r\n const response = NextResponse.next();\r\n \r\n // Optionally, you can set headers here if needed\r\n // response.headers.set('X-User-ID', userId);\r\n\r\n return response;\r\n } catch (error) {\r\n console.error('Error in ternSecureMiddleware:', error);\r\n return NextResponse.redirect(new URL(redirectTo, request.url));\r\n }\r\n };\r\n}\r\n\r\n"],"mappings":"AAAA,SAAsB,oBAAoB;AAC1C,SAAS,YAAY;AAOd,SAAS,qBAAqB,UAAuC,CAAC,GAAG;AAC9E,QAAM,EAAE,cAAc,CAAC,GAAG,aAAa,SAAS,IAAI;AAEpD,SAAO,eAAe,WAAW,SAAsB;AACrD,UAAM,EAAE,SAAS,IAAI,QAAQ;AAG7B,QAAI,YAAY,SAAS,QAAQ,GAAG;AAClC,aAAO,aAAa,KAAK;AAAA,IAC3B;AAEA,QAAI;AACF,YAAM,EAAE,QAAQ,OAAO,MAAM,IAAI,MAAM,KAAK;AAE5C,UAAI,SAAS,CAAC,UAAU,CAAC,OAAO;AAE9B,eAAO,aAAa,SAAS,IAAI,IAAI,YAAY,QAAQ,GAAG,CAAC;AAAA,MAC/D;AAGA,YAAM,WAAW,aAAa,KAAK;AAKnC,aAAO;AAAA,IACT,SAAS,OAAO;AACd,cAAQ,MAAM,kCAAkC,KAAK;AACrD,aAAO,aAAa,SAAS,IAAI,IAAI,YAAY,QAAQ,GAAG,CAAC;AAAA,IAC/D;AAAA,EACF;AACF;","names":[]}