@tern-secure/nextjs 3.1.62 → 3.1.64

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 (40) hide show
  1. package/dist/cjs/app-router/client/TernSecureProvider.cjs +4 -2
  2. package/dist/cjs/app-router/client/TernSecureProvider.cjs.map +1 -1
  3. package/dist/cjs/app-router/server/TernSecureServerProvider.cjs +69 -105
  4. package/dist/cjs/app-router/server/TernSecureServerProvider.cjs.map +1 -1
  5. package/dist/cjs/boundary/TernSecureCtx.cjs +1 -1
  6. package/dist/cjs/boundary/TernSecureCtx.cjs.map +1 -1
  7. package/dist/cjs/boundary/hooks/{use-auth.cjs → useAuth.cjs} +24 -26
  8. package/dist/cjs/boundary/hooks/useAuth.cjs.map +1 -0
  9. package/dist/cjs/index.cjs +93 -138
  10. package/dist/cjs/index.cjs.map +1 -1
  11. package/dist/esm/app-router/client/TernSecureProvider.d.ts +8 -1
  12. package/dist/esm/app-router/client/TernSecureProvider.js +3 -38
  13. package/dist/esm/app-router/client/TernSecureProvider.js.map +1 -1
  14. package/dist/esm/app-router/server/TernSecureServerProvider.d.ts +19 -3
  15. package/dist/esm/app-router/server/TernSecureServerProvider.js +5 -1
  16. package/dist/esm/boundary/TernSecureCtx.js +1 -1
  17. package/dist/esm/boundary/hooks/useAuth.d.ts +7 -0
  18. package/dist/esm/boundary/hooks/useAuth.js +7 -0
  19. package/dist/esm/boundary/hooks/useAuth.js.map +1 -0
  20. package/dist/esm/{chunk-RAZTKM22.js → chunk-LSHP5OGU.js} +3 -3
  21. package/dist/esm/chunk-LSHP5OGU.js.map +1 -0
  22. package/dist/esm/chunk-PY4JT34Z.js +21 -0
  23. package/dist/esm/chunk-PY4JT34Z.js.map +1 -0
  24. package/dist/esm/chunk-XXTEVPIU.js +24 -0
  25. package/dist/esm/chunk-XXTEVPIU.js.map +1 -0
  26. package/dist/esm/chunk-ZLZQ7LBR.js +41 -0
  27. package/dist/esm/chunk-ZLZQ7LBR.js.map +1 -0
  28. package/dist/esm/index.d.ts +2 -1
  29. package/dist/esm/index.js +4 -3
  30. package/dist/esm/index.js.map +1 -1
  31. package/package.json +1 -1
  32. package/dist/cjs/boundary/hooks/use-auth.cjs.map +0 -1
  33. package/dist/esm/boundary/hooks/use-auth.d.ts +0 -14
  34. package/dist/esm/boundary/hooks/use-auth.js +0 -6
  35. package/dist/esm/boundary/hooks/use-auth.js.map +0 -1
  36. package/dist/esm/chunk-D4W62QPB.js +0 -24
  37. package/dist/esm/chunk-D4W62QPB.js.map +0 -1
  38. package/dist/esm/chunk-RAZTKM22.js.map +0 -1
  39. package/dist/esm/chunk-WRPJTYEG.js +0 -23
  40. package/dist/esm/chunk-WRPJTYEG.js.map +0 -1
@@ -62,13 +62,14 @@ auth$1.setPersistence(auth, auth$1.browserSessionPersistence);
62
62
  firestore.getFirestore(clientApp);
63
63
  storage.getStorage(clientApp);
64
64
  var TernSecureAuth = () => auth;
65
- var TernSecureContext = React__default.default.createContext(null);
65
+ var TernSecureContext = React__default.default.createContext(void 0);
66
66
  TernSecureContext.displayName = "TernSecureContext";
67
67
  var TernSecureCtxProvider = ({
68
68
  children
69
69
  }) => {
70
70
  return /* @__PURE__ */ jsxRuntime.jsx(TernSecureContext.Provider, { value: { dynamic: true }, children });
71
71
  };
72
+ var AuthStateContext = React__default.default.createContext(null);
72
73
  var auth2 = TernSecureAuth();
73
74
  function TernSecureClientProvider({ children }) {
74
75
  const [authState, setAuthState] = React.useState({
@@ -97,9 +98,10 @@ function TernSecureClientProvider({ children }) {
97
98
  });
98
99
  return () => unsubscribe();
99
100
  }, []);
100
- return /* @__PURE__ */ jsxRuntime.jsx(TernSecureCtxProvider, { options: authState, children });
101
+ return /* @__PURE__ */ jsxRuntime.jsx(TernSecureCtxProvider, { children: /* @__PURE__ */ jsxRuntime.jsx(AuthStateContext.Provider, { value: authState, children }) });
101
102
  }
102
103
 
104
+ exports.AuthStateContext = AuthStateContext;
103
105
  exports.TernSecureClientProvider = TernSecureClientProvider;
104
106
  //# sourceMappingURL=TernSecureProvider.cjs.map
