@tern-secure/nextjs 3.1.51 → 3.1.53
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 +88 -8
- package/dist/cjs/app-router/client/TernSecureProvider.cjs.map +1 -1
- package/dist/cjs/app-router/server/TernSecureServerProvider.cjs +134 -11
- package/dist/cjs/app-router/server/TernSecureServerProvider.cjs.map +1 -1
- package/dist/cjs/boundary/TernSecureCtx.cjs +14 -12
- package/dist/cjs/boundary/TernSecureCtx.cjs.map +1 -1
- package/dist/cjs/boundary/hooks/use-auth.cjs +17 -96
- package/dist/cjs/boundary/hooks/use-auth.cjs.map +1 -1
- package/dist/cjs/index.cjs +141 -95
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/esm/app-router/client/TernSecureProvider.d.ts +3 -24
- package/dist/esm/app-router/client/TernSecureProvider.js +4 -2
- package/dist/esm/app-router/server/TernSecureServerProvider.d.ts +1 -1
- package/dist/esm/app-router/server/TernSecureServerProvider.js +1 -3
- package/dist/esm/boundary/TernSecureCtx.d.ts +14 -26
- package/dist/esm/boundary/TernSecureCtx.js +1 -1
- package/dist/esm/boundary/hooks/use-auth.d.ts +2 -7
- package/dist/esm/boundary/hooks/use-auth.js +2 -4
- package/dist/esm/chunk-5JJ6CT72.js +20 -0
- package/dist/esm/chunk-5JJ6CT72.js.map +1 -0
- package/dist/esm/chunk-6NBIYUE5.js +16 -0
- package/dist/esm/chunk-6NBIYUE5.js.map +1 -0
- package/dist/esm/chunk-I2PGODCQ.js +17 -0
- package/dist/esm/chunk-I2PGODCQ.js.map +1 -0
- package/dist/esm/{chunk-VEJFSEVF.js → chunk-QYWR3ALC.js} +11 -16
- package/dist/esm/chunk-QYWR3ALC.js.map +1 -0
- package/dist/esm/index.d.ts +1 -1
- package/dist/esm/index.js +4 -4
- package/package.json +1 -1
- package/dist/esm/chunk-I6WQ2J63.js +0 -11
- package/dist/esm/chunk-I6WQ2J63.js.map +0 -1
- package/dist/esm/chunk-OY5DYTKB.js +0 -16
- package/dist/esm/chunk-OY5DYTKB.js.map +0 -1
- package/dist/esm/chunk-TFZYAECO.js +0 -18
- package/dist/esm/chunk-TFZYAECO.js.map +0 -1
- package/dist/esm/chunk-VEJFSEVF.js.map +0 -1
package/dist/cjs/index.cjs
CHANGED
|
@@ -6,105 +6,114 @@ 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
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
auth
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
email,
|
|
71
|
-
password
|
|
72
|
-
}) {
|
|
73
|
-
const auth2 = TernSecureAuth();
|
|
74
|
-
return auth$1.signInWithEmailAndPassword(auth2, email, password);
|
|
75
|
-
}
|
|
76
|
-
var INTERNAL_CONTEXT_KEY = Symbol("TERN_SECURE_CONTEXT");
|
|
77
|
-
var TernSecureContext = React.createContext(null);
|
|
78
|
-
var useInternalContext = (hookName) => {
|
|
79
|
-
const context = React.useContext(TernSecureContext);
|
|
80
|
-
if (!context || context._contextKey !== INTERNAL_CONTEXT_KEY) {
|
|
81
|
-
throw new Error(
|
|
82
|
-
`${hookName || "Hook"} must be used within TernSecureProvider. Please wrap your component with TernSecureProvider.`
|
|
83
|
-
);
|
|
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;
|
|
84
86
|
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
+
});
|
|
88
|
+
var TernSecureContext; exports.useInternalContext = void 0; var TernSecureCtxProvider;
|
|
89
|
+
var init_TernSecureCtx = __esm({
|
|
90
|
+
"src/boundary/TernSecureCtx.tsx"() {
|
|
91
|
+
"use client";
|
|
92
|
+
TernSecureContext = React__default.default.createContext(void 0);
|
|
93
|
+
exports.useInternalContext = (hookname) => {
|
|
94
|
+
const context = React__default.default.useContext(TernSecureContext);
|
|
95
|
+
return context;
|
|
96
|
+
};
|
|
97
|
+
TernSecureCtxProvider = (props) => {
|
|
98
|
+
const { children, options } = props;
|
|
99
|
+
return /* @__PURE__ */ jsxRuntime.jsx(TernSecureContext.Provider, { value: { value: options }, children });
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
// src/app-router/client/TernSecureProvider.tsx
|
|
105
|
+
var TernSecureProvider_exports = {};
|
|
106
|
+
__export(TernSecureProvider_exports, {
|
|
107
|
+
TernSecureClientProvider: () => TernSecureClientProvider
|
|
108
|
+
});
|
|
87
109
|
function TernSecureClientProvider({ children }) {
|
|
88
|
-
const contextValue = React__default.default.useMemo(
|
|
89
|
-
() => ({ _contextKey: INTERNAL_CONTEXT_KEY }),
|
|
90
|
-
[]
|
|
91
|
-
);
|
|
92
|
-
return /* @__PURE__ */ jsxRuntime.jsx(TernSecureContext.Provider, { value: contextValue, children });
|
|
93
|
-
}
|
|
94
|
-
TernSecureClientProvider.displayName = "TernSecureClientProvider";
|
|
95
|
-
async function TernSecureProvider({ children }) {
|
|
96
|
-
const output = /* @__PURE__ */ jsxRuntime.jsx(TernSecureClientProvider, { children });
|
|
97
|
-
return output;
|
|
98
|
-
}
|
|
99
|
-
function useAuth() {
|
|
100
|
-
const auth2 = React.useMemo(() => TernSecureAuth(), []);
|
|
101
110
|
const [authState, setAuthState] = React.useState({
|
|
102
111
|
loading: true,
|
|
103
112
|
isSignedIn: false,
|
|
104
113
|
userId: null,
|
|
105
114
|
error: null
|
|
106
115
|
});
|
|
107
|
-
|
|
116
|
+
React__default.default.useEffect(() => {
|
|
108
117
|
const unsubscribe = auth$1.onAuthStateChanged(auth2, (user) => {
|
|
109
118
|
if (user) {
|
|
110
119
|
setAuthState({
|
|
@@ -123,13 +132,57 @@ function useAuth() {
|
|
|
123
132
|
}
|
|
124
133
|
});
|
|
125
134
|
return () => unsubscribe();
|
|
126
|
-
}, [
|
|
127
|
-
|
|
135
|
+
}, []);
|
|
136
|
+
return /* @__PURE__ */ jsxRuntime.jsx(TernSecureCtxProvider, { options: authState, children });
|
|
137
|
+
}
|
|
138
|
+
var auth2;
|
|
139
|
+
var init_TernSecureProvider = __esm({
|
|
140
|
+
"src/app-router/client/TernSecureProvider.tsx"() {
|
|
141
|
+
"use client";
|
|
142
|
+
init_client_init();
|
|
143
|
+
init_TernSecureCtx();
|
|
144
|
+
auth2 = exports.TernSecureAuth();
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
// src/index.ts
|
|
149
|
+
init_client_init();
|
|
150
|
+
init_config();
|
|
151
|
+
|
|
152
|
+
// src/app-router/server/auth.ts
|
|
153
|
+
init_client_init();
|
|
154
|
+
async function signInWithEmail({
|
|
155
|
+
email,
|
|
156
|
+
password
|
|
157
|
+
}) {
|
|
158
|
+
const auth3 = exports.TernSecureAuth();
|
|
159
|
+
return auth$1.signInWithEmailAndPassword(auth3, email, password);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// src/index.ts
|
|
163
|
+
init_TernSecureCtx();
|
|
164
|
+
init_TernSecureProvider();
|
|
165
|
+
var TernSecureClientProvider2 = dynamic__default.default(
|
|
166
|
+
() => Promise.resolve().then(() => (init_TernSecureProvider(), TernSecureProvider_exports)).then((mod) => mod.TernSecureClientProvider),
|
|
167
|
+
{ ssr: true }
|
|
168
|
+
);
|
|
169
|
+
function TernSecureProvider({ children }) {
|
|
170
|
+
return /* @__PURE__ */ jsxRuntime.jsx(React.Suspense, { fallback: /* @__PURE__ */ jsxRuntime.jsx("div", { children: "Loading..." }), children: /* @__PURE__ */ jsxRuntime.jsx(TernSecureClientProvider2, { children }) });
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// src/boundary/hooks/use-auth.ts
|
|
174
|
+
init_TernSecureCtx();
|
|
175
|
+
function useAuth() {
|
|
176
|
+
const context = exports.useInternalContext("useAuth");
|
|
177
|
+
if (!context || !context.value) {
|
|
178
|
+
throw new Error("useAuth must be used within a TernSecureClientProvider");
|
|
179
|
+
}
|
|
180
|
+
const { userId, loading, error, isSignedIn } = context.value;
|
|
128
181
|
return {
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
182
|
+
userId,
|
|
183
|
+
loading,
|
|
184
|
+
error,
|
|
185
|
+
isSignedIn
|
|
133
186
|
};
|
|
134
187
|
}
|
|
135
188
|
|
|
@@ -352,16 +405,9 @@ function SignIn({
|
|
|
352
405
|
}
|
|
353
406
|
|
|
354
407
|
exports.SignIn = SignIn;
|
|
355
|
-
exports.TernSecureAuth = TernSecureAuth;
|
|
356
408
|
exports.TernSecureClientProvider = TernSecureClientProvider;
|
|
357
|
-
exports.TernSecureContext = TernSecureContext;
|
|
358
|
-
exports.TernSecureFirestore = TernSecureFirestore;
|
|
359
409
|
exports.TernSecureProvider = TernSecureProvider;
|
|
360
|
-
exports.TernSecureStorage = TernSecureStorage;
|
|
361
|
-
exports.loadFireConfig = loadFireConfig;
|
|
362
410
|
exports.signInWithEmail = signInWithEmail;
|
|
363
411
|
exports.useAuth = useAuth;
|
|
364
|
-
exports.useInternalContext = useInternalContext;
|
|
365
|
-
exports.validateConfig = validateConfig;
|
|
366
412
|
//# sourceMappingURL=index.cjs.map
|
|
367
413
|
//# 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","createContext","useContext","React","jsx","useMemo","useState","useEffect","onAuthStateChanged","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 { createContext, useContext } from 'react'\r\n\r\n/**\r\n * Internal context type for TernSecure authentication\r\n * @internal\r\n */\r\ninterface TernSecureContextType {\r\n readonly _contextKey: symbol\r\n}\r\n\r\n/**\r\n * Internal symbol used for context validation\r\n * @internal\r\n */\r\nconst INTERNAL_CONTEXT_KEY = Symbol('TERN_SECURE_CONTEXT')\r\n\r\n/**\r\n * Context for TernSecure authentication\r\n * @internal\r\n */\r\nconst TernSecureContext = createContext<TernSecureContextType | null>(null)\r\n\r\n/**\r\n * Hook to verify that components are rendered within the TernSecure provider\r\n * @param hookName - Name of the hook being used (for better error messages)\r\n * @throws {Error} When used outside of TernSecureProvider\r\n * @internal\r\n */\r\nconst useInternalContext = (hookName?: string): TernSecureContextType => {\r\n const context = useContext(TernSecureContext)\r\n \r\n if (!context || context._contextKey !== INTERNAL_CONTEXT_KEY) {\r\n throw new Error(\r\n `${hookName || 'Hook'} must be used within TernSecureProvider. ` +\r\n 'Please wrap your component with TernSecureProvider.'\r\n )\r\n }\r\n \r\n return context\r\n}\r\n\r\nexport {\r\n type TernSecureContextType,\r\n TernSecureContext,\r\n useInternalContext,\r\n INTERNAL_CONTEXT_KEY\r\n}","'use client'\r\n\r\nimport React from 'react'\r\nimport { INTERNAL_CONTEXT_KEY, TernSecureContext, TernSecureContextType } from '../../boundary/TernSecureCtx'\r\n\r\n/**\r\n * Props for the TernSecureClientProvider component\r\n */\r\ninterface TernSecureClientProviderProps {\r\n /** React child elements to be wrapped by the provider */\r\n children: React.ReactNode\r\n}\r\n\r\n/**\r\n * Provider component for TernSecure authentication\r\n * Must be used to wrap any components that use TernSecure hooks\r\n * \r\n * @example\r\n * ```tsx\r\n * function App() {\r\n * return (\r\n * <TernSecureClientProvider>\r\n * <YourApp />\r\n * </TernSecureClientProvider>\r\n * )\r\n * }\r\n * ```\r\n */\r\nexport function TernSecureClientProvider({ children }: TernSecureClientProviderProps): JSX.Element {\r\n // Memoize the context value to prevent unnecessary re-renders\r\n const contextValue = React.useMemo<TernSecureContextType>(\r\n () => ({ _contextKey: INTERNAL_CONTEXT_KEY }),\r\n []\r\n )\r\n\r\n return (\r\n <TernSecureContext.Provider value={contextValue}>\r\n {children}\r\n </TernSecureContext.Provider>\r\n )\r\n}\r\n\r\n// Add display name for better debugging\r\nTernSecureClientProvider.displayName = 'TernSecureClientProvider'","import { TernSecureClientProvider } from \"../client/TernSecureProvider\";\r\nimport React, { ReactNode } from \"react\";\r\n\r\ninterface TernSecureProviderProps {\r\n children: ReactNode;\r\n}\r\n\r\n\r\n\r\nexport async function TernSecureProvider({ children }: TernSecureProviderProps) {\r\n // Check if the children contain html/body tags\r\n const output = (\r\n <TernSecureClientProvider>\r\n {children}\r\n </TernSecureClientProvider>\r\n );\r\n\r\n // For non-root layouts, wrap normally\r\n return output;\r\n}","'use client'\r\n\r\nimport { useEffect, useState, useMemo } from 'react'\r\nimport { onAuthStateChanged } from 'firebase/auth'\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\r\n useEffect(() => {\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 }, [auth])\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","useInternalContext","React","jsx","useState","onAuthStateChanged","auth","signInWithEmailAndPassword","TernSecureClientProvider","dynamic","Suspense","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\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 } 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\nReact.useEffect(() => {\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\nexport { useInternalContext } from './boundary/TernSecureCtx'\r\nexport { 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 dynamic from 'next/dynamic'\r\nimport React, { ReactNode, Suspense } from \"react\"\r\n\r\nconst TernSecureClientProvider = dynamic(\r\n () => import(\"../client/TernSecureProvider\").then(mod => mod.TernSecureClientProvider),\r\n { ssr: true }\r\n)\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 { useInternalContext } from '../TernSecureCtx'\r\n\r\nexport interface AuthState {\r\n userId: string | null\r\n loading: boolean\r\n error: string | null\r\n isSignedIn: boolean\r\n}\r\n\r\nexport function useAuth(): AuthState {\r\n const context = useInternalContext('useAuth')\r\n \r\n if (!context || !context.value) {\r\n throw new Error('useAuth must be used within a TernSecureClientProvider')\r\n }\r\n\r\n const { userId, loading, error, isSignedIn } = context.value\r\n\r\n return {\r\n userId,\r\n loading,\r\n error,\r\n isSignedIn\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,30 +1,9 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
1
2
|
import React__default from 'react';
|
|
2
3
|
|
|
3
|
-
|
|
4
|
-
* Props for the TernSecureClientProvider component
|
|
5
|
-
*/
|
|
6
|
-
interface TernSecureClientProviderProps {
|
|
7
|
-
/** React child elements to be wrapped by the provider */
|
|
4
|
+
interface TernSecureClientProps {
|
|
8
5
|
children: React__default.ReactNode;
|
|
9
6
|
}
|
|
10
|
-
|
|
11
|
-
* Provider component for TernSecure authentication
|
|
12
|
-
* Must be used to wrap any components that use TernSecure hooks
|
|
13
|
-
*
|
|
14
|
-
* @example
|
|
15
|
-
* ```tsx
|
|
16
|
-
* function App() {
|
|
17
|
-
* return (
|
|
18
|
-
* <TernSecureClientProvider>
|
|
19
|
-
* <YourApp />
|
|
20
|
-
* </TernSecureClientProvider>
|
|
21
|
-
* )
|
|
22
|
-
* }
|
|
23
|
-
* ```
|
|
24
|
-
*/
|
|
25
|
-
declare function TernSecureClientProvider({ children }: TernSecureClientProviderProps): JSX.Element;
|
|
26
|
-
declare namespace TernSecureClientProvider {
|
|
27
|
-
var displayName: string;
|
|
28
|
-
}
|
|
7
|
+
declare function TernSecureClientProvider({ children }: TernSecureClientProps): react_jsx_runtime.JSX.Element;
|
|
29
8
|
|
|
30
9
|
export { TernSecureClientProvider };
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
export { TernSecureClientProvider } from '../../chunk-
|
|
2
|
-
import '../../chunk-
|
|
1
|
+
export { TernSecureClientProvider } from '../../chunk-QYWR3ALC.js';
|
|
2
|
+
import '../../chunk-I2PGODCQ.js';
|
|
3
|
+
import '../../chunk-FVV74XVR.js';
|
|
4
|
+
import '../../chunk-UHGBSUM6.js';
|
|
3
5
|
//# sourceMappingURL=TernSecureProvider.js.map
|
|
4
6
|
//# sourceMappingURL=TernSecureProvider.js.map
|
|
@@ -4,6 +4,6 @@ import { ReactNode } from 'react';
|
|
|
4
4
|
interface TernSecureProviderProps {
|
|
5
5
|
children: ReactNode;
|
|
6
6
|
}
|
|
7
|
-
declare function TernSecureProvider({ children }: TernSecureProviderProps):
|
|
7
|
+
declare function TernSecureProvider({ children }: TernSecureProviderProps): react_jsx_runtime.JSX.Element;
|
|
8
8
|
|
|
9
9
|
export { TernSecureProvider };
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
export { TernSecureProvider } from '../../chunk-
|
|
2
|
-
import '../../chunk-OY5DYTKB.js';
|
|
3
|
-
import '../../chunk-TFZYAECO.js';
|
|
1
|
+
export { TernSecureProvider } from '../../chunk-6NBIYUE5.js';
|
|
4
2
|
//# sourceMappingURL=TernSecureServerProvider.js.map
|
|
5
3
|
//# sourceMappingURL=TernSecureServerProvider.js.map
|
|
@@ -1,28 +1,16 @@
|
|
|
1
|
-
import
|
|
1
|
+
import React__default from 'react';
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Context for TernSecure authentication
|
|
17
|
-
* @internal
|
|
18
|
-
*/
|
|
19
|
-
declare const TernSecureContext: React.Context<TernSecureContextType | null>;
|
|
20
|
-
/**
|
|
21
|
-
* Hook to verify that components are rendered within the TernSecure provider
|
|
22
|
-
* @param hookName - Name of the hook being used (for better error messages)
|
|
23
|
-
* @throws {Error} When used outside of TernSecureProvider
|
|
24
|
-
* @internal
|
|
25
|
-
*/
|
|
26
|
-
declare const useInternalContext: (hookName?: string) => TernSecureContextType;
|
|
3
|
+
type TernSecureState = {
|
|
4
|
+
userId: string | null;
|
|
5
|
+
loading: boolean;
|
|
6
|
+
error: string | null;
|
|
7
|
+
isSignedIn: boolean;
|
|
8
|
+
};
|
|
9
|
+
declare const useInternalContext: (hookname?: string) => {
|
|
10
|
+
value: TernSecureState;
|
|
11
|
+
} | undefined;
|
|
12
|
+
declare const TernSecureCtxProvider: (props: React__default.PropsWithChildren<{
|
|
13
|
+
options: TernSecureState;
|
|
14
|
+
}>) => React__default.JSX.Element;
|
|
27
15
|
|
|
28
|
-
export {
|
|
16
|
+
export { TernSecureCtxProvider, useInternalContext };
|
|
@@ -1,14 +1,9 @@
|
|
|
1
1
|
interface AuthState {
|
|
2
2
|
userId: string | null;
|
|
3
3
|
loading: boolean;
|
|
4
|
-
error:
|
|
4
|
+
error: string | null;
|
|
5
5
|
isSignedIn: boolean;
|
|
6
6
|
}
|
|
7
|
-
declare function useAuth():
|
|
8
|
-
loading: boolean;
|
|
9
|
-
isSignedIn: boolean;
|
|
10
|
-
userId: string | null;
|
|
11
|
-
error: Error | null;
|
|
12
|
-
};
|
|
7
|
+
declare function useAuth(): AuthState;
|
|
13
8
|
|
|
14
9
|
export { type AuthState, useAuth };
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
export { useAuth } from '../../chunk-
|
|
2
|
-
import '../../chunk-
|
|
3
|
-
import '../../chunk-FVV74XVR.js';
|
|
4
|
-
import '../../chunk-UHGBSUM6.js';
|
|
1
|
+
export { useAuth } from '../../chunk-5JJ6CT72.js';
|
|
2
|
+
import '../../chunk-I2PGODCQ.js';
|
|
5
3
|
//# sourceMappingURL=use-auth.js.map
|
|
6
4
|
//# sourceMappingURL=use-auth.js.map
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { useInternalContext } from './chunk-I2PGODCQ.js';
|
|
2
|
+
|
|
3
|
+
// src/boundary/hooks/use-auth.ts
|
|
4
|
+
function useAuth() {
|
|
5
|
+
const context = useInternalContext("useAuth");
|
|
6
|
+
if (!context || !context.value) {
|
|
7
|
+
throw new Error("useAuth must be used within a TernSecureClientProvider");
|
|
8
|
+
}
|
|
9
|
+
const { userId, loading, error, isSignedIn } = context.value;
|
|
10
|
+
return {
|
|
11
|
+
userId,
|
|
12
|
+
loading,
|
|
13
|
+
error,
|
|
14
|
+
isSignedIn
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export { useAuth };
|
|
19
|
+
//# sourceMappingURL=chunk-5JJ6CT72.js.map
|
|
20
|
+
//# sourceMappingURL=chunk-5JJ6CT72.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/boundary/hooks/use-auth.ts"],"names":[],"mappings":";;;AAWO,SAAS,OAAqB,GAAA;AACnC,EAAM,MAAA,OAAA,GAAU,mBAAmB,SAAS,CAAA;AAE5C,EAAA,IAAI,CAAC,OAAA,IAAW,CAAC,OAAA,CAAQ,KAAO,EAAA;AAC9B,IAAM,MAAA,IAAI,MAAM,wDAAwD,CAAA;AAAA;AAG1E,EAAA,MAAM,EAAE,MAAQ,EAAA,OAAA,EAAS,KAAO,EAAA,UAAA,KAAe,OAAQ,CAAA,KAAA;AAEvD,EAAO,OAAA;AAAA,IACL,MAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACF;AACF","file":"chunk-5JJ6CT72.js","sourcesContent":["'use client'\r\n\r\nimport { useInternalContext } from '../TernSecureCtx'\r\n\r\nexport interface AuthState {\r\n userId: string | null\r\n loading: boolean\r\n error: string | null\r\n isSignedIn: boolean\r\n}\r\n\r\nexport function useAuth(): AuthState {\r\n const context = useInternalContext('useAuth')\r\n \r\n if (!context || !context.value) {\r\n throw new Error('useAuth must be used within a TernSecureClientProvider')\r\n }\r\n\r\n const { userId, loading, error, isSignedIn } = context.value\r\n\r\n return {\r\n userId,\r\n loading,\r\n error,\r\n isSignedIn\r\n }\r\n}"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import dynamic from 'next/dynamic';
|
|
2
|
+
import { Suspense } from 'react';
|
|
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
|
+
{ ssr: true }
|
|
9
|
+
);
|
|
10
|
+
function TernSecureProvider({ children }) {
|
|
11
|
+
return /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx("div", { children: "Loading..." }), children: /* @__PURE__ */ jsx(TernSecureClientProvider, { children }) });
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export { TernSecureProvider };
|
|
15
|
+
//# sourceMappingURL=chunk-6NBIYUE5.js.map
|
|
16
|
+
//# sourceMappingURL=chunk-6NBIYUE5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/app-router/server/TernSecureServerProvider.tsx"],"names":[],"mappings":";;;;;AAGA,IAAM,wBAA2B,GAAA,OAAA;AAAA,EAC/B,MAAM,OAAO,2CAA8B,EAAE,IAAK,CAAA,CAAA,GAAA,KAAO,IAAI,wBAAwB,CAAA;AAAA,EACrF,EAAE,KAAK,IAAK;AACd,CAAA;AAMO,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-6NBIYUE5.js","sourcesContent":["import dynamic from 'next/dynamic'\r\nimport React, { ReactNode, Suspense } from \"react\"\r\n\r\nconst TernSecureClientProvider = dynamic(\r\n () => import(\"../client/TernSecureProvider\").then(mod => mod.TernSecureClientProvider),\r\n { ssr: true }\r\n)\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}"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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}"]}
|