@tern-secure/nextjs 4.2.11 → 5.0.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 (232) hide show
  1. package/README.md +33 -33
  2. package/dist/cjs/app-router/admin/index.js +5 -8
  3. package/dist/cjs/app-router/admin/index.js.map +1 -1
  4. package/dist/cjs/app-router/admin/sessionTernSecure.js +3 -6
  5. package/dist/cjs/app-router/admin/sessionTernSecure.js.map +1 -1
  6. package/dist/cjs/app-router/client/TernSecureProvider.js +10 -18
  7. package/dist/cjs/app-router/client/TernSecureProvider.js.map +1 -1
  8. package/dist/cjs/app-router/client/actions.js +1 -177
  9. package/dist/cjs/app-router/client/actions.js.map +1 -1
  10. package/dist/cjs/app-router/route-handler/internal-route.js +4 -35
  11. package/dist/cjs/app-router/route-handler/internal-route.js.map +1 -1
  12. package/dist/cjs/boundary/{hooks/useSignUp.js → components.js} +16 -16
  13. package/dist/cjs/boundary/components.js.map +1 -0
  14. package/dist/cjs/{lib/utils.js → boundary/hooks.js} +9 -11
  15. package/dist/cjs/boundary/hooks.js.map +1 -0
  16. package/dist/cjs/{boundary/TernSecureCtx.js → components/uiComponents.js} +17 -24
  17. package/dist/cjs/components/uiComponents.js.map +1 -0
  18. package/dist/cjs/errors.js +1 -0
  19. package/dist/cjs/errors.js.map +1 -1
  20. package/dist/cjs/index.js +13 -27
  21. package/dist/cjs/index.js.map +1 -1
  22. package/dist/cjs/server/auth.js +4 -5
  23. package/dist/cjs/server/auth.js.map +1 -1
  24. package/dist/cjs/server/crypto.js.map +1 -1
  25. package/dist/cjs/server/ctx-store.js +1 -2
  26. package/dist/cjs/server/ctx-store.js.map +1 -1
  27. package/dist/cjs/server/edge-session.js +6 -7
  28. package/dist/cjs/server/edge-session.js.map +1 -1
  29. package/dist/cjs/server/index.js.map +1 -1
  30. package/dist/cjs/server/jwt-edge.js.map +1 -1
  31. package/dist/cjs/server/jwt.js.map +1 -1
  32. package/dist/cjs/server/session-store.js +3 -1
  33. package/dist/cjs/server/session-store.js.map +1 -1
  34. package/dist/cjs/server/ternSecureMiddleware.js.map +1 -1
  35. package/dist/cjs/server/types.js.map +1 -1
  36. package/dist/cjs/server/utils.js.map +1 -1
  37. package/dist/cjs/types.js.map +1 -1
  38. package/dist/cjs/utils/admin-init.js +3 -0
  39. package/dist/cjs/utils/admin-init.js.map +1 -1
  40. package/dist/cjs/utils/allNextProviderProps.js +108 -0
  41. package/dist/cjs/utils/allNextProviderProps.js.map +1 -0
  42. package/dist/cjs/utils/client-init.js +2 -47
  43. package/dist/cjs/utils/client-init.js.map +1 -1
  44. package/dist/cjs/utils/config.js.map +1 -1
  45. package/dist/cjs/utils/construct.js.map +1 -1
  46. package/dist/cjs/utils/create-styles.js.map +1 -1
  47. package/dist/cjs/utils/redirect.js.map +1 -1
  48. package/dist/cjs/{components/ui/separator.js → utils/tern-ui-script.js} +41 -24
  49. package/dist/cjs/utils/tern-ui-script.js.map +1 -0
  50. package/dist/esm/app-router/admin/index.js +6 -4
  51. package/dist/esm/app-router/admin/index.js.map +1 -1
  52. package/dist/esm/app-router/admin/sessionTernSecure.js +3 -6
  53. package/dist/esm/app-router/admin/sessionTernSecure.js.map +1 -1
  54. package/dist/esm/app-router/client/TernSecureProvider.js +13 -19
  55. package/dist/esm/app-router/client/TernSecureProvider.js.map +1 -1
  56. package/dist/esm/app-router/client/actions.js +1 -157
  57. package/dist/esm/app-router/client/actions.js.map +1 -1
  58. package/dist/esm/app-router/route-handler/internal-route.js +5 -30
  59. package/dist/esm/app-router/route-handler/internal-route.js.map +1 -1
  60. package/dist/esm/boundary/components.js +18 -0
  61. package/dist/esm/boundary/components.js.map +1 -0
  62. package/dist/esm/boundary/hooks.js +9 -0
  63. package/dist/esm/boundary/hooks.js.map +1 -0
  64. package/dist/esm/components/uiComponents.js +21 -0
  65. package/dist/esm/components/uiComponents.js.map +1 -0
  66. package/dist/esm/errors.js +1 -0
  67. package/dist/esm/errors.js.map +1 -1
  68. package/dist/esm/index.js +15 -16
  69. package/dist/esm/index.js.map +1 -1
  70. package/dist/esm/server/auth.js +4 -5
  71. package/dist/esm/server/auth.js.map +1 -1
  72. package/dist/esm/server/crypto.js.map +1 -1
  73. package/dist/esm/server/ctx-store.js +1 -2
  74. package/dist/esm/server/ctx-store.js.map +1 -1
  75. package/dist/esm/server/edge-session.js +6 -7
  76. package/dist/esm/server/edge-session.js.map +1 -1
  77. package/dist/esm/server/index.js.map +1 -1
  78. package/dist/esm/server/jwt-edge.js.map +1 -1
  79. package/dist/esm/server/jwt.js.map +1 -1
  80. package/dist/esm/server/session-store.js +3 -1
  81. package/dist/esm/server/session-store.js.map +1 -1
  82. package/dist/esm/server/ternSecureMiddleware.js.map +1 -1
  83. package/dist/esm/server/utils.js.map +1 -1
  84. package/dist/esm/types.js.map +1 -1
  85. package/dist/esm/utils/admin-init.js +2 -0
  86. package/dist/esm/utils/admin-init.js.map +1 -1
  87. package/dist/esm/utils/allNextProviderProps.js +84 -0
  88. package/dist/esm/utils/allNextProviderProps.js.map +1 -0
  89. package/dist/esm/utils/client-init.js +2 -21
  90. package/dist/esm/utils/client-init.js.map +1 -1
  91. package/dist/esm/utils/config.js.map +1 -1
  92. package/dist/esm/utils/construct.js.map +1 -1
  93. package/dist/esm/utils/create-styles.js.map +1 -1
  94. package/dist/esm/utils/redirect.js.map +1 -1
  95. package/dist/esm/utils/tern-ui-script.js +42 -0
  96. package/dist/esm/utils/tern-ui-script.js.map +1 -0
  97. package/dist/types/app-router/admin/index.d.ts +1 -2
  98. package/dist/types/app-router/admin/index.d.ts.map +1 -1
  99. package/dist/types/app-router/client/TernSecureProvider.d.ts +2 -14
  100. package/dist/types/app-router/client/TernSecureProvider.d.ts.map +1 -1
  101. package/dist/types/app-router/client/actions.d.ts +1 -54
  102. package/dist/types/app-router/client/actions.d.ts.map +1 -1
  103. package/dist/types/app-router/route-handler/internal-route.d.ts +1 -15
  104. package/dist/types/app-router/route-handler/internal-route.d.ts.map +1 -1
  105. package/dist/types/boundary/components.d.ts +2 -0
  106. package/dist/types/boundary/components.d.ts.map +1 -0
  107. package/dist/types/boundary/hooks.d.ts +2 -0
  108. package/dist/types/boundary/hooks.d.ts.map +1 -0
  109. package/dist/types/components/uiComponents.d.ts +6 -0
  110. package/dist/types/components/uiComponents.d.ts.map +1 -0
  111. package/dist/types/errors.d.ts +1 -1
  112. package/dist/types/errors.d.ts.map +1 -1
  113. package/dist/types/index.d.ts +3 -9
  114. package/dist/types/index.d.ts.map +1 -1
  115. package/dist/types/server/ternSecureMiddleware.d.ts.map +1 -1
  116. package/dist/types/types.d.ts +6 -13
  117. package/dist/types/types.d.ts.map +1 -1
  118. package/dist/types/utils/admin-init.d.ts +2 -1
  119. package/dist/types/utils/admin-init.d.ts.map +1 -1
  120. package/dist/types/utils/allNextProviderProps.d.ts +6 -0
  121. package/dist/types/utils/allNextProviderProps.d.ts.map +1 -0
  122. package/dist/types/utils/client-init.d.ts +1 -4
  123. package/dist/types/utils/client-init.d.ts.map +1 -1
  124. package/dist/types/utils/config.d.ts +1 -1
  125. package/dist/types/utils/config.d.ts.map +1 -1
  126. package/dist/types/utils/construct.d.ts.map +1 -1
  127. package/dist/types/utils/tern-ui-script.d.ts +8 -0
  128. package/dist/types/utils/tern-ui-script.d.ts.map +1 -0
  129. package/package.json +41 -52
  130. package/dist/cjs/boundary/TernSecureClientProvider.js +0 -240
  131. package/dist/cjs/boundary/TernSecureClientProvider.js.map +0 -1
  132. package/dist/cjs/boundary/TernSecureCtx.js.map +0 -1
  133. package/dist/cjs/boundary/hooks/useAuth.js +0 -63
  134. package/dist/cjs/boundary/hooks/useAuth.js.map +0 -1
  135. package/dist/cjs/boundary/hooks/useSignUp.js.map +0 -1
  136. package/dist/cjs/components/background.js +0 -65
  137. package/dist/cjs/components/background.js.map +0 -1
  138. package/dist/cjs/components/sign-in.js +0 -368
  139. package/dist/cjs/components/sign-in.js.map +0 -1
  140. package/dist/cjs/components/sign-out-button.js +0 -84
  141. package/dist/cjs/components/sign-out-button.js.map +0 -1
  142. package/dist/cjs/components/sign-out.js +0 -99
  143. package/dist/cjs/components/sign-out.js.map +0 -1
  144. package/dist/cjs/components/sign-up.js +0 -332
  145. package/dist/cjs/components/sign-up.js.map +0 -1
  146. package/dist/cjs/components/ui/alert.js +0 -88
  147. package/dist/cjs/components/ui/alert.js.map +0 -1
  148. package/dist/cjs/components/ui/button.js +0 -84
  149. package/dist/cjs/components/ui/button.js.map +0 -1
  150. package/dist/cjs/components/ui/card.js +0 -101
  151. package/dist/cjs/components/ui/card.js.map +0 -1
  152. package/dist/cjs/components/ui/input.js +0 -58
  153. package/dist/cjs/components/ui/input.js.map +0 -1
  154. package/dist/cjs/components/ui/label.js +0 -55
  155. package/dist/cjs/components/ui/label.js.map +0 -1
  156. package/dist/cjs/components/ui/separator.js.map +0 -1
  157. package/dist/cjs/components/verify.js +0 -195
  158. package/dist/cjs/components/verify.js.map +0 -1
  159. package/dist/cjs/lib/utils.d.js +0 -17
  160. package/dist/cjs/lib/utils.d.js.map +0 -1
  161. package/dist/cjs/lib/utils.js.map +0 -1
  162. package/dist/esm/boundary/TernSecureClientProvider.js +0 -216
  163. package/dist/esm/boundary/TernSecureClientProvider.js.map +0 -1
  164. package/dist/esm/boundary/TernSecureCtx.js +0 -23
  165. package/dist/esm/boundary/TernSecureCtx.js.map +0 -1
  166. package/dist/esm/boundary/hooks/useAuth.js +0 -39
  167. package/dist/esm/boundary/hooks/useAuth.js.map +0 -1
  168. package/dist/esm/boundary/hooks/useSignUp.js +0 -16
  169. package/dist/esm/boundary/hooks/useSignUp.js.map +0 -1
  170. package/dist/esm/components/background.js +0 -41
  171. package/dist/esm/components/background.js.map +0 -1
  172. package/dist/esm/components/sign-in.js +0 -344
  173. package/dist/esm/components/sign-in.js.map +0 -1
  174. package/dist/esm/components/sign-out-button.js +0 -60
  175. package/dist/esm/components/sign-out-button.js.map +0 -1
  176. package/dist/esm/components/sign-out.js +0 -65
  177. package/dist/esm/components/sign-out.js.map +0 -1
  178. package/dist/esm/components/sign-up.js +0 -298
  179. package/dist/esm/components/sign-up.js.map +0 -1
  180. package/dist/esm/components/ui/alert.js +0 -52
  181. package/dist/esm/components/ui/alert.js.map +0 -1
  182. package/dist/esm/components/ui/button.js +0 -49
  183. package/dist/esm/components/ui/button.js.map +0 -1
  184. package/dist/esm/components/ui/card.js +0 -62
  185. package/dist/esm/components/ui/card.js.map +0 -1
  186. package/dist/esm/components/ui/input.js +0 -24
  187. package/dist/esm/components/ui/input.js.map +0 -1
  188. package/dist/esm/components/ui/label.js +0 -21
  189. package/dist/esm/components/ui/label.js.map +0 -1
  190. package/dist/esm/components/ui/separator.js +0 -25
  191. package/dist/esm/components/ui/separator.js.map +0 -1
  192. package/dist/esm/components/verify.js +0 -161
  193. package/dist/esm/components/verify.js.map +0 -1
  194. package/dist/esm/lib/utils.d.js +0 -1
  195. package/dist/esm/lib/utils.d.js.map +0 -1
  196. package/dist/esm/lib/utils.js +0 -9
  197. package/dist/esm/lib/utils.js.map +0 -1
  198. package/dist/types/boundary/TernSecureClientProvider.d.ts +0 -27
  199. package/dist/types/boundary/TernSecureClientProvider.d.ts.map +0 -1
  200. package/dist/types/boundary/TernSecureCtx.d.ts +0 -11
  201. package/dist/types/boundary/TernSecureCtx.d.ts.map +0 -1
  202. package/dist/types/boundary/hooks/useAuth.d.ts +0 -15
  203. package/dist/types/boundary/hooks/useAuth.d.ts.map +0 -1
  204. package/dist/types/boundary/hooks/useSignUp.d.ts +0 -5
  205. package/dist/types/boundary/hooks/useSignUp.d.ts.map +0 -1
  206. package/dist/types/components/background.d.ts +0 -2
  207. package/dist/types/components/background.d.ts.map +0 -1
  208. package/dist/types/components/sign-in.d.ts +0 -18
  209. package/dist/types/components/sign-in.d.ts.map +0 -1
  210. package/dist/types/components/sign-out-button.d.ts +0 -14
  211. package/dist/types/components/sign-out-button.d.ts.map +0 -1
  212. package/dist/types/components/sign-out.d.ts +0 -12
  213. package/dist/types/components/sign-out.d.ts.map +0 -1
  214. package/dist/types/components/sign-up.d.ts +0 -11
  215. package/dist/types/components/sign-up.d.ts.map +0 -1
  216. package/dist/types/components/ui/alert.d.ts +0 -9
  217. package/dist/types/components/ui/alert.d.ts.map +0 -1
  218. package/dist/types/components/ui/button.d.ts +0 -12
  219. package/dist/types/components/ui/button.d.ts.map +0 -1
  220. package/dist/types/components/ui/card.d.ts +0 -9
  221. package/dist/types/components/ui/card.d.ts.map +0 -1
  222. package/dist/types/components/ui/input.d.ts +0 -4
  223. package/dist/types/components/ui/input.d.ts.map +0 -1
  224. package/dist/types/components/ui/label.d.ts +0 -6
  225. package/dist/types/components/ui/label.d.ts.map +0 -1
  226. package/dist/types/components/ui/separator.d.ts +0 -5
  227. package/dist/types/components/ui/separator.d.ts.map +0 -1
  228. package/dist/types/components/verify.d.ts +0 -2
  229. package/dist/types/components/verify.d.ts.map +0 -1
  230. package/dist/types/lib/utils.d.ts +0 -3
  231. package/dist/types/lib/utils.d.ts.map +0 -1
  232. package/server/package.json +0 -5