105
107
  //# sourceMappingURL=TernSecureProvider.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/utils/config.ts","../../../../src/utils/client-init.ts","../../../../src/boundary/TernSecureCtx.tsx","../../../../src/app-router/client/TernSecureProvider.tsx"],"names":["config","initializeApp","getAuth","setPersistence","browserSessionPersistence","getFirestore","getStorage","React","jsx","auth","useState","useEffect","onAuthStateChanged"],"mappings":"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","file":"TernSecureProvider.cjs","sourcesContent":["import { TernSecureConfig, ConfigValidationResult } from '../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}","import { initializeApp } from 'firebase/app';\r\nimport { getAuth, setPersistence, browserSessionPersistence } from 'firebase/auth';\r\nimport { getFirestore } from 'firebase/firestore';\r\nimport { getStorage } from 'firebase/storage';\r\nimport { initializeConfig} from './config';\r\n\r\n// Initialize immediately\r\nconst config = initializeConfig();\r\nconst clientApp = initializeApp(config)\r\nconst auth = getAuth(clientApp);\r\nsetPersistence(auth, browserSessionPersistence); //to change later user should be able to choose persistance\r\nconst firestore = getFirestore(clientApp);\r\nconst storage = getStorage(clientApp);\r\n\r\nexport const TernSecureAuth = () => auth;\r\nexport const TernSecureFirestore = () => firestore;\r\nexport const TernSecureStorage = () => storage;","'use client'\r\n\r\nimport React from 'react'\r\n\r\n// Core types\r\nexport type TernSecureCtxValue = {\r\n dynamic: boolean\r\n}\r\n\r\nexport type TernSecureProviderProps = React.PropsWithChildren<{\r\n options?: unknown // Made optional since we're not using it\r\n}>\r\n\r\n// Context with proper null handling\r\nconst TernSecureContext = React.createContext<TernSecureCtxValue | null>(null)\r\n\r\n// Set display name for better debugging\r\nTernSecureContext.displayName = 'TernSecureContext'\r\n\r\nconst useInternalContext = (hookname: string = 'useInternalContext') => {\r\n\r\n const context = React.useContext(TernSecureContext)\r\n \r\n if (!context) {\r\n throw new Error(\r\n `${hookname} must be used within TernSecureClientProvider`\r\n )\r\n }\r\n\r\n return context\r\n}\r\n\r\n/**\r\n * Provider component for TernSecure\r\n * Must be used in client components only\r\n */\r\nconst TernSecureCtxProvider: React.FC<TernSecureProviderProps> = ({ \r\n children \r\n}) => {\r\n\r\n return (\r\n <TernSecureContext.Provider value={{ dynamic: true }}>\r\n {children}\r\n </TernSecureContext.Provider>\r\n )\r\n}\r\n\r\nexport {\r\n useInternalContext,\r\n TernSecureCtxProvider\r\n}","'use client'\r\n\r\nimport React, { useState, useEffect } from 'react'\r\nimport { TernSecureAuth } from '../../utils/client-init'\r\nimport { onAuthStateChanged } from \"firebase/auth\"\r\nimport { useInternalContext, TernSecureCtxProvider } from '../../boundary/TernSecureCtx'\r\n\r\ntype TernSecureState = {\r\n userId: string | null\r\n loading: boolean\r\n error: string | null\r\n isSignedIn: boolean\r\n}\r\n\r\nexport interface TernSecureClientProps {\r\n children: React.ReactNode\r\n}\r\n\r\nconst auth = TernSecureAuth()\r\n\r\nexport function TernSecureClientProvider({ children }: TernSecureClientProps) {\r\n const [authState, setAuthState] = useState<TernSecureState>({\r\n loading: true,\r\n isSignedIn: false,\r\n userId: null,\r\n error: null\r\n })\r\nuseEffect(() => {\r\n const unsubscribe = onAuthStateChanged(auth, (user) => {\r\n if (user) {\r\n setAuthState({\r\n loading: false,\r\n isSignedIn: true,\r\n userId: user.uid,\r\n error: null\r\n })\r\n } else {\r\n setAuthState({\r\n loading: false,\r\n isSignedIn: false,\r\n userId: null,\r\n error: null\r\n })\r\n }\r\n })\r\n \r\n return () => unsubscribe()\r\n }, [])\r\n\r\n\r\n return (\r\n <TernSecureCtxProvider options={authState}>\r\n {children}\r\n </TernSecureCtxProvider>\r\n )\r\n}"]}
