@codingfactory/socialkit-vue 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 (56) hide show
  1. package/dist/composables/useAuth.d.ts +27 -0
  2. package/dist/composables/useAuth.d.ts.map +1 -0
  3. package/dist/composables/useAuth.js +137 -0
  4. package/dist/composables/useAuth.js.map +1 -0
  5. package/dist/index.d.ts +25 -0
  6. package/dist/index.d.ts.map +1 -0
  7. package/dist/index.js +16 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/plugins/terminology/index.d.ts +11 -0
  10. package/dist/plugins/terminology/index.d.ts.map +1 -0
  11. package/dist/plugins/terminology/index.js +91 -0
  12. package/dist/plugins/terminology/index.js.map +1 -0
  13. package/dist/plugins/terminology/terms.d.ts +15 -0
  14. package/dist/plugins/terminology/terms.d.ts.map +1 -0
  15. package/dist/plugins/terminology/terms.js +72 -0
  16. package/dist/plugins/terminology/terms.js.map +1 -0
  17. package/dist/plugins/terminology/types.d.ts +32 -0
  18. package/dist/plugins/terminology/types.d.ts.map +1 -0
  19. package/dist/plugins/terminology/types.js +2 -0
  20. package/dist/plugins/terminology/types.js.map +1 -0
  21. package/dist/services/api.d.ts +50 -0
  22. package/dist/services/api.d.ts.map +1 -0
  23. package/dist/services/api.js +305 -0
  24. package/dist/services/api.js.map +1 -0
  25. package/dist/services/auth.d.ts +127 -0
  26. package/dist/services/auth.d.ts.map +1 -0
  27. package/dist/services/auth.js +562 -0
  28. package/dist/services/auth.js.map +1 -0
  29. package/dist/stores/auth.d.ts +174 -0
  30. package/dist/stores/auth.d.ts.map +1 -0
  31. package/dist/stores/auth.js +262 -0
  32. package/dist/stores/auth.js.map +1 -0
  33. package/dist/types/api.d.ts +52 -0
  34. package/dist/types/api.d.ts.map +1 -0
  35. package/dist/types/api.js +7 -0
  36. package/dist/types/api.js.map +1 -0
  37. package/dist/types/user.d.ts +42 -0
  38. package/dist/types/user.d.ts.map +1 -0
  39. package/dist/types/user.js +45 -0
  40. package/dist/types/user.js.map +1 -0
  41. package/dist/utils/tokenStorage.d.ts +41 -0
  42. package/dist/utils/tokenStorage.d.ts.map +1 -0
  43. package/dist/utils/tokenStorage.js +300 -0
  44. package/dist/utils/tokenStorage.js.map +1 -0
  45. package/package.json +40 -0
  46. package/src/composables/useAuth.ts +164 -0
  47. package/src/index.ts +118 -0
  48. package/src/plugins/terminology/index.ts +114 -0
  49. package/src/plugins/terminology/terms.ts +104 -0
  50. package/src/plugins/terminology/types.ts +28 -0
  51. package/src/services/api.ts +472 -0
  52. package/src/services/auth.ts +874 -0
  53. package/src/stores/auth.ts +400 -0
  54. package/src/types/api.ts +56 -0
  55. package/src/types/user.ts +94 -0
  56. package/src/utils/tokenStorage.ts +394 -0
