@tern-secure/nextjs 3.1.59 → 3.1.60
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 +6 -4
- package/dist/cjs/app-router/client/TernSecureProvider.cjs.map +1 -1
- package/dist/cjs/app-router/server/TernSecureServerProvider.cjs +110 -57
- package/dist/cjs/app-router/server/TernSecureServerProvider.cjs.map +1 -1
- package/dist/cjs/boundary/TernSecureCtx.cjs +12 -5
- package/dist/cjs/boundary/TernSecureCtx.cjs.map +1 -1
- package/dist/cjs/boundary/hooks/use-auth.cjs +9 -3
- package/dist/cjs/boundary/hooks/use-auth.cjs.map +1 -1
- package/dist/cjs/index.cjs +140 -78
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/esm/app-router/client/TernSecureProvider.d.ts +1 -1
- package/dist/esm/app-router/client/TernSecureProvider.js +38 -3
- package/dist/esm/app-router/client/TernSecureProvider.js.map +1 -1
- package/dist/esm/app-router/server/TernSecureServerProvider.d.ts +9 -4
- package/dist/esm/app-router/server/TernSecureServerProvider.js +1 -5
- package/dist/esm/boundary/TernSecureCtx.d.ts +12 -12
- package/dist/esm/boundary/TernSecureCtx.js +1 -1
- package/dist/esm/boundary/hooks/use-auth.js +2 -2
- package/dist/esm/chunk-BMLKEIDV.js +24 -0
- package/dist/esm/chunk-BMLKEIDV.js.map +1 -0
- package/dist/esm/{chunk-KUYDOUCP.js → chunk-D4W62QPB.js} +3 -3
- package/dist/esm/{chunk-KUYDOUCP.js.map → chunk-D4W62QPB.js.map} +1 -1
- package/dist/esm/chunk-RAZTKM22.js +24 -0
- package/dist/esm/chunk-RAZTKM22.js.map +1 -0
- package/dist/esm/index.d.ts +1 -3
- package/dist/esm/index.js +3 -4
- package/package.json +1 -1
- package/dist/esm/chunk-3D5IN6EL.js +0 -11
- package/dist/esm/chunk-3D5IN6EL.js.map +0 -1
- package/dist/esm/chunk-F7XKLY6Y.js +0 -40
- package/dist/esm/chunk-F7XKLY6Y.js.map +0 -1
- package/dist/esm/chunk-I2PGODCQ.js +0 -17
- package/dist/esm/chunk-I2PGODCQ.js.map +0 -1
|
@@ -62,10 +62,12 @@ 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(
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
65
|
+
var TernSecureContext = React__default.default.createContext(null);
|
|
66
|
+
TernSecureContext.displayName = "TernSecureContext";
|
|
67
|
+
var TernSecureCtxProvider = ({
|
|
68
|
+
children
|
|
69
|
+
}) => {
|
|
70
|
+
return /* @__PURE__ */ jsxRuntime.jsx(TernSecureContext.Provider, { value: { dynamic: true }, children });
|
|
69
71
|
};
|
|
70
72
|
var auth2 = TernSecureAuth();
|
|
71
73
|
function TernSecureClientProvider({ children }) {
|
|
@@ -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":";;;;;;;;;;;;;;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;
|
|
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,75 +1,107 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var React = require('react');
|
|
4
3
|
var app = require('firebase/app');
|
|
5
4
|
var auth$1 = require('firebase/auth');
|
|
6
5
|
var firestore = require('firebase/firestore');
|
|
7
6
|
var storage = require('firebase/storage');
|
|
7
|
+
var React = require('react');
|
|
8
8
|
var jsxRuntime = require('react/jsx-runtime');
|
|
9
|
+
var dynamic = require('next/dynamic');
|
|
9
10
|
|
|
10
11
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
11
12
|
|
|
12
13
|
var React__default = /*#__PURE__*/_interopDefault(React);
|
|
14
|
+
var dynamic__default = /*#__PURE__*/_interopDefault(dynamic);
|
|
13
15
|
|
|
14
|
-
|
|
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
|
+
};
|
|
15
25
|
|
|
16
26
|
// src/utils/config.ts
|
|
17
|
-
var loadFireConfig
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
errors
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
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:
|
|
53
66
|
${validationResult.errors.join("\n")}`
|
|
54
|
-
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
return config2;
|
|
70
|
+
};
|
|
55
71
|
}
|
|
56
|
-
|
|
57
|
-
|
|
72
|
+
});
|
|
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
|
+
};
|
|
97
|
+
}
|
|
98
|
+
});
|
|
58
99
|
|
|
59
|
-
// src/
|
|
60
|
-
var
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
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();
|
|
100
|
+
// src/app-router/client/TernSecureProvider.tsx
|
|
101
|
+
var TernSecureProvider_exports = {};
|
|
102
|
+
__export(TernSecureProvider_exports, {
|
|
103
|
+
TernSecureClientProvider: () => TernSecureClientProvider
|
|
104
|
+
});
|
|
73
105
|
function TernSecureClientProvider({ children }) {
|
|
74
106
|
const [authState, setAuthState] = React.useState({
|
|
75
107
|
loading: true,
|
|
@@ -99,8 +131,29 @@ function TernSecureClientProvider({ children }) {
|
|
|
99
131
|
}, []);
|
|
100
132
|
return /* @__PURE__ */ jsxRuntime.jsx(TernSecureCtxProvider, { options: authState, children });
|
|
101
133
|
}
|
|
102
|
-
|
|
103
|
-
|
|
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
|
+
ssr: false,
|
|
147
|
+
loading: () => /* @__PURE__ */ jsxRuntime.jsx(TernSecureLoadingFallback, {})
|
|
148
|
+
}
|
|
149
|
+
);
|
|
150
|
+
function TernSecureLoadingFallback() {
|
|
151
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { "aria-label": "Loading authentication", role: "status", children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: "Loading authentication..." }) });
|
|
152
|
+
}
|
|
153
|
+
function TernSecureProvider({
|
|
154
|
+
children
|
|
155
|
+
}) {
|
|
156
|
+
return /* @__PURE__ */ jsxRuntime.jsx(React__default.default.Suspense, { fallback: /* @__PURE__ */ jsxRuntime.jsx(TernSecureLoadingFallback, {}), children: /* @__PURE__ */ jsxRuntime.jsx(TernSecureClientProvider2, { children }) });
|
|
104
157
|
}
|
|
105
158
|
|
|
106
159
|
exports.TernSecureProvider = TernSecureProvider;
|
|
@@ -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","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}"]}
|
|
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 ssr: false,\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 TernSecureProvider({ \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}"]}
|
|
@@ -7,14 +7,21 @@ 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(
|
|
11
|
-
|
|
10
|
+
var TernSecureContext = React__default.default.createContext(null);
|
|
11
|
+
TernSecureContext.displayName = "TernSecureContext";
|
|
12
|
+
var useInternalContext = (hookname = "useInternalContext") => {
|
|
12
13
|
const context = React__default.default.useContext(TernSecureContext);
|
|
14
|
+
if (!context) {
|
|
15
|
+
throw new Error(
|
|
16
|
+
`${hookname} must be used within TernSecureClientProvider`
|
|
17
|
+
);
|
|
18
|
+
}
|
|
13
19
|
return context;
|
|
14
20
|
};
|
|
15
|
-
var TernSecureCtxProvider = (
|
|
16
|
-
|
|
17
|
-
|
|
21
|
+
var TernSecureCtxProvider = ({
|
|
22
|
+
children
|
|
23
|
+
}) => {
|
|
24
|
+
return /* @__PURE__ */ jsxRuntime.jsx(TernSecureContext.Provider, { value: { dynamic: true }, children });
|
|
18
25
|
};
|
|
19
26
|
|
|
20
27
|
exports.TernSecureCtxProvider = TernSecureCtxProvider;
|
|
@@ -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":";;;;;;;;;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}"]}
|
|
@@ -62,9 +62,15 @@ 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(
|
|
66
|
-
|
|
65
|
+
var TernSecureContext = React__default.default.createContext(null);
|
|
66
|
+
TernSecureContext.displayName = "TernSecureContext";
|
|
67
|
+
var useInternalContext = (hookname = "useInternalContext") => {
|
|
67
68
|
const context = React__default.default.useContext(TernSecureContext);
|
|
69
|
+
if (!context) {
|
|
70
|
+
throw new Error(
|
|
71
|
+
`${hookname} must be used within TernSecureClientProvider`
|
|
72
|
+
);
|
|
73
|
+
}
|
|
68
74
|
return context;
|
|
69
75
|
};
|
|
70
76
|
|
|
@@ -77,7 +83,7 @@ function useAuth() {
|
|
|
77
83
|
userId: null,
|
|
78
84
|
error: null
|
|
79
85
|
});
|
|
80
|
-
useInternalContext();
|
|
86
|
+
useInternalContext("useAuth");
|
|
81
87
|
return {
|
|
82
88
|
loading: authState.loading,
|
|
83
89
|
isSignedIn: authState.isSignedIn,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/utils/config.ts","../../../../src/utils/client-init.ts","../../../../src/boundary/TernSecureCtx.tsx","../../../../src/boundary/hooks/use-auth.ts"],"names":["config","initializeApp","getAuth","setPersistence","browserSessionPersistence","getFirestore","getStorage","React","useMemo","useState"],"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;
|
|
1
|
+
{"version":3,"sources":["../../../../src/utils/config.ts","../../../../src/utils/client-init.ts","../../../../src/boundary/TernSecureCtx.tsx","../../../../src/boundary/hooks/use-auth.ts"],"names":["config","initializeApp","getAuth","setPersistence","browserSessionPersistence","getFirestore","getStorage","React","useMemo","useState"],"mappings":"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","file":"use-auth.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 { useEffect, useState, useMemo } from 'react'\r\nimport { TernSecureAuth } from '../../utils/client-init'\r\nimport { useInternalContext } from '../TernSecureCtx'\r\n\r\nexport interface AuthState {\r\n userId: string | null\r\n loading: boolean;\r\n error: Error | null;\r\n isSignedIn: boolean;\r\n}\r\n\r\nexport function useAuth() {\r\n const auth = useMemo(() => TernSecureAuth(), [])\r\n const [authState, setAuthState] = useState<AuthState>({\r\n loading: true,\r\n isSignedIn: false,\r\n userId: null,\r\n error: null\r\n })\r\n\r\n useInternalContext('useAuth')\r\n return {\r\n loading: authState.loading,\r\n isSignedIn: authState.isSignedIn,\r\n userId: authState.userId,\r\n error: authState.error\r\n }\r\n}"]}
|
package/dist/cjs/index.cjs
CHANGED
|
@@ -6,83 +6,113 @@ var firestore$1 = require('firebase/firestore');
|
|
|
6
6
|
var storage$1 = require('firebase/storage');
|
|
7
7
|
var React = require('react');
|
|
8
8
|
var jsxRuntime = require('react/jsx-runtime');
|
|
9
|
+
var dynamic = require('next/dynamic');
|
|
9
10
|
|
|
10
11
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
11
12
|
|
|
12
13
|
var React__default = /*#__PURE__*/_interopDefault(React);
|
|
14
|
+
var dynamic__default = /*#__PURE__*/_interopDefault(dynamic);
|
|
13
15
|
|
|
14
|
-
|
|
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
|
+
};
|
|
15
25
|
|
|
16
26
|
// src/utils/config.ts
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
errors
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
27
|
+
exports.loadFireConfig = void 0; exports.validateConfig = void 0; var initializeConfig;
|
|
28
|
+
var init_config = __esm({
|
|
29
|
+
"src/utils/config.ts"() {
|
|
30
|
+
exports.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
|
+
exports.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 = exports.loadFireConfig();
|
|
62
|
+
const validationResult = exports.validateConfig(config2);
|
|
63
|
+
if (!validationResult.isValid) {
|
|
64
|
+
throw new Error(
|
|
65
|
+
`Firebase configuration validation failed:
|
|
53
66
|
${validationResult.errors.join("\n")}`
|
|
54
|
-
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
return config2;
|
|
70
|
+
};
|
|
55
71
|
}
|
|
56
|
-
|
|
57
|
-
|
|
72
|
+
});
|
|
73
|
+
var config, clientApp, auth, firestore, storage; exports.TernSecureAuth = void 0; exports.TernSecureFirestore = void 0; exports.TernSecureStorage = void 0;
|
|
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 = firestore$1.getFirestore(clientApp);
|
|
82
|
+
storage = storage$1.getStorage(clientApp);
|
|
83
|
+
exports.TernSecureAuth = () => auth;
|
|
84
|
+
exports.TernSecureFirestore = () => firestore;
|
|
85
|
+
exports.TernSecureStorage = () => storage;
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
var TernSecureContext, useInternalContext, TernSecureCtxProvider;
|
|
89
|
+
var init_TernSecureCtx = __esm({
|
|
90
|
+
"src/boundary/TernSecureCtx.tsx"() {
|
|
91
|
+
"use client";
|
|
92
|
+
TernSecureContext = React__default.default.createContext(null);
|
|
93
|
+
TernSecureContext.displayName = "TernSecureContext";
|
|
94
|
+
useInternalContext = (hookname = "useInternalContext") => {
|
|
95
|
+
const context = React__default.default.useContext(TernSecureContext);
|
|
96
|
+
if (!context) {
|
|
97
|
+
throw new Error(
|
|
98
|
+
`${hookname} must be used within TernSecureClientProvider`
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
return context;
|
|
102
|
+
};
|
|
103
|
+
TernSecureCtxProvider = ({
|
|
104
|
+
children
|
|
105
|
+
}) => {
|
|
106
|
+
return /* @__PURE__ */ jsxRuntime.jsx(TernSecureContext.Provider, { value: { dynamic: true }, children });
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
});
|
|
58
110
|
|
|
59
|
-
// src/
|
|
60
|
-
var
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
var firestore = firestore$1.getFirestore(clientApp);
|
|
65
|
-
var storage = storage$1.getStorage(clientApp);
|
|
66
|
-
var TernSecureAuth = () => auth;
|
|
67
|
-
var TernSecureFirestore = () => firestore;
|
|
68
|
-
var TernSecureStorage = () => storage;
|
|
69
|
-
async function signInWithEmail({
|
|
70
|
-
email,
|
|
71
|
-
password
|
|
72
|
-
}) {
|
|
73
|
-
const auth3 = TernSecureAuth();
|
|
74
|
-
return auth$1.signInWithEmailAndPassword(auth3, email, password);
|
|
75
|
-
}
|
|
76
|
-
var TernSecureContext = React__default.default.createContext(void 0);
|
|
77
|
-
var useInternalContext = (hookname) => {
|
|
78
|
-
const context = React__default.default.useContext(TernSecureContext);
|
|
79
|
-
return context;
|
|
80
|
-
};
|
|
81
|
-
var TernSecureCtxProvider = (props) => {
|
|
82
|
-
const { children, options } = props;
|
|
83
|
-
return /* @__PURE__ */ jsxRuntime.jsx(TernSecureContext.Provider, { value: { value: options }, children });
|
|
84
|
-
};
|
|
85
|
-
var auth2 = TernSecureAuth();
|
|
111
|
+
// src/app-router/client/TernSecureProvider.tsx
|
|
112
|
+
var TernSecureProvider_exports = {};
|
|
113
|
+
__export(TernSecureProvider_exports, {
|
|
114
|
+
TernSecureClientProvider: () => TernSecureClientProvider
|
|
115
|
+
});
|
|
86
116
|
function TernSecureClientProvider({ children }) {
|
|
87
117
|
const [authState, setAuthState] = React.useState({
|
|
88
118
|
loading: true,
|
|
@@ -112,18 +142,57 @@ function TernSecureClientProvider({ children }) {
|
|
|
112
142
|
}, []);
|
|
113
143
|
return /* @__PURE__ */ jsxRuntime.jsx(TernSecureCtxProvider, { options: authState, children });
|
|
114
144
|
}
|
|
115
|
-
|
|
116
|
-
|
|
145
|
+
var auth2;
|
|
146
|
+
var init_TernSecureProvider = __esm({
|
|
147
|
+
"src/app-router/client/TernSecureProvider.tsx"() {
|
|
148
|
+
"use client";
|
|
149
|
+
init_client_init();
|
|
150
|
+
init_TernSecureCtx();
|
|
151
|
+
auth2 = exports.TernSecureAuth();
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
// src/index.ts
|
|
156
|
+
init_client_init();
|
|
157
|
+
init_config();
|
|
158
|
+
|
|
159
|
+
// src/app-router/server/auth.ts
|
|
160
|
+
init_client_init();
|
|
161
|
+
async function signInWithEmail({
|
|
162
|
+
email,
|
|
163
|
+
password
|
|
164
|
+
}) {
|
|
165
|
+
const auth3 = exports.TernSecureAuth();
|
|
166
|
+
return auth$1.signInWithEmailAndPassword(auth3, email, password);
|
|
167
|
+
}
|
|
168
|
+
var TernSecureClientProvider2 = dynamic__default.default(
|
|
169
|
+
() => Promise.resolve().then(() => (init_TernSecureProvider(), TernSecureProvider_exports)).then((mod) => mod.TernSecureClientProvider),
|
|
170
|
+
{
|
|
171
|
+
ssr: false,
|
|
172
|
+
loading: () => /* @__PURE__ */ jsxRuntime.jsx(TernSecureLoadingFallback, {})
|
|
173
|
+
}
|
|
174
|
+
);
|
|
175
|
+
function TernSecureLoadingFallback() {
|
|
176
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { "aria-label": "Loading authentication", role: "status", children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: "Loading authentication..." }) });
|
|
117
177
|
}
|
|
178
|
+
function TernSecureProvider({
|
|
179
|
+
children
|
|
180
|
+
}) {
|
|
181
|
+
return /* @__PURE__ */ jsxRuntime.jsx(React__default.default.Suspense, { fallback: /* @__PURE__ */ jsxRuntime.jsx(TernSecureLoadingFallback, {}), children: /* @__PURE__ */ jsxRuntime.jsx(TernSecureClientProvider2, { children }) });
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
// src/boundary/hooks/use-auth.ts
|
|
185
|
+
init_client_init();
|
|
186
|
+
init_TernSecureCtx();
|
|
118
187
|
function useAuth() {
|
|
119
|
-
React.useMemo(() => TernSecureAuth(), []);
|
|
188
|
+
React.useMemo(() => exports.TernSecureAuth(), []);
|
|
120
189
|
const [authState, setAuthState] = React.useState({
|
|
121
190
|
loading: true,
|
|
122
191
|
isSignedIn: false,
|
|
123
192
|
userId: null,
|
|
124
193
|
error: null
|
|
125
194
|
});
|
|
126
|
-
useInternalContext();
|
|
195
|
+
useInternalContext("useAuth");
|
|
127
196
|
return {
|
|
128
197
|
loading: authState.loading,
|
|
129
198
|
isSignedIn: authState.isSignedIn,
|
|
@@ -351,15 +420,8 @@ function SignIn({
|
|
|
351
420
|
}
|
|
352
421
|
|
|
353
422
|
exports.SignIn = SignIn;
|
|
354
|
-
exports.TernSecureAuth = TernSecureAuth;
|
|
355
|
-
exports.TernSecureClientProvider = TernSecureClientProvider;
|
|
356
|
-
exports.TernSecureFirestore = TernSecureFirestore;
|
|
357
423
|
exports.TernSecureProvider = TernSecureProvider;
|
|
358
|
-
exports.TernSecureStorage = TernSecureStorage;
|
|
359
|
-
exports.loadFireConfig = loadFireConfig;
|
|
360
424
|
exports.signInWithEmail = signInWithEmail;
|
|
361
425
|
exports.useAuth = useAuth;
|
|
362
|
-
exports.useInternalContext = useInternalContext;
|
|
363
|
-
exports.validateConfig = validateConfig;
|
|
364
426
|
//# sourceMappingURL=index.cjs.map
|
|
365
427
|
//# sourceMappingURL=index.cjs.map
|
package/dist/cjs/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/config.ts","../../src/utils/client-init.ts","../../src/app-router/server/auth.ts","../../src/boundary/TernSecureCtx.tsx","../../src/app-router/client/TernSecureProvider.tsx","../../src/app-router/server/TernSecureServerProvider.tsx","../../src/boundary/hooks/use-auth.ts","../../src/utils/create-styles.ts","../../src/components/sign-in.tsx"],"names":["config","initializeApp","getAuth","setPersistence","browserSessionPersistence","getFirestore","getStorage","auth","signInWithEmailAndPassword","React","jsx","useState","useEffect","onAuthStateChanged","Suspense","useMemo","styles","jsxs"],"mappings":"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","file":"index.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;","import { TernSecureAuth } from '../../utils/client-init'\r\nimport { signInWithEmailAndPassword, type UserCredential } from 'firebase/auth'\r\n\r\nexport interface SignInCredentials {\r\n email: string\r\n password: string\r\n}\r\n\r\nexport async function signInWithEmail({ \r\n email, \r\n password \r\n}: SignInCredentials): Promise<UserCredential> {\r\n const auth = TernSecureAuth()\r\n return signInWithEmailAndPassword(auth, email, password)\r\n} ","'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}","'use client'\r\n\r\nimport { useEffect, useState, useMemo } from 'react'\r\nimport { TernSecureAuth } from '../../utils/client-init'\r\nimport { useInternalContext } from '../TernSecureCtx'\r\n\r\nexport interface AuthState {\r\n userId: string | null\r\n loading: boolean;\r\n error: Error | null;\r\n isSignedIn: boolean;\r\n}\r\n\r\nexport function useAuth() {\r\n const auth = useMemo(() => TernSecureAuth(), [])\r\n const [authState, setAuthState] = useState<AuthState>({\r\n loading: true,\r\n isSignedIn: false,\r\n userId: null,\r\n error: null\r\n })\r\n\r\n useInternalContext('useAuth')\r\n return {\r\n loading: authState.loading,\r\n isSignedIn: authState.isSignedIn,\r\n userId: authState.userId,\r\n error: authState.error\r\n }\r\n}","'use client'\r\n\r\nconst PREFIX = 'tern'\r\n\r\n// Singleton to track style injection\r\nconst styleInjection = {\r\n isInjected: false,\r\n styleElement: null as HTMLStyleElement | null\r\n}\r\n\r\nexport const defaultClassNames = {\r\n container: `${PREFIX}-container`,\r\n header: `${PREFIX}-header`,\r\n title: `${PREFIX}-title`,\r\n formWrapper: `${PREFIX}-formWrapper`,\r\n formContainer: `${PREFIX}-formContainer`,\r\n form: `${PREFIX}-form`,\r\n label: `${PREFIX}-label`,\r\n input: `${PREFIX}-input`,\r\n button: `${PREFIX}-button`,\r\n error: `${PREFIX}-error`\r\n} as const\r\n\r\n// Create styles once and cache them\r\nfunction createStyleSheet(styles: Record<string, React.CSSProperties>) {\r\n if (typeof window === 'undefined') return defaultClassNames\r\n\r\n // Return early if styles are already injected\r\n if (styleInjection.isInjected) {\r\n return defaultClassNames\r\n }\r\n\r\n // Find existing style element or create new one\r\n let styleElement = document.querySelector<HTMLStyleElement>('[data-tern-secure]')\r\n \r\n if (!styleElement) {\r\n styleElement = document.createElement('style')\r\n styleElement.setAttribute('data-tern-secure', '')\r\n document.head.appendChild(styleElement)\r\n styleInjection.styleElement = styleElement\r\n }\r\n\r\n // Create CSS rules\r\n const cssRules = Object.entries(styles).map(([key, rules]) => {\r\n const className = defaultClassNames[key as keyof typeof defaultClassNames]\r\n const cssProperties = Object.entries(rules).map(([prop, value]) => {\r\n const cssProperty = prop.replace(/([A-Z])/g, '-$1').toLowerCase()\r\n return `${cssProperty}: ${value};`\r\n }).join(' ')\r\n\r\n return `.${className} { ${cssProperties} }`\r\n }).join('\\n')\r\n\r\n // Insert styles only once\r\n styleElement.textContent = cssRules\r\n styleInjection.isInjected = true\r\n\r\n return defaultClassNames\r\n}\r\n\r\n// Style configuration\r\nexport const styleConfig = {\r\n container: {\r\n display: 'flex',\r\n minHeight: '100%',\r\n flex: '1',\r\n flexDirection: 'column',\r\n justifyContent: 'center',\r\n padding: '3rem 1.5rem'\r\n },\r\n header: {\r\n margin: '0 auto',\r\n width: '100%',\r\n maxWidth: '28rem'\r\n },\r\n title: {\r\n marginTop: '1.5rem',\r\n textAlign: 'center',\r\n fontSize: '1.875rem',\r\n fontWeight: '700',\r\n lineHeight: '2.25rem',\r\n letterSpacing: '-0.025em',\r\n color: 'var(--tern-text-primary, #111827)'\r\n },\r\n formWrapper: {\r\n marginTop: '2.5rem',\r\n margin: '0 auto',\r\n width: '100%',\r\n maxWidth: '30rem'\r\n },\r\n formContainer: {\r\n padding: '3rem 1.5rem',\r\n boxShadow: '0 1px 3px 0 rgb(0 0 0 / 0.1)',\r\n borderRadius: '0.5rem',\r\n backgroundColor: 'var(--tern-background, white)'\r\n },\r\n form: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: '1rem'\r\n },\r\n label: {\r\n display: 'block',\r\n fontSize: '0.875rem',\r\n fontWeight: '500',\r\n color: 'var(--tern-text-secondary, #374151)'\r\n },\r\n input: {\r\n marginTop: '0.25rem',\r\n display: 'block',\r\n width: '100%',\r\n padding: '0.5rem 0.75rem',\r\n borderRadius: '0.375rem',\r\n border: '1px solid var(--tern-border, #D1D5DB)',\r\n backgroundColor: 'var(--tern-input-background, white)',\r\n color: 'var(--tern-text-primary, #111827)'\r\n },\r\n button: {\r\n display: 'flex',\r\n width: '100%',\r\n justifyContent: 'center',\r\n padding: '0.5rem 1rem',\r\n fontSize: '0.875rem',\r\n fontWeight: '500',\r\n color: 'white',\r\n backgroundColor: 'var(--tern-primary, #2563EB)',\r\n border: 'none',\r\n borderRadius: '0.375rem',\r\n cursor: 'pointer'\r\n },\r\n error: {\r\n color: 'var(--tern-error, #DC2626)',\r\n fontSize: '0.875rem'\r\n }\r\n} as const\r\n\r\n// Export pre-created styles\r\nexport const styles = createStyleSheet(styleConfig)\r\n\r\n","import * as React from 'react'\r\nimport { useState } from 'react'\r\nimport { signInWithEmail } from '../app-router/server/auth'\r\nimport { styles } from '../utils/create-styles'\r\n\r\nexport interface SignInProps {\r\n onSuccess?: () => void\r\n onError?: (error: Error) => void\r\n redirectUrl?: string\r\n className?: string\r\n style?: React.CSSProperties\r\n customStyles?: {\r\n container?: string\r\n header?: string\r\n title?: string\r\n formWrapper?: string\r\n formContainer?: string\r\n form?: string\r\n input?: string\r\n button?: string\r\n errorText?: string\r\n label?: string\r\n }\r\n}\r\n\r\nexport function SignIn({ \r\n onSuccess, \r\n onError, \r\n redirectUrl,\r\n className = '',\r\n style,\r\n customStyles = {}\r\n}: SignInProps) {\r\n const [email, setEmail] = useState('')\r\n const [password, setPassword] = useState('')\r\n const [loading, setLoading] = useState(false)\r\n const [error, setError] = useState('')\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault()\r\n setLoading(true)\r\n setError('')\r\n\r\n try {\r\n await signInWithEmail({ email, password })\r\n onSuccess?.()\r\n \r\n if (redirectUrl) {\r\n window.location.href = redirectUrl\r\n }\r\n } catch (err) {\r\n const errorMessage = err instanceof Error ? err.message : 'Failed to sign in'\r\n setError(errorMessage)\r\n onError?.(err instanceof Error ? err : new Error('Failed to sign in'))\r\n } finally {\r\n setLoading(false)\r\n }\r\n }\r\n\r\n return (\r\n <div className={`${styles.container} ${customStyles.container || ''}`} style={style}>\r\n <div className={`${styles.header} ${customStyles.header || ''}`}>\r\n <h2 className={`${styles.title} ${customStyles.title || ''}`}>\r\n Sign in to your account\r\n </h2>\r\n </div>\r\n \r\n <div className={`${styles.formWrapper} ${customStyles.formWrapper || ''}`}>\r\n <div className={`${styles.formContainer} ${customStyles.formContainer || ''}`}>\r\n <form \r\n onSubmit={handleSubmit} \r\n className={`${styles.form} ${customStyles.form || ''} ${className}`}\r\n role=\"form\"\r\n aria-label=\"Sign in form\"\r\n >\r\n {error && (\r\n <div \r\n className={`${styles.error} ${customStyles.errorText || ''}`}\r\n role=\"alert\"\r\n aria-live=\"polite\"\r\n >\r\n {error}\r\n </div>\r\n )}\r\n <div>\r\n <label htmlFor=\"email\" className={`${styles.label} ${customStyles.label || ''}`}>\r\n Email\r\n </label>\r\n <input\r\n id=\"email\"\r\n type=\"email\"\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n placeholder=\"Enter your email\"\r\n required\r\n className={`${styles.input} ${customStyles.input || ''}`}\r\n disabled={loading}\r\n aria-required=\"true\"\r\n aria-invalid={!!error}\r\n />\r\n </div>\r\n <div>\r\n <label htmlFor=\"password\" className={`${styles.label} ${customStyles.label || ''}`}>\r\n Password\r\n </label>\r\n <input\r\n id=\"password\"\r\n type=\"password\"\r\n value={password}\r\n onChange={(e) => setPassword(e.target.value)}\r\n placeholder=\"Enter your password\"\r\n required\r\n className={`${styles.input} ${customStyles.input || ''}`}\r\n disabled={loading}\r\n aria-required=\"true\"\r\n aria-invalid={!!error}\r\n />\r\n </div>\r\n <button \r\n type=\"submit\" \r\n disabled={loading}\r\n className={`${styles.button} ${customStyles.button || ''}`}\r\n data-testid=\"sign-in-submit\"\r\n >\r\n {loading ? 'Signing in...' : 'Sign in'}\r\n </button>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n}\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/index.ts","../../src/app-router/server/auth.ts","../../src/app-router/server/TernSecureServerProvider.tsx","../../src/boundary/hooks/use-auth.ts","../../src/utils/create-styles.ts","../../src/components/sign-in.tsx"],"names":["loadFireConfig","validateConfig","config","TernSecureAuth","TernSecureFirestore","TernSecureStorage","initializeApp","getAuth","setPersistence","browserSessionPersistence","getFirestore","getStorage","React","jsx","useState","useEffect","onAuthStateChanged","auth","signInWithEmailAndPassword","TernSecureClientProvider","dynamic","useMemo","styles","jsxs"],"mappings":"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","file":"index.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}","export { TernSecureAuth, TernSecureFirestore, TernSecureStorage } from './utils/client-init'\r\nexport { loadFireConfig, validateConfig } from './utils/config'\r\nexport { signInWithEmail } from './app-router/server/auth'\r\n//export { useInternalContext } from './boundary/TernSecureCtx'\r\n//export { TernSecureClientProvider } from './app-router/client/TernSecureProvider'\r\nexport { TernSecureProvider } from './app-router/server/TernSecureServerProvider'\r\nexport { useAuth } from './boundary/hooks/use-auth' \r\nexport { SignIn } from './components/sign-in'","import { TernSecureAuth } from '../../utils/client-init'\r\nimport { signInWithEmailAndPassword, type UserCredential } from 'firebase/auth'\r\n\r\nexport interface SignInCredentials {\r\n email: string\r\n password: string\r\n}\r\n\r\nexport async function signInWithEmail({ \r\n email, \r\n password \r\n}: SignInCredentials): Promise<UserCredential> {\r\n const auth = TernSecureAuth()\r\n return signInWithEmailAndPassword(auth, email, password)\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 ssr: false,\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 TernSecureProvider({ \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}","'use client'\r\n\r\nimport { useEffect, useState, useMemo } from 'react'\r\nimport { TernSecureAuth } from '../../utils/client-init'\r\nimport { useInternalContext } from '../TernSecureCtx'\r\n\r\nexport interface AuthState {\r\n userId: string | null\r\n loading: boolean;\r\n error: Error | null;\r\n isSignedIn: boolean;\r\n}\r\n\r\nexport function useAuth() {\r\n const auth = useMemo(() => TernSecureAuth(), [])\r\n const [authState, setAuthState] = useState<AuthState>({\r\n loading: true,\r\n isSignedIn: false,\r\n userId: null,\r\n error: null\r\n })\r\n\r\n useInternalContext('useAuth')\r\n return {\r\n loading: authState.loading,\r\n isSignedIn: authState.isSignedIn,\r\n userId: authState.userId,\r\n error: authState.error\r\n }\r\n}","'use client'\r\n\r\nconst PREFIX = 'tern'\r\n\r\n// Singleton to track style injection\r\nconst styleInjection = {\r\n isInjected: false,\r\n styleElement: null as HTMLStyleElement | null\r\n}\r\n\r\nexport const defaultClassNames = {\r\n container: `${PREFIX}-container`,\r\n header: `${PREFIX}-header`,\r\n title: `${PREFIX}-title`,\r\n formWrapper: `${PREFIX}-formWrapper`,\r\n formContainer: `${PREFIX}-formContainer`,\r\n form: `${PREFIX}-form`,\r\n label: `${PREFIX}-label`,\r\n input: `${PREFIX}-input`,\r\n button: `${PREFIX}-button`,\r\n error: `${PREFIX}-error`\r\n} as const\r\n\r\n// Create styles once and cache them\r\nfunction createStyleSheet(styles: Record<string, React.CSSProperties>) {\r\n if (typeof window === 'undefined') return defaultClassNames\r\n\r\n // Return early if styles are already injected\r\n if (styleInjection.isInjected) {\r\n return defaultClassNames\r\n }\r\n\r\n // Find existing style element or create new one\r\n let styleElement = document.querySelector<HTMLStyleElement>('[data-tern-secure]')\r\n \r\n if (!styleElement) {\r\n styleElement = document.createElement('style')\r\n styleElement.setAttribute('data-tern-secure', '')\r\n document.head.appendChild(styleElement)\r\n styleInjection.styleElement = styleElement\r\n }\r\n\r\n // Create CSS rules\r\n const cssRules = Object.entries(styles).map(([key, rules]) => {\r\n const className = defaultClassNames[key as keyof typeof defaultClassNames]\r\n const cssProperties = Object.entries(rules).map(([prop, value]) => {\r\n const cssProperty = prop.replace(/([A-Z])/g, '-$1').toLowerCase()\r\n return `${cssProperty}: ${value};`\r\n }).join(' ')\r\n\r\n return `.${className} { ${cssProperties} }`\r\n }).join('\\n')\r\n\r\n // Insert styles only once\r\n styleElement.textContent = cssRules\r\n styleInjection.isInjected = true\r\n\r\n return defaultClassNames\r\n}\r\n\r\n// Style configuration\r\nexport const styleConfig = {\r\n container: {\r\n display: 'flex',\r\n minHeight: '100%',\r\n flex: '1',\r\n flexDirection: 'column',\r\n justifyContent: 'center',\r\n padding: '3rem 1.5rem'\r\n },\r\n header: {\r\n margin: '0 auto',\r\n width: '100%',\r\n maxWidth: '28rem'\r\n },\r\n title: {\r\n marginTop: '1.5rem',\r\n textAlign: 'center',\r\n fontSize: '1.875rem',\r\n fontWeight: '700',\r\n lineHeight: '2.25rem',\r\n letterSpacing: '-0.025em',\r\n color: 'var(--tern-text-primary, #111827)'\r\n },\r\n formWrapper: {\r\n marginTop: '2.5rem',\r\n margin: '0 auto',\r\n width: '100%',\r\n maxWidth: '30rem'\r\n },\r\n formContainer: {\r\n padding: '3rem 1.5rem',\r\n boxShadow: '0 1px 3px 0 rgb(0 0 0 / 0.1)',\r\n borderRadius: '0.5rem',\r\n backgroundColor: 'var(--tern-background, white)'\r\n },\r\n form: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: '1rem'\r\n },\r\n label: {\r\n display: 'block',\r\n fontSize: '0.875rem',\r\n fontWeight: '500',\r\n color: 'var(--tern-text-secondary, #374151)'\r\n },\r\n input: {\r\n marginTop: '0.25rem',\r\n display: 'block',\r\n width: '100%',\r\n padding: '0.5rem 0.75rem',\r\n borderRadius: '0.375rem',\r\n border: '1px solid var(--tern-border, #D1D5DB)',\r\n backgroundColor: 'var(--tern-input-background, white)',\r\n color: 'var(--tern-text-primary, #111827)'\r\n },\r\n button: {\r\n display: 'flex',\r\n width: '100%',\r\n justifyContent: 'center',\r\n padding: '0.5rem 1rem',\r\n fontSize: '0.875rem',\r\n fontWeight: '500',\r\n color: 'white',\r\n backgroundColor: 'var(--tern-primary, #2563EB)',\r\n border: 'none',\r\n borderRadius: '0.375rem',\r\n cursor: 'pointer'\r\n },\r\n error: {\r\n color: 'var(--tern-error, #DC2626)',\r\n fontSize: '0.875rem'\r\n }\r\n} as const\r\n\r\n// Export pre-created styles\r\nexport const styles = createStyleSheet(styleConfig)\r\n\r\n","import * as React from 'react'\r\nimport { useState } from 'react'\r\nimport { signInWithEmail } from '../app-router/server/auth'\r\nimport { styles } from '../utils/create-styles'\r\n\r\nexport interface SignInProps {\r\n onSuccess?: () => void\r\n onError?: (error: Error) => void\r\n redirectUrl?: string\r\n className?: string\r\n style?: React.CSSProperties\r\n customStyles?: {\r\n container?: string\r\n header?: string\r\n title?: string\r\n formWrapper?: string\r\n formContainer?: string\r\n form?: string\r\n input?: string\r\n button?: string\r\n errorText?: string\r\n label?: string\r\n }\r\n}\r\n\r\nexport function SignIn({ \r\n onSuccess, \r\n onError, \r\n redirectUrl,\r\n className = '',\r\n style,\r\n customStyles = {}\r\n}: SignInProps) {\r\n const [email, setEmail] = useState('')\r\n const [password, setPassword] = useState('')\r\n const [loading, setLoading] = useState(false)\r\n const [error, setError] = useState('')\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault()\r\n setLoading(true)\r\n setError('')\r\n\r\n try {\r\n await signInWithEmail({ email, password })\r\n onSuccess?.()\r\n \r\n if (redirectUrl) {\r\n window.location.href = redirectUrl\r\n }\r\n } catch (err) {\r\n const errorMessage = err instanceof Error ? err.message : 'Failed to sign in'\r\n setError(errorMessage)\r\n onError?.(err instanceof Error ? err : new Error('Failed to sign in'))\r\n } finally {\r\n setLoading(false)\r\n }\r\n }\r\n\r\n return (\r\n <div className={`${styles.container} ${customStyles.container || ''}`} style={style}>\r\n <div className={`${styles.header} ${customStyles.header || ''}`}>\r\n <h2 className={`${styles.title} ${customStyles.title || ''}`}>\r\n Sign in to your account\r\n </h2>\r\n </div>\r\n \r\n <div className={`${styles.formWrapper} ${customStyles.formWrapper || ''}`}>\r\n <div className={`${styles.formContainer} ${customStyles.formContainer || ''}`}>\r\n <form \r\n onSubmit={handleSubmit} \r\n className={`${styles.form} ${customStyles.form || ''} ${className}`}\r\n role=\"form\"\r\n aria-label=\"Sign in form\"\r\n >\r\n {error && (\r\n <div \r\n className={`${styles.error} ${customStyles.errorText || ''}`}\r\n role=\"alert\"\r\n aria-live=\"polite\"\r\n >\r\n {error}\r\n </div>\r\n )}\r\n <div>\r\n <label htmlFor=\"email\" className={`${styles.label} ${customStyles.label || ''}`}>\r\n Email\r\n </label>\r\n <input\r\n id=\"email\"\r\n type=\"email\"\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n placeholder=\"Enter your email\"\r\n required\r\n className={`${styles.input} ${customStyles.input || ''}`}\r\n disabled={loading}\r\n aria-required=\"true\"\r\n aria-invalid={!!error}\r\n />\r\n </div>\r\n <div>\r\n <label htmlFor=\"password\" className={`${styles.label} ${customStyles.label || ''}`}>\r\n Password\r\n </label>\r\n <input\r\n id=\"password\"\r\n type=\"password\"\r\n value={password}\r\n onChange={(e) => setPassword(e.target.value)}\r\n placeholder=\"Enter your password\"\r\n required\r\n className={`${styles.input} ${customStyles.input || ''}`}\r\n disabled={loading}\r\n aria-required=\"true\"\r\n aria-invalid={!!error}\r\n />\r\n </div>\r\n <button \r\n type=\"submit\" \r\n disabled={loading}\r\n className={`${styles.button} ${customStyles.button || ''}`}\r\n data-testid=\"sign-in-submit\"\r\n >\r\n {loading ? 'Signing in...' : 'Sign in'}\r\n </button>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\n"]}
|
|
@@ -1,6 +1,41 @@
|
|
|
1
|
-
|
|
2
|
-
import '../../chunk-
|
|
3
|
-
import '../../chunk-FVV74XVR.js';
|
|
1
|
+
import { TernSecureCtxProvider } from '../../chunk-RAZTKM22.js';
|
|
2
|
+
import { TernSecureAuth } from '../../chunk-FVV74XVR.js';
|
|
4
3
|
import '../../chunk-UHGBSUM6.js';
|
|
4
|
+
import { useState, useEffect } from 'react';
|
|
5
|
+
import { onAuthStateChanged } from 'firebase/auth';
|
|
6
|
+
import { jsx } from 'react/jsx-runtime';
|
|
7
|
+
|
|
8
|
+
var auth = TernSecureAuth();
|
|
9
|
+
function TernSecureClientProvider({ children }) {
|
|
10
|
+
const [authState, setAuthState] = useState({
|
|
11
|
+
loading: true,
|
|
12
|
+
isSignedIn: false,
|
|
13
|
+
userId: null,
|
|
14
|
+
error: null
|
|
15
|
+
});
|
|
16
|
+
useEffect(() => {
|
|
17
|
+
const unsubscribe = onAuthStateChanged(auth, (user) => {
|
|
18
|
+
if (user) {
|
|
19
|
+
setAuthState({
|
|
20
|
+
loading: false,
|
|
21
|
+
isSignedIn: true,
|
|
22
|
+
userId: user.uid,
|
|
23
|
+
error: null
|
|
24
|
+
});
|
|
25
|
+
} else {
|
|
26
|
+
setAuthState({
|
|
27
|
+
loading: false,
|
|
28
|
+
isSignedIn: false,
|
|
29
|
+
userId: null,
|
|
30
|
+
error: null
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
return () => unsubscribe();
|
|
35
|
+
}, []);
|
|
36
|
+
return /* @__PURE__ */ jsx(TernSecureCtxProvider, { options: authState, children });
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export { TernSecureClientProvider };
|
|
5
40
|
//# sourceMappingURL=TernSecureProvider.js.map
|
|
6
41
|
//# sourceMappingURL=TernSecureProvider.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"TernSecureProvider.js"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/app-router/client/TernSecureProvider.tsx"],"names":[],"mappings":";;;;;;;AAkBA,IAAM,OAAO,cAAe,EAAA;AAErB,SAAS,wBAAA,CAAyB,EAAE,QAAA,EAAmC,EAAA;AAC5E,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,QAA0B,CAAA;AAAA,IAC1D,OAAS,EAAA,IAAA;AAAA,IACT,UAAY,EAAA,KAAA;AAAA,IACZ,MAAQ,EAAA,IAAA;AAAA,IACR,KAAO,EAAA;AAAA,GACR,CAAA;AACH,EAAA,SAAA,CAAU,MAAM;AACZ,IAAA,MAAM,WAAc,GAAA,kBAAA,CAAmB,IAAM,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,EAAA,uBACG,GAAA,CAAA,qBAAA,EAAA,EAAsB,OAAS,EAAA,SAAA,EAC7B,QACH,EAAA,CAAA;AAEJ","file":"TernSecureProvider.js","sourcesContent":["'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,9 +1,14 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
-
import
|
|
2
|
+
import React__default from 'react';
|
|
3
3
|
|
|
4
|
-
interface
|
|
5
|
-
children: ReactNode;
|
|
4
|
+
interface TernSecureServerProviderProps {
|
|
5
|
+
children: React__default.ReactNode;
|
|
6
6
|
}
|
|
7
|
-
|
|
7
|
+
/**
|
|
8
|
+
* Server Provider for TernSecure
|
|
9
|
+
* Safe to use in server components
|
|
10
|
+
* Automatically handles client/server boundary
|
|
11
|
+
*/
|
|
12
|
+
declare function TernSecureProvider({ children }: TernSecureServerProviderProps): react_jsx_runtime.JSX.Element;
|
|
8
13
|
|
|
9
14
|
export { TernSecureProvider };
|
|
@@ -1,7 +1,3 @@
|
|
|
1
|
-
export { TernSecureProvider } from '../../chunk-
|
|
2
|
-
import '../../chunk-F7XKLY6Y.js';
|
|
3
|
-
import '../../chunk-I2PGODCQ.js';
|
|
4
|
-
import '../../chunk-FVV74XVR.js';
|
|
5
|
-
import '../../chunk-UHGBSUM6.js';
|
|
1
|
+
export { TernSecureProvider } from '../../chunk-BMLKEIDV.js';
|
|
6
2
|
//# sourceMappingURL=TernSecureServerProvider.js.map
|
|
7
3
|
//# sourceMappingURL=TernSecureServerProvider.js.map
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import React__default from 'react';
|
|
2
2
|
|
|
3
|
-
type
|
|
4
|
-
|
|
5
|
-
loading: boolean;
|
|
6
|
-
error: string | null;
|
|
7
|
-
isSignedIn: boolean;
|
|
3
|
+
type TernSecureCtxValue = {
|
|
4
|
+
dynamic: boolean;
|
|
8
5
|
};
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
}
|
|
12
|
-
declare const
|
|
13
|
-
|
|
14
|
-
|
|
6
|
+
type TernSecureProviderProps = React__default.PropsWithChildren<{
|
|
7
|
+
options?: unknown;
|
|
8
|
+
}>;
|
|
9
|
+
declare const useInternalContext: (hookname?: string) => TernSecureCtxValue;
|
|
10
|
+
/**
|
|
11
|
+
* Provider component for TernSecure
|
|
12
|
+
* Must be used in client components only
|
|
13
|
+
*/
|
|
14
|
+
declare const TernSecureCtxProvider: React__default.FC<TernSecureProviderProps>;
|
|
15
15
|
|
|
16
|
-
export { TernSecureCtxProvider, useInternalContext };
|
|
16
|
+
export { TernSecureCtxProvider, type TernSecureCtxValue, type TernSecureProviderProps, useInternalContext };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { useAuth } from '../../chunk-
|
|
2
|
-
import '../../chunk-
|
|
1
|
+
export { useAuth } from '../../chunk-D4W62QPB.js';
|
|
2
|
+
import '../../chunk-RAZTKM22.js';
|
|
3
3
|
import '../../chunk-FVV74XVR.js';
|
|
4
4
|
import '../../chunk-UHGBSUM6.js';
|
|
5
5
|
//# sourceMappingURL=use-auth.js.map
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import dynamic from 'next/dynamic';
|
|
3
|
+
import { jsx } from 'react/jsx-runtime';
|
|
4
|
+
|
|
5
|
+
// src/app-router/server/TernSecureServerProvider.tsx
|
|
6
|
+
var TernSecureClientProvider = dynamic(
|
|
7
|
+
() => import('./app-router/client/TernSecureProvider.js').then((mod) => mod.TernSecureClientProvider),
|
|
8
|
+
{
|
|
9
|
+
ssr: false,
|
|
10
|
+
loading: () => /* @__PURE__ */ jsx(TernSecureLoadingFallback, {})
|
|
11
|
+
}
|
|
12
|
+
);
|
|
13
|
+
function TernSecureLoadingFallback() {
|
|
14
|
+
return /* @__PURE__ */ jsx("div", { "aria-label": "Loading authentication", role: "status", children: /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Loading authentication..." }) });
|
|
15
|
+
}
|
|
16
|
+
function TernSecureProvider({
|
|
17
|
+
children
|
|
18
|
+
}) {
|
|
19
|
+
return /* @__PURE__ */ jsx(React.Suspense, { fallback: /* @__PURE__ */ jsx(TernSecureLoadingFallback, {}), children: /* @__PURE__ */ jsx(TernSecureClientProvider, { children }) });
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export { TernSecureProvider };
|
|
23
|
+
//# sourceMappingURL=chunk-BMLKEIDV.js.map
|
|
24
|
+
//# sourceMappingURL=chunk-BMLKEIDV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/app-router/server/TernSecureServerProvider.tsx"],"names":[],"mappings":";;;;;AAKA,IAAM,wBAA2B,GAAA,OAAA;AAAA,EAC/B,MAAM,OAAO,2CAA8B,EAAE,IAAK,CAAA,CAAA,GAAA,KAAO,IAAI,wBAAwB,CAAA;AAAA,EACrF;AAAA,IACE,GAAK,EAAA,KAAA;AAAA,IACL,OAAA,EAAS,sBAAM,GAAA,CAAC,yBAA0B,EAAA,EAAA;AAAA;AAE9C,CAAA;AAGA,SAAS,yBAA4B,GAAA;AACnC,EACE,uBAAA,GAAA,CAAC,KAAI,EAAA,EAAA,YAAA,EAAW,wBAAyB,EAAA,IAAA,EAAK,QAC5C,EAAA,QAAA,kBAAA,GAAA,CAAC,MAAK,EAAA,EAAA,SAAA,EAAU,SAAU,EAAA,QAAA,EAAA,2BAAA,EAAyB,CACrD,EAAA,CAAA;AAEJ;AAWO,SAAS,kBAAmB,CAAA;AAAA,EACjC;AACF,CAAkC,EAAA;AAChC,EACE,uBAAA,GAAA,CAAC,KAAM,CAAA,QAAA,EAAN,EAAe,QAAA,kBAAW,GAAA,CAAA,yBAAA,EAAA,EAA0B,CACnD,EAAA,QAAA,kBAAA,GAAA,CAAC,wBACE,EAAA,EAAA,QAAA,EACH,CACF,EAAA,CAAA;AAEJ","file":"chunk-BMLKEIDV.js","sourcesContent":["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 ssr: false,\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 TernSecureProvider({ \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}"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { useInternalContext } from './chunk-
|
|
1
|
+
import { useInternalContext } from './chunk-RAZTKM22.js';
|
|
2
2
|
import { TernSecureAuth } from './chunk-FVV74XVR.js';
|
|
3
3
|
import { useMemo, useState } from 'react';
|
|
4
4
|
|
|
@@ -20,5 +20,5 @@ function useAuth() {
|
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
export { useAuth };
|
|
23
|
-
//# sourceMappingURL=chunk-
|
|
24
|
-
//# sourceMappingURL=chunk-
|
|
23
|
+
//# sourceMappingURL=chunk-D4W62QPB.js.map
|
|
24
|
+
//# sourceMappingURL=chunk-D4W62QPB.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/boundary/hooks/use-auth.ts"],"names":[],"mappings":";;;;AAaO,SAAS,OAAU,GAAA;AACxB,EAAa,OAAQ,CAAA,MAAM,cAAe,EAAA,EAAG,EAAE;AAC/C,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,QAAoB,CAAA;AAAA,IACpD,OAAS,EAAA,IAAA;AAAA,IACT,UAAY,EAAA,KAAA;AAAA,IACZ,MAAQ,EAAA,IAAA;AAAA,IACR,KAAO,EAAA;AAAA,GACR,CAAA;AAED,EAAA,kBAAA,CAAmB,SAAS,CAAA;AAC5B,EAAO,OAAA;AAAA,IACL,SAAS,SAAU,CAAA,OAAA;AAAA,IACnB,YAAY,SAAU,CAAA,UAAA;AAAA,IACtB,QAAQ,SAAU,CAAA,MAAA;AAAA,IAClB,OAAO,SAAU,CAAA;AAAA,GACnB;AACF","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../../src/boundary/hooks/use-auth.ts"],"names":[],"mappings":";;;;AAaO,SAAS,OAAU,GAAA;AACxB,EAAa,OAAQ,CAAA,MAAM,cAAe,EAAA,EAAG,EAAE;AAC/C,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,QAAoB,CAAA;AAAA,IACpD,OAAS,EAAA,IAAA;AAAA,IACT,UAAY,EAAA,KAAA;AAAA,IACZ,MAAQ,EAAA,IAAA;AAAA,IACR,KAAO,EAAA;AAAA,GACR,CAAA;AAED,EAAA,kBAAA,CAAmB,SAAS,CAAA;AAC5B,EAAO,OAAA;AAAA,IACL,SAAS,SAAU,CAAA,OAAA;AAAA,IACnB,YAAY,SAAU,CAAA,UAAA;AAAA,IACtB,QAAQ,SAAU,CAAA,MAAA;AAAA,IAClB,OAAO,SAAU,CAAA;AAAA,GACnB;AACF","file":"chunk-D4W62QPB.js","sourcesContent":["'use client'\r\n\r\nimport { useEffect, useState, useMemo } from 'react'\r\nimport { TernSecureAuth } from '../../utils/client-init'\r\nimport { useInternalContext } from '../TernSecureCtx'\r\n\r\nexport interface AuthState {\r\n userId: string | null\r\n loading: boolean;\r\n error: Error | null;\r\n isSignedIn: boolean;\r\n}\r\n\r\nexport function useAuth() {\r\n const auth = useMemo(() => TernSecureAuth(), [])\r\n const [authState, setAuthState] = useState<AuthState>({\r\n loading: true,\r\n isSignedIn: false,\r\n userId: null,\r\n error: null\r\n })\r\n\r\n useInternalContext('useAuth')\r\n return {\r\n loading: authState.loading,\r\n isSignedIn: authState.isSignedIn,\r\n userId: authState.userId,\r\n error: authState.error\r\n }\r\n}"]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { jsx } from 'react/jsx-runtime';
|
|
3
|
+
|
|
4
|
+
// src/boundary/TernSecureCtx.tsx
|
|
5
|
+
var TernSecureContext = React.createContext(null);
|
|
6
|
+
TernSecureContext.displayName = "TernSecureContext";
|
|
7
|
+
var useInternalContext = (hookname = "useInternalContext") => {
|
|
8
|
+
const context = React.useContext(TernSecureContext);
|
|
9
|
+
if (!context) {
|
|
10
|
+
throw new Error(
|
|
11
|
+
`${hookname} must be used within TernSecureClientProvider`
|
|
12
|
+
);
|
|
13
|
+
}
|
|
14
|
+
return context;
|
|
15
|
+
};
|
|
16
|
+
var TernSecureCtxProvider = ({
|
|
17
|
+
children
|
|
18
|
+
}) => {
|
|
19
|
+
return /* @__PURE__ */ jsx(TernSecureContext.Provider, { value: { dynamic: true }, children });
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export { TernSecureCtxProvider, useInternalContext };
|
|
23
|
+
//# sourceMappingURL=chunk-RAZTKM22.js.map
|
|
24
|
+
//# sourceMappingURL=chunk-RAZTKM22.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/boundary/TernSecureCtx.tsx"],"names":[],"mappings":";;;;AAcA,IAAM,iBAAA,GAAoB,KAAM,CAAA,aAAA,CAAyC,IAAI,CAAA;AAG7E,iBAAA,CAAkB,WAAc,GAAA,mBAAA;AAE1B,IAAA,kBAAA,GAAqB,CAAC,QAAA,GAAmB,oBAAyB,KAAA;AAEtE,EAAM,MAAA,OAAA,GAAU,KAAM,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,uBAAA,GAAA,CAAC,kBAAkB,QAAlB,EAAA,EAA2B,OAAO,EAAE,OAAA,EAAS,IAAK,EAAA,EAChD,QACH,EAAA,CAAA;AAEJ","file":"chunk-RAZTKM22.js","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}"]}
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
export { TernSecureAuth, TernSecureFirestore, TernSecureStorage } from './utils/client-init.js';
|
|
2
2
|
export { loadFireConfig, validateConfig } from './utils/config.js';
|
|
3
3
|
export { signInWithEmail } from './app-router/server/auth.js';
|
|
4
|
-
export { useInternalContext } from './boundary/TernSecureCtx.js';
|
|
5
|
-
export { TernSecureClientProvider } from './app-router/client/TernSecureProvider.js';
|
|
6
4
|
export { TernSecureProvider } from './app-router/server/TernSecureServerProvider.js';
|
|
7
5
|
export { useAuth } from './boundary/hooks/use-auth.js';
|
|
8
6
|
export { SignIn } from './components/sign-in.js';
|
|
@@ -12,5 +10,5 @@ import '@firebase/auth';
|
|
|
12
10
|
import './types.js';
|
|
13
11
|
import 'firebase/app';
|
|
14
12
|
import 'firebase/auth';
|
|
15
|
-
import 'react';
|
|
16
13
|
import 'react/jsx-runtime';
|
|
14
|
+
import 'react';
|
package/dist/esm/index.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
export { TernSecureProvider } from './chunk-
|
|
2
|
-
export {
|
|
3
|
-
|
|
4
|
-
export { useInternalContext } from './chunk-I2PGODCQ.js';
|
|
1
|
+
export { TernSecureProvider } from './chunk-BMLKEIDV.js';
|
|
2
|
+
export { useAuth } from './chunk-D4W62QPB.js';
|
|
3
|
+
import './chunk-RAZTKM22.js';
|
|
5
4
|
export { SignIn } from './chunk-EIOZNLP2.js';
|
|
6
5
|
export { signInWithEmail } from './chunk-4XFIX4FL.js';
|
|
7
6
|
export { TernSecureAuth, TernSecureFirestore, TernSecureStorage } from './chunk-FVV74XVR.js';
|
package/package.json
CHANGED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { TernSecureClientProvider } from './chunk-F7XKLY6Y.js';
|
|
2
|
-
import { Suspense } from 'react';
|
|
3
|
-
import { jsx } from 'react/jsx-runtime';
|
|
4
|
-
|
|
5
|
-
function TernSecureProvider({ children }) {
|
|
6
|
-
return /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx("div", { children: "Loading..." }), children: /* @__PURE__ */ jsx(TernSecureClientProvider, { children }) });
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
export { TernSecureProvider };
|
|
10
|
-
//# sourceMappingURL=chunk-3D5IN6EL.js.map
|
|
11
|
-
//# sourceMappingURL=chunk-3D5IN6EL.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/app-router/server/TernSecureServerProvider.tsx"],"names":[],"mappings":";;;;AAOO,SAAS,kBAAA,CAAmB,EAAE,QAAA,EAAqC,EAAA;AACxE,EACE,uBAAA,GAAA,CAAC,QAAS,EAAA,EAAA,QAAA,kBAAW,GAAA,CAAA,KAAA,EAAA,EAAI,wBAAU,CACjC,EAAA,QAAA,kBAAA,GAAA,CAAC,wBACE,EAAA,EAAA,QAAA,EACH,CACF,EAAA,CAAA;AAEJ","file":"chunk-3D5IN6EL.js","sourcesContent":["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}"]}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import { TernSecureCtxProvider } from './chunk-I2PGODCQ.js';
|
|
2
|
-
import { TernSecureAuth } from './chunk-FVV74XVR.js';
|
|
3
|
-
import { useState, useEffect } from 'react';
|
|
4
|
-
import { onAuthStateChanged } from 'firebase/auth';
|
|
5
|
-
import { jsx } from 'react/jsx-runtime';
|
|
6
|
-
|
|
7
|
-
var auth = TernSecureAuth();
|
|
8
|
-
function TernSecureClientProvider({ children }) {
|
|
9
|
-
const [authState, setAuthState] = useState({
|
|
10
|
-
loading: true,
|
|
11
|
-
isSignedIn: false,
|
|
12
|
-
userId: null,
|
|
13
|
-
error: null
|
|
14
|
-
});
|
|
15
|
-
useEffect(() => {
|
|
16
|
-
const unsubscribe = onAuthStateChanged(auth, (user) => {
|
|
17
|
-
if (user) {
|
|
18
|
-
setAuthState({
|
|
19
|
-
loading: false,
|
|
20
|
-
isSignedIn: true,
|
|
21
|
-
userId: user.uid,
|
|
22
|
-
error: null
|
|
23
|
-
});
|
|
24
|
-
} else {
|
|
25
|
-
setAuthState({
|
|
26
|
-
loading: false,
|
|
27
|
-
isSignedIn: false,
|
|
28
|
-
userId: null,
|
|
29
|
-
error: null
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
|
-
});
|
|
33
|
-
return () => unsubscribe();
|
|
34
|
-
}, []);
|
|
35
|
-
return /* @__PURE__ */ jsx(TernSecureCtxProvider, { options: authState, children });
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
export { TernSecureClientProvider };
|
|
39
|
-
//# sourceMappingURL=chunk-F7XKLY6Y.js.map
|
|
40
|
-
//# sourceMappingURL=chunk-F7XKLY6Y.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/app-router/client/TernSecureProvider.tsx"],"names":[],"mappings":";;;;;;AAkBA,IAAM,OAAO,cAAe,EAAA;AAErB,SAAS,wBAAA,CAAyB,EAAE,QAAA,EAAmC,EAAA;AAC5E,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,QAA0B,CAAA;AAAA,IAC1D,OAAS,EAAA,IAAA;AAAA,IACT,UAAY,EAAA,KAAA;AAAA,IACZ,MAAQ,EAAA,IAAA;AAAA,IACR,KAAO,EAAA;AAAA,GACR,CAAA;AACH,EAAA,SAAA,CAAU,MAAM;AACZ,IAAA,MAAM,WAAc,GAAA,kBAAA,CAAmB,IAAM,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,EAAA,uBACG,GAAA,CAAA,qBAAA,EAAA,EAAsB,OAAS,EAAA,SAAA,EAC7B,QACH,EAAA,CAAA;AAEJ","file":"chunk-F7XKLY6Y.js","sourcesContent":["'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,17 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { jsx } from 'react/jsx-runtime';
|
|
3
|
-
|
|
4
|
-
// src/boundary/TernSecureCtx.tsx
|
|
5
|
-
var TernSecureContext = React.createContext(void 0);
|
|
6
|
-
var useInternalContext = (hookname) => {
|
|
7
|
-
const context = React.useContext(TernSecureContext);
|
|
8
|
-
return context;
|
|
9
|
-
};
|
|
10
|
-
var TernSecureCtxProvider = (props) => {
|
|
11
|
-
const { children, options } = props;
|
|
12
|
-
return /* @__PURE__ */ jsx(TernSecureContext.Provider, { value: { value: options }, children });
|
|
13
|
-
};
|
|
14
|
-
|
|
15
|
-
export { TernSecureCtxProvider, useInternalContext };
|
|
16
|
-
//# sourceMappingURL=chunk-I2PGODCQ.js.map
|
|
17
|
-
//# sourceMappingURL=chunk-I2PGODCQ.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/boundary/TernSecureCtx.tsx"],"names":[],"mappings":";;;;AAaA,IAAM,iBAAA,GAAoB,KAAM,CAAA,aAAA,CAAoD,KAAS,CAAA,CAAA;AAEvF,IAAA,kBAAA,GAAqB,CAAC,QAAsB,KAAA;AAChD,EAAM,MAAA,OAAA,GAAU,KAAM,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,uBAAA,GAAA,CAAC,kBAAkB,QAAlB,EAAA,EAA2B,OAAO,EAAE,KAAA,EAAO,OAAQ,EAAA,EAAI,QAAS,EAAA,CAAA;AAC1E","file":"chunk-I2PGODCQ.js","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}"]}
|