@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,196 @@
1
+ import { writable, derived, get } from 'svelte/store';
2
+ import { browser } from '$app/environment';
3
+ import { safeDecodeJwt } from './jwtDecoder.js';
4
+ // ============================================================================
5
+ // AUTH STORE
6
+ // ============================================================================
7
+ function createAuthStore() {
8
+ const { subscribe, set, update } = writable({
9
+ isAuthenticated: false,
10
+ user: null,
11
+ loading: false,
12
+ error: null
13
+ });
14
+ return {
15
+ subscribe,
16
+ set,
17
+ update,
18
+ login: (user) => {
19
+ // HttpOnly cookies are handled by server - no client-side storage needed
20
+ set({
21
+ isAuthenticated: true,
22
+ user,
23
+ loading: false,
24
+ error: null
25
+ });
26
+ },
27
+ logout: () => {
28
+ // HttpOnly cookies are cleared by server via /auth/logout endpoint
29
+ set({
30
+ isAuthenticated: false,
31
+ user: null,
32
+ loading: false,
33
+ error: null
34
+ });
35
+ },
36
+ setLoading: (loading) => {
37
+ update(state => ({ ...state, loading }));
38
+ },
39
+ setError: (error) => {
40
+ update(state => ({ ...state, error, loading: false }));
41
+ },
42
+ initialize: () => {
43
+ // Auth state is managed by server-side via HttpOnly cookies
44
+ // The app layout will call initializeFromJwt() with decoded JWT data
45
+ // to avoid circular dependencies and API calls
46
+ },
47
+ initializeFromJwt: (jwtPayload) => {
48
+ // Convert JWT payload to user object (generic fields only)
49
+ const user = {
50
+ id: jwtPayload.userId,
51
+ email: jwtPayload.email,
52
+ role: jwtPayload.role,
53
+ name: jwtPayload.name,
54
+ permissions: jwtPayload.permissions,
55
+ // Include all other payload fields dynamically
56
+ ...Object.fromEntries(Object.entries(jwtPayload).filter(([key]) => !['userId', 'email', 'role', 'name', 'permissions', 'iat', 'exp'].includes(key)))
57
+ };
58
+ set({
59
+ isAuthenticated: true,
60
+ user,
61
+ loading: false,
62
+ error: null
63
+ });
64
+ console.debug('Auth initialized from JWT payload', {
65
+ userId: jwtPayload.userId,
66
+ role: jwtPayload.role,
67
+ permissionsCount: jwtPayload.permissions?.length || 0
68
+ });
69
+ },
70
+ initializeFromToken: (token) => {
71
+ try {
72
+ const decoded = safeDecodeJwt(token);
73
+ if (!decoded || !decoded.isValid) {
74
+ console.debug('Invalid JWT token provided for auth initialization');
75
+ return false;
76
+ }
77
+ if (decoded.isExpired) {
78
+ console.debug('Expired JWT token provided for auth initialization');
79
+ return false;
80
+ }
81
+ // Convert JWT payload to user object (generic fields only)
82
+ const user = {
83
+ id: decoded.payload.userId,
84
+ email: decoded.payload.email,
85
+ role: decoded.payload.role,
86
+ name: decoded.payload.name,
87
+ permissions: decoded.payload.permissions,
88
+ // Include all other payload fields dynamically
89
+ ...Object.fromEntries(Object.entries(decoded.payload).filter(([key]) => !['userId', 'email', 'role', 'name', 'permissions', 'iat', 'exp'].includes(key)))
90
+ };
91
+ set({
92
+ isAuthenticated: true,
93
+ user,
94
+ loading: false,
95
+ error: null
96
+ });
97
+ console.debug('Auth initialized from token', {
98
+ userId: decoded.payload.userId,
99
+ role: decoded.payload.role,
100
+ permissionsCount: decoded.payload.permissions?.length || 0
101
+ });
102
+ return true;
103
+ }
104
+ catch (error) {
105
+ console.warn('Failed to initialize auth from token:', error);
106
+ return false;
107
+ }
108
+ }
109
+ };
110
+ }
111
+ export const authStore = createAuthStore();
112
+ // ============================================================================
113
+ // API STORE
114
+ // ============================================================================
115
+ function createApiStore() {
116
+ const { subscribe, set, update } = writable({
117
+ loading: false,
118
+ error: null,
119
+ lastRequest: null
120
+ });
121
+ return {
122
+ subscribe,
123
+ set,
124
+ update,
125
+ setLoading: (loading) => {
126
+ update(state => ({ ...state, loading }));
127
+ },
128
+ setError: (error) => {
129
+ update(state => ({ ...state, error }));
130
+ },
131
+ setLastRequest: (request) => {
132
+ update(state => ({ ...state, lastRequest: request }));
133
+ }
134
+ };
135
+ }
136
+ export const apiStore = createApiStore();
137
+ // ============================================================================
138
+ // DERIVED STORES
139
+ // ============================================================================
140
+ // Get current user
141
+ export const currentUser = derived(authStore, $auth => $auth.user);
142
+ // Check if any operation is loading
143
+ export const isLoading = derived([authStore, apiStore], ([$auth, $api]) => $auth.loading || $api.loading);
144
+ // Get any error from auth or API
145
+ export const currentError = derived([authStore, apiStore], ([$auth, $api]) => $auth.error || $api.error);
146
+ // ============================================================================
147
+ // STORE ACTIONS
148
+ // ============================================================================
149
+ // Initialize stores on app start
150
+ export function initializeStores() {
151
+ if (browser) {
152
+ authStore.initialize();
153
+ }
154
+ }
155
+ // Clear all errors
156
+ export function clearErrors() {
157
+ authStore.setError(null);
158
+ apiStore.setError(null);
159
+ }
160
+ // Initialize auth with API client (deprecated - use initializeFromJwt instead)
161
+ export async function initializeAuth(apiClient) {
162
+ if (!browser)
163
+ return;
164
+ // Get current auth state to avoid overriding existing user data
165
+ const currentState = get(authStore);
166
+ // If user is already authenticated, skip the API call to avoid race conditions
167
+ if (currentState.isAuthenticated && currentState.user) {
168
+ console.debug('Auth already initialized, skipping API call');
169
+ return;
170
+ }
171
+ authStore.setLoading(true);
172
+ try {
173
+ // This will work if user has valid HttpOnly cookie
174
+ const result = await apiClient.get('/auth/me');
175
+ if (result) {
176
+ authStore.login(result);
177
+ }
178
+ else {
179
+ authStore.setLoading(false);
180
+ }
181
+ }
182
+ catch (error) {
183
+ // User not authenticated or network error - that's fine
184
+ console.debug('Auth initialization: user not authenticated');
185
+ authStore.setLoading(false);
186
+ }
187
+ }
188
+ // Initialize auth from JWT payload (recommended approach)
189
+ export function initializeFromJwt(jwtPayload) {
190
+ authStore.initializeFromJwt(jwtPayload);
191
+ }
192
+ // Initialize auth from JWT token string
193
+ export function initializeFromToken(token) {
194
+ return authStore.initializeFromToken(token);
195
+ }
196
+ //# sourceMappingURL=stores.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stores.js","sourceRoot":"","sources":["../../src/client/stores.ts"],"names":[],"mappings":"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"}