@erikey/react 0.1.0

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.js ADDED
@@ -0,0 +1,545 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ createAuthClient: () => createAuthClient2,
24
+ createDashboardClient: () => createDashboardClient
25
+ });
26
+ module.exports = __toCommonJS(index_exports);
27
+
28
+ // src/dashboard-client.ts
29
+ var import_react = require("better-auth/react");
30
+ function createDashboardClient(config) {
31
+ const baseURL = config?.baseURL || "https://api.erikey.com";
32
+ return (0, import_react.createAuthClient)({
33
+ baseURL,
34
+ credentials: config?.credentials || "include"
35
+ });
36
+ }
37
+
38
+ // ../js/dist/index.js
39
+ var DEFAULT_BASE_URL = "https://auth.erikey.com";
40
+ function createAuthClient(config) {
41
+ const { projectId, baseUrl = DEFAULT_BASE_URL } = config;
42
+ const fetchWithAuth = async (endpoint, options) => {
43
+ const headers = {
44
+ "Content-Type": "application/json",
45
+ "X-Project-Id": projectId,
46
+ ...options?.headers || {}
47
+ };
48
+ const response = await fetch(`${baseUrl}/api/auth${endpoint}`, {
49
+ ...options,
50
+ credentials: "include",
51
+ // Send cookies
52
+ headers
53
+ });
54
+ const data = await response.json();
55
+ if (!response.ok) {
56
+ return {
57
+ success: false,
58
+ error: data?.error?.message || data?.message || "Request failed"
59
+ };
60
+ }
61
+ return {
62
+ success: true,
63
+ data
64
+ };
65
+ };
66
+ return {
67
+ /**
68
+ * Sign up a new user
69
+ */
70
+ signUp: async (data) => {
71
+ return fetchWithAuth("/sign-up/email", {
72
+ method: "POST",
73
+ body: JSON.stringify(data)
74
+ });
75
+ },
76
+ /**
77
+ * Sign in an existing user
78
+ */
79
+ signIn: async (data) => {
80
+ return fetchWithAuth("/sign-in/email", {
81
+ method: "POST",
82
+ body: JSON.stringify(data)
83
+ });
84
+ },
85
+ /**
86
+ * Sign out the current user
87
+ */
88
+ signOut: async () => {
89
+ return fetchWithAuth("/sign-out", {
90
+ method: "POST"
91
+ });
92
+ },
93
+ /**
94
+ * Get the current authenticated user
95
+ */
96
+ getUser: async () => {
97
+ return fetchWithAuth("/session", {
98
+ method: "GET"
99
+ });
100
+ },
101
+ /**
102
+ * Request a password reset email
103
+ */
104
+ forgotPassword: async (email) => {
105
+ const result = await fetchWithAuth("/forget-password", {
106
+ method: "POST",
107
+ body: JSON.stringify({ email })
108
+ });
109
+ if (!result.success) {
110
+ return { success: false, message: result.error || "Failed to request password reset" };
111
+ }
112
+ return {
113
+ success: true,
114
+ message: result.data?.message || "Password reset email sent"
115
+ };
116
+ },
117
+ /**
118
+ * Reset password with a token from the reset email
119
+ */
120
+ resetPassword: async (token, newPassword) => {
121
+ const result = await fetchWithAuth("/reset-password", {
122
+ method: "POST",
123
+ body: JSON.stringify({ token, newPassword })
124
+ });
125
+ if (!result.success) {
126
+ return { success: false, message: result.error || "Failed to reset password" };
127
+ }
128
+ return {
129
+ success: true,
130
+ message: result.data?.message || "Password reset successful"
131
+ };
132
+ },
133
+ /**
134
+ * Set a single key-value pair
135
+ */
136
+ setValue: async (key, value) => {
137
+ return fetchWithAuth(`/key-value/${encodeURIComponent(key)}`, {
138
+ method: "PUT",
139
+ body: JSON.stringify({ value })
140
+ });
141
+ },
142
+ /**
143
+ * Get a single key-value pair
144
+ */
145
+ getValue: async (key) => {
146
+ const result = await fetchWithAuth(
147
+ `/key-value/${encodeURIComponent(key)}`,
148
+ { method: "GET" }
149
+ );
150
+ if (!result.success) {
151
+ return { success: false, error: result.error };
152
+ }
153
+ return {
154
+ success: true,
155
+ data: {
156
+ key: result.data.key,
157
+ value: result.data.value,
158
+ createdAt: result.data.createdAt,
159
+ updatedAt: result.data.updatedAt
160
+ }
161
+ };
162
+ },
163
+ /**
164
+ * Get all key-value pairs for the authenticated user
165
+ */
166
+ getValues: async () => {
167
+ const result = await fetchWithAuth(
168
+ "/key-value",
169
+ { method: "GET" }
170
+ );
171
+ if (!result.success) {
172
+ return { success: false, error: result.error };
173
+ }
174
+ return {
175
+ success: true,
176
+ data: {
177
+ kvPairs: result.data.kvPairs,
178
+ total: result.data.total
179
+ }
180
+ };
181
+ },
182
+ /**
183
+ * Delete a single key-value pair
184
+ */
185
+ deleteValue: async (key) => {
186
+ const result = await fetchWithAuth(
187
+ `/key-value/${encodeURIComponent(key)}`,
188
+ { method: "DELETE" }
189
+ );
190
+ if (!result.success) {
191
+ return { success: false, error: result.error };
192
+ }
193
+ return {
194
+ success: true,
195
+ data: {
196
+ message: result.data.message || "KV pair deleted"
197
+ }
198
+ };
199
+ },
200
+ /**
201
+ * Delete multiple key-value pairs
202
+ * Note: Makes sequential DELETE requests since no bulk delete endpoint exists
203
+ */
204
+ deleteValues: async (keys) => {
205
+ if (keys.length === 0) {
206
+ return {
207
+ success: true,
208
+ data: {
209
+ deleted: [],
210
+ failed: []
211
+ }
212
+ };
213
+ }
214
+ const results = await Promise.allSettled(
215
+ keys.map(
216
+ (key) => fetchWithAuth(
217
+ `/key-value/${encodeURIComponent(key)}`,
218
+ { method: "DELETE" }
219
+ ).then((result) => ({ key, result }))
220
+ )
221
+ );
222
+ const deleted = [];
223
+ const failed = [];
224
+ results.forEach((result, index) => {
225
+ if (result.status === "fulfilled") {
226
+ const { key, result: deleteResult } = result.value;
227
+ if (deleteResult.success) {
228
+ deleted.push(key);
229
+ } else {
230
+ failed.push({
231
+ key,
232
+ error: deleteResult.error || "Delete failed"
233
+ });
234
+ }
235
+ } else {
236
+ failed.push({
237
+ key: keys[index],
238
+ error: result.reason?.message || "Request failed"
239
+ });
240
+ }
241
+ });
242
+ return {
243
+ success: failed.length === 0,
244
+ data: {
245
+ deleted,
246
+ failed
247
+ }
248
+ };
249
+ },
250
+ /**
251
+ * Set multiple key-value pairs in bulk (max 100 pairs)
252
+ */
253
+ setValues: async (kvPairs) => {
254
+ const result = await fetchWithAuth(
255
+ "/key-value/bulk",
256
+ {
257
+ method: "POST",
258
+ body: JSON.stringify({ kvPairs })
259
+ }
260
+ );
261
+ if (!result.success) {
262
+ return { success: false, error: result.error };
263
+ }
264
+ return {
265
+ success: true,
266
+ data: {
267
+ results: result.data.results,
268
+ total: result.data.total
269
+ }
270
+ };
271
+ }
272
+ };
273
+ }
274
+
275
+ // ../../sandpack-auth/dist/client/index.js
276
+ function isSandpackEnvironment() {
277
+ if (typeof window === "undefined") {
278
+ return false;
279
+ }
280
+ if (process.env.NODE_ENV === "production") {
281
+ console.warn(
282
+ "[SANDPACK-AUTH] Sandpack detection called in production environment. This should only run in development/preview. Returning false."
283
+ );
284
+ return false;
285
+ }
286
+ try {
287
+ const inIframe = window.self !== window.top;
288
+ return inIframe;
289
+ } catch {
290
+ return true;
291
+ }
292
+ }
293
+ function getStorageKey(projectId) {
294
+ return `erikey.session.${projectId}`;
295
+ }
296
+ function storeToken(projectId, session) {
297
+ const key = getStorageKey(projectId);
298
+ const stored = {
299
+ token: session.token,
300
+ expiresAt: session.expiresAt
301
+ };
302
+ console.log("[Sandpack Auth] Storing token:", {
303
+ key,
304
+ tokenPreview: session.token.substring(0, 20) + "..."
305
+ });
306
+ localStorage.setItem(key, JSON.stringify(stored));
307
+ const check = localStorage.getItem(key);
308
+ if (!check) {
309
+ console.error("[Sandpack Auth] Failed to store token in localStorage");
310
+ } else {
311
+ console.log("[Sandpack Auth] Token stored successfully");
312
+ }
313
+ }
314
+ function getStoredToken(projectId) {
315
+ const key = getStorageKey(projectId);
316
+ const stored = localStorage.getItem(key);
317
+ if (!stored) {
318
+ return null;
319
+ }
320
+ try {
321
+ const session = JSON.parse(stored);
322
+ if (new Date(session.expiresAt) < /* @__PURE__ */ new Date()) {
323
+ console.log("[Sandpack Auth] Token expired, removing from localStorage");
324
+ localStorage.removeItem(key);
325
+ return null;
326
+ }
327
+ return session.token;
328
+ } catch (error) {
329
+ console.error("[Sandpack Auth] Failed to parse stored session:", error);
330
+ localStorage.removeItem(key);
331
+ return null;
332
+ }
333
+ }
334
+ function clearToken(projectId) {
335
+ const key = getStorageKey(projectId);
336
+ console.log("[Sandpack Auth] Clearing token from localStorage");
337
+ localStorage.removeItem(key);
338
+ }
339
+
340
+ // src/auth-client.ts
341
+ function createAuthClient2(config) {
342
+ const { projectId } = config;
343
+ const baseUrl = config.baseUrl || "https://auth.erikey.com";
344
+ const client = createAuthClient(config);
345
+ const inSandpack = isSandpackEnvironment();
346
+ if (!inSandpack) {
347
+ return client;
348
+ }
349
+ const fetchWithBearer = async (endpoint, options) => {
350
+ const token = getStoredToken(projectId);
351
+ const headers = {
352
+ "Content-Type": "application/json",
353
+ "X-Project-Id": projectId,
354
+ ...options?.headers || {}
355
+ };
356
+ if (token) {
357
+ headers["Authorization"] = `Bearer ${token}`;
358
+ }
359
+ const response = await fetch(`${baseUrl}/api/auth${endpoint}`, {
360
+ ...options,
361
+ headers
362
+ });
363
+ const data = await response.json();
364
+ if (!response.ok) {
365
+ return {
366
+ success: false,
367
+ error: data?.error?.message || data?.message || "Request failed"
368
+ };
369
+ }
370
+ return {
371
+ success: true,
372
+ data
373
+ };
374
+ };
375
+ return {
376
+ signUp: async (data) => {
377
+ const result = await client.signUp(data);
378
+ if (result.success && result.data?.session) {
379
+ storeToken(projectId, result.data.session);
380
+ }
381
+ return result;
382
+ },
383
+ signIn: async (data) => {
384
+ const result = await client.signIn(data);
385
+ if (result.success && result.data?.session) {
386
+ storeToken(projectId, result.data.session);
387
+ }
388
+ return result;
389
+ },
390
+ signOut: async () => {
391
+ const result = await client.signOut();
392
+ clearToken(projectId);
393
+ return result;
394
+ },
395
+ getUser: async () => {
396
+ const result = await client.getUser();
397
+ if (result.success) {
398
+ return result;
399
+ }
400
+ const token = getStoredToken(projectId);
401
+ if (token) {
402
+ const response = await fetch(`${baseUrl}/api/auth/session`, {
403
+ headers: {
404
+ "Authorization": `Bearer ${token}`,
405
+ "X-Project-Id": projectId
406
+ }
407
+ });
408
+ const data = await response.json();
409
+ if (response.ok) {
410
+ return { success: true, data };
411
+ }
412
+ }
413
+ return result;
414
+ },
415
+ forgotPassword: client.forgotPassword,
416
+ resetPassword: client.resetPassword,
417
+ // KV methods - wrapped with Bearer token support for Sandpack
418
+ setValue: async (key, value) => {
419
+ return fetchWithBearer(`/key-value/${encodeURIComponent(key)}`, {
420
+ method: "PUT",
421
+ body: JSON.stringify({ value })
422
+ });
423
+ },
424
+ getValue: async (key) => {
425
+ const result = await fetchWithBearer(
426
+ `/key-value/${encodeURIComponent(key)}`,
427
+ { method: "GET" }
428
+ );
429
+ if (!result.success) {
430
+ return { success: false, error: result.error };
431
+ }
432
+ return {
433
+ success: true,
434
+ data: {
435
+ key: result.data.key,
436
+ value: result.data.value,
437
+ createdAt: result.data.createdAt,
438
+ updatedAt: result.data.updatedAt
439
+ }
440
+ };
441
+ },
442
+ getValues: async () => {
443
+ const result = await fetchWithBearer(
444
+ "/key-value",
445
+ { method: "GET" }
446
+ );
447
+ if (!result.success) {
448
+ return { success: false, error: result.error };
449
+ }
450
+ return {
451
+ success: true,
452
+ data: {
453
+ kvPairs: result.data.kvPairs,
454
+ total: result.data.total
455
+ }
456
+ };
457
+ },
458
+ deleteValue: async (key) => {
459
+ const result = await fetchWithBearer(
460
+ `/key-value/${encodeURIComponent(key)}`,
461
+ { method: "DELETE" }
462
+ );
463
+ if (!result.success) {
464
+ return { success: false, error: result.error };
465
+ }
466
+ return {
467
+ success: true,
468
+ data: {
469
+ message: result.data.message || "KV pair deleted"
470
+ }
471
+ };
472
+ },
473
+ deleteValues: async (keys) => {
474
+ if (keys.length === 0) {
475
+ return {
476
+ success: true,
477
+ data: {
478
+ deleted: [],
479
+ failed: []
480
+ }
481
+ };
482
+ }
483
+ const results = await Promise.allSettled(
484
+ keys.map(
485
+ (key) => fetchWithBearer(
486
+ `/key-value/${encodeURIComponent(key)}`,
487
+ { method: "DELETE" }
488
+ ).then((result) => ({ key, result }))
489
+ )
490
+ );
491
+ const deleted = [];
492
+ const failed = [];
493
+ results.forEach((result, index) => {
494
+ if (result.status === "fulfilled") {
495
+ const { key, result: deleteResult } = result.value;
496
+ if (deleteResult.success) {
497
+ deleted.push(key);
498
+ } else {
499
+ failed.push({
500
+ key,
501
+ error: deleteResult.error || "Delete failed"
502
+ });
503
+ }
504
+ } else {
505
+ failed.push({
506
+ key: keys[index],
507
+ error: result.reason?.message || "Request failed"
508
+ });
509
+ }
510
+ });
511
+ return {
512
+ success: failed.length === 0,
513
+ data: {
514
+ deleted,
515
+ failed
516
+ }
517
+ };
518
+ },
519
+ setValues: async (kvPairs) => {
520
+ const result = await fetchWithBearer(
521
+ "/key-value/bulk",
522
+ {
523
+ method: "POST",
524
+ body: JSON.stringify({ kvPairs })
525
+ }
526
+ );
527
+ if (!result.success) {
528
+ return { success: false, error: result.error };
529
+ }
530
+ return {
531
+ success: true,
532
+ data: {
533
+ results: result.data.results,
534
+ total: result.data.total
535
+ }
536
+ };
537
+ }
538
+ };
539
+ }
540
+ // Annotate the CommonJS export names for ESM import in node:
541
+ 0 && (module.exports = {
542
+ createAuthClient,
543
+ createDashboardClient
544
+ });
545
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/dashboard-client.ts","../../js/src/auth-client.ts","../../../sandpack-auth/src/client/detection.ts","../../../sandpack-auth/src/client/storage.ts","../../../sandpack-auth/src/client/fetch.ts","../src/auth-client.ts"],"sourcesContent":["/**\n * @erikey/react - React SDK for Erikey\n *\n * Two auth clients for different use cases:\n *\n * 1. `createDashboardClient` - For the Erikey dashboard (Better Auth)\n * 2. `createAuthClient` - For customer apps to authenticate end-users\n *\n * @example Dashboard (erikey.com)\n * ```tsx\n * import { createDashboardClient } from '@erikey/react';\n *\n * export const auth = createDashboardClient({\n * baseUrl: process.env.NEXT_PUBLIC_AUTH_URL\n * });\n *\n * export const { useSession, signIn, signOut, organization } = auth;\n * ```\n *\n * @example Customer App (end-user auth)\n * ```tsx\n * import { createAuthClient } from '@erikey/react';\n *\n * const auth = createAuthClient({\n * projectId: process.env.NEXT_PUBLIC_ERIKEY_PROJECT_ID!, // pk_live_xxx\n * baseUrl: process.env.NEXT_PUBLIC_ERIKEY_BASE_URL, // Optional\n * });\n *\n * await auth.signUp({ email, password, name });\n * await auth.signIn({ email, password });\n * const user = await auth.getUser();\n * await auth.signOut();\n * ```\n */\n\n// Dashboard auth (for Erikey dashboard - uses Better Auth)\nexport { createDashboardClient } from './dashboard-client';\nexport type {\n DashboardClient,\n DashboardClientConfig,\n} from './dashboard-client';\n\n// End-user auth (for customer apps - uses projectId)\nexport { createAuthClient } from './auth-client';\nexport type {\n AuthClient,\n AuthClientConfig,\n SignUpData,\n SignInData,\n AuthResponse,\n UserResponse,\n SignOutResponse,\n PasswordResetResponse,\n User,\n Session,\n // KV Store types\n KvPair,\n KvBulkSetInput,\n SetValueResponse,\n GetValueResponse,\n GetValuesResponse,\n DeleteValueResponse,\n DeleteValuesResponse,\n SetValuesResponse,\n} from './auth-client';\n\n// Export shared types from core (for dashboard client compatibility)\nexport type { SessionData, Organization, APIKey, Permission } from './types';\n","/**\n * @erikey/react - Dashboard Client\n *\n * Thin wrapper around better-auth/react for the Erikey dashboard.\n */\nimport { createAuthClient as createBetterAuthClient } from 'better-auth/react';\n\nexport interface DashboardClientConfig {\n /**\n * Base URL for the auth API\n * @default process.env.NEXT_PUBLIC_AUTH_URL || 'https://api.erikey.com'\n */\n baseURL?: string;\n\n /**\n * Whether to include credentials in requests\n * @default 'include'\n */\n credentials?: RequestCredentials;\n}\n\n/**\n * Create dashboard client with better-auth\n *\n * This is for the Erikey dashboard (erikey.com) - NOT for end-user auth.\n * For end-user auth in customer apps, use `createAuthClient` instead.\n *\n * NOTE: For dashboard user signup (which creates org + project), use the\n * typed API client (signupApi.dashboard) from @/lib/api/typed-api instead.\n * This client only handles Better Auth operations (signIn, session, etc.)\n *\n * @example\n * ```tsx\n * import { createDashboardClient } from '@erikey/react';\n *\n * export const auth = createDashboardClient({\n * baseURL: process.env.NEXT_PUBLIC_AUTH_URL\n * });\n *\n * // Use Better Auth methods\n * export const { useSession, signIn, signOut } = auth;\n * ```\n */\nexport function createDashboardClient(config?: DashboardClientConfig) {\n const baseURL = config?.baseURL || 'https://api.erikey.com';\n\n return createBetterAuthClient({\n baseURL,\n credentials: config?.credentials || 'include',\n });\n}\n\n/**\n * Type helper for inferring the dashboard client type\n */\nexport type DashboardClient = ReturnType<typeof createDashboardClient>;\n","/**\n * Universal auth client implementation\n * Works in Node.js 18+ and modern browsers\n *\n * Extracted from @erikey/react for universal use\n */\n\nimport type {\n AuthClientConfig,\n AuthClient,\n SignUpData,\n SignInData,\n AuthResponse,\n UserResponse,\n SignOutResponse,\n PasswordResetResponse,\n SetValueResponse,\n GetValueResponse,\n GetValuesResponse,\n DeleteValueResponse,\n DeleteValuesResponse,\n SetValuesResponse,\n KvBulkSetInput,\n} from './types';\n\n/** Default base URL for Erikey auth API */\nconst DEFAULT_BASE_URL = 'https://auth.erikey.com';\n\n/**\n * Create a universal auth client\n *\n * Works in both Node.js and browser environments\n * Uses standard fetch API (available in Node.js 18+)\n *\n * @param config - Client configuration\n * @returns Auth client instance\n *\n * @example\n * ```typescript\n * const auth = createAuthClient({\n * projectId: 'pk_live_123',\n * baseUrl: '/api/auth', // Optional proxy\n * });\n *\n * const result = await auth.signUp({\n * email: 'user@example.com',\n * password: 'secure123',\n * name: 'John Doe',\n * });\n * ```\n */\nexport function createAuthClient(config: AuthClientConfig): AuthClient {\n const { projectId, baseUrl = DEFAULT_BASE_URL } = config;\n\n /**\n * Internal helper for making authenticated requests\n */\n const fetchWithAuth = async <T>(\n endpoint: string,\n options?: RequestInit\n ): Promise<T> => {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'X-Project-Id': projectId,\n ...(options?.headers as Record<string, string> || {}),\n };\n\n const response = await fetch(`${baseUrl}/api/auth${endpoint}`, {\n ...options,\n credentials: 'include', // Send cookies\n headers,\n });\n\n const data = await response.json() as any;\n\n if (!response.ok) {\n return {\n success: false,\n error: data?.error?.message || data?.message || 'Request failed',\n } as T;\n }\n\n return {\n success: true,\n data,\n } as T;\n };\n\n return {\n /**\n * Sign up a new user\n */\n signUp: async (data: SignUpData): Promise<AuthResponse> => {\n return fetchWithAuth<AuthResponse>('/sign-up/email', {\n method: 'POST',\n body: JSON.stringify(data),\n });\n },\n\n /**\n * Sign in an existing user\n */\n signIn: async (data: SignInData): Promise<AuthResponse> => {\n return fetchWithAuth<AuthResponse>('/sign-in/email', {\n method: 'POST',\n body: JSON.stringify(data),\n });\n },\n\n /**\n * Sign out the current user\n */\n signOut: async (): Promise<SignOutResponse> => {\n return fetchWithAuth<SignOutResponse>('/sign-out', {\n method: 'POST',\n });\n },\n\n /**\n * Get the current authenticated user\n */\n getUser: async (): Promise<UserResponse> => {\n return fetchWithAuth<UserResponse>('/session', {\n method: 'GET',\n });\n },\n\n /**\n * Request a password reset email\n */\n forgotPassword: async (email: string): Promise<PasswordResetResponse> => {\n const result = await fetchWithAuth<{ success: boolean; data?: any; error?: string }>('/forget-password', {\n method: 'POST',\n body: JSON.stringify({ email }),\n });\n\n if (!result.success) {\n return { success: false, message: result.error || 'Failed to request password reset' };\n }\n\n return {\n success: true,\n message: result.data?.message || 'Password reset email sent',\n };\n },\n\n /**\n * Reset password with a token from the reset email\n */\n resetPassword: async (token: string, newPassword: string): Promise<PasswordResetResponse> => {\n const result = await fetchWithAuth<{ success: boolean; data?: any; error?: string }>('/reset-password', {\n method: 'POST',\n body: JSON.stringify({ token, newPassword }),\n });\n\n if (!result.success) {\n return { success: false, message: result.error || 'Failed to reset password' };\n }\n\n return {\n success: true,\n message: result.data?.message || 'Password reset successful',\n };\n },\n\n /**\n * Set a single key-value pair\n */\n setValue: async (key: string, value: any): Promise<SetValueResponse> => {\n return fetchWithAuth<SetValueResponse>(`/key-value/${encodeURIComponent(key)}`, {\n method: 'PUT',\n body: JSON.stringify({ value }),\n });\n },\n\n /**\n * Get a single key-value pair\n */\n getValue: async (key: string): Promise<GetValueResponse> => {\n const result = await fetchWithAuth<{ success: boolean; data?: any; error?: string }>(\n `/key-value/${encodeURIComponent(key)}`,\n { method: 'GET' }\n );\n\n if (!result.success) {\n return { success: false, error: result.error };\n }\n\n return {\n success: true,\n data: {\n key: result.data.key,\n value: result.data.value,\n createdAt: result.data.createdAt,\n updatedAt: result.data.updatedAt,\n },\n };\n },\n\n /**\n * Get all key-value pairs for the authenticated user\n */\n getValues: async (): Promise<GetValuesResponse> => {\n const result = await fetchWithAuth<{ success: boolean; data?: any; error?: string }>(\n '/key-value',\n { method: 'GET' }\n );\n\n if (!result.success) {\n return { success: false, error: result.error };\n }\n\n return {\n success: true,\n data: {\n kvPairs: result.data.kvPairs,\n total: result.data.total,\n },\n };\n },\n\n /**\n * Delete a single key-value pair\n */\n deleteValue: async (key: string): Promise<DeleteValueResponse> => {\n const result = await fetchWithAuth<{ success: boolean; data?: any; error?: string }>(\n `/key-value/${encodeURIComponent(key)}`,\n { method: 'DELETE' }\n );\n\n if (!result.success) {\n return { success: false, error: result.error };\n }\n\n return {\n success: true,\n data: {\n message: result.data.message || 'KV pair deleted',\n },\n };\n },\n\n /**\n * Delete multiple key-value pairs\n * Note: Makes sequential DELETE requests since no bulk delete endpoint exists\n */\n deleteValues: async (keys: string[]): Promise<DeleteValuesResponse> => {\n if (keys.length === 0) {\n return {\n success: true,\n data: {\n deleted: [],\n failed: [],\n },\n };\n }\n\n const results = await Promise.allSettled(\n keys.map((key) =>\n fetchWithAuth<{ success: boolean; error?: string }>(\n `/key-value/${encodeURIComponent(key)}`,\n { method: 'DELETE' }\n ).then((result) => ({ key, result }))\n )\n );\n\n const deleted: string[] = [];\n const failed: Array<{ key: string; error: string }> = [];\n\n results.forEach((result, index) => {\n if (result.status === 'fulfilled') {\n const { key, result: deleteResult } = result.value;\n if (deleteResult.success) {\n deleted.push(key);\n } else {\n failed.push({\n key,\n error: deleteResult.error || 'Delete failed',\n });\n }\n } else {\n failed.push({\n key: keys[index],\n error: result.reason?.message || 'Request failed',\n });\n }\n });\n\n return {\n success: failed.length === 0,\n data: {\n deleted,\n failed,\n },\n };\n },\n\n /**\n * Set multiple key-value pairs in bulk (max 100 pairs)\n */\n setValues: async (kvPairs: KvBulkSetInput[]): Promise<SetValuesResponse> => {\n const result = await fetchWithAuth<{ success: boolean; data?: any; error?: string }>(\n '/key-value/bulk',\n {\n method: 'POST',\n body: JSON.stringify({ kvPairs }),\n }\n );\n\n if (!result.success) {\n return { success: false, error: result.error };\n }\n\n return {\n success: true,\n data: {\n results: result.data.results,\n total: result.data.total,\n },\n };\n },\n };\n}\n","/**\n * Sandpack environment detection\n *\n * ⚠️ WARNING: DEV/PREVIEW ONLY\n *\n * Detects if code is running inside a Sandpack iframe environment where:\n * - Third-party cookies are blocked\n * - localStorage is used instead of cookies\n * - Bearer tokens are sent via Authorization header\n *\n * @packageDocumentation\n */\n\n/**\n * Detect if running in Sandpack environment (cross-origin iframe)\n *\n * Sandpack blocks cookies due to third-party cookie policies, so we need\n * to use localStorage + Bearer tokens instead.\n *\n * ⚠️ In production, this should always return false to prevent accidental\n * use of dev-only authentication flows.\n *\n * @returns true if running inside an iframe (likely Sandpack/preview environment)\n *\n * @example\n * ```typescript\n * import { isSandpackEnvironment } from '@erikey/sandpack-auth/client';\n *\n * if (isSandpackEnvironment()) {\n * console.log('Using Bearer token auth for Sandpack');\n * } else {\n * console.log('Using standard cookie-based auth');\n * }\n * ```\n */\nexport function isSandpackEnvironment(): boolean {\n // Server-side check\n if (typeof window === 'undefined') {\n return false;\n }\n\n // Production safety: Always return false in production\n if (process.env.NODE_ENV === 'production') {\n console.warn(\n '[SANDPACK-AUTH] Sandpack detection called in production environment. ' +\n 'This should only run in development/preview. Returning false.'\n );\n return false;\n }\n\n try {\n // If we're in an iframe, assume it's Sandpack or similar preview environment\n const inIframe = window.self !== window.top;\n return inIframe;\n } catch {\n // Cross-origin access denied = definitely cross-origin iframe\n return true;\n }\n}\n\n/**\n * Get environment information\n *\n * @returns Object with environment details\n */\nexport function getEnvironmentInfo() {\n const isSandpack = isSandpackEnvironment();\n const isProduction = process.env.NODE_ENV === 'production';\n\n return {\n isSandpack,\n isProduction,\n shouldUseBearerAuth: isSandpack && !isProduction,\n environment: process.env.NODE_ENV || 'development',\n };\n}\n","/**\n * localStorage-based session storage for Sandpack\n *\n * ⚠️ WARNING: DEV/PREVIEW ONLY\n *\n * In Sandpack environments, cookies are blocked by browsers due to third-party\n * cookie policies. This module provides localStorage-based session management\n * as a workaround for development and preview environments.\n *\n * Production applications should NEVER use this - use standard cookie-based auth.\n *\n * @packageDocumentation\n */\n\nimport type { Session } from '../types';\n\n/**\n * Stored session data structure\n * Minimal subset of Session stored in localStorage\n */\nexport interface StoredSession {\n token: string;\n expiresAt: string;\n}\n\n/**\n * Generate localStorage key for a project's session\n *\n * @param projectId - The Erikey project ID\n * @returns The localStorage key\n */\nfunction getStorageKey(projectId: string): string {\n return `erikey.session.${projectId}`;\n}\n\n/**\n * Store session token in localStorage (Sandpack only)\n *\n * ⚠️ DEV/PREVIEW ONLY - Never use in production\n *\n * @param projectId - The Erikey project ID\n * @param session - The session data to store\n *\n * @example\n * ```typescript\n * import { storeToken } from '@erikey/sandpack-auth/client';\n *\n * storeToken('proj_123', {\n * id: 'session_abc',\n * token: 'token_xyz',\n * expiresAt: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000).toISOString()\n * });\n * ```\n */\nexport function storeToken(projectId: string, session: Session): void {\n const key = getStorageKey(projectId);\n const stored: StoredSession = {\n token: session.token,\n expiresAt: session.expiresAt,\n };\n\n console.log('[Sandpack Auth] Storing token:', {\n key,\n tokenPreview: session.token.substring(0, 20) + '...',\n });\n\n localStorage.setItem(key, JSON.stringify(stored));\n\n // Verify storage\n const check = localStorage.getItem(key);\n if (!check) {\n console.error('[Sandpack Auth] Failed to store token in localStorage');\n } else {\n console.log('[Sandpack Auth] Token stored successfully');\n }\n}\n\n/**\n * Get stored token from localStorage (Sandpack only)\n *\n * Returns null if:\n * - Token doesn't exist\n * - Token is expired\n * - Token data is corrupted\n *\n * Automatically cleans up expired or invalid tokens.\n *\n * @param projectId - The Erikey project ID\n * @returns The session token, or null if not found/expired\n *\n * @example\n * ```typescript\n * import { getStoredToken } from '@erikey/sandpack-auth/client';\n *\n * const token = getStoredToken('proj_123');\n * if (token) {\n * console.log('Found valid session token');\n * } else {\n * console.log('No valid session - user needs to sign in');\n * }\n * ```\n */\nexport function getStoredToken(projectId: string): string | null {\n const key = getStorageKey(projectId);\n const stored = localStorage.getItem(key);\n\n if (!stored) {\n return null;\n }\n\n try {\n const session: StoredSession = JSON.parse(stored);\n\n // Check if token is expired\n if (new Date(session.expiresAt) < new Date()) {\n console.log('[Sandpack Auth] Token expired, removing from localStorage');\n localStorage.removeItem(key);\n return null;\n }\n\n return session.token;\n } catch (error) {\n console.error('[Sandpack Auth] Failed to parse stored session:', error);\n localStorage.removeItem(key);\n return null;\n }\n}\n\n/**\n * Get stored session data from localStorage\n *\n * Returns null if session doesn't exist, is expired, or is corrupted.\n *\n * @param projectId - The Erikey project ID\n * @returns The stored session data, or null\n */\nexport function getStoredSession(projectId: string): StoredSession | null {\n const key = getStorageKey(projectId);\n const stored = localStorage.getItem(key);\n\n if (!stored) {\n return null;\n }\n\n try {\n const session: StoredSession = JSON.parse(stored);\n\n // Check if expired\n if (new Date(session.expiresAt) < new Date()) {\n localStorage.removeItem(key);\n return null;\n }\n\n return session;\n } catch {\n localStorage.removeItem(key);\n return null;\n }\n}\n\n/**\n * Clear stored token from localStorage (Sandpack only)\n *\n * Use this when signing out to ensure the token is removed.\n *\n * @param projectId - The Erikey project ID\n *\n * @example\n * ```typescript\n * import { clearToken } from '@erikey/sandpack-auth/client';\n *\n * // On sign out\n * clearToken('proj_123');\n * ```\n */\nexport function clearToken(projectId: string): void {\n const key = getStorageKey(projectId);\n console.log('[Sandpack Auth] Clearing token from localStorage');\n localStorage.removeItem(key);\n}\n\n/**\n * Check if a stored session exists and is valid\n *\n * @param projectId - The Erikey project ID\n * @returns true if a valid session exists\n */\nexport function hasValidSession(projectId: string): boolean {\n return getStoredToken(projectId) !== null;\n}\n","/**\n * HTTP client with automatic Bearer token authentication for Sandpack\n *\n * ⚠️ WARNING: DEV/PREVIEW ONLY\n *\n * This module provides a fetch wrapper that automatically:\n * - Detects Sandpack environment\n * - Attaches Bearer tokens from localStorage\n * - Handles credentials appropriately (omit in Sandpack, include in production)\n *\n * @packageDocumentation\n */\n\nimport { isSandpackEnvironment } from './detection';\nimport { getStoredToken } from './storage';\n\n/**\n * Configuration for authenticated fetch requests\n */\nexport interface FetchWithAuthOptions extends Omit<RequestInit, 'headers'> {\n /**\n * Additional headers to include in the request\n */\n headers?: Record<string, string>;\n}\n\n/**\n * Response wrapper for fetch operations\n */\nexport interface FetchResponse<T = any> {\n success: boolean;\n data?: T;\n error?: string;\n}\n\n/**\n * Fetch wrapper with automatic Bearer token authentication for Sandpack\n *\n * Automatically:\n * - Detects if running in Sandpack environment\n * - Retrieves token from localStorage if in Sandpack\n * - Adds Authorization: Bearer header if token exists\n * - Sets credentials to 'omit' in Sandpack, 'include' in production\n * - Adds X-Project-Id header\n *\n * ⚠️ This is a \"side flow\" for Sandpack only. Production uses standard\n * cookie-based authentication with credentials: 'include'.\n *\n * @param baseUrl - Base URL of the auth API (e.g., 'https://auth.erikey.com')\n * @param projectId - The Erikey project ID\n * @param endpoint - API endpoint (e.g., '/get-session', '/sign-in/email')\n * @param options - Fetch options (method, body, headers, etc.)\n * @returns Promise resolving to response with success/data/error\n *\n * @example\n * ```typescript\n * import { fetchWithAuth } from '@erikey/sandpack-auth/client';\n *\n * // Get current session\n * const response = await fetchWithAuth(\n * 'https://auth.erikey.com',\n * 'proj_123',\n * '/get-session'\n * );\n *\n * if (response.success) {\n * console.log('User:', response.data.user);\n * }\n *\n * // Sign in\n * const signInResponse = await fetchWithAuth(\n * 'https://auth.erikey.com',\n * 'proj_123',\n * '/sign-in/email',\n * {\n * method: 'POST',\n * body: JSON.stringify({ email: 'user@example.com', password: 'pass' })\n * }\n * );\n * ```\n */\nexport async function fetchWithAuth<T = any>(\n baseUrl: string,\n projectId: string,\n endpoint: string,\n options?: FetchWithAuthOptions\n): Promise<FetchResponse<T>> {\n // Detect environment\n const inSandpack = isSandpackEnvironment();\n const token = inSandpack ? getStoredToken(projectId) : null;\n\n // Build headers\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'X-Project-Id': projectId,\n ...(options?.headers || {}),\n };\n\n // Add Bearer token for Sandpack\n // Note: Cookie header cannot be set via JavaScript (browser security)\n // So we use Bearer token instead, which auth-api handles specially\n if (token) {\n headers['Authorization'] = `Bearer ${token}`;\n console.log('[Sandpack Auth] Adding Bearer token to request');\n }\n\n // Build full URL\n const url = `${baseUrl}/api/auth${endpoint}`;\n\n console.log('[Sandpack Auth] Making request:', {\n url,\n method: options?.method || 'GET',\n inSandpack,\n hasToken: !!token,\n });\n\n // Make request\n const response = await fetch(url, {\n ...options,\n // CRITICAL: In Sandpack, omit credentials (don't send cookies)\n // In production, include credentials (send cookies normally)\n credentials: inSandpack ? 'omit' : 'include',\n headers,\n });\n\n // Parse response\n let data: any;\n try {\n const text = await response.text();\n data = text ? JSON.parse(text) : {};\n } catch (error) {\n console.error('[Sandpack Auth] Failed to parse response:', error);\n data = {};\n }\n\n // Handle errors\n if (!response.ok) {\n const errorMessage =\n data.error?.message ||\n data.message ||\n `Request failed with status ${response.status}`;\n\n console.error('[Sandpack Auth] Request failed:', {\n status: response.status,\n error: errorMessage,\n });\n\n return {\n success: false,\n error: errorMessage,\n };\n }\n\n console.log('[Sandpack Auth] Request succeeded');\n\n return {\n success: true,\n data,\n };\n}\n\n/**\n * Create a configured fetch function bound to a specific base URL and project ID\n *\n * @param baseUrl - Base URL of the auth API\n * @param projectId - The Erikey project ID\n * @returns Bound fetch function\n *\n * @example\n * ```typescript\n * import { createFetchWithAuth } from '@erikey/sandpack-auth/client';\n *\n * const authFetch = createFetchWithAuth('https://auth.erikey.com', 'proj_123');\n *\n * // Now you can use it without repeating baseUrl/projectId\n * const session = await authFetch('/get-session');\n * const user = await authFetch('/sign-in/email', {\n * method: 'POST',\n * body: JSON.stringify({ email: '...', password: '...' })\n * });\n * ```\n */\nexport function createFetchWithAuth(baseUrl: string, projectId: string) {\n return <T = any>(endpoint: string, options?: FetchWithAuthOptions) =>\n fetchWithAuth<T>(baseUrl, projectId, endpoint, options);\n}\n","/**\n * @erikey/react - React SDK with Sandpack support\n *\n * Wraps universal @erikey/js client with browser-specific enhancements:\n * - Sandpack/iframe detection\n * - localStorage token storage for cross-origin iframes\n * - Automatic fallback when cookies are blocked\n */\n\nimport { createAuthClient as createUniversalClient } from '@erikey/js';\nimport type {\n AuthClientConfig,\n AuthClient as UniversalAuthClient,\n SignUpData,\n SignInData,\n AuthResponse,\n Session,\n} from '@erikey/js';\n\n// Re-export types for convenience\nexport type {\n AuthClientConfig,\n User,\n Session,\n SignUpData,\n SignInData,\n AuthResponse,\n UserResponse,\n SignOutResponse,\n PasswordResetResponse,\n // KV Store types\n KvPair,\n KvBulkSetInput,\n SetValueResponse,\n GetValueResponse,\n GetValuesResponse,\n DeleteValueResponse,\n DeleteValuesResponse,\n SetValuesResponse,\n} from '@erikey/js';\n\n// ============================================================================\n// Sandpack Support - imported from @erikey/sandpack-auth\n// ============================================================================\n\nimport {\n isSandpackEnvironment,\n storeToken,\n getStoredToken,\n clearToken,\n} from '@erikey/sandpack-auth/client';\n\nimport type {\n SetValueResponse,\n GetValueResponse,\n GetValuesResponse,\n DeleteValueResponse,\n DeleteValuesResponse,\n SetValuesResponse,\n KvBulkSetInput,\n} from '@erikey/js';\n\n// ============================================================================\n\n/**\n * Create auth client with Sandpack support\n *\n * Wraps the universal client and adds:\n * - Automatic Sandpack detection\n * - localStorage token storage for iframes\n * - Bearer token fallback when cookies blocked\n */\nexport function createAuthClient(config: AuthClientConfig): UniversalAuthClient {\n const { projectId } = config;\n const baseUrl = config.baseUrl || 'https://auth.erikey.com';\n\n // Create base universal client\n const client = createUniversalClient(config);\n\n // Check if we're in Sandpack\n const inSandpack = isSandpackEnvironment();\n\n if (!inSandpack) {\n // Normal browser - use universal client as-is\n return client;\n }\n\n /**\n * Helper for Bearer token authenticated requests in Sandpack\n */\n const fetchWithBearer = async <T>(\n endpoint: string,\n options?: RequestInit\n ): Promise<T> => {\n const token = getStoredToken(projectId);\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'X-Project-Id': projectId,\n ...(options?.headers as Record<string, string> || {}),\n };\n\n if (token) {\n headers['Authorization'] = `Bearer ${token}`;\n }\n\n const response = await fetch(`${baseUrl}/api/auth${endpoint}`, {\n ...options,\n headers,\n });\n\n const data = await response.json() as any;\n\n if (!response.ok) {\n return {\n success: false,\n error: data?.error?.message || data?.message || 'Request failed',\n } as T;\n }\n\n return {\n success: true,\n data,\n } as T;\n };\n\n // Sandpack environment - wrap with localStorage support\n return {\n signUp: async (data: SignUpData): Promise<AuthResponse> => {\n const result = await client.signUp(data);\n\n // Store token if successful\n if (result.success && result.data?.session) {\n storeToken(projectId, result.data.session);\n }\n\n return result;\n },\n\n signIn: async (data: SignInData): Promise<AuthResponse> => {\n const result = await client.signIn(data);\n\n // Store token if successful\n if (result.success && result.data?.session) {\n storeToken(projectId, result.data.session);\n }\n\n return result;\n },\n\n signOut: async () => {\n const result = await client.signOut();\n\n // Clear stored token\n clearToken(projectId);\n\n return result;\n },\n\n getUser: async () => {\n // Try cookie-based first\n const result = await client.getUser();\n\n if (result.success) {\n return result;\n }\n\n // Fallback: Try with stored token\n const token = getStoredToken(projectId);\n if (token) {\n const response = await fetch(`${baseUrl}/api/auth/session`, {\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'X-Project-Id': projectId,\n },\n });\n\n const data = await response.json() as any;\n\n if (response.ok) {\n return { success: true, data };\n }\n }\n\n return result;\n },\n\n forgotPassword: client.forgotPassword,\n resetPassword: client.resetPassword,\n\n // KV methods - wrapped with Bearer token support for Sandpack\n setValue: async (key: string, value: any): Promise<SetValueResponse> => {\n return fetchWithBearer<SetValueResponse>(`/key-value/${encodeURIComponent(key)}`, {\n method: 'PUT',\n body: JSON.stringify({ value }),\n });\n },\n\n getValue: async (key: string): Promise<GetValueResponse> => {\n const result = await fetchWithBearer<{ success: boolean; data?: any; error?: string }>(\n `/key-value/${encodeURIComponent(key)}`,\n { method: 'GET' }\n );\n\n if (!result.success) {\n return { success: false, error: result.error };\n }\n\n return {\n success: true,\n data: {\n key: result.data.key,\n value: result.data.value,\n createdAt: result.data.createdAt,\n updatedAt: result.data.updatedAt,\n },\n };\n },\n\n getValues: async (): Promise<GetValuesResponse> => {\n const result = await fetchWithBearer<{ success: boolean; data?: any; error?: string }>(\n '/key-value',\n { method: 'GET' }\n );\n\n if (!result.success) {\n return { success: false, error: result.error };\n }\n\n return {\n success: true,\n data: {\n kvPairs: result.data.kvPairs,\n total: result.data.total,\n },\n };\n },\n\n deleteValue: async (key: string): Promise<DeleteValueResponse> => {\n const result = await fetchWithBearer<{ success: boolean; data?: any; error?: string }>(\n `/key-value/${encodeURIComponent(key)}`,\n { method: 'DELETE' }\n );\n\n if (!result.success) {\n return { success: false, error: result.error };\n }\n\n return {\n success: true,\n data: {\n message: result.data.message || 'KV pair deleted',\n },\n };\n },\n\n deleteValues: async (keys: string[]): Promise<DeleteValuesResponse> => {\n if (keys.length === 0) {\n return {\n success: true,\n data: {\n deleted: [],\n failed: [],\n },\n };\n }\n\n const results = await Promise.allSettled(\n keys.map((key) =>\n fetchWithBearer<{ success: boolean; error?: string }>(\n `/key-value/${encodeURIComponent(key)}`,\n { method: 'DELETE' }\n ).then((result) => ({ key, result }))\n )\n );\n\n const deleted: string[] = [];\n const failed: Array<{ key: string; error: string }> = [];\n\n results.forEach((result, index) => {\n if (result.status === 'fulfilled') {\n const { key, result: deleteResult } = result.value;\n if (deleteResult.success) {\n deleted.push(key);\n } else {\n failed.push({\n key,\n error: deleteResult.error || 'Delete failed',\n });\n }\n } else {\n failed.push({\n key: keys[index],\n error: result.reason?.message || 'Request failed',\n });\n }\n });\n\n return {\n success: failed.length === 0,\n data: {\n deleted,\n failed,\n },\n };\n },\n\n setValues: async (kvPairs: KvBulkSetInput[]): Promise<SetValuesResponse> => {\n const result = await fetchWithBearer<{ success: boolean; data?: any; error?: string }>(\n '/key-value/bulk',\n {\n method: 'POST',\n body: JSON.stringify({ kvPairs }),\n }\n );\n\n if (!result.success) {\n return { success: false, error: result.error };\n }\n\n return {\n success: true,\n data: {\n results: result.data.results,\n total: result.data.total,\n },\n };\n },\n };\n}\n\n/**\n * Type helper for inferring the auth client type\n */\nexport type AuthClient = ReturnType<typeof createAuthClient>;\n"],"mappings":"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","names":["createAuthClient","createBetterAuthClient","createAuthClient"]}