1
+ {"version":3,"sources":["../../../../src/utils/config.ts","../../../../src/utils/client-init.ts","../../../../src/boundary/TernSecureCtx.tsx","../../../../src/app-router/client/TernSecureProvider.tsx"],"names":["config","initializeApp","getAuth","setPersistence","browserSessionPersistence","getFirestore","getStorage","React","jsx","auth","useState","useEffect","onAuthStateChanged"],"mappings":";;;;;;;;;;;;;;AAMO,IAAM,iBAAiB,OAAyB;AAAA,EACrD,MAAA,EAAQ,OAAQ,CAAA,GAAA,CAAI,4BAAgC,IAAA,EAAA;AAAA,EACpD,UAAA,EAAY,OAAQ,CAAA,GAAA,CAAI,gCAAoC,IAAA,EAAA;AAAA,EAC5D,SAAA,EAAW,OAAQ,CAAA,GAAA,CAAI,+BAAmC,IAAA,EAAA;AAAA,EAC1D,aAAA,EAAe,OAAQ,CAAA,GAAA,CAAI,mCAAuC,IAAA,EAAA;AAAA,EAClE,iBAAA,EAAmB,OAAQ,CAAA,GAAA,CAAI,wCAA4C,IAAA,EAAA;AAAA,EAC3E,KAAA,EAAO,OAAQ,CAAA,GAAA,CAAI,2BAA+B,IAAA,EAAA;AAAA,EAClD,aAAA,EAAe,OAAQ,CAAA,GAAA,CAAI,mCAAuC,IAAA,KAAA;AACpE,CAAA,CAAA;AAQO,IAAM,cAAA,GAAiB,CAACA,OAAqD,KAAA;AAClF,EAAA,MAAM,cAA6C,GAAA;AAAA,IACjD,QAAA;AAAA,IACA,YAAA;AAAA,IACA,WAAA;AAAA,IACA,eAAA;AAAA,IACA,mBAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,SAAmB,EAAC;AAE1B,EAAA,cAAA,CAAe,QAAQ,CAAS,KAAA,KAAA;AAC9B,IAAI,IAAA,CAACA,OAAO,CAAA,KAAK,CAAG,EAAA;AAClB,MAAA,MAAA,CAAO,KAAK,CAAgD,6CAAA,EAAA,MAAA,CAAO,KAAK,CAAE,CAAA,WAAA,EAAa,CAAE,CAAA,CAAA;AAAA;AAC3F,GACD,CAAA;AAED,EAAO,OAAA;AAAA,IACL,OAAA,EAAS,OAAO,MAAW,KAAA,CAAA;AAAA,IAC3B,MAAA;AAAA,IACA,MAAAA,EAAAA;AAAA,GACF;AACF,CAAA;AAMO,IAAM,mBAAmB,MAAwB;AACtD,EAAA,MAAMA,UAAS,cAAe,EAAA;AAC9B,EAAM,MAAA,gBAAA,GAAmB,eAAeA,OAAM,CAAA;AAE9C,EAAI,IAAA,CAAC,iBAAiB,OAAS,EAAA;AAC7B,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA;AAAA,EAA8C,gBAAiB,CAAA,MAAA,CAAO,IAAK,CAAA,IAAI,CAAC,CAAA;AAAA,KAClF;AAAA;AAGF,EAAOA,OAAAA,OAAAA;AACT,CAAA;;;ACvDA,IAAM,SAAS,gBAAiB,EAAA;AAChC,IAAM,SAAA,GAAYC,kBAAc,MAAM,CAAA;AACtC,IAAM,IAAA,GAAOC,eAAQ,SAAS,CAAA;AAC9BC,qBAAA,CAAe,MAAMC,gCAAyB,CAAA;AAC5BC,uBAAa,SAAS;AACxBC,mBAAW,SAAS;AAE7B,IAAM,iBAAiB,MAAM,IAAA;ACApC,IAAM,iBAAA,GAAoBC,sBAAM,CAAA,aAAA,CAA8C,KAAS,CAAA,CAAA;AAGvF,iBAAA,CAAkB,WAAc,GAAA,mBAAA;AAmBhC,IAAM,wBAA2D,CAAC;AAAA,EAChE;AACF,CAAM,KAAA;AAEJ,EACE,uBAAAC,cAAA,CAAC,kBAAkB,QAAlB,EAAA,EAA2B,OAAO,EAAE,OAAA,EAAS,IAAK,EAAA,EAChD,QACH,EAAA,CAAA;AAEJ,CAAA;AC/Ba,IAAA,gBAAA,GAAmBD,sBAAM,CAAA,aAAA,CAAsC,IAAI;AAMhF,IAAME,QAAO,cAAe,EAAA;AAErB,SAAS,wBAAA,CAAyB,EAAE,QAAA,EAAmC,EAAA;AAC5E,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIC,cAA0B,CAAA;AAAA,IAC1D,OAAS,EAAA,IAAA;AAAA,IACT,UAAY,EAAA,KAAA;AAAA,IACZ,MAAQ,EAAA,IAAA;AAAA,IACR,KAAO,EAAA;AAAA,GACR,CAAA;AACH,EAAAC,eAAA,CAAU,MAAM;AACZ,IAAA,MAAM,WAAc,GAAAC,yBAAA,CAAmBH,KAAM,EAAA,CAAC,IAAS,KAAA;AACrD,MAAA,IAAI,IAAM,EAAA;AACR,QAAa,YAAA,CAAA;AAAA,UACX,OAAS,EAAA,KAAA;AAAA,UACT,UAAY,EAAA,IAAA;AAAA,UACZ,QAAQ,IAAK,CAAA,GAAA;AAAA,UACb,KAAO,EAAA;AAAA,SACR,CAAA;AAAA,OACI,MAAA;AACL,QAAa,YAAA,CAAA;AAAA,UACX,OAAS,EAAA,KAAA;AAAA,UACT,UAAY,EAAA,KAAA;AAAA,UACZ,MAAQ,EAAA,IAAA;AAAA,UACR,KAAO,EAAA;AAAA,SACR,CAAA;AAAA;AACH,KACD,CAAA;AAED,IAAA,OAAO,MAAM,WAAY,EAAA;AAAA,GAC3B,EAAG,EAAE,CAAA;AAGL,EACE,uBAAAD,cAAC,CAAA,qBAAA,EAAA,EACC,QAAAA,kBAAAA,cAAAA,CAAC,gBAAiB,CAAA,QAAA,EAAjB,EAA0B,KAAA,EAAO,SACjC,EAAA,QAAA,EACD,CACF,EAAA,CAAA;AAEJ","file":"TernSecureProvider.cjs","sourcesContent":["import { TernSecureConfig, ConfigValidationResult } from '../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}","import { initializeApp } from 'firebase/app';\r\nimport { getAuth, setPersistence, browserSessionPersistence } from 'firebase/auth';\r\nimport { getFirestore } from 'firebase/firestore';\r\nimport { getStorage } from 'firebase/storage';\r\nimport { initializeConfig} from './config';\r\n\r\n// Initialize immediately\r\nconst config = initializeConfig();\r\nconst clientApp = initializeApp(config)\r\nconst auth = getAuth(clientApp);\r\nsetPersistence(auth, browserSessionPersistence); //to change later user should be able to choose persistance\r\nconst firestore = getFirestore(clientApp);\r\nconst storage = getStorage(clientApp);\r\n\r\nexport const TernSecureAuth = () => auth;\r\nexport const TernSecureFirestore = () => firestore;\r\nexport const TernSecureStorage = () => storage;","'use client'\r\n\r\nimport React from 'react'\r\n\r\n// Core types\r\nexport type TernSecureCtxValue = {\r\n dynamic: boolean\r\n}\r\n\r\nexport type TernSecureProviderProps = React.PropsWithChildren<{\r\n options?: unknown // Made optional since we're not using it\r\n}>\r\n\r\n// Context with proper null handling\r\nconst TernSecureContext = React.createContext<TernSecureCtxValue | undefined>(undefined)\r\n\r\n// Set display name for better debugging\r\nTernSecureContext.displayName = 'TernSecureContext'\r\n\r\nconst useInternalContext = (hookname: string = 'useInternalContext') => {\r\n\r\n const context = React.useContext(TernSecureContext)\r\n \r\n if (!context) {\r\n throw new Error(\r\n `${hookname} must be used within TernSecureClientProvider`\r\n )\r\n }\r\n\r\n return context\r\n}\r\n\r\n/**\r\n * Provider component for TernSecure\r\n * Must be used in client components only\r\n */\r\nconst TernSecureCtxProvider: React.FC<TernSecureProviderProps> = ({ \r\n children \r\n}) => {\r\n\r\n return (\r\n <TernSecureContext.Provider value={{ dynamic: true }}>\r\n {children}\r\n </TernSecureContext.Provider>\r\n )\r\n}\r\n\r\nexport {\r\n useInternalContext,\r\n TernSecureCtxProvider\r\n}","'use client'\r\n\r\nimport React, { useState, useEffect } from 'react'\r\nimport { TernSecureAuth } from '../../utils/client-init'\r\nimport { onAuthStateChanged } from \"firebase/auth\"\r\nimport { useInternalContext, TernSecureCtxProvider } from '../../boundary/TernSecureCtx'\r\n\r\nexport type TernSecureState = {\r\n userId: string | null\r\n loading: boolean\r\n error: string | null\r\n isSignedIn: boolean\r\n}\r\n\r\nexport const AuthStateContext = React.createContext<TernSecureState | null>(null)\r\n\r\ninterface TernSecureClientProps {\r\n children: React.ReactNode\r\n}\r\n\r\nconst auth = TernSecureAuth();\r\n\r\nexport function TernSecureClientProvider({ children }: TernSecureClientProps) {\r\n const [authState, setAuthState] = useState<TernSecureState>({\r\n loading: true,\r\n isSignedIn: false,\r\n userId: null,\r\n error: null\r\n })\r\nuseEffect(() => {\r\n const unsubscribe = onAuthStateChanged(auth, (user) => {\r\n if (user) {\r\n setAuthState({\r\n loading: false,\r\n isSignedIn: true,\r\n userId: user.uid,\r\n error: null\r\n })\r\n } else {\r\n setAuthState({\r\n loading: false,\r\n isSignedIn: false,\r\n userId: null,\r\n error: null\r\n })\r\n }\r\n })\r\n \r\n return () => unsubscribe()\r\n }, [])\r\n\r\n\r\n return (\r\n <TernSecureCtxProvider>\r\n <AuthStateContext.Provider value={authState}>\r\n {children}\r\n </AuthStateContext.Provider>\r\n </TernSecureCtxProvider>\r\n )\r\n}\r\n\r\nexport type { TernSecureClientProps }"]}
@@ -1,107 +1,78 @@
1
1
  'use strict';
2
2
 
3
+ var React = require('react');
3
4
  var app = require('firebase/app');
4
5
  var auth$1 = require('firebase/auth');
5
6
  var firestore = require('firebase/firestore');
6
7
  var storage = require('firebase/storage');
7
- var React = require('react');
8
8
  var jsxRuntime = require('react/jsx-runtime');
9
- var dynamic = require('next/dynamic');
10
9
 
11
10
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
12
11
 
13
12
  var React__default = /*#__PURE__*/_interopDefault(React);
14
- var dynamic__default = /*#__PURE__*/_interopDefault(dynamic);
15
13
 
