@groundbrick/sveltekit-adapter 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.
Files changed (96) hide show
  1. package/README.md +554 -0
  2. package/dist/analytics/components/GoogleAnalytics.svelte +96 -0
  3. package/dist/analytics/config/analytics.config.d.ts +6 -0
  4. package/dist/analytics/config/analytics.config.d.ts.map +1 -0
  5. package/dist/analytics/config/analytics.config.js +27 -0
  6. package/dist/analytics/config/analytics.config.js.map +1 -0
  7. package/dist/analytics/index.d.ts +7 -0
  8. package/dist/analytics/index.d.ts.map +1 -0
  9. package/dist/analytics/index.js +9 -0
  10. package/dist/analytics/index.js.map +1 -0
  11. package/dist/analytics/interfaces/IAnalyticsService.d.ts +40 -0
  12. package/dist/analytics/interfaces/IAnalyticsService.d.ts.map +1 -0
  13. package/dist/analytics/interfaces/IAnalyticsService.js +2 -0
  14. package/dist/analytics/interfaces/IAnalyticsService.js.map +1 -0
  15. package/dist/analytics/services/AnalyticsService.d.ts +37 -0
  16. package/dist/analytics/services/AnalyticsService.d.ts.map +1 -0
  17. package/dist/analytics/services/AnalyticsService.js +261 -0
  18. package/dist/analytics/services/AnalyticsService.js.map +1 -0
  19. package/dist/analytics/utils/consent.d.ts +52 -0
  20. package/dist/analytics/utils/consent.d.ts.map +1 -0
  21. package/dist/analytics/utils/consent.js +138 -0
  22. package/dist/analytics/utils/consent.js.map +1 -0
  23. package/dist/auth/index.d.ts +10 -0
  24. package/dist/auth/index.d.ts.map +1 -0
  25. package/dist/auth/index.js +49 -0
  26. package/dist/auth/index.js.map +1 -0
  27. package/dist/client/ApiClient.d.ts +17 -0
  28. package/dist/client/ApiClient.d.ts.map +1 -0
  29. package/dist/client/ApiClient.js +184 -0
  30. package/dist/client/ApiClient.js.map +1 -0
  31. package/dist/client/NotificationComponent.d.ts +7 -0
  32. package/dist/client/NotificationComponent.d.ts.map +1 -0
  33. package/dist/client/NotificationComponent.js +131 -0
  34. package/dist/client/NotificationComponent.js.map +1 -0
  35. package/dist/client/apiWrapper.d.ts +324 -0
  36. package/dist/client/apiWrapper.d.ts.map +1 -0
  37. package/dist/client/apiWrapper.js +257 -0
  38. package/dist/client/apiWrapper.js.map +1 -0
  39. package/dist/client/authErrorHandler.d.ts +19 -0
  40. package/dist/client/authErrorHandler.d.ts.map +1 -0
  41. package/dist/client/authErrorHandler.js +40 -0
  42. package/dist/client/authErrorHandler.js.map +1 -0
  43. package/dist/client/hooks.d.ts +11 -0
  44. package/dist/client/hooks.d.ts.map +1 -0
  45. package/dist/client/hooks.js +28 -0
  46. package/dist/client/hooks.js.map +1 -0
  47. package/dist/client/index.d.ts +8 -0
  48. package/dist/client/index.d.ts.map +1 -0
  49. package/dist/client/index.js +13 -0
  50. package/dist/client/index.js.map +1 -0
  51. package/dist/client/jwtDecoder.d.ts +56 -0
  52. package/dist/client/jwtDecoder.d.ts.map +1 -0
  53. package/dist/client/jwtDecoder.js +114 -0
  54. package/dist/client/jwtDecoder.js.map +1 -0
  55. package/dist/client/notifications.d.ts +55 -0
  56. package/dist/client/notifications.d.ts.map +1 -0
  57. package/dist/client/notifications.js +160 -0
  58. package/dist/client/notifications.js.map +1 -0
  59. package/dist/client/stores.d.ts +26 -0
  60. package/dist/client/stores.d.ts.map +1 -0
  61. package/dist/client/stores.js +196 -0
  62. package/dist/client/stores.js.map +1 -0
  63. package/dist/consent/components/CookieConsent.svelte +580 -0
  64. package/dist/consent/config/consent.config.d.ts +7 -0
  65. package/dist/consent/config/consent.config.d.ts.map +1 -0
  66. package/dist/consent/config/consent.config.js +194 -0
  67. package/dist/consent/config/consent.config.js.map +1 -0
  68. package/dist/consent/index.d.ts +5 -0
  69. package/dist/consent/index.d.ts.map +1 -0
  70. package/dist/consent/index.js +7 -0
  71. package/dist/consent/index.js.map +1 -0
  72. package/dist/consent/interfaces/IConsentService.d.ts +121 -0
  73. package/dist/consent/interfaces/IConsentService.d.ts.map +1 -0
  74. package/dist/consent/interfaces/IConsentService.js +2 -0
  75. package/dist/consent/interfaces/IConsentService.js.map +1 -0
  76. package/dist/consent/services/ConsentService.d.ts +39 -0
  77. package/dist/consent/services/ConsentService.d.ts.map +1 -0
  78. package/dist/consent/services/ConsentService.js +302 -0
  79. package/dist/consent/services/ConsentService.js.map +1 -0
  80. package/dist/consent/utils/analytics.d.ts +52 -0
  81. package/dist/consent/utils/analytics.d.ts.map +1 -0
  82. package/dist/consent/utils/analytics.js +181 -0
  83. package/dist/consent/utils/analytics.js.map +1 -0
  84. package/dist/hooks/index.d.ts +14 -0
  85. package/dist/hooks/index.d.ts.map +1 -0
  86. package/dist/hooks/index.js +218 -0
  87. package/dist/hooks/index.js.map +1 -0
  88. package/dist/index.d.ts +5 -0
  89. package/dist/index.d.ts.map +1 -0
  90. package/dist/index.js +10 -0
  91. package/dist/index.js.map +1 -0
  92. package/dist/types/index.d.ts +88 -0
  93. package/dist/types/index.d.ts.map +1 -0
  94. package/dist/types/index.js +2 -0
  95. package/dist/types/index.js.map +1 -0
  96. package/package.json +87 -0
