@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.
- package/README.md +554 -0
- package/dist/analytics/components/GoogleAnalytics.svelte +96 -0
- package/dist/analytics/config/analytics.config.d.ts +6 -0
- package/dist/analytics/config/analytics.config.d.ts.map +1 -0
- package/dist/analytics/config/analytics.config.js +27 -0
- package/dist/analytics/config/analytics.config.js.map +1 -0
- package/dist/analytics/index.d.ts +7 -0
- package/dist/analytics/index.d.ts.map +1 -0
- package/dist/analytics/index.js +9 -0
- package/dist/analytics/index.js.map +1 -0
- package/dist/analytics/interfaces/IAnalyticsService.d.ts +40 -0
- package/dist/analytics/interfaces/IAnalyticsService.d.ts.map +1 -0
- package/dist/analytics/interfaces/IAnalyticsService.js +2 -0
- package/dist/analytics/interfaces/IAnalyticsService.js.map +1 -0
- package/dist/analytics/services/AnalyticsService.d.ts +37 -0
- package/dist/analytics/services/AnalyticsService.d.ts.map +1 -0
- package/dist/analytics/services/AnalyticsService.js +261 -0
- package/dist/analytics/services/AnalyticsService.js.map +1 -0
- package/dist/analytics/utils/consent.d.ts +52 -0
- package/dist/analytics/utils/consent.d.ts.map +1 -0
- package/dist/analytics/utils/consent.js +138 -0
- package/dist/analytics/utils/consent.js.map +1 -0
- package/dist/auth/index.d.ts +10 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +49 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/client/ApiClient.d.ts +17 -0
- package/dist/client/ApiClient.d.ts.map +1 -0
- package/dist/client/ApiClient.js +184 -0
- package/dist/client/ApiClient.js.map +1 -0
- package/dist/client/NotificationComponent.d.ts +7 -0
- package/dist/client/NotificationComponent.d.ts.map +1 -0
- package/dist/client/NotificationComponent.js +131 -0
- package/dist/client/NotificationComponent.js.map +1 -0
- package/dist/client/apiWrapper.d.ts +324 -0
- package/dist/client/apiWrapper.d.ts.map +1 -0
- package/dist/client/apiWrapper.js +257 -0
- package/dist/client/apiWrapper.js.map +1 -0
- package/dist/client/authErrorHandler.d.ts +19 -0
- package/dist/client/authErrorHandler.d.ts.map +1 -0
- package/dist/client/authErrorHandler.js +40 -0
- package/dist/client/authErrorHandler.js.map +1 -0
- package/dist/client/hooks.d.ts +11 -0
- package/dist/client/hooks.d.ts.map +1 -0
- package/dist/client/hooks.js +28 -0
- package/dist/client/hooks.js.map +1 -0
- package/dist/client/index.d.ts +8 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +13 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/jwtDecoder.d.ts +56 -0
- package/dist/client/jwtDecoder.d.ts.map +1 -0
- package/dist/client/jwtDecoder.js +114 -0
- package/dist/client/jwtDecoder.js.map +1 -0
- package/dist/client/notifications.d.ts +55 -0
- package/dist/client/notifications.d.ts.map +1 -0
- package/dist/client/notifications.js +160 -0
- package/dist/client/notifications.js.map +1 -0
- package/dist/client/stores.d.ts +26 -0
- package/dist/client/stores.d.ts.map +1 -0
- package/dist/client/stores.js +196 -0
- package/dist/client/stores.js.map +1 -0
- package/dist/consent/components/CookieConsent.svelte +580 -0
- package/dist/consent/config/consent.config.d.ts +7 -0
- package/dist/consent/config/consent.config.d.ts.map +1 -0
- package/dist/consent/config/consent.config.js +194 -0
- package/dist/consent/config/consent.config.js.map +1 -0
- package/dist/consent/index.d.ts +5 -0
- package/dist/consent/index.d.ts.map +1 -0
- package/dist/consent/index.js +7 -0
- package/dist/consent/index.js.map +1 -0
- package/dist/consent/interfaces/IConsentService.d.ts +121 -0
- package/dist/consent/interfaces/IConsentService.d.ts.map +1 -0
- package/dist/consent/interfaces/IConsentService.js +2 -0
- package/dist/consent/interfaces/IConsentService.js.map +1 -0
- package/dist/consent/services/ConsentService.d.ts +39 -0
- package/dist/consent/services/ConsentService.d.ts.map +1 -0
- package/dist/consent/services/ConsentService.js +302 -0
- package/dist/consent/services/ConsentService.js.map +1 -0
- package/dist/consent/utils/analytics.d.ts +52 -0
- package/dist/consent/utils/analytics.d.ts.map +1 -0
- package/dist/consent/utils/analytics.js +181 -0
- package/dist/consent/utils/analytics.js.map +1 -0
- package/dist/hooks/index.d.ts +14 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +218 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/types/index.d.ts +88 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- 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 @@
|
|
|
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"}
|