16
- var __defProp = Object.defineProperty;
17
- var __getOwnPropNames = Object.getOwnPropertyNames;
18
- var __esm = (fn, res) => function __init() {
19
- return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
20
- };
21
- var __export = (target, all) => {
22
- for (var name in all)
23
- __defProp(target, name, { get: all[name], enumerable: true });
24
- };
14
+ // src/app-router/server/TernSecureServerProvider.tsx
25
15
 
26
16
  // src/utils/config.ts
27
- var loadFireConfig, validateConfig, initializeConfig;
28
- var init_config = __esm({
29
- "src/utils/config.ts"() {
30
- loadFireConfig = () => ({
31
- apiKey: process.env.NEXT_PUBLIC_FIREBASE_API_KEY || "",
32
- authDomain: process.env.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN || "",
33
- projectId: process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID || "",
34
- storageBucket: process.env.NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET || "",
35
- messagingSenderId: process.env.NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID || "",
36
- appId: process.env.NEXT_PUBLIC_FIREBASE_APP_ID || "",
37
- measurementId: process.env.NEXT_PUBLIC_FIREBASE_MEASUREMENT_ID || void 0
38
- });
39
- validateConfig = (config2) => {
40
- const requiredFields = [
41
- "apiKey",
42
- "authDomain",
43
- "projectId",
44
- "storageBucket",
45
- "messagingSenderId",
46
- "appId"
47
- ];
48
- const errors = [];
49
- requiredFields.forEach((field) => {
50
- if (!config2[field]) {
51
- errors.push(`Missing required field: NEXT_PUBLIC_FIREBASE_${String(field).toUpperCase()}`);
52
- }
53
- });
54
- return {
55
- isValid: errors.length === 0,
56
- errors,
57
- config: config2
58
- };
59
- };
60
- initializeConfig = () => {
61
- const config2 = loadFireConfig();
62
- const validationResult = validateConfig(config2);
63
- if (!validationResult.isValid) {
64
- throw new Error(
65
- `Firebase configuration validation failed:
66
- ${validationResult.errors.join("\n")}`
67
- );
68
- }
69
- return config2;
70
- };
71
- }
17
+ var loadFireConfig = () => ({
18
+ apiKey: process.env.NEXT_PUBLIC_FIREBASE_API_KEY || "",
19
+ authDomain: process.env.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN || "",
20
+ projectId: process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID || "",
21
+ storageBucket: process.env.NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET || "",
22
+ messagingSenderId: process.env.NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID || "",
23
+ appId: process.env.NEXT_PUBLIC_FIREBASE_APP_ID || "",
24
+ measurementId: process.env.NEXT_PUBLIC_FIREBASE_MEASUREMENT_ID || void 0
72
25
  });
73
- var config, clientApp, auth, TernSecureAuth;
74
- var init_client_init = __esm({
75
- "src/utils/client-init.ts"() {
76
- init_config();
77
- config = initializeConfig();
78
- clientApp = app.initializeApp(config);
79
- auth = auth$1.getAuth(clientApp);
80
- auth$1.setPersistence(auth, auth$1.browserSessionPersistence);
81
- firestore.getFirestore(clientApp);
82
- storage.getStorage(clientApp);
83
- TernSecureAuth = () => auth;
84
- }
85
- });
86
- var TernSecureContext, TernSecureCtxProvider;
87
- var init_TernSecureCtx = __esm({
88
- "src/boundary/TernSecureCtx.tsx"() {
89
- "use client";
90
- TernSecureContext = React__default.default.createContext(null);
91
- TernSecureContext.displayName = "TernSecureContext";
92
- TernSecureCtxProvider = ({
93
- children
94
- }) => {
95
- return /* @__PURE__ */ jsxRuntime.jsx(TernSecureContext.Provider, { value: { dynamic: true }, children });
96
- };
26
+ var validateConfig = (config2) => {
27
+ const requiredFields = [
28
+ "apiKey",
29
+ "authDomain",
30
+ "projectId",
31
+ "storageBucket",
32
+ "messagingSenderId",
33
+ "appId"
34
+ ];
35
+ const errors = [];
36
+ requiredFields.forEach((field) => {
37
+ if (!config2[field]) {
38
+ errors.push(`Missing required field: NEXT_PUBLIC_FIREBASE_${String(field).toUpperCase()}`);
39
+ }
40
+ });
41
+ return {
42
+ isValid: errors.length === 0,
43
+ errors,
44
+ config: config2
45
+ };
46
+ };
47
+ var initializeConfig = () => {
48
+ const config2 = loadFireConfig();
49
+ const validationResult = validateConfig(config2);
50
+ if (!validationResult.isValid) {
51
+ throw new Error(
52
+ `Firebase configuration validation failed:
53
+ ${validationResult.errors.join("\n")}`
54
+ );
97
55
  }
98
- });
56
+ return config2;
57
+ };
99
58
 
100
- // src/app-router/client/TernSecureProvider.tsx
101
- var TernSecureProvider_exports = {};
102
- __export(TernSecureProvider_exports, {
103
- TernSecureClientProvider: () => TernSecureClientProvider
104
- });
59
+ // src/utils/client-init.ts
60
+ var config = initializeConfig();
61
+ var clientApp = app.initializeApp(config);
62
+ var auth = auth$1.getAuth(clientApp);
63
+ auth$1.setPersistence(auth, auth$1.browserSessionPersistence);
64
+ firestore.getFirestore(clientApp);
65
+ storage.getStorage(clientApp);
66
+ var TernSecureAuth = () => auth;
67
+ var TernSecureContext = React__default.default.createContext(void 0);
68
+ TernSecureContext.displayName = "TernSecureContext";
69
+ var TernSecureCtxProvider = ({
70
+ children
71
+ }) => {
72
+ return /* @__PURE__ */ jsxRuntime.jsx(TernSecureContext.Provider, { value: { dynamic: true }, children });
73
+ };
74
+ var AuthStateContext = React__default.default.createContext(null);
75
+ var auth2 = TernSecureAuth();
105
76
  function TernSecureClientProvider({ children }) {
106
77
  const [authState, setAuthState] = React.useState({
107
78
  loading: true,
@@ -129,30 +100,23 @@ function TernSecureClientProvider({ children }) {
129
100
  });
130
101
  return () => unsubscribe();
131
102
  }, []);
132
- return /* @__PURE__ */ jsxRuntime.jsx(TernSecureCtxProvider, { options: authState, children });
103
+ return /* @__PURE__ */ jsxRuntime.jsx(TernSecureCtxProvider, { children: /* @__PURE__ */ jsxRuntime.jsx(AuthStateContext.Provider, { value: authState, children }) });
133
104
  }
134
- var auth2;
135
- var init_TernSecureProvider = __esm({
136
- "src/app-router/client/TernSecureProvider.tsx"() {
137
- "use client";
138
- init_client_init();
139
- init_TernSecureCtx();
140
- auth2 = TernSecureAuth();
141
- }
142
- });
143
- var TernSecureClientProvider2 = dynamic__default.default(
144
- () => Promise.resolve().then(() => (init_TernSecureProvider(), TernSecureProvider_exports)).then((mod) => mod.TernSecureClientProvider),
145
- {
146
- loading: () => /* @__PURE__ */ jsxRuntime.jsx(TernSecureLoadingFallback, {})
147
- }
148
- );
149
105
  function TernSecureLoadingFallback() {
150
- return /* @__PURE__ */ jsxRuntime.jsx("div", { "aria-label": "Loading authentication", role: "status", children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: "Loading authentication..." }) });
106
+ return /* @__PURE__ */ jsxRuntime.jsx(
107
+ "div",
108
+ {
109
+ "aria-label": "Loading authentication",
110
+ role: "status",
111
+ className: "tern-secure-loading",
112
+ children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: "Loading authentication..." })
113
+ }
114
+ );
151
115
  }
