@quazardous/qdadm 1.19.3
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/LICENSE +21 -0
- package/README.md +111 -0
- package/package.json +101 -0
- package/src/assets/logo.svg +6 -0
- package/src/auth/SessionAuthAdapter.ts +459 -0
- package/src/auth/index.ts +15 -0
- package/src/chain/ActiveStack.ts +154 -0
- package/src/chain/StackHydrator.ts +292 -0
- package/src/chain/index.ts +25 -0
- package/src/chain/useActiveStack.ts +120 -0
- package/src/chain/useStackHydrator.ts +155 -0
- package/src/components/BoolCell.vue +34 -0
- package/src/components/InfoBanner.vue +73 -0
- package/src/components/QdadmRoot.vue +52 -0
- package/src/components/SeverityTag.vue +86 -0
- package/src/components/dialogs/BulkStatusDialog.vue +60 -0
- package/src/components/dialogs/MultiStepDialog.vue +331 -0
- package/src/components/dialogs/SimpleDialog.vue +122 -0
- package/src/components/dialogs/UnsavedChangesDialog.vue +80 -0
- package/src/components/display/BannerZone.vue +65 -0
- package/src/components/display/CardsGrid.vue +72 -0
- package/src/components/display/CopyableId.vue +84 -0
- package/src/components/display/EmptyState.vue +62 -0
- package/src/components/display/IntensityBar.vue +190 -0
- package/src/components/display/RichCardsGrid.vue +101 -0
- package/src/components/edit/FormActions.vue +78 -0
- package/src/components/edit/FormField.vue +82 -0
- package/src/components/edit/FormInput.vue +158 -0
- package/src/components/edit/FormPage.vue +260 -0
- package/src/components/edit/FormTab.vue +217 -0
- package/src/components/edit/FormTabs.vue +120 -0
- package/src/components/edit/LookupField.vue +406 -0
- package/src/components/edit/LookupPickerDialog.vue +230 -0
- package/src/components/editors/JsonEditorFoldable.vue +470 -0
- package/src/components/editors/JsonStructuredField.vue +264 -0
- package/src/components/editors/JsonViewer.vue +51 -0
- package/src/components/editors/KeyValueEditor.vue +314 -0
- package/src/components/editors/LanguageEditor.vue +259 -0
- package/src/components/editors/PermissionEditor.vue +558 -0
- package/src/components/editors/ScopeEditor.vue +372 -0
- package/src/components/editors/VanillaJsonEditor.vue +183 -0
- package/src/components/index.ts +83 -0
- package/src/components/item/FieldGroups.vue +392 -0
- package/src/components/layout/AppLayout.vue +1032 -0
- package/src/components/layout/BaseLayout.vue +190 -0
- package/src/components/layout/Breadcrumb.vue +55 -0
- package/src/components/layout/DashboardLayout.vue +104 -0
- package/src/components/layout/FormLayout.vue +256 -0
- package/src/components/layout/ListLayout.vue +278 -0
- package/src/components/layout/PageHeader.vue +156 -0
- package/src/components/layout/PageLayout.vue +126 -0
- package/src/components/layout/PageNav.vue +192 -0
- package/src/components/layout/SidebarBox.vue +87 -0
- package/src/components/layout/Zone.vue +182 -0
- package/src/components/layout/defaults/DefaultBreadcrumb.vue +149 -0
- package/src/components/layout/defaults/DefaultFooter.vue +89 -0
- package/src/components/layout/defaults/DefaultFormActions.vue +67 -0
- package/src/components/layout/defaults/DefaultHeader.vue +78 -0
- package/src/components/layout/defaults/DefaultMenu.vue +188 -0
- package/src/components/layout/defaults/DefaultPagination.vue +75 -0
- package/src/components/layout/defaults/DefaultTable.vue +137 -0
- package/src/components/layout/defaults/DefaultUserInfo.vue +111 -0
- package/src/components/layout/defaults/index.ts +16 -0
- package/src/components/lists/ActionButtons.vue +49 -0
- package/src/components/lists/ActionColumn.vue +40 -0
- package/src/components/lists/FilterBar.vue +54 -0
- package/src/components/lists/ListPage.vue +467 -0
- package/src/components/pages/LoginPage.vue +334 -0
- package/src/components/pages/NotFoundPage.vue +98 -0
- package/src/components/show/ShowDisplay.vue +343 -0
- package/src/components/show/ShowField.vue +67 -0
- package/src/components/show/ShowPage.vue +431 -0
- package/src/composables/index.ts +155 -0
- package/src/composables/useApp.ts +67 -0
- package/src/composables/useAuth.ts +98 -0
- package/src/composables/useBareForm.ts +319 -0
- package/src/composables/useBreadcrumb.ts +252 -0
- package/src/composables/useChildPage.ts +113 -0
- package/src/composables/useCurrentEntity.ts +60 -0
- package/src/composables/useDeferred.ts +94 -0
- package/src/composables/useDirtyState.ts +138 -0
- package/src/composables/useEntityItemFormPage.ts +942 -0
- package/src/composables/useEntityItemFormPage.types.ts +451 -0
- package/src/composables/useEntityItemPage.ts +438 -0
- package/src/composables/useEntityItemShowPage.ts +722 -0
- package/src/composables/useFieldManager.ts +692 -0
- package/src/composables/useForm.ts +544 -0
- package/src/composables/useGuardStore.ts +53 -0
- package/src/composables/useHooks.ts +56 -0
- package/src/composables/useInfoBanner.ts +217 -0
- package/src/composables/useJsonSyntax.ts +122 -0
- package/src/composables/useLayoutResolver.ts +329 -0
- package/src/composables/useListPage.ts +1535 -0
- package/src/composables/useListPage.types.ts +437 -0
- package/src/composables/useListPage.utils.ts +101 -0
- package/src/composables/useNavContext.ts +439 -0
- package/src/composables/useNavigation.ts +216 -0
- package/src/composables/useOptionsLookup.ts +323 -0
- package/src/composables/usePageTitle.ts +84 -0
- package/src/composables/useSSEBridge.ts +142 -0
- package/src/composables/useSemanticBreadcrumb.ts +222 -0
- package/src/composables/useSidebarState.ts +24 -0
- package/src/composables/useSignals.ts +52 -0
- package/src/composables/useUnsavedChangesGuard.ts +155 -0
- package/src/composables/useUserImpersonator.ts +317 -0
- package/src/composables/useZoneRegistry.ts +252 -0
- package/src/core/bundles.ts +558 -0
- package/src/core/decorator.ts +420 -0
- package/src/core/extension.ts +470 -0
- package/src/core/index.ts +59 -0
- package/src/deferred/DeferredRegistry.ts +353 -0
- package/src/deferred/index.ts +15 -0
- package/src/editors/index.ts +12 -0
- package/src/entity/EntityManager.cache.ts +530 -0
- package/src/entity/EntityManager.crud.ts +615 -0
- package/src/entity/EntityManager.interface.ts +78 -0
- package/src/entity/EntityManager.query.ts +221 -0
- package/src/entity/EntityManager.relations.ts +151 -0
- package/src/entity/EntityManager.ts +944 -0
- package/src/entity/EntityManager.types.ts +288 -0
- package/src/entity/auth/CompositeAuthAdapter.ts +194 -0
- package/src/entity/auth/EntityAuthAdapter.ts +119 -0
- package/src/entity/auth/PermissiveAdapter.ts +43 -0
- package/src/entity/auth/RoleHierarchy.ts +128 -0
- package/src/entity/auth/SecurityChecker.ts +202 -0
- package/src/entity/auth/factory.ts +203 -0
- package/src/entity/auth/index.ts +47 -0
- package/src/entity/factory.test.js +189 -0
- package/src/entity/factory.ts +146 -0
- package/src/entity/index.ts +49 -0
- package/src/entity/storage/ApiStorage.ts +228 -0
- package/src/entity/storage/IStorage.ts +100 -0
- package/src/entity/storage/LocalStorage.ts +200 -0
- package/src/entity/storage/MemoryStorage.ts +184 -0
- package/src/entity/storage/MockApiStorage.ts +318 -0
- package/src/entity/storage/SdkStorage.ts +377 -0
- package/src/entity/storage/factory.test.js +159 -0
- package/src/entity/storage/factory.ts +209 -0
- package/src/entity/storage/index.ts +75 -0
- package/src/gen/FieldMapper.ts +122 -0
- package/src/gen/StorageProfileFactory.ts +93 -0
- package/src/gen/connectors/BaseConnector.ts +150 -0
- package/src/gen/connectors/ManualConnector.test.js +499 -0
- package/src/gen/connectors/ManualConnector.ts +414 -0
- package/src/gen/connectors/OpenAPIConnector.test.js +836 -0
- package/src/gen/connectors/OpenAPIConnector.ts +693 -0
- package/src/gen/connectors/__fixtures__/sample-openapi.json +311 -0
- package/src/gen/connectors/index.ts +27 -0
- package/src/gen/createManagers.ts +245 -0
- package/src/gen/decorators.ts +134 -0
- package/src/gen/generateManagers.test.js +540 -0
- package/src/gen/generateManagers.ts +398 -0
- package/src/gen/index.ts +66 -0
- package/src/gen/schema.ts +248 -0
- package/src/gen/vite-plugin.ts +114 -0
- package/src/generated/managers/testManager.js +45 -0
- package/src/generated/managers/testManager.ts +46 -0
- package/src/hooks/HookRegistry.ts +16 -0
- package/src/hooks/index.ts +15 -0
- package/src/i18n/I18n.ts +344 -0
- package/src/i18n/IncrementalDomainProvider.ts +153 -0
- package/src/i18n/InlineTranslationProvider.ts +4 -0
- package/src/i18n/LazyTranslationProvider.ts +102 -0
- package/src/i18n/MessagesRegistry.ts +4 -0
- package/src/i18n/Resolver.ts +4 -0
- package/src/i18n/__tests__/I18n.test.ts +169 -0
- package/src/i18n/__tests__/IncrementalDomainProvider.test.ts +146 -0
- package/src/i18n/__tests__/LazyTranslationProvider.test.ts +100 -0
- package/src/i18n/__tests__/Resolver.test.ts +271 -0
- package/src/i18n/defaults/DefaultCoreProvider.ts +28 -0
- package/src/i18n/defaults/core.en.yml +55 -0
- package/src/i18n/defaults/core.fr.yml +55 -0
- package/src/i18n/index.ts +55 -0
- package/src/i18n/loaders/raw-modules.d.ts +15 -0
- package/src/i18n/loaders/yaml.ts +35 -0
- package/src/i18n/strategies.ts +4 -0
- package/src/i18n/types.ts +34 -0
- package/src/i18n/useI18n.ts +34 -0
- package/src/index.ts +453 -0
- package/src/kernel/EventRouter.ts +23 -0
- package/src/kernel/Kernel.api.ts +79 -0
- package/src/kernel/Kernel.auth.ts +120 -0
- package/src/kernel/Kernel.i18n.ts +29 -0
- package/src/kernel/Kernel.modules.ts +170 -0
- package/src/kernel/Kernel.registries.ts +237 -0
- package/src/kernel/Kernel.routing.ts +334 -0
- package/src/kernel/Kernel.ts +460 -0
- package/src/kernel/Kernel.types.ts +263 -0
- package/src/kernel/Kernel.vue.ts +304 -0
- package/src/kernel/KernelContext.entities.ts +80 -0
- package/src/kernel/KernelContext.events.ts +57 -0
- package/src/kernel/KernelContext.i18n.ts +37 -0
- package/src/kernel/KernelContext.permissions.ts +38 -0
- package/src/kernel/KernelContext.routing.ts +280 -0
- package/src/kernel/KernelContext.ts +252 -0
- package/src/kernel/KernelContext.types.ts +173 -0
- package/src/kernel/KernelContext.zones.ts +54 -0
- package/src/kernel/Module.ts +169 -0
- package/src/kernel/ModuleLoader.ts +645 -0
- package/src/kernel/SSEBridge.ts +11 -0
- package/src/kernel/SignalBus.ts +48 -0
- package/src/kernel/index.ts +56 -0
- package/src/module/index.ts +33 -0
- package/src/module/moduleRegistry.ts +492 -0
- package/src/modules/debug/AuthCollector.ts +501 -0
- package/src/modules/debug/Collector.ts +20 -0
- package/src/modules/debug/DebugBridge.ts +14 -0
- package/src/modules/debug/DebugModule.ts +220 -0
- package/src/modules/debug/EntitiesCollector.ts +839 -0
- package/src/modules/debug/ErrorCollector.ts +4 -0
- package/src/modules/debug/I18nCollector.ts +9 -0
- package/src/modules/debug/LocalStorageAdapter.ts +7 -0
- package/src/modules/debug/RouterCollector.ts +449 -0
- package/src/modules/debug/SignalCollector.ts +4 -0
- package/src/modules/debug/ToastCollector.ts +4 -0
- package/src/modules/debug/ZonesCollector.ts +447 -0
- package/src/modules/debug/components/DebugBar.vue +31 -0
- package/src/modules/debug/components/adminPanelsConfig.ts +42 -0
- package/src/modules/debug/components/index.ts +9 -0
- package/src/modules/debug/components/panels/AuthPanel.vue +267 -0
- package/src/modules/debug/components/panels/EntitiesPanel.vue +572 -0
- package/src/modules/debug/components/panels/I18nPanel.vue +738 -0
- package/src/modules/debug/components/panels/RouterPanel.vue +440 -0
- package/src/modules/debug/components/panels/ZonesPanel.vue +133 -0
- package/src/modules/debug/components/panels/index.ts +16 -0
- package/src/modules/debug/index.ts +58 -0
- package/src/modules/debug/styles.scss +2671 -0
- package/src/notifications/NotificationBadge.vue +35 -0
- package/src/notifications/NotificationListener.vue +71 -0
- package/src/notifications/NotificationModule.ts +76 -0
- package/src/notifications/NotificationPanel.vue +478 -0
- package/src/notifications/NotificationStore.ts +288 -0
- package/src/notifications/index.ts +42 -0
- package/src/notifications/styles.scss +32 -0
- package/src/orchestrator/Orchestrator.ts +427 -0
- package/src/orchestrator/index.ts +8 -0
- package/src/orchestrator/useOrchestrator.ts +80 -0
- package/src/plugin.ts +251 -0
- package/src/query/FilterQuery.ts +306 -0
- package/src/query/QueryExecutor.ts +341 -0
- package/src/query/index.ts +16 -0
- package/src/security/EntityRolesProvider.ts +385 -0
- package/src/security/PermissionMatcher.ts +152 -0
- package/src/security/PermissionRegistry.ts +273 -0
- package/src/security/PersistableRolesProvider.ts +584 -0
- package/src/security/RolesManager.ts +136 -0
- package/src/security/RolesProvider.ts +167 -0
- package/src/security/RolesProviderStorage.ts +211 -0
- package/src/security/SecurityModule.ts +94 -0
- package/src/security/StaticRolesProvider.ts +117 -0
- package/src/security/UsersManager.ts +163 -0
- package/src/security/index.ts +77 -0
- package/src/security/pages/RoleForm.vue +276 -0
- package/src/security/pages/RoleList.vue +123 -0
- package/src/styles/_alerts.scss +95 -0
- package/src/styles/_buttons.scss +391 -0
- package/src/styles/_cards.scss +241 -0
- package/src/styles/_code.scss +78 -0
- package/src/styles/_dialogs.scss +55 -0
- package/src/styles/_filter-bar.scss +70 -0
- package/src/styles/_forms.scss +434 -0
- package/src/styles/_helpers.scss +153 -0
- package/src/styles/_lists.scss +225 -0
- package/src/styles/_main.scss +356 -0
- package/src/styles/_markdown.scss +88 -0
- package/src/styles/_responsive.scss +255 -0
- package/src/styles/_show-pages.scss +186 -0
- package/src/styles/_sidebar.scss +380 -0
- package/src/styles/_states.scss +115 -0
- package/src/styles/_stats.scss +47 -0
- package/src/styles/_variables.scss +224 -0
- package/src/styles/index.scss +38 -0
- package/src/styles/theme/_components.scss +331 -0
- package/src/styles/theme/_index.scss +10 -0
- package/src/styles/theme/_tokens.scss +147 -0
- package/src/styles/theme/_utilities.scss +175 -0
- package/src/toast/ToastBridgeModule.ts +68 -0
- package/src/toast/ToastListener.vue +55 -0
- package/src/toast/index.ts +26 -0
- package/src/toast/useSignalToast.ts +154 -0
- package/src/types/index.ts +285 -0
- package/src/types/pluralize.d.ts +19 -0
- package/src/types/quarkernel.d.ts +50 -0
- package/src/utils/formatters.ts +174 -0
- package/src/utils/index.ts +35 -0
- package/src/utils/transformers.ts +131 -0
- package/src/vite/qdadmDebugPlugin.ts +401 -0
- package/src/vite-env.d.ts +50 -0
- package/src/zones/ZoneRegistry.ts +934 -0
- package/src/zones/index.ts +29 -0
- package/src/zones/zones.ts +191 -0
package/src/index.ts
ADDED
|
@@ -0,0 +1,453 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* qdadm - Vue 3 Admin Dashboard Framework
|
|
3
|
+
*
|
|
4
|
+
* A framework for building admin dashboards with Vue 3, PrimeVue, and Vue Router.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
// Version (from package.json)
|
|
8
|
+
import pkg from '../package.json'
|
|
9
|
+
export const version: string = (pkg as { version: string }).version
|
|
10
|
+
|
|
11
|
+
// ════════════════════════════════════════════════════════════════════════════
|
|
12
|
+
// KERNEL (simplified bootstrap) - Module, Kernel, KernelContext, SignalBus, etc.
|
|
13
|
+
// ════════════════════════════════════════════════════════════════════════════
|
|
14
|
+
export { Kernel } from './kernel/Kernel'
|
|
15
|
+
export type {
|
|
16
|
+
AuthAdapter,
|
|
17
|
+
AppConfig,
|
|
18
|
+
Features,
|
|
19
|
+
Pages,
|
|
20
|
+
LayoutComponents,
|
|
21
|
+
PrimeVueConfig,
|
|
22
|
+
SecurityConfig,
|
|
23
|
+
SSEConfig,
|
|
24
|
+
DebugBarConfig,
|
|
25
|
+
NotificationsConfig,
|
|
26
|
+
HomeRoute,
|
|
27
|
+
KernelOptions,
|
|
28
|
+
} from './kernel/Kernel'
|
|
29
|
+
export { SignalBus, createSignalBus, SIGNALS, SIGNAL_ACTIONS, buildSignal } from './kernel/SignalBus'
|
|
30
|
+
export type { SignalBusOptions, SignalAction, EntitySignalPayload } from './kernel/SignalBus'
|
|
31
|
+
export { EventRouter, createEventRouter } from './kernel/EventRouter'
|
|
32
|
+
export type {
|
|
33
|
+
SignalTarget,
|
|
34
|
+
RouteContext,
|
|
35
|
+
RouteCallback,
|
|
36
|
+
RouteTarget,
|
|
37
|
+
RoutesConfig,
|
|
38
|
+
EventRouterOptions,
|
|
39
|
+
} from './kernel/EventRouter'
|
|
40
|
+
export { SSEBridge, createSSEBridge, SSE_SIGNALS } from './kernel/SSEBridge'
|
|
41
|
+
export type { SSEBridgeOptions } from './kernel/SSEBridge'
|
|
42
|
+
export { Module } from './kernel/Module'
|
|
43
|
+
export { KernelContext, createKernelContext } from './kernel/KernelContext'
|
|
44
|
+
export type {
|
|
45
|
+
NavItem,
|
|
46
|
+
ZoneOptions,
|
|
47
|
+
BlockConfig,
|
|
48
|
+
RouteOptions,
|
|
49
|
+
CrudPages,
|
|
50
|
+
CrudOptions,
|
|
51
|
+
ChildPageOptions,
|
|
52
|
+
UserEntityOptions,
|
|
53
|
+
PermissionMeta,
|
|
54
|
+
PermissionOptions,
|
|
55
|
+
} from './kernel/KernelContext'
|
|
56
|
+
export {
|
|
57
|
+
ModuleLoader,
|
|
58
|
+
createModuleLoader,
|
|
59
|
+
ModuleNotFoundError,
|
|
60
|
+
CircularDependencyError,
|
|
61
|
+
ModuleLoadError,
|
|
62
|
+
} from './kernel/ModuleLoader'
|
|
63
|
+
export type {
|
|
64
|
+
ModuleContext,
|
|
65
|
+
ModuleLike,
|
|
66
|
+
ObjectModuleDefinition,
|
|
67
|
+
ModuleClassConstructor,
|
|
68
|
+
LegacyInitApi,
|
|
69
|
+
LegacyInitFunction,
|
|
70
|
+
ModuleDefinition,
|
|
71
|
+
} from './kernel/ModuleLoader'
|
|
72
|
+
|
|
73
|
+
// ════════════════════════════════════════════════════════════════════════════
|
|
74
|
+
// PLUGIN (manual bootstrap)
|
|
75
|
+
// ════════════════════════════════════════════════════════════════════════════
|
|
76
|
+
export {
|
|
77
|
+
createQdadm,
|
|
78
|
+
type QdadmOptions,
|
|
79
|
+
type QdadmPlugin,
|
|
80
|
+
type ToastService,
|
|
81
|
+
type AuthAdapter as PluginAuthAdapter,
|
|
82
|
+
type AppConfig as PluginAppConfig,
|
|
83
|
+
type FeaturesConfig,
|
|
84
|
+
type ModulesConfig,
|
|
85
|
+
} from './plugin'
|
|
86
|
+
|
|
87
|
+
// ════════════════════════════════════════════════════════════════════════════
|
|
88
|
+
// ENTITY (EntityManager, storage adapters, auth adapters)
|
|
89
|
+
// ════════════════════════════════════════════════════════════════════════════
|
|
90
|
+
export {
|
|
91
|
+
EntityManager,
|
|
92
|
+
createEntityManager,
|
|
93
|
+
type EntityManagerOptions,
|
|
94
|
+
type EntityBadge,
|
|
95
|
+
type SeverityDescriptor,
|
|
96
|
+
type SeverityMapValue,
|
|
97
|
+
type SeverityMap,
|
|
98
|
+
type RoutingContext,
|
|
99
|
+
type PresaveContext,
|
|
100
|
+
type PostsaveContext,
|
|
101
|
+
type PredeleteContext,
|
|
102
|
+
type QueryOptions,
|
|
103
|
+
type WhitelistContext,
|
|
104
|
+
type CacheInfo,
|
|
105
|
+
} from './entity/EntityManager'
|
|
106
|
+
|
|
107
|
+
// Re-export core entity types
|
|
108
|
+
export type {
|
|
109
|
+
EntityRecord,
|
|
110
|
+
ListParams,
|
|
111
|
+
ListResult,
|
|
112
|
+
FieldConfig,
|
|
113
|
+
ChildConfig,
|
|
114
|
+
ParentConfig,
|
|
115
|
+
RelationConfig,
|
|
116
|
+
NavConfig,
|
|
117
|
+
StorageCapabilities,
|
|
118
|
+
} from './types'
|
|
119
|
+
|
|
120
|
+
// Manager Factory
|
|
121
|
+
export {
|
|
122
|
+
managerFactory,
|
|
123
|
+
defaultManagerResolver,
|
|
124
|
+
createManagerFactory,
|
|
125
|
+
createManagers,
|
|
126
|
+
type ManagerConfig,
|
|
127
|
+
type ManagerFactoryContext,
|
|
128
|
+
type ManagerResolver,
|
|
129
|
+
} from './entity/factory'
|
|
130
|
+
|
|
131
|
+
// Storage adapters
|
|
132
|
+
export * from './entity/storage/index'
|
|
133
|
+
|
|
134
|
+
// Entity auth adapters
|
|
135
|
+
export * from './entity/auth'
|
|
136
|
+
|
|
137
|
+
// ════════════════════════════════════════════════════════════════════════════
|
|
138
|
+
// SESSION AUTH (user authentication)
|
|
139
|
+
// ════════════════════════════════════════════════════════════════════════════
|
|
140
|
+
export { LocalStorageSessionAuthAdapter } from './auth'
|
|
141
|
+
export type {
|
|
142
|
+
LoginCredentials,
|
|
143
|
+
SessionData,
|
|
144
|
+
ISessionAuthAdapter,
|
|
145
|
+
AuthUser as SessionAuthUser,
|
|
146
|
+
} from './auth'
|
|
147
|
+
|
|
148
|
+
// ════════════════════════════════════════════════════════════════════════════
|
|
149
|
+
// ORCHESTRATOR
|
|
150
|
+
// ════════════════════════════════════════════════════════════════════════════
|
|
151
|
+
export * from './orchestrator/index'
|
|
152
|
+
|
|
153
|
+
// ════════════════════════════════════════════════════════════════════════════
|
|
154
|
+
// COMPOSABLES (excluding types that conflict with other modules)
|
|
155
|
+
// ════════════════════════════════════════════════════════════════════════════
|
|
156
|
+
export { useBareForm, type UseBareFormOptions, type UseBareFormReturn } from './composables/useBareForm'
|
|
157
|
+
export {
|
|
158
|
+
useBreadcrumb,
|
|
159
|
+
type UseBreadcrumbOptions,
|
|
160
|
+
type UseBreadcrumbReturn,
|
|
161
|
+
type BreadcrumbDisplayItem,
|
|
162
|
+
} from './composables/useBreadcrumb'
|
|
163
|
+
export {
|
|
164
|
+
useSemanticBreadcrumb,
|
|
165
|
+
computeSemanticBreadcrumb,
|
|
166
|
+
type SemanticBreadcrumbItem,
|
|
167
|
+
} from './composables/useSemanticBreadcrumb'
|
|
168
|
+
export { useDirtyState, type UseDirtyStateReturn } from './composables/useDirtyState'
|
|
169
|
+
export {
|
|
170
|
+
useForm,
|
|
171
|
+
type UseFormOptions,
|
|
172
|
+
type UseFormReturn,
|
|
173
|
+
type FormAlterConfig,
|
|
174
|
+
} from './composables/useForm'
|
|
175
|
+
export {
|
|
176
|
+
useEntityItemFormPage,
|
|
177
|
+
useEntityItemFormPage as useFormPageBuilder,
|
|
178
|
+
type UseEntityItemFormPageOptions,
|
|
179
|
+
type UseEntityItemFormPageReturn,
|
|
180
|
+
type FieldDefinition,
|
|
181
|
+
type ResolvedFieldConfig,
|
|
182
|
+
type ActionConfig as FormActionConfig,
|
|
183
|
+
type FormPageProps,
|
|
184
|
+
type FormPageEvents,
|
|
185
|
+
} from './composables/useEntityItemFormPage'
|
|
186
|
+
export * from './composables/useJsonSyntax'
|
|
187
|
+
export {
|
|
188
|
+
useListPage,
|
|
189
|
+
PAGE_SIZE_OPTIONS,
|
|
190
|
+
type UseListPageOptions,
|
|
191
|
+
type UseListPageReturn,
|
|
192
|
+
type ColumnConfig,
|
|
193
|
+
type FilterConfig,
|
|
194
|
+
type ActionConfig as ListActionConfig,
|
|
195
|
+
type ResolvedAction,
|
|
196
|
+
type HeaderActionConfig,
|
|
197
|
+
type ResolvedHeaderAction,
|
|
198
|
+
type CardConfig,
|
|
199
|
+
type SearchConfig,
|
|
200
|
+
type ListPageProps,
|
|
201
|
+
type ListPageEvents,
|
|
202
|
+
type BulkStatusActionReturn,
|
|
203
|
+
} from './composables/useListPage'
|
|
204
|
+
export {
|
|
205
|
+
usePageTitle,
|
|
206
|
+
type UsePageTitleReturn,
|
|
207
|
+
type TitleParts,
|
|
208
|
+
type TitleInput,
|
|
209
|
+
} from './composables/usePageTitle'
|
|
210
|
+
export { useApp, type UseAppReturn } from './composables/useApp'
|
|
211
|
+
export { useAuth, type UseAuthReturn } from './composables/useAuth'
|
|
212
|
+
export {
|
|
213
|
+
useEntityItemPage,
|
|
214
|
+
type UseEntityItemPageOptions,
|
|
215
|
+
type UseEntityItemPageReturn,
|
|
216
|
+
// ParentConfig already exported from types
|
|
217
|
+
} from './composables/useEntityItemPage'
|
|
218
|
+
export {
|
|
219
|
+
useEntityItemShowPage,
|
|
220
|
+
useEntityItemShowPage as useShowPageBuilder,
|
|
221
|
+
type UseEntityItemShowPageOptions,
|
|
222
|
+
type UseEntityItemShowPageReturn,
|
|
223
|
+
type FieldDefinition as ShowFieldDefinition,
|
|
224
|
+
type ResolvedFieldConfig as ShowResolvedFieldConfig,
|
|
225
|
+
type ActionConfig as ShowActionConfig,
|
|
226
|
+
type LazyActionConfig as ShowLazyActionConfig,
|
|
227
|
+
type ShowPageProps,
|
|
228
|
+
type ShowPageEvents,
|
|
229
|
+
} from './composables/useEntityItemShowPage'
|
|
230
|
+
export {
|
|
231
|
+
useNavContext,
|
|
232
|
+
type UseNavContextOptions,
|
|
233
|
+
type UseNavContextReturn,
|
|
234
|
+
type NavChainSegment,
|
|
235
|
+
type NavChainType,
|
|
236
|
+
type BreadcrumbItem,
|
|
237
|
+
type NavLinkItem,
|
|
238
|
+
} from './composables/useNavContext'
|
|
239
|
+
export {
|
|
240
|
+
useNavigation,
|
|
241
|
+
type UseNavigationReturn,
|
|
242
|
+
type NavSection,
|
|
243
|
+
// NavItem already exported from kernel
|
|
244
|
+
} from './composables/useNavigation'
|
|
245
|
+
export {
|
|
246
|
+
useUnsavedChangesGuard,
|
|
247
|
+
type UseUnsavedChangesGuardOptions,
|
|
248
|
+
type UseUnsavedChangesGuardReturn,
|
|
249
|
+
type GuardDialogState,
|
|
250
|
+
} from './composables/useUnsavedChangesGuard'
|
|
251
|
+
export { useGuardDialog, type GuardDialog } from './composables/useGuardStore'
|
|
252
|
+
export { useSignals } from './composables/useSignals'
|
|
253
|
+
export {
|
|
254
|
+
useZoneRegistry,
|
|
255
|
+
type UseZoneRegistryReturn,
|
|
256
|
+
type ZoneDefinition,
|
|
257
|
+
type ZoneInfo,
|
|
258
|
+
// BlockConfig & ZoneRegistry exported from zones
|
|
259
|
+
} from './composables/useZoneRegistry'
|
|
260
|
+
export { useHooks } from './composables/useHooks'
|
|
261
|
+
export {
|
|
262
|
+
useLayoutResolver,
|
|
263
|
+
createLayoutComponents,
|
|
264
|
+
layoutMeta,
|
|
265
|
+
LAYOUT_TYPES,
|
|
266
|
+
type UseLayoutResolverOptions,
|
|
267
|
+
type UseLayoutResolverReturn,
|
|
268
|
+
type LayoutType,
|
|
269
|
+
type LayoutComponentsMap,
|
|
270
|
+
type LayoutComponentsInput,
|
|
271
|
+
type LayoutMeta,
|
|
272
|
+
} from './composables/useLayoutResolver'
|
|
273
|
+
export { useSSEBridge, type UseSSEBridgeReturn } from './composables/useSSEBridge'
|
|
274
|
+
export {
|
|
275
|
+
useDeferred,
|
|
276
|
+
useDeferredValue,
|
|
277
|
+
DEFERRED_INJECTION_KEY,
|
|
278
|
+
type UseDeferredValueReturn,
|
|
279
|
+
} from './composables/useDeferred'
|
|
280
|
+
export {
|
|
281
|
+
useInfoBanner,
|
|
282
|
+
provideBannerStore,
|
|
283
|
+
createBannerStore,
|
|
284
|
+
type Banner,
|
|
285
|
+
type BannerOptions,
|
|
286
|
+
type BannerSeverity,
|
|
287
|
+
type BannerStore,
|
|
288
|
+
} from './composables/useInfoBanner'
|
|
289
|
+
export {
|
|
290
|
+
useUserImpersonator,
|
|
291
|
+
type UseUserImpersonatorOptions,
|
|
292
|
+
type UseUserImpersonatorReturn,
|
|
293
|
+
type UserRecord,
|
|
294
|
+
} from './composables/useUserImpersonator'
|
|
295
|
+
export { useCurrentEntity, type UseCurrentEntityReturn } from './composables/useCurrentEntity'
|
|
296
|
+
export {
|
|
297
|
+
useOptionsLookup,
|
|
298
|
+
type UseOptionsLookupConfig,
|
|
299
|
+
type UseOptionsLookupReturn,
|
|
300
|
+
type OptionsLookupItem,
|
|
301
|
+
type OptionsDisplayMode,
|
|
302
|
+
} from './composables/useOptionsLookup'
|
|
303
|
+
export { useChildPage, type UseChildPageReturn } from './composables/useChildPage'
|
|
304
|
+
export { useSidebarState, SIDEBAR_COLLAPSED_KEY } from './composables/useSidebarState'
|
|
305
|
+
|
|
306
|
+
// ════════════════════════════════════════════════════════════════════════════
|
|
307
|
+
// COMPONENTS
|
|
308
|
+
// ════════════════════════════════════════════════════════════════════════════
|
|
309
|
+
export * from './components/index'
|
|
310
|
+
|
|
311
|
+
// ════════════════════════════════════════════════════════════════════════════
|
|
312
|
+
// MODULE SYSTEM (excluding types that conflict)
|
|
313
|
+
// ════════════════════════════════════════════════════════════════════════════
|
|
314
|
+
export {
|
|
315
|
+
registry,
|
|
316
|
+
initModules,
|
|
317
|
+
setSectionOrder,
|
|
318
|
+
getRoutes,
|
|
319
|
+
getNavSections,
|
|
320
|
+
alterMenuSections,
|
|
321
|
+
isMenuAltered,
|
|
322
|
+
getRouteFamilies,
|
|
323
|
+
getEntityConfigs,
|
|
324
|
+
getEntityConfig,
|
|
325
|
+
getSiblingRoutes,
|
|
326
|
+
getChildRoutes,
|
|
327
|
+
isRouteInFamily,
|
|
328
|
+
resetRegistry,
|
|
329
|
+
type ModuleRouteMeta,
|
|
330
|
+
type ModuleRoute,
|
|
331
|
+
type NavItemWithSection,
|
|
332
|
+
type AddRoutesOptions,
|
|
333
|
+
type EntityConfig,
|
|
334
|
+
type ModuleInitContext,
|
|
335
|
+
type ModuleInitFunction,
|
|
336
|
+
type InitModulesOptions,
|
|
337
|
+
type MenuAlterContext,
|
|
338
|
+
// ParentConfig, NavItem, NavSection, ModuleDefinition - already exported
|
|
339
|
+
} from './module/moduleRegistry'
|
|
340
|
+
|
|
341
|
+
// ════════════════════════════════════════════════════════════════════════════
|
|
342
|
+
// ZONES (ZoneRegistry class and zone constants)
|
|
343
|
+
// ════════════════════════════════════════════════════════════════════════════
|
|
344
|
+
export {
|
|
345
|
+
ZoneRegistry,
|
|
346
|
+
createZoneRegistry,
|
|
347
|
+
type BlockOperation,
|
|
348
|
+
type WrapperInfo,
|
|
349
|
+
type ZoneConfig,
|
|
350
|
+
type ZoneDefineOptions,
|
|
351
|
+
type ZoneListInfo,
|
|
352
|
+
type ZoneDetailInfo,
|
|
353
|
+
type ZoneInspection,
|
|
354
|
+
type ZoneRegistryOptions,
|
|
355
|
+
// BlockConfig - already exported from kernel
|
|
356
|
+
} from './zones/ZoneRegistry'
|
|
357
|
+
export {
|
|
358
|
+
ZONES,
|
|
359
|
+
LAYOUT_ZONES,
|
|
360
|
+
LIST_ZONES,
|
|
361
|
+
FORM_ZONES,
|
|
362
|
+
DASHBOARD_ZONES,
|
|
363
|
+
registerStandardZones,
|
|
364
|
+
getStandardZoneNames,
|
|
365
|
+
} from './zones/zones'
|
|
366
|
+
|
|
367
|
+
// ════════════════════════════════════════════════════════════════════════════
|
|
368
|
+
// CHAIN (active navigation stack)
|
|
369
|
+
// ════════════════════════════════════════════════════════════════════════════
|
|
370
|
+
export * from './chain/index'
|
|
371
|
+
|
|
372
|
+
// ════════════════════════════════════════════════════════════════════════════
|
|
373
|
+
// HOOKS
|
|
374
|
+
// ════════════════════════════════════════════════════════════════════════════
|
|
375
|
+
export * from './hooks/index'
|
|
376
|
+
|
|
377
|
+
// ════════════════════════════════════════════════════════════════════════════
|
|
378
|
+
// DEFERRED (async service loading)
|
|
379
|
+
// ════════════════════════════════════════════════════════════════════════════
|
|
380
|
+
export * from './deferred/index'
|
|
381
|
+
|
|
382
|
+
// ════════════════════════════════════════════════════════════════════════════
|
|
383
|
+
// CORE (extension helpers)
|
|
384
|
+
// ════════════════════════════════════════════════════════════════════════════
|
|
385
|
+
export * from './core/index'
|
|
386
|
+
|
|
387
|
+
// ════════════════════════════════════════════════════════════════════════════
|
|
388
|
+
// QUERY (MongoDB-like filtering)
|
|
389
|
+
// ════════════════════════════════════════════════════════════════════════════
|
|
390
|
+
export * from './query/index'
|
|
391
|
+
|
|
392
|
+
// ════════════════════════════════════════════════════════════════════════════
|
|
393
|
+
// UTILS
|
|
394
|
+
// ════════════════════════════════════════════════════════════════════════════
|
|
395
|
+
export * from './utils/index'
|
|
396
|
+
|
|
397
|
+
// ════════════════════════════════════════════════════════════════════════════
|
|
398
|
+
// TOAST (signal-based notifications)
|
|
399
|
+
// ════════════════════════════════════════════════════════════════════════════
|
|
400
|
+
export * from './toast/index'
|
|
401
|
+
|
|
402
|
+
// ════════════════════════════════════════════════════════════════════════════
|
|
403
|
+
// NOTIFICATIONS (optional notification panel)
|
|
404
|
+
// ════════════════════════════════════════════════════════════════════════════
|
|
405
|
+
export * from './notifications/index'
|
|
406
|
+
|
|
407
|
+
// ════════════════════════════════════════════════════════════════════════════
|
|
408
|
+
// DEBUG - NOT exported here to enable tree-shaking.
|
|
409
|
+
// Import from '@quazardous/qdadm/debug' separately when needed:
|
|
410
|
+
// import { debugBar, DebugModule } from '@quazardous/qdadm/debug'
|
|
411
|
+
// ════════════════════════════════════════════════════════════════════════════
|
|
412
|
+
|
|
413
|
+
// ════════════════════════════════════════════════════════════════════════════
|
|
414
|
+
// I18N (schema-derived keys, pluggable providers, signal-driven locale)
|
|
415
|
+
// ════════════════════════════════════════════════════════════════════════════
|
|
416
|
+
export {
|
|
417
|
+
I18n,
|
|
418
|
+
MessagesRegistry,
|
|
419
|
+
Resolver,
|
|
420
|
+
snakeCaseToTitle,
|
|
421
|
+
InlineTranslationProvider,
|
|
422
|
+
defineStrategy,
|
|
423
|
+
resolveStrategy,
|
|
424
|
+
STRATEGIES,
|
|
425
|
+
LazyTranslationProvider,
|
|
426
|
+
IncrementalDomainProvider,
|
|
427
|
+
isDomainAwareProvider,
|
|
428
|
+
createYamlLoader,
|
|
429
|
+
createDefaultCoreProvider,
|
|
430
|
+
useI18n,
|
|
431
|
+
I18N_INJECTION_KEY,
|
|
432
|
+
} from './i18n'
|
|
433
|
+
export type {
|
|
434
|
+
AliasPattern,
|
|
435
|
+
CoreMessages,
|
|
436
|
+
EntityMessages,
|
|
437
|
+
I18nDeps,
|
|
438
|
+
I18nOptions,
|
|
439
|
+
KeyStrategy,
|
|
440
|
+
KeyStrategyName,
|
|
441
|
+
MessagesBundle,
|
|
442
|
+
MessagesNode,
|
|
443
|
+
NavMessages,
|
|
444
|
+
ResolveStep,
|
|
445
|
+
ResolveTrace,
|
|
446
|
+
TranslateParams,
|
|
447
|
+
TranslationProvider,
|
|
448
|
+
} from './i18n'
|
|
449
|
+
|
|
450
|
+
// ════════════════════════════════════════════════════════════════════════════
|
|
451
|
+
// ASSETS
|
|
452
|
+
// ════════════════════════════════════════════════════════════════════════════
|
|
453
|
+
export { default as qdadmLogo } from './assets/logo.svg'
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EventRouter — qdadm re-export.
|
|
3
|
+
*
|
|
4
|
+
* The actual implementation now lives in `@quazardous/qdcore` so it can be
|
|
5
|
+
* shared with qdcms. The legacy `orchestrator` constructor option (which was
|
|
6
|
+
* never actually read by any callback in qdadm) has been dropped; callers
|
|
7
|
+
* needing extras in `RouteContext` should use the new `context` option:
|
|
8
|
+
*
|
|
9
|
+
* ```ts
|
|
10
|
+
* createEventRouter({ signals, context: { orchestrator }, routes })
|
|
11
|
+
* // -> available inside callbacks as ctx.orchestrator
|
|
12
|
+
* ```
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
export { EventRouter, createEventRouter } from '@quazardous/qdcore'
|
|
16
|
+
export type {
|
|
17
|
+
SignalTarget,
|
|
18
|
+
RouteContext,
|
|
19
|
+
RouteCallback,
|
|
20
|
+
RouteTarget,
|
|
21
|
+
RoutesConfig,
|
|
22
|
+
EventRouterOptions,
|
|
23
|
+
} from '@quazardous/qdcore'
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import type { AxiosLikeClient, AxiosError } from './Kernel.types'
|
|
2
|
+
|
|
3
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
4
|
+
type Self = any
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Patch Kernel prototype with API client methods.
|
|
8
|
+
*/
|
|
9
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
10
|
+
export function applyApiMethods(KernelClass: { prototype: any }): void {
|
|
11
|
+
const proto = KernelClass.prototype as Self
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Setup an axios client with automatic auth and error handling
|
|
15
|
+
*/
|
|
16
|
+
proto.setupApiClient = function (this: Self, client: AxiosLikeClient): AxiosLikeClient {
|
|
17
|
+
const { authAdapter } = this.options
|
|
18
|
+
const signals = this.signals!
|
|
19
|
+
const debug = this.options.debug ?? false
|
|
20
|
+
|
|
21
|
+
client.interceptors.request.use(
|
|
22
|
+
(config) => {
|
|
23
|
+
if (authAdapter?.getToken) {
|
|
24
|
+
const token = authAdapter.getToken()
|
|
25
|
+
if (token) {
|
|
26
|
+
config.headers = config.headers || {}
|
|
27
|
+
config.headers.Authorization = `Bearer ${token}`
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return config
|
|
31
|
+
},
|
|
32
|
+
(error) => Promise.reject(error)
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
client.interceptors.response.use(
|
|
36
|
+
(response) => response,
|
|
37
|
+
async (error: unknown) => {
|
|
38
|
+
const axiosError = error as AxiosError
|
|
39
|
+
const status = axiosError.response?.status
|
|
40
|
+
const url = axiosError.config?.url
|
|
41
|
+
|
|
42
|
+
await signals.emit('api:error', {
|
|
43
|
+
status,
|
|
44
|
+
message: axiosError.message,
|
|
45
|
+
url,
|
|
46
|
+
error: axiosError,
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
if (status === 401 || status === 403) {
|
|
50
|
+
if (debug) {
|
|
51
|
+
console.warn(
|
|
52
|
+
`[Kernel] API ${status} error on ${url}, emitting auth:expired`
|
|
53
|
+
)
|
|
54
|
+
}
|
|
55
|
+
await signals.emit('auth:expired', { status, url })
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
return Promise.reject(error)
|
|
59
|
+
}
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
this._apiClient = client
|
|
63
|
+
return client
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Get the configured API client
|
|
68
|
+
*/
|
|
69
|
+
proto.getApiClient = function (this: Self): AxiosLikeClient | null {
|
|
70
|
+
return this._apiClient
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
Object.defineProperty(KernelClass.prototype, 'api', {
|
|
74
|
+
get(this: Self): AxiosLikeClient | null {
|
|
75
|
+
return this._apiClient
|
|
76
|
+
},
|
|
77
|
+
configurable: true,
|
|
78
|
+
})
|
|
79
|
+
}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { authFactory, CompositeAuthAdapter } from '../entity/auth'
|
|
2
|
+
|
|
3
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
4
|
+
type Self = any
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Patch Kernel prototype with auth-related methods.
|
|
8
|
+
*/
|
|
9
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
10
|
+
export function applyAuthMethods(KernelClass: { prototype: any }): void {
|
|
11
|
+
const proto = KernelClass.prototype as Self
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Resolve entityAuthAdapter through authFactory
|
|
15
|
+
*/
|
|
16
|
+
proto._resolveEntityAuthAdapter = function (this: Self): void {
|
|
17
|
+
const { entityAuthAdapter, authTypes } = this.options
|
|
18
|
+
|
|
19
|
+
if (entityAuthAdapter == null) return
|
|
20
|
+
|
|
21
|
+
const context = {
|
|
22
|
+
authTypes: authTypes || {},
|
|
23
|
+
CompositeAuthAdapter,
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
27
|
+
this.options.entityAuthAdapter = authFactory(entityAuthAdapter, context as any)
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Register auth:ready deferred if auth is configured
|
|
32
|
+
*/
|
|
33
|
+
proto._registerAuthDeferred = function (this: Self): void {
|
|
34
|
+
const { authAdapter } = this.options
|
|
35
|
+
if (!authAdapter) return
|
|
36
|
+
|
|
37
|
+
this.deferred!.queue('auth:ready', () => {
|
|
38
|
+
return new Promise((resolve) => {
|
|
39
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
40
|
+
this.signals!.once('auth:login', (event: any) => {
|
|
41
|
+
resolve(event.data?.user)
|
|
42
|
+
})
|
|
43
|
+
})
|
|
44
|
+
})
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Setup handler for auth:expired signal
|
|
49
|
+
*/
|
|
50
|
+
proto._setupAuthExpiredHandler = function (this: Self): void {
|
|
51
|
+
const { authAdapter, onAuthExpired } = this.options
|
|
52
|
+
if (!authAdapter) return
|
|
53
|
+
|
|
54
|
+
this.signals!.on('auth:expired', async (payload: { data: unknown }) => {
|
|
55
|
+
const debug = this.options.debug ?? false
|
|
56
|
+
if (debug) {
|
|
57
|
+
console.warn('[Kernel] auth:expired received:', payload)
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
if (authAdapter.logout) {
|
|
61
|
+
authAdapter.logout()
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const payloadData = typeof payload.data === 'object' && payload.data !== null ? payload.data : {}
|
|
65
|
+
await this.signals!.emit('auth:logout', { reason: 'expired', ...payloadData })
|
|
66
|
+
|
|
67
|
+
if (this.router!.currentRoute.value.name !== 'login') {
|
|
68
|
+
this.router!.push({ name: 'login', query: { expired: '1' } })
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
if (onAuthExpired) {
|
|
72
|
+
onAuthExpired(payload)
|
|
73
|
+
}
|
|
74
|
+
})
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Setup authAdapter to react to impersonation signals
|
|
79
|
+
*/
|
|
80
|
+
proto._setupAuthImpersonation = function (this: Self): void {
|
|
81
|
+
const { authAdapter } = this.options
|
|
82
|
+
if (!authAdapter?.connectSignals) return
|
|
83
|
+
|
|
84
|
+
const debug = this.options.debug ?? false
|
|
85
|
+
if (debug) {
|
|
86
|
+
console.debug('[Kernel] Wiring authAdapter.connectSignals() for impersonation')
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
this._authImpersonationCleanup = authAdapter.connectSignals(this.signals!)
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Setup auth invalidation - remount entire app on auth changes
|
|
94
|
+
*/
|
|
95
|
+
proto._setupAuthInvalidation = function (this: Self): void {
|
|
96
|
+
const debug = this.options.debug ?? false
|
|
97
|
+
const authSignals = [
|
|
98
|
+
'auth:login',
|
|
99
|
+
'auth:logout',
|
|
100
|
+
'auth:impersonate',
|
|
101
|
+
'auth:impersonate:stop',
|
|
102
|
+
]
|
|
103
|
+
|
|
104
|
+
for (const signal of authSignals) {
|
|
105
|
+
this.signals!.on(signal, () => {
|
|
106
|
+
if (debug) {
|
|
107
|
+
console.debug(`[Kernel] ${signal} → invalidateApp()`)
|
|
108
|
+
}
|
|
109
|
+
this.invalidateApp()
|
|
110
|
+
})
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Force full app remount
|
|
116
|
+
*/
|
|
117
|
+
proto.invalidateApp = function (this: Self): void {
|
|
118
|
+
this._appKey.value++
|
|
119
|
+
}
|
|
120
|
+
}
|