@@ -0,0 +1,108 @@
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 allNextProviderProps_exports = {};
20
+ __export(allNextProviderProps_exports, {
21
+ allNextProviderPropsWithEnv: () => allNextProviderPropsWithEnv
22
+ });
23
+ module.exports = __toCommonJS(allNextProviderProps_exports);
24
+ const allNextProviderPropsWithEnv = (nextProps) => {
25
+ const {
26
+ signInUrl,
27
+ signUpUrl,
28
+ signInForceRedirectUrl: propsSignInForceRedirectUrl,
29
+ signUpForceRedirectUrl: propsSignUpForceRedirectUrl,
30
+ apiKey: propsApiKey,
31
+ projectId: propsProjectId,
32
+ customDomain: propsCustomDomain,
33
+ proxyUrl: propsProxyUrl,
34
+ environment: propsEnvironment,
35
+ requiresVerification: propsRequiresVerification,
36
+ loadingComponent: propsLoadingComponent,
37
+ ...baseProps
38
+ } = nextProps;
39
+ const envConfig = {
40
+ apiKey: process.env.NEXT_PUBLIC_TERN_API_KEY,
41
+ projectId: process.env.NEXT_PUBLIC_TERN_PROJECT_ID,
42
+ customDomain: process.env.NEXT_PUBLIC_TERN_CUSTOM_DOMAIN,
43
+ proxyUrl: process.env.NEXT_PUBLIC_TERN_PROXY_URL,
44
+ environment: process.env.NEXT_PUBLIC_TERN_ENVIRONMENT,
45
+ signInUrl: process.env.NEXT_PUBLIC_SIGN_IN_URL,
46
+ signUpUrl: process.env.NEXT_PUBLIC_SIGN_UP_URL,
47
+ signInForceRedirectUrl: process.env.NEXT_PUBLIC_SIGN_IN_FORCE_REDIRECT_URL,
48
+ signUpForceRedirectUrl: process.env.NEXT_PUBLIC_SIGN_UP_FORCE_REDIRECT_URL
49
+ };
50
+ const ternSecureConfig = {
51
+ apiKey: process.env.NEXT_PUBLIC_FIREBASE_API_KEY || "",
52
+ authDomain: process.env.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN || "",
53
+ appName: process.env.NEXT_PUBLIC_FIREBASE_APP_NAME || "",
54
+ projectId: process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID || "",
55
+ storageBucket: process.env.NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET || "",
56
+ messagingSenderId: process.env.NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID || "",
57
+ appId: process.env.NEXT_PUBLIC_FIREBASE_APP_ID || "",
58
+ measurementId: process.env.NEXT_PUBLIC_FIREBASE_MEASUREMENTID
59
+ };
60
+ const finalApiKey = propsApiKey ?? envConfig.apiKey;
61
+ const finalProjectId = propsProjectId ?? envConfig.projectId;
62
+ const finalCustomDomain = propsCustomDomain ?? envConfig.customDomain;
63
+ const finalProxyUrl = propsProxyUrl ?? envConfig.proxyUrl;
64
+ const finalEnvironment = propsEnvironment ?? envConfig.environment;
65
+ const finalSignInUrl = signInUrl ?? envConfig.signInUrl;
66
+ const finalSignUpUrl = signUpUrl ?? envConfig.signUpUrl;
67
+ const finalSignInForceRedirectUrl = propsSignInForceRedirectUrl ?? envConfig.signInForceRedirectUrl;
68
+ const finalSignUpForceRedirectUrl = propsSignUpForceRedirectUrl ?? envConfig.signUpForceRedirectUrl;
69
+ const result = {
70
+ ...baseProps,
71
+ // Set the merged/prioritized instance configuration properties
72
+ apiKey: finalApiKey,
73
+ projectId: finalProjectId,
74
+ customDomain: finalCustomDomain,
75
+ proxyUrl: finalProxyUrl,
76
+ environment: finalEnvironment,
77
+ // Set the Firebase configuration properties
78
+ ternSecureConfig,
79
+ // Set properties explicitly taken from TernSecureNextProps (props version)
80
+ // These are part of the TernSecureProviderProps interface.
81
+ requiresVerification: propsRequiresVerification,
82
+ loadingComponent: propsLoadingComponent,
83
+ ...propsRequiresVerification !== void 0 && { requireverification: propsRequiresVerification },
84
+ //TernSecure: baseProps.Instance,
85
+ initialState: baseProps.initialState,
86
+ bypassApiKey: baseProps.bypassApiKey,
87
+ initialSession: baseProps.initialSession,
88
+ defaultAppearance: baseProps.defaultAppearance,
89
+ signInUrl: finalSignInUrl,
90
+ signUpUrl: finalSignUpUrl,
91
+ signInForceRedirectUrl: finalSignInForceRedirectUrl,
92
+ signUpForceRedirectUrl: finalSignUpForceRedirectUrl,
93
+ mode: baseProps.mode,
94
+ onAuthStateChanged: baseProps.onAuthStateChanged,
95
+ onError: baseProps.onError
96
+ };
97
+ Object.keys(result).forEach((key) => {
98
+ if (result[key] === void 0) {
99
+ delete result[key];
100
+ }
101
+ });
102
+ return result;
103
+ };
104
+ // Annotate the CommonJS export names for ESM import in node:
105
+ 0 && (module.exports = {
106
+ allNextProviderPropsWithEnv
107
+ });
108
+ //# sourceMappingURL=allNextProviderProps.js.map
@@ -0,0 +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,49 +1,4 @@
1
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 client_init_exports = {};
20
- __export(client_init_exports, {
21
- TernSecureAuth: () => TernSecureAuth,
22
- TernSecureFirestore: () => TernSecureFirestore,
23
- TernSecureStorage: () => TernSecureStorage,
24
- ternSecureAuth: () => ternSecureAuth
25
- });
26
- module.exports = __toCommonJS(client_init_exports);
27
- var import_app = require("firebase/app");
28
- var import_auth = require("firebase/auth");
29
- var import_firestore = require("firebase/firestore");
30
- var import_storage = require("firebase/storage");
31
- var import_config = require("./config");
32
- const APP_NAME = process.env.NEXT_PUBLIC_APP_NAME;
33
- const config = (0, import_config.initializeConfig)();
34
- const clientApp = (0, import_app.getApps)().length === 0 ? (0, import_app.initializeApp)(config, APP_NAME) : (0, import_app.getApps)()[0];
35
- const ternSecureAuth = (0, import_auth.getAuth)(clientApp);
36
- (0, import_auth.setPersistence)(ternSecureAuth, import_auth.browserLocalPersistence);
37
- const firestore = (0, import_firestore.getFirestore)(clientApp);
38
- const storage = (0, import_storage.getStorage)(clientApp);
39
- const TernSecureAuth = () => ternSecureAuth;
40
- const TernSecureFirestore = () => firestore;
41
- const TernSecureStorage = () => storage;
42
- // Annotate the CommonJS export names for ESM import in node:
43
- 0 && (module.exports = {
44
- TernSecureAuth,
45
- TernSecureFirestore,
46
- TernSecureStorage,
47
- ternSecureAuth
48
- });
2
+ {
3
+ }
49
4
  //# sourceMappingURL=client-init.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utils/client-init.ts"],"sourcesContent":["import { initializeApp, getApps } from 'firebase/app';\nimport { getAuth, setPersistence, browserSessionPersistence, browserLocalPersistence} from 'firebase/auth';\nimport { getFirestore } from 'firebase/firestore';\nimport { getStorage } from 'firebase/storage';\nimport { initializeConfig} from './config';\n\nconst APP_NAME = process.env.NEXT_PUBLIC_APP_NAME;\n\n// Initialize immediately\nconst config = initializeConfig();\nconst clientApp = getApps().length === 0 ? initializeApp(config, APP_NAME) : getApps()[0];\nexport const ternSecureAuth = getAuth(clientApp);\nsetPersistence(ternSecureAuth, browserLocalPersistence); //to change later user should be able to choose persistance\nconst firestore = getFirestore(clientApp);\nconst storage = getStorage(clientApp);\n\n\n\nexport const TernSecureAuth = () => ternSecureAuth;\nexport const TernSecureFirestore = () => firestore;\nexport const TernSecureStorage = () => storage;\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAuC;AACvC,kBAA2F;AAC3F,uBAA6B;AAC7B,qBAA2B;AAC3B,oBAAgC;AAEhC,MAAM,WAAW,QAAQ,IAAI;AAG7B,MAAM,aAAS,gCAAiB;AAChC,MAAM,gBAAY,oBAAQ,EAAE,WAAW,QAAI,0BAAc,QAAQ,QAAQ,QAAI,oBAAQ,EAAE,CAAC;AACjF,MAAM,qBAAiB,qBAAQ,SAAS;AAAA,IAC/C,4BAAe,gBAAgB,mCAAuB;AACtD,MAAM,gBAAY,+BAAa,SAAS;AACxC,MAAM,cAAU,2BAAW,SAAS;AAI7B,MAAM,iBAAiB,MAAM;AAC7B,MAAM,sBAAsB,MAAM;AAClC,MAAM,oBAAoB,MAAM;","names":[]}