@@ -0,0 +1,9 @@
1
+ // Main service
2
+ export { AnalyticsService } from './services/AnalyticsService.js';
3
+ // Configuration presets
4
+ export { DEFAULT_ANALYTICS_CONFIG, GDPR_ANALYTICS_CONFIG, DEBUG_ANALYTICS_CONFIG, MINIMAL_ANALYTICS_CONFIG } from './config/analytics.config.js';
5
+ // Consent integration utilities
6
+ export { createConsentAwareAnalytics, createConsentWrapper, createConsentAwarePixel, AnalyticsEventBuilder, AnalyticsEvents } from './utils/consent.js';
7
+ // Svelte component
8
+ export { default as GoogleAnalytics } from './components/GoogleAnalytics.svelte';
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/analytics/index.ts"],"names":[],"mappings":"AACA,eAAe;AACf,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAWlE,wBAAwB;AACxB,OAAO,EACH,wBAAwB,EACxB,qBAAqB,EACrB,sBAAsB,EACtB,wBAAwB,EAC3B,MAAM,8BAA8B,CAAC;AAEtC,gCAAgC;AAChC,OAAO,EACH,2BAA2B,EAC3B,oBAAoB,EACpB,uBAAuB,EACvB,qBAAqB,EACrB,eAAe,EAClB,MAAM,oBAAoB,CAAC;AAQ5B,mBAAmB;AACnB,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,qCAAqC,CAAC"}
@@ -0,0 +1,40 @@
1
+ export interface GAEvent {
2
+ action: string;
3
+ category: string;
4
+ label?: string;
5
+ value?: number;
6
+ }
7
+ export interface GAPageView {
8
+ page_title?: string;
9
+ page_location?: string;
10
+ page_path?: string;
11
+ }
12
+ export interface AnalyticsConfig {
13
+ measurementId: string;
14
+ debug?: boolean;
15
+ anonymizeIp?: boolean;
16
+ cookieDomain?: string;
17
+ cookieExpires?: number;
18
+ customParameters?: Record<string, any>;
19
+ }
20
+ export interface AnalyticsState {
21
+ initialized: boolean;
22
+ ready: boolean;
23
+ measurementId: string | null;
24
+ hasConsent?: boolean;
25
+ }
26
+ export interface IAnalyticsService {
27
+ initialize(config: AnalyticsConfig): void;
28
+ isEnabled(): boolean;
29
+ getState(): AnalyticsState;
30
+ trackEvent(event: GAEvent): void;
31
+ trackPageView(data?: GAPageView): void;
32
+ trackButtonClick(buttonName: string, category?: string): void;
33
+ trackFormSubmit(formName: string): void;
34
+ trackFormSubscription(formName: string): void;
35
+ trackUserRegistration(userType: 'customer' | 'staff'): void;
36
+ trackUserLogin(userType: 'customer' | 'staff'): void;
37
+ checkStatus(): AnalyticsState;
38
+ setConsent(hasConsent: boolean): void;
39
+ }
40
+ //# sourceMappingURL=IAnalyticsService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IAnalyticsService.d.ts","sourceRoot":"","sources":["../../../src/analytics/interfaces/IAnalyticsService.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,OAAO;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,cAAc;IAC3B,WAAW,EAAE,OAAO,CAAC;IACrB,KAAK,EAAE,OAAO,CAAC;IACf,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,UAAU,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAC9B,UAAU,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI,CAAC;IAC1C,SAAS,IAAI,OAAO,CAAC;IACrB,QAAQ,IAAI,cAAc,CAAC;IAG3B,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IACjC,aAAa,CAAC,IAAI,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IAGvC,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9D,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9C,qBAAqB,CAAC,QAAQ,EAAE,UAAU,GAAG,OAAO,GAAG,IAAI,CAAC;IAC5D,cAAc,CAAC,QAAQ,EAAE,UAAU,GAAG,OAAO,GAAG,IAAI,CAAC;IAGrD,WAAW,IAAI,cAAc,CAAC;IAC9B,UAAU,CAAC,UAAU,EAAE,OAAO,GAAG,IAAI,CAAC;CACzC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=IAnalyticsService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IAnalyticsService.js","sourceRoot":"","sources":["../../../src/analytics/interfaces/IAnalyticsService.ts"],"names":[],"mappings":""}
@@ -0,0 +1,37 @@
1
+ import type { IAnalyticsService, AnalyticsConfig, GAEvent, GAPageView, AnalyticsState } from '../interfaces/IAnalyticsService.js';
2
+ declare global {
3
+ interface Window {
4
+ dataLayer: any[];
5
+ gtag: (...args: any[]) => void;
6
+ }
7
+ }
8
+ export declare class AnalyticsService implements IAnalyticsService {
9
+ private static instance;
10
+ private config;
11
+ private initialized;
12
+ private ready;
13
+ private hasConsent;
14
+ private listeners;
15
+ private consentService;
16
+ private constructor();
17
+ static getInstance(): AnalyticsService;
18
+ initialize(config: AnalyticsConfig): void;
19
+ setConsentService(consentService: any): void;
20
+ private buildConfig;
21
+ private loadGoogleAnalytics;
22
+ trackPageView(data?: GAPageView): void;
23
+ isEnabled(): boolean;
24
+ getState(): AnalyticsState;
25
+ trackEvent({ action, category, label, value }: GAEvent): void;
26
+ trackButtonClick(buttonName: string, category?: string): void;
27
+ trackFormSubmit(formName: string): void;
28
+ trackFormSubscription(formName: string): void;
29
+ trackUserRegistration(userType: 'customer' | 'staff'): void;
30
+ trackUserLogin(userType: 'customer' | 'staff'): void;
31
+ checkStatus(): AnalyticsState;
32
+ setConsent(hasConsent: boolean): void;
33
+ onStateChange(callback: (state: AnalyticsState) => void): () => void;
34
+ private notifyListeners;
35
+ testTracking(): void;
36
+ }
37
+ //# sourceMappingURL=AnalyticsService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnalyticsService.d.ts","sourceRoot":"","sources":["../../../src/analytics/services/AnalyticsService.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACR,iBAAiB,EACjB,eAAe,EACf,OAAO,EACP,UAAU,EACV,cAAc,EACjB,MAAM,oCAAoC,CAAC;AAE5C,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,MAAM;QACZ,SAAS,EAAE,GAAG,EAAE,CAAC;QACjB,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;KAClC;CACJ;AAED,qBAAa,gBAAiB,YAAW,iBAAiB;IACtD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAiC;IACxD,OAAO,CAAC,MAAM,CAAgC;IAC9C,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,UAAU,CAAQ;IAC1B,OAAO,CAAC,SAAS,CAA8C;IAC/D,OAAO,CAAC,cAAc,CAAa;IAEnC,OAAO;IAEP,MAAM,CAAC,WAAW,IAAI,gBAAgB;IAOtC,UAAU,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI;IAezC,iBAAiB,CAAC,cAAc,EAAE,GAAG,GAAG,IAAI;IAoC5C,OAAO,CAAC,WAAW;IAwBnB,OAAO,CAAC,mBAAmB;IA+C3B,aAAa,CAAC,IAAI,CAAC,EAAE,UAAU,GAAG,IAAI;IAsBtC,SAAS,IAAI,OAAO;IAsBpB,QAAQ,IAAI,cAAc;IAS1B,UAAU,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,OAAO,GAAG,IAAI;IAmB7D,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,SAAO,GAAG,IAAI;IAQ3D,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAQvC,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAQ7C,qBAAqB,CAAC,QAAQ,EAAE,UAAU,GAAG,OAAO,GAAG,IAAI;IAQ3D,cAAc,CAAC,QAAQ,EAAE,UAAU,GAAG,OAAO,GAAG,IAAI;IAQpD,WAAW,IAAI,cAAc;IAU7B,UAAU,CAAC,UAAU,EAAE,OAAO,GAAG,IAAI;IAUrC,aAAa,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,GAAG,MAAM,IAAI;IAWpE,OAAO,CAAC,eAAe;IAYvB,YAAY,IAAI,IAAI;CAYvB"}
@@ -0,0 +1,261 @@
1
+ import { browser } from '$app/environment';
2
+ export class AnalyticsService {
3
+ static instance = null;
4
+ config = null;
5
+ initialized = false;
6
+ ready = false;
7
+ hasConsent = true; // Default true, can be controlled by consent system
8
+ listeners = [];
9
+ consentService = null; // Consent integration
10
+ constructor() { }
11
+ static getInstance() {
12
+ if (!AnalyticsService.instance) {
13
+ AnalyticsService.instance = new AnalyticsService();
14
+ }
15
+ return AnalyticsService.instance;
16
+ }
17
+ initialize(config) {
18
+ if (this.initialized) {
19
+ console.warn('[AnalyticsService] Already initialized');
20
+ return;
21
+ }
22
+ this.config = config;
23
+ this.initialized = true;
24
+ // Load GA if browser and measurement ID available
25
+ if (browser && config.measurementId && this.hasConsent) {
26
+ this.loadGoogleAnalytics();
27
+ }
28
+ }
29
+ setConsentService(consentService) {
30
+ this.consentService = consentService;
31
+ // Set initial consent state
32
+ this.hasConsent = consentService.hasConsent('analytics');
33
+ // Listen for consent changes
34
+ consentService.onConsentChange((state) => {
35
+ const previousConsent = this.hasConsent;
36
+ this.hasConsent = state.analytics === true;
37
+ if (this.config?.debug) {
38
+ console.log('[AnalyticsService] Consent changed:', {
39
+ previous: previousConsent,
40
+ current: this.hasConsent
41
+ });
42
+ }
43
+ this.notifyListeners();
44
+ // Initialize GA if consent granted and not ready yet
45
+ if (this.hasConsent && !this.ready && this.config?.measurementId) {
46
+ this.loadGoogleAnalytics();
47
+ }
48
+ });
49
+ if (this.config?.debug) {
50
+ console.log('[AnalyticsService] Consent service integrated:', this.hasConsent);
51
+ }
52
+ // Load GA now if consent is already granted
53
+ if (this.hasConsent && !this.ready && this.config?.measurementId) {
54
+ this.loadGoogleAnalytics();
55
+ }
56
+ }
57
+ buildConfig() {
58
+ const gtagConfig = {
59
+ send_page_view: false // Always disable automatic page views
60
+ };
61
+ if (this.config?.anonymizeIp) {
62
+ gtagConfig.anonymize_ip = true;
63
+ }
64
+ if (this.config?.cookieDomain) {
65
+ gtagConfig.cookie_domain = this.config.cookieDomain;
66
+ }
67
+ if (this.config?.cookieExpires) {
68
+ gtagConfig.cookie_expires = this.config.cookieExpires;
69
+ }
70
+ if (this.config?.customParameters) {
71
+ Object.assign(gtagConfig, this.config.customParameters);
72
+ }
73
+ return gtagConfig;
74
+ }
75
+ loadGoogleAnalytics() {
76
+ if (!this.config || this.ready)
77
+ return;
78
+ const { measurementId } = this.config;
79
+ try {
80
+ // Check if script already exists to prevent duplicates
81
+ const existingScript = document.querySelector(`script[src*="gtag/js?id=${measurementId}"]`);
82
+ if (existingScript) {
83
+ console.warn('[AnalyticsService] Script already loaded');
84
+ return;
85
+ }
86
+ // 1. Create and append external script
87
+ const gtagScript = document.createElement('script');
88
+ gtagScript.async = true;
89
+ gtagScript.src = `https://www.googletagmanager.com/gtag/js?id=${measurementId}`;
90
+ document.head.appendChild(gtagScript);
91
+ // 2. Create inline configuration script (traditional approach)
92
+ const configScript = document.createElement('script');
93
+ // Build config object
94
+ const gtagConfig = this.buildConfig();
95
+ configScript.innerHTML = `
96
+ window.dataLayer = window.dataLayer || [];
97
+ function gtag(){dataLayer.push(arguments);}
98
+ gtag('js', new Date());
99
+ gtag('config', '${measurementId}', ${JSON.stringify(gtagConfig)});
100
+ `;
101
+ document.head.appendChild(configScript);
102
+ // Mark as ready
103
+ this.ready = true;
104
+ this.notifyListeners();
105
+ if (this.config?.debug) {
106
+ console.log('[AnalyticsService] Traditional setup complete, ready for tracking');
107
+ }
108
+ }
109
+ catch (error) {
110
+ console.error('[AnalyticsService] Failed to load:', error);
111
+ }
112
+ }
113
+ trackPageView(data) {
114
+ if (!this.isEnabled() || !this.config)
115
+ return;
116
+ const pageViewData = {};
117
+ if (data?.page_title)
118
+ pageViewData.page_title = data.page_title;
119
+ else if (typeof document !== 'undefined')
120
+ pageViewData.page_title = document.title;
121
+ if (data?.page_location)
122
+ pageViewData.page_location = data.page_location;
123
+ else if (typeof window !== 'undefined')
124
+ pageViewData.page_location = window.location.href;
125
+ if (data?.page_path)
126
+ pageViewData.page_path = data.page_path;
127
+ else if (typeof window !== 'undefined')
128
+ pageViewData.page_path = window.location.pathname;
129
+ if (this.config.debug) {
130
+ console.log('[AnalyticsService] Tracking page view:', pageViewData);
131
+ }
132
+ // ✅ Use event instead of config for page views
133
+ window.gtag('event', 'page_view', pageViewData);
134
+ }
135
+ isEnabled() {
136
+ const enabled = browser &&
137
+ this.initialized &&
138
+ this.ready &&
139
+ !!this.config?.measurementId &&
140
+ !!window.gtag &&
141
+ this.hasConsent;
142
+ if (this.config?.debug && !enabled) {
143
+ console.log('[AnalyticsService] Debug - Not enabled:', {
144
+ browser,
145
+ initialized: this.initialized,
146
+ ready: this.ready,
147
+ hasMeasurementId: !!this.config?.measurementId,
148
+ hasGtag: !!window.gtag,
149
+ hasConsent: this.hasConsent
150
+ });
151
+ }
152
+ return enabled;
153
+ }
154
+ getState() {
155
+ return {
156
+ initialized: this.initialized,
157
+ ready: this.ready,
158
+ measurementId: this.config?.measurementId || null,
159
+ hasConsent: this.hasConsent
160
+ };
161
+ }
162
+ trackEvent({ action, category, label, value }) {
163
+ if (!this.isEnabled()) {
164
+ if (this.config?.debug) {
165
+ console.log('[AnalyticsService] Skipping event (not enabled):', { action, category, label, value });
166
+ }
167
+ return;
168
+ }
169
+ if (this.config?.debug) {
170
+ console.log('[AnalyticsService] Tracking event:', { action, category, label, value });
171
+ }
172
+ window.gtag('event', action, {
173
+ event_category: category,
174
+ event_label: label,
175
+ value: value
176
+ });
177
+ }
178
+ trackButtonClick(buttonName, category = 'UI') {
179
+ this.trackEvent({
180
+ action: 'click',
181
+ category,
182
+ label: buttonName
183
+ });
184
+ }
185
+ trackFormSubmit(formName) {
186
+ this.trackEvent({
187
+ action: 'submit',
188
+ category: 'Form',
189
+ label: formName
190
+ });
191
+ }
192
+ trackFormSubscription(formName) {
193
+ this.trackEvent({
194
+ action: 'subscribe',
195
+ category: 'Marketing',
196
+ label: formName
197
+ });
198
+ }
199
+ trackUserRegistration(userType) {
200
+ this.trackEvent({
201
+ action: 'sign_up',
202
+ category: 'Engagement',
203
+ label: userType
204
+ });
205
+ }
206
+ trackUserLogin(userType) {
207
+ this.trackEvent({
208
+ action: 'login',
209
+ category: 'Engagement',
210
+ label: userType
211
+ });
212
+ }
213
+ checkStatus() {
214
+ const state = this.getState();
215
+ if (this.config?.debug) {
216
+ console.log('[AnalyticsService] Status:', state);
217
+ }
218
+ return state;
219
+ }
220
+ setConsent(hasConsent) {
221
+ this.hasConsent = hasConsent;
222
+ this.notifyListeners();
223
+ if (this.config?.debug) {
224
+ console.log('[AnalyticsService] Consent updated:', hasConsent);
225
+ }
226
+ }
227
+ // Event system for state changes
228
+ onStateChange(callback) {
229
+ this.listeners.push(callback);
230
+ return () => {
231
+ const index = this.listeners.indexOf(callback);
232
+ if (index > -1) {
233
+ this.listeners.splice(index, 1);
234
+ }
235
+ };
236
+ }
237
+ notifyListeners() {
238
+ const state = this.getState();
239
+ this.listeners.forEach(callback => {
240
+ try {
241
+ callback(state);
242
+ }
243
+ catch (error) {
244
+ console.error('[AnalyticsService] Error in listener callback:', error);
245
+ }
246
+ });
247
+ }
248
+ //Método para debug:
249
+ testTracking() {
250
+ if (!this.isEnabled()) {
251
+ console.error('[AnalyticsService] Not ready for tracking');
252
+ return;
253
+ }
254
+ console.log('[AnalyticsService] Sending test event...');
255
+ window.gtag('event', 'test_event', {
256
+ event_category: 'Test',
257
+ event_label: 'Manual Test'
258
+ });
259
+ }
260
+ }
261
+ //# sourceMappingURL=AnalyticsService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnalyticsService.js","sourceRoot":"","sources":["../../../src/analytics/services/AnalyticsService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import type { IAnalyticsService, AnalyticsConfig, GAEvent } from '../interfaces/IAnalyticsService.js';
2
+ export interface ConsentProvider {
3
+ hasConsent(type: string): boolean;
4
+ onConsentChange(callback: (state: any) => void): () => void;
5
+ }
6
+ /**
7
+ * Creates consent-aware analytics instance
8
+ */
9
+ export declare function createConsentAwareAnalytics(consentProvider: ConsentProvider, config: AnalyticsConfig, consentType?: string): IAnalyticsService;
10
+ /**
11
+ * Wraps any analytics/tracking service with consent awareness
12
+ */
13
+ export declare function createConsentWrapper<T extends Record<string, (...args: any[]) => any>>(service: T, consentProvider: ConsentProvider, consentType?: string): T;
14
+ /**
15
+ * Creates consent-aware pixel tracking
16
+ */
17
+ export interface PixelConfig {
18
+ pixelId: string;
19
+ consentType?: string;
20
+ debug?: boolean;
21
+ }
22
+ export interface PixelEvent {
23
+ event: string;
24
+ data?: Record<string, any>;
25
+ }
26
+ export declare function createConsentAwarePixel(consentProvider: ConsentProvider, config: PixelConfig): {
27
+ track: (event: string, data?: Record<string, any>) => void;
28
+ trackCustom: (event: string, data?: Record<string, any>) => void;
29
+ };
30
+ /**
31
+ * Analytics event builder for common use cases
32
+ */
33
+ export declare class AnalyticsEventBuilder {
34
+ private event;
35
+ static create(): AnalyticsEventBuilder;
36
+ action(action: string): this;
37
+ category(category: string): this;
38
+ label(label: string): this;
39
+ value(value: number): this;
40
+ build(): GAEvent;
41
+ }
42
+ /**
43
+ * Common analytics events factory
44
+ */
45
+ export declare const AnalyticsEvents: {
46
+ buttonClick: (buttonName: string, category?: string) => GAEvent;
47
+ formSubmit: (formName: string) => GAEvent;
48
+ download: (fileName: string) => GAEvent;
49
+ videoPlay: (videoTitle: string) => GAEvent;
50
+ purchase: (productName: string, value: number) => GAEvent;
51
+ };
52
+ //# sourceMappingURL=consent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consent.d.ts","sourceRoot":"","sources":["../../../src/analytics/utils/consent.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,oCAAoC,CAAC;AAGtG,MAAM,WAAW,eAAe;IAC5B,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAClC,eAAe,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;CAC/D;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CACvC,eAAe,EAAE,eAAe,EAChC,MAAM,EAAE,eAAe,EACvB,WAAW,SAAc,GAC1B,iBAAiB,CAiBnB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,EAClF,OAAO,EAAE,CAAC,EACV,eAAe,EAAE,eAAe,EAChC,WAAW,SAAc,GAC1B,CAAC,CAmBH;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC9B;AAED,wBAAgB,uBAAuB,CACnC,eAAe,EAAE,eAAe,EAChC,MAAM,EAAE,WAAW;mBAKA,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;yBAkB5B,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;EAiB9D;AAED;;GAEG;AACH,qBAAa,qBAAqB;IAC9B,OAAO,CAAC,KAAK,CAAwB;IAErC,MAAM,CAAC,MAAM,IAAI,qBAAqB;IAItC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAK5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAKhC,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK1B,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK1B,KAAK,IAAI,OAAO;CAOnB;AAED;;GAEG;AACH,eAAO,MAAM,eAAe;8BACE,MAAM;2BAOT,MAAM;yBAOR,MAAM;4BAOH,MAAM;4BAON,MAAM,SAAS,MAAM;CAOhD,CAAC"}
@@ -0,0 +1,138 @@
1
+ import { AnalyticsService } from '../services/AnalyticsService.js';
2
+ /**
3
+ * Creates consent-aware analytics instance
4
+ */
5
+ export function createConsentAwareAnalytics(consentProvider, config, consentType = 'analytics') {
6
+ const analytics = AnalyticsService.getInstance();
7
+ // Initialize with config
8
+ analytics.initialize(config);
9
+ // Set initial consent state
10
+ const hasInitialConsent = consentProvider.hasConsent(consentType);
11
+ analytics.setConsent(hasInitialConsent);
12
+ // Listen for consent changes
13
+ consentProvider.onConsentChange((state) => {
14
+ const hasConsent = state[consentType] === true;
15
+ analytics.setConsent(hasConsent);
16
+ });
17
+ return analytics;
18
+ }
19
+ /**
20
+ * Wraps any analytics/tracking service with consent awareness
21
+ */
22
+ export function createConsentWrapper(service, consentProvider, consentType = 'analytics') {
23
+ const wrappedService = {};
24
+ for (const [key, method] of Object.entries(service)) {
25
+ if (typeof method === 'function') {
26
+ wrappedService[key] = ((...args) => {
27
+ if (consentProvider.hasConsent(consentType)) {
28
+ return method.apply(service, args);
29
+ }
30
+ else {
31
+ console.log(`[ConsentWrapper] Blocked ${key} call - no ${consentType} consent`);
32
+ return undefined;
33
+ }
34
+ });
35
+ }
36
+ else {
37
+ wrappedService[key] = method;
38
+ }
39
+ }
40
+ return wrappedService;
41
+ }
42
+ export function createConsentAwarePixel(consentProvider, config) {
43
+ const { pixelId, consentType = 'marketing', debug = false } = config;
44
+ return {
45
+ track: (event, data) => {
46
+ if (!consentProvider.hasConsent(consentType)) {
47
+ if (debug) {
48
+ console.log(`[PixelTracker] Blocked ${event} - no ${consentType} consent`);
49
+ }
50
+ return;
51
+ }
52
+ // Example implementation for Facebook Pixel
53
+ if (typeof window !== 'undefined' && window.fbq) {
54
+ window.fbq('track', event, data);
55
+ if (debug) {
56
+ console.log(`[PixelTracker] Tracked ${event}:`, data);
57
+ }
58
+ }
59
+ },
60
+ trackCustom: (event, data) => {
61
+ if (!consentProvider.hasConsent(consentType)) {
62
+ if (debug) {
63
+ console.log(`[PixelTracker] Blocked custom ${event} - no ${consentType} consent`);
64
+ }
65
+ return;
66
+ }
67
+ if (typeof window !== 'undefined' && window.fbq) {
68
+ window.fbq('trackCustom', event, data);
69
+ if (debug) {
70
+ console.log(`[PixelTracker] Tracked custom ${event}:`, data);
71
+ }
72
+ }
73
+ }
74
+ };
75
+ }
76
+ /**
77
+ * Analytics event builder for common use cases
78
+ */
79
+ export class AnalyticsEventBuilder {
80
+ event = {};
81
+ static create() {
82
+ return new AnalyticsEventBuilder();
83
+ }
84
+ action(action) {
85
+ this.event.action = action;
86
+ return this;
87
+ }
88
+ category(category) {
89
+ this.event.category = category;
90
+ return this;
91
+ }
92
+ label(label) {
93
+ this.event.label = label;
94
+ return this;
95
+ }
96
+ value(value) {
97
+ this.event.value = value;
98
+ return this;
99
+ }
100
+ build() {
101
+ if (!this.event.action || !this.event.category) {
102
+ throw new Error('Analytics event must have action and category');
103
+ }
104
+ return this.event;
105
+ }
106
+ }
107
+ /**
108
+ * Common analytics events factory
109
+ */
110
+ export const AnalyticsEvents = {
111
+ buttonClick: (buttonName, category = 'UI') => AnalyticsEventBuilder.create()
112
+ .action('click')
113
+ .category(category)
114
+ .label(buttonName)
115
+ .build(),
116
+ formSubmit: (formName) => AnalyticsEventBuilder.create()
117
+ .action('submit')
118
+ .category('Form')
119
+ .label(formName)
120
+ .build(),
121
+ download: (fileName) => AnalyticsEventBuilder.create()
122
+ .action('download')
123
+ .category('Engagement')
124
+ .label(fileName)
125
+ .build(),
126
+ videoPlay: (videoTitle) => AnalyticsEventBuilder.create()
127
+ .action('play')
128
+ .category('Video')
129
+ .label(videoTitle)
130
+ .build(),
131
+ purchase: (productName, value) => AnalyticsEventBuilder.create()
132
+ .action('purchase')
133
+ .category('Ecommerce')
134
+ .label(productName)
135
+ .value(value)
136
+ .build()
137
+ };
138
+ //# sourceMappingURL=consent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consent.js","sourceRoot":"","sources":["../../../src/analytics/utils/consent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { type Writable } from 'svelte/store';
2
+ import type { AuthStore } from '../types/index.js';
3
+ export declare const authStore: Writable<AuthStore> & {
4
+ login: (user: Record<string, unknown>) => void;
5
+ logout: () => void;
6
+ setLoading: (loading: boolean) => void;
7
+ setError: (error: string | null) => void;
8
+ initialize: () => void;
9
+ };
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,QAAQ,EAAiB,MAAM,cAAc,CAAC;AAE/E,OAAO,KAAK,EAAE,SAAS,EAAY,MAAM,mBAAmB,CAAC;AA6D7D,eAAO,MAAM,SAAS;WAtDX,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI;YACtC,MAAM,IAAI;gBACN,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI;cAC5B,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI;gBAC5B,MAAM,IAAI;CAkDgB,CAAC"}
@@ -0,0 +1,49 @@
1
+ import { writable, derived } from 'svelte/store';
2
+ import { browser } from '$app/environment';
3
+ // ============================================================================
4
+ // AUTH STORE
5
+ // ============================================================================
6
+ function createAuthStore() {
7
+ const { subscribe, set, update } = writable({
8
+ isAuthenticated: false,
9
+ user: null,
10
+ loading: false,
11
+ error: null
12
+ });
13
+ return {
14
+ subscribe,
15
+ set,
16
+ update,
17
+ login: (user) => {
18
+ // HttpOnly cookies are handled by server - no client-side storage needed
19
+ set({
20
+ isAuthenticated: true,
21
+ user,
22
+ loading: false,
23
+ error: null
24
+ });
25
+ },
26
+ logout: () => {
27
+ // HttpOnly cookies are cleared by server via /auth/logout endpoint
28
+ set({
29
+ isAuthenticated: false,
30
+ user: null,
31
+ loading: false,
32
+ error: null
33
+ });
34
+ },
35
+ setLoading: (loading) => {
36
+ update(state => ({ ...state, loading }));
37
+ },
38
+ setError: (error) => {
39
+ update(state => ({ ...state, error, loading: false }));
40
+ },
41
+ initialize: () => {
42
+ // Auth state is managed by server-side via HttpOnly cookies
43
+ // The app layout will call initializeAuth() with the API client
44
+ // to avoid circular dependencies
45
+ }
46
+ };
47
+ }
48
+ export const authStore = createAuthStore();
49
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAgC,MAAM,cAAc,CAAC;AAC/E,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAG3C,+EAA+E;AAC/E,aAAa;AACb,+EAA+E;AAE/E,SAAS,eAAe;IAOpB,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAY;QACnD,eAAe,EAAE,KAAK;QACtB,IAAI,EAAE,IAAI;QACV,OAAO,EAAE,KAAK;QACd,KAAK,EAAE,IAAI;KACd,CAAC,CAAC;IAEH,OAAO;QACH,SAAS;QACT,GAAG;QACH,MAAM;QAEN,KAAK,EAAE,CAAC,IAA6B,EAAE,EAAE;YACrC,yEAAyE;YACzE,GAAG,CAAC;gBACA,eAAe,EAAE,IAAI;gBACrB,IAAI;gBACJ,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,IAAI;aACd,CAAC,CAAC;QACP,CAAC;QAED,MAAM,EAAE,GAAG,EAAE;YACT,mEAAmE;YACnE,GAAG,CAAC;gBACA,eAAe,EAAE,KAAK;gBACtB,IAAI,EAAE,IAAI;gBACV,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,IAAI;aACd,CAAC,CAAC;QACP,CAAC;QAED,UAAU,EAAE,CAAC,OAAgB,EAAE,EAAE;YAC7B,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;QAC7C,CAAC;QAED,QAAQ,EAAE,CAAC,KAAoB,EAAE,EAAE;YAC/B,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QAC3D,CAAC;QAED,UAAU,EAAE,GAAG,EAAE;YACb,4DAA4D;YAC5D,gEAAgE;YAChE,iCAAiC;QACrC,CAAC;KACJ,CAAC;AACN,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,eAAe,EAAE,CAAC"}