@tern-secure/nextjs 3.1.26 → 3.1.28

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/index.cjs CHANGED
@@ -1,431 +1,59 @@
1
1
  'use strict';
2
2
 
3
- var React3 = require('react');
4
- var jsxRuntime = require('react/jsx-runtime');
5
- var app$1 = require('firebase/app');
6
- var auth$1 = require('firebase/auth');
7
- var firestore$1 = require('firebase/firestore');
8
- var storage$1 = require('firebase/storage');
9
- var dynamic = require('next/dynamic');
3
+ var client = require('./app-router/client');
4
+ var server = require('./app-router/server');
5
+ var useAuth = require('./hooks/useAuth');
6
+ var signIn = require('./components/sign-in');
10
7
 
11
- function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
12
8
 
13
- var React3__default = /*#__PURE__*/_interopDefault(React3);
14
- var dynamic__default = /*#__PURE__*/_interopDefault(dynamic);
15
9
 
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
- };
25
- var initialState; exports.TernSecureContext = void 0; exports.useTernSecure = void 0;
26
- var init_ternSecureContext = __esm({
27
- "src/app-router/client/providers/ternSecureContext.tsx"() {
28
- "use client";
29
- initialState = {
30
- firebase: {
31
- initialized: false,
32
- error: null
33
- },
34
- auth: {
35
- user: null,
36
- loading: true,
37
- error: null,
38
- isSignedIn: false
39
- }
40
- };
41
- exports.TernSecureContext = React3__default.default.createContext([initialState, () => {
42
- }]);
43
- exports.useTernSecure = (hookname) => {
44
- const context = React3__default.default.useContext(exports.TernSecureContext);
45
- if (!context) {
46
- throw new Error(
47
- `${hookname} must be used within TernSecureProvider`
48
- );
49
- }
50
- return context;
51
- };
52
- }
10
+ Object.defineProperty(exports, "TernSecureAuth", {
11
+ enumerable: true,
12
+ get: function () { return client.TernSecureAuth; }
53
13
  });
54
-
55
- // src/app-router/client/providers/ternSecureClientProvider.tsx
56
- var ternSecureClientProvider_exports = {};
57
- __export(ternSecureClientProvider_exports, {
58
- TernSecureClientProvider: () => TernSecureClientProvider
14
+ Object.defineProperty(exports, "TernSecureClientProvider", {
15
+ enumerable: true,
16
+ get: function () { return client.TernSecureClientProvider; }
59
17
  });
60
- function TernSecureClientProvider({ children }) {
61
- const stateAndUpdater = React3.useState(initialState);
62
- return /* @__PURE__ */ jsxRuntime.jsx(exports.TernSecureContext.Provider, { value: stateAndUpdater, children });
63
- }
64
- var init_ternSecureClientProvider = __esm({
65
- "src/app-router/client/providers/ternSecureClientProvider.tsx"() {
66
- "use client";
67
- init_ternSecureContext();
68
- }
18
+ Object.defineProperty(exports, "TernSecureContext", {
19
+ enumerable: true,
20
+ get: function () { return client.TernSecureContext; }
69
21
  });
70
-
71
- // src/app-router/client/config.ts
72
- var loadFireConfig = () => ({
73
- apiKey: process.env.NEXT_PUBLIC_FIREBASE_API_KEY,
74
- authDomain: process.env.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN,
75
- projectId: process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID,
76
- storageBucket: process.env.NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET,
77
- messagingSenderId: process.env.NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID,
78
- appId: process.env.NEXT_PUBLIC_FIREBASE_APP_ID,
79
- measurementId: process.env.NEXT_PUBLIC_FIREBASE_MEASUREMENT_ID
22
+ Object.defineProperty(exports, "TernSecureFirestore", {
23
+ enumerable: true,
24
+ get: function () { return client.TernSecureFirestore; }
80
25
  });
81
- var validateConfig = (config) => {
82
- Object.entries(config).forEach(([key, value]) => {
83
- if (!value) {
84
- throw new Error(`Missing environment variable: NEXT_PUBLIC_FIREBASE_${key.toUpperCase()}`);
85
- }
86
- });
87
- return config;
88
- };
89
-
90
- // src/app-router/client/client-init.ts
91
- var app = (() => {
92
- const config = validateConfig(loadFireConfig());
93
- return app$1.getApps().length ? app$1.getApps()[0] : app$1.initializeApp(config);
94
- })();
95
- var auth = auth$1.getAuth(app);
96
- auth$1.setPersistence(auth, auth$1.browserSessionPersistence);
97
- var firestore = firestore$1.getFirestore(app);
98
- var storage = storage$1.getStorage(app);
99
- var TernSecureAuth = () => auth;
100
- var TernSecureFirestore = () => firestore;
101
- var TernSecureStorage = () => storage;
102
- async function signInWithEmail({
103
- email,
104
- password
105
- }) {
106
- const auth2 = TernSecureAuth();
107
- return auth$1.signInWithEmailAndPassword(auth2, email, password);
108
- }
109
-
110
- // src/app-router/client/index.ts
111
- init_ternSecureContext();
112
- init_ternSecureClientProvider();
113
- var TernSecureClientProvider2 = dynamic__default.default(
114
- () => Promise.resolve().then(() => (init_ternSecureClientProvider(), ternSecureClientProvider_exports)).then((mod) => mod.TernSecureClientProvider),
115
- {
116
- ssr: false
117
- //loading: () => null // Return null or a loading indicator
118
- }
119
- );
120
- function TernSecureProvider({ children }) {
121
- const isRootLayout = React3__default.default.Children.toArray(children).some(
122
- (child) => React3__default.default.isValidElement(child) && child.type === "html"
123
- );
124
- if (isRootLayout) {
125
- return React3__default.default.Children.map(children, (child) => {
126
- if (React3__default.default.isValidElement(child) && child.type === "html") {
127
- return React3__default.default.cloneElement(
128
- child,
129
- {},
130
- React3__default.default.Children.map(child.props.children, (bodyChild) => {
131
- if (React3__default.default.isValidElement(bodyChild) && bodyChild.type === "body") {
132
- const bodyProps = bodyChild.props;
133
- return React3__default.default.cloneElement(
134
- bodyChild,
135
- {},
136
- /* @__PURE__ */ jsxRuntime.jsx(TernSecureClientProvider2, { children: bodyProps.children })
137
- );
138
- }
139
- return bodyChild;
140
- })
141
- );
142
- }
143
- return child;
144
- });
145
- }
146
- return /* @__PURE__ */ jsxRuntime.jsx(TernSecureClientProvider2, { children });
147
- }
148
- function useAuth() {
149
- const [state, setState] = exports.useTernSecure("useAuth");
150
- React3.useEffect(() => {
151
- try {
152
- const auth2 = TernSecureAuth();
153
- setState((prev) => ({
154
- ...prev,
155
- firebase: {
156
- initialized: true,
157
- error: null
158
- }
159
- }));
160
- const unsubscribe = auth2.onAuthStateChanged(
161
- (user) => {
162
- setState((prev) => ({
163
- ...prev,
164
- auth: {
165
- user,
166
- loading: false,
167
- error: null,
168
- isSignedIn: !!user
169
- }
170
- }));
171
- },
172
- (error) => {
173
- setState((prev) => ({
174
- ...prev,
175
- auth: {
176
- user: null,
177
- loading: false,
178
- error,
179
- isSignedIn: false
180
- }
181
- }));
182
- }
183
- );
184
- return () => unsubscribe();
185
- } catch (error) {
186
- setState((prev) => ({
187
- ...prev,
188
- firebase: {
189
- initialized: false,
190
- error
191
- },
192
- auth: {
193
- user: null,
194
- loading: false,
195
- error,
196
- isSignedIn: false
197
- }
198
- }));
199
- }
200
- }, []);
201
- return state.auth;
202
- }
203
-
204
- // src/utils/create-styles.ts
205
- var PREFIX = "tern";
206
- var styleInjection = {
207
- isInjected: false,
208
- styleElement: null
209
- };
210
- var defaultClassNames = {
211
- container: `${PREFIX}-container`,
212
- header: `${PREFIX}-header`,
213
- title: `${PREFIX}-title`,
214
- formWrapper: `${PREFIX}-formWrapper`,
215
- formContainer: `${PREFIX}-formContainer`,
216
- form: `${PREFIX}-form`,
217
- label: `${PREFIX}-label`,
218
- input: `${PREFIX}-input`,
219
- button: `${PREFIX}-button`,
220
- error: `${PREFIX}-error`
221
- };
222
- function createStyleSheet(styles2) {
223
- if (typeof window === "undefined") return defaultClassNames;
224
- if (styleInjection.isInjected) {
225
- return defaultClassNames;
226
- }
227
- let styleElement = document.querySelector("[data-tern-secure]");
228
- if (!styleElement) {
229
- styleElement = document.createElement("style");
230
- styleElement.setAttribute("data-tern-secure", "");
231
- document.head.appendChild(styleElement);
232
- styleInjection.styleElement = styleElement;
233
- }
234
- const cssRules = Object.entries(styles2).map(([key, rules]) => {
235
- const className = defaultClassNames[key];
236
- const cssProperties = Object.entries(rules).map(([prop, value]) => {
237
- const cssProperty = prop.replace(/([A-Z])/g, "-$1").toLowerCase();
238
- return `${cssProperty}: ${value};`;
239
- }).join(" ");
240
- return `.${className} { ${cssProperties} }`;
241
- }).join("\n");
242
- styleElement.textContent = cssRules;
243
- styleInjection.isInjected = true;
244
- return defaultClassNames;
245
- }
246
- var styleConfig = {
247
- container: {
248
- display: "flex",
249
- minHeight: "100%",
250
- flex: "1",
251
- flexDirection: "column",
252
- justifyContent: "center",
253
- padding: "3rem 1.5rem"
254
- },
255
- header: {
256
- margin: "0 auto",
257
- width: "100%",
258
- maxWidth: "28rem"
259
- },
260
- title: {
261
- marginTop: "1.5rem",
262
- textAlign: "center",
263
- fontSize: "1.875rem",
264
- fontWeight: "700",
265
- lineHeight: "2.25rem",
266
- letterSpacing: "-0.025em",
267
- color: "var(--tern-text-primary, #111827)"
268
- },
269
- formWrapper: {
270
- marginTop: "2.5rem",
271
- margin: "0 auto",
272
- width: "100%",
273
- maxWidth: "30rem"
274
- },
275
- formContainer: {
276
- padding: "3rem 1.5rem",
277
- boxShadow: "0 1px 3px 0 rgb(0 0 0 / 0.1)",
278
- borderRadius: "0.5rem",
279
- backgroundColor: "var(--tern-background, white)"
280
- },
281
- form: {
282
- display: "flex",
283
- flexDirection: "column",
284
- gap: "1rem"
285
- },
286
- label: {
287
- display: "block",
288
- fontSize: "0.875rem",
289
- fontWeight: "500",
290
- color: "var(--tern-text-secondary, #374151)"
291
- },
292
- input: {
293
- marginTop: "0.25rem",
294
- display: "block",
295
- width: "100%",
296
- padding: "0.5rem 0.75rem",
297
- borderRadius: "0.375rem",
298
- border: "1px solid var(--tern-border, #D1D5DB)",
299
- backgroundColor: "var(--tern-input-background, white)",
300
- color: "var(--tern-text-primary, #111827)"
301
- },
302
- button: {
303
- display: "flex",
304
- width: "100%",
305
- justifyContent: "center",
306
- padding: "0.5rem 1rem",
307
- fontSize: "0.875rem",
308
- fontWeight: "500",
309
- color: "white",
310
- backgroundColor: "var(--tern-primary, #2563EB)",
311
- border: "none",
312
- borderRadius: "0.375rem",
313
- cursor: "pointer"
314
- },
315
- error: {
316
- color: "var(--tern-error, #DC2626)",
317
- fontSize: "0.875rem"
318
- }
319
- };
320
- var styles = createStyleSheet(styleConfig);
321
- function SignIn({
322
- onSuccess,
323
- onError,
324
- redirectUrl,
325
- className = "",
326
- style,
327
- customStyles = {}
328
- }) {
329
- const [email, setEmail] = React3.useState("");
330
- const [password, setPassword] = React3.useState("");
331
- const [loading, setLoading] = React3.useState(false);
332
- const [error, setError] = React3.useState("");
333
- const handleSubmit = async (e) => {
334
- e.preventDefault();
335
- setLoading(true);
336
- setError("");
337
- try {
338
- await signInWithEmail({ email, password });
339
- onSuccess?.();
340
- if (redirectUrl) {
341
- window.location.href = redirectUrl;
342
- }
343
- } catch (err) {
344
- const errorMessage = err instanceof Error ? err.message : "Failed to sign in";
345
- setError(errorMessage);
346
- onError?.(err instanceof Error ? err : new Error("Failed to sign in"));
347
- } finally {
348
- setLoading(false);
349
- }
350
- };
351
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: `${styles.container} ${customStyles.container || ""}`, style, children: [
352
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: `${styles.header} ${customStyles.header || ""}`, children: /* @__PURE__ */ jsxRuntime.jsx("h2", { className: `${styles.title} ${customStyles.title || ""}`, children: "Sign in to your account" }) }),
353
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: `${styles.formWrapper} ${customStyles.formWrapper || ""}`, children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: `${styles.formContainer} ${customStyles.formContainer || ""}`, children: /* @__PURE__ */ jsxRuntime.jsxs(
354
- "form",
355
- {
356
- onSubmit: handleSubmit,
357
- className: `${styles.form} ${customStyles.form || ""} ${className}`,
358
- role: "form",
359
- "aria-label": "Sign in form",
360
- children: [
361
- error && /* @__PURE__ */ jsxRuntime.jsx(
362
- "div",
363
- {
364
- className: `${styles.error} ${customStyles.errorText || ""}`,
365
- role: "alert",
366
- "aria-live": "polite",
367
- children: error
368
- }
369
- ),
370
- /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
371
- /* @__PURE__ */ jsxRuntime.jsx("label", { htmlFor: "email", className: `${styles.label} ${customStyles.label || ""}`, children: "Email" }),
372
- /* @__PURE__ */ jsxRuntime.jsx(
373
- "input",
374
- {
375
- id: "email",
376
- type: "email",
377
- value: email,
378
- onChange: (e) => setEmail(e.target.value),
379
- placeholder: "Enter your email",
380
- required: true,
381
- className: `${styles.input} ${customStyles.input || ""}`,
382
- disabled: loading,
383
- "aria-required": "true",
384
- "aria-invalid": !!error
385
- }
386
- )
387
- ] }),
388
- /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
389
- /* @__PURE__ */ jsxRuntime.jsx("label", { htmlFor: "password", className: `${styles.label} ${customStyles.label || ""}`, children: "Password" }),
390
- /* @__PURE__ */ jsxRuntime.jsx(
391
- "input",
392
- {
393
- id: "password",
394
- type: "password",
395
- value: password,
396
- onChange: (e) => setPassword(e.target.value),
397
- placeholder: "Enter your password",
398
- required: true,
399
- className: `${styles.input} ${customStyles.input || ""}`,
400
- disabled: loading,
401
- "aria-required": "true",
402
- "aria-invalid": !!error
403
- }
404
- )
405
- ] }),
406
- /* @__PURE__ */ jsxRuntime.jsx(
407
- "button",
408
- {
409
- type: "submit",
410
- disabled: loading,
411
- className: `${styles.button} ${customStyles.button || ""}`,
412
- "data-testid": "sign-in-submit",
413
- children: loading ? "Signing in..." : "Sign in"
414
- }
415
- )
416
- ]
417
- }
418
- ) }) })
419
- ] });
420
- }
421
-
422
- exports.SignIn = SignIn;
423
- exports.TernSecureAuth = TernSecureAuth;
424
- exports.TernSecureClientProvider = TernSecureClientProvider;
425
- exports.TernSecureFirestore = TernSecureFirestore;
426
- exports.TernSecureProvider = TernSecureProvider;
427
- exports.TernSecureStorage = TernSecureStorage;
428
- exports.loadFireConfig = loadFireConfig;
429
- exports.signInWithEmail = signInWithEmail;
430
- exports.useAuth = useAuth;
431
- exports.validateConfig = validateConfig;
26
+ Object.defineProperty(exports, "TernSecureStorage", {
27
+ enumerable: true,
28
+ get: function () { return client.TernSecureStorage; }
29
+ });
30
+ Object.defineProperty(exports, "loadFireConfig", {
31
+ enumerable: true,
32
+ get: function () { return client.loadFireConfig; }
33
+ });
34
+ Object.defineProperty(exports, "signInWithEmail", {
35
+ enumerable: true,
36
+ get: function () { return client.signInWithEmail; }
37
+ });
38
+ Object.defineProperty(exports, "useTernSecure", {
39
+ enumerable: true,
40
+ get: function () { return client.useTernSecure; }
41
+ });
42
+ Object.defineProperty(exports, "validateConfig", {
43
+ enumerable: true,
44
+ get: function () { return client.validateConfig; }
45
+ });
46
+ Object.defineProperty(exports, "TernSecureProvider", {
47
+ enumerable: true,
48
+ get: function () { return server.TernSecureProvider; }
49
+ });
50
+ Object.defineProperty(exports, "useAuth", {
51
+ enumerable: true,
52
+ get: function () { return useAuth.useAuth; }
53
+ });
54
+ Object.defineProperty(exports, "SignIn", {
55
+ enumerable: true,
56
+ get: function () { return signIn.SignIn; }
57
+ });
58
+ //# sourceMappingURL=index.cjs.map
59
+ //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js","sourcesContent":[]}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.cjs","sourcesContent":[]}