152
116
  function TernSecureServerProvider({
153
117
  children
154
118
  }) {
155
- return /* @__PURE__ */ jsxRuntime.jsx(React__default.default.Suspense, { fallback: /* @__PURE__ */ jsxRuntime.jsx(TernSecureLoadingFallback, {}), children: /* @__PURE__ */ jsxRuntime.jsx(TernSecureClientProvider2, { children }) });
119
+ return /* @__PURE__ */ jsxRuntime.jsx(React__default.default.Suspense, { fallback: /* @__PURE__ */ jsxRuntime.jsx(TernSecureLoadingFallback, {}), children: /* @__PURE__ */ jsxRuntime.jsx(TernSecureClientProvider, { children }) });
156
120
  }
157
121
 
158
122
  exports.TernSecureServerProvider = TernSecureServerProvider;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/utils/config.ts","../../../../src/utils/client-init.ts","../../../../src/boundary/TernSecureCtx.tsx","../../../../src/app-router/client/TernSecureProvider.tsx","../../../../src/app-router/server/TernSecureServerProvider.tsx"],"names":["config","initializeApp","getAuth","setPersistence","browserSessionPersistence","getFirestore","getStorage","React","jsx","useState","useEffect","onAuthStateChanged","auth","TernSecureClientProvider","dynamic"],"mappings":"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","file":"TernSecureServerProvider.cjs","sourcesContent":["import { TernSecureConfig, ConfigValidationResult } from '../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}","import { initializeApp } from 'firebase/app';\r\nimport { getAuth, setPersistence, browserSessionPersistence } from 'firebase/auth';\r\nimport { getFirestore } from 'firebase/firestore';\r\nimport { getStorage } from 'firebase/storage';\r\nimport { initializeConfig} from './config';\r\n\r\n// Initialize immediately\r\nconst config = initializeConfig();\r\nconst clientApp = initializeApp(config)\r\nconst auth = getAuth(clientApp);\r\nsetPersistence(auth, browserSessionPersistence); //to change later user should be able to choose persistance\r\nconst firestore = getFirestore(clientApp);\r\nconst storage = getStorage(clientApp);\r\n\r\nexport const TernSecureAuth = () => auth;\r\nexport const TernSecureFirestore = () => firestore;\r\nexport const TernSecureStorage = () => storage;","'use client'\r\n\r\nimport React from 'react'\r\n\r\n// Core types\r\nexport type TernSecureCtxValue = {\r\n dynamic: boolean\r\n}\r\n\r\nexport type TernSecureProviderProps = React.PropsWithChildren<{\r\n options?: unknown // Made optional since we're not using it\r\n}>\r\n\r\n// Context with proper null handling\r\nconst TernSecureContext = React.createContext<TernSecureCtxValue | null>(null)\r\n\r\n// Set display name for better debugging\r\nTernSecureContext.displayName = 'TernSecureContext'\r\n\r\nconst useInternalContext = (hookname: string = 'useInternalContext') => {\r\n\r\n const context = React.useContext(TernSecureContext)\r\n \r\n if (!context) {\r\n throw new Error(\r\n `${hookname} must be used within TernSecureClientProvider`\r\n )\r\n }\r\n\r\n return context\r\n}\r\n\r\n/**\r\n * Provider component for TernSecure\r\n * Must be used in client components only\r\n */\r\nconst TernSecureCtxProvider: React.FC<TernSecureProviderProps> = ({ \r\n children \r\n}) => {\r\n\r\n return (\r\n <TernSecureContext.Provider value={{ dynamic: true }}>\r\n {children}\r\n </TernSecureContext.Provider>\r\n )\r\n}\r\n\r\nexport {\r\n useInternalContext,\r\n TernSecureCtxProvider\r\n}","'use client'\r\n\r\nimport React, { useState, useEffect } from 'react'\r\nimport { TernSecureAuth } from '../../utils/client-init'\r\nimport { onAuthStateChanged } from \"firebase/auth\"\r\nimport { useInternalContext, TernSecureCtxProvider } from '../../boundary/TernSecureCtx'\r\n\r\ntype TernSecureState = {\r\n userId: string | null\r\n loading: boolean\r\n error: string | null\r\n isSignedIn: boolean\r\n}\r\n\r\nexport interface TernSecureClientProps {\r\n children: React.ReactNode\r\n}\r\n\r\nconst auth = TernSecureAuth()\r\n\r\nexport function TernSecureClientProvider({ children }: TernSecureClientProps) {\r\n const [authState, setAuthState] = useState<TernSecureState>({\r\n loading: true,\r\n isSignedIn: false,\r\n userId: null,\r\n error: null\r\n })\r\nuseEffect(() => {\r\n const unsubscribe = onAuthStateChanged(auth, (user) => {\r\n if (user) {\r\n setAuthState({\r\n loading: false,\r\n isSignedIn: true,\r\n userId: user.uid,\r\n error: null\r\n })\r\n } else {\r\n setAuthState({\r\n loading: false,\r\n isSignedIn: false,\r\n userId: null,\r\n error: null\r\n })\r\n }\r\n })\r\n \r\n return () => unsubscribe()\r\n }, [])\r\n\r\n\r\n return (\r\n <TernSecureCtxProvider options={authState}>\r\n {children}\r\n </TernSecureCtxProvider>\r\n )\r\n}","import React from \"react\"\r\nimport dynamic from 'next/dynamic'\r\nimport type { TernSecureClientProps } from '../client/TernSecureProvider'\r\n\r\n// Dynamically import the client provider with no SSR\r\nconst TernSecureClientProvider = dynamic<TernSecureClientProps>(\r\n () => import('../client/TernSecureProvider').then(mod => mod.TernSecureClientProvider),\r\n { \r\n loading: () => <TernSecureLoadingFallback />\r\n }\r\n)\r\n\r\n// Loading fallback component\r\nfunction TernSecureLoadingFallback() {\r\n return (\r\n <div aria-label=\"Loading authentication\" role=\"status\">\r\n <span className=\"sr-only\">Loading authentication...</span>\r\n </div>\r\n )\r\n}\r\n\r\ninterface TernSecureServerProviderProps {\r\n children: React.ReactNode\r\n}\r\n\r\n/**\r\n * Server Provider for TernSecure\r\n * Safe to use in server components\r\n * Automatically handles client/server boundary\r\n */\r\nexport function TernSecureServerProvider({ \r\n children \r\n}: TernSecureServerProviderProps) {\r\n return (\r\n <React.Suspense fallback={<TernSecureLoadingFallback />}>\r\n <TernSecureClientProvider>\r\n {children}\r\n </TernSecureClientProvider>\r\n </React.Suspense>\r\n )\r\n}\r\n\r\n// Export types for package users\r\nexport type { TernSecureServerProviderProps }"]}