@@ -0,0 +1,174 @@
1
+ /**
2
+ * Generic auth store factory for SocialKit-powered frontends.
3
+ *
4
+ * Use `createAuthStoreDefinition()` to produce a Pinia store definition
5
+ * that each site frontend can register with its own configuration.
6
+ */
7
+ import type { ComputedRef, Ref } from 'vue';
8
+ import type { Router } from 'vue-router';
9
+ import type { AuthServiceInstance, LoginResponse, RegisterData } from '../services/auth.js';
10
+ import type { ApiService } from '../services/api.js';
11
+ import type { TokenStorage } from '../utils/tokenStorage.js';
12
+ import type { User } from '../types/user.js';
13
+ export interface AuthStoreStateRefs {
14
+ user: Ref<User | null>;
15
+ isAuthenticated: Ref<boolean>;
16
+ loading: Ref<boolean>;
17
+ }
18
+ export interface AuthStoreGetters {
19
+ currentUser: ComputedRef<User | null>;
20
+ isLoggedIn: ComputedRef<boolean>;
21
+ token: ComputedRef<string | null>;
22
+ }
23
+ export interface AuthStoreActions {
24
+ login: (loginCredential: string, password: string, redirectPath?: string, remember?: boolean) => Promise<LoginResponse>;
25
+ register: (data: RegisterData) => Promise<LoginResponse>;
26
+ logout: () => Promise<void>;
27
+ refreshSessionAndReplay: () => Promise<boolean>;
28
+ fetchUser: () => Promise<User | null>;
29
+ checkAuth: (forceValidation?: boolean) => Promise<void>;
30
+ setUser: (newUser: User) => void;
31
+ hasStoredToken: () => boolean;
32
+ }
33
+ export interface AuthStoreExtensionContext {
34
+ state: AuthStoreStateRefs;
35
+ getters: AuthStoreGetters;
36
+ actions: AuthStoreActions;
37
+ services: {
38
+ authService: AuthServiceInstance;
39
+ apiService: ApiService;
40
+ tokenStorage: TokenStorage;
41
+ router: Router;
42
+ };
43
+ config: {
44
+ storeId: string;
45
+ defaultLoginRedirect: string;
46
+ };
47
+ resolveSafeRedirectPath: (redirectPath?: string) => string;
48
+ }
49
+ export type AuthStoreExtension = Record<string, unknown>;
50
+ /** Configuration for creating the auth store definition. */
51
+ export interface AuthStoreConfig<TExtension extends AuthStoreExtension = Record<string, never>> {
52
+ /** Pinia store id (default: 'auth'). */
53
+ storeId?: string;
54
+ /** Auth service instance. */
55
+ authService: AuthServiceInstance;
56
+ /** API service instance (for pending auth request management). */
57
+ apiService: ApiService;
58
+ /** Token storage instance. */
59
+ tokenStorage: TokenStorage;
60
+ /** Vue Router instance. */
61
+ router: Router;
62
+ /** Default redirect path after login (default: '/'). */
63
+ defaultLoginRedirect?: string;
64
+ /** Extra Pinia store options (e.g. persist config from pinia-plugin-persistedstate). */
65
+ storeOptions?: Record<string, unknown>;
66
+ /** Hook called during logout to reset app-specific stores. */
67
+ onLogout?: () => Promise<void> | void;
68
+ /** Hook called after the user object is updated. */
69
+ onUserUpdated?: (prev: User | null, next: User) => void;
70
+ /** Callback to set the validating-auth flag on the auth service layer. */
71
+ setValidatingAuth?: (value: boolean) => void;
72
+ /** Add app-specific state, getters, and actions without forking the generic auth core. */
73
+ extend?: (context: AuthStoreExtensionContext) => TExtension;
74
+ }
75
+ export type AuthStoreReturn = ReturnType<ReturnType<typeof createAuthStoreDefinition>>;
76
+ /** Create a Pinia auth store definition configured for a specific site. */
77
+ export declare function createAuthStoreDefinition<TExtension extends AuthStoreExtension = Record<string, never>>(config: AuthStoreConfig<TExtension>): import("pinia").StoreDefinition<string, Pick<{
78
+ login: (loginCredential: string, password: string, redirectPath?: string, remember?: boolean) => Promise<LoginResponse>;
79
+ register: (data: RegisterData) => Promise<LoginResponse>;
80
+ logout: () => Promise<void>;
81
+ refreshSessionAndReplay: () => Promise<boolean>;
82
+ fetchUser: () => Promise<User | null>;
83
+ checkAuth: (forceValidation?: boolean) => Promise<void>;
84
+ setUser: (newUser: User) => void;
85
+ hasStoredToken: () => boolean;
86
+ currentUser: ComputedRef<User | null>;
87
+ isLoggedIn: ComputedRef<boolean>;
88
+ token: ComputedRef<string | null>;
89
+ user: ComputedRef<{
90
+ id: string;
91
+ name: string;
92
+ email: string;
93
+ avatar?: (string | Record<string, unknown> | null) | undefined;
94
+ avatar_url?: string | null | undefined;
95
+ cover_photo?: string | null | undefined;
96
+ handle?: string | undefined;
97
+ role: "admin" | "moderator" | "user";
98
+ tenant_id?: string | undefined;
99
+ roles?: string[] | undefined;
100
+ permissions?: string[] | undefined;
101
+ capabilities?: Record<string, boolean> | undefined;
102
+ last_login_at?: string | undefined;
103
+ created_at?: string | undefined;
104
+ status?: "active" | "suspended" | "banned" | undefined;
105
+ model_type?: string | undefined;
106
+ } | null>;
107
+ isAuthenticated: ComputedRef<boolean>;
108
+ loading: ComputedRef<boolean>;
109
+ }, never>, Pick<{
110
+ login: (loginCredential: string, password: string, redirectPath?: string, remember?: boolean) => Promise<LoginResponse>;
111
+ register: (data: RegisterData) => Promise<LoginResponse>;
112
+ logout: () => Promise<void>;
113
+ refreshSessionAndReplay: () => Promise<boolean>;
114
+ fetchUser: () => Promise<User | null>;
115
+ checkAuth: (forceValidation?: boolean) => Promise<void>;
116
+ setUser: (newUser: User) => void;
117
+ hasStoredToken: () => boolean;
118
+ currentUser: ComputedRef<User | null>;
119
+ isLoggedIn: ComputedRef<boolean>;
120
+ token: ComputedRef<string | null>;
121
+ user: ComputedRef<{
122
+ id: string;
123
+ name: string;
124
+ email: string;
125
+ avatar?: (string | Record<string, unknown> | null) | undefined;
126
+ avatar_url?: string | null | undefined;
127
+ cover_photo?: string | null | undefined;
128
+ handle?: string | undefined;
129
+ role: "admin" | "moderator" | "user";
130
+ tenant_id?: string | undefined;
131
+ roles?: string[] | undefined;
132
+ permissions?: string[] | undefined;
133
+ capabilities?: Record<string, boolean> | undefined;
134
+ last_login_at?: string | undefined;
135
+ created_at?: string | undefined;
136
+ status?: "active" | "suspended" | "banned" | undefined;
137
+ model_type?: string | undefined;
138
+ } | null>;
139
+ isAuthenticated: ComputedRef<boolean>;
140
+ loading: ComputedRef<boolean>;
141
+ }, "user" | "token" | "currentUser" | "isLoggedIn" | "isAuthenticated" | "loading">, Pick<{
142
+ login: (loginCredential: string, password: string, redirectPath?: string, remember?: boolean) => Promise<LoginResponse>;
143
+ register: (data: RegisterData) => Promise<LoginResponse>;
144
+ logout: () => Promise<void>;
145
+ refreshSessionAndReplay: () => Promise<boolean>;
146
+ fetchUser: () => Promise<User | null>;
147
+ checkAuth: (forceValidation?: boolean) => Promise<void>;
148
+ setUser: (newUser: User) => void;
149
+ hasStoredToken: () => boolean;
150
+ currentUser: ComputedRef<User | null>;
151
+ isLoggedIn: ComputedRef<boolean>;
152
+ token: ComputedRef<string | null>;
153
+ user: ComputedRef<{
154
+ id: string;
155
+ name: string;
156
+ email: string;
157
+ avatar?: (string | Record<string, unknown> | null) | undefined;
158
+ avatar_url?: string | null | undefined;
159
+ cover_photo?: string | null | undefined;
160
+ handle?: string | undefined;
161
+ role: "admin" | "moderator" | "user";
162
+ tenant_id?: string | undefined;
163
+ roles?: string[] | undefined;
164
+ permissions?: string[] | undefined;
165
+ capabilities?: Record<string, boolean> | undefined;
166
+ last_login_at?: string | undefined;
167
+ created_at?: string | undefined;
168
+ status?: "active" | "suspended" | "banned" | undefined;
169
+ model_type?: string | undefined;
170
+ } | null>;
171
+ isAuthenticated: ComputedRef<boolean>;
172
+ loading: ComputedRef<boolean>;
173
+ }, "login" | "register" | "logout" | "refreshSessionAndReplay" | "fetchUser" | "checkAuth" | "setUser" | "hasStoredToken">>;
174
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/stores/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,262 @@
1
+ /**
2
+ * Generic auth store factory for SocialKit-powered frontends.
3
+ *
4
+ * Use `createAuthStoreDefinition()` to produce a Pinia store definition
5
+ * that each site frontend can register with its own configuration.
6
+ */
7
+ import { defineStore } from 'pinia';
8
+ import { ref, computed } from 'vue';
9
+ /** Create a Pinia auth store definition configured for a specific site. */
10
+ export function createAuthStoreDefinition(config) {
11
+ const { storeId = 'auth', authService, apiService, tokenStorage, router, defaultLoginRedirect = '/', storeOptions = {}, onLogout, onUserUpdated, setValidatingAuth, extend } = config;
12
+ const EXTERNAL_PROTOCOL_PATTERN = /^[a-z][a-z\d+\-.]*:/i;
13
+ return defineStore(storeId, () => {
14
+ // State
15
+ const user = ref(null);
16
+ const isAuthenticated = ref(false);
17
+ const loading = ref(false);
18
+ // Getters
19
+ const currentUser = computed(() => user.value);
20
+ const isLoggedIn = computed(() => isAuthenticated.value);
21
+ const token = computed(() => tokenStorage.getToken());
22
+ function resolveSafeRedirectPath(redirectPath) {
23
+ if (!redirectPath) {
24
+ return defaultLoginRedirect;
25
+ }
26
+ const trimmed = redirectPath.trim();
27
+ if (trimmed === '') {
28
+ return defaultLoginRedirect;
29
+ }
30
+ if (EXTERNAL_PROTOCOL_PATTERN.test(trimmed)) {
31
+ return defaultLoginRedirect;
32
+ }
33
+ if (!trimmed.startsWith('/') || trimmed.startsWith('//')) {
34
+ return defaultLoginRedirect;
35
+ }
36
+ return trimmed;
37
+ }
38
+ // Actions
39
+ async function login(loginCredential, password, redirectPath, remember = false) {
40
+ loading.value = true;
41
+ try {
42
+ const response = await authService.login(loginCredential, password, remember);
43
+ user.value = response.user;
44
+ isAuthenticated.value = true;
45
+ await fetchUser();
46
+ const destination = resolveSafeRedirectPath(redirectPath);
47
+ router.push(destination);
48
+ return response;
49
+ }
50
+ catch (error) {
51
+ isAuthenticated.value = false;
52
+ user.value = null;
53
+ throw error;
54
+ }
55
+ finally {
56
+ loading.value = false;
57
+ }
58
+ }
59
+ async function register(data) {
60
+ loading.value = true;
61
+ try {
62
+ const response = await authService.register(data);
63
+ user.value = response.user;
64
+ isAuthenticated.value = true;
65
+ await fetchUser();
66
+ router.push(defaultLoginRedirect);
67
+ return response;
68
+ }
69
+ catch (error) {
70
+ isAuthenticated.value = false;
71
+ user.value = null;
72
+ throw error;
73
+ }
74
+ finally {
75
+ loading.value = false;
76
+ }
77
+ }
78
+ async function logout() {
79
+ loading.value = true;
80
+ try {
81
+ await authService.logout();
82
+ }
83
+ finally {
84
+ apiService.clearPendingAuthRequest();
85
+ if (onLogout) {
86
+ try {
87
+ await onLogout();
88
+ }
89
+ catch {
90
+ // Swallow store-reset errors during logout
91
+ }
92
+ }
93
+ user.value = null;
94
+ isAuthenticated.value = false;
95
+ loading.value = false;
96
+ const currentPath = window.location.pathname;
97
+ if (currentPath !== '/login' && currentPath !== '/register') {
98
+ router.push('/login');
99
+ }
100
+ }
101
+ }
102
+ async function refreshSessionAndReplay() {
103
+ const refreshedToken = await tokenStorage.tryRefreshToken();
104
+ if (!refreshedToken) {
105
+ apiService.clearPendingAuthRequest();
106
+ user.value = null;
107
+ isAuthenticated.value = false;
108
+ tokenStorage.removeToken();
109
+ return false;
110
+ }
111
+ try {
112
+ await fetchUser();
113
+ }
114
+ catch {
115
+ apiService.clearPendingAuthRequest();
116
+ user.value = null;
117
+ isAuthenticated.value = false;
118
+ tokenStorage.removeToken();
119
+ return false;
120
+ }
121
+ apiService.markAuthRecoveryHandled();
122
+ if (apiService.hasPendingAuthRequest()) {
123
+ try {
124
+ await apiService.replayPendingAuthRequest(refreshedToken);
125
+ }
126
+ catch {
127
+ // Keep session; callers can retry replay manually
128
+ }
129
+ }
130
+ return true;
131
+ }
132
+ async function fetchUser() {
133
+ loading.value = true;
134
+ try {
135
+ const prev = user.value ? { ...user.value } : null;
136
+ const next = await authService.getUser();
137
+ user.value = { ...next };
138
+ isAuthenticated.value = true;
139
+ if (onUserUpdated) {
140
+ onUserUpdated(prev, next);
141
+ }
142
+ return user.value;
143
+ }
144
+ catch (error) {
145
+ isAuthenticated.value = false;
146
+ user.value = null;
147
+ throw error;
148
+ }
149
+ finally {
150
+ loading.value = false;
151
+ }
152
+ }
153
+ async function checkAuth(forceValidation = false) {
154
+ const storedToken = tokenStorage.getToken();
155
+ if (!storedToken) {
156
+ isAuthenticated.value = false;
157
+ user.value = null;
158
+ return;
159
+ }
160
+ if (!forceValidation && isAuthenticated.value && user.value) {
161
+ return;
162
+ }
163
+ if (setValidatingAuth) {
164
+ setValidatingAuth(true);
165
+ }
166
+ try {
167
+ await fetchUser();
168
+ }
169
+ catch {
170
+ isAuthenticated.value = false;
171
+ user.value = null;
172
+ tokenStorage.removeToken();
173
+ }
174
+ finally {
175
+ if (setValidatingAuth) {
176
+ setValidatingAuth(false);
177
+ }
178
+ }
179
+ }
180
+ function setUser(newUser) {
181
+ const prev = user.value ? { ...user.value } : null;
182
+ user.value = { ...newUser };
183
+ isAuthenticated.value = true;
184
+ if (onUserUpdated) {
185
+ onUserUpdated(prev, newUser);
186
+ }
187
+ }
188
+ function hasStoredToken() {
189
+ const storedToken = tokenStorage.getToken();
190
+ if (storedToken === null) {
191
+ isAuthenticated.value = false;
192
+ user.value = null;
193
+ return false;
194
+ }
195
+ return true;
196
+ }
197
+ const baseState = {
198
+ user,
199
+ isAuthenticated,
200
+ loading
201
+ };
202
+ const baseGetters = {
203
+ currentUser,
204
+ isLoggedIn,
205
+ token
206
+ };
207
+ const baseActions = {
208
+ login,
209
+ register,
210
+ logout,
211
+ refreshSessionAndReplay,
212
+ fetchUser,
213
+ checkAuth,
214
+ setUser,
215
+ hasStoredToken
216
+ };
217
+ const baseStore = {
218
+ // State (as computed refs for readonly exposure)
219
+ user: computed(() => user.value),
220
+ isAuthenticated: computed(() => isAuthenticated.value && token.value !== null),
221
+ loading: computed(() => loading.value),
222
+ // Getters
223
+ ...baseGetters,
224
+ // Actions
225
+ ...baseActions
226
+ };
227
+ const extensionContext = {
228
+ state: baseState,
229
+ getters: baseGetters,
230
+ actions: baseActions,
231
+ services: {
232
+ authService,
233
+ apiService,
234
+ tokenStorage,
235
+ router
236
+ },
237
+ config: {
238
+ storeId,
239
+ defaultLoginRedirect
240
+ },
241
+ resolveSafeRedirectPath
242
+ };
243
+ const extension = extend?.(extensionContext);
244
+ if (extension) {
245
+ for (const key of Object.keys(extension)) {
246
+ if (key in baseStore) {
247
+ throw new Error(`Auth store extension key "${key}" conflicts with the shared auth store surface.`);
248
+ }
249
+ }
250
+ }
251
+ if (extension) {
252
+ return {
253
+ ...baseStore,
254
+ ...extension
255
+ };
256
+ }
257
+ return {
258
+ ...baseStore
259
+ };
260
+ }, storeOptions);
261
+ }
262
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/stores/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Core type definitions for SocialKit API services.
3
+ *
4
+ * These types are generic and shared across all SocialKit-powered frontends.
5
+ */
6
+ /** Standard API response wrapper. */
7
+ export interface ApiResponse<T> {
8
+ data: T;
9
+ meta?: {
10
+ current_page?: number;
11
+ total?: number;
12
+ per_page?: number;
13
+ last_page?: number;
14
+ next_cursor?: string;
15
+ prev_cursor?: string;
16
+ has_more?: boolean;
17
+ };
18
+ message?: string;
19
+ status?: number;
20
+ }
21
+ /** Paginated response shape. */
22
+ export interface PaginatedResponse<T> {
23
+ items: T[];
24
+ total: number;
25
+ per_page: number;
26
+ current_page: number;
27
+ last_page: number;
28
+ next_cursor?: string;
29
+ prev_cursor?: string;
30
+ }
31
+ /** API error shape. */
32
+ export interface ApiError {
33
+ message: string;
34
+ code?: string;
35
+ status?: number;
36
+ details?: Record<string, unknown>;
37
+ }
38
+ /** Upload progress event. */
39
+ export interface UploadProgressEvent {
40
+ loaded: number;
41
+ total?: number;
42
+ progress?: number;
43
+ }
44
+ /** Request configuration accepted by ApiService methods. */
45
+ export interface RequestConfig {
46
+ headers?: Record<string, string>;
47
+ params?: Record<string, string | number | boolean>;
48
+ timeout?: number;
49
+ onUploadProgress?: (progressEvent: UploadProgressEvent) => void;
50
+ signal?: AbortSignal;
51
+ }
52
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/types/api.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,qCAAqC;AACrC,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,IAAI,EAAE,CAAC,CAAA;IACP,IAAI,CAAC,EAAE;QACL,YAAY,CAAC,EAAE,MAAM,CAAA;QACrB,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,QAAQ,CAAC,EAAE,OAAO,CAAA;KACnB,CAAA;IACD,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,gCAAgC;AAChC,MAAM,WAAW,iBAAiB,CAAC,CAAC;IAClC,KAAK,EAAE,CAAC,EAAE,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,uBAAuB;AACvB,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAClC;AAED,6BAA6B;AAC7B,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,4DAA4D;AAC5D,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAA;IAClD,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,gBAAgB,CAAC,EAAE,CAAC,aAAa,EAAE,mBAAmB,KAAK,IAAI,CAAA;IAC/D,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Core type definitions for SocialKit API services.
3
+ *
4
+ * These types are generic and shared across all SocialKit-powered frontends.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/types/api.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * User type definitions shared across SocialKit frontends.
3
+ */
4
+ /** Base user type used by the auth system. */
5
+ export interface User {
6
+ id: string;
7
+ name: string;
8
+ email: string;
9
+ avatar?: string | Record<string, unknown> | null;
10
+ avatar_url?: string | null;
11
+ cover_photo?: string | null;
12
+ handle?: string;
13
+ role: 'admin' | 'moderator' | 'user';
14
+ tenant_id?: string;
15
+ roles?: string[];
16
+ permissions?: string[];
17
+ capabilities?: Record<string, boolean>;
18
+ last_login_at?: string;
19
+ created_at?: string;
20
+ status?: 'active' | 'suspended' | 'banned';
21
+ model_type?: string;
22
+ }
23
+ /** Identity user type from the identity service. */
24
+ export interface IdentityUser {
25
+ id: string;
26
+ handle?: string;
27
+ name: string;
28
+ avatar?: string | null;
29
+ avatar_url?: string | null;
30
+ cover_photo?: string | null;
31
+ bio?: string | null;
32
+ email?: string;
33
+ created_at?: string;
34
+ updated_at?: string;
35
+ }
36
+ /** Type guard for User. */
37
+ export declare function isUser(obj: unknown): obj is User;
38
+ /** Type guard for IdentityUser. */
39
+ export declare function isIdentityUser(obj: unknown): obj is IdentityUser;
40
+ /** Convert an IdentityUser to the base User type. */
41
+ export declare function identityUserToUser(identity: IdentityUser, role?: 'admin' | 'moderator' | 'user'): User;
42
+ //# sourceMappingURL=user.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../src/types/user.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,8CAA8C;AAC9C,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;IAChD,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,OAAO,GAAG,WAAW,GAAG,MAAM,CAAA;IACpC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACtC,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,MAAM,CAAC,EAAE,QAAQ,GAAG,WAAW,GAAG,QAAQ,CAAA;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,oDAAoD;AACpD,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,2BAA2B;AAC3B,wBAAgB,MAAM,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,IAAI,CAShD;AAED,mCAAmC;AACnC,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,YAAY,CAOhE;AAED,qDAAqD;AACrD,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,YAAY,EACtB,IAAI,GAAE,OAAO,GAAG,WAAW,GAAG,MAAe,GAC5C,IAAI,CA6BN"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * User type definitions shared across SocialKit frontends.
3
+ */
4
+ /** Type guard for User. */
5
+ export function isUser(obj) {
6
+ return (obj !== null &&
7
+ typeof obj === 'object' &&
8
+ 'id' in obj &&
9
+ 'name' in obj &&
10
+ 'email' in obj &&
11
+ 'role' in obj);
12
+ }
13
+ /** Type guard for IdentityUser. */
14
+ export function isIdentityUser(obj) {
15
+ return (obj !== null &&
16
+ typeof obj === 'object' &&
17
+ 'id' in obj &&
18
+ 'name' in obj);
19
+ }
20
+ /** Convert an IdentityUser to the base User type. */
21
+ export function identityUserToUser(identity, role = 'user') {
22
+ const user = {
23
+ id: identity.id,
24
+ name: identity.name,
25
+ email: identity.email ?? '',
26
+ role
27
+ };
28
+ if (identity.avatar !== null && identity.avatar !== undefined) {
29
+ user.avatar = identity.avatar;
30
+ }
31
+ if (identity.avatar_url !== null && identity.avatar_url !== undefined) {
32
+ user.avatar_url = identity.avatar_url;
33
+ }
34
+ if (identity.cover_photo !== null && identity.cover_photo !== undefined) {
35
+ user.cover_photo = identity.cover_photo;
36
+ }
37
+ if (identity.handle !== undefined) {
38
+ user.handle = identity.handle;
39
+ }
40
+ if (identity.created_at !== undefined) {
41
+ user.created_at = identity.created_at;
42
+ }
43
+ return user;
44
+ }
45
+ //# sourceMappingURL=user.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user.js","sourceRoot":"","sources":["../../src/types/user.ts"],"names":[],"mappings":"AAAA;;GAEG;AAoCH,2BAA2B;AAC3B,MAAM,UAAU,MAAM,CAAC,GAAY;IACjC,OAAO,CACL,GAAG,KAAK,IAAI;QACZ,OAAO,GAAG,KAAK,QAAQ;QACvB,IAAI,IAAI,GAAG;QACX,MAAM,IAAI,GAAG;QACb,OAAO,IAAI,GAAG;QACd,MAAM,IAAI,GAAG,CACd,CAAA;AACH,CAAC;AAED,mCAAmC;AACnC,MAAM,UAAU,cAAc,CAAC,GAAY;IACzC,OAAO,CACL,GAAG,KAAK,IAAI;QACZ,OAAO,GAAG,KAAK,QAAQ;QACvB,IAAI,IAAI,GAAG;QACX,MAAM,IAAI,GAAG,CACd,CAAA;AACH,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,kBAAkB,CAChC,QAAsB,EACtB,OAAuC,MAAM;IAE7C,MAAM,IAAI,GAAS;QACjB,EAAE,EAAE,QAAQ,CAAC,EAAE;QACf,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,KAAK,EAAE,QAAQ,CAAC,KAAK,IAAI,EAAE;QAC3B,IAAI;KACL,CAAA;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,IAAI,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC9D,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAA;IAC/B,CAAC;IAED,IAAI,QAAQ,CAAC,UAAU,KAAK,IAAI,IAAI,QAAQ,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACtE,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAA;IACvC,CAAC;IAED,IAAI,QAAQ,CAAC,WAAW,KAAK,IAAI,IAAI,QAAQ,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QACxE,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAA;IACzC,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAClC,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAA;IAC/B,CAAC;IAED,IAAI,QAAQ,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACtC,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAA;IACvC,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Token storage utility for SocialKit-powered frontends.
3
+ *
4
+ * Tokens are cached in memory and persisted to a configurable browser storage
5
+ * backend. Use `createTokenStorage()` to get a configured instance.
6
+ */
7
+ /** Configuration for creating a token storage instance. */
8
+ export interface TokenStorageConfig {
9
+ /** Storage key for the token (default: 'auth_token'). */
10
+ storageKey?: string;
11
+ /** API base URL used by the refresh client (default: '/api'). */
12
+ apiBaseUrl?: string;
13
+ /** Endpoints to call when refreshing a token (default: ['/v1/auth/refresh-token']). */
14
+ refreshEndpoints?: string[];
15
+ /** Endpoints where the Authorization header should NOT be sent. */
16
+ anonymousEndpoints?: string[];
17
+ /** When true, persist in localStorage and share across tabs; otherwise sessionStorage. */
18
+ shareSessions?: boolean;
19
+ }
20
+ /** Public token storage interface. */
21
+ export interface TokenStorage {
22
+ getToken(): string | null;
23
+ setToken(token: string): void;
24
+ removeToken(): void;
25
+ hasToken(): boolean;
26
+ shouldSkipAuth(url: string | undefined): boolean;
27
+ isRefreshTokenEndpoint(url: string | undefined): boolean;
28
+ tryRefreshToken(): Promise<string | null>;
29
+ wasTokenRotatedSince(requestAuthHeaderOrHeaders: unknown): boolean;
30
+ }
31
+ /**
32
+ * Extract a token string from various API response shapes.
33
+ *
34
+ * Handles:
35
+ * - `{ token: string }`
36
+ * - `{ data: { token: string } }`
37
+ */
38
+ export declare function extractTokenFromResponse(payload: unknown): string | undefined;
39
+ /** Create a configured token storage instance. */
40
+ export declare function createTokenStorage(config?: TokenStorageConfig): TokenStorage;
41
+ //# sourceMappingURL=tokenStorage.d.ts.map