@tern-secure/nextjs 3.1.57 → 3.1.59
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.
- package/dist/cjs/app-router/client/TernSecureProvider.cjs +23 -70
- package/dist/cjs/app-router/client/TernSecureProvider.cjs.map +1 -1
- package/dist/cjs/app-router/server/TernSecureServerProvider.cjs +77 -182
- package/dist/cjs/app-router/server/TernSecureServerProvider.cjs.map +1 -1
- package/dist/cjs/boundary/TernSecureCtx.cjs +5 -32
- package/dist/cjs/boundary/TernSecureCtx.cjs.map +1 -1
- package/dist/cjs/boundary/hooks/use-auth.cjs +64 -21
- package/dist/cjs/boundary/hooks/use-auth.cjs.map +1 -1
- package/dist/cjs/index.cjs +104 -220
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/esm/app-router/client/TernSecureProvider.d.ts +1 -12
- package/dist/esm/app-router/client/TernSecureProvider.js +3 -67
- package/dist/esm/app-router/client/TernSecureProvider.js.map +1 -1
- package/dist/esm/app-router/server/TernSecureServerProvider.d.ts +6 -9
- package/dist/esm/app-router/server/TernSecureServerProvider.js +5 -1
- package/dist/esm/boundary/TernSecureCtx.d.ts +12 -19
- package/dist/esm/boundary/TernSecureCtx.js +1 -1
- package/dist/esm/boundary/hooks/use-auth.d.ts +13 -23
- package/dist/esm/boundary/hooks/use-auth.js +4 -2
- package/dist/esm/chunk-3D5IN6EL.js +11 -0
- package/dist/esm/chunk-3D5IN6EL.js.map +1 -0
- package/dist/esm/chunk-F7XKLY6Y.js +40 -0
- package/dist/esm/chunk-F7XKLY6Y.js.map +1 -0
- package/dist/esm/chunk-I2PGODCQ.js +17 -0
- package/dist/esm/chunk-I2PGODCQ.js.map +1 -0
- package/dist/esm/chunk-KUYDOUCP.js +24 -0
- package/dist/esm/chunk-KUYDOUCP.js.map +1 -0
- package/dist/esm/index.d.ts +5 -8
- package/dist/esm/index.js +4 -8
- package/dist/esm/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/esm/chunk-32DZLLHE.js +0 -43
- package/dist/esm/chunk-32DZLLHE.js.map +0 -1
- package/dist/esm/chunk-FMHBRXHR.js +0 -20
- package/dist/esm/chunk-FMHBRXHR.js.map +0 -1
- package/dist/esm/chunk-S2ODB3YJ.js +0 -31
- package/dist/esm/chunk-S2ODB3YJ.js.map +0 -1
|
@@ -62,87 +62,40 @@ auth$1.setPersistence(auth, auth$1.browserSessionPersistence);
|
|
|
62
62
|
firestore.getFirestore(clientApp);
|
|
63
63
|
storage.getStorage(clientApp);
|
|
64
64
|
var TernSecureAuth = () => auth;
|
|
65
|
-
var
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
}
|
|
70
|
-
};
|
|
71
|
-
var TernSecureContext = React__default.default.createContext(null);
|
|
72
|
-
TernSecureContext.displayName = "TernSecureContext";
|
|
73
|
-
var TernSecureCtxProvider = ({
|
|
74
|
-
children
|
|
75
|
-
}) => {
|
|
76
|
-
if (typeof window === "undefined") {
|
|
77
|
-
throw new TernSecureError(
|
|
78
|
-
"TernSecureCtxProvider must be used in client components"
|
|
79
|
-
);
|
|
80
|
-
}
|
|
81
|
-
if (process.env.NODE_ENV !== "production") {
|
|
82
|
-
React__default.default.useEffect(() => {
|
|
83
|
-
console.log("[TernSecure] Provider initialized in client component");
|
|
84
|
-
}, []);
|
|
85
|
-
}
|
|
86
|
-
return /* @__PURE__ */ jsxRuntime.jsx(TernSecureContext.Provider, { value: { dynamic: true }, children });
|
|
65
|
+
var TernSecureContext = React__default.default.createContext(void 0);
|
|
66
|
+
var TernSecureCtxProvider = (props) => {
|
|
67
|
+
const { children, options } = props;
|
|
68
|
+
return /* @__PURE__ */ jsxRuntime.jsx(TernSecureContext.Provider, { value: { value: options }, children });
|
|
87
69
|
};
|
|
88
70
|
var auth2 = TernSecureAuth();
|
|
89
71
|
function TernSecureClientProvider({ children }) {
|
|
90
|
-
if (typeof window === "undefined") {
|
|
91
|
-
throw new TernSecureError("TernSecureClientProvider must be used in client components");
|
|
92
|
-
}
|
|
93
72
|
const [authState, setAuthState] = React.useState({
|
|
94
73
|
loading: true,
|
|
95
74
|
isSignedIn: false,
|
|
96
75
|
userId: null,
|
|
97
76
|
error: null
|
|
98
77
|
});
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
setAuthState((prev) => ({
|
|
116
|
-
...prev,
|
|
117
|
-
loading: false,
|
|
118
|
-
error: error.message
|
|
119
|
-
}));
|
|
120
|
-
if (process.env.NODE_ENV !== "production") {
|
|
121
|
-
console.error("[TernSecure] Auth state error:", error);
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
);
|
|
125
|
-
if (process.env.NODE_ENV !== "production") {
|
|
126
|
-
console.log("[TernSecure] Auth listener established");
|
|
78
|
+
React.useEffect(() => {
|
|
79
|
+
const unsubscribe = auth$1.onAuthStateChanged(auth2, (user) => {
|
|
80
|
+
if (user) {
|
|
81
|
+
setAuthState({
|
|
82
|
+
loading: false,
|
|
83
|
+
isSignedIn: true,
|
|
84
|
+
userId: user.uid,
|
|
85
|
+
error: null
|
|
86
|
+
});
|
|
87
|
+
} else {
|
|
88
|
+
setAuthState({
|
|
89
|
+
loading: false,
|
|
90
|
+
isSignedIn: false,
|
|
91
|
+
userId: null,
|
|
92
|
+
error: null
|
|
93
|
+
});
|
|
127
94
|
}
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
if (process.env.NODE_ENV !== "production") {
|
|
131
|
-
console.log("[TernSecure] Auth listener cleaned up");
|
|
132
|
-
}
|
|
133
|
-
};
|
|
134
|
-
} catch (error) {
|
|
135
|
-
setAuthState((prev) => ({
|
|
136
|
-
...prev,
|
|
137
|
-
loading: false,
|
|
138
|
-
error: error instanceof Error ? error.message : "Unknown error occurred"
|
|
139
|
-
}));
|
|
140
|
-
if (process.env.NODE_ENV !== "production") {
|
|
141
|
-
console.error("[TernSecure] Setup error:", error);
|
|
142
|
-
}
|
|
143
|
-
}
|
|
95
|
+
});
|
|
96
|
+
return () => unsubscribe();
|
|
144
97
|
}, []);
|
|
145
|
-
return /* @__PURE__ */ jsxRuntime.jsx(TernSecureCtxProvider, { children });
|
|
98
|
+
return /* @__PURE__ */ jsxRuntime.jsx(TernSecureCtxProvider, { options: authState, children });
|
|
146
99
|
}
|
|
147
100
|
|
|
148
101
|
exports.TernSecureClientProvider = TernSecureClientProvider;
|
|
@@ -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","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// Custom error for package\r\nexport class TernSecureError extends Error {\r\n constructor(message: string) {\r\n super(`[TernSecure] ${message}`)\r\n this.name = 'TernSecureError'\r\n }\r\n}\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\n/**\r\n * Internal hook for context consumption\r\n * @throws {TernSecureError} When used outside client components or provider\r\n */\r\nconst useInternalContext = (hookname: string = 'useInternalContext') => {\r\n // Early check for client-side\r\n if (typeof window === 'undefined') {\r\n throw new TernSecureError(`${hookname} must be used in client components`)\r\n }\r\n\r\n const context = React.useContext(TernSecureContext)\r\n \r\n if (!context) {\r\n throw new TernSecureError(\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 // Check for client-side rendering\r\n if (typeof window === 'undefined') {\r\n throw new TernSecureError(\r\n 'TernSecureCtxProvider must be used in client components'\r\n )\r\n }\r\n\r\n // Development checks\r\n if (process.env.NODE_ENV !== 'production') {\r\n React.useEffect(() => {\r\n console.log('[TernSecure] Provider initialized in client component')\r\n }, [])\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 } from 'react'\r\nimport { TernSecureAuth } from '../../utils/client-init'\r\nimport { onAuthStateChanged, User } from \"firebase/auth\"\r\nimport { TernSecureCtxProvider, TernSecureError } from '../../boundary/TernSecureCtx'\r\n\r\n// Types for the provider\r\nexport type TernSecureState = {\r\n loading: boolean\r\n isSignedIn: boolean\r\n userId: string | null\r\n error: string | null\r\n}\r\n\r\ninterface TernSecureClientProps {\r\n children: React.ReactNode\r\n}\r\n\r\nconst auth = TernSecureAuth()\r\n\r\n/**\r\n * Client Provider for TernSecure\r\n * Must be used in client components only\r\n * Manages authentication state and provides it to children\r\n */\r\nexport function TernSecureClientProvider({ children }: TernSecureClientProps) {\r\n // Verify client-side execution\r\n if (typeof window === 'undefined') {\r\n throw new TernSecureError('TernSecureClientProvider must be used in client components')\r\n }\r\n\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\n\r\n React.useEffect(() => {\r\n // Development checks\r\n if (process.env.NODE_ENV !== 'production') {\r\n console.log('[TernSecure] Initializing auth state listener')\r\n }\r\n\r\n try {\r\n const unsubscribe = onAuthStateChanged(auth, \r\n (user: User | null) => {\r\n setAuthState({\r\n loading: false,\r\n isSignedIn: !!user,\r\n userId: user?.uid || null,\r\n error: null\r\n })\r\n },\r\n (error) => {\r\n setAuthState(prev => ({\r\n ...prev,\r\n loading: false,\r\n error: error.message\r\n }))\r\n \r\n if (process.env.NODE_ENV !== 'production') {\r\n console.error('[TernSecure] Auth state error:', error)\r\n }\r\n }\r\n )\r\n\r\n // Development feedback\r\n if (process.env.NODE_ENV !== 'production') {\r\n console.log('[TernSecure] Auth listener established')\r\n }\r\n\r\n return () => {\r\n unsubscribe()\r\n if (process.env.NODE_ENV !== 'production') {\r\n console.log('[TernSecure] Auth listener cleaned up')\r\n }\r\n }\r\n } catch (error) {\r\n setAuthState(prev => ({\r\n ...prev,\r\n loading: false,\r\n error: error instanceof Error ? error.message : 'Unknown error occurred'\r\n }))\r\n \r\n if (process.env.NODE_ENV !== 'production') {\r\n console.error('[TernSecure] Setup error:', error)\r\n }\r\n }\r\n }, [])\r\n\r\n return (\r\n <TernSecureCtxProvider>\r\n {children}\r\n </TernSecureCtxProvider>\r\n )\r\n}\r\n\r\n// Export types for package users\r\nexport type { TernSecureClientProps }"]}
|
|
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\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\n\r\n// Create context instance only when imported on client\r\nconst TernSecureContext = React.createContext<{value: TernSecureState} | undefined>(undefined);\r\n\r\nconst useInternalContext = (hookname?: string) => {\r\n const context = React.useContext(TernSecureContext)\r\n return context\r\n}\r\n\r\nconst TernSecureCtxProvider = (\r\n props: React.PropsWithChildren<{ options: TernSecureState }>,\r\n): React.JSX.Element => {\r\n const { children, options } = props;\r\n return <TernSecureContext.Provider value={{ value: options }}>{children}</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\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 options={authState}>\r\n {children}\r\n </TernSecureCtxProvider>\r\n )\r\n}"]}
|
|
@@ -1,213 +1,108 @@
|
|
|
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
|
-
|
|
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
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
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
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
throw new TernSecureError(
|
|
103
|
-
"TernSecureCtxProvider must be used in client components"
|
|
104
|
-
);
|
|
105
|
-
}
|
|
106
|
-
if (process.env.NODE_ENV !== "production") {
|
|
107
|
-
React__default.default.useEffect(() => {
|
|
108
|
-
console.log("[TernSecure] Provider initialized in client component");
|
|
109
|
-
}, []);
|
|
110
|
-
}
|
|
111
|
-
return /* @__PURE__ */ jsxRuntime.jsx(TernSecureContext.Provider, { value: { dynamic: true }, children });
|
|
112
|
-
};
|
|
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
|
+
);
|
|
113
55
|
}
|
|
114
|
-
|
|
56
|
+
return config2;
|
|
57
|
+
};
|
|
115
58
|
|
|
116
|
-
// src/
|
|
117
|
-
var
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
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
|
+
var TernSecureCtxProvider = (props) => {
|
|
69
|
+
const { children, options } = props;
|
|
70
|
+
return /* @__PURE__ */ jsxRuntime.jsx(TernSecureContext.Provider, { value: { value: options }, children });
|
|
71
|
+
};
|
|
72
|
+
var auth2 = TernSecureAuth();
|
|
121
73
|
function TernSecureClientProvider({ children }) {
|
|
122
|
-
if (typeof window === "undefined") {
|
|
123
|
-
throw new TernSecureError("TernSecureClientProvider must be used in client components");
|
|
124
|
-
}
|
|
125
74
|
const [authState, setAuthState] = React.useState({
|
|
126
75
|
loading: true,
|
|
127
76
|
isSignedIn: false,
|
|
128
77
|
userId: null,
|
|
129
78
|
error: null
|
|
130
79
|
});
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
setAuthState((prev) => ({
|
|
148
|
-
...prev,
|
|
149
|
-
loading: false,
|
|
150
|
-
error: error.message
|
|
151
|
-
}));
|
|
152
|
-
if (process.env.NODE_ENV !== "production") {
|
|
153
|
-
console.error("[TernSecure] Auth state error:", error);
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
);
|
|
157
|
-
if (process.env.NODE_ENV !== "production") {
|
|
158
|
-
console.log("[TernSecure] Auth listener established");
|
|
159
|
-
}
|
|
160
|
-
return () => {
|
|
161
|
-
unsubscribe();
|
|
162
|
-
if (process.env.NODE_ENV !== "production") {
|
|
163
|
-
console.log("[TernSecure] Auth listener cleaned up");
|
|
164
|
-
}
|
|
165
|
-
};
|
|
166
|
-
} catch (error) {
|
|
167
|
-
setAuthState((prev) => ({
|
|
168
|
-
...prev,
|
|
169
|
-
loading: false,
|
|
170
|
-
error: error instanceof Error ? error.message : "Unknown error occurred"
|
|
171
|
-
}));
|
|
172
|
-
if (process.env.NODE_ENV !== "production") {
|
|
173
|
-
console.error("[TernSecure] Setup error:", error);
|
|
80
|
+
React.useEffect(() => {
|
|
81
|
+
const unsubscribe = auth$1.onAuthStateChanged(auth2, (user) => {
|
|
82
|
+
if (user) {
|
|
83
|
+
setAuthState({
|
|
84
|
+
loading: false,
|
|
85
|
+
isSignedIn: true,
|
|
86
|
+
userId: user.uid,
|
|
87
|
+
error: null
|
|
88
|
+
});
|
|
89
|
+
} else {
|
|
90
|
+
setAuthState({
|
|
91
|
+
loading: false,
|
|
92
|
+
isSignedIn: false,
|
|
93
|
+
userId: null,
|
|
94
|
+
error: null
|
|
95
|
+
});
|
|
174
96
|
}
|
|
175
|
-
}
|
|
97
|
+
});
|
|
98
|
+
return () => unsubscribe();
|
|
176
99
|
}, []);
|
|
177
|
-
return /* @__PURE__ */ jsxRuntime.jsx(TernSecureCtxProvider, { children });
|
|
100
|
+
return /* @__PURE__ */ jsxRuntime.jsx(TernSecureCtxProvider, { options: authState, children });
|
|
178
101
|
}
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
"src/app-router/client/TernSecureProvider.tsx"() {
|
|
182
|
-
"use client";
|
|
183
|
-
init_client_init();
|
|
184
|
-
init_TernSecureCtx();
|
|
185
|
-
auth2 = TernSecureAuth();
|
|
186
|
-
}
|
|
187
|
-
});
|
|
188
|
-
function TernSecureLoadingFallback() {
|
|
189
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
190
|
-
"div",
|
|
191
|
-
{
|
|
192
|
-
"aria-label": "Loading authentication",
|
|
193
|
-
role: "status",
|
|
194
|
-
className: "tern-secure-loading",
|
|
195
|
-
children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: "Loading authentication..." })
|
|
196
|
-
}
|
|
197
|
-
);
|
|
198
|
-
}
|
|
199
|
-
var TernSecureClientProvider2 = dynamic__default.default(
|
|
200
|
-
() => Promise.resolve().then(() => (init_TernSecureProvider(), TernSecureProvider_exports)).then((mod) => mod.TernSecureClientProvider),
|
|
201
|
-
{
|
|
202
|
-
loading: TernSecureLoadingFallback
|
|
203
|
-
}
|
|
204
|
-
);
|
|
205
|
-
function TernSecureServerProvider({
|
|
206
|
-
children
|
|
207
|
-
}) {
|
|
208
|
-
return /* @__PURE__ */ jsxRuntime.jsx(React__default.default.Suspense, { fallback: /* @__PURE__ */ jsxRuntime.jsx(TernSecureLoadingFallback, {}), children: /* @__PURE__ */ jsxRuntime.jsx(TernSecureClientProvider2, { children }) });
|
|
102
|
+
function TernSecureProvider({ children }) {
|
|
103
|
+
return /* @__PURE__ */ jsxRuntime.jsx(React.Suspense, { fallback: /* @__PURE__ */ jsxRuntime.jsx("div", { children: "Loading..." }), children: /* @__PURE__ */ jsxRuntime.jsx(TernSecureClientProvider, { children }) });
|
|
209
104
|
}
|
|
210
105
|
|
|
211
|
-
exports.
|
|
106
|
+
exports.TernSecureProvider = TernSecureProvider;
|
|
212
107
|
//# sourceMappingURL=TernSecureServerProvider.cjs.map
|
|
213
108
|
//# sourceMappingURL=TernSecureServerProvider.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","../../../../src/app-router/server/TernSecureServerProvider.tsx"],"names":["config","initializeApp","getAuth","setPersistence","browserSessionPersistence","getFirestore","getStorage","React","jsx","useState","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// Custom error for package\r\nexport class TernSecureError extends Error {\r\n constructor(message: string) {\r\n super(`[TernSecure] ${message}`)\r\n this.name = 'TernSecureError'\r\n }\r\n}\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\n/**\r\n * Internal hook for context consumption\r\n * @throws {TernSecureError} When used outside client components or provider\r\n */\r\nconst useInternalContext = (hookname: string = 'useInternalContext') => {\r\n // Early check for client-side\r\n if (typeof window === 'undefined') {\r\n throw new TernSecureError(`${hookname} must be used in client components`)\r\n }\r\n\r\n const context = React.useContext(TernSecureContext)\r\n \r\n if (!context) {\r\n throw new TernSecureError(\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 // Check for client-side rendering\r\n if (typeof window === 'undefined') {\r\n throw new TernSecureError(\r\n 'TernSecureCtxProvider must be used in client components'\r\n )\r\n }\r\n\r\n // Development checks\r\n if (process.env.NODE_ENV !== 'production') {\r\n React.useEffect(() => {\r\n console.log('[TernSecure] Provider initialized in client component')\r\n }, [])\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 } from 'react'\r\nimport { TernSecureAuth } from '../../utils/client-init'\r\nimport { onAuthStateChanged, User } from \"firebase/auth\"\r\nimport { TernSecureCtxProvider, TernSecureError } from '../../boundary/TernSecureCtx'\r\n\r\n// Types for the provider\r\nexport type TernSecureState = {\r\n loading: boolean\r\n isSignedIn: boolean\r\n userId: string | null\r\n error: string | null\r\n}\r\n\r\ninterface TernSecureClientProps {\r\n children: React.ReactNode\r\n}\r\n\r\nconst auth = TernSecureAuth()\r\n\r\n/**\r\n * Client Provider for TernSecure\r\n * Must be used in client components only\r\n * Manages authentication state and provides it to children\r\n */\r\nexport function TernSecureClientProvider({ children }: TernSecureClientProps) {\r\n // Verify client-side execution\r\n if (typeof window === 'undefined') {\r\n throw new TernSecureError('TernSecureClientProvider must be used in client components')\r\n }\r\n\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\n\r\n React.useEffect(() => {\r\n // Development checks\r\n if (process.env.NODE_ENV !== 'production') {\r\n console.log('[TernSecure] Initializing auth state listener')\r\n }\r\n\r\n try {\r\n const unsubscribe = onAuthStateChanged(auth, \r\n (user: User | null) => {\r\n setAuthState({\r\n loading: false,\r\n isSignedIn: !!user,\r\n userId: user?.uid || null,\r\n error: null\r\n })\r\n },\r\n (error) => {\r\n setAuthState(prev => ({\r\n ...prev,\r\n loading: false,\r\n error: error.message\r\n }))\r\n \r\n if (process.env.NODE_ENV !== 'production') {\r\n console.error('[TernSecure] Auth state error:', error)\r\n }\r\n }\r\n )\r\n\r\n // Development feedback\r\n if (process.env.NODE_ENV !== 'production') {\r\n console.log('[TernSecure] Auth listener established')\r\n }\r\n\r\n return () => {\r\n unsubscribe()\r\n if (process.env.NODE_ENV !== 'production') {\r\n console.log('[TernSecure] Auth listener cleaned up')\r\n }\r\n }\r\n } catch (error) {\r\n setAuthState(prev => ({\r\n ...prev,\r\n loading: false,\r\n error: error instanceof Error ? error.message : 'Unknown error occurred'\r\n }))\r\n \r\n if (process.env.NODE_ENV !== 'production') {\r\n console.error('[TernSecure] Setup error:', error)\r\n }\r\n }\r\n }, [])\r\n\r\n return (\r\n <TernSecureCtxProvider>\r\n {children}\r\n </TernSecureCtxProvider>\r\n )\r\n}\r\n\r\n// Export types for package users\r\nexport type { TernSecureClientProps }","import React from \"react\"\r\nimport dynamic from 'next/dynamic'\r\nimport type { TernSecureClientProps } from '../client/TernSecureProvider'\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\n// Dynamically import the client provider\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/**\r\n * Root Provider for TernSecure\r\n * Use this in your Next.js App Router root layout\r\n */\r\nexport function TernSecureServerProvider({ \r\n children \r\n}: { \r\n children: React.ReactNode \r\n}) {\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}"]}
|
|
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","Suspense"],"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\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\n\r\n// Create context instance only when imported on client\r\nconst TernSecureContext = React.createContext<{value: TernSecureState} | undefined>(undefined);\r\n\r\nconst useInternalContext = (hookname?: string) => {\r\n const context = React.useContext(TernSecureContext)\r\n return context\r\n}\r\n\r\nconst TernSecureCtxProvider = (\r\n props: React.PropsWithChildren<{ options: TernSecureState }>,\r\n): React.JSX.Element => {\r\n const { children, options } = props;\r\n return <TernSecureContext.Provider value={{ value: options }}>{children}</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\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 options={authState}>\r\n {children}\r\n </TernSecureCtxProvider>\r\n )\r\n}","import React, { ReactNode, Suspense } from \"react\"\r\nimport { TernSecureClientProvider } from '../client/TernSecureProvider'\r\n\r\ninterface TernSecureProviderProps {\r\n children: ReactNode\r\n}\r\n\r\nexport function TernSecureProvider({ children }: TernSecureProviderProps) {\r\n return (\r\n <Suspense fallback={<div>Loading...</div>}>\r\n <TernSecureClientProvider>\r\n {children}\r\n </TernSecureClientProvider>\r\n </Suspense>\r\n )\r\n}"]}
|
|
@@ -7,44 +7,17 @@ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
|
7
7
|
|
|
8
8
|
var React__default = /*#__PURE__*/_interopDefault(React);
|
|
9
9
|
|
|
10
|
-
var
|
|
11
|
-
|
|
12
|
-
super(`[TernSecure] ${message}`);
|
|
13
|
-
this.name = "TernSecureError";
|
|
14
|
-
}
|
|
15
|
-
};
|
|
16
|
-
var TernSecureContext = React__default.default.createContext(null);
|
|
17
|
-
TernSecureContext.displayName = "TernSecureContext";
|
|
18
|
-
var useInternalContext = (hookname = "useInternalContext") => {
|
|
19
|
-
if (typeof window === "undefined") {
|
|
20
|
-
throw new TernSecureError(`${hookname} must be used in client components`);
|
|
21
|
-
}
|
|
10
|
+
var TernSecureContext = React__default.default.createContext(void 0);
|
|
11
|
+
var useInternalContext = (hookname) => {
|
|
22
12
|
const context = React__default.default.useContext(TernSecureContext);
|
|
23
|
-
if (!context) {
|
|
24
|
-
throw new TernSecureError(
|
|
25
|
-
`${hookname} must be used within TernSecureClientProvider`
|
|
26
|
-
);
|
|
27
|
-
}
|
|
28
13
|
return context;
|
|
29
14
|
};
|
|
30
|
-
var TernSecureCtxProvider = ({
|
|
31
|
-
children
|
|
32
|
-
}
|
|
33
|
-
if (typeof window === "undefined") {
|
|
34
|
-
throw new TernSecureError(
|
|
35
|
-
"TernSecureCtxProvider must be used in client components"
|
|
36
|
-
);
|
|
37
|
-
}
|
|
38
|
-
if (process.env.NODE_ENV !== "production") {
|
|
39
|
-
React__default.default.useEffect(() => {
|
|
40
|
-
console.log("[TernSecure] Provider initialized in client component");
|
|
41
|
-
}, []);
|
|
42
|
-
}
|
|
43
|
-
return /* @__PURE__ */ jsxRuntime.jsx(TernSecureContext.Provider, { value: { dynamic: true }, children });
|
|
15
|
+
var TernSecureCtxProvider = (props) => {
|
|
16
|
+
const { children, options } = props;
|
|
17
|
+
return /* @__PURE__ */ jsxRuntime.jsx(TernSecureContext.Provider, { value: { value: options }, children });
|
|
44
18
|
};
|
|
45
19
|
|
|
46
20
|
exports.TernSecureCtxProvider = TernSecureCtxProvider;
|
|
47
|
-
exports.TernSecureError = TernSecureError;
|
|
48
21
|
exports.useInternalContext = useInternalContext;
|
|
49
22
|
//# sourceMappingURL=TernSecureCtx.cjs.map
|
|
50
23
|
//# sourceMappingURL=TernSecureCtx.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/boundary/TernSecureCtx.tsx"],"names":["React","jsx"],"mappings":";;;;;;;;;
|
|
1
|
+
{"version":3,"sources":["../../../src/boundary/TernSecureCtx.tsx"],"names":["React","jsx"],"mappings":";;;;;;;;;AAaA,IAAM,iBAAA,GAAoBA,sBAAM,CAAA,aAAA,CAAoD,KAAS,CAAA,CAAA;AAEvF,IAAA,kBAAA,GAAqB,CAAC,QAAsB,KAAA;AAChD,EAAM,MAAA,OAAA,GAAUA,sBAAM,CAAA,UAAA,CAAW,iBAAiB,CAAA;AAClD,EAAO,OAAA,OAAA;AACT;AAEM,IAAA,qBAAA,GAAwB,CAC5B,KACsB,KAAA;AACtB,EAAM,MAAA,EAAE,QAAU,EAAA,OAAA,EAAY,GAAA,KAAA;AAC9B,EAAO,uBAAAC,cAAA,CAAC,kBAAkB,QAAlB,EAAA,EAA2B,OAAO,EAAE,KAAA,EAAO,OAAQ,EAAA,EAAI,QAAS,EAAA,CAAA;AAC1E","file":"TernSecureCtx.cjs","sourcesContent":["'use client'\r\n\r\nimport React from 'react'\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\n\r\n// Create context instance only when imported on client\r\nconst TernSecureContext = React.createContext<{value: TernSecureState} | undefined>(undefined);\r\n\r\nconst useInternalContext = (hookname?: string) => {\r\n const context = React.useContext(TernSecureContext)\r\n return context\r\n}\r\n\r\nconst TernSecureCtxProvider = (\r\n props: React.PropsWithChildren<{ options: TernSecureState }>,\r\n): React.JSX.Element => {\r\n const { children, options } = props;\r\n return <TernSecureContext.Provider value={{ value: options }}>{children}</TernSecureContext.Provider>;\r\n};\r\n\r\n\r\nexport {\r\n useInternalContext,\r\n TernSecureCtxProvider\r\n}"]}
|