1
+ {"version":3,"sources":["../../../../src/utils/config.ts","../../../../src/utils/client-init.ts","../../../../src/boundary/TernSecureCtx.tsx","../../../../src/app-router/client/TernSecureProvider.tsx","../../../../src/app-router/server/TernSecureServerProvider.tsx"],"names":["config","initializeApp","getAuth","setPersistence","browserSessionPersistence","getFirestore","getStorage","React","jsx","auth","useState","useEffect","onAuthStateChanged"],"mappings":"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","file":"TernSecureServerProvider.cjs","sourcesContent":["import { TernSecureConfig, ConfigValidationResult } from '../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}","import { initializeApp } from 'firebase/app';\r\nimport { getAuth, setPersistence, browserSessionPersistence } from 'firebase/auth';\r\nimport { getFirestore } from 'firebase/firestore';\r\nimport { getStorage } from 'firebase/storage';\r\nimport { initializeConfig} from './config';\r\n\r\n// Initialize immediately\r\nconst config = initializeConfig();\r\nconst clientApp = initializeApp(config)\r\nconst auth = getAuth(clientApp);\r\nsetPersistence(auth, browserSessionPersistence); //to change later user should be able to choose persistance\r\nconst firestore = getFirestore(clientApp);\r\nconst storage = getStorage(clientApp);\r\n\r\nexport const TernSecureAuth = () => auth;\r\nexport const TernSecureFirestore = () => firestore;\r\nexport const TernSecureStorage = () => storage;","'use client'\r\n\r\nimport React from 'react'\r\n\r\n// Core types\r\nexport type TernSecureCtxValue = {\r\n dynamic: boolean\r\n}\r\n\r\nexport type TernSecureProviderProps = React.PropsWithChildren<{\r\n options?: unknown // Made optional since we're not using it\r\n}>\r\n\r\n// Context with proper null handling\r\nconst TernSecureContext = React.createContext<TernSecureCtxValue | undefined>(undefined)\r\n\r\n// Set display name for better debugging\r\nTernSecureContext.displayName = 'TernSecureContext'\r\n\r\nconst useInternalContext = (hookname: string = 'useInternalContext') => {\r\n\r\n const context = React.useContext(TernSecureContext)\r\n \r\n if (!context) {\r\n throw new Error(\r\n `${hookname} must be used within TernSecureClientProvider`\r\n )\r\n }\r\n\r\n return context\r\n}\r\n\r\n/**\r\n * Provider component for TernSecure\r\n * Must be used in client components only\r\n */\r\nconst TernSecureCtxProvider: React.FC<TernSecureProviderProps> = ({ \r\n children \r\n}) => {\r\n\r\n return (\r\n <TernSecureContext.Provider value={{ dynamic: true }}>\r\n {children}\r\n </TernSecureContext.Provider>\r\n )\r\n}\r\n\r\nexport {\r\n useInternalContext,\r\n TernSecureCtxProvider\r\n}","'use client'\r\n\r\nimport React, { useState, useEffect } from 'react'\r\nimport { TernSecureAuth } from '../../utils/client-init'\r\nimport { onAuthStateChanged } from \"firebase/auth\"\r\nimport { useInternalContext, TernSecureCtxProvider } from '../../boundary/TernSecureCtx'\r\n\r\nexport type TernSecureState = {\r\n userId: string | null\r\n loading: boolean\r\n error: string | null\r\n isSignedIn: boolean\r\n}\r\n\r\nexport const AuthStateContext = React.createContext<TernSecureState | null>(null)\r\n\r\ninterface TernSecureClientProps {\r\n children: React.ReactNode\r\n}\r\n\r\nconst auth = TernSecureAuth();\r\n\r\nexport function TernSecureClientProvider({ children }: TernSecureClientProps) {\r\n const [authState, setAuthState] = useState<TernSecureState>({\r\n loading: true,\r\n isSignedIn: false,\r\n userId: null,\r\n error: null\r\n })\r\nuseEffect(() => {\r\n const unsubscribe = onAuthStateChanged(auth, (user) => {\r\n if (user) {\r\n setAuthState({\r\n loading: false,\r\n isSignedIn: true,\r\n userId: user.uid,\r\n error: null\r\n })\r\n } else {\r\n setAuthState({\r\n loading: false,\r\n isSignedIn: false,\r\n userId: null,\r\n error: null\r\n })\r\n }\r\n })\r\n \r\n return () => unsubscribe()\r\n }, [])\r\n\r\n\r\n return (\r\n <TernSecureCtxProvider>\r\n <AuthStateContext.Provider value={authState}>\r\n {children}\r\n </AuthStateContext.Provider>\r\n </TernSecureCtxProvider>\r\n )\r\n}\r\n\r\nexport type { TernSecureClientProps }","import React from \"react\"\r\nimport { TernSecureClientProvider } from \"../client/TernSecureProvider\"\r\n\r\n\r\n\r\n// Loading fallback component\r\nfunction TernSecureLoadingFallback() {\r\n return (\r\n <div \r\n aria-label=\"Loading authentication\" \r\n role=\"status\"\r\n className=\"tern-secure-loading\"\r\n >\r\n <span className=\"sr-only\">Loading authentication...</span>\r\n </div>\r\n )\r\n}\r\n\r\ninterface TernSecureServerProviderProps {\r\n children: React.ReactNode\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 TernSecureServerProvider({ \r\n children \r\n}: TernSecureServerProviderProps) {\r\n return (\r\n <React.Suspense fallback={<TernSecureLoadingFallback />}>\r\n <TernSecureClientProvider>\r\n {children}\r\n </TernSecureClientProvider>\r\n </React.Suspense>\r\n )\r\n}\r\n\r\n// Export types for internal use\r\nexport type { TernSecureServerProviderProps }"]}
@@ -7,7 +7,7 @@ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
7
7
 
8
8
  var React__default = /*#__PURE__*/_interopDefault(React);
9
9
 
10
- var TernSecureContext = React__default.default.createContext(null);
10
+ var TernSecureContext = React__default.default.createContext(void 0);
11
11
  TernSecureContext.displayName = "TernSecureContext";