1
+ {"version":3,"sources":["../../../src/utils/client-init.ts"],"sourcesContent":["{/*import { initializeApp, getApps } from 'firebase/app';\r\nimport { getAuth, setPersistence, browserSessionPersistence, browserLocalPersistence} from 'firebase/auth';\r\nimport { getFirestore } from 'firebase/firestore';\r\nimport { getStorage } from 'firebase/storage';\r\nimport { initializeConfig} from './config';\r\n\r\nconst APP_NAME = process.env.NEXT_PUBLIC_APP_NAME;\r\n\r\n// Initialize immediately\r\nconst config = initializeConfig();\r\nconst clientApp = getApps().length === 0 ? initializeApp(config, APP_NAME) : getApps()[0];\r\nexport const ternSecureAuth = getAuth(clientApp);\r\nsetPersistence(ternSecureAuth, browserLocalPersistence); //to change later user should be able to choose persistance\r\nconst firestore = getFirestore(clientApp);\r\nconst storage = getStorage(clientApp);\r\n\r\n\r\n\r\nexport const TernSecureAuth = () => ternSecureAuth;\r\nexport const TernSecureFirestore = () => firestore;\r\nexport const TernSecureStorage = () => storage;\r\n*/}"],"mappings":";AAAA;AAqBE;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utils/config.ts"],"sourcesContent":["import { TernSecureConfig, ConfigValidationResult, TernSecureAdminConfig, AdminConfigValidationResult } from '../types'\n\n/**\n * Loads Firebase configuration from environment variables\n * @returns {TernSecureConfig} Firebase configuration object\n */\nexport const loadFireConfig = (): TernSecureConfig => ({\n apiKey: process.env.NEXT_PUBLIC_FIREBASE_API_KEY || '',\n authDomain: process.env.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN || '',\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_MEASUREMENT_ID || undefined,\n})\n\n/**\n * Validates Firebase configuration\n * @param {TernSecureConfig} config - Firebase configuration object\n * @throws {Error} If required configuration values are missing\n * @returns {TernSecureConfig} Validated configuration object\n */\nexport const validateConfig = (config: TernSecureConfig): ConfigValidationResult => {\n const requiredFields: (keyof TernSecureConfig)[] = [\n 'apiKey',\n 'authDomain',\n 'projectId',\n 'storageBucket',\n 'messagingSenderId',\n 'appId'\n ]\n\n const errors: string[] = []\n \n requiredFields.forEach(field => {\n if (!config[field]) {\n errors.push(`Missing required field: NEXT_PUBLIC_FIREBASE_${String(field).toUpperCase()}`)\n }\n })\n\n return {\n isValid: errors.length === 0,\n errors,\n config\n }\n}\n\n/**\n * Initializes configuration with validation\n * @throws {Error} If configuration is invalid\n */\nexport const initializeConfig = (): TernSecureConfig => {\n const config = loadFireConfig()\n const validationResult = validateConfig(config)\n\n if (!validationResult.isValid) {\n throw new Error(\n `Firebase configuration validation failed:\\n${validationResult.errors.join('\\n')}`\n )\n }\n\n return config\n}\n\n/**\n * Loads Firebase Admin configuration from environment variables\n * @returns {AdminConfig} Firebase Admin configuration object\n */\nexport const loadAdminConfig = (): TernSecureAdminConfig => ({\n projectId: process.env.FIREBASE_PROJECT_ID || '',\n clientEmail: process.env.FIREBASE_CLIENT_EMAIL || '',\n privateKey: process.env.FIREBASE_PRIVATE_KEY || '',\n})\n\n/**\n * Validates Firebase Admin configuration\n * @param {AdminConfig} config - Firebase Admin configuration object\n * @returns {ConfigValidationResult} Validation result\n */\nexport const validateAdminConfig = (config: TernSecureAdminConfig): AdminConfigValidationResult => {\n const requiredFields: (keyof TernSecureAdminConfig)[] = [\n 'projectId',\n 'clientEmail',\n 'privateKey'\n ]\n\n const errors: string[] = []\n \n requiredFields.forEach(field => {\n if (!config[field]) {\n errors.push(`Missing required field: FIREBASE_${String(field).toUpperCase()}`)\n }\n })\n\n return {\n isValid: errors.length === 0,\n errors,\n config\n }\n}\n\n/**\n * Initializes admin configuration with validation\n * @throws {Error} If configuration is invalid\n */\nexport const initializeAdminConfig = (): TernSecureAdminConfig => {\n const config = loadAdminConfig()\n const validationResult = validateAdminConfig(config)\n\n if (!validationResult.isValid) {\n throw new Error(\n `Firebase Admin configuration validation failed:\\n${validationResult.errors.join('\\n')}`\n )\n }\n\n return config\n}"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAMO,MAAM,iBAAiB,OAAyB;AAAA,EACrD,QAAQ,QAAQ,IAAI,gCAAgC;AAAA,EACpD,YAAY,QAAQ,IAAI,oCAAoC;AAAA,EAC5D,WAAW,QAAQ,IAAI,mCAAmC;AAAA,EAC1D,eAAe,QAAQ,IAAI,uCAAuC;AAAA,EAClE,mBAAmB,QAAQ,IAAI,4CAA4C;AAAA,EAC3E,OAAO,QAAQ,IAAI,+BAA+B;AAAA,EAClD,eAAe,QAAQ,IAAI,uCAAuC;AACpE;AAQO,MAAM,iBAAiB,CAAC,WAAqD;AAClF,QAAM,iBAA6C;AAAA,IACjD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,SAAmB,CAAC;AAE1B,iBAAe,QAAQ,WAAS;AAC9B,QAAI,CAAC,OAAO,KAAK,GAAG;AAClB,aAAO,KAAK,gDAAgD,OAAO,KAAK,EAAE,YAAY,CAAC,EAAE;AAAA,IAC3F;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL,SAAS,OAAO,WAAW;AAAA,IAC3B;AAAA,IACA;AAAA,EACF;AACF;AAMO,MAAM,mBAAmB,MAAwB;AACtD,QAAM,SAAS,eAAe;AAC9B,QAAM,mBAAmB,eAAe,MAAM;AAE9C,MAAI,CAAC,iBAAiB,SAAS;AAC7B,UAAM,IAAI;AAAA,MACR;AAAA,EAA8C,iBAAiB,OAAO,KAAK,IAAI,CAAC;AAAA,IAClF;AAAA,EACF;AAEA,SAAO;AACT;AAMO,MAAM,kBAAkB,OAA8B;AAAA,EAC3D,WAAW,QAAQ,IAAI,uBAAuB;AAAA,EAC9C,aAAa,QAAQ,IAAI,yBAAyB;AAAA,EAClD,YAAY,QAAQ,IAAI,wBAAwB;AAClD;AAOO,MAAM,sBAAsB,CAAC,WAA+D;AACjG,QAAM,iBAAkD;AAAA,IACtD;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,SAAmB,CAAC;AAE1B,iBAAe,QAAQ,WAAS;AAC9B,QAAI,CAAC,OAAO,KAAK,GAAG;AAClB,aAAO,KAAK,oCAAoC,OAAO,KAAK,EAAE,YAAY,CAAC,EAAE;AAAA,IAC/E;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL,SAAS,OAAO,WAAW;AAAA,IAC3B;AAAA,IACA;AAAA,EACF;AACF;AAMO,MAAM,wBAAwB,MAA6B;AAChE,QAAM,SAAS,gBAAgB;AAC/B,QAAM,mBAAmB,oBAAoB,MAAM;AAEnD,MAAI,CAAC,iBAAiB,SAAS;AAC7B,UAAM,IAAI;AAAA,MACR;AAAA,EAAoD,iBAAiB,OAAO,KAAK,IAAI,CAAC;AAAA,IACxF;AAAA,EACF;AAEA,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../../src/utils/config.ts"],"sourcesContent":["import { \r\n TernSecureConfig, \r\n ConfigValidationResult, \r\n TernSecureAdminConfig, \r\n AdminConfigValidationResult\r\n} from '@tern-secure/types'\r\n\r\n/**\r\n * Loads Firebase configuration from environment variables\r\n * @returns {TernSecureConfig} Firebase configuration object\r\n */\r\nexport const loadFireConfig = (): TernSecureConfig => ({\r\n apiKey: process.env.NEXT_PUBLIC_FIREBASE_API_KEY || '',\r\n authDomain: process.env.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN || '',\r\n projectId: process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID || '',\r\n storageBucket: process.env.NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET || '',\r\n messagingSenderId: process.env.NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID || '',\r\n appId: process.env.NEXT_PUBLIC_FIREBASE_APP_ID || '',\r\n measurementId: process.env.NEXT_PUBLIC_FIREBASE_MEASUREMENT_ID || undefined,\r\n})\r\n\r\n/**\r\n * Validates Firebase configuration\r\n * @param {TernSecureConfig} config - Firebase configuration object\r\n * @throws {Error} If required configuration values are missing\r\n * @returns {TernSecureConfig} Validated configuration object\r\n */\r\nexport const validateConfig = (config: TernSecureConfig): ConfigValidationResult => {\r\n const requiredFields: (keyof TernSecureConfig)[] = [\r\n 'apiKey',\r\n 'authDomain',\r\n 'projectId',\r\n 'storageBucket',\r\n 'messagingSenderId',\r\n 'appId'\r\n ]\r\n\r\n const errors: string[] = []\r\n \r\n requiredFields.forEach(field => {\r\n if (!config[field]) {\r\n errors.push(`Missing required field: NEXT_PUBLIC_FIREBASE_${String(field).toUpperCase()}`)\r\n }\r\n })\r\n\r\n return {\r\n isValid: errors.length === 0,\r\n errors,\r\n config\r\n }\r\n}\r\n\r\n/**\r\n * Initializes configuration with validation\r\n * @throws {Error} If configuration is invalid\r\n */\r\nexport const initializeConfig = (): TernSecureConfig => {\r\n const config = loadFireConfig()\r\n const validationResult = validateConfig(config)\r\n\r\n if (!validationResult.isValid) {\r\n throw new Error(\r\n `Firebase configuration validation failed:\\n${validationResult.errors.join('\\n')}`\r\n )\r\n }\r\n\r\n return config\r\n}\r\n\r\n/**\r\n * Loads Firebase Admin configuration from environment variables\r\n * @returns {AdminConfig} Firebase Admin configuration object\r\n */\r\nexport const loadAdminConfig = (): TernSecureAdminConfig => ({\r\n projectId: process.env.FIREBASE_PROJECT_ID || '',\r\n clientEmail: process.env.FIREBASE_CLIENT_EMAIL || '',\r\n privateKey: process.env.FIREBASE_PRIVATE_KEY || '',\r\n})\r\n\r\n/**\r\n * Validates Firebase Admin configuration\r\n * @param {AdminConfig} config - Firebase Admin configuration object\r\n * @returns {ConfigValidationResult} Validation result\r\n */\r\nexport const validateAdminConfig = (config: TernSecureAdminConfig): AdminConfigValidationResult => {\r\n const requiredFields: (keyof TernSecureAdminConfig)[] = [\r\n 'projectId',\r\n 'clientEmail',\r\n 'privateKey'\r\n ]\r\n\r\n const errors: string[] = []\r\n \r\n requiredFields.forEach(field => {\r\n if (!config[field]) {\r\n errors.push(`Missing required field: FIREBASE_${String(field).toUpperCase()}`)\r\n }\r\n })\r\n\r\n return {\r\n isValid: errors.length === 0,\r\n errors,\r\n config\r\n }\r\n}\r\n\r\n/**\r\n * Initializes admin configuration with validation\r\n * @throws {Error} If configuration is invalid\r\n */\r\nexport const initializeAdminConfig = (): TernSecureAdminConfig => {\r\n const config = loadAdminConfig()\r\n const validationResult = validateAdminConfig(config)\r\n\r\n if (!validationResult.isValid) {\r\n throw new Error(\r\n `Firebase Admin configuration validation failed:\\n${validationResult.errors.join('\\n')}`\r\n )\r\n }\r\n\r\n return config\r\n}"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWO,MAAM,iBAAiB,OAAyB;AAAA,EACrD,QAAQ,QAAQ,IAAI,gCAAgC;AAAA,EACpD,YAAY,QAAQ,IAAI,oCAAoC;AAAA,EAC5D,WAAW,QAAQ,IAAI,mCAAmC;AAAA,EAC1D,eAAe,QAAQ,IAAI,uCAAuC;AAAA,EAClE,mBAAmB,QAAQ,IAAI,4CAA4C;AAAA,EAC3E,OAAO,QAAQ,IAAI,+BAA+B;AAAA,EAClD,eAAe,QAAQ,IAAI,uCAAuC;AACpE;AAQO,MAAM,iBAAiB,CAAC,WAAqD;AAClF,QAAM,iBAA6C;AAAA,IACjD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,SAAmB,CAAC;AAE1B,iBAAe,QAAQ,WAAS;AAC9B,QAAI,CAAC,OAAO,KAAK,GAAG;AAClB,aAAO,KAAK,gDAAgD,OAAO,KAAK,EAAE,YAAY,CAAC,EAAE;AAAA,IAC3F;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL,SAAS,OAAO,WAAW;AAAA,IAC3B;AAAA,IACA;AAAA,EACF;AACF;AAMO,MAAM,mBAAmB,MAAwB;AACtD,QAAM,SAAS,eAAe;AAC9B,QAAM,mBAAmB,eAAe,MAAM;AAE9C,MAAI,CAAC,iBAAiB,SAAS;AAC7B,UAAM,IAAI;AAAA,MACR;AAAA,EAA8C,iBAAiB,OAAO,KAAK,IAAI,CAAC;AAAA,IAClF;AAAA,EACF;AAEA,SAAO;AACT;AAMO,MAAM,kBAAkB,OAA8B;AAAA,EAC3D,WAAW,QAAQ,IAAI,uBAAuB;AAAA,EAC9C,aAAa,QAAQ,IAAI,yBAAyB;AAAA,EAClD,YAAY,QAAQ,IAAI,wBAAwB;AAClD;AAOO,MAAM,sBAAsB,CAAC,WAA+D;AACjG,QAAM,iBAAkD;AAAA,IACtD;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,SAAmB,CAAC;AAE1B,iBAAe,QAAQ,WAAS;AAC9B,QAAI,CAAC,OAAO,KAAK,GAAG;AAClB,aAAO,KAAK,oCAAoC,OAAO,KAAK,EAAE,YAAY,CAAC,EAAE;AAAA,IAC/E;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL,SAAS,OAAO,WAAW;AAAA,IAC3B;AAAA,IACA;AAAA,EACF;AACF;AAMO,MAAM,wBAAwB,MAA6B;AAChE,QAAM,SAAS,gBAAgB;AAC/B,QAAM,mBAAmB,oBAAoB,MAAM;AAEnD,MAAI,CAAC,iBAAiB,SAAS;AAC7B,UAAM,IAAI;AAAA,MACR;AAAA,EAAoD,iBAAiB,OAAO,KAAK,IAAI,CAAC;AAAA,IACxF;AAAA,EACF;AAEA,SAAO;AACT;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utils/construct.ts"],"sourcesContent":["//v2: redict with taking priority from the sign-in page\n\nimport { isInternalRoute, isAuthRoute } from \"../app-router/route-handler/internal-route\"\n\n/**\n * Constructs a full URL with the current origin\n * @param path - The path to construct the URL for\n * @returns The full URL with origin\n */\nexport const constructFullUrl = (path: string) => {\n if (typeof window === \"undefined\") return path\n const baseUrl = window.location.origin\n if (path.startsWith('http')) {\n return path\n }\n return `${baseUrl}${path.startsWith('/') ? path : `/${path}`}`\n }\n\n\n/**\n * Checks if the current URL has a redirect loop\n * @param currentPath - The current pathname\n * @param redirectPath - The path we're trying to redirect to\n * @returns boolean indicating if there's a redirect loop\n */\nexport const hasRedirectLoop = (currentPath: string, redirectPath: string): boolean => {\n if (!currentPath || !redirectPath) return false\n\n // Remove any query parameters for comparison\n const cleanCurrentPath = currentPath.split(\"?\")[0]\n const cleanRedirectPath = redirectPath.split(\"?\")[0]\n\n return cleanCurrentPath === cleanRedirectPath\n}\n \n/**\n * Constructs a URL with redirect parameters while preventing loops\n * @param path - The base path (usually login path)\n * @param redirectUrl - The URL to redirect to after action completes\n * @param loginPath - The login path to check against\n * @param signUpPath - The sign up path to check against\n * @returns The full URL with redirect parameters\n */\nexport const constructUrlWithRedirect = (\n path: string,\n redirectUrl: string | undefined,\n): string => {\n const url = new URL(path, typeof window !== \"undefined\" ? window.location.origin : undefined)\n \n if (redirectUrl && !isAuthRoute(redirectUrl) && !isInternalRoute(redirectUrl)) {\n url.searchParams.set(\"redirect\", redirectUrl)\n }\n \n return url.toString()\n}\n\n/**\n * Stores the current path before signing out\n */\nexport const storePreviousPath = (path: string): void => {\n if (typeof window !== \"undefined\" && !isAuthRoute(path)) {\n sessionStorage.setItem(\"previousPath\", path)\n }\n}\n\n/**\n * Gets the stored previous path\n */\nexport const getPreviousPath = (): string | null => {\n if (typeof window !== \"undefined\") {\n return sessionStorage.getItem(\"previousPath\")\n }\n return null\n}\n\n\n \n/**\n * Gets a validated redirect URL ensuring it's from the same origin\n * @param redirectUrl - The URL to validate\n * @param searchParams - The search parameters to check for redirect\n * @returns A validated redirect URL\n */\nexport const getValidRedirectUrl = (\n searchParams: URLSearchParams,\n configuredRedirect?: string,\n): string => {\n // Check URL search param first (highest priority)\n const urlRedirect = searchParams.get(\"redirect\")\n if (urlRedirect) {\n return validateUrl(urlRedirect)\n }\n\n // Then check configured redirect (for first visits)\n if (configuredRedirect) {\n return validateUrl(configuredRedirect)\n }\n\n // Default fallback\n return \"/\"\n}\n\n/**\n * Validates and sanitizes URLs\n */\nconst validateUrl = (url: string): string => {\n try {\n // For absolute URLs\n if (url.startsWith(\"http\")) {\n const urlObj = new URL(url)\n if (typeof window !== \"undefined\" && urlObj.origin !== window.location.origin) {\n return \"/\"\n }\n return !isAuthRoute(urlObj.pathname) && !isInternalRoute(urlObj.pathname) \n ? urlObj.pathname \n : \"/\"\n }\n \n // For relative URLs\n return !isAuthRoute(url) && !isInternalRoute(url) ? url : \"/\"\n } catch {\n return \"/\"\n }\n}\n\n\n\n\n\n\n\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,4BAA6C;AAOtC,MAAM,mBAAmB,CAAC,SAAiB;AAChD,MAAI,OAAO,WAAW,YAAa,QAAO;AACxC,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;AASK,MAAM,kBAAkB,CAAC,aAAqB,iBAAkC;AACrF,MAAI,CAAC,eAAe,CAAC,aAAc,QAAO;AAG1C,QAAM,mBAAmB,YAAY,MAAM,GAAG,EAAE,CAAC;AACjD,QAAM,oBAAoB,aAAa,MAAM,GAAG,EAAE,CAAC;AAEnD,SAAO,qBAAqB;AAC9B;AAUO,MAAM,2BAA2B,CACtC,MACA,gBACW;AACX,QAAM,MAAM,IAAI,IAAI,MAAM,OAAO,WAAW,cAAc,OAAO,SAAS,SAAS,MAAS;AAE5F,MAAI,eAAe,KAAC,mCAAY,WAAW,KAAK,KAAC,uCAAgB,WAAW,GAAG;AAC7E,QAAI,aAAa,IAAI,YAAY,WAAW;AAAA,EAC9C;AAEA,SAAO,IAAI,SAAS;AACtB;AAKO,MAAM,oBAAoB,CAAC,SAAuB;AACvD,MAAI,OAAO,WAAW,eAAe,KAAC,mCAAY,IAAI,GAAG;AACvD,mBAAe,QAAQ,gBAAgB,IAAI;AAAA,EAC7C;AACF;AAKO,MAAM,kBAAkB,MAAqB;AAClD,MAAI,OAAO,WAAW,aAAa;AACjC,WAAO,eAAe,QAAQ,cAAc;AAAA,EAC9C;AACA,SAAO;AACT;AAUO,MAAM,sBAAsB,CACjC,cACA,uBACW;AAEX,QAAM,cAAc,aAAa,IAAI,UAAU;AAC/C,MAAI,aAAa;AACf,WAAO,YAAY,WAAW;AAAA,EAChC;AAGA,MAAI,oBAAoB;AACtB,WAAO,YAAY,kBAAkB;AAAA,EACvC;AAGA,SAAO;AACT;AAKA,MAAM,cAAc,CAAC,QAAwB;AAC3C,MAAI;AAEF,QAAI,IAAI,WAAW,MAAM,GAAG;AAC1B,YAAM,SAAS,IAAI,IAAI,GAAG;AAC1B,UAAI,OAAO,WAAW,eAAe,OAAO,WAAW,OAAO,SAAS,QAAQ;AAC7E,eAAO;AAAA,MACT;AACA,aAAO,KAAC,mCAAY,OAAO,QAAQ,KAAK,KAAC,uCAAgB,OAAO,QAAQ,IACpE,OAAO,WACP;AAAA,IACN;AAGA,WAAO,KAAC,mCAAY,GAAG,KAAK,KAAC,uCAAgB,GAAG,IAAI,MAAM;AAAA,EAC5D,QAAQ;AACN,WAAO;AAAA,EACT;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../src/utils/construct.ts"],"sourcesContent":["//v2: redict with taking priority from the sign-in page\r\n\r\nimport { isInternalRoute, isAuthRoute } from \"../app-router/route-handler/internal-route\"\r\n\r\n/**\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 if (typeof window === \"undefined\") return path\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/**\r\n * Checks if the current URL has a redirect loop\r\n * @param currentPath - The current pathname\r\n * @param redirectPath - The path we're trying to redirect to\r\n * @returns boolean indicating if there's a redirect loop\r\n */\r\nexport const hasRedirectLoop = (currentPath: string, redirectPath: string): boolean => {\r\n if (!currentPath || !redirectPath) return false\r\n\r\n // Remove any query parameters for comparison\r\n const cleanCurrentPath = currentPath.split(\"?\")[0]\r\n const cleanRedirectPath = redirectPath.split(\"?\")[0]\r\n\r\n return cleanCurrentPath === cleanRedirectPath\r\n}\r\n \r\n/**\r\n * Constructs a URL with redirect parameters while preventing loops\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 * @param signUpPath - The sign up path to check against\r\n * @returns The full URL with redirect parameters\r\n */\r\nexport const constructUrlWithRedirect = (\r\n path: string,\r\n redirectUrl: string | undefined,\r\n): string => {\r\n const url = new URL(path, typeof window !== \"undefined\" ? window.location.origin : undefined)\r\n \r\n if (redirectUrl && !isAuthRoute(redirectUrl) && !isInternalRoute(redirectUrl)) {\r\n url.searchParams.set(\"redirect\", redirectUrl)\r\n }\r\n \r\n return url.toString()\r\n}\r\n\r\n/**\r\n * Stores the current path before signing out\r\n */\r\nexport const storePreviousPath = (path: string): void => {\r\n if (typeof window !== \"undefined\" && !isAuthRoute(path)) {\r\n sessionStorage.setItem(\"previousPath\", path)\r\n }\r\n}\r\n\r\n/**\r\n * Gets the stored previous path\r\n */\r\nexport const getPreviousPath = (): string | null => {\r\n if (typeof window !== \"undefined\") {\r\n return sessionStorage.getItem(\"previousPath\")\r\n }\r\n return null\r\n}\r\n\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\r\n * @returns A validated redirect URL\r\n */\r\nexport const getValidRedirectUrl = (\r\n searchParams: URLSearchParams,\r\n configuredRedirect?: string,\r\n): string => {\r\n // Check URL search param first (highest priority)\r\n const urlRedirect = searchParams.get(\"redirect\")\r\n if (urlRedirect) {\r\n return validateUrl(urlRedirect)\r\n }\r\n\r\n // Then check configured redirect (for first visits)\r\n if (configuredRedirect) {\r\n return validateUrl(configuredRedirect)\r\n }\r\n\r\n // Default fallback\r\n return \"/\"\r\n}\r\n\r\n/**\r\n * Validates and sanitizes URLs\r\n */\r\nconst validateUrl = (url: string): string => {\r\n try {\r\n // For absolute URLs\r\n if (url.startsWith(\"http\")) {\r\n const urlObj = new URL(url)\r\n if (typeof window !== \"undefined\" && urlObj.origin !== window.location.origin) {\r\n return \"/\"\r\n }\r\n return !isAuthRoute(urlObj.pathname) && !isInternalRoute(urlObj.pathname) \r\n ? urlObj.pathname \r\n : \"/\"\r\n }\r\n \r\n // For relative URLs\r\n return !isAuthRoute(url) && !isInternalRoute(url) ? url : \"/\"\r\n } catch {\r\n return \"/\"\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,4BAA6C;AAOtC,MAAM,mBAAmB,CAAC,SAAiB;AAChD,MAAI,OAAO,WAAW,YAAa,QAAO;AACxC,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;AASK,MAAM,kBAAkB,CAAC,aAAqB,iBAAkC;AACrF,MAAI,CAAC,eAAe,CAAC,aAAc,QAAO;AAG1C,QAAM,mBAAmB,YAAY,MAAM,GAAG,EAAE,CAAC;AACjD,QAAM,oBAAoB,aAAa,MAAM,GAAG,EAAE,CAAC;AAEnD,SAAO,qBAAqB;AAC9B;AAUO,MAAM,2BAA2B,CACtC,MACA,gBACW;AACX,QAAM,MAAM,IAAI,IAAI,MAAM,OAAO,WAAW,cAAc,OAAO,SAAS,SAAS,MAAS;AAE5F,MAAI,eAAe,KAAC,mCAAY,WAAW,KAAK,KAAC,uCAAgB,WAAW,GAAG;AAC7E,QAAI,aAAa,IAAI,YAAY,WAAW;AAAA,EAC9C;AAEA,SAAO,IAAI,SAAS;AACtB;AAKO,MAAM,oBAAoB,CAAC,SAAuB;AACvD,MAAI,OAAO,WAAW,eAAe,KAAC,mCAAY,IAAI,GAAG;AACvD,mBAAe,QAAQ,gBAAgB,IAAI;AAAA,EAC7C;AACF;AAKO,MAAM,kBAAkB,MAAqB;AAClD,MAAI,OAAO,WAAW,aAAa;AACjC,WAAO,eAAe,QAAQ,cAAc;AAAA,EAC9C;AACA,SAAO;AACT;AAUO,MAAM,sBAAsB,CACjC,cACA,uBACW;AAEX,QAAM,cAAc,aAAa,IAAI,UAAU;AAC/C,MAAI,aAAa;AACf,WAAO,YAAY,WAAW;AAAA,EAChC;AAGA,MAAI,oBAAoB;AACtB,WAAO,YAAY,kBAAkB;AAAA,EACvC;AAGA,SAAO;AACT;AAKA,MAAM,cAAc,CAAC,QAAwB;AAC3C,MAAI;AAEF,QAAI,IAAI,WAAW,MAAM,GAAG;AAC1B,YAAM,SAAS,IAAI,IAAI,GAAG;AAC1B,UAAI,OAAO,WAAW,eAAe,OAAO,WAAW,OAAO,SAAS,QAAQ;AAC7E,eAAO;AAAA,MACT;AACA,aAAO,KAAC,mCAAY,OAAO,QAAQ,KAAK,KAAC,uCAAgB,OAAO,QAAQ,IACpE,OAAO,WACP;AAAA,IACN;AAGA,WAAO,KAAC,mCAAY,GAAG,KAAK,KAAC,uCAAgB,GAAG,IAAI,MAAM;AAAA,EAC5D,QAAQ;AACN,WAAO;AAAA,EACT;AACF;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utils/create-styles.ts"],"sourcesContent":["'use client'\n\nconst PREFIX = 'tern'\n\n// Singleton to track style injection\nconst styleInjection = {\n isInjected: false,\n styleElement: null as HTMLStyleElement | null\n}\n\nexport const defaultClassNames = {\n container: `${PREFIX}-container`,\n header: `${PREFIX}-header`,\n title: `${PREFIX}-title`,\n formWrapper: `${PREFIX}-formWrapper`,\n formContainer: `${PREFIX}-formContainer`,\n form: `${PREFIX}-form`,\n label: `${PREFIX}-label`,\n input: `${PREFIX}-input`,\n button: `${PREFIX}-button`,\n error: `${PREFIX}-error`\n} as const\n\n// Create styles once and cache them\nfunction createStyleSheet(styles: Record<string, React.CSSProperties>) {\n if (typeof window === 'undefined') return defaultClassNames\n\n // Return early if styles are already injected\n if (styleInjection.isInjected) {\n return defaultClassNames\n }\n\n // Find existing style element or create new one\n let styleElement = document.querySelector<HTMLStyleElement>('[data-tern-secure]')\n \n if (!styleElement) {\n styleElement = document.createElement('style')\n styleElement.setAttribute('data-tern-secure', '')\n document.head.appendChild(styleElement)\n styleInjection.styleElement = styleElement\n }\n\n // Create CSS rules\n const cssRules = Object.entries(styles).map(([key, rules]) => {\n const className = defaultClassNames[key as keyof typeof defaultClassNames]\n const cssProperties = Object.entries(rules).map(([prop, value]) => {\n const cssProperty = prop.replace(/([A-Z])/g, '-$1').toLowerCase()\n return `${cssProperty}: ${value};`\n }).join(' ')\n\n return `.${className} { ${cssProperties} }`\n }).join('\\n')\n\n // Insert styles only once\n styleElement.textContent = cssRules\n styleInjection.isInjected = true\n\n return defaultClassNames\n}\n\n// Style configuration\nexport const styleConfig = {\n container: {\n display: 'flex',\n minHeight: '100%',\n flex: '1',\n flexDirection: 'column',\n justifyContent: 'center',\n padding: '3rem 1.5rem'\n },\n header: {\n margin: '0 auto',\n width: '100%',\n maxWidth: '28rem'\n },\n title: {\n marginTop: '1.5rem',\n textAlign: 'center',\n fontSize: '1.875rem',\n fontWeight: '700',\n lineHeight: '2.25rem',\n letterSpacing: '-0.025em',\n color: 'var(--tern-text-primary, #111827)'\n },\n formWrapper: {\n marginTop: '2.5rem',\n margin: '0 auto',\n width: '100%',\n maxWidth: '30rem'\n },\n formContainer: {\n padding: '3rem 1.5rem',\n boxShadow: '0 1px 3px 0 rgb(0 0 0 / 0.1)',\n borderRadius: '0.5rem',\n backgroundColor: 'var(--tern-background, white)'\n },\n form: {\n display: 'flex',\n flexDirection: 'column',\n gap: '1rem'\n },\n label: {\n display: 'block',\n fontSize: '0.875rem',\n fontWeight: '500',\n color: 'var(--tern-text-secondary, #374151)'\n },\n input: {\n marginTop: '0.25rem',\n display: 'block',\n width: '100%',\n padding: '0.5rem 0.75rem',\n borderRadius: '0.375rem',\n border: '1px solid var(--tern-border, #D1D5DB)',\n backgroundColor: 'var(--tern-input-background, white)',\n color: 'var(--tern-text-primary, #111827)'\n },\n button: {\n display: 'flex',\n width: '100%',\n justifyContent: 'center',\n padding: '0.5rem 1rem',\n fontSize: '0.875rem',\n fontWeight: '500',\n color: 'white',\n backgroundColor: 'var(--tern-primary, #2563EB)',\n border: 'none',\n borderRadius: '0.375rem',\n cursor: 'pointer'\n },\n error: {\n color: 'var(--tern-error, #DC2626)',\n fontSize: '0.875rem'\n }\n} as const\n\n// Export pre-created styles\nexport const styles = createStyleSheet(styleConfig)\n\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,MAAM,SAAS;AAGf,MAAM,iBAAiB;AAAA,EACrB,YAAY;AAAA,EACZ,cAAc;AAChB;AAEO,MAAM,oBAAoB;AAAA,EAC/B,WAAW,GAAG,MAAM;AAAA,EACpB,QAAQ,GAAG,MAAM;AAAA,EACjB,OAAO,GAAG,MAAM;AAAA,EAChB,aAAa,GAAG,MAAM;AAAA,EACtB,eAAe,GAAG,MAAM;AAAA,EACxB,MAAM,GAAG,MAAM;AAAA,EACf,OAAO,GAAG,MAAM;AAAA,EAChB,OAAO,GAAG,MAAM;AAAA,EAChB,QAAQ,GAAG,MAAM;AAAA,EACjB,OAAO,GAAG,MAAM;AAClB;AAGA,SAAS,iBAAiBA,SAA6C;AACrE,MAAI,OAAO,WAAW,YAAa,QAAO;AAG1C,MAAI,eAAe,YAAY;AAC7B,WAAO;AAAA,EACT;AAGA,MAAI,eAAe,SAAS,cAAgC,oBAAoB;AAEhF,MAAI,CAAC,cAAc;AACjB,mBAAe,SAAS,cAAc,OAAO;AAC7C,iBAAa,aAAa,oBAAoB,EAAE;AAChD,aAAS,KAAK,YAAY,YAAY;AACtC,mBAAe,eAAe;AAAA,EAChC;AAGA,QAAM,WAAW,OAAO,QAAQA,OAAM,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AAC5D,UAAM,YAAY,kBAAkB,GAAqC;AACzE,UAAM,gBAAgB,OAAO,QAAQ,KAAK,EAAE,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM;AACjE,YAAM,cAAc,KAAK,QAAQ,YAAY,KAAK,EAAE,YAAY;AAChE,aAAO,GAAG,WAAW,KAAK,KAAK;AAAA,IACjC,CAAC,EAAE,KAAK,GAAG;AAEX,WAAO,IAAI,SAAS,MAAM,aAAa;AAAA,EACzC,CAAC,EAAE,KAAK,IAAI;AAGZ,eAAa,cAAc;AAC3B,iBAAe,aAAa;AAE5B,SAAO;AACT;AAGO,MAAM,cAAc;AAAA,EACzB,WAAW;AAAA,IACT,SAAS;AAAA,IACT,WAAW;AAAA,IACX,MAAM;AAAA,IACN,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,SAAS;AAAA,EACX;AAAA,EACA,QAAQ;AAAA,IACN,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,UAAU;AAAA,EACZ;AAAA,EACA,OAAO;AAAA,IACL,WAAW;AAAA,IACX,WAAW;AAAA,IACX,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,OAAO;AAAA,EACT;AAAA,EACA,aAAa;AAAA,IACX,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,UAAU;AAAA,EACZ;AAAA,EACA,eAAe;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,IACX,cAAc;AAAA,IACd,iBAAiB;AAAA,EACnB;AAAA,EACA,MAAM;AAAA,IACJ,SAAS;AAAA,IACT,eAAe;AAAA,IACf,KAAK;AAAA,EACP;AAAA,EACA,OAAO;AAAA,IACL,SAAS;AAAA,IACT,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,OAAO;AAAA,EACT;AAAA,EACA,OAAO;AAAA,IACL,WAAW;AAAA,IACX,SAAS;AAAA,IACT,OAAO;AAAA,IACP,SAAS;AAAA,IACT,cAAc;AAAA,IACd,QAAQ;AAAA,IACR,iBAAiB;AAAA,IACjB,OAAO;AAAA,EACT;AAAA,EACA,QAAQ;AAAA,IACN,SAAS;AAAA,IACT,OAAO;AAAA,IACP,gBAAgB;AAAA,IAChB,SAAS;AAAA,IACT,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,iBAAiB;AAAA,IACjB,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,QAAQ;AAAA,EACV;AAAA,EACA,OAAO;AAAA,IACL,OAAO;AAAA,IACP,UAAU;AAAA,EACZ;AACF;AAGO,MAAM,SAAS,iBAAiB,WAAW;","names":["styles"]}
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 +1 @@
1
- {"version":3,"sources":["../../../src/utils/redirect.ts"],"sourcesContent":["import { headers } from \"next/headers\"\n\n/**\n * Validates and sanitizes redirect URLs\n */\nexport async function validateRedirectUrl(url: string | null): Promise<string> {\n if (!url) return \"/\"\n\n try {\n // Check if it's a relative path\n if (url.startsWith(\"/\")) {\n // Basic validation to ensure the path exists in your app\n // Add more paths as needed\n const validPaths = [\"/\"]\n return validPaths.includes(url) ? url : \"/\"\n }\n\n // If it's an absolute URL, ensure it's from your domain\n const headersList = await headers()\n const currentHost = headersList.get(\"host\")\n const urlObj = new URL(url)\n if (urlObj.host === currentHost) {\n return urlObj.pathname\n }\n } catch {\n // Invalid URL format\n }\n\n return \"/\"\n}\n\n/**\n * Gets the current path for redirect purposes\n */\nexport async function getCurrentPath(): Promise<string> {\n try {\n const headersList = await headers()\n const pathname = headersList.get(\"x-pathname\") || \"/\"\n return pathname\n } catch {\n return \"/\"\n }\n}\n\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAwB;AAKxB,eAAsB,oBAAoB,KAAqC;AAC7E,MAAI,CAAC,IAAK,QAAO;AAEjB,MAAI;AAEF,QAAI,IAAI,WAAW,GAAG,GAAG;AAGvB,YAAM,aAAa,CAAC,GAAG;AACvB,aAAO,WAAW,SAAS,GAAG,IAAI,MAAM;AAAA,IAC1C;AAGC,UAAM,cAAc,UAAM,wBAAQ;AACnC,UAAM,cAAc,YAAY,IAAI,MAAM;AAC1C,UAAM,SAAS,IAAI,IAAI,GAAG;AAC1B,QAAI,OAAO,SAAS,aAAa;AAC/B,aAAO,OAAO;AAAA,IAChB;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,SAAO;AACT;AAKA,eAAsB,iBAAkC;AACtD,MAAI;AACF,UAAM,cAAc,UAAM,wBAAQ;AAClC,UAAM,WAAW,YAAY,IAAI,YAAY,KAAK;AAClD,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../src/utils/redirect.ts"],"sourcesContent":["import { headers } from \"next/headers\"\r\n\r\n/**\r\n * Validates and sanitizes redirect URLs\r\n */\r\nexport async function validateRedirectUrl(url: string | null): Promise<string> {\r\n if (!url) return \"/\"\r\n\r\n try {\r\n // Check if it's a relative path\r\n if (url.startsWith(\"/\")) {\r\n // Basic validation to ensure the path exists in your app\r\n // Add more paths as needed\r\n const validPaths = [\"/\"]\r\n return validPaths.includes(url) ? url : \"/\"\r\n }\r\n\r\n // If it's an absolute URL, ensure it's from your domain\r\n const headersList = await headers()\r\n const currentHost = headersList.get(\"host\")\r\n const urlObj = new URL(url)\r\n if (urlObj.host === currentHost) {\r\n return urlObj.pathname\r\n }\r\n } catch {\r\n // Invalid URL format\r\n }\r\n\r\n return \"/\"\r\n}\r\n\r\n/**\r\n * Gets the current path for redirect purposes\r\n */\r\nexport async function getCurrentPath(): Promise<string> {\r\n try {\r\n const headersList = await headers()\r\n const pathname = headersList.get(\"x-pathname\") || \"/\"\r\n return pathname\r\n } catch {\r\n return \"/\"\r\n }\r\n}\r\n\r\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAwB;AAKxB,eAAsB,oBAAoB,KAAqC;AAC7E,MAAI,CAAC,IAAK,QAAO;AAEjB,MAAI;AAEF,QAAI,IAAI,WAAW,GAAG,GAAG;AAGvB,YAAM,aAAa,CAAC,GAAG;AACvB,aAAO,WAAW,SAAS,GAAG,IAAI,MAAM;AAAA,IAC1C;AAGC,UAAM,cAAc,UAAM,wBAAQ;AACnC,UAAM,cAAc,YAAY,IAAI,MAAM;AAC1C,UAAM,SAAS,IAAI,IAAI,GAAG;AAC1B,QAAI,OAAO,SAAS,aAAa;AAC/B,aAAO,OAAO;AAAA,IAChB;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,SAAO;AACT;AAKA,eAAsB,iBAAkC;AACtD,MAAI;AACF,UAAM,cAAc,UAAM,wBAAQ;AAClC,UAAM,WAAW,YAAY,IAAI,YAAY,KAAK;AAClD,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;","names":[]}
@@ -26,34 +26,51 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
26
26
  mod
27
27
  ));
