@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,27 @@
1
+ /**
2
+ * Composable for common auth operations.
3
+ *
4
+ * This is a thin convenience wrapper that adds local loading/error state
5
+ * on top of an auth service instance.
6
+ */
7
+ import { type Ref, type ComputedRef } from 'vue';
8
+ import type { AuthServiceInstance, RegisterData, ResetPasswordData } from '../services/auth.js';
9
+ import type { User } from '../types/user.js';
10
+ export interface UseAuthReturn {
11
+ user: ComputedRef<User | null>;
12
+ loading: Ref<boolean>;
13
+ error: Ref<string | null>;
14
+ login(credential: string, password: string): Promise<unknown>;
15
+ register(data: RegisterData): Promise<unknown>;
16
+ logout(): Promise<void>;
17
+ forgotPassword(email: string): Promise<unknown>;
18
+ resetPassword(data: ResetPasswordData): Promise<unknown>;
19
+ }
20
+ /**
21
+ * Create the useAuth composable bound to a specific auth service and user ref.
22
+ *
23
+ * Call `makeUseAuth()` once during app bootstrap, then use the returned
24
+ * composable in your components.
25
+ */
26
+ export declare function makeUseAuth(authService: AuthServiceInstance, currentUser: Ref<User | null>): () => UseAuthReturn;
27
+ //# sourceMappingURL=useAuth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAuth.d.ts","sourceRoot":"","sources":["../../src/composables/useAuth.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAiB,KAAK,GAAG,EAAE,KAAK,WAAW,EAAE,MAAM,KAAK,CAAA;AAC/D,OAAO,KAAK,EAAE,mBAAmB,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAC/F,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AA0B5C,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,WAAW,CAAC,IAAI,GAAG,IAAI,CAAC,CAAA;IAC9B,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,CAAA;IACrB,KAAK,EAAE,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;IACzB,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAC7D,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAC9C,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACvB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAC/C,aAAa,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;CACzD;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CACzB,WAAW,EAAE,mBAAmB,EAChC,WAAW,EAAE,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,GAC5B,MAAM,aAAa,CA4GrB"}
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Composable for common auth operations.
3
+ *
4
+ * This is a thin convenience wrapper that adds local loading/error state
5
+ * on top of an auth service instance.
6
+ */
7
+ import { ref, computed } from 'vue';
8
+ function isAxiosError(error) {
9
+ return error !== null && typeof error === 'object' && 'response' in error;
10
+ }
11
+ function extractForgotPasswordValidationMessage(error) {
12
+ if (!isAxiosError(error) || error.response?.status !== 422) {
13
+ return null;
14
+ }
15
+ const emailErrors = error.response.data?.errors?.email;
16
+ const usernameErrors = error.response.data?.errors?.username;
17
+ const identifierErrors = error.response.data?.errors?.identifier;
18
+ return emailErrors?.[0] ?? usernameErrors?.[0] ?? identifierErrors?.[0] ?? null;
19
+ }
20
+ /**
21
+ * Create the useAuth composable bound to a specific auth service and user ref.
22
+ *
23
+ * Call `makeUseAuth()` once during app bootstrap, then use the returned
24
+ * composable in your components.
25
+ */
26
+ export function makeUseAuth(authService, currentUser) {
27
+ return function useAuth() {
28
+ const loading = ref(false);
29
+ const error = ref(null);
30
+ const user = computed(() => currentUser.value);
31
+ const login = async (credential, password) => {
32
+ loading.value = true;
33
+ error.value = null;
34
+ try {
35
+ const response = await authService.login(credential, password);
36
+ return response;
37
+ }
38
+ catch (err) {
39
+ if (isAxiosError(err)) {
40
+ error.value = err.response?.data?.message ?? 'Login failed';
41
+ }
42
+ else {
43
+ error.value = 'Login failed';
44
+ }
45
+ throw err;
46
+ }
47
+ finally {
48
+ loading.value = false;
49
+ }
50
+ };
51
+ const register = async (data) => {
52
+ loading.value = true;
53
+ error.value = null;
54
+ try {
55
+ const response = await authService.register(data);
56
+ return response;
57
+ }
58
+ catch (err) {
59
+ if (isAxiosError(err)) {
60
+ error.value = err.response?.data?.message ?? 'Registration failed';
61
+ }
62
+ else {
63
+ error.value = 'Registration failed';
64
+ }
65
+ throw err;
66
+ }
67
+ finally {
68
+ loading.value = false;
69
+ }
70
+ };
71
+ const logout = async () => {
72
+ loading.value = true;
73
+ try {
74
+ await authService.logout();
75
+ }
76
+ finally {
77
+ loading.value = false;
78
+ }
79
+ };
80
+ const forgotPassword = async (email) => {
81
+ loading.value = true;
82
+ error.value = null;
83
+ try {
84
+ const response = await authService.forgotPassword(email);
85
+ error.value = null;
86
+ return response;
87
+ }
88
+ catch (err) {
89
+ const validationMessage = extractForgotPasswordValidationMessage(err);
90
+ if (validationMessage !== null) {
91
+ error.value = validationMessage;
92
+ }
93
+ else if (isAxiosError(err)) {
94
+ error.value = err.response?.data?.message ?? 'Failed to send reset link';
95
+ }
96
+ else {
97
+ error.value = 'Failed to send reset link';
98
+ }
99
+ throw err;
100
+ }
101
+ finally {
102
+ loading.value = false;
103
+ }
104
+ };
105
+ const resetPassword = async (data) => {
106
+ loading.value = true;
107
+ error.value = null;
108
+ try {
109
+ const response = await authService.resetPassword(data);
110
+ return response;
111
+ }
112
+ catch (err) {
113
+ if (isAxiosError(err)) {
114
+ error.value = err.response?.data?.message ?? 'Password reset failed';
115
+ }
116
+ else {
117
+ error.value = 'Password reset failed';
118
+ }
119
+ throw err;
120
+ }
121
+ finally {
122
+ loading.value = false;
123
+ }
124
+ };
125
+ return {
126
+ user,
127
+ loading,
128
+ error,
129
+ login,
130
+ register,
131
+ logout,
132
+ forgotPassword,
133
+ resetPassword
134
+ };
135
+ };
136
+ }
137
+ //# sourceMappingURL=useAuth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAuth.js","sourceRoot":"","sources":["../../src/composables/useAuth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * @socialkit/vue — Shared Vue 3 utilities for SocialKit-powered frontends.
3
+ *
4
+ * This package provides configurable building blocks (token storage, API service,
5
+ * auth service, auth store, terminology plugin) that each site frontend
6
+ * instantiates with its own configuration.
7
+ */
8
+ export type { ApiResponse, PaginatedResponse, ApiError, UploadProgressEvent, RequestConfig } from './types/api.js';
9
+ export type { User, IdentityUser } from './types/user.js';
10
+ export { isUser, isIdentityUser, identityUserToUser } from './types/user.js';
11
+ export type { TokenStorageConfig, TokenStorage } from './utils/tokenStorage.js';
12
+ export { createTokenStorage, extractTokenFromResponse } from './utils/tokenStorage.js';
13
+ export type { ApiServiceConfig, ApiService } from './services/api.js';
14
+ export { createApiService } from './services/api.js';
15
+ export type { AuthServiceConfig, AuthServiceInstance, AuthenticatedLoginResponse, AuthenticatedRegisterResponse, AuthLoginResult, ConfiguredTokenAuthClient, ExtendedAuthServiceConfig, ExtendedAuthServiceInstance, RegisterData, RegisterResponse, ResetPasswordData, LoginResponse, TokenAuthClientConfig, TwoFactorChallengeResponse, VerificationRequiredRegisterResponse } from './services/auth.js';
16
+ export { configureTokenAuthClient, createAuthService, createExtendedAuthService } from './services/auth.js';
17
+ export type { AuthStoreConfig, AuthStoreActions, AuthStoreExtension, AuthStoreExtensionContext, AuthStoreGetters, AuthStoreStateRefs, AuthStoreReturn } from './stores/auth.js';
18
+ export { createAuthStoreDefinition } from './stores/auth.js';
19
+ export type { UseAuthReturn } from './composables/useAuth.js';
20
+ export { makeUseAuth } from './composables/useAuth.js';
21
+ export type { TermForms, TermsBundle, TerminologyOptions } from './plugins/terminology/types.js';
22
+ export type { TermOptions } from './plugins/terminology/terms.js';
23
+ export { makeTermHelpers } from './plugins/terminology/terms.js';
24
+ export { TerminologyPlugin, useTerms, getTermHelpers } from './plugins/terminology/index.js';
25
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,YAAY,EACV,WAAW,EACX,iBAAiB,EACjB,QAAQ,EACR,mBAAmB,EACnB,aAAa,EACd,MAAM,gBAAgB,CAAA;AAEvB,YAAY,EACV,IAAI,EACJ,YAAY,EACb,MAAM,iBAAiB,CAAA;AAExB,OAAO,EACL,MAAM,EACN,cAAc,EACd,kBAAkB,EACnB,MAAM,iBAAiB,CAAA;AAGxB,YAAY,EACV,kBAAkB,EAClB,YAAY,EACb,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACzB,MAAM,yBAAyB,CAAA;AAGhC,YAAY,EACV,gBAAgB,EAChB,UAAU,EACX,MAAM,mBAAmB,CAAA;AAE1B,OAAO,EACL,gBAAgB,EACjB,MAAM,mBAAmB,CAAA;AAG1B,YAAY,EACV,iBAAiB,EACjB,mBAAmB,EACnB,0BAA0B,EAC1B,6BAA6B,EAC7B,eAAe,EACf,yBAAyB,EACzB,yBAAyB,EACzB,2BAA2B,EAC3B,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EACb,qBAAqB,EACrB,0BAA0B,EAC1B,oCAAoC,EACrC,MAAM,oBAAoB,CAAA;AAE3B,OAAO,EACL,wBAAwB,EACxB,iBAAiB,EACjB,yBAAyB,EAC1B,MAAM,oBAAoB,CAAA;AAG3B,YAAY,EACV,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,yBAAyB,EACzB,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EAChB,MAAM,kBAAkB,CAAA;AAEzB,OAAO,EACL,yBAAyB,EAC1B,MAAM,kBAAkB,CAAA;AAGzB,YAAY,EACV,aAAa,EACd,MAAM,0BAA0B,CAAA;AAEjC,OAAO,EACL,WAAW,EACZ,MAAM,0BAA0B,CAAA;AAGjC,YAAY,EACV,SAAS,EACT,WAAW,EACX,kBAAkB,EACnB,MAAM,gCAAgC,CAAA;AAEvC,YAAY,EACV,WAAW,EACZ,MAAM,gCAAgC,CAAA;AAEvC,OAAO,EACL,eAAe,EAChB,MAAM,gCAAgC,CAAA;AAEvC,OAAO,EACL,iBAAiB,EACjB,QAAQ,EACR,cAAc,EACf,MAAM,gCAAgC,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,16 @@
1
+ /**
2
+ * @socialkit/vue — Shared Vue 3 utilities for SocialKit-powered frontends.
3
+ *
4
+ * This package provides configurable building blocks (token storage, API service,
5
+ * auth service, auth store, terminology plugin) that each site frontend
6
+ * instantiates with its own configuration.
7
+ */
8
+ export { isUser, isIdentityUser, identityUserToUser } from './types/user.js';
9
+ export { createTokenStorage, extractTokenFromResponse } from './utils/tokenStorage.js';
10
+ export { createApiService } from './services/api.js';
11
+ export { configureTokenAuthClient, createAuthService, createExtendedAuthService } from './services/auth.js';
12
+ export { createAuthStoreDefinition } from './stores/auth.js';
13
+ export { makeUseAuth } from './composables/useAuth.js';
14
+ export { makeTermHelpers } from './plugins/terminology/terms.js';
15
+ export { TerminologyPlugin, useTerms, getTermHelpers } from './plugins/terminology/index.js';
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAgBH,OAAO,EACL,MAAM,EACN,cAAc,EACd,kBAAkB,EACnB,MAAM,iBAAiB,CAAA;AAQxB,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACzB,MAAM,yBAAyB,CAAA;AAQhC,OAAO,EACL,gBAAgB,EACjB,MAAM,mBAAmB,CAAA;AAqB1B,OAAO,EACL,wBAAwB,EACxB,iBAAiB,EACjB,yBAAyB,EAC1B,MAAM,oBAAoB,CAAA;AAa3B,OAAO,EACL,yBAAyB,EAC1B,MAAM,kBAAkB,CAAA;AAOzB,OAAO,EACL,WAAW,EACZ,MAAM,0BAA0B,CAAA;AAajC,OAAO,EACL,eAAe,EAChB,MAAM,gCAAgC,CAAA;AAEvC,OAAO,EACL,iBAAiB,EACjB,QAAQ,EACR,cAAc,EACf,MAAM,gCAAgC,CAAA"}
@@ -0,0 +1,11 @@
1
+ import type { Plugin } from 'vue';
2
+ import { makeTermHelpers } from './terms.js';
3
+ export declare const TerminologyPlugin: Plugin;
4
+ /** Composition API helper to access terminology in setup(). */
5
+ export declare function useTerms(): {
6
+ term: ReturnType<typeof makeTermHelpers>['term'];
7
+ segment: ReturnType<typeof makeTermHelpers>['segment'];
8
+ };
9
+ /** Get term helpers outside of a Vue component context (e.g. router). */
10
+ export declare function getTermHelpers(): ReturnType<typeof makeTermHelpers>;
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/plugins/terminology/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAO,MAAM,EAAE,MAAM,KAAK,CAAA;AAEtC,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAiD5C,eAAO,MAAM,iBAAiB,EAAE,MAsC/B,CAAA;AAED,+DAA+D;AAC/D,wBAAgB,QAAQ,IAAI;IAC1B,IAAI,EAAE,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAA;IAChD,OAAO,EAAE,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC,SAAS,CAAC,CAAA;CACvD,CAUA;AAED,yEAAyE;AACzE,wBAAgB,cAAc,IAAI,UAAU,CAAC,OAAO,eAAe,CAAC,CAKnE"}
@@ -0,0 +1,91 @@
1
+ import { makeTermHelpers } from './terms.js';
2
+ import { inject, ref } from 'vue';
3
+ const termsBundle = {};
4
+ let termHelpers = null;
5
+ const termsVersion = ref(0);
6
+ function ensureTermHelpers() {
7
+ if (termHelpers !== null) {
8
+ return termHelpers;
9
+ }
10
+ termHelpers = makeTermHelpers(termsBundle);
11
+ return termHelpers;
12
+ }
13
+ function applyTermsBundle(bundle) {
14
+ const existingKeys = Object.keys(termsBundle);
15
+ for (const key of existingKeys) {
16
+ delete termsBundle[key];
17
+ }
18
+ Object.assign(termsBundle, bundle);
19
+ termHelpers = makeTermHelpers(termsBundle);
20
+ termsVersion.value += 1;
21
+ }
22
+ function touchTermsVersion() {
23
+ void termsVersion.value;
24
+ }
25
+ function installTerminologyProviders(app) {
26
+ const termProxy = (key, opts) => {
27
+ touchTermsVersion();
28
+ return ensureTermHelpers().term(key, opts);
29
+ };
30
+ const segmentProxy = (key) => {
31
+ touchTermsVersion();
32
+ return ensureTermHelpers().segment(key);
33
+ };
34
+ app.config.globalProperties.$term = termProxy;
35
+ app.config.globalProperties.$segment = segmentProxy;
36
+ app.provide('terms:term', termProxy);
37
+ app.provide('terms:segment', segmentProxy);
38
+ app.provide('terms:bundle', termsBundle);
39
+ }
40
+ export const TerminologyPlugin = {
41
+ async install(app, opts) {
42
+ const brand = opts?.brand ?? 'default';
43
+ const locale = opts?.locale ?? 'en';
44
+ let url = opts?.bundleUrl ?? `/brands/${brand}.${locale}.json`;
45
+ installTerminologyProviders(app);
46
+ const runtimeOrigin = typeof window !== 'undefined' ? window.location.origin : '';
47
+ const apiBase = (opts?.apiBaseUrl ?? runtimeOrigin).replace(/\/$/, '');
48
+ const canUseApiFallback = apiBase.length > 0 && url.startsWith('/');
49
+ try {
50
+ let response = await fetch(url, { cache: 'no-cache' });
51
+ if (canUseApiFallback && (!response.ok || response.headers.get('content-type')?.includes('text/html'))) {
52
+ // Fall back to the backend origin when the frontend dev server does not serve the brand bundle.
53
+ url = `${apiBase}${url}`;
54
+ response = await fetch(url, {
55
+ credentials: 'include',
56
+ headers: { Accept: 'application/json' }
57
+ });
58
+ }
59
+ if (!response.ok) {
60
+ throw new Error(`HTTP ${response.status}: Failed to load terminology bundle from ${url}`);
61
+ }
62
+ const contentType = response.headers.get('content-type');
63
+ if (!contentType?.includes('application/json')) {
64
+ throw new Error(`Invalid content-type: ${contentType ?? 'unknown'}. Expected JSON from ${url}`);
65
+ }
66
+ const data = await response.json();
67
+ applyTermsBundle(data.terms ?? data);
68
+ }
69
+ catch {
70
+ applyTermsBundle({});
71
+ }
72
+ }
73
+ };
74
+ /** Composition API helper to access terminology in setup(). */
75
+ export function useTerms() {
76
+ const term = inject('terms:term');
77
+ const segment = inject('terms:segment');
78
+ if (!term || !segment) {
79
+ const fallback = makeTermHelpers({});
80
+ return { term: fallback.term, segment: fallback.segment };
81
+ }
82
+ return { term, segment };
83
+ }
84
+ /** Get term helpers outside of a Vue component context (e.g. router). */
85
+ export function getTermHelpers() {
86
+ if (!termHelpers) {
87
+ return makeTermHelpers({});
88
+ }
89
+ return termHelpers;
90
+ }
91
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/plugins/terminology/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { TermsBundle } from './types.js';
2
+ type TermCase = 'title' | 'upper' | 'lower';
3
+ type TermForm = 'noun' | 'relation_noun' | 'verb' | 'verb_past' | 'verb_ing';
4
+ export interface TermOptions {
5
+ form?: TermForm;
6
+ count?: number;
7
+ ui?: string;
8
+ case?: TermCase;
9
+ }
10
+ export declare function makeTermHelpers(bundle: TermsBundle): {
11
+ term: (key: string, opts?: TermOptions) => string;
12
+ segment: (key: string) => string;
13
+ };
14
+ export {};
15
+ //# sourceMappingURL=terms.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terms.d.ts","sourceRoot":"","sources":["../../../src/plugins/terminology/terms.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAa,WAAW,EAAE,MAAM,YAAY,CAAA;AAExD,KAAK,QAAQ,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAA;AAC3C,KAAK,QAAQ,GAAG,MAAM,GAAG,eAAe,GAAG,MAAM,GAAG,WAAW,GAAG,UAAU,CAAA;AAG5E,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,QAAQ,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,IAAI,CAAC,EAAE,QAAQ,CAAA;CAChB;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,GAAG;IACpD,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,MAAM,CAAA;IACjD,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAA;CACjC,CAuFA"}
@@ -0,0 +1,72 @@
1
+ export function makeTermHelpers(bundle) {
2
+ const emptyNode = {};
3
+ const fallbackLabel = (key) => {
4
+ const lastSegment = key.split('.').pop();
5
+ return (lastSegment ?? key).replace(/[_-]/g, ' ');
6
+ };
7
+ const getNode = (key) => bundle[key] ?? emptyNode;
8
+ const plural = (one, other, count) => {
9
+ const fallback = one ?? other;
10
+ if (fallback === undefined) {
11
+ return undefined;
12
+ }
13
+ if (count == null) {
14
+ return fallback;
15
+ }
16
+ return count === 1 ? (one ?? fallback) : (other ?? fallback);
17
+ };
18
+ const applyCase = (value, casing) => {
19
+ if (!value) {
20
+ return value;
21
+ }
22
+ switch (casing) {
23
+ case 'upper':
24
+ return value.toUpperCase();
25
+ case 'lower':
26
+ return value.toLowerCase();
27
+ case 'title':
28
+ return value.replace(/\b\w/g, (match) => match.toUpperCase());
29
+ default:
30
+ return value;
31
+ }
32
+ };
33
+ const getFormValue = (node, form) => {
34
+ switch (form) {
35
+ case 'verb':
36
+ return node.verb;
37
+ case 'verb_past':
38
+ return node.verb_past;
39
+ case 'verb_ing':
40
+ return node.verb_ing;
41
+ default:
42
+ return undefined;
43
+ }
44
+ };
45
+ const term = (key, opts = {}) => {
46
+ const node = getNode(key);
47
+ if (opts.ui) {
48
+ return applyCase(node.ui?.[opts.ui] ?? fallbackLabel(key), opts.case);
49
+ }
50
+ const form = opts.form ?? 'noun';
51
+ if (form === 'noun') {
52
+ const out = plural(node.noun?.one, node.noun?.other, opts.count) ?? fallbackLabel(key);
53
+ return applyCase(out, opts.case);
54
+ }
55
+ if (form === 'relation_noun') {
56
+ const out = plural(node.relation_noun?.one, node.relation_noun?.other, opts.count) ?? fallbackLabel(key);
57
+ return applyCase(out, opts.case);
58
+ }
59
+ const raw = getFormValue(node, form) ?? fallbackLabel(key);
60
+ return applyCase(raw, opts.case);
61
+ };
62
+ const segment = (key) => {
63
+ const node = getNode(key);
64
+ if (node.url_segment) {
65
+ return node.url_segment;
66
+ }
67
+ const base = node.noun?.other ?? node.noun?.one ?? fallbackLabel(key);
68
+ return base.toLowerCase().replace(/\s+/g, '-');
69
+ };
70
+ return { term, segment };
71
+ }
72
+ //# sourceMappingURL=terms.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terms.js","sourceRoot":"","sources":["../../../src/plugins/terminology/terms.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ export interface TermForms {
2
+ noun?: {
3
+ one?: string;
4
+ other?: string;
5
+ };
6
+ relation_noun?: {
7
+ one?: string;
8
+ other?: string;
9
+ };
10
+ verb?: string;
11
+ verb_past?: string;
12
+ verb_ing?: string;
13
+ url_segment?: string;
14
+ ui?: Record<string, string>;
15
+ }
16
+ export type TermsBundle = Record<string, TermForms>;
17
+ export interface TerminologyOptions {
18
+ brand: string;
19
+ locale: string;
20
+ /** Override the bundle URL (default: `/brands/${brand}.${locale}.json`). */
21
+ bundleUrl?: string;
22
+ /** API base URL for fallback fetching in development. */
23
+ apiBaseUrl?: string;
24
+ onVersionMismatch?: (serverVersion: string) => void;
25
+ }
26
+ declare module 'vue' {
27
+ interface ComponentCustomProperties {
28
+ $term: (key: string, opts?: Record<string, unknown>) => string;
29
+ $segment: (key: string) => string;
30
+ }
31
+ }
32
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/plugins/terminology/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,IAAI,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IACvC,aAAa,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAChD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC5B;AAED,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;AAEnD,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,4EAA4E;IAC5E,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,yDAAyD;IACzD,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,iBAAiB,CAAC,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,IAAI,CAAA;CACpD;AAED,OAAO,QAAQ,KAAK,CAAC;IACnB,UAAU,yBAAyB;QACjC,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,CAAA;QAC9D,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAA;KAClC;CACF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/plugins/terminology/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Configurable API service for SocialKit-powered frontends.
3
+ */
4
+ import type { AxiosInstance, AxiosResponse } from 'axios';
5
+ import type { ApiResponse, RequestConfig } from '../types/api.js';
6
+ import type { TokenStorage } from '../utils/tokenStorage.js';
7
+ /** Configuration for creating an API service instance. */
8
+ export interface ApiServiceConfig {
9
+ /** Base URL for API requests (e.g. '/api' or 'https://api.example.com/api'). */
10
+ baseURL: string;
11
+ /** Token storage instance for auth headers and refresh logic. */
12
+ tokenStorage: TokenStorage;
13
+ /** Optional existing Axios client to configure instead of creating a new one. */
14
+ client?: AxiosInstance;
15
+ /** Request timeout in milliseconds (default: 30000). */
16
+ timeout?: number;
17
+ /** Paths that are considered auth pages and won't be redirected to (default: ['/login', '/register']). */
18
+ authPagePaths?: string[];
19
+ /** Path to redirect to when auth fails (default: '/login'). */
20
+ loginPath?: string;
21
+ /** Delay in ms before redirecting on auth failure (default: 1500). */
22
+ authFailureRedirectDelayMs?: number;
23
+ /** Optional error handler called on every response error. */
24
+ onResponseError?: (error: unknown) => void;
25
+ /** Optional callback invoked just before local auth state is cleared. */
26
+ onAuthInvalidated?: () => void;
27
+ /** Override the redirect target used when auth teardown occurs. */
28
+ buildLoginRedirectUrl?: () => string;
29
+ /** Max retries for transient 502/503/504 idempotent requests (default: 2). */
30
+ maxServerRetries?: number;
31
+ /** Base delay in ms for transient server retries (default: 500). */
32
+ serverRetryBaseDelayMs?: number;
33
+ }
34
+ /** Public API service interface. */
35
+ export interface ApiService {
36
+ get<T = unknown>(url: string, config?: RequestConfig): Promise<ApiResponse<T>>;
37
+ post<T = unknown>(url: string, data?: unknown, config?: RequestConfig): Promise<ApiResponse<T>>;
38
+ put<T = unknown>(url: string, data?: unknown, config?: RequestConfig): Promise<ApiResponse<T>>;
39
+ patch<T = unknown>(url: string, data?: unknown, config?: RequestConfig): Promise<ApiResponse<T>>;
40
+ delete<T = unknown>(url: string, config?: RequestConfig): Promise<ApiResponse<T>>;
41
+ postForm<T = unknown>(url: string, form: FormData, config?: RequestConfig): Promise<T>;
42
+ postFormRaw<T = unknown>(url: string, form: FormData, config?: RequestConfig): Promise<AxiosResponse<T>>;
43
+ markAuthRecoveryHandled(): void;
44
+ hasPendingAuthRequest(): boolean;
45
+ clearPendingAuthRequest(): void;
46
+ replayPendingAuthRequest(token: string): Promise<void>;
47
+ }
48
+ /** Create a configured API service instance. */
49
+ export declare function createApiService(config: ApiServiceConfig): ApiService;
50
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/services/api.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAsB,aAAa,EAAE,MAAM,OAAO,CAAA;AAC7E,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAE5D,0DAA0D;AAC1D,MAAM,WAAW,gBAAgB;IAC/B,gFAAgF;IAChF,OAAO,EAAE,MAAM,CAAA;IACf,iEAAiE;IACjE,YAAY,EAAE,YAAY,CAAA;IAC1B,iFAAiF;IACjF,MAAM,CAAC,EAAE,aAAa,CAAA;IACtB,wDAAwD;IACxD,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,0GAA0G;IAC1G,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;IACxB,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,sEAAsE;IACtE,0BAA0B,CAAC,EAAE,MAAM,CAAA;IACnC,6DAA6D;IAC7D,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;IAC1C,yEAAyE;IACzE,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAA;IAC9B,mEAAmE;IACnE,qBAAqB,CAAC,EAAE,MAAM,MAAM,CAAA;IACpC,8EAA8E;IAC9E,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,oEAAoE;IACpE,sBAAsB,CAAC,EAAE,MAAM,CAAA;CAChC;AAwID,oCAAoC;AACpC,MAAM,WAAW,UAAU;IACzB,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAA;IAC9E,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAA;IAC/F,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAA;IAC9F,KAAK,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAA;IAChG,MAAM,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAA;IACjF,QAAQ,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;IACtF,WAAW,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAA;IACxG,uBAAuB,IAAI,IAAI,CAAA;IAC/B,qBAAqB,IAAI,OAAO,CAAA;IAChC,uBAAuB,IAAI,IAAI,CAAA;IAC/B,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACvD;AAED,gDAAgD;AAChD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,UAAU,CA4RrE"}