12
12
  var useInternalContext = (hookname = "useInternalContext") => {
13
13
  const context = React__default.default.useContext(TernSecureContext);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/boundary/TernSecureCtx.tsx"],"names":["React","jsx"],"mappings":";;;;;;;;;AAcA,IAAM,iBAAA,GAAoBA,sBAAM,CAAA,aAAA,CAAyC,IAAI,CAAA;AAG7E,iBAAA,CAAkB,WAAc,GAAA,mBAAA;AAE1B,IAAA,kBAAA,GAAqB,CAAC,QAAA,GAAmB,oBAAyB,KAAA;AAEtE,EAAM,MAAA,OAAA,GAAUA,sBAAM,CAAA,UAAA,CAAW,iBAAiB,CAAA;AAElD,EAAA,IAAI,CAAC,OAAS,EAAA;AACZ,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,GAAG,QAAQ,CAAA,6CAAA;AAAA,KACb;AAAA;AAGF,EAAO,OAAA,OAAA;AACT;AAMA,IAAM,wBAA2D,CAAC;AAAA,EAChE;AACF,CAAM,KAAA;AAEJ,EACE,uBAAAC,cAAA,CAAC,kBAAkB,QAAlB,EAAA,EAA2B,OAAO,EAAE,OAAA,EAAS,IAAK,EAAA,EAChD,QACH,EAAA,CAAA;AAEJ","file":"TernSecureCtx.cjs","sourcesContent":["'use client'\r\n\r\nimport React from 'react'\r\n\r\n// Core types\r\nexport type TernSecureCtxValue = {\r\n dynamic: boolean\r\n}\r\n\r\nexport type TernSecureProviderProps = React.PropsWithChildren<{\r\n options?: unknown // Made optional since we're not using it\r\n}>\r\n\r\n// Context with proper null handling\r\nconst TernSecureContext = React.createContext<TernSecureCtxValue | null>(null)\r\n\r\n// Set display name for better debugging\r\nTernSecureContext.displayName = 'TernSecureContext'\r\n\r\nconst useInternalContext = (hookname: string = 'useInternalContext') => {\r\n\r\n const context = React.useContext(TernSecureContext)\r\n \r\n if (!context) {\r\n throw new Error(\r\n `${hookname} must be used within TernSecureClientProvider`\r\n )\r\n }\r\n\r\n return context\r\n}\r\n\r\n/**\r\n * Provider component for TernSecure\r\n * Must be used in client components only\r\n */\r\nconst TernSecureCtxProvider: React.FC<TernSecureProviderProps> = ({ \r\n children \r\n}) => {\r\n\r\n return (\r\n <TernSecureContext.Provider value={{ dynamic: true }}>\r\n {children}\r\n </TernSecureContext.Provider>\r\n )\r\n}\r\n\r\nexport {\r\n useInternalContext,\r\n TernSecureCtxProvider\r\n}"]}
1
+ {"version":3,"sources":["../../../src/boundary/TernSecureCtx.tsx"],"names":["React","jsx"],"mappings":";;;;;;;;;AAcA,IAAM,iBAAA,GAAoBA,sBAAM,CAAA,aAAA,CAA8C,KAAS,CAAA,CAAA;AAGvF,iBAAA,CAAkB,WAAc,GAAA,mBAAA;AAE1B,IAAA,kBAAA,GAAqB,CAAC,QAAA,GAAmB,oBAAyB,KAAA;AAEtE,EAAM,MAAA,OAAA,GAAUA,sBAAM,CAAA,UAAA,CAAW,iBAAiB,CAAA;AAElD,EAAA,IAAI,CAAC,OAAS,EAAA;AACZ,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,GAAG,QAAQ,CAAA,6CAAA;AAAA,KACb;AAAA;AAGF,EAAO,OAAA,OAAA;AACT;AAMA,IAAM,wBAA2D,CAAC;AAAA,EAChE;AACF,CAAM,KAAA;AAEJ,EACE,uBAAAC,cAAA,CAAC,kBAAkB,QAAlB,EAAA,EAA2B,OAAO,EAAE,OAAA,EAAS,IAAK,EAAA,EAChD,QACH,EAAA,CAAA;AAEJ","file":"TernSecureCtx.cjs","sourcesContent":["'use client'\r\n\r\nimport React from 'react'\r\n\r\n// Core types\r\nexport type TernSecureCtxValue = {\r\n dynamic: boolean\r\n}\r\n\r\nexport type TernSecureProviderProps = React.PropsWithChildren<{\r\n options?: unknown // Made optional since we're not using it\r\n}>\r\n\r\n// Context with proper null handling\r\nconst TernSecureContext = React.createContext<TernSecureCtxValue | undefined>(undefined)\r\n\r\n// Set display name for better debugging\r\nTernSecureContext.displayName = 'TernSecureContext'\r\n\r\nconst useInternalContext = (hookname: string = 'useInternalContext') => {\r\n\r\n const context = React.useContext(TernSecureContext)\r\n \r\n if (!context) {\r\n throw new Error(\r\n `${hookname} must be used within TernSecureClientProvider`\r\n )\r\n }\r\n\r\n return context\r\n}\r\n\r\n/**\r\n * Provider component for TernSecure\r\n * Must be used in client components only\r\n */\r\nconst TernSecureCtxProvider: React.FC<TernSecureProviderProps> = ({ \r\n children \r\n}) => {\r\n\r\n return (\r\n <TernSecureContext.Provider value={{ dynamic: true }}>\r\n {children}\r\n </TernSecureContext.Provider>\r\n )\r\n}\r\n\r\nexport {\r\n useInternalContext,\r\n TernSecureCtxProvider\r\n}"]}
@@ -1,16 +1,28 @@
1
1
  'use strict';
2
2
 
3
3
  var React = require('react');
4
+ require('react/jsx-runtime');
4
5
  var app = require('firebase/app');
5
6
  var auth$1 = require('firebase/auth');
6
7
  var firestore = require('firebase/firestore');
7
8
  var storage = require('firebase/storage');
8
- require('react/jsx-runtime');
9
9
 
10
10
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
11
11
 
12
12
  var React__default = /*#__PURE__*/_interopDefault(React);
13
13
 
14
+ var TernSecureContext = React__default.default.createContext(void 0);
15
+ TernSecureContext.displayName = "TernSecureContext";
16
+ var useInternalContext = (hookname = "useInternalContext") => {
17
+ const context = React__default.default.useContext(TernSecureContext);
18
+ if (!context) {
19
+ throw new Error(
20
+ `${hookname} must be used within TernSecureClientProvider`
21
+ );
22
+ }
23
+ return context;
24
+ };
25
+
14
26
  // src/utils/config.ts
15
27
  var loadFireConfig = () => ({
16
28
  apiKey: process.env.NEXT_PUBLIC_FIREBASE_API_KEY || "",
@@ -61,37 +73,23 @@ var auth = auth$1.getAuth(clientApp);
61
73
  auth$1.setPersistence(auth, auth$1.browserSessionPersistence);
62
74
  firestore.getFirestore(clientApp);
63
75
  storage.getStorage(clientApp);
64
- var TernSecureAuth = () => auth;
65
- var TernSecureContext = React__default.default.createContext(null);
66
- TernSecureContext.displayName = "TernSecureContext";
67
- var useInternalContext = (hookname = "useInternalContext") => {
68
- const context = React__default.default.useContext(TernSecureContext);
69
- if (!context) {
70
- throw new Error(
71
- `${hookname} must be used within TernSecureClientProvider`
72
- );
73
- }
74
- return context;
75
- };
76
+ var AuthStateContext = React__default.default.createContext(null);
76
77
 
77
- // src/boundary/hooks/use-auth.ts
78
+ // src/boundary/hooks/useAuth.ts
78
79
  function useAuth() {
79
- React.useMemo(() => TernSecureAuth(), []);
80
- const [authState, setAuthState] = React.useState({
81
- loading: true,
82
- isSignedIn: false,
83
- userId: null,
84
- error: null
85
- });
86
80
  useInternalContext("useAuth");
81
+ const authState = React.useContext(AuthStateContext);
82
+ if (!authState) {
83
+ throw new Error("Auth state not found");
84
+ }
87
85
  return {
88
- loading: authState.loading,
89
- isSignedIn: authState.isSignedIn,
90
86
  userId: authState.userId,
91
- error: authState.error
87
+ loading: authState.loading,
88
+ error: authState.error,
89
+ isSignedIn: authState.isSignedIn
92
90
  };
93
91
  }
94
92
 
95
93
  exports.useAuth = useAuth;
96
- //# sourceMappingURL=use-auth.cjs.map
97
- //# sourceMappingURL=use-auth.cjs.map
94
+ //# sourceMappingURL=useAuth.cjs.map
95
+ //# sourceMappingURL=useAuth.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/boundary/TernSecureCtx.tsx","../../../../src/utils/config.ts","../../../../src/utils/client-init.ts","../../../../src/app-router/client/TernSecureProvider.tsx","../../../../src/boundary/hooks/useAuth.ts"],"names":["React","config","initializeApp","getAuth","setPersistence","browserSessionPersistence","getFirestore","getStorage","useContext"],"mappings":"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","file":"useAuth.cjs","sourcesContent":["'use client'\r\n\r\nimport React from 'react'\r\n\r\n// Core types\r\nexport type TernSecureCtxValue = {\r\n dynamic: boolean\r\n}\r\n\r\nexport type TernSecureProviderProps = React.PropsWithChildren<{\r\n options?: unknown // Made optional since we're not using it\r\n}>\r\n\r\n// Context with proper null handling\r\nconst TernSecureContext = React.createContext<TernSecureCtxValue | undefined>(undefined)\r\n\r\n// Set display name for better debugging\r\nTernSecureContext.displayName = 'TernSecureContext'\r\n\r\nconst useInternalContext = (hookname: string = 'useInternalContext') => {\r\n\r\n const context = React.useContext(TernSecureContext)\r\n \r\n if (!context) {\r\n throw new Error(\r\n `${hookname} must be used within TernSecureClientProvider`\r\n )\r\n }\r\n\r\n return context\r\n}\r\n\r\n/**\r\n * Provider component for TernSecure\r\n * Must be used in client components only\r\n */\r\nconst TernSecureCtxProvider: React.FC<TernSecureProviderProps> = ({ \r\n children \r\n}) => {\r\n\r\n return (\r\n <TernSecureContext.Provider value={{ dynamic: true }}>\r\n {children}\r\n </TernSecureContext.Provider>\r\n )\r\n}\r\n\r\nexport {\r\n useInternalContext,\r\n TernSecureCtxProvider\r\n}","import { TernSecureConfig, ConfigValidationResult } from '../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}","import { initializeApp } from 'firebase/app';\r\nimport { getAuth, setPersistence, browserSessionPersistence } from 'firebase/auth';\r\nimport { getFirestore } from 'firebase/firestore';\r\nimport { getStorage } from 'firebase/storage';\r\nimport { initializeConfig} from './config';\r\n\r\n// Initialize immediately\r\nconst config = initializeConfig();\r\nconst clientApp = initializeApp(config)\r\nconst auth = getAuth(clientApp);\r\nsetPersistence(auth, browserSessionPersistence); //to change later user should be able to choose persistance\r\nconst firestore = getFirestore(clientApp);\r\nconst storage = getStorage(clientApp);\r\n\r\nexport const TernSecureAuth = () => auth;\r\nexport const TernSecureFirestore = () => firestore;\r\nexport const TernSecureStorage = () => storage;","'use client'\r\n\r\nimport React, { useState, useEffect } from 'react'\r\nimport { TernSecureAuth } from '../../utils/client-init'\r\nimport { onAuthStateChanged } from \"firebase/auth\"\r\nimport { useInternalContext, TernSecureCtxProvider } from '../../boundary/TernSecureCtx'\r\n\r\nexport type TernSecureState = {\r\n userId: string | null\r\n loading: boolean\r\n error: string | null\r\n isSignedIn: boolean\r\n}\r\n\r\nexport const AuthStateContext = React.createContext<TernSecureState | null>(null)\r\n\r\ninterface TernSecureClientProps {\r\n children: React.ReactNode\r\n}\r\n\r\nconst auth = TernSecureAuth();\r\n\r\nexport function TernSecureClientProvider({ children }: TernSecureClientProps) {\r\n const [authState, setAuthState] = useState<TernSecureState>({\r\n loading: true,\r\n isSignedIn: false,\r\n userId: null,\r\n error: null\r\n })\r\nuseEffect(() => {\r\n const unsubscribe = onAuthStateChanged(auth, (user) => {\r\n if (user) {\r\n setAuthState({\r\n loading: false,\r\n isSignedIn: true,\r\n userId: user.uid,\r\n error: null\r\n })\r\n } else {\r\n setAuthState({\r\n loading: false,\r\n isSignedIn: false,\r\n userId: null,\r\n error: null\r\n })\r\n }\r\n })\r\n \r\n return () => unsubscribe()\r\n }, [])\r\n\r\n\r\n return (\r\n <TernSecureCtxProvider>\r\n <AuthStateContext.Provider value={authState}>\r\n {children}\r\n </AuthStateContext.Provider>\r\n </TernSecureCtxProvider>\r\n )\r\n}\r\n\r\nexport type { TernSecureClientProps }","'use client'\r\n\r\nimport { useContext } from 'react'\r\nimport { useInternalContext } from '../../boundary/TernSecureCtx'\r\nimport { AuthStateContext, type TernSecureState } from '../../app-router/client/TernSecureProvider'\r\n\r\nexport function useAuth(): TernSecureState {\r\n // Verify we're within the provider boundary\r\n useInternalContext('useAuth')\r\n \r\n // Get the auth state from the AuthStateContext\r\n const authState = useContext(AuthStateContext)\r\n if (!authState) {\r\n throw new Error('Auth state not found')\r\n }\r\n\r\n return {\r\n userId: authState.userId,\r\n loading: authState.loading,\r\n error: authState.error,\r\n isSignedIn: authState.isSignedIn\r\n }\r\n}"]}