28
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
- var separator_exports = {};
30
- __export(separator_exports, {
31
- Separator: () => Separator
29
+ var tern_ui_script_exports = {};
30
+ __export(tern_ui_script_exports, {
31
+ TernUIScript: () => TernUIScript
32
32
  });
33
- module.exports = __toCommonJS(separator_exports);
33
+ module.exports = __toCommonJS(tern_ui_script_exports);
34
34
  var import_jsx_runtime = require("react/jsx-runtime");
35
- var React = __toESM(require("react"));
36
- var SeparatorPrimitive = __toESM(require("@radix-ui/react-separator"));
37
- var import_utils = require("../../lib/utils");
38
- const Separator = React.forwardRef(
39
- ({ className, orientation = "horizontal", decorative = true, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
40
- SeparatorPrimitive.Root,
35
+ var import_script = __toESM(require("next/script"));
36
+ var import_react = require("@tern-secure/react");
37
+ const isDevelopment = process.env.NODE_ENV === "development";
38
+ const localPort = process.env.TERN_UI_PORT || "4000";
39
+ const devDomain = isDevelopment ? `http://localhost:${localPort || process.env.NEXT_PUBLIC_TERN_UI_PORT || "4000"}` : void 0;
40
+ function TernUIScript({
41
+ customDomain,
42
+ proxyUrl,
43
+ version,
44
+ nonce
45
+ }) {
46
+ const effectiveDomain = isDevelopment ? devDomain : customDomain;
47
+ console.log("[TernSecure] TernUIScript: Using effective domain:", effectiveDomain);
48
+ if (!effectiveDomain) {
49
+ console.warn("[TernSecure] TernUIScript: No custom domain or proxy URL provided. The script will not be loaded.");
50
+ return null;
51
+ }
52
+ const scriptOptions = {
53
+ customDomain: effectiveDomain,
54
+ proxyUrl,
55
+ version,
56
+ nonce
57
+ };
58
+ const scriptUrl = (0, import_react.ternUIgetScriptUrl)(scriptOptions);
59
+ const scriptAttributes = (0, import_react.constructScriptAttributes)(scriptOptions);
60
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
61
+ import_script.default,
41
62
  {
42
- ref,
43
- decorative,
44
- orientation,
45
- className: (0, import_utils.cn)(
46
- "shrink-0 bg-border",
47
- orientation === "horizontal" ? "h-px w-full" : "h-full w-px",
48
- className
49
- ),
50
- ...props
63
+ src: scriptUrl,
64
+ "data-ternui-script": true,
65
+ async: true,
66
+ nonce,
67
+ strategy: void 0,
68
+ ...scriptAttributes
51
69
  }
52
- )
53
- );
54
- Separator.displayName = SeparatorPrimitive.Root.displayName;
70
+ );
71
+ }
55
72
  // Annotate the CommonJS export names for ESM import in node:
56
73
  0 && (module.exports = {
57
- Separator
74
+ TernUIScript
58
75
  });
59
- //# sourceMappingURL=separator.js.map
76
+ //# sourceMappingURL=tern-ui-script.js.map
@@ -0,0 +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,8 +1,10 @@
1
- import { verifyTernSessionCookie, createSessionCookie } from "./sessionTernSecure";
2
- import { adminTernSecureAuth, adminTernSecureDb } from "../../utils/admin-init";
1
+ import {
2
+ verifyTernSessionCookie,
3
+ createSessionCookie,
4
+ clearSessionCookie
5
+ } from "@tern-secure/backend";
3
6
  export {
4
- adminTernSecureAuth,
5
- adminTernSecureDb,
7
+ clearSessionCookie,
6
8
  createSessionCookie,
7
9
  verifyTernSessionCookie
8
10
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/app-router/admin/index.ts"],"sourcesContent":["export { verifyTernSessionCookie, createSessionCookie } from './sessionTernSecure'\nexport { adminTernSecureAuth, adminTernSecureDb } from '../../utils/admin-init'"],"mappings":"AAAA,SAAS,yBAAyB,2BAA2B;AAC7D,SAAS,qBAAqB,yBAAyB;","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'"],"mappings":"AAAA;AAAA,EACI;AAAA,EACA;AAAA,EACA;AAAA,OACG;","names":[]}
@@ -19,9 +19,8 @@ async function createSessionCookie(idToken) {
19
19
  }
20
20
  }
21
21
  async function getServerSessionCookie() {
22
- var _a;
23
22
  const cookieStore = await cookies();
24
- const sessionCookie = (_a = cookieStore.get("_session_cookie")) == null ? void 0 : _a.value;
23
+ const sessionCookie = cookieStore.get("_session_cookie")?.value;
25
24
  if (!sessionCookie) {
26
25
  throw new Error("No session cookie found");
27
26
  }
@@ -37,9 +36,8 @@ async function getServerSessionCookie() {
37
36
  }
38
37
  }
39
38
  async function getIdToken() {
40
- var _a;
41
39
  const cookieStore = await cookies();
42
- const token = (_a = cookieStore.get("_session_token")) == null ? void 0 : _a.value;
40
+ const token = cookieStore.get("_session_token")?.value;
43
41
  if (!token) {
44
42
  throw new Error("No session cookie found");
45
43
  }
@@ -109,13 +107,12 @@ async function verifyTernSessionCookie(session) {
109
107
  }
110
108
  }
111
109
  async function clearSessionCookie() {
112
- var _a;
113
110
  const cookieStore = await cookies();
114
111
  cookieStore.delete("_session_cookie");
115
112
  cookieStore.delete("_session_token");
116
113
  cookieStore.delete("_session");
117
114
  try {
118
- const sessionCookie = (_a = cookieStore.get("_session_cookie")) == null ? void 0 : _a.value;
115
+ const sessionCookie = cookieStore.get("_session_cookie")?.value;
119
116
  if (sessionCookie) {
120
117
  const decodedClaims = await adminAuth.verifySessionCookie(sessionCookie);
121
118
  await adminAuth.revokeRefreshTokens(decodedClaims.uid);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/app-router/admin/sessionTernSecure.ts"],"sourcesContent":["'use server'\n\nimport { cookies } from 'next/headers';\nimport { adminTernSecureAuth as adminAuth } from '../../utils/admin-init';\nimport { handleFirebaseAuthError, type AuthErrorResponse } from '../../errors';\n\ninterface FirebaseAuthError extends Error {\n code?: string;\n}\n\nexport interface User {\n uid: string | null;\n email: string | null;\n }\n\nexport interface Session {\n user: User | null;\n token: string | null;\n error: Error | null;\n}\n\ninterface TernVerificationResult extends User {\n valid: boolean\n authTime?: number\n error?: AuthErrorResponse\n}\n\nexport async function createSessionCookie(idToken: string) {\n try {\n const expiresIn = 60 * 60 * 24 * 5 * 1000;\n const sessionCookie = await adminAuth.createSessionCookie(idToken, { expiresIn });\n\n const cookieStore = await cookies();\n cookieStore.set('_session_cookie', sessionCookie, {\n maxAge: expiresIn,\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n path: '/',\n });\n return { success: true, message: 'Session created' };\n } catch (error) {\n return { success: false, message: 'Failed to create session' };\n }\n}\n\n\n\nexport async function getServerSessionCookie() {\n const cookieStore = await cookies();\n const sessionCookie = cookieStore.get('_session_cookie')?.value;\n\n if (!sessionCookie) {\n throw new Error('No session cookie found')\n }\n \n try {\n const decondeClaims = await adminAuth.verifySessionCookie(sessionCookie, true)\n return {\n token: sessionCookie,\n userId: decondeClaims.uid\n }\n } catch (error) {\n console.error('Error verifying session:', error)\n throw new Error('Invalid Session')\n }\n}\n\n\nexport async function getIdToken() {\n const cookieStore = await cookies();\n const token = cookieStore.get('_session_token')?.value;\n\n if (!token) {\n throw new Error('No session cookie found')\n }\n \n try {\n const decodedClaims = await adminAuth.verifyIdToken(token)\n return {\n token: token,\n userId: decodedClaims.uid\n }\n } catch (error) {\n console.error('Error verifying session:', error)\n throw new Error('Invalid Session')\n }\n}\n\nexport async function setServerSession(token: string) {\n try {\n const cookieStore = await cookies();\n cookieStore.set('_session_token', token, {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'strict',\n maxAge: 60 * 60, // 1 hour\n path: '/',\n });\n return { success: true, message: 'Session created' };\n } catch {\n return { success: false, message: 'Failed to create session' };\n }\n}\n\n export async function verifyTernIdToken(token: string): Promise<TernVerificationResult> {\n try {\n const decodedToken = await adminAuth.verifyIdToken(token);\n return {\n valid: true,\n uid: decodedToken.uid,\n email: decodedToken.email || null,\n authTime: decodedToken.auth_time\n };\n } catch (error) {\n const errorResponse = handleFirebaseAuthError(error)\n return {\n valid: false,\n uid: null,\n email: null,\n error: errorResponse\n };\n }\n }\n \n\n export async function verifyTernSessionCookie(session: string): Promise<TernVerificationResult>{\n try {\n const res = await adminAuth.verifySessionCookie(session);\n return { \n valid: true, \n uid: res.uid,\n email: res.email || null,\n authTime: res.auth_time\n };\n } catch (error) {\n const errorResponse = handleFirebaseAuthError(error)\n return {\n valid: false, \n uid: null,\n email: null,\n error: errorResponse\n };\n }\n }\n\n\n export async function clearSessionCookie() {\n const cookieStore = await cookies()\n \n cookieStore.delete('_session_cookie')\n cookieStore.delete('_session_token')\n cookieStore.delete('_session')\n \n try {\n // Verify if there's an active session before revoking\n const sessionCookie = cookieStore.get('_session_cookie')?.value\n if (sessionCookie) {\n // Get the decoded claims to get the user's ID\n const decodedClaims = await adminAuth.verifySessionCookie(sessionCookie)\n \n // Revoke all sessions for the user\n await adminAuth.revokeRefreshTokens(decodedClaims.uid)\n }\n \n return { success: true, message: 'Session cleared successfully' }\n } catch (error) {\n console.error('Error clearing session:', error)\n // Still return success even if revoking fails, as cookies are cleared\n return { success: true, message: 'Session cookies cleared' }\n }\n }\n\n\n\n/*\n export async function GET(request: NextRequest) {\n const cookieStore = await cookies();\n const sessionCookie = cookieStore.get('session')?.value\n \n if (!sessionCookie) {\n return NextResponse.json({ isAuthenticated: false }, { status: 401 })\n }\n \n try {\n const decodedClaims = await adminAuth.verifySessionCookie(sessionCookie, true)\n return NextResponse.json({ isAuthenticated: true, user: decodedClaims }, { status: 200 })\n } catch (error) {\n console.error('Error verifying session cookie:', error)\n return NextResponse.json({ isAuthenticated: false }, { status: 401 })\n }\n }\n\n*/"],"mappings":";AAEA,SAAS,eAAe;AACxB,SAAS,uBAAuB,iBAAiB;AACjD,SAAS,+BAAuD;AAuBhE,eAAsB,oBAAoB,SAAiB;AACzD,MAAI;AACF,UAAM,YAAY,KAAK,KAAK,KAAK,IAAI;AACnC,UAAM,gBAAgB,MAAM,UAAU,oBAAoB,SAAS,EAAE,UAAU,CAAC;AAEhF,UAAM,cAAc,MAAM,QAAQ;AAClC,gBAAY,IAAI,mBAAmB,eAAe;AAAA,MAC9C,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,QAAQ,QAAQ,IAAI,aAAa;AAAA,MACjC,MAAM;AAAA,IACV,CAAC;AACD,WAAO,EAAE,SAAS,MAAM,SAAS,kBAAkB;AAAA,EACvD,SAAS,OAAO;AACZ,WAAO,EAAE,SAAS,OAAO,SAAS,2BAA2B;AAAA,EACjE;AACF;AAIA,eAAsB,yBAAyB;AA/C/C;AAgDE,QAAM,cAAc,MAAM,QAAQ;AAClC,QAAM,iBAAgB,iBAAY,IAAI,iBAAiB,MAAjC,mBAAoC;AAE1D,MAAI,CAAC,eAAe;AAClB,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC3C;AAEA,MAAI;AACF,UAAM,gBAAgB,MAAM,UAAU,oBAAoB,eAAe,IAAI;AAC7E,WAAO;AAAA,MACL,OAAO;AAAA,MACP,QAAQ,cAAc;AAAA,IACxB;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,MAAM,4BAA4B,KAAK;AAC/C,UAAM,IAAI,MAAM,iBAAiB;AAAA,EACnC;AACF;AAGA,eAAsB,aAAa;AApEnC;AAqEE,QAAM,cAAc,MAAM,QAAQ;AAClC,QAAM,SAAQ,iBAAY,IAAI,gBAAgB,MAAhC,mBAAmC;AAEjD,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC3C;AAEA,MAAI;AACF,UAAM,gBAAgB,MAAM,UAAU,cAAc,KAAK;AACzD,WAAO;AAAA,MACL;AAAA,MACA,QAAQ,cAAc;AAAA,IACxB;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,MAAM,4BAA4B,KAAK;AAC/C,UAAM,IAAI,MAAM,iBAAiB;AAAA,EACnC;AACF;AAEA,eAAsB,iBAAiB,OAAe;AACpD,MAAI;AACF,UAAM,cAAc,MAAM,QAAQ;AAClC,gBAAY,IAAI,kBAAkB,OAAO;AAAA,MACvC,UAAU;AAAA,MACV,QAAQ,QAAQ,IAAI,aAAa;AAAA,MACjC,UAAU;AAAA,MACV,QAAQ,KAAK;AAAA;AAAA,MACb,MAAM;AAAA,IACR,CAAC;AACD,WAAO,EAAE,SAAS,MAAM,SAAS,kBAAkB;AAAA,EACrD,QAAQ;AACN,WAAO,EAAE,SAAS,OAAO,SAAS,2BAA2B;AAAA,EAC/D;AACF;AAEE,eAAsB,kBAAkB,OAAgD;AACtF,MAAI;AACF,UAAM,eAAe,MAAM,UAAU,cAAc,KAAK;AACxD,WAAO;AAAA,MACL,OAAO;AAAA,MACP,KAAK,aAAa;AAAA,MAClB,OAAO,aAAa,SAAS;AAAA,MAC7B,UAAU,aAAa;AAAA,IACzB;AAAA,EACF,SAAS,OAAO;AACd,UAAM,gBAAgB,wBAAwB,KAAK;AACnD,WAAO;AAAA,MACL,OAAO;AAAA,MACP,KAAK;AAAA,MACL,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AAAA,EACF;AACF;AAGA,eAAsB,wBAAwB,SAAiD;AAC7F,MAAI;AACF,UAAM,MAAM,MAAM,UAAU,oBAAoB,OAAO;AACvD,WAAO;AAAA,MACH,OAAO;AAAA,MACP,KAAK,IAAI;AAAA,MACT,OAAO,IAAI,SAAS;AAAA,MACpB,UAAU,IAAI;AAAA,IAChB;AAAA,EACJ,SAAS,OAAO;AACd,UAAM,gBAAgB,wBAAwB,KAAK;AACnD,WAAO;AAAA,MACL,OAAO;AAAA,MACP,KAAK;AAAA,MACL,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AAAA,EACF;AACF;AAGA,eAAsB,qBAAqB;AAlJ7C;AAmJI,QAAM,cAAc,MAAM,QAAQ;AAElC,cAAY,OAAO,iBAAiB;AACpC,cAAY,OAAO,gBAAgB;AACnC,cAAY,OAAO,UAAU;AAE7B,MAAI;AAEF,UAAM,iBAAgB,iBAAY,IAAI,iBAAiB,MAAjC,mBAAoC;AAC1D,QAAI,eAAe;AAEjB,YAAM,gBAAgB,MAAM,UAAU,oBAAoB,aAAa;AAGvE,YAAM,UAAU,oBAAoB,cAAc,GAAG;AAAA,IACvD;AAEA,WAAO,EAAE,SAAS,MAAM,SAAS,+BAA+B;AAAA,EAClE,SAAS,OAAO;AACd,YAAQ,MAAM,2BAA2B,KAAK;AAE9C,WAAO,EAAE,SAAS,MAAM,SAAS,0BAA0B;AAAA,EAC7D;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../../src/app-router/admin/sessionTernSecure.ts"],"sourcesContent":["'use server'\n\nimport { cookies } from 'next/headers';\nimport { adminTernSecureAuth as adminAuth } from '../../utils/admin-init';\nimport { handleFirebaseAuthError, type AuthErrorResponse } from '../../errors';\n\ninterface FirebaseAuthError extends Error {\n code?: string;\n}\n\nexport interface User {\n uid: string | null;\n email: string | null;\n }\n\nexport interface Session {\n user: User | null;\n token: string | null;\n error: Error | null;\n}\n\ninterface TernVerificationResult extends User {\n valid: boolean\n authTime?: number\n error?: AuthErrorResponse\n}\n\nexport async function createSessionCookie(idToken: string) {\n try {\n const expiresIn = 60 * 60 * 24 * 5 * 1000;\n const sessionCookie = await adminAuth.createSessionCookie(idToken, { expiresIn });\n\n const cookieStore = await cookies();\n cookieStore.set('_session_cookie', sessionCookie, {\n maxAge: expiresIn,\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n path: '/',\n });\n return { success: true, message: 'Session created' };\n } catch (error) {\n return { success: false, message: 'Failed to create session' };\n }\n}\n\n\n\nexport async function getServerSessionCookie() {\n const cookieStore = await cookies();\n const sessionCookie = cookieStore.get('_session_cookie')?.value;\n\n if (!sessionCookie) {\n throw new Error('No session cookie found')\n }\n \n try {\n const decondeClaims = await adminAuth.verifySessionCookie(sessionCookie, true)\n return {\n token: sessionCookie,\n userId: decondeClaims.uid\n }\n } catch (error) {\n console.error('Error verifying session:', error)\n throw new Error('Invalid Session')\n }\n}\n\n\nexport async function getIdToken() {\n const cookieStore = await cookies();\n const token = cookieStore.get('_session_token')?.value;\n\n if (!token) {\n throw new Error('No session cookie found')\n }\n \n try {\n const decodedClaims = await adminAuth.verifyIdToken(token)\n return {\n token: token,\n userId: decodedClaims.uid\n }\n } catch (error) {\n console.error('Error verifying session:', error)\n throw new Error('Invalid Session')\n }\n}\n\nexport async function setServerSession(token: string) {\n try {\n const cookieStore = await cookies();\n cookieStore.set('_session_token', token, {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'strict',\n maxAge: 60 * 60, // 1 hour\n path: '/',\n });\n return { success: true, message: 'Session created' };\n } catch {\n return { success: false, message: 'Failed to create session' };\n }\n}\n\n export async function verifyTernIdToken(token: string): Promise<TernVerificationResult> {\n try {\n const decodedToken = await adminAuth.verifyIdToken(token);\n return {\n valid: true,\n uid: decodedToken.uid,\n email: decodedToken.email || null,\n authTime: decodedToken.auth_time\n };\n } catch (error) {\n const errorResponse = handleFirebaseAuthError(error)\n return {\n valid: false,\n uid: null,\n email: null,\n error: errorResponse\n };\n }\n }\n \n\n export async function verifyTernSessionCookie(session: string): Promise<TernVerificationResult>{\n try {\n const res = await adminAuth.verifySessionCookie(session);\n return { \n valid: true, \n uid: res.uid,\n email: res.email || null,\n authTime: res.auth_time\n };\n } catch (error) {\n const errorResponse = handleFirebaseAuthError(error)\n return {\n valid: false, \n uid: null,\n email: null,\n error: errorResponse\n };\n }\n }\n\n\n export async function clearSessionCookie() {\n const cookieStore = await cookies()\n \n cookieStore.delete('_session_cookie')\n cookieStore.delete('_session_token')\n cookieStore.delete('_session')\n \n try {\n // Verify if there's an active session before revoking\n const sessionCookie = cookieStore.get('_session_cookie')?.value\n if (sessionCookie) {\n // Get the decoded claims to get the user's ID\n const decodedClaims = await adminAuth.verifySessionCookie(sessionCookie)\n \n // Revoke all sessions for the user\n await adminAuth.revokeRefreshTokens(decodedClaims.uid)\n }\n \n return { success: true, message: 'Session cleared successfully' }\n } catch (error) {\n console.error('Error clearing session:', error)\n // Still return success even if revoking fails, as cookies are cleared\n return { success: true, message: 'Session cookies cleared' }\n }\n }\n\n\n\n/*\n export async function GET(request: NextRequest) {\n const cookieStore = await cookies();\n const sessionCookie = cookieStore.get('session')?.value\n \n if (!sessionCookie) {\n return NextResponse.json({ isAuthenticated: false }, { status: 401 })\n }\n \n try {\n const decodedClaims = await adminAuth.verifySessionCookie(sessionCookie, true)\n return NextResponse.json({ isAuthenticated: true, user: decodedClaims }, { status: 200 })\n } catch (error) {\n console.error('Error verifying session cookie:', error)\n return NextResponse.json({ isAuthenticated: false }, { status: 401 })\n }\n }\n\n*/"],"mappings":";AAEA,SAAS,eAAe;AACxB,SAAS,uBAAuB,iBAAiB;AACjD,SAAS,+BAAuD;AAuBhE,eAAsB,oBAAoB,SAAiB;AACzD,MAAI;AACF,UAAM,YAAY,KAAK,KAAK,KAAK,IAAI;AACnC,UAAM,gBAAgB,MAAM,UAAU,oBAAoB,SAAS,EAAE,UAAU,CAAC;AAEhF,UAAM,cAAc,MAAM,QAAQ;AAClC,gBAAY,IAAI,mBAAmB,eAAe;AAAA,MAC9C,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,QAAQ,QAAQ,IAAI,aAAa;AAAA,MACjC,MAAM;AAAA,IACV,CAAC;AACD,WAAO,EAAE,SAAS,MAAM,SAAS,kBAAkB;AAAA,EACvD,SAAS,OAAO;AACZ,WAAO,EAAE,SAAS,OAAO,SAAS,2BAA2B;AAAA,EACjE;AACF;AAIA,eAAsB,yBAAyB;AAC7C,QAAM,cAAc,MAAM,QAAQ;AAClC,QAAM,gBAAgB,YAAY,IAAI,iBAAiB,GAAG;AAE1D,MAAI,CAAC,eAAe;AAClB,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC3C;AAEA,MAAI;AACF,UAAM,gBAAgB,MAAM,UAAU,oBAAoB,eAAe,IAAI;AAC7E,WAAO;AAAA,MACL,OAAO;AAAA,MACP,QAAQ,cAAc;AAAA,IACxB;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,MAAM,4BAA4B,KAAK;AAC/C,UAAM,IAAI,MAAM,iBAAiB;AAAA,EACnC;AACF;AAGA,eAAsB,aAAa;AACjC,QAAM,cAAc,MAAM,QAAQ;AAClC,QAAM,QAAQ,YAAY,IAAI,gBAAgB,GAAG;AAEjD,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC3C;AAEA,MAAI;AACF,UAAM,gBAAgB,MAAM,UAAU,cAAc,KAAK;AACzD,WAAO;AAAA,MACL;AAAA,MACA,QAAQ,cAAc;AAAA,IACxB;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,MAAM,4BAA4B,KAAK;AAC/C,UAAM,IAAI,MAAM,iBAAiB;AAAA,EACnC;AACF;AAEA,eAAsB,iBAAiB,OAAe;AACpD,MAAI;AACF,UAAM,cAAc,MAAM,QAAQ;AAClC,gBAAY,IAAI,kBAAkB,OAAO;AAAA,MACvC,UAAU;AAAA,MACV,QAAQ,QAAQ,IAAI,aAAa;AAAA,MACjC,UAAU;AAAA,MACV,QAAQ,KAAK;AAAA;AAAA,MACb,MAAM;AAAA,IACR,CAAC;AACD,WAAO,EAAE,SAAS,MAAM,SAAS,kBAAkB;AAAA,EACrD,QAAQ;AACN,WAAO,EAAE,SAAS,OAAO,SAAS,2BAA2B;AAAA,EAC/D;AACF;AAEE,eAAsB,kBAAkB,OAAgD;AACtF,MAAI;AACF,UAAM,eAAe,MAAM,UAAU,cAAc,KAAK;AACxD,WAAO;AAAA,MACL,OAAO;AAAA,MACP,KAAK,aAAa;AAAA,MAClB,OAAO,aAAa,SAAS;AAAA,MAC7B,UAAU,aAAa;AAAA,IACzB;AAAA,EACF,SAAS,OAAO;AACd,UAAM,gBAAgB,wBAAwB,KAAK;AACnD,WAAO;AAAA,MACL,OAAO;AAAA,MACP,KAAK;AAAA,MACL,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AAAA,EACF;AACF;AAGA,eAAsB,wBAAwB,SAAiD;AAC7F,MAAI;AACF,UAAM,MAAM,MAAM,UAAU,oBAAoB,OAAO;AACvD,WAAO;AAAA,MACH,OAAO;AAAA,MACP,KAAK,IAAI;AAAA,MACT,OAAO,IAAI,SAAS;AAAA,MACpB,UAAU,IAAI;AAAA,IAChB;AAAA,EACJ,SAAS,OAAO;AACd,UAAM,gBAAgB,wBAAwB,KAAK;AACnD,WAAO;AAAA,MACL,OAAO;AAAA,MACP,KAAK;AAAA,MACL,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AAAA,EACF;AACF;AAGA,eAAsB,qBAAqB;AACzC,QAAM,cAAc,MAAM,QAAQ;AAElC,cAAY,OAAO,iBAAiB;AACpC,cAAY,OAAO,gBAAgB;AACnC,cAAY,OAAO,UAAU;AAE7B,MAAI;AAEF,UAAM,gBAAgB,YAAY,IAAI,iBAAiB,GAAG;AAC1D,QAAI,eAAe;AAEjB,YAAM,gBAAgB,MAAM,UAAU,oBAAoB,aAAa;AAGvE,YAAM,UAAU,oBAAoB,cAAc,GAAG;AAAA,IACvD;AAEA,WAAO,EAAE,SAAS,MAAM,SAAS,+BAA+B;AAAA,EAClE,SAAS,OAAO;AACd,YAAQ,MAAM,2BAA2B,KAAK;AAE9C,WAAO,EAAE,SAAS,MAAM,SAAS,0BAA0B;AAAA,EAC7D;AACF;","names":[]}
@@ -1,22 +1,16 @@
1
- import { jsx } from "react/jsx-runtime";
2
- import { TernSecureClientProvider } from "../../boundary/TernSecureClientProvider";
3
- async function TernSecureProvider({
4
- children,
5
- requiresVerification = true,
6
- loginPath,
7
- signUpPath,
8
- loadingComponent
9
- }) {
10
- return /* @__PURE__ */ jsx(
11
- TernSecureClientProvider,
12
- {
13
- requiresVerification,
14
- loginPath,
15
- signUpPath,
16
- loadingComponent,
17
- children
18
- }
19
- );
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import {
3
+ TernSecureProvider as TernSecureReactProvider
4
+ } from "@tern-secure/react";
5
+ import { allNextProviderPropsWithEnv } from "../../utils/allNextProviderProps";
6
+ import { TernUIScript } from "../../utils/tern-ui-script";
7
+ function TernSecureProvider(props) {
8
+ const { children, ...nextProps } = props;
9
+ const providerProps = allNextProviderPropsWithEnv(nextProps);
10
+ return /* @__PURE__ */ jsxs(TernSecureReactProvider, { ...providerProps, children: [
11
+ /* @__PURE__ */ jsx(TernUIScript, {}),
12
+ children
13
+ ] });
20
14
  }
21
15
  export {
22
16
  TernSecureProvider
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/app-router/client/TernSecureProvider.tsx"],"sourcesContent":["import React from \"react\"\nimport { TernSecureClientProvider } from \"../../boundary/TernSecureClientProvider\"\n\n\n/**\n * Configuration options for TernSecure authentication\n */\nexport interface TernSecureConfig {\n /** Whether email verification is required (defaults to true) */\n requiresVerification?: boolean\n /** Custom path for login page (defaults to /sign-in) */\n loginPath?: string\n /** Custom path for signup page (defaults to /sign-up) */\n signUpPath?: string\n /** Custom loading component */\n loadingComponent?: React.ReactNode\n}\n\n// Loading fallback component\n/*function TernSecureLoadingFallback() {\n return (\n <div>\n <span className=\"sr-only\">Loading...</span>\n </div>\n )\n}*/\n/**\n * Root Provider for TernSecure\n * Use this in your Next.js App Router root layout\n * Automatically handles client/server boundary and authentication state\n * \n * @example\n * /// app/layout.tsx\n * import { TernSecureProvider } from '@tern/secure'\n * \n * export default function RootLayout({ children }) {\n * return (\n * <html>\n * <body>\n * <TernSecureProvider>\n * {children}\n * </TernSecureProvider>\n * </body>\n * </html>\n * )\n * }\n */\nexport async function TernSecureProvider({ \n children,\n requiresVerification = true,\n loginPath,\n signUpPath,\n loadingComponent,\n }: React.PropsWithChildren<TernSecureConfig>) {\n return (\n <TernSecureClientProvider\n requiresVerification={requiresVerification}\n loginPath={loginPath}\n signUpPath={signUpPath}\n loadingComponent={loadingComponent}\n >\n {children}\n </TernSecureClientProvider>\n )\n}"],"mappings":"AAuDI;AAtDJ,SAAS,gCAAgC;AA8CzC,eAAsB,mBAAmB;AAAA,EACvC;AAAA,EACA,uBAAuB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AACD,GAA8C;AAC7C,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MAEG;AAAA;AAAA,EACL;AAEJ;","names":[]}
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":"AA2CI,SACE,KADF;AA1CJ;AAAA,EACE,sBAAsB;AAAA,OACjB;AAEP,SAAS,mCAAmC;AAC5C,SAAS,oBAAoB;AAiCtB,SAAS,mBAAmB,OAAqD;AACtF,QAAM,EAAC,UAAU,GAAG,UAAU,IAAI;AAClC,QAAM,gBAAgB,4BAA4B,SAAS;AAC3D,SACE,qBAAC,2BAAyB,GAAG,eAC3B;AAAA,wBAAC,gBAAa;AAAA,IACX;AAAA,KACL;AAEJ;","names":[]}