@ezcoder.dev/sdk 1.0.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/analytics/index.d.ts +18 -0
- package/dist/analytics/index.js +76 -0
- package/dist/analytics/index.js.map +1 -0
- package/dist/animation/index.d.ts +172 -0
- package/dist/animation/index.js +81 -0
- package/dist/animation/index.js.map +1 -0
- package/dist/auth/index.d.ts +80 -0
- package/dist/auth/index.js +463 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/chunk-5XIZHBKE.js +372 -0
- package/dist/chunk-5XIZHBKE.js.map +1 -0
- package/dist/chunk-G7XDUN3Z.js +141 -0
- package/dist/chunk-G7XDUN3Z.js.map +1 -0
- package/dist/chunk-YNDCD53D.js +212 -0
- package/dist/chunk-YNDCD53D.js.map +1 -0
- package/dist/cms/index.d.ts +44 -0
- package/dist/cms/index.js +106 -0
- package/dist/cms/index.js.map +1 -0
- package/dist/errors/index.d.ts +20 -0
- package/dist/errors/index.js +61 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/notifications/index.d.ts +30 -0
- package/dist/notifications/index.js +191 -0
- package/dist/notifications/index.js.map +1 -0
- package/dist/payments/index.d.ts +89 -0
- package/dist/payments/index.js +408 -0
- package/dist/payments/index.js.map +1 -0
- package/dist/roles/index.d.ts +37 -0
- package/dist/roles/index.js +120 -0
- package/dist/roles/index.js.map +1 -0
- package/dist/seo/index.d.ts +39 -0
- package/dist/seo/index.js +89 -0
- package/dist/seo/index.js.map +1 -0
- package/dist/server/index.d.ts +72 -0
- package/dist/server/index.js +191 -0
- package/dist/server/index.js.map +1 -0
- package/dist/storage/index.d.ts +52 -0
- package/dist/storage/index.js +212 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/types-DtY5lp3P.d.ts +90 -0
- package/package.json +105 -0
|
@@ -0,0 +1,372 @@
|
|
|
1
|
+
import {
|
|
2
|
+
env
|
|
3
|
+
} from "./chunk-G7XDUN3Z.js";
|
|
4
|
+
|
|
5
|
+
// src/core/platform.ts
|
|
6
|
+
var isConfigured = () => Boolean(env.EZCODER_API_URL && env.EZC_PROJECT_ID);
|
|
7
|
+
function getSessionId() {
|
|
8
|
+
if (typeof sessionStorage === "undefined") return "server";
|
|
9
|
+
let sessionId = sessionStorage.getItem("ezcoder_session_id");
|
|
10
|
+
if (!sessionId) {
|
|
11
|
+
sessionId = `sess_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
|
12
|
+
sessionStorage.setItem("ezcoder_session_id", sessionId);
|
|
13
|
+
}
|
|
14
|
+
return sessionId;
|
|
15
|
+
}
|
|
16
|
+
function getVisitorId() {
|
|
17
|
+
if (typeof localStorage === "undefined") return "server";
|
|
18
|
+
let visitorId = localStorage.getItem("ezcoder_visitor_id");
|
|
19
|
+
if (!visitorId) {
|
|
20
|
+
visitorId = `vis_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
|
21
|
+
localStorage.setItem("ezcoder_visitor_id", visitorId);
|
|
22
|
+
}
|
|
23
|
+
return visitorId;
|
|
24
|
+
}
|
|
25
|
+
var pageEntryTime = typeof window !== "undefined" ? Date.now() : 0;
|
|
26
|
+
var currentPath = typeof window !== "undefined" ? window.location.pathname : "/";
|
|
27
|
+
var maxScrollDepth = 0;
|
|
28
|
+
var trackPageEntry = () => {
|
|
29
|
+
pageEntryTime = Date.now();
|
|
30
|
+
currentPath = window.location.pathname;
|
|
31
|
+
maxScrollDepth = 0;
|
|
32
|
+
};
|
|
33
|
+
var getTimeOnPage = () => Date.now() - pageEntryTime;
|
|
34
|
+
var throttle = (fn, wait) => {
|
|
35
|
+
let lastTime = 0;
|
|
36
|
+
return (...args) => {
|
|
37
|
+
const now = Date.now();
|
|
38
|
+
if (now - lastTime >= wait) {
|
|
39
|
+
lastTime = now;
|
|
40
|
+
fn(...args);
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
var trackScrollDepth = () => {
|
|
45
|
+
if (typeof window === "undefined") return;
|
|
46
|
+
const scrollTop = window.scrollY;
|
|
47
|
+
const docHeight = document.documentElement.scrollHeight - window.innerHeight;
|
|
48
|
+
if (docHeight > 0) {
|
|
49
|
+
const scrollPercent = Math.round(scrollTop / docHeight * 100);
|
|
50
|
+
if (scrollPercent > maxScrollDepth) {
|
|
51
|
+
maxScrollDepth = Math.min(scrollPercent, 100);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
var analyticsPost = async (endpoint, body) => {
|
|
56
|
+
if (!isConfigured()) {
|
|
57
|
+
return { success: false, error: "Platform not configured" };
|
|
58
|
+
}
|
|
59
|
+
try {
|
|
60
|
+
const response = await fetch(`${env.EZCODER_API_URL}${endpoint}`, {
|
|
61
|
+
method: "POST",
|
|
62
|
+
headers: { "Content-Type": "application/json" },
|
|
63
|
+
body: JSON.stringify(body)
|
|
64
|
+
});
|
|
65
|
+
if (!response.ok) {
|
|
66
|
+
const error = await response.text();
|
|
67
|
+
return { success: false, error };
|
|
68
|
+
}
|
|
69
|
+
return await response.json();
|
|
70
|
+
} catch (error) {
|
|
71
|
+
const message = error instanceof Error ? error.message : "Unknown error";
|
|
72
|
+
return { success: false, error: message };
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
var stripePost = async (endpoint, body) => {
|
|
76
|
+
if (!env.EZCODER_API_URL) {
|
|
77
|
+
return { success: false, error: "Platform not configured" };
|
|
78
|
+
}
|
|
79
|
+
try {
|
|
80
|
+
const headers = { "Content-Type": "application/json" };
|
|
81
|
+
if (env.EZC_SECRET_KEY) {
|
|
82
|
+
headers["Authorization"] = `Bearer ${env.EZC_SECRET_KEY}`;
|
|
83
|
+
}
|
|
84
|
+
const response = await fetch(`${env.EZCODER_API_URL}${endpoint}`, {
|
|
85
|
+
method: "POST",
|
|
86
|
+
headers,
|
|
87
|
+
body: JSON.stringify(body)
|
|
88
|
+
});
|
|
89
|
+
if (!response.ok) {
|
|
90
|
+
const error = await response.text();
|
|
91
|
+
return { success: false, error };
|
|
92
|
+
}
|
|
93
|
+
return await response.json();
|
|
94
|
+
} catch (error) {
|
|
95
|
+
const message = error instanceof Error ? error.message : "Unknown error";
|
|
96
|
+
return { success: false, error: message };
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
var stripeGet = async (endpoint) => {
|
|
100
|
+
if (!env.EZCODER_API_URL) {
|
|
101
|
+
return { success: false, error: "Platform not configured" };
|
|
102
|
+
}
|
|
103
|
+
try {
|
|
104
|
+
const headers = { "Content-Type": "application/json" };
|
|
105
|
+
if (env.EZC_SECRET_KEY) {
|
|
106
|
+
headers["Authorization"] = `Bearer ${env.EZC_SECRET_KEY}`;
|
|
107
|
+
}
|
|
108
|
+
const response = await fetch(`${env.EZCODER_API_URL}${endpoint}`, {
|
|
109
|
+
method: "GET",
|
|
110
|
+
headers
|
|
111
|
+
});
|
|
112
|
+
if (!response.ok) {
|
|
113
|
+
const error = await response.text();
|
|
114
|
+
return { success: false, error };
|
|
115
|
+
}
|
|
116
|
+
return await response.json();
|
|
117
|
+
} catch (error) {
|
|
118
|
+
const message = error instanceof Error ? error.message : "Unknown error";
|
|
119
|
+
return { success: false, error: message };
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
var sendPageExit = () => {
|
|
123
|
+
if (!isConfigured() || typeof navigator === "undefined") return;
|
|
124
|
+
const payload = JSON.stringify({
|
|
125
|
+
type: "page_exit",
|
|
126
|
+
projectId: env.EZC_PROJECT_ID,
|
|
127
|
+
sessionId: getSessionId(),
|
|
128
|
+
visitorId: getVisitorId(),
|
|
129
|
+
pathname: currentPath,
|
|
130
|
+
timeOnPage: getTimeOnPage(),
|
|
131
|
+
scrollDepth: maxScrollDepth,
|
|
132
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
133
|
+
});
|
|
134
|
+
if (navigator.sendBeacon) {
|
|
135
|
+
navigator.sendBeacon(`${env.EZCODER_API_URL}/api/analytics/collect`, payload);
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
var ezcoder = {
|
|
139
|
+
isConfigured,
|
|
140
|
+
analytics: {
|
|
141
|
+
track: (eventType, properties = {}) => {
|
|
142
|
+
return analyticsPost("/api/analytics/collect", {
|
|
143
|
+
type: eventType,
|
|
144
|
+
projectId: env.EZC_PROJECT_ID,
|
|
145
|
+
sessionId: getSessionId(),
|
|
146
|
+
visitorId: getVisitorId(),
|
|
147
|
+
url: typeof window !== "undefined" ? window.location.href : "",
|
|
148
|
+
pathname: typeof window !== "undefined" ? window.location.pathname : "/",
|
|
149
|
+
referrer: typeof document !== "undefined" ? document.referrer : "",
|
|
150
|
+
userAgent: typeof navigator !== "undefined" ? navigator.userAgent : "",
|
|
151
|
+
screenResolution: typeof window !== "undefined" ? `${window.screen.width}x${window.screen.height}` : "",
|
|
152
|
+
viewport: typeof window !== "undefined" ? `${window.innerWidth}x${window.innerHeight}` : "",
|
|
153
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
154
|
+
metadata: properties
|
|
155
|
+
});
|
|
156
|
+
},
|
|
157
|
+
pageView: (path) => {
|
|
158
|
+
trackPageEntry();
|
|
159
|
+
return ezcoder.analytics.track("page_view", {
|
|
160
|
+
path: path || (typeof window !== "undefined" ? window.location.pathname : "/"),
|
|
161
|
+
title: typeof document !== "undefined" ? document.title : ""
|
|
162
|
+
});
|
|
163
|
+
},
|
|
164
|
+
identify: (userId, traits = {}) => {
|
|
165
|
+
return ezcoder.analytics.track("identify", { userId, ...traits });
|
|
166
|
+
},
|
|
167
|
+
error: (message, context = {}) => {
|
|
168
|
+
return ezcoder.analytics.track("error", {
|
|
169
|
+
message,
|
|
170
|
+
...context,
|
|
171
|
+
stack: context.stack || new Error().stack
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
},
|
|
175
|
+
stripe: {
|
|
176
|
+
createCheckout: async (priceId, options = {}) => {
|
|
177
|
+
const result = await stripePost("/api/stripe/create-checkout", {
|
|
178
|
+
priceId,
|
|
179
|
+
projectId: env.EZC_PROJECT_ID,
|
|
180
|
+
successUrl: options.successUrl || `${typeof window !== "undefined" ? window.location.origin : ""}/payment/success`,
|
|
181
|
+
cancelUrl: options.cancelUrl || `${typeof window !== "undefined" ? window.location.origin : ""}/payment/cancel`,
|
|
182
|
+
customerEmail: options.customerEmail,
|
|
183
|
+
quantity: options.quantity || 1
|
|
184
|
+
});
|
|
185
|
+
if (result.url && options.redirect !== false && typeof window !== "undefined") {
|
|
186
|
+
window.location.href = result.url;
|
|
187
|
+
}
|
|
188
|
+
return result;
|
|
189
|
+
},
|
|
190
|
+
getProducts: async () => {
|
|
191
|
+
return { products: [], message: "Products managed via EzCoder dashboard" };
|
|
192
|
+
},
|
|
193
|
+
verifySession: async (sessionId) => {
|
|
194
|
+
if (!sessionId) {
|
|
195
|
+
return { success: false, error: "Session ID is required" };
|
|
196
|
+
}
|
|
197
|
+
return stripeGet(`/api/stripe/verify-session?session_id=${encodeURIComponent(sessionId)}`);
|
|
198
|
+
},
|
|
199
|
+
getCustomerStatus: async (options = {}) => {
|
|
200
|
+
const params = new URLSearchParams();
|
|
201
|
+
if (options.customerId) params.set("customer_id", options.customerId);
|
|
202
|
+
if (options.email) params.set("email", options.email);
|
|
203
|
+
if (!options.customerId && !options.email) {
|
|
204
|
+
return { success: false, error: "Either customerId or email is required" };
|
|
205
|
+
}
|
|
206
|
+
return stripeGet(`/api/stripe/customer-status?${params.toString()}`);
|
|
207
|
+
},
|
|
208
|
+
createPortalSession: async (customerId, options = {}) => {
|
|
209
|
+
const result = await stripePost("/api/stripe/customer-portal", {
|
|
210
|
+
customerId,
|
|
211
|
+
returnUrl: options.returnUrl || window.location.href
|
|
212
|
+
});
|
|
213
|
+
if (result.url && options.redirect !== false && typeof window !== "undefined") {
|
|
214
|
+
window.location.href = result.url;
|
|
215
|
+
}
|
|
216
|
+
return result;
|
|
217
|
+
}
|
|
218
|
+
},
|
|
219
|
+
users: {
|
|
220
|
+
trackSignup: (userId, email, role = null) => {
|
|
221
|
+
return ezcoder.analytics.track("user_signup", { userId, email, role, signupMethod: "email" });
|
|
222
|
+
},
|
|
223
|
+
trackLogin: (userId) => {
|
|
224
|
+
return ezcoder.analytics.track("user_login", { userId });
|
|
225
|
+
},
|
|
226
|
+
trackLogout: (userId) => {
|
|
227
|
+
return ezcoder.analytics.track("user_logout", { userId });
|
|
228
|
+
},
|
|
229
|
+
trackRoleChange: (userId, oldRole, newRole) => {
|
|
230
|
+
return ezcoder.analytics.track("role_change", { userId, oldRole, newRole });
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
};
|
|
234
|
+
var ezcoderAuthIntegration = {
|
|
235
|
+
onLogin: (user) => {
|
|
236
|
+
if (user?.id) {
|
|
237
|
+
ezcoder.analytics.identify(user.id, {
|
|
238
|
+
email: user.email,
|
|
239
|
+
name: user.user_metadata?.full_name
|
|
240
|
+
});
|
|
241
|
+
ezcoder.users.trackLogin(user.id);
|
|
242
|
+
}
|
|
243
|
+
},
|
|
244
|
+
onSignup: (user) => {
|
|
245
|
+
if (user?.id) {
|
|
246
|
+
ezcoder.analytics.identify(user.id, { email: user.email });
|
|
247
|
+
ezcoder.users.trackSignup(user.id, user.email || "");
|
|
248
|
+
}
|
|
249
|
+
},
|
|
250
|
+
onLogout: (userId) => {
|
|
251
|
+
if (userId) {
|
|
252
|
+
ezcoder.users.trackLogout(userId);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
};
|
|
256
|
+
var trackWebVitals = () => {
|
|
257
|
+
if (typeof window === "undefined" || !("PerformanceObserver" in window)) return;
|
|
258
|
+
try {
|
|
259
|
+
new PerformanceObserver((list) => {
|
|
260
|
+
const entries = list.getEntries();
|
|
261
|
+
const lastEntry = entries[entries.length - 1];
|
|
262
|
+
if (lastEntry) {
|
|
263
|
+
ezcoder.analytics.track("web_vital", {
|
|
264
|
+
metric: "LCP",
|
|
265
|
+
value: Math.round(lastEntry.startTime),
|
|
266
|
+
pathname: window.location.pathname
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
}).observe({ type: "largest-contentful-paint", buffered: true });
|
|
270
|
+
} catch {
|
|
271
|
+
}
|
|
272
|
+
try {
|
|
273
|
+
new PerformanceObserver((list) => {
|
|
274
|
+
const entry = list.getEntries()[0];
|
|
275
|
+
if (entry) {
|
|
276
|
+
ezcoder.analytics.track("web_vital", {
|
|
277
|
+
metric: "FID",
|
|
278
|
+
value: Math.round(entry.processingStart - entry.startTime),
|
|
279
|
+
pathname: window.location.pathname
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
}).observe({ type: "first-input", buffered: true });
|
|
283
|
+
} catch {
|
|
284
|
+
}
|
|
285
|
+
try {
|
|
286
|
+
let clsValue = 0;
|
|
287
|
+
new PerformanceObserver((list) => {
|
|
288
|
+
for (const entry of list.getEntries()) {
|
|
289
|
+
if (!entry.hadRecentInput) {
|
|
290
|
+
clsValue += entry.value;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
}).observe({ type: "layout-shift", buffered: true });
|
|
294
|
+
document.addEventListener("visibilitychange", () => {
|
|
295
|
+
if (document.hidden && clsValue > 0) {
|
|
296
|
+
ezcoder.analytics.track("web_vital", {
|
|
297
|
+
metric: "CLS",
|
|
298
|
+
value: Math.round(clsValue * 1e3) / 1e3,
|
|
299
|
+
pathname: window.location.pathname
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
});
|
|
303
|
+
} catch {
|
|
304
|
+
}
|
|
305
|
+
};
|
|
306
|
+
var setupErrorTracking = () => {
|
|
307
|
+
if (typeof window === "undefined") return;
|
|
308
|
+
window.onerror = (message, source, lineno, colno, error) => {
|
|
309
|
+
ezcoder.analytics.track("js_error", {
|
|
310
|
+
message: String(message),
|
|
311
|
+
source,
|
|
312
|
+
lineno,
|
|
313
|
+
colno,
|
|
314
|
+
stack: error?.stack,
|
|
315
|
+
pathname: window.location.pathname
|
|
316
|
+
});
|
|
317
|
+
return false;
|
|
318
|
+
};
|
|
319
|
+
window.addEventListener("unhandledrejection", (event) => {
|
|
320
|
+
ezcoder.analytics.track("promise_rejection", {
|
|
321
|
+
reason: event.reason?.message || String(event.reason),
|
|
322
|
+
stack: event.reason?.stack,
|
|
323
|
+
pathname: window.location.pathname
|
|
324
|
+
});
|
|
325
|
+
});
|
|
326
|
+
};
|
|
327
|
+
if (typeof window !== "undefined") {
|
|
328
|
+
window.addEventListener("scroll", throttle(trackScrollDepth, 500), { passive: true });
|
|
329
|
+
window.addEventListener("beforeunload", sendPageExit);
|
|
330
|
+
document.addEventListener("visibilitychange", () => {
|
|
331
|
+
if (!isConfigured()) return;
|
|
332
|
+
if (document.hidden) {
|
|
333
|
+
ezcoder.analytics.track("page_blur", {
|
|
334
|
+
timeOnPage: getTimeOnPage(),
|
|
335
|
+
scrollDepth: maxScrollDepth,
|
|
336
|
+
pathname: currentPath
|
|
337
|
+
});
|
|
338
|
+
} else {
|
|
339
|
+
ezcoder.analytics.track("page_focus", { pathname: window.location.pathname });
|
|
340
|
+
}
|
|
341
|
+
});
|
|
342
|
+
const originalPushState = history.pushState;
|
|
343
|
+
history.pushState = function(...args) {
|
|
344
|
+
sendPageExit();
|
|
345
|
+
originalPushState.apply(this, args);
|
|
346
|
+
trackPageEntry();
|
|
347
|
+
if (isConfigured()) ezcoder.analytics.pageView();
|
|
348
|
+
};
|
|
349
|
+
const originalReplaceState = history.replaceState;
|
|
350
|
+
history.replaceState = function(...args) {
|
|
351
|
+
originalReplaceState.apply(this, args);
|
|
352
|
+
trackPageEntry();
|
|
353
|
+
};
|
|
354
|
+
window.addEventListener("popstate", () => {
|
|
355
|
+
sendPageExit();
|
|
356
|
+
trackPageEntry();
|
|
357
|
+
if (isConfigured()) ezcoder.analytics.pageView();
|
|
358
|
+
});
|
|
359
|
+
if (isConfigured()) {
|
|
360
|
+
setTimeout(() => {
|
|
361
|
+
ezcoder.analytics.pageView();
|
|
362
|
+
trackWebVitals();
|
|
363
|
+
setupErrorTracking();
|
|
364
|
+
}, 100);
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
export {
|
|
369
|
+
ezcoder,
|
|
370
|
+
ezcoderAuthIntegration
|
|
371
|
+
};
|
|
372
|
+
//# sourceMappingURL=chunk-5XIZHBKE.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/platform.ts"],"sourcesContent":["import { env } from './config';\nimport type { AnalyticsResult, CheckoutOptions, EzcoderClient, AuthIntegration, AuthUser } from './types';\n\nconst isConfigured = (): boolean => Boolean(env.EZCODER_API_URL && env.EZC_PROJECT_ID);\n\nfunction getSessionId(): string {\n if (typeof sessionStorage === 'undefined') return 'server';\n let sessionId = sessionStorage.getItem('ezcoder_session_id');\n if (!sessionId) {\n sessionId = `sess_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n sessionStorage.setItem('ezcoder_session_id', sessionId);\n }\n return sessionId;\n}\n\nfunction getVisitorId(): string {\n if (typeof localStorage === 'undefined') return 'server';\n let visitorId = localStorage.getItem('ezcoder_visitor_id');\n if (!visitorId) {\n visitorId = `vis_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n localStorage.setItem('ezcoder_visitor_id', visitorId);\n }\n return visitorId;\n}\n\nlet pageEntryTime: number = typeof window !== 'undefined' ? Date.now() : 0;\nlet currentPath: string = typeof window !== 'undefined' ? window.location.pathname : '/';\nlet maxScrollDepth: number = 0;\n\nconst trackPageEntry = (): void => {\n pageEntryTime = Date.now();\n currentPath = window.location.pathname;\n maxScrollDepth = 0;\n};\n\nconst getTimeOnPage = (): number => Date.now() - pageEntryTime;\n\nconst throttle = <T extends (...args: never[]) => void>(fn: T, wait: number): ((...args: Parameters<T>) => void) => {\n let lastTime = 0;\n return (...args: Parameters<T>) => {\n const now = Date.now();\n if (now - lastTime >= wait) {\n lastTime = now;\n fn(...args);\n }\n };\n};\n\nconst trackScrollDepth = (): void => {\n if (typeof window === 'undefined') return;\n const scrollTop = window.scrollY;\n const docHeight = document.documentElement.scrollHeight - window.innerHeight;\n if (docHeight > 0) {\n const scrollPercent = Math.round((scrollTop / docHeight) * 100);\n if (scrollPercent > maxScrollDepth) {\n maxScrollDepth = Math.min(scrollPercent, 100);\n }\n }\n};\n\nconst analyticsPost = async (endpoint: string, body: Record<string, unknown>): Promise<AnalyticsResult> => {\n if (!isConfigured()) {\n return { success: false, error: 'Platform not configured' };\n }\n\n try {\n const response = await fetch(`${env.EZCODER_API_URL}${endpoint}`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const error = await response.text();\n return { success: false, error };\n }\n\n return await response.json();\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n return { success: false, error: message };\n }\n};\n\nconst stripePost = async (endpoint: string, body: Record<string, unknown>): Promise<AnalyticsResult & Record<string, unknown>> => {\n if (!env.EZCODER_API_URL) {\n return { success: false, error: 'Platform not configured' };\n }\n\n try {\n const headers: Record<string, string> = { 'Content-Type': 'application/json' };\n if (env.EZC_SECRET_KEY) {\n headers['Authorization'] = `Bearer ${env.EZC_SECRET_KEY}`;\n }\n\n const response = await fetch(`${env.EZCODER_API_URL}${endpoint}`, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const error = await response.text();\n return { success: false, error };\n }\n\n return await response.json();\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n return { success: false, error: message };\n }\n};\n\nconst stripeGet = async (endpoint: string): Promise<AnalyticsResult & Record<string, unknown>> => {\n if (!env.EZCODER_API_URL) {\n return { success: false, error: 'Platform not configured' };\n }\n\n try {\n const headers: Record<string, string> = { 'Content-Type': 'application/json' };\n if (env.EZC_SECRET_KEY) {\n headers['Authorization'] = `Bearer ${env.EZC_SECRET_KEY}`;\n }\n\n const response = await fetch(`${env.EZCODER_API_URL}${endpoint}`, {\n method: 'GET',\n headers,\n });\n\n if (!response.ok) {\n const error = await response.text();\n return { success: false, error };\n }\n\n return await response.json();\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n return { success: false, error: message };\n }\n};\n\nconst sendPageExit = (): void => {\n if (!isConfigured() || typeof navigator === 'undefined') return;\n\n const payload = JSON.stringify({\n type: 'page_exit',\n projectId: env.EZC_PROJECT_ID,\n sessionId: getSessionId(),\n visitorId: getVisitorId(),\n pathname: currentPath,\n timeOnPage: getTimeOnPage(),\n scrollDepth: maxScrollDepth,\n timestamp: new Date().toISOString(),\n });\n\n if (navigator.sendBeacon) {\n navigator.sendBeacon(`${env.EZCODER_API_URL}/api/analytics/collect`, payload);\n }\n};\n\nexport const ezcoder: EzcoderClient = {\n isConfigured,\n\n analytics: {\n track: (eventType: string, properties: Record<string, unknown> = {}) => {\n return analyticsPost('/api/analytics/collect', {\n type: eventType,\n projectId: env.EZC_PROJECT_ID,\n sessionId: getSessionId(),\n visitorId: getVisitorId(),\n url: typeof window !== 'undefined' ? window.location.href : '',\n pathname: typeof window !== 'undefined' ? window.location.pathname : '/',\n referrer: typeof document !== 'undefined' ? document.referrer : '',\n userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : '',\n screenResolution: typeof window !== 'undefined'\n ? `${window.screen.width}x${window.screen.height}`\n : '',\n viewport: typeof window !== 'undefined'\n ? `${window.innerWidth}x${window.innerHeight}`\n : '',\n timestamp: new Date().toISOString(),\n metadata: properties,\n });\n },\n\n pageView: (path?: string) => {\n trackPageEntry();\n return ezcoder.analytics.track('page_view', {\n path: path || (typeof window !== 'undefined' ? window.location.pathname : '/'),\n title: typeof document !== 'undefined' ? document.title : '',\n });\n },\n\n identify: (userId: string, traits: Record<string, unknown> = {}) => {\n return ezcoder.analytics.track('identify', { userId, ...traits });\n },\n\n error: (message: string, context: Record<string, unknown> = {}) => {\n return ezcoder.analytics.track('error', {\n message,\n ...context,\n stack: (context.stack as string) || new Error().stack,\n });\n },\n },\n\n stripe: {\n createCheckout: async (priceId: string, options: CheckoutOptions = {}) => {\n const result = await stripePost('/api/stripe/create-checkout', {\n priceId,\n projectId: env.EZC_PROJECT_ID,\n successUrl: options.successUrl || `${typeof window !== 'undefined' ? window.location.origin : ''}/payment/success`,\n cancelUrl: options.cancelUrl || `${typeof window !== 'undefined' ? window.location.origin : ''}/payment/cancel`,\n customerEmail: options.customerEmail,\n quantity: options.quantity || 1,\n });\n\n if (result.url && options.redirect !== false && typeof window !== 'undefined') {\n window.location.href = result.url as string;\n }\n\n return result;\n },\n\n getProducts: async () => {\n return { products: [], message: 'Products managed via EzCoder dashboard' };\n },\n\n verifySession: async (sessionId: string) => {\n if (!sessionId) {\n return { success: false, error: 'Session ID is required' };\n }\n return stripeGet(`/api/stripe/verify-session?session_id=${encodeURIComponent(sessionId)}`);\n },\n\n getCustomerStatus: async (options: { customerId?: string; email?: string } = {}) => {\n const params = new URLSearchParams();\n if (options.customerId) params.set('customer_id', options.customerId);\n if (options.email) params.set('email', options.email);\n\n if (!options.customerId && !options.email) {\n return { success: false, error: 'Either customerId or email is required' };\n }\n\n return stripeGet(`/api/stripe/customer-status?${params.toString()}`);\n },\n\n createPortalSession: async (customerId: string, options: { returnUrl?: string; redirect?: boolean } = {}) => {\n const result = await stripePost('/api/stripe/customer-portal', {\n customerId,\n returnUrl: options.returnUrl || window.location.href,\n });\n\n if (result.url && options.redirect !== false && typeof window !== 'undefined') {\n window.location.href = result.url as string;\n }\n\n return result;\n },\n },\n\n users: {\n trackSignup: (userId: string, email: string, role: string | null = null) => {\n return ezcoder.analytics.track('user_signup', { userId, email, role, signupMethod: 'email' });\n },\n\n trackLogin: (userId: string) => {\n return ezcoder.analytics.track('user_login', { userId });\n },\n\n trackLogout: (userId: string) => {\n return ezcoder.analytics.track('user_logout', { userId });\n },\n\n trackRoleChange: (userId: string, oldRole: string, newRole: string) => {\n return ezcoder.analytics.track('role_change', { userId, oldRole, newRole });\n },\n },\n};\n\nexport const ezcoderAuthIntegration: AuthIntegration = {\n onLogin: (user: AuthUser) => {\n if (user?.id) {\n ezcoder.analytics.identify(user.id, {\n email: user.email,\n name: user.user_metadata?.full_name,\n });\n ezcoder.users.trackLogin(user.id);\n }\n },\n onSignup: (user: AuthUser) => {\n if (user?.id) {\n ezcoder.analytics.identify(user.id, { email: user.email });\n ezcoder.users.trackSignup(user.id, user.email || '');\n }\n },\n onLogout: (userId: string) => {\n if (userId) {\n ezcoder.users.trackLogout(userId);\n }\n },\n};\n\ninterface LayoutShift extends PerformanceEntry {\n hadRecentInput: boolean;\n value: number;\n}\n\ninterface PerformanceEventTiming extends PerformanceEntry {\n processingStart: number;\n}\n\nconst trackWebVitals = (): void => {\n if (typeof window === 'undefined' || !('PerformanceObserver' in window)) return;\n\n try {\n new PerformanceObserver((list) => {\n const entries = list.getEntries();\n const lastEntry = entries[entries.length - 1];\n if (lastEntry) {\n ezcoder.analytics.track('web_vital', {\n metric: 'LCP',\n value: Math.round(lastEntry.startTime),\n pathname: window.location.pathname,\n });\n }\n }).observe({ type: 'largest-contentful-paint', buffered: true });\n } catch { /* LCP not supported */ }\n\n try {\n new PerformanceObserver((list) => {\n const entry = list.getEntries()[0] as PerformanceEventTiming;\n if (entry) {\n ezcoder.analytics.track('web_vital', {\n metric: 'FID',\n value: Math.round(entry.processingStart - entry.startTime),\n pathname: window.location.pathname,\n });\n }\n }).observe({ type: 'first-input', buffered: true });\n } catch { /* FID not supported */ }\n\n try {\n let clsValue = 0;\n new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n if (!(entry as LayoutShift).hadRecentInput) {\n clsValue += (entry as LayoutShift).value;\n }\n }\n }).observe({ type: 'layout-shift', buffered: true });\n\n document.addEventListener('visibilitychange', () => {\n if (document.hidden && clsValue > 0) {\n ezcoder.analytics.track('web_vital', {\n metric: 'CLS',\n value: Math.round(clsValue * 1000) / 1000,\n pathname: window.location.pathname,\n });\n }\n });\n } catch { /* CLS not supported */ }\n};\n\nconst setupErrorTracking = (): void => {\n if (typeof window === 'undefined') return;\n\n window.onerror = (message, source, lineno, colno, error) => {\n ezcoder.analytics.track('js_error', {\n message: String(message),\n source,\n lineno,\n colno,\n stack: error?.stack,\n pathname: window.location.pathname,\n });\n return false;\n };\n\n window.addEventListener('unhandledrejection', (event: PromiseRejectionEvent) => {\n ezcoder.analytics.track('promise_rejection', {\n reason: event.reason?.message || String(event.reason),\n stack: event.reason?.stack,\n pathname: window.location.pathname,\n });\n });\n};\n\nif (typeof window !== 'undefined') {\n window.addEventListener('scroll', throttle(trackScrollDepth, 500), { passive: true });\n window.addEventListener('beforeunload', sendPageExit);\n\n document.addEventListener('visibilitychange', () => {\n if (!isConfigured()) return;\n if (document.hidden) {\n ezcoder.analytics.track('page_blur', {\n timeOnPage: getTimeOnPage(),\n scrollDepth: maxScrollDepth,\n pathname: currentPath,\n });\n } else {\n ezcoder.analytics.track('page_focus', { pathname: window.location.pathname });\n }\n });\n\n const originalPushState = history.pushState;\n history.pushState = function (...args: Parameters<typeof history.pushState>) {\n sendPageExit();\n originalPushState.apply(this, args);\n trackPageEntry();\n if (isConfigured()) ezcoder.analytics.pageView();\n };\n\n const originalReplaceState = history.replaceState;\n history.replaceState = function (...args: Parameters<typeof history.replaceState>) {\n originalReplaceState.apply(this, args);\n trackPageEntry();\n };\n\n window.addEventListener('popstate', () => {\n sendPageExit();\n trackPageEntry();\n if (isConfigured()) ezcoder.analytics.pageView();\n });\n\n if (isConfigured()) {\n setTimeout(() => {\n ezcoder.analytics.pageView();\n trackWebVitals();\n setupErrorTracking();\n }, 100);\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
// src/core/config.ts
|
|
2
|
+
var getEnv = (viteKey, nextKey) => {
|
|
3
|
+
try {
|
|
4
|
+
if (typeof import.meta !== "undefined" && import.meta.env) {
|
|
5
|
+
return import.meta.env[viteKey] || "";
|
|
6
|
+
}
|
|
7
|
+
} catch {
|
|
8
|
+
}
|
|
9
|
+
try {
|
|
10
|
+
if (typeof process !== "undefined" && process.env) {
|
|
11
|
+
return process.env[nextKey || viteKey] || "";
|
|
12
|
+
}
|
|
13
|
+
} catch {
|
|
14
|
+
}
|
|
15
|
+
return "";
|
|
16
|
+
};
|
|
17
|
+
var env = {
|
|
18
|
+
SUPABASE_URL: getEnv("VITE_SUPABASE_URL", "NEXT_PUBLIC_SUPABASE_URL"),
|
|
19
|
+
SUPABASE_ANON_KEY: getEnv("VITE_SUPABASE_ANON_KEY", "NEXT_PUBLIC_SUPABASE_ANON_KEY"),
|
|
20
|
+
STRIPE_PUBLISHABLE_KEY: getEnv("VITE_STRIPE_PUBLISHABLE_KEY", "NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY"),
|
|
21
|
+
EZC_PROJECT_ID: getEnv("VITE_EZC_PROJECT_ID", "NEXT_PUBLIC_EZC_PROJECT_ID"),
|
|
22
|
+
EZCODER_API_URL: getEnv("VITE_EZCODER_API_URL", "NEXT_PUBLIC_EZCODER_API_URL"),
|
|
23
|
+
EZC_SECRET_KEY: getEnv("VITE_EZC_SECRET_KEY", "EZC_SECRET_KEY"),
|
|
24
|
+
S3_BUCKET: getEnv("VITE_S3_BUCKET", "S3_BUCKET"),
|
|
25
|
+
CLOUDINARY_URL: getEnv("VITE_CLOUDINARY_URL", "CLOUDINARY_URL")
|
|
26
|
+
};
|
|
27
|
+
var features = {
|
|
28
|
+
auth: Boolean(env.SUPABASE_URL && env.SUPABASE_ANON_KEY),
|
|
29
|
+
payments: Boolean(env.STRIPE_PUBLISHABLE_KEY),
|
|
30
|
+
analytics: Boolean(env.EZCODER_API_URL && env.EZC_PROJECT_ID),
|
|
31
|
+
storage: Boolean(env.SUPABASE_URL || env.S3_BUCKET || env.CLOUDINARY_URL),
|
|
32
|
+
database: Boolean(env.SUPABASE_URL)
|
|
33
|
+
};
|
|
34
|
+
function isFeatureConfigured(feature) {
|
|
35
|
+
return features[feature];
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// src/core/supabase.ts
|
|
39
|
+
import { createClient } from "@supabase/supabase-js";
|
|
40
|
+
function createStubClient() {
|
|
41
|
+
const notConfiguredError = new Error("Supabase not configured");
|
|
42
|
+
function createQueryBuilder() {
|
|
43
|
+
const builder = {
|
|
44
|
+
select: () => builder,
|
|
45
|
+
insert: () => builder,
|
|
46
|
+
update: () => builder,
|
|
47
|
+
upsert: () => builder,
|
|
48
|
+
delete: () => builder,
|
|
49
|
+
eq: () => builder,
|
|
50
|
+
neq: () => builder,
|
|
51
|
+
gt: () => builder,
|
|
52
|
+
gte: () => builder,
|
|
53
|
+
lt: () => builder,
|
|
54
|
+
lte: () => builder,
|
|
55
|
+
like: () => builder,
|
|
56
|
+
ilike: () => builder,
|
|
57
|
+
is: () => builder,
|
|
58
|
+
in: () => builder,
|
|
59
|
+
contains: () => builder,
|
|
60
|
+
containedBy: () => builder,
|
|
61
|
+
match: () => builder,
|
|
62
|
+
not: () => builder,
|
|
63
|
+
or: () => builder,
|
|
64
|
+
filter: () => builder,
|
|
65
|
+
order: () => builder,
|
|
66
|
+
limit: () => builder,
|
|
67
|
+
range: () => builder,
|
|
68
|
+
textSearch: () => builder,
|
|
69
|
+
csv: () => builder,
|
|
70
|
+
single: () => Promise.resolve({ data: null, error: null }),
|
|
71
|
+
maybeSingle: () => Promise.resolve({ data: null, error: null }),
|
|
72
|
+
then: (resolve, reject) => Promise.resolve({ data: [], error: null }).then(resolve, reject),
|
|
73
|
+
catch: (fn) => Promise.resolve({ data: [], error: null }).catch(fn)
|
|
74
|
+
};
|
|
75
|
+
return builder;
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
auth: {
|
|
79
|
+
getSession: async () => ({ data: { session: null }, error: null }),
|
|
80
|
+
getUser: async () => ({ data: { user: null }, error: null }),
|
|
81
|
+
signUp: async () => ({ data: null, error: notConfiguredError }),
|
|
82
|
+
signInWithPassword: async () => ({ data: null, error: notConfiguredError }),
|
|
83
|
+
signInWithOAuth: async () => ({ data: null, error: notConfiguredError }),
|
|
84
|
+
signOut: async () => ({ error: null }),
|
|
85
|
+
resetPasswordForEmail: async () => ({ data: null, error: notConfiguredError }),
|
|
86
|
+
updateUser: async () => ({ data: null, error: notConfiguredError }),
|
|
87
|
+
onAuthStateChange: (callback) => {
|
|
88
|
+
if (typeof window !== "undefined") {
|
|
89
|
+
setTimeout(() => callback("INITIAL_SESSION", null), 0);
|
|
90
|
+
}
|
|
91
|
+
return { data: { subscription: { unsubscribe: () => {
|
|
92
|
+
} } } };
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
from: () => createQueryBuilder(),
|
|
96
|
+
rpc: async () => ({ data: null, error: notConfiguredError }),
|
|
97
|
+
channel: (_name) => ({
|
|
98
|
+
on: (_event, _filter, _callback) => ({
|
|
99
|
+
subscribe: (cb) => {
|
|
100
|
+
if (cb) cb("SUBSCRIBED");
|
|
101
|
+
return { unsubscribe: () => {
|
|
102
|
+
} };
|
|
103
|
+
}
|
|
104
|
+
}),
|
|
105
|
+
subscribe: (cb) => {
|
|
106
|
+
if (cb) cb("SUBSCRIBED");
|
|
107
|
+
return { unsubscribe: () => {
|
|
108
|
+
} };
|
|
109
|
+
}
|
|
110
|
+
}),
|
|
111
|
+
removeChannel: () => Promise.resolve("ok"),
|
|
112
|
+
removeAllChannels: () => Promise.resolve([]),
|
|
113
|
+
storage: {
|
|
114
|
+
from: () => ({
|
|
115
|
+
upload: async () => ({ data: null, error: notConfiguredError }),
|
|
116
|
+
download: async () => ({ data: null, error: notConfiguredError }),
|
|
117
|
+
getPublicUrl: () => ({ data: { publicUrl: "" } }),
|
|
118
|
+
createSignedUrl: async () => ({ data: null, error: notConfiguredError }),
|
|
119
|
+
list: async () => ({ data: [], error: null }),
|
|
120
|
+
remove: async () => ({ data: [], error: null })
|
|
121
|
+
})
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
var supabase = features.auth ? createClient(env.SUPABASE_URL, env.SUPABASE_ANON_KEY, {
|
|
126
|
+
auth: {
|
|
127
|
+
autoRefreshToken: true,
|
|
128
|
+
persistSession: true,
|
|
129
|
+
detectSessionInUrl: true
|
|
130
|
+
}
|
|
131
|
+
}) : createStubClient();
|
|
132
|
+
var isSupabaseConfigured = features.auth;
|
|
133
|
+
|
|
134
|
+
export {
|
|
135
|
+
env,
|
|
136
|
+
features,
|
|
137
|
+
isFeatureConfigured,
|
|
138
|
+
supabase,
|
|
139
|
+
isSupabaseConfigured
|
|
140
|
+
};
|
|
141
|
+
//# sourceMappingURL=chunk-G7XDUN3Z.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/config.ts","../src/core/supabase.ts"],"sourcesContent":["const getEnv = (viteKey: string, nextKey?: string): string => {\n try {\n if (typeof import.meta !== 'undefined' && import.meta.env) {\n return (import.meta.env[viteKey] as string) || '';\n }\n } catch {\n // import.meta not available\n }\n try {\n if (typeof process !== 'undefined' && process.env) {\n return process.env[nextKey || viteKey] || '';\n }\n } catch {\n // process not available\n }\n return '';\n};\n\nexport const env = {\n SUPABASE_URL: getEnv('VITE_SUPABASE_URL', 'NEXT_PUBLIC_SUPABASE_URL'),\n SUPABASE_ANON_KEY: getEnv('VITE_SUPABASE_ANON_KEY', 'NEXT_PUBLIC_SUPABASE_ANON_KEY'),\n STRIPE_PUBLISHABLE_KEY: getEnv('VITE_STRIPE_PUBLISHABLE_KEY', 'NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY'),\n EZC_PROJECT_ID: getEnv('VITE_EZC_PROJECT_ID', 'NEXT_PUBLIC_EZC_PROJECT_ID'),\n EZCODER_API_URL: getEnv('VITE_EZCODER_API_URL', 'NEXT_PUBLIC_EZCODER_API_URL'),\n EZC_SECRET_KEY: getEnv('VITE_EZC_SECRET_KEY', 'EZC_SECRET_KEY'),\n S3_BUCKET: getEnv('VITE_S3_BUCKET', 'S3_BUCKET'),\n CLOUDINARY_URL: getEnv('VITE_CLOUDINARY_URL', 'CLOUDINARY_URL'),\n};\n\nexport const features = {\n auth: Boolean(env.SUPABASE_URL && env.SUPABASE_ANON_KEY),\n payments: Boolean(env.STRIPE_PUBLISHABLE_KEY),\n analytics: Boolean(env.EZCODER_API_URL && env.EZC_PROJECT_ID),\n storage: Boolean(env.SUPABASE_URL || env.S3_BUCKET || env.CLOUDINARY_URL),\n database: Boolean(env.SUPABASE_URL),\n};\n\nexport function isFeatureConfigured(feature: keyof typeof features): boolean {\n return features[feature];\n}\n","import { createClient, SupabaseClient } from '@supabase/supabase-js';\nimport { env, features } from './config';\n\nfunction createStubClient(): SupabaseClient {\n const notConfiguredError = new Error('Supabase not configured');\n\n function createQueryBuilder() {\n const builder: Record<string, unknown> = {\n select: () => builder,\n insert: () => builder,\n update: () => builder,\n upsert: () => builder,\n delete: () => builder,\n eq: () => builder,\n neq: () => builder,\n gt: () => builder,\n gte: () => builder,\n lt: () => builder,\n lte: () => builder,\n like: () => builder,\n ilike: () => builder,\n is: () => builder,\n in: () => builder,\n contains: () => builder,\n containedBy: () => builder,\n match: () => builder,\n not: () => builder,\n or: () => builder,\n filter: () => builder,\n order: () => builder,\n limit: () => builder,\n range: () => builder,\n textSearch: () => builder,\n csv: () => builder,\n single: () => Promise.resolve({ data: null, error: null }),\n maybeSingle: () => Promise.resolve({ data: null, error: null }),\n then: (resolve: (value: unknown) => void, reject?: (reason: unknown) => void) =>\n Promise.resolve({ data: [], error: null }).then(resolve, reject),\n catch: (fn: (reason: unknown) => void) =>\n Promise.resolve({ data: [], error: null }).catch(fn),\n };\n return builder;\n }\n\n return {\n auth: {\n getSession: async () => ({ data: { session: null }, error: null }),\n getUser: async () => ({ data: { user: null }, error: null }),\n signUp: async () => ({ data: null, error: notConfiguredError }),\n signInWithPassword: async () => ({ data: null, error: notConfiguredError }),\n signInWithOAuth: async () => ({ data: null, error: notConfiguredError }),\n signOut: async () => ({ error: null }),\n resetPasswordForEmail: async () => ({ data: null, error: notConfiguredError }),\n updateUser: async () => ({ data: null, error: notConfiguredError }),\n onAuthStateChange: (callback: (event: string, session: null) => void) => {\n if (typeof window !== 'undefined') {\n setTimeout(() => callback('INITIAL_SESSION', null), 0);\n }\n return { data: { subscription: { unsubscribe: () => {} } } };\n },\n },\n from: () => createQueryBuilder(),\n rpc: async () => ({ data: null, error: notConfiguredError }),\n channel: (_name: string) => ({\n on: (_event: string, _filter: unknown, _callback: unknown) => ({\n subscribe: (cb?: (status: string) => void) => {\n if (cb) cb('SUBSCRIBED');\n return { unsubscribe: () => {} };\n },\n }),\n subscribe: (cb?: (status: string) => void) => {\n if (cb) cb('SUBSCRIBED');\n return { unsubscribe: () => {} };\n },\n }),\n removeChannel: () => Promise.resolve('ok'),\n removeAllChannels: () => Promise.resolve([]),\n storage: {\n from: () => ({\n upload: async () => ({ data: null, error: notConfiguredError }),\n download: async () => ({ data: null, error: notConfiguredError }),\n getPublicUrl: () => ({ data: { publicUrl: '' } }),\n createSignedUrl: async () => ({ data: null, error: notConfiguredError }),\n list: async () => ({ data: [], error: null }),\n remove: async () => ({ data: [], error: null }),\n }),\n },\n } as unknown as SupabaseClient;\n}\n\nexport const supabase: SupabaseClient = features.auth\n ? createClient(env.SUPABASE_URL, env.SUPABASE_ANON_KEY, {\n auth: {\n autoRefreshToken: true,\n persistSession: true,\n detectSessionInUrl: true,\n },\n })\n : createStubClient();\n\nexport const isSupabaseConfigured: boolean = features.auth;\n"],"mappings":"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","names":[]}
|