@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,305 @@
1
+ /**
2
+ * Configurable API service for SocialKit-powered frontends.
3
+ */
4
+ import axios from 'axios';
5
+ function isRecord(value) {
6
+ return typeof value === 'object' && value !== null;
7
+ }
8
+ function isTransientServerError(status) {
9
+ return status === 502 || status === 503 || status === 504;
10
+ }
11
+ function isIdempotentMethod(method) {
12
+ const normalizedMethod = (method ?? 'get').toLowerCase();
13
+ return normalizedMethod === 'get' || normalizedMethod === 'head' || normalizedMethod === 'options';
14
+ }
15
+ function delay(ms) {
16
+ return new Promise((resolve) => { window.setTimeout(resolve, ms); });
17
+ }
18
+ function parseMissingPolicies(payload) {
19
+ if (!isRecord(payload)) {
20
+ return [];
21
+ }
22
+ const errors = payload.errors;
23
+ if (!isRecord(errors)) {
24
+ return [];
25
+ }
26
+ const missing = errors.missing;
27
+ if (!Array.isArray(missing)) {
28
+ return [];
29
+ }
30
+ const parsed = [];
31
+ for (const item of missing) {
32
+ if (!isRecord(item)) {
33
+ continue;
34
+ }
35
+ const policyId = item.policy_id;
36
+ const version = item.version;
37
+ if (typeof policyId !== 'string') {
38
+ continue;
39
+ }
40
+ const parsedVersion = typeof version === 'number'
41
+ ? version
42
+ : typeof version === 'string'
43
+ ? Number.parseInt(version, 10)
44
+ : Number.NaN;
45
+ if (!Number.isInteger(parsedVersion)) {
46
+ continue;
47
+ }
48
+ parsed.push({ policy_id: policyId, version: parsedVersion });
49
+ }
50
+ return parsed;
51
+ }
52
+ function isPoliciesPendingErrorPayload(payload) {
53
+ return isRecord(payload) && payload.code === 'POLICIES_PENDING';
54
+ }
55
+ function dedupeMissingPolicies(policies) {
56
+ const deduped = new Map();
57
+ for (const policy of policies) {
58
+ const existing = deduped.get(policy.policy_id);
59
+ if (!existing || policy.version > existing.version) {
60
+ deduped.set(policy.policy_id, policy);
61
+ }
62
+ }
63
+ return [...deduped.values()];
64
+ }
65
+ function cloneRequestConfig(config) {
66
+ return {
67
+ ...config,
68
+ headers: { ...config.headers }
69
+ };
70
+ }
71
+ function withAuthorizationHeader(config, token) {
72
+ return {
73
+ ...config,
74
+ headers: {
75
+ ...config.headers,
76
+ Authorization: `Bearer ${token}`
77
+ }
78
+ };
79
+ }
80
+ function createConfiguredClient(baseURL, timeout, client) {
81
+ if (client) {
82
+ client.defaults.baseURL = baseURL;
83
+ client.defaults.timeout = timeout;
84
+ client.defaults.headers.common.Accept = 'application/json';
85
+ client.defaults.headers.common['Content-Type'] = 'application/json';
86
+ client.defaults.withCredentials = false;
87
+ return client;
88
+ }
89
+ return axios.create({
90
+ baseURL,
91
+ timeout,
92
+ headers: {
93
+ 'Content-Type': 'application/json',
94
+ Accept: 'application/json'
95
+ },
96
+ withCredentials: false
97
+ });
98
+ }
99
+ /** Create a configured API service instance. */
100
+ export function createApiService(config) {
101
+ const { baseURL, tokenStorage, client, timeout = 30000, authPagePaths = ['/login', '/register'], loginPath = '/login', authFailureRedirectDelayMs = 1500, onResponseError, onAuthInvalidated, buildLoginRedirectUrl, maxServerRetries = 2, serverRetryBaseDelayMs = 500 } = config;
102
+ const clientInstance = createConfiguredClient(baseURL, timeout, client);
103
+ let pendingAuthRequests = [];
104
+ let authFailureRedirectTimeoutId = null;
105
+ let authFailureQueuedToken = null;
106
+ let policyAcceptancePromise = null;
107
+ function isPolicyAcceptRequest(url) {
108
+ return typeof url === 'string' && url.includes('/v1/policy/accept');
109
+ }
110
+ async function acceptMissingPolicies(missingPolicies) {
111
+ const policiesToAccept = dedupeMissingPolicies(missingPolicies);
112
+ if (policiesToAccept.length === 0) {
113
+ return false;
114
+ }
115
+ if (policyAcceptancePromise) {
116
+ return policyAcceptancePromise;
117
+ }
118
+ policyAcceptancePromise = (async () => {
119
+ try {
120
+ for (const policy of policiesToAccept) {
121
+ await clientInstance.post('/v1/policy/accept', {
122
+ policy_id: policy.policy_id,
123
+ version: policy.version
124
+ });
125
+ }
126
+ return true;
127
+ }
128
+ catch {
129
+ return false;
130
+ }
131
+ finally {
132
+ policyAcceptancePromise = null;
133
+ }
134
+ })();
135
+ return policyAcceptancePromise;
136
+ }
137
+ function capturePendingAuthRequest(reqConfig) {
138
+ pendingAuthRequests.push(cloneRequestConfig(reqConfig));
139
+ }
140
+ function cancelQueuedAuthFailureRedirect() {
141
+ if (authFailureRedirectTimeoutId === null) {
142
+ return;
143
+ }
144
+ window.clearTimeout(authFailureRedirectTimeoutId);
145
+ authFailureRedirectTimeoutId = null;
146
+ authFailureQueuedToken = null;
147
+ }
148
+ function queueAuthFailureRedirect() {
149
+ if (authFailureRedirectTimeoutId !== null) {
150
+ return;
151
+ }
152
+ authFailureQueuedToken = tokenStorage.getToken();
153
+ authFailureRedirectTimeoutId = window.setTimeout(() => {
154
+ authFailureRedirectTimeoutId = null;
155
+ const queuedToken = authFailureQueuedToken;
156
+ authFailureQueuedToken = null;
157
+ const currentToken = tokenStorage.getToken();
158
+ if (queuedToken !== null &&
159
+ currentToken !== null &&
160
+ currentToken !== queuedToken) {
161
+ return;
162
+ }
163
+ onAuthInvalidated?.();
164
+ tokenStorage.removeToken();
165
+ const currentPath = window.location.pathname;
166
+ if (authPagePaths.includes(currentPath)) {
167
+ return;
168
+ }
169
+ const redirectUrl = buildLoginRedirectUrl?.() ?? loginPath;
170
+ window.location.assign(redirectUrl);
171
+ }, authFailureRedirectDelayMs);
172
+ }
173
+ clientInstance.interceptors.request.use((reqConfig) => {
174
+ const token = tokenStorage.getToken();
175
+ if (token) {
176
+ reqConfig.headers.Authorization = `Bearer ${token}`;
177
+ }
178
+ const isFormData = typeof FormData !== 'undefined' && reqConfig.data instanceof FormData;
179
+ if (isFormData) {
180
+ delete reqConfig.headers['Content-Type'];
181
+ delete reqConfig.headers['content-type'];
182
+ reqConfig.transformRequest = [(data) => data];
183
+ }
184
+ return reqConfig;
185
+ }, (error) => Promise.reject(error));
186
+ clientInstance.interceptors.response.use((response) => response, async (error) => {
187
+ if (isTransientServerError(error.response?.status)) {
188
+ const originalRequest = error.config;
189
+ const retryCount = originalRequest?._serverRetryCount ?? 0;
190
+ if (originalRequest && retryCount < maxServerRetries && isIdempotentMethod(originalRequest.method)) {
191
+ originalRequest._serverRetryCount = retryCount + 1;
192
+ await delay(serverRetryBaseDelayMs * Math.pow(2, retryCount));
193
+ return clientInstance(originalRequest);
194
+ }
195
+ }
196
+ if (error.response?.status === 428) {
197
+ const originalRequest = error.config;
198
+ const requestUrl = originalRequest?.url;
199
+ const responsePayload = error.response?.data;
200
+ const missingPolicies = parseMissingPolicies(responsePayload);
201
+ const canAttemptPolicyAcceptance = Boolean(originalRequest &&
202
+ !originalRequest._policyRetry &&
203
+ !isPolicyAcceptRequest(requestUrl) &&
204
+ isPoliciesPendingErrorPayload(responsePayload) &&
205
+ missingPolicies.length > 0);
206
+ if (canAttemptPolicyAcceptance && originalRequest) {
207
+ originalRequest._policyRetry = true;
208
+ const accepted = await acceptMissingPolicies(missingPolicies);
209
+ if (accepted) {
210
+ return clientInstance(originalRequest);
211
+ }
212
+ }
213
+ }
214
+ if (error.response?.status === 401) {
215
+ const originalRequest = error.config;
216
+ const requestUrl = originalRequest?.url;
217
+ const canAttemptRefresh = Boolean(originalRequest &&
218
+ !originalRequest._retry &&
219
+ !tokenStorage.shouldSkipAuth(requestUrl) &&
220
+ !tokenStorage.isRefreshTokenEndpoint(requestUrl));
221
+ if (canAttemptRefresh && originalRequest) {
222
+ originalRequest._retry = true;
223
+ const refreshedToken = await tokenStorage.tryRefreshToken();
224
+ if (refreshedToken) {
225
+ const retryConfig = withAuthorizationHeader(originalRequest, refreshedToken);
226
+ cancelQueuedAuthFailureRedirect();
227
+ pendingAuthRequests = [];
228
+ return clientInstance(retryConfig);
229
+ }
230
+ }
231
+ if (tokenStorage.wasTokenRotatedSince(originalRequest?.headers)) {
232
+ onResponseError?.(error);
233
+ return Promise.reject(error);
234
+ }
235
+ const shouldCapturePendingRequest = Boolean(originalRequest &&
236
+ !tokenStorage.shouldSkipAuth(requestUrl) &&
237
+ !tokenStorage.isRefreshTokenEndpoint(requestUrl));
238
+ if (shouldCapturePendingRequest && originalRequest) {
239
+ capturePendingAuthRequest(originalRequest);
240
+ }
241
+ queueAuthFailureRedirect();
242
+ }
243
+ onResponseError?.(error);
244
+ return Promise.reject(error);
245
+ });
246
+ return {
247
+ async get(url, reqConfig) {
248
+ const response = await clientInstance.get(url, reqConfig);
249
+ return response.data;
250
+ },
251
+ async post(url, data, reqConfig) {
252
+ const response = await clientInstance.post(url, data, reqConfig);
253
+ return response.data;
254
+ },
255
+ async put(url, data, reqConfig) {
256
+ const response = await clientInstance.put(url, data, reqConfig);
257
+ return response.data;
258
+ },
259
+ async patch(url, data, reqConfig) {
260
+ const response = await clientInstance.patch(url, data, reqConfig);
261
+ return response.data;
262
+ },
263
+ async delete(url, reqConfig) {
264
+ const response = await clientInstance.delete(url, reqConfig);
265
+ return response.data;
266
+ },
267
+ async postForm(url, form, reqConfig) {
268
+ const response = await clientInstance.post(url, form, reqConfig);
269
+ return response.data;
270
+ },
271
+ async postFormRaw(url, form, reqConfig) {
272
+ const response = await clientInstance.post(url, form, reqConfig);
273
+ return response;
274
+ },
275
+ markAuthRecoveryHandled() {
276
+ cancelQueuedAuthFailureRedirect();
277
+ },
278
+ hasPendingAuthRequest() {
279
+ return pendingAuthRequests.length > 0;
280
+ },
281
+ clearPendingAuthRequest() {
282
+ pendingAuthRequests = [];
283
+ },
284
+ async replayPendingAuthRequest(token) {
285
+ if (pendingAuthRequests.length === 0) {
286
+ return;
287
+ }
288
+ cancelQueuedAuthFailureRedirect();
289
+ const requestsToReplay = pendingAuthRequests.map(cloneRequestConfig);
290
+ pendingAuthRequests = [];
291
+ const results = await Promise.allSettled(requestsToReplay.map((request) => {
292
+ const retryConfig = withAuthorizationHeader({
293
+ ...request,
294
+ _retry: true
295
+ }, token);
296
+ return clientInstance(retryConfig);
297
+ }));
298
+ const firstRejection = results.find((result) => result.status === 'rejected');
299
+ if (firstRejection) {
300
+ throw firstRejection.reason;
301
+ }
302
+ }
303
+ };
304
+ }
305
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/services/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,127 @@
1
+ /**
2
+ * Configurable auth services and Axios auth-client wiring for
3
+ * SocialKit-powered frontends.
4
+ */
5
+ import { type AxiosInstance } from 'axios';
6
+ import type { TokenStorage } from '../utils/tokenStorage.js';
7
+ import type { User } from '../types/user.js';
8
+ /** Configuration for creating an auth service. */
9
+ export interface AuthServiceConfig {
10
+ /** Base URL for API requests (e.g. '/api' or 'https://api.example.com/api'). */
11
+ baseURL: string;
12
+ /** Token storage instance for persisting auth tokens. */
13
+ tokenStorage: TokenStorage;
14
+ /** Request timeout in milliseconds (default: 30000). */
15
+ timeout?: number;
16
+ }
17
+ export interface ExtendedAuthServiceConfig extends AuthServiceConfig {
18
+ /** Optional existing Axios client to use instead of creating a dedicated one. */
19
+ client?: AxiosInstance;
20
+ /** Storage key for the client device identifier used by login/2FA endpoints. */
21
+ deviceIdStorageKey?: string;
22
+ /** Header name used for the device identifier (default: 'X-Device-Id'). */
23
+ deviceIdHeaderName?: string;
24
+ /** How forgot-password payloads should be derived from user input. */
25
+ forgotPasswordIdentifierStrategy?: 'email-only' | 'email-or-username';
26
+ }
27
+ /** Registration data shape. */
28
+ export interface RegisterData {
29
+ handle: string;
30
+ name: string;
31
+ email: string;
32
+ password: string;
33
+ password_confirmation: string;
34
+ }
35
+ /** Password reset data shape. */
36
+ export interface ResetPasswordData {
37
+ token: string;
38
+ email: string;
39
+ password: string;
40
+ password_confirmation: string;
41
+ }
42
+ /** Login response shape (user + optional token). */
43
+ export interface LoginResponse {
44
+ user: User;
45
+ token?: string;
46
+ }
47
+ export interface AuthenticatedLoginResponse extends LoginResponse {
48
+ requires_2fa?: false;
49
+ challenge_id?: never;
50
+ }
51
+ export interface TwoFactorChallengeResponse {
52
+ requires_2fa: true;
53
+ challenge_id: string;
54
+ }
55
+ export interface AuthenticatedRegisterResponse extends LoginResponse {
56
+ requires_verification: false;
57
+ }
58
+ export interface VerificationRequiredRegisterResponse {
59
+ requires_verification: true;
60
+ }
61
+ export type AuthLoginResult = AuthenticatedLoginResponse | TwoFactorChallengeResponse;
62
+ export type RegisterResponse = AuthenticatedRegisterResponse | VerificationRequiredRegisterResponse;
63
+ /** Public auth service interface. */
64
+ export interface AuthServiceInstance {
65
+ login(loginCredential: string, password: string, remember?: boolean): Promise<LoginResponse>;
66
+ register(data: RegisterData): Promise<LoginResponse>;
67
+ logout(): Promise<void>;
68
+ getUser(): Promise<User>;
69
+ forgotPassword(email: string): Promise<unknown>;
70
+ resetPassword(data: ResetPasswordData): Promise<unknown>;
71
+ hasToken(): boolean;
72
+ clearToken(): void;
73
+ }
74
+ export interface ExtendedAuthServiceInstance {
75
+ login(loginCredential: string, password: string, remember?: boolean): Promise<AuthLoginResult>;
76
+ register(data: RegisterData): Promise<RegisterResponse>;
77
+ verify2faChallenge(challengeId: string, code?: string, recoveryCode?: string, rememberDevice?: boolean, rememberSession?: boolean): Promise<AuthenticatedLoginResponse>;
78
+ logout(): Promise<void>;
79
+ getUser(): Promise<User>;
80
+ forgotPassword(identifier: string): Promise<unknown>;
81
+ resetPassword(data: ResetPasswordData): Promise<unknown>;
82
+ hasToken(): boolean;
83
+ clearToken(): void;
84
+ }
85
+ export interface TokenAuthClientConfig {
86
+ /** Existing Axios client to configure. Defaults to the shared axios export. */
87
+ client?: AxiosInstance;
88
+ /** Base URL for API requests. */
89
+ baseURL: string;
90
+ /** Token storage instance providing auth state and refresh behavior. */
91
+ tokenStorage: TokenStorage;
92
+ /** Request timeout in milliseconds (default: 30000). */
93
+ timeout?: number;
94
+ /** Delay before queued auth teardown/redirect executes (default: 1500). */
95
+ authFailureRedirectDelayMs?: number;
96
+ /** Paths considered auth pages; queued redirects will not re-target them. */
97
+ authPagePaths?: string[];
98
+ /** Build the redirect target when auth teardown occurs. */
99
+ buildLoginRedirectUrl?: () => string;
100
+ /** Called when auth teardown actually executes. */
101
+ onAuthInvalidated?: () => void;
102
+ /** Called for response errors that should surface globally. */
103
+ onResponseError?: (error: unknown) => void;
104
+ /** Suppress global error reporting for specific responses. */
105
+ shouldSuppressResponseError?: (error: unknown) => boolean;
106
+ }
107
+ export interface ConfiguredTokenAuthClient {
108
+ client: AxiosInstance;
109
+ setValidatingAuth(value: boolean): void;
110
+ }
111
+ /**
112
+ * Create a configured auth service instance.
113
+ *
114
+ * This is the conservative base service used by shared auth-store code.
115
+ */
116
+ export declare function createAuthService(config: AuthServiceConfig): AuthServiceInstance;
117
+ /**
118
+ * Create a richer auth workflow service for apps that use 2FA and device-id
119
+ * headers during login/verification flows.
120
+ */
121
+ export declare function createExtendedAuthService(config: ExtendedAuthServiceConfig): ExtendedAuthServiceInstance;
122
+ /**
123
+ * Configure a shared Axios client with generic token-auth request/response
124
+ * interceptors while preserving the raw Axios surface for host apps.
125
+ */
126
+ export declare function configureTokenAuthClient(config: TokenAuthClientConfig): ConfiguredTokenAuthClient;
127
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/services/auth.ts"],"names":[],"mappings":"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"}