@quvel-kit/core 1.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 +670 -0
- package/dist/auth/boot/defineAuthGuard.d.ts +54 -0
- package/dist/auth/boot/defineAuthGuard.d.ts.map +1 -0
- package/dist/auth/boot/defineAuthGuard.js +72 -0
- package/dist/auth/enums/AuthStatusEnum.d.ts +13 -0
- package/dist/auth/enums/AuthStatusEnum.d.ts.map +1 -0
- package/dist/auth/enums/AuthStatusEnum.js +13 -0
- package/dist/auth/index.d.ts +13 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +13 -0
- package/dist/auth/services/AuthGuard.d.ts +58 -0
- package/dist/auth/services/AuthGuard.d.ts.map +1 -0
- package/dist/auth/services/AuthGuard.js +51 -0
- package/dist/auth/services/AuthService.d.ts +52 -0
- package/dist/auth/services/AuthService.d.ts.map +1 -0
- package/dist/auth/services/AuthService.js +67 -0
- package/dist/auth/services/PasswordResetService.d.ts +34 -0
- package/dist/auth/services/PasswordResetService.d.ts.map +1 -0
- package/dist/auth/services/PasswordResetService.js +45 -0
- package/dist/auth/services/TwoFactorChallengeService.d.ts +22 -0
- package/dist/auth/services/TwoFactorChallengeService.d.ts.map +1 -0
- package/dist/auth/services/TwoFactorChallengeService.js +29 -0
- package/dist/auth/services/TwoFactorService.d.ts +64 -0
- package/dist/auth/services/TwoFactorService.d.ts.map +1 -0
- package/dist/auth/services/TwoFactorService.js +68 -0
- package/dist/auth/services/index.d.ts +8 -0
- package/dist/auth/services/index.d.ts.map +1 -0
- package/dist/auth/services/index.js +5 -0
- package/dist/auth/types/auth-meta.d.ts +54 -0
- package/dist/auth/types/auth-meta.d.ts.map +1 -0
- package/dist/auth/types/auth-meta.js +6 -0
- package/dist/auth/types/index.d.ts +5 -0
- package/dist/auth/types/index.d.ts.map +1 -0
- package/dist/auth/types/index.js +4 -0
- package/dist/auth/utils/auth-meta.d.ts +75 -0
- package/dist/auth/utils/auth-meta.d.ts.map +1 -0
- package/dist/auth/utils/auth-meta.js +93 -0
- package/dist/boot/quvel.d.ts +26 -0
- package/dist/boot/quvel.d.ts.map +1 -0
- package/dist/boot/quvel.js +38 -0
- package/dist/build/index.d.ts +9 -0
- package/dist/build/index.d.ts.map +1 -0
- package/dist/build/index.js +8 -0
- package/dist/build/loadEnv.d.ts +14 -0
- package/dist/build/loadEnv.d.ts.map +1 -0
- package/dist/build/loadEnv.js +33 -0
- package/dist/build/quasarConfig.d.ts +67 -0
- package/dist/build/quasarConfig.d.ts.map +1 -0
- package/dist/build/quasarConfig.js +126 -0
- package/dist/components/Common/TaskErrors.vue +47 -0
- package/dist/components/Inputs/BaseInput.vue +88 -0
- package/dist/components/Misc/ClientOnly.vue +22 -0
- package/dist/components/Transitions/FadeInOut.vue +9 -0
- package/dist/components/Transitions/SlowExpand.vue +13 -0
- package/dist/components/WebSocketChannelManager.vue +634 -0
- package/dist/components/index.d.ts +12 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +16 -0
- package/dist/composables/index.d.ts +19 -0
- package/dist/composables/index.d.ts.map +1 -0
- package/dist/composables/index.js +16 -0
- package/dist/composables/useClient.d.ts +16 -0
- package/dist/composables/useClient.d.ts.map +1 -0
- package/dist/composables/useClient.js +28 -0
- package/dist/composables/useMetaConfig.d.ts +14 -0
- package/dist/composables/useMetaConfig.d.ts.map +1 -0
- package/dist/composables/useMetaConfig.js +77 -0
- package/dist/composables/useQueryMessageHandler.d.ts +44 -0
- package/dist/composables/useQueryMessageHandler.d.ts.map +1 -0
- package/dist/composables/useQueryMessageHandler.js +74 -0
- package/dist/composables/useQuvel.d.ts +15 -0
- package/dist/composables/useQuvel.d.ts.map +1 -0
- package/dist/composables/useQuvel.js +38 -0
- package/dist/composables/useRecaptcha.d.ts +35 -0
- package/dist/composables/useRecaptcha.d.ts.map +1 -0
- package/dist/composables/useRecaptcha.js +87 -0
- package/dist/composables/useScopedService.d.ts +18 -0
- package/dist/composables/useScopedService.d.ts.map +1 -0
- package/dist/composables/useScopedService.js +25 -0
- package/dist/composables/useScript.d.ts +25 -0
- package/dist/composables/useScript.d.ts.map +1 -0
- package/dist/composables/useScript.js +106 -0
- package/dist/composables/useUrlQueryHandler.d.ts +38 -0
- package/dist/composables/useUrlQueryHandler.d.ts.map +1 -0
- package/dist/composables/useUrlQueryHandler.js +76 -0
- package/dist/composables/useWebSockets.d.ts +18 -0
- package/dist/composables/useWebSockets.d.ts.map +1 -0
- package/dist/composables/useWebSockets.js +55 -0
- package/dist/composables/useWindowEvent.d.ts +16 -0
- package/dist/composables/useWindowEvent.d.ts.map +1 -0
- package/dist/composables/useWindowEvent.js +27 -0
- package/dist/composables/useXsrf.d.ts +29 -0
- package/dist/composables/useXsrf.d.ts.map +1 -0
- package/dist/composables/useXsrf.js +59 -0
- package/dist/config/QuasarConfigBuilder.d.ts +100 -0
- package/dist/config/QuasarConfigBuilder.d.ts.map +1 -0
- package/dist/config/QuasarConfigBuilder.js +98 -0
- package/dist/config/i18n.d.ts +23 -0
- package/dist/config/i18n.d.ts.map +1 -0
- package/dist/config/i18n.js +43 -0
- package/dist/config/index.d.ts +8 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +7 -0
- package/dist/config/moduleTransformer.d.ts +18 -0
- package/dist/config/moduleTransformer.d.ts.map +1 -0
- package/dist/config/moduleTransformer.js +76 -0
- package/dist/config/quvel.d.ts +40 -0
- package/dist/config/quvel.d.ts.map +1 -0
- package/dist/config/quvel.js +59 -0
- package/dist/config/quvel.types.d.ts +59 -0
- package/dist/config/quvel.types.d.ts.map +1 -0
- package/dist/config/quvel.types.js +6 -0
- package/dist/container/ServiceContainer.d.ts +107 -0
- package/dist/container/ServiceContainer.d.ts.map +1 -0
- package/dist/container/ServiceContainer.js +201 -0
- package/dist/container/types/vue.d.ts +9 -0
- package/dist/container/types.d.ts +81 -0
- package/dist/container/types.d.ts.map +1 -0
- package/dist/container/types.js +1 -0
- package/dist/i18n/en-US/common.d.ts +19 -0
- package/dist/i18n/en-US/common.d.ts.map +1 -0
- package/dist/i18n/en-US/common.js +17 -0
- package/dist/i18n/en-US/index.d.ts +21 -0
- package/dist/i18n/en-US/index.d.ts.map +1 -0
- package/dist/i18n/en-US/index.js +4 -0
- package/dist/i18n/es-MX/common.d.ts +19 -0
- package/dist/i18n/es-MX/common.d.ts.map +1 -0
- package/dist/i18n/es-MX/common.js +17 -0
- package/dist/i18n/es-MX/index.d.ts +21 -0
- package/dist/i18n/es-MX/index.d.ts.map +1 -0
- package/dist/i18n/es-MX/index.js +4 -0
- package/dist/index.d.ts +54 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +67 -0
- package/dist/models/User.d.ts +32 -0
- package/dist/models/User.d.ts.map +1 -0
- package/dist/models/User.js +48 -0
- package/dist/module.d.ts +21 -0
- package/dist/module.d.ts.map +1 -0
- package/dist/module.js +45 -0
- package/dist/modules/helpers.d.ts +30 -0
- package/dist/modules/helpers.d.ts.map +1 -0
- package/dist/modules/helpers.js +45 -0
- package/dist/modules/index.d.ts +8 -0
- package/dist/modules/index.d.ts.map +1 -0
- package/dist/modules/index.js +6 -0
- package/dist/modules/types.d.ts +141 -0
- package/dist/modules/types.d.ts.map +1 -0
- package/dist/modules/types.js +7 -0
- package/dist/pages/ErrorNotFound.vue +300 -0
- package/dist/pages/index.d.ts +7 -0
- package/dist/pages/index.d.ts.map +1 -0
- package/dist/pages/index.js +6 -0
- package/dist/services/ApiService.d.ts +90 -0
- package/dist/services/ApiService.d.ts.map +1 -0
- package/dist/services/ApiService.js +159 -0
- package/dist/services/I18nService.d.ts +67 -0
- package/dist/services/I18nService.d.ts.map +1 -0
- package/dist/services/I18nService.js +92 -0
- package/dist/services/LogService.d.ts +31 -0
- package/dist/services/LogService.d.ts.map +1 -0
- package/dist/services/LogService.js +49 -0
- package/dist/services/Service.d.ts +10 -0
- package/dist/services/Service.d.ts.map +1 -0
- package/dist/services/Service.js +8 -0
- package/dist/services/TaskService.d.ts +64 -0
- package/dist/services/TaskService.d.ts.map +1 -0
- package/dist/services/TaskService.js +188 -0
- package/dist/services/ThemeService.d.ts +28 -0
- package/dist/services/ThemeService.d.ts.map +1 -0
- package/dist/services/ThemeService.js +77 -0
- package/dist/services/ValidationService.d.ts +55 -0
- package/dist/services/ValidationService.d.ts.map +1 -0
- package/dist/services/ValidationService.js +81 -0
- package/dist/services/WebSocketService.d.ts +59 -0
- package/dist/services/WebSocketService.d.ts.map +1 -0
- package/dist/services/WebSocketService.js +148 -0
- package/dist/services/logger/BaseLogger.d.ts +35 -0
- package/dist/services/logger/BaseLogger.d.ts.map +1 -0
- package/dist/services/logger/BaseLogger.js +66 -0
- package/dist/services/logger/ConsoleLogger.d.ts +21 -0
- package/dist/services/logger/ConsoleLogger.d.ts.map +1 -0
- package/dist/services/logger/ConsoleLogger.js +60 -0
- package/dist/services/logger/NullLogger.d.ts +10 -0
- package/dist/services/logger/NullLogger.d.ts.map +1 -0
- package/dist/services/logger/NullLogger.js +10 -0
- package/dist/stores/plugins/serviceContainer.d.ts +10 -0
- package/dist/stores/plugins/serviceContainer.d.ts.map +1 -0
- package/dist/stores/plugins/serviceContainer.js +14 -0
- package/dist/stores/sessionStore.d.ts +71 -0
- package/dist/stores/sessionStore.d.ts.map +1 -0
- package/dist/stores/sessionStore.js +125 -0
- package/dist/types/app.types.d.ts +202 -0
- package/dist/types/app.types.d.ts.map +1 -0
- package/dist/types/app.types.js +6 -0
- package/dist/types/config.types.d.ts +2 -0
- package/dist/types/config.types.d.ts.map +1 -0
- package/dist/types/config.types.js +1 -0
- package/dist/types/global.d.ts +33 -0
- package/dist/types/i18n.types.d.ts +21 -0
- package/dist/types/i18n.types.d.ts.map +1 -0
- package/dist/types/i18n.types.js +6 -0
- package/dist/types/laravel.types.d.ts +167 -0
- package/dist/types/laravel.types.d.ts.map +1 -0
- package/dist/types/laravel.types.js +6 -0
- package/dist/types/logging.types.d.ts +81 -0
- package/dist/types/logging.types.d.ts.map +1 -0
- package/dist/types/logging.types.js +22 -0
- package/dist/types/pinia.d.ts +24 -0
- package/dist/types/scripts.types.d.ts +31 -0
- package/dist/types/scripts.types.d.ts.map +1 -0
- package/dist/types/scripts.types.js +6 -0
- package/dist/types/ssr.d.ts +11 -0
- package/dist/types/task.types.d.ts +121 -0
- package/dist/types/task.types.d.ts.map +1 -0
- package/dist/types/task.types.js +7 -0
- package/dist/types/theme.types.d.ts +13 -0
- package/dist/types/theme.types.d.ts.map +1 -0
- package/dist/types/theme.types.js +17 -0
- package/dist/types/user.types.d.ts +24 -0
- package/dist/types/user.types.d.ts.map +1 -0
- package/dist/types/user.types.js +1 -0
- package/dist/types/vue-shim.d.ts +11 -0
- package/dist/types/websocket.types.d.ts +62 -0
- package/dist/types/websocket.types.d.ts.map +1 -0
- package/dist/types/websocket.types.js +6 -0
- package/dist/utils/apiInterceptors.d.ts +76 -0
- package/dist/utils/apiInterceptors.d.ts.map +1 -0
- package/dist/utils/apiInterceptors.js +149 -0
- package/dist/utils/assets.d.ts +40 -0
- package/dist/utils/assets.d.ts.map +1 -0
- package/dist/utils/assets.js +340 -0
- package/dist/utils/axios.d.ts +19 -0
- package/dist/utils/axios.d.ts.map +1 -0
- package/dist/utils/axios.js +113 -0
- package/dist/utils/config.d.ts +16 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +48 -0
- package/dist/utils/container.d.ts +12 -0
- package/dist/utils/container.d.ts.map +1 -0
- package/dist/utils/container.js +11 -0
- package/dist/utils/deepMerge.d.ts +28 -0
- package/dist/utils/deepMerge.d.ts.map +1 -0
- package/dist/utils/deepMerge.js +59 -0
- package/dist/utils/envConfig.d.ts +73 -0
- package/dist/utils/envConfig.d.ts.map +1 -0
- package/dist/utils/envConfig.js +161 -0
- package/dist/utils/error.d.ts +44 -0
- package/dist/utils/error.d.ts.map +1 -0
- package/dist/utils/error.js +67 -0
- package/dist/utils/headers.d.ts +36 -0
- package/dist/utils/headers.d.ts.map +1 -0
- package/dist/utils/headers.js +54 -0
- package/dist/utils/i18n.d.ts +26 -0
- package/dist/utils/i18n.d.ts.map +1 -0
- package/dist/utils/i18n.js +56 -0
- package/dist/utils/index.d.ts +14 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +13 -0
- package/dist/utils/loading.d.ts +29 -0
- package/dist/utils/loading.d.ts.map +1 -0
- package/dist/utils/loading.js +46 -0
- package/dist/utils/logging.d.ts +20 -0
- package/dist/utils/logging.d.ts.map +1 -0
- package/dist/utils/logging.js +54 -0
- package/dist/utils/notify.d.ts +15 -0
- package/dist/utils/notify.d.ts.map +1 -0
- package/dist/utils/notify.js +30 -0
- package/dist/utils/object.d.ts +28 -0
- package/dist/utils/object.d.ts.map +1 -0
- package/dist/utils/object.js +48 -0
- package/dist/utils/pagination.d.ts +60 -0
- package/dist/utils/pagination.d.ts.map +1 -0
- package/dist/utils/pagination.js +252 -0
- package/dist/utils/paths.d.ts +54 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +48 -0
- package/dist/utils/platform.d.ts +25 -0
- package/dist/utils/platform.d.ts.map +1 -0
- package/dist/utils/platform.js +64 -0
- package/dist/utils/scripts.d.ts +20 -0
- package/dist/utils/scripts.d.ts.map +1 -0
- package/dist/utils/scripts.js +39 -0
- package/global.d.ts +29 -0
- package/package.json +119 -0
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import * as z from 'zod/v4';
|
|
2
|
+
import { Service } from './Service.js';
|
|
3
|
+
/**
|
|
4
|
+
* Default locale mapping for validation
|
|
5
|
+
* Maps common locale codes to Zod v4 locale codes
|
|
6
|
+
*/
|
|
7
|
+
export const DEFAULT_LOCALE_MAPPING = {
|
|
8
|
+
'en': 'en',
|
|
9
|
+
'en-US': 'en',
|
|
10
|
+
'en-GB': 'en',
|
|
11
|
+
'es': 'es',
|
|
12
|
+
'es-MX': 'es',
|
|
13
|
+
'es-ES': 'es',
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Validation Service with Zod v4 locale integration
|
|
17
|
+
*/
|
|
18
|
+
export class ValidationService extends Service {
|
|
19
|
+
static localeMapping = DEFAULT_LOCALE_MAPPING;
|
|
20
|
+
i18n;
|
|
21
|
+
currentLocale = 'en';
|
|
22
|
+
/**
|
|
23
|
+
* Set custom locale mapping for validation
|
|
24
|
+
* Optional - uses DEFAULT_LOCALE_MAPPING if not called
|
|
25
|
+
*
|
|
26
|
+
* @param mapping - Locale mapping (e.g., { 'en-US': 'en', 'es-MX': 'es' })
|
|
27
|
+
*/
|
|
28
|
+
static setLocaleMapping(mapping) {
|
|
29
|
+
ValidationService.localeMapping = mapping;
|
|
30
|
+
}
|
|
31
|
+
constructor(config, ssrContext) {
|
|
32
|
+
super(config, ssrContext);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Register with container - inject dependencies and set initial locale
|
|
36
|
+
*/
|
|
37
|
+
register({ i18n }) {
|
|
38
|
+
this.i18n = i18n;
|
|
39
|
+
this.setLocale(this.i18n.locale);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Set Zod validation locale based on language code
|
|
43
|
+
* Uses the locale mapping configured via setLocaleMapping()
|
|
44
|
+
*/
|
|
45
|
+
setLocale(locale) {
|
|
46
|
+
const localeMap = ValidationService.localeMapping;
|
|
47
|
+
const zodLocale = localeMap[locale] || 'en';
|
|
48
|
+
if (zodLocale !== this.currentLocale) {
|
|
49
|
+
this.currentLocale = zodLocale;
|
|
50
|
+
const localeConfig = z.locales[zodLocale];
|
|
51
|
+
if (localeConfig && typeof localeConfig === 'function') {
|
|
52
|
+
z.config(localeConfig());
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
z.config(z.locales.en());
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
validate(value, schema, firstOnly) {
|
|
60
|
+
this.setLocale(this.i18n.locale);
|
|
61
|
+
const result = schema.safeParse(value);
|
|
62
|
+
if (result.success) {
|
|
63
|
+
return firstOnly ? true : [];
|
|
64
|
+
}
|
|
65
|
+
if (firstOnly) {
|
|
66
|
+
const firstIssue = result.error.issues[0];
|
|
67
|
+
return firstIssue?.message || 'Invalid input';
|
|
68
|
+
}
|
|
69
|
+
return result.error.issues.map((issue) => issue.message);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Creates a Quasar-compatible validation rule that stops at the first error
|
|
73
|
+
* This is the recommended way to create validation rules for QInput
|
|
74
|
+
*
|
|
75
|
+
* @param schema - The Zod schema
|
|
76
|
+
* @returns A Quasar validation rule function
|
|
77
|
+
*/
|
|
78
|
+
createInputRule(schema) {
|
|
79
|
+
return (value) => this.validate(value, schema, true);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebSocket Service
|
|
3
|
+
*
|
|
4
|
+
* Service for managing Laravel Echo WebSocket connections with Pusher
|
|
5
|
+
*/
|
|
6
|
+
import type Echo from 'laravel-echo';
|
|
7
|
+
import type { QSsrContext } from '@quasar/app-vite';
|
|
8
|
+
import type { ServiceContainer } from '../container/ServiceContainer.js';
|
|
9
|
+
import type { RegisterService } from '../container/types.js';
|
|
10
|
+
import type { EncryptedChannelType, PresenceChannelType, PrivateChannelType, PublicChannelType, SubscribeOptions } from '../types/websocket.types.js';
|
|
11
|
+
import { Service } from './Service.js';
|
|
12
|
+
import { AppConfig } from "../types/app.types";
|
|
13
|
+
/**
|
|
14
|
+
* WebSocket Service for Laravel Echo connections
|
|
15
|
+
*
|
|
16
|
+
* Manages WebSocket connections using Laravel Echo and Pusher
|
|
17
|
+
*/
|
|
18
|
+
export declare class WebSocketService extends Service implements RegisterService {
|
|
19
|
+
#private;
|
|
20
|
+
private api;
|
|
21
|
+
private connectionPromise;
|
|
22
|
+
private isConnected;
|
|
23
|
+
private apiKey;
|
|
24
|
+
private cluster;
|
|
25
|
+
private readonly isSsr;
|
|
26
|
+
constructor(config: AppConfig, ssrContext?: QSsrContext | null);
|
|
27
|
+
/**
|
|
28
|
+
* Get the Echo instance
|
|
29
|
+
*/
|
|
30
|
+
get echo(): Echo<'pusher'> | null;
|
|
31
|
+
/**
|
|
32
|
+
* Register with container - inject dependencies and get config
|
|
33
|
+
*/
|
|
34
|
+
register({ api, config }: ServiceContainer): void;
|
|
35
|
+
/**
|
|
36
|
+
* Connect to WebSocket server
|
|
37
|
+
*/
|
|
38
|
+
connect(): Promise<void>;
|
|
39
|
+
/**
|
|
40
|
+
* Unified subscription method for all channel types
|
|
41
|
+
*/
|
|
42
|
+
subscribe<T = unknown>(options: SubscribeOptions<T> & {
|
|
43
|
+
type: 'public' | 'publicNotification';
|
|
44
|
+
}): Promise<PublicChannelType>;
|
|
45
|
+
subscribe<T = unknown>(options: SubscribeOptions<T> & {
|
|
46
|
+
type: 'private' | 'privateNotification';
|
|
47
|
+
}): Promise<PrivateChannelType>;
|
|
48
|
+
subscribe<T = unknown>(options: SubscribeOptions<T> & {
|
|
49
|
+
type: 'presence';
|
|
50
|
+
}): Promise<PresenceChannelType>;
|
|
51
|
+
subscribe<T = unknown>(options: SubscribeOptions<T> & {
|
|
52
|
+
type: 'encrypted';
|
|
53
|
+
}): Promise<EncryptedChannelType>;
|
|
54
|
+
/**
|
|
55
|
+
* Disconnect from the WebSocket server
|
|
56
|
+
*/
|
|
57
|
+
disconnect(): void;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=WebSocketService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WebSocketService.d.ts","sourceRoot":"","sources":["../../src/services/WebSocketService.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,IAAI,MAAM,cAAc,CAAC;AACrC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EACV,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EACjB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,OAAO,EAAC,SAAS,EAAC,MAAM,oBAAoB,CAAC;AAE7C;;;;GAIG;AACH,qBAAa,gBAAiB,SAAQ,OAAQ,YAAW,eAAe;;IAEtE,OAAO,CAAC,GAAG,CAAc;IACzB,OAAO,CAAC,iBAAiB,CAA8B;IACvD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA0C;gBAEpD,MAAM,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE,WAAW,GAAG,IAAI;IAI9D;;OAEG;IACH,IAAI,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAEhC;IAED;;OAEG;IACH,QAAQ,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,gBAAgB,GAAG,IAAI;IASjD;;OAEG;IACH,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAwDxB;;OAEG;IACG,SAAS,CAAC,CAAC,GAAG,OAAO,EACzB,OAAO,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG;QAAE,IAAI,EAAE,QAAQ,GAAG,oBAAoB,CAAA;KAAE,GACvE,OAAO,CAAC,iBAAiB,CAAC;IACvB,SAAS,CAAC,CAAC,GAAG,OAAO,EACzB,OAAO,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG;QAAE,IAAI,EAAE,SAAS,GAAG,qBAAqB,CAAA;KAAE,GACzE,OAAO,CAAC,kBAAkB,CAAC;IACxB,SAAS,CAAC,CAAC,GAAG,OAAO,EACzB,OAAO,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG;QAAE,IAAI,EAAE,UAAU,CAAA;KAAE,GAClD,OAAO,CAAC,mBAAmB,CAAC;IACzB,SAAS,CAAC,CAAC,GAAG,OAAO,EACzB,OAAO,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG;QAAE,IAAI,EAAE,WAAW,CAAA;KAAE,GACnD,OAAO,CAAC,oBAAoB,CAAC;IAuEhC;;OAEG;IACH,UAAU,IAAI,IAAI;CAMnB"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebSocket Service
|
|
3
|
+
*
|
|
4
|
+
* Service for managing Laravel Echo WebSocket connections with Pusher
|
|
5
|
+
*/
|
|
6
|
+
import { Service } from './Service.js';
|
|
7
|
+
/**
|
|
8
|
+
* WebSocket Service for Laravel Echo connections
|
|
9
|
+
*
|
|
10
|
+
* Manages WebSocket connections using Laravel Echo and Pusher
|
|
11
|
+
*/
|
|
12
|
+
export class WebSocketService extends Service {
|
|
13
|
+
#echo = null;
|
|
14
|
+
api;
|
|
15
|
+
connectionPromise = null;
|
|
16
|
+
isConnected = false;
|
|
17
|
+
apiKey = '';
|
|
18
|
+
cluster = '';
|
|
19
|
+
isSsr = typeof window === 'undefined';
|
|
20
|
+
constructor(config, ssrContext) {
|
|
21
|
+
super(config, ssrContext);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Get the Echo instance
|
|
25
|
+
*/
|
|
26
|
+
get echo() {
|
|
27
|
+
return this.#echo;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Register with container - inject dependencies and get config
|
|
31
|
+
*/
|
|
32
|
+
register({ api, config }) {
|
|
33
|
+
this.api = api;
|
|
34
|
+
const broadcasting = config?.broadcasting?.pusher;
|
|
35
|
+
this.apiKey = broadcasting?.key ?? import.meta.env.VITE_PUSHER_APP_KEY ?? '';
|
|
36
|
+
this.cluster = broadcasting?.options?.cluster ?? import.meta.env.VITE_PUSHER_APP_CLUSTER ?? '';
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Connect to WebSocket server
|
|
40
|
+
*/
|
|
41
|
+
connect() {
|
|
42
|
+
if (this.isConnected || this.isSsr)
|
|
43
|
+
return Promise.resolve();
|
|
44
|
+
if (this.connectionPromise)
|
|
45
|
+
return this.connectionPromise;
|
|
46
|
+
this.connectionPromise = new Promise((resolve, reject) => {
|
|
47
|
+
void Promise.all([import('pusher-js'), import('laravel-echo')]).then(([Pusher, EchoModule]) => {
|
|
48
|
+
const EchoConstructor = EchoModule.default;
|
|
49
|
+
if (!this.isSsr && !window.Pusher) {
|
|
50
|
+
window.Pusher = Pusher;
|
|
51
|
+
}
|
|
52
|
+
this.#echo = new EchoConstructor({
|
|
53
|
+
broadcaster: 'pusher',
|
|
54
|
+
key: this.apiKey,
|
|
55
|
+
cluster: this.cluster,
|
|
56
|
+
authorizer: (channel) => {
|
|
57
|
+
const apiService = this.api;
|
|
58
|
+
return {
|
|
59
|
+
authorize: async (socketId, callback) => {
|
|
60
|
+
try {
|
|
61
|
+
const data = await apiService.post('/broadcasting/auth', {
|
|
62
|
+
socket_id: socketId,
|
|
63
|
+
channel_name: channel.name,
|
|
64
|
+
});
|
|
65
|
+
return callback(false, data);
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return callback(true, null);
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
},
|
|
73
|
+
});
|
|
74
|
+
this.#echo.connector.pusher.connection.bind('connected', () => {
|
|
75
|
+
this.isConnected = true;
|
|
76
|
+
this.connectionPromise = null;
|
|
77
|
+
resolve();
|
|
78
|
+
});
|
|
79
|
+
this.#echo.connector.pusher.connection.bind('disconnected', () => {
|
|
80
|
+
this.isConnected = false;
|
|
81
|
+
this.connectionPromise = null;
|
|
82
|
+
});
|
|
83
|
+
this.#echo.connector.pusher.connection.bind('error', (err) => {
|
|
84
|
+
console.error('[WebSocket Error]', err);
|
|
85
|
+
reject(new Error('WebSocket connection error'));
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
return this.connectionPromise;
|
|
90
|
+
}
|
|
91
|
+
async subscribe(options) {
|
|
92
|
+
if (this.isSsr)
|
|
93
|
+
return false;
|
|
94
|
+
await this.connect();
|
|
95
|
+
if (!this.#echo)
|
|
96
|
+
return false;
|
|
97
|
+
const { channelName, type, event, callback, presenceHandlers } = options;
|
|
98
|
+
let channel;
|
|
99
|
+
switch (type) {
|
|
100
|
+
case 'public':
|
|
101
|
+
case 'publicNotification':
|
|
102
|
+
channel = this.#echo.channel(channelName);
|
|
103
|
+
break;
|
|
104
|
+
case 'private':
|
|
105
|
+
case 'privateNotification':
|
|
106
|
+
channel = this.#echo.private(channelName);
|
|
107
|
+
break;
|
|
108
|
+
case 'presence':
|
|
109
|
+
channel = this.#echo.join(channelName);
|
|
110
|
+
break;
|
|
111
|
+
case 'encrypted':
|
|
112
|
+
channel = this.#echo.encryptedPrivate(channelName);
|
|
113
|
+
break;
|
|
114
|
+
default:
|
|
115
|
+
throw new Error('Unknown channel type');
|
|
116
|
+
}
|
|
117
|
+
if (type.endsWith('Notification')) {
|
|
118
|
+
return channel.notification(callback);
|
|
119
|
+
}
|
|
120
|
+
if (event) {
|
|
121
|
+
channel.listen(event, callback);
|
|
122
|
+
}
|
|
123
|
+
if (type === 'presence' && presenceHandlers) {
|
|
124
|
+
if (presenceHandlers.onListening) {
|
|
125
|
+
channel.listen(presenceHandlers.onListening.event, presenceHandlers.onListening.callback);
|
|
126
|
+
}
|
|
127
|
+
if (presenceHandlers.onHere) {
|
|
128
|
+
channel.here((members) => presenceHandlers.onHere?.(members));
|
|
129
|
+
}
|
|
130
|
+
if (presenceHandlers.onJoining) {
|
|
131
|
+
channel.joining((member) => presenceHandlers.onJoining?.(member));
|
|
132
|
+
}
|
|
133
|
+
if (presenceHandlers.onLeaving) {
|
|
134
|
+
channel.leaving((member) => presenceHandlers.onLeaving?.(member));
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return channel;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Disconnect from the WebSocket server
|
|
141
|
+
*/
|
|
142
|
+
disconnect() {
|
|
143
|
+
this.#echo?.disconnect();
|
|
144
|
+
this.#echo = null;
|
|
145
|
+
this.connectionPromise = null;
|
|
146
|
+
this.isConnected = false;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { LogLevel } from '../../types/logging.types.js';
|
|
2
|
+
import type { LoggerInterface, TraceInfo } from '../../types/logging.types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Abstract base logger class
|
|
5
|
+
* Provides common functionality for all logger implementations
|
|
6
|
+
*/
|
|
7
|
+
export declare abstract class BaseLogger implements LoggerInterface {
|
|
8
|
+
protected readonly traceInfo: TraceInfo;
|
|
9
|
+
constructor(traceInfo: TraceInfo);
|
|
10
|
+
/**
|
|
11
|
+
* Gets the current trace info
|
|
12
|
+
*/
|
|
13
|
+
getTraceInfo(): TraceInfo;
|
|
14
|
+
/**
|
|
15
|
+
* Format a log message with trace context
|
|
16
|
+
*/
|
|
17
|
+
protected formatMessage(level: LogLevel, message: string, context?: Record<string, unknown>): string;
|
|
18
|
+
/**
|
|
19
|
+
* Abstract method for logging - must be implemented by subclasses
|
|
20
|
+
*/
|
|
21
|
+
protected abstract writeLog(level: LogLevel, message: string, context?: Record<string, unknown>): void;
|
|
22
|
+
emergency(message: string, context?: Record<string, unknown>): void;
|
|
23
|
+
alert(message: string, context?: Record<string, unknown>): void;
|
|
24
|
+
critical(message: string, context?: Record<string, unknown>): void;
|
|
25
|
+
error(message: string, context?: Record<string, unknown>): void;
|
|
26
|
+
warning(message: string, context?: Record<string, unknown>): void;
|
|
27
|
+
notice(message: string, context?: Record<string, unknown>): void;
|
|
28
|
+
info(message: string, context?: Record<string, unknown>): void;
|
|
29
|
+
debug(message: string, context?: Record<string, unknown>): void;
|
|
30
|
+
/**
|
|
31
|
+
* Logs with an arbitrary level
|
|
32
|
+
*/
|
|
33
|
+
log(level: string, message: string, context?: Record<string, unknown>): void;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=BaseLogger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BaseLogger.d.ts","sourceRoot":"","sources":["../../../src/services/logger/BaseLogger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAE/E;;;GAGG;AACH,8BAAsB,UAAW,YAAW,eAAe;IAC7C,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS;gBAApB,SAAS,EAAE,SAAS;IAEnD;;OAEG;IACH,YAAY,IAAI,SAAS;IAIzB;;OAEG;IACH,SAAS,CAAC,aAAa,CACrB,KAAK,EAAE,QAAQ,EACf,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,MAAM;IAiBT;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAEtG,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAInE,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAI/D,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAIlE,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAI/D,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAIjE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAIhE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAI9D,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAI/D;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;CAK7E"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { LogLevel } from '../../types/logging.types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Abstract base logger class
|
|
4
|
+
* Provides common functionality for all logger implementations
|
|
5
|
+
*/
|
|
6
|
+
export class BaseLogger {
|
|
7
|
+
traceInfo;
|
|
8
|
+
constructor(traceInfo) {
|
|
9
|
+
this.traceInfo = traceInfo;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Gets the current trace info
|
|
13
|
+
*/
|
|
14
|
+
getTraceInfo() {
|
|
15
|
+
return this.traceInfo;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Format a log message with trace context
|
|
19
|
+
*/
|
|
20
|
+
formatMessage(level, message, context) {
|
|
21
|
+
const parts = [
|
|
22
|
+
`[${level.toUpperCase()}]`,
|
|
23
|
+
`[${this.traceInfo.timestamp}]`,
|
|
24
|
+
`[${this.traceInfo.runtime}]`,
|
|
25
|
+
this.traceInfo.id ? `[trace:${this.traceInfo.id}]` : null,
|
|
26
|
+
this.traceInfo.tenant !== 'unknown' ? `[tenant:${this.traceInfo.tenant}]` : null,
|
|
27
|
+
message,
|
|
28
|
+
].filter(Boolean);
|
|
29
|
+
if (context && Object.keys(context).length > 0) {
|
|
30
|
+
parts.push(JSON.stringify(context));
|
|
31
|
+
}
|
|
32
|
+
return parts.join(' ');
|
|
33
|
+
}
|
|
34
|
+
emergency(message, context) {
|
|
35
|
+
this.writeLog(LogLevel.EMERGENCY, message, context);
|
|
36
|
+
}
|
|
37
|
+
alert(message, context) {
|
|
38
|
+
this.writeLog(LogLevel.ALERT, message, context);
|
|
39
|
+
}
|
|
40
|
+
critical(message, context) {
|
|
41
|
+
this.writeLog(LogLevel.CRITICAL, message, context);
|
|
42
|
+
}
|
|
43
|
+
error(message, context) {
|
|
44
|
+
this.writeLog(LogLevel.ERROR, message, context);
|
|
45
|
+
}
|
|
46
|
+
warning(message, context) {
|
|
47
|
+
this.writeLog(LogLevel.WARNING, message, context);
|
|
48
|
+
}
|
|
49
|
+
notice(message, context) {
|
|
50
|
+
this.writeLog(LogLevel.NOTICE, message, context);
|
|
51
|
+
}
|
|
52
|
+
info(message, context) {
|
|
53
|
+
this.writeLog(LogLevel.INFO, message, context);
|
|
54
|
+
}
|
|
55
|
+
debug(message, context) {
|
|
56
|
+
this.writeLog(LogLevel.DEBUG, message, context);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Logs with an arbitrary level
|
|
60
|
+
*/
|
|
61
|
+
log(level, message, context) {
|
|
62
|
+
// Map string level to LogLevel enum
|
|
63
|
+
const logLevel = level.toLowerCase() || LogLevel.INFO;
|
|
64
|
+
this.writeLog(logLevel, message, context);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { LogLevel } from '../../types/logging.types.js';
|
|
2
|
+
import type { TraceInfo } from '../../types/logging.types.js';
|
|
3
|
+
import { BaseLogger } from './BaseLogger.js';
|
|
4
|
+
/**
|
|
5
|
+
* Console logger implementation
|
|
6
|
+
* Logs to the browser console with level filtering
|
|
7
|
+
*/
|
|
8
|
+
export declare class ConsoleLogger extends BaseLogger {
|
|
9
|
+
private readonly minLevel;
|
|
10
|
+
constructor(traceInfo: TraceInfo, minLevel?: LogLevel);
|
|
11
|
+
/**
|
|
12
|
+
* Check if a log level should be displayed
|
|
13
|
+
*/
|
|
14
|
+
private shouldLog;
|
|
15
|
+
/**
|
|
16
|
+
* Map log level to console method
|
|
17
|
+
*/
|
|
18
|
+
private getConsoleMethod;
|
|
19
|
+
protected writeLog(level: LogLevel, message: string, context?: Record<string, unknown>): void;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=ConsoleLogger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConsoleLogger.d.ts","sourceRoot":"","sources":["../../../src/services/logger/ConsoleLogger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACxD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAgB7C;;;GAGG;AACH,qBAAa,aAAc,SAAQ,UAAU;IAC3C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;gBAExB,SAAS,EAAE,SAAS,EAAE,QAAQ,GAAE,QAAwB;IAKpE;;OAEG;IACH,OAAO,CAAC,SAAS;IAIjB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAkBxB,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;CAS9F"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { LogLevel } from '../../types/logging.types.js';
|
|
2
|
+
import { BaseLogger } from './BaseLogger.js';
|
|
3
|
+
/**
|
|
4
|
+
* Log level priority mapping (higher number = higher priority)
|
|
5
|
+
*/
|
|
6
|
+
const LOG_LEVEL_PRIORITY = {
|
|
7
|
+
[LogLevel.EMERGENCY]: 8,
|
|
8
|
+
[LogLevel.ALERT]: 7,
|
|
9
|
+
[LogLevel.CRITICAL]: 6,
|
|
10
|
+
[LogLevel.ERROR]: 5,
|
|
11
|
+
[LogLevel.WARNING]: 4,
|
|
12
|
+
[LogLevel.NOTICE]: 3,
|
|
13
|
+
[LogLevel.INFO]: 2,
|
|
14
|
+
[LogLevel.DEBUG]: 1,
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Console logger implementation
|
|
18
|
+
* Logs to the browser console with level filtering
|
|
19
|
+
*/
|
|
20
|
+
export class ConsoleLogger extends BaseLogger {
|
|
21
|
+
minLevel;
|
|
22
|
+
constructor(traceInfo, minLevel = LogLevel.INFO) {
|
|
23
|
+
super(traceInfo);
|
|
24
|
+
this.minLevel = minLevel;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Check if a log level should be displayed
|
|
28
|
+
*/
|
|
29
|
+
shouldLog(level) {
|
|
30
|
+
return LOG_LEVEL_PRIORITY[level] >= LOG_LEVEL_PRIORITY[this.minLevel];
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Map log level to console method
|
|
34
|
+
*/
|
|
35
|
+
getConsoleMethod(level) {
|
|
36
|
+
switch (level) {
|
|
37
|
+
case LogLevel.EMERGENCY:
|
|
38
|
+
case LogLevel.ALERT:
|
|
39
|
+
case LogLevel.CRITICAL:
|
|
40
|
+
case LogLevel.ERROR:
|
|
41
|
+
return 'error';
|
|
42
|
+
case LogLevel.WARNING:
|
|
43
|
+
return 'warn';
|
|
44
|
+
case LogLevel.NOTICE:
|
|
45
|
+
case LogLevel.INFO:
|
|
46
|
+
return 'info';
|
|
47
|
+
case LogLevel.DEBUG:
|
|
48
|
+
default:
|
|
49
|
+
return 'log';
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
writeLog(level, message, context) {
|
|
53
|
+
if (!this.shouldLog(level)) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
const formatted = this.formatMessage(level, message, context);
|
|
57
|
+
const method = this.getConsoleMethod(level);
|
|
58
|
+
console[method](formatted);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { LogLevel } from '../../types/logging.types.js';
|
|
2
|
+
import { BaseLogger } from './BaseLogger.js';
|
|
3
|
+
/**
|
|
4
|
+
* Null logger implementation
|
|
5
|
+
* Does nothing - useful for disabling logs
|
|
6
|
+
*/
|
|
7
|
+
export declare class NullLogger extends BaseLogger {
|
|
8
|
+
protected writeLog(_level: LogLevel, _message: string, _context?: Record<string, unknown>): void;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=NullLogger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NullLogger.d.ts","sourceRoot":"","sources":["../../../src/services/logger/NullLogger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C;;;GAGG;AACH,qBAAa,UAAW,SAAQ,UAAU;IACxC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;CAGjG"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { PiniaPluginContext } from 'pinia';
|
|
2
|
+
import type { QSsrContext } from '@quasar/app-vite';
|
|
3
|
+
/**
|
|
4
|
+
* Pinia plugin to inject the Quvel service container into every store as `$quvel`.
|
|
5
|
+
* Handles SSR context or falls back to the client container.
|
|
6
|
+
*/
|
|
7
|
+
export declare function serviceContainerPlugin(context: PiniaPluginContext, ssrContext?: QSsrContext | null): {
|
|
8
|
+
$quvel: import("vue").Raw<import("../../index.js").ServiceContainer>;
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=serviceContainer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serviceContainer.d.ts","sourceRoot":"","sources":["../../../src/stores/plugins/serviceContainer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,OAAO,CAAC;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAIpD;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,kBAAkB,EAC3B,UAAU,CAAC,EAAE,WAAW,GAAG,IAAI;;EAUhC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { useQuvel } from '../../composables/useQuvel.js';
|
|
2
|
+
import { markRaw } from 'vue';
|
|
3
|
+
/**
|
|
4
|
+
* Pinia plugin to inject the Quvel service container into every store as `$quvel`.
|
|
5
|
+
* Handles SSR context or falls back to the client container.
|
|
6
|
+
*/
|
|
7
|
+
export function serviceContainerPlugin(context, ssrContext) {
|
|
8
|
+
// markRaw to prevent Vue from making it reactive
|
|
9
|
+
const rawContainer = markRaw(ssrContext?.$quvel ?? useQuvel());
|
|
10
|
+
context.store.$quvel = rawContainer;
|
|
11
|
+
return {
|
|
12
|
+
$quvel: rawContainer,
|
|
13
|
+
};
|
|
14
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import type { IUser } from '../types/user.types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Type for the authenticated user.
|
|
4
|
+
* Supports custom user models via generic type parameter.
|
|
5
|
+
*/
|
|
6
|
+
type StateUser<T extends IUser = IUser> = T | null;
|
|
7
|
+
/**
|
|
8
|
+
* Interface defining the structure of the session state.
|
|
9
|
+
*/
|
|
10
|
+
interface SessionState<T extends IUser = IUser> {
|
|
11
|
+
user: StateUser<T>;
|
|
12
|
+
initialized: boolean;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Interface defining getters for the session store.
|
|
16
|
+
*/
|
|
17
|
+
type SessionGetters<T extends IUser = IUser> = {
|
|
18
|
+
isAuthenticated: (state: SessionState<T>) => boolean;
|
|
19
|
+
isInitialized: (state: SessionState<T>) => boolean;
|
|
20
|
+
getUser: (state: SessionState<T>) => StateUser<T>;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Interface defining actions for the session store.
|
|
24
|
+
*/
|
|
25
|
+
interface SessionActions<T extends IUser = IUser> {
|
|
26
|
+
setSession(data: IUser): void;
|
|
27
|
+
clearSession(): void;
|
|
28
|
+
markInitialized(): void;
|
|
29
|
+
fetchSession(): Promise<void>;
|
|
30
|
+
getUserFactory(): (data: IUser) => T;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Pinia store for managing user session state.
|
|
34
|
+
*
|
|
35
|
+
* This is a generic session store that can be extended with auth-specific
|
|
36
|
+
* actions (login, signup, etc.) in your application.
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* ```typescript
|
|
40
|
+
* // Use in a component
|
|
41
|
+
* const session = useSessionStore();
|
|
42
|
+
*
|
|
43
|
+
* // Check auth status
|
|
44
|
+
* if (session.isAuthenticated) {
|
|
45
|
+
* console.log(session.user?.name);
|
|
46
|
+
* }
|
|
47
|
+
*
|
|
48
|
+
* // Set session (typically after login)
|
|
49
|
+
* session.setSession(userData);
|
|
50
|
+
*
|
|
51
|
+
* // Clear session (typically after logout)
|
|
52
|
+
* session.clearSession();
|
|
53
|
+
* ```
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* ```typescript
|
|
57
|
+
* // Extend with custom actions
|
|
58
|
+
* export const useAuthStore = defineStore('auth', {
|
|
59
|
+
* ...useSessionStore(),
|
|
60
|
+
* actions: {
|
|
61
|
+
* async login(email: string, password: string) {
|
|
62
|
+
* const response = await authService.login(email, password);
|
|
63
|
+
* this.setSession(response.user);
|
|
64
|
+
* }
|
|
65
|
+
* }
|
|
66
|
+
* });
|
|
67
|
+
* ```
|
|
68
|
+
*/
|
|
69
|
+
export declare const useSessionStore: import("pinia").StoreDefinition<"session", SessionState<IUser>, SessionGetters<IUser>, SessionActions<IUser>>;
|
|
70
|
+
export {};
|
|
71
|
+
//# sourceMappingURL=sessionStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionStore.d.ts","sourceRoot":"","sources":["../../src/stores/sessionStore.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAIpD;;;GAGG;AACH,KAAK,SAAS,CAAC,CAAC,SAAS,KAAK,GAAG,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC;AAEnD;;GAEG;AACH,UAAU,YAAY,CAAC,CAAC,SAAS,KAAK,GAAG,KAAK;IAC5C,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,KAAK,cAAc,CAAC,CAAC,SAAS,KAAK,GAAG,KAAK,IAAI;IAC7C,eAAe,EAAE,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC;IACrD,aAAa,EAAE,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC;IACnD,OAAO,EAAE,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC;CACnD,CAAC;AAEF;;GAEG;AACH,UAAU,cAAc,CAAC,CAAC,SAAS,KAAK,GAAG,KAAK;IAC9C,UAAU,CAAC,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC;IAC9B,YAAY,IAAI,IAAI,CAAC;IACrB,eAAe,IAAI,IAAI,CAAC;IACxB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,cAAc,IAAI,CAAC,IAAI,EAAE,KAAK,KAAK,CAAC,CAAC;CACtC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,eAAO,MAAM,eAAe,+GA+F1B,CAAC"}
|