@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.
Files changed (44) hide show
  1. package/dist/analytics/index.d.ts +18 -0
  2. package/dist/analytics/index.js +76 -0
  3. package/dist/analytics/index.js.map +1 -0
  4. package/dist/animation/index.d.ts +172 -0
  5. package/dist/animation/index.js +81 -0
  6. package/dist/animation/index.js.map +1 -0
  7. package/dist/auth/index.d.ts +80 -0
  8. package/dist/auth/index.js +463 -0
  9. package/dist/auth/index.js.map +1 -0
  10. package/dist/chunk-5XIZHBKE.js +372 -0
  11. package/dist/chunk-5XIZHBKE.js.map +1 -0
  12. package/dist/chunk-G7XDUN3Z.js +141 -0
  13. package/dist/chunk-G7XDUN3Z.js.map +1 -0
  14. package/dist/chunk-YNDCD53D.js +212 -0
  15. package/dist/chunk-YNDCD53D.js.map +1 -0
  16. package/dist/cms/index.d.ts +44 -0
  17. package/dist/cms/index.js +106 -0
  18. package/dist/cms/index.js.map +1 -0
  19. package/dist/errors/index.d.ts +20 -0
  20. package/dist/errors/index.js +61 -0
  21. package/dist/errors/index.js.map +1 -0
  22. package/dist/index.d.ts +30 -0
  23. package/dist/index.js +21 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/notifications/index.d.ts +30 -0
  26. package/dist/notifications/index.js +191 -0
  27. package/dist/notifications/index.js.map +1 -0
  28. package/dist/payments/index.d.ts +89 -0
  29. package/dist/payments/index.js +408 -0
  30. package/dist/payments/index.js.map +1 -0
  31. package/dist/roles/index.d.ts +37 -0
  32. package/dist/roles/index.js +120 -0
  33. package/dist/roles/index.js.map +1 -0
  34. package/dist/seo/index.d.ts +39 -0
  35. package/dist/seo/index.js +89 -0
  36. package/dist/seo/index.js.map +1 -0
  37. package/dist/server/index.d.ts +72 -0
  38. package/dist/server/index.js +191 -0
  39. package/dist/server/index.js.map +1 -0
  40. package/dist/storage/index.d.ts +52 -0
  41. package/dist/storage/index.js +212 -0
  42. package/dist/storage/index.js.map +1 -0
  43. package/dist/types-DtY5lp3P.d.ts +90 -0
  44. 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":";;;;;AAGA,IAAM,eAAe,MAAe,QAAQ,IAAI,mBAAmB,IAAI,cAAc;AAErF,SAAS,eAAuB;AAC9B,MAAI,OAAO,mBAAmB,YAAa,QAAO;AAClD,MAAI,YAAY,eAAe,QAAQ,oBAAoB;AAC3D,MAAI,CAAC,WAAW;AACd,gBAAY,QAAQ,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,OAAO,GAAG,CAAC,CAAC;AACzE,mBAAe,QAAQ,sBAAsB,SAAS;AAAA,EACxD;AACA,SAAO;AACT;AAEA,SAAS,eAAuB;AAC9B,MAAI,OAAO,iBAAiB,YAAa,QAAO;AAChD,MAAI,YAAY,aAAa,QAAQ,oBAAoB;AACzD,MAAI,CAAC,WAAW;AACd,gBAAY,OAAO,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,OAAO,GAAG,CAAC,CAAC;AACxE,iBAAa,QAAQ,sBAAsB,SAAS;AAAA,EACtD;AACA,SAAO;AACT;AAEA,IAAI,gBAAwB,OAAO,WAAW,cAAc,KAAK,IAAI,IAAI;AACzE,IAAI,cAAsB,OAAO,WAAW,cAAc,OAAO,SAAS,WAAW;AACrF,IAAI,iBAAyB;AAE7B,IAAM,iBAAiB,MAAY;AACjC,kBAAgB,KAAK,IAAI;AACzB,gBAAc,OAAO,SAAS;AAC9B,mBAAiB;AACnB;AAEA,IAAM,gBAAgB,MAAc,KAAK,IAAI,IAAI;AAEjD,IAAM,WAAW,CAAuC,IAAO,SAAqD;AAClH,MAAI,WAAW;AACf,SAAO,IAAI,SAAwB;AACjC,UAAM,MAAM,KAAK,IAAI;AACrB,QAAI,MAAM,YAAY,MAAM;AAC1B,iBAAW;AACX,SAAG,GAAG,IAAI;AAAA,IACZ;AAAA,EACF;AACF;AAEA,IAAM,mBAAmB,MAAY;AACnC,MAAI,OAAO,WAAW,YAAa;AACnC,QAAM,YAAY,OAAO;AACzB,QAAM,YAAY,SAAS,gBAAgB,eAAe,OAAO;AACjE,MAAI,YAAY,GAAG;AACjB,UAAM,gBAAgB,KAAK,MAAO,YAAY,YAAa,GAAG;AAC9D,QAAI,gBAAgB,gBAAgB;AAClC,uBAAiB,KAAK,IAAI,eAAe,GAAG;AAAA,IAC9C;AAAA,EACF;AACF;AAEA,IAAM,gBAAgB,OAAO,UAAkB,SAA4D;AACzG,MAAI,CAAC,aAAa,GAAG;AACnB,WAAO,EAAE,SAAS,OAAO,OAAO,0BAA0B;AAAA,EAC5D;AAEA,MAAI;AACF,UAAM,WAAW,MAAM,MAAM,GAAG,IAAI,eAAe,GAAG,QAAQ,IAAI;AAAA,MAChE,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU,IAAI;AAAA,IAC3B,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,QAAQ,MAAM,SAAS,KAAK;AAClC,aAAO,EAAE,SAAS,OAAO,MAAM;AAAA,IACjC;AAEA,WAAO,MAAM,SAAS,KAAK;AAAA,EAC7B,SAAS,OAAgB;AACvB,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,WAAO,EAAE,SAAS,OAAO,OAAO,QAAQ;AAAA,EAC1C;AACF;AAEA,IAAM,aAAa,OAAO,UAAkB,SAAsF;AAChI,MAAI,CAAC,IAAI,iBAAiB;AACxB,WAAO,EAAE,SAAS,OAAO,OAAO,0BAA0B;AAAA,EAC5D;AAEA,MAAI;AACF,UAAM,UAAkC,EAAE,gBAAgB,mBAAmB;AAC7E,QAAI,IAAI,gBAAgB;AACtB,cAAQ,eAAe,IAAI,UAAU,IAAI,cAAc;AAAA,IACzD;AAEA,UAAM,WAAW,MAAM,MAAM,GAAG,IAAI,eAAe,GAAG,QAAQ,IAAI;AAAA,MAChE,QAAQ;AAAA,MACR;AAAA,MACA,MAAM,KAAK,UAAU,IAAI;AAAA,IAC3B,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,QAAQ,MAAM,SAAS,KAAK;AAClC,aAAO,EAAE,SAAS,OAAO,MAAM;AAAA,IACjC;AAEA,WAAO,MAAM,SAAS,KAAK;AAAA,EAC7B,SAAS,OAAgB;AACvB,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,WAAO,EAAE,SAAS,OAAO,OAAO,QAAQ;AAAA,EAC1C;AACF;AAEA,IAAM,YAAY,OAAO,aAAyE;AAChG,MAAI,CAAC,IAAI,iBAAiB;AACxB,WAAO,EAAE,SAAS,OAAO,OAAO,0BAA0B;AAAA,EAC5D;AAEA,MAAI;AACF,UAAM,UAAkC,EAAE,gBAAgB,mBAAmB;AAC7E,QAAI,IAAI,gBAAgB;AACtB,cAAQ,eAAe,IAAI,UAAU,IAAI,cAAc;AAAA,IACzD;AAEA,UAAM,WAAW,MAAM,MAAM,GAAG,IAAI,eAAe,GAAG,QAAQ,IAAI;AAAA,MAChE,QAAQ;AAAA,MACR;AAAA,IACF,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,QAAQ,MAAM,SAAS,KAAK;AAClC,aAAO,EAAE,SAAS,OAAO,MAAM;AAAA,IACjC;AAEA,WAAO,MAAM,SAAS,KAAK;AAAA,EAC7B,SAAS,OAAgB;AACvB,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,WAAO,EAAE,SAAS,OAAO,OAAO,QAAQ;AAAA,EAC1C;AACF;AAEA,IAAM,eAAe,MAAY;AAC/B,MAAI,CAAC,aAAa,KAAK,OAAO,cAAc,YAAa;AAEzD,QAAM,UAAU,KAAK,UAAU;AAAA,IAC7B,MAAM;AAAA,IACN,WAAW,IAAI;AAAA,IACf,WAAW,aAAa;AAAA,IACxB,WAAW,aAAa;AAAA,IACxB,UAAU;AAAA,IACV,YAAY,cAAc;AAAA,IAC1B,aAAa;AAAA,IACb,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,EACpC,CAAC;AAED,MAAI,UAAU,YAAY;AACxB,cAAU,WAAW,GAAG,IAAI,eAAe,0BAA0B,OAAO;AAAA,EAC9E;AACF;AAEO,IAAM,UAAyB;AAAA,EACpC;AAAA,EAEA,WAAW;AAAA,IACT,OAAO,CAAC,WAAmB,aAAsC,CAAC,MAAM;AACtE,aAAO,cAAc,0BAA0B;AAAA,QAC7C,MAAM;AAAA,QACN,WAAW,IAAI;AAAA,QACf,WAAW,aAAa;AAAA,QACxB,WAAW,aAAa;AAAA,QACxB,KAAK,OAAO,WAAW,cAAc,OAAO,SAAS,OAAO;AAAA,QAC5D,UAAU,OAAO,WAAW,cAAc,OAAO,SAAS,WAAW;AAAA,QACrE,UAAU,OAAO,aAAa,cAAc,SAAS,WAAW;AAAA,QAChE,WAAW,OAAO,cAAc,cAAc,UAAU,YAAY;AAAA,QACpE,kBAAkB,OAAO,WAAW,cAChC,GAAG,OAAO,OAAO,KAAK,IAAI,OAAO,OAAO,MAAM,KAC9C;AAAA,QACJ,UAAU,OAAO,WAAW,cACxB,GAAG,OAAO,UAAU,IAAI,OAAO,WAAW,KAC1C;AAAA,QACJ,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QAClC,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAAA,IAEA,UAAU,CAAC,SAAkB;AAC3B,qBAAe;AACf,aAAO,QAAQ,UAAU,MAAM,aAAa;AAAA,QAC1C,MAAM,SAAS,OAAO,WAAW,cAAc,OAAO,SAAS,WAAW;AAAA,QAC1E,OAAO,OAAO,aAAa,cAAc,SAAS,QAAQ;AAAA,MAC5D,CAAC;AAAA,IACH;AAAA,IAEA,UAAU,CAAC,QAAgB,SAAkC,CAAC,MAAM;AAClE,aAAO,QAAQ,UAAU,MAAM,YAAY,EAAE,QAAQ,GAAG,OAAO,CAAC;AAAA,IAClE;AAAA,IAEA,OAAO,CAAC,SAAiB,UAAmC,CAAC,MAAM;AACjE,aAAO,QAAQ,UAAU,MAAM,SAAS;AAAA,QACtC;AAAA,QACA,GAAG;AAAA,QACH,OAAQ,QAAQ,SAAoB,IAAI,MAAM,EAAE;AAAA,MAClD,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,QAAQ;AAAA,IACN,gBAAgB,OAAO,SAAiB,UAA2B,CAAC,MAAM;AACxE,YAAM,SAAS,MAAM,WAAW,+BAA+B;AAAA,QAC7D;AAAA,QACA,WAAW,IAAI;AAAA,QACf,YAAY,QAAQ,cAAc,GAAG,OAAO,WAAW,cAAc,OAAO,SAAS,SAAS,EAAE;AAAA,QAChG,WAAW,QAAQ,aAAa,GAAG,OAAO,WAAW,cAAc,OAAO,SAAS,SAAS,EAAE;AAAA,QAC9F,eAAe,QAAQ;AAAA,QACvB,UAAU,QAAQ,YAAY;AAAA,MAChC,CAAC;AAED,UAAI,OAAO,OAAO,QAAQ,aAAa,SAAS,OAAO,WAAW,aAAa;AAC7E,eAAO,SAAS,OAAO,OAAO;AAAA,MAChC;AAEA,aAAO;AAAA,IACT;AAAA,IAEA,aAAa,YAAY;AACvB,aAAO,EAAE,UAAU,CAAC,GAAG,SAAS,yCAAyC;AAAA,IAC3E;AAAA,IAEA,eAAe,OAAO,cAAsB;AAC1C,UAAI,CAAC,WAAW;AACd,eAAO,EAAE,SAAS,OAAO,OAAO,yBAAyB;AAAA,MAC3D;AACA,aAAO,UAAU,yCAAyC,mBAAmB,SAAS,CAAC,EAAE;AAAA,IAC3F;AAAA,IAEA,mBAAmB,OAAO,UAAmD,CAAC,MAAM;AAClF,YAAM,SAAS,IAAI,gBAAgB;AACnC,UAAI,QAAQ,WAAY,QAAO,IAAI,eAAe,QAAQ,UAAU;AACpE,UAAI,QAAQ,MAAO,QAAO,IAAI,SAAS,QAAQ,KAAK;AAEpD,UAAI,CAAC,QAAQ,cAAc,CAAC,QAAQ,OAAO;AACzC,eAAO,EAAE,SAAS,OAAO,OAAO,yCAAyC;AAAA,MAC3E;AAEA,aAAO,UAAU,+BAA+B,OAAO,SAAS,CAAC,EAAE;AAAA,IACrE;AAAA,IAEA,qBAAqB,OAAO,YAAoB,UAAsD,CAAC,MAAM;AAC3G,YAAM,SAAS,MAAM,WAAW,+BAA+B;AAAA,QAC7D;AAAA,QACA,WAAW,QAAQ,aAAa,OAAO,SAAS;AAAA,MAClD,CAAC;AAED,UAAI,OAAO,OAAO,QAAQ,aAAa,SAAS,OAAO,WAAW,aAAa;AAC7E,eAAO,SAAS,OAAO,OAAO;AAAA,MAChC;AAEA,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,OAAO;AAAA,IACL,aAAa,CAAC,QAAgB,OAAe,OAAsB,SAAS;AAC1E,aAAO,QAAQ,UAAU,MAAM,eAAe,EAAE,QAAQ,OAAO,MAAM,cAAc,QAAQ,CAAC;AAAA,IAC9F;AAAA,IAEA,YAAY,CAAC,WAAmB;AAC9B,aAAO,QAAQ,UAAU,MAAM,cAAc,EAAE,OAAO,CAAC;AAAA,IACzD;AAAA,IAEA,aAAa,CAAC,WAAmB;AAC/B,aAAO,QAAQ,UAAU,MAAM,eAAe,EAAE,OAAO,CAAC;AAAA,IAC1D;AAAA,IAEA,iBAAiB,CAAC,QAAgB,SAAiB,YAAoB;AACrE,aAAO,QAAQ,UAAU,MAAM,eAAe,EAAE,QAAQ,SAAS,QAAQ,CAAC;AAAA,IAC5E;AAAA,EACF;AACF;AAEO,IAAM,yBAA0C;AAAA,EACrD,SAAS,CAAC,SAAmB;AAC3B,QAAI,MAAM,IAAI;AACZ,cAAQ,UAAU,SAAS,KAAK,IAAI;AAAA,QAClC,OAAO,KAAK;AAAA,QACZ,MAAM,KAAK,eAAe;AAAA,MAC5B,CAAC;AACD,cAAQ,MAAM,WAAW,KAAK,EAAE;AAAA,IAClC;AAAA,EACF;AAAA,EACA,UAAU,CAAC,SAAmB;AAC5B,QAAI,MAAM,IAAI;AACZ,cAAQ,UAAU,SAAS,KAAK,IAAI,EAAE,OAAO,KAAK,MAAM,CAAC;AACzD,cAAQ,MAAM,YAAY,KAAK,IAAI,KAAK,SAAS,EAAE;AAAA,IACrD;AAAA,EACF;AAAA,EACA,UAAU,CAAC,WAAmB;AAC5B,QAAI,QAAQ;AACV,cAAQ,MAAM,YAAY,MAAM;AAAA,IAClC;AAAA,EACF;AACF;AAWA,IAAM,iBAAiB,MAAY;AACjC,MAAI,OAAO,WAAW,eAAe,EAAE,yBAAyB,QAAS;AAEzE,MAAI;AACF,QAAI,oBAAoB,CAAC,SAAS;AAChC,YAAM,UAAU,KAAK,WAAW;AAChC,YAAM,YAAY,QAAQ,QAAQ,SAAS,CAAC;AAC5C,UAAI,WAAW;AACb,gBAAQ,UAAU,MAAM,aAAa;AAAA,UACnC,QAAQ;AAAA,UACR,OAAO,KAAK,MAAM,UAAU,SAAS;AAAA,UACrC,UAAU,OAAO,SAAS;AAAA,QAC5B,CAAC;AAAA,MACH;AAAA,IACF,CAAC,EAAE,QAAQ,EAAE,MAAM,4BAA4B,UAAU,KAAK,CAAC;AAAA,EACjE,QAAQ;AAAA,EAA0B;AAElC,MAAI;AACF,QAAI,oBAAoB,CAAC,SAAS;AAChC,YAAM,QAAQ,KAAK,WAAW,EAAE,CAAC;AACjC,UAAI,OAAO;AACT,gBAAQ,UAAU,MAAM,aAAa;AAAA,UACnC,QAAQ;AAAA,UACR,OAAO,KAAK,MAAM,MAAM,kBAAkB,MAAM,SAAS;AAAA,UACzD,UAAU,OAAO,SAAS;AAAA,QAC5B,CAAC;AAAA,MACH;AAAA,IACF,CAAC,EAAE,QAAQ,EAAE,MAAM,eAAe,UAAU,KAAK,CAAC;AAAA,EACpD,QAAQ;AAAA,EAA0B;AAElC,MAAI;AACF,QAAI,WAAW;AACf,QAAI,oBAAoB,CAAC,SAAS;AAChC,iBAAW,SAAS,KAAK,WAAW,GAAG;AACrC,YAAI,CAAE,MAAsB,gBAAgB;AAC1C,sBAAa,MAAsB;AAAA,QACrC;AAAA,MACF;AAAA,IACF,CAAC,EAAE,QAAQ,EAAE,MAAM,gBAAgB,UAAU,KAAK,CAAC;AAEnD,aAAS,iBAAiB,oBAAoB,MAAM;AAClD,UAAI,SAAS,UAAU,WAAW,GAAG;AACnC,gBAAQ,UAAU,MAAM,aAAa;AAAA,UACnC,QAAQ;AAAA,UACR,OAAO,KAAK,MAAM,WAAW,GAAI,IAAI;AAAA,UACrC,UAAU,OAAO,SAAS;AAAA,QAC5B,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH,QAAQ;AAAA,EAA0B;AACpC;AAEA,IAAM,qBAAqB,MAAY;AACrC,MAAI,OAAO,WAAW,YAAa;AAEnC,SAAO,UAAU,CAAC,SAAS,QAAQ,QAAQ,OAAO,UAAU;AAC1D,YAAQ,UAAU,MAAM,YAAY;AAAA,MAClC,SAAS,OAAO,OAAO;AAAA,MACvB;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO,OAAO;AAAA,MACd,UAAU,OAAO,SAAS;AAAA,IAC5B,CAAC;AACD,WAAO;AAAA,EACT;AAEA,SAAO,iBAAiB,sBAAsB,CAAC,UAAiC;AAC9E,YAAQ,UAAU,MAAM,qBAAqB;AAAA,MAC3C,QAAQ,MAAM,QAAQ,WAAW,OAAO,MAAM,MAAM;AAAA,MACpD,OAAO,MAAM,QAAQ;AAAA,MACrB,UAAU,OAAO,SAAS;AAAA,IAC5B,CAAC;AAAA,EACH,CAAC;AACH;AAEA,IAAI,OAAO,WAAW,aAAa;AACjC,SAAO,iBAAiB,UAAU,SAAS,kBAAkB,GAAG,GAAG,EAAE,SAAS,KAAK,CAAC;AACpF,SAAO,iBAAiB,gBAAgB,YAAY;AAEpD,WAAS,iBAAiB,oBAAoB,MAAM;AAClD,QAAI,CAAC,aAAa,EAAG;AACrB,QAAI,SAAS,QAAQ;AACnB,cAAQ,UAAU,MAAM,aAAa;AAAA,QACnC,YAAY,cAAc;AAAA,QAC1B,aAAa;AAAA,QACb,UAAU;AAAA,MACZ,CAAC;AAAA,IACH,OAAO;AACL,cAAQ,UAAU,MAAM,cAAc,EAAE,UAAU,OAAO,SAAS,SAAS,CAAC;AAAA,IAC9E;AAAA,EACF,CAAC;AAED,QAAM,oBAAoB,QAAQ;AAClC,UAAQ,YAAY,YAAa,MAA4C;AAC3E,iBAAa;AACb,sBAAkB,MAAM,MAAM,IAAI;AAClC,mBAAe;AACf,QAAI,aAAa,EAAG,SAAQ,UAAU,SAAS;AAAA,EACjD;AAEA,QAAM,uBAAuB,QAAQ;AACrC,UAAQ,eAAe,YAAa,MAA+C;AACjF,yBAAqB,MAAM,MAAM,IAAI;AACrC,mBAAe;AAAA,EACjB;AAEA,SAAO,iBAAiB,YAAY,MAAM;AACxC,iBAAa;AACb,mBAAe;AACf,QAAI,aAAa,EAAG,SAAQ,UAAU,SAAS;AAAA,EACjD,CAAC;AAED,MAAI,aAAa,GAAG;AAClB,eAAW,MAAM;AACf,cAAQ,UAAU,SAAS;AAC3B,qBAAe;AACf,yBAAmB;AAAA,IACrB,GAAG,GAAG;AAAA,EACR;AACF;","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":[]}