@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.
Files changed (291) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +111 -0
  3. package/package.json +101 -0
  4. package/src/assets/logo.svg +6 -0
  5. package/src/auth/SessionAuthAdapter.ts +459 -0
  6. package/src/auth/index.ts +15 -0
  7. package/src/chain/ActiveStack.ts +154 -0
  8. package/src/chain/StackHydrator.ts +292 -0
  9. package/src/chain/index.ts +25 -0
  10. package/src/chain/useActiveStack.ts +120 -0
  11. package/src/chain/useStackHydrator.ts +155 -0
  12. package/src/components/BoolCell.vue +34 -0
  13. package/src/components/InfoBanner.vue +73 -0
  14. package/src/components/QdadmRoot.vue +52 -0
  15. package/src/components/SeverityTag.vue +86 -0
  16. package/src/components/dialogs/BulkStatusDialog.vue +60 -0
  17. package/src/components/dialogs/MultiStepDialog.vue +331 -0
  18. package/src/components/dialogs/SimpleDialog.vue +122 -0
  19. package/src/components/dialogs/UnsavedChangesDialog.vue +80 -0
  20. package/src/components/display/BannerZone.vue +65 -0
  21. package/src/components/display/CardsGrid.vue +72 -0
  22. package/src/components/display/CopyableId.vue +84 -0
  23. package/src/components/display/EmptyState.vue +62 -0
  24. package/src/components/display/IntensityBar.vue +190 -0
  25. package/src/components/display/RichCardsGrid.vue +101 -0
  26. package/src/components/edit/FormActions.vue +78 -0
  27. package/src/components/edit/FormField.vue +82 -0
  28. package/src/components/edit/FormInput.vue +158 -0
  29. package/src/components/edit/FormPage.vue +260 -0
  30. package/src/components/edit/FormTab.vue +217 -0
  31. package/src/components/edit/FormTabs.vue +120 -0
  32. package/src/components/edit/LookupField.vue +406 -0
  33. package/src/components/edit/LookupPickerDialog.vue +230 -0
  34. package/src/components/editors/JsonEditorFoldable.vue +470 -0
  35. package/src/components/editors/JsonStructuredField.vue +264 -0
  36. package/src/components/editors/JsonViewer.vue +51 -0
  37. package/src/components/editors/KeyValueEditor.vue +314 -0
  38. package/src/components/editors/LanguageEditor.vue +259 -0
  39. package/src/components/editors/PermissionEditor.vue +558 -0
  40. package/src/components/editors/ScopeEditor.vue +372 -0
  41. package/src/components/editors/VanillaJsonEditor.vue +183 -0
  42. package/src/components/index.ts +83 -0
  43. package/src/components/item/FieldGroups.vue +392 -0
  44. package/src/components/layout/AppLayout.vue +1032 -0
  45. package/src/components/layout/BaseLayout.vue +190 -0
  46. package/src/components/layout/Breadcrumb.vue +55 -0
  47. package/src/components/layout/DashboardLayout.vue +104 -0
  48. package/src/components/layout/FormLayout.vue +256 -0
  49. package/src/components/layout/ListLayout.vue +278 -0
  50. package/src/components/layout/PageHeader.vue +156 -0
  51. package/src/components/layout/PageLayout.vue +126 -0
  52. package/src/components/layout/PageNav.vue +192 -0
  53. package/src/components/layout/SidebarBox.vue +87 -0
  54. package/src/components/layout/Zone.vue +182 -0
  55. package/src/components/layout/defaults/DefaultBreadcrumb.vue +149 -0
  56. package/src/components/layout/defaults/DefaultFooter.vue +89 -0
  57. package/src/components/layout/defaults/DefaultFormActions.vue +67 -0
  58. package/src/components/layout/defaults/DefaultHeader.vue +78 -0
  59. package/src/components/layout/defaults/DefaultMenu.vue +188 -0
  60. package/src/components/layout/defaults/DefaultPagination.vue +75 -0
  61. package/src/components/layout/defaults/DefaultTable.vue +137 -0
  62. package/src/components/layout/defaults/DefaultUserInfo.vue +111 -0
  63. package/src/components/layout/defaults/index.ts +16 -0
  64. package/src/components/lists/ActionButtons.vue +49 -0
  65. package/src/components/lists/ActionColumn.vue +40 -0
  66. package/src/components/lists/FilterBar.vue +54 -0
  67. package/src/components/lists/ListPage.vue +467 -0
  68. package/src/components/pages/LoginPage.vue +334 -0
  69. package/src/components/pages/NotFoundPage.vue +98 -0
  70. package/src/components/show/ShowDisplay.vue +343 -0
  71. package/src/components/show/ShowField.vue +67 -0
  72. package/src/components/show/ShowPage.vue +431 -0
  73. package/src/composables/index.ts +155 -0
  74. package/src/composables/useApp.ts +67 -0
  75. package/src/composables/useAuth.ts +98 -0
  76. package/src/composables/useBareForm.ts +319 -0
  77. package/src/composables/useBreadcrumb.ts +252 -0
  78. package/src/composables/useChildPage.ts +113 -0
  79. package/src/composables/useCurrentEntity.ts +60 -0
  80. package/src/composables/useDeferred.ts +94 -0
  81. package/src/composables/useDirtyState.ts +138 -0
  82. package/src/composables/useEntityItemFormPage.ts +942 -0
  83. package/src/composables/useEntityItemFormPage.types.ts +451 -0
  84. package/src/composables/useEntityItemPage.ts +438 -0
  85. package/src/composables/useEntityItemShowPage.ts +722 -0
  86. package/src/composables/useFieldManager.ts +692 -0
  87. package/src/composables/useForm.ts +544 -0
  88. package/src/composables/useGuardStore.ts +53 -0
  89. package/src/composables/useHooks.ts +56 -0
  90. package/src/composables/useInfoBanner.ts +217 -0
  91. package/src/composables/useJsonSyntax.ts +122 -0
  92. package/src/composables/useLayoutResolver.ts +329 -0
  93. package/src/composables/useListPage.ts +1535 -0
  94. package/src/composables/useListPage.types.ts +437 -0
  95. package/src/composables/useListPage.utils.ts +101 -0
  96. package/src/composables/useNavContext.ts +439 -0
  97. package/src/composables/useNavigation.ts +216 -0
  98. package/src/composables/useOptionsLookup.ts +323 -0
  99. package/src/composables/usePageTitle.ts +84 -0
  100. package/src/composables/useSSEBridge.ts +142 -0
  101. package/src/composables/useSemanticBreadcrumb.ts +222 -0
  102. package/src/composables/useSidebarState.ts +24 -0
  103. package/src/composables/useSignals.ts +52 -0
  104. package/src/composables/useUnsavedChangesGuard.ts +155 -0
  105. package/src/composables/useUserImpersonator.ts +317 -0
  106. package/src/composables/useZoneRegistry.ts +252 -0
  107. package/src/core/bundles.ts +558 -0
  108. package/src/core/decorator.ts +420 -0
  109. package/src/core/extension.ts +470 -0
  110. package/src/core/index.ts +59 -0
  111. package/src/deferred/DeferredRegistry.ts +353 -0
  112. package/src/deferred/index.ts +15 -0
  113. package/src/editors/index.ts +12 -0
  114. package/src/entity/EntityManager.cache.ts +530 -0
  115. package/src/entity/EntityManager.crud.ts +615 -0
  116. package/src/entity/EntityManager.interface.ts +78 -0
  117. package/src/entity/EntityManager.query.ts +221 -0
  118. package/src/entity/EntityManager.relations.ts +151 -0
  119. package/src/entity/EntityManager.ts +944 -0
  120. package/src/entity/EntityManager.types.ts +288 -0
  121. package/src/entity/auth/CompositeAuthAdapter.ts +194 -0
  122. package/src/entity/auth/EntityAuthAdapter.ts +119 -0
  123. package/src/entity/auth/PermissiveAdapter.ts +43 -0
  124. package/src/entity/auth/RoleHierarchy.ts +128 -0
  125. package/src/entity/auth/SecurityChecker.ts +202 -0
  126. package/src/entity/auth/factory.ts +203 -0
  127. package/src/entity/auth/index.ts +47 -0
  128. package/src/entity/factory.test.js +189 -0
  129. package/src/entity/factory.ts +146 -0
  130. package/src/entity/index.ts +49 -0
  131. package/src/entity/storage/ApiStorage.ts +228 -0
  132. package/src/entity/storage/IStorage.ts +100 -0
  133. package/src/entity/storage/LocalStorage.ts +200 -0
  134. package/src/entity/storage/MemoryStorage.ts +184 -0
  135. package/src/entity/storage/MockApiStorage.ts +318 -0
  136. package/src/entity/storage/SdkStorage.ts +377 -0
  137. package/src/entity/storage/factory.test.js +159 -0
  138. package/src/entity/storage/factory.ts +209 -0
  139. package/src/entity/storage/index.ts +75 -0
  140. package/src/gen/FieldMapper.ts +122 -0
  141. package/src/gen/StorageProfileFactory.ts +93 -0
  142. package/src/gen/connectors/BaseConnector.ts +150 -0
  143. package/src/gen/connectors/ManualConnector.test.js +499 -0
  144. package/src/gen/connectors/ManualConnector.ts +414 -0
  145. package/src/gen/connectors/OpenAPIConnector.test.js +836 -0
  146. package/src/gen/connectors/OpenAPIConnector.ts +693 -0
  147. package/src/gen/connectors/__fixtures__/sample-openapi.json +311 -0
  148. package/src/gen/connectors/index.ts +27 -0
  149. package/src/gen/createManagers.ts +245 -0
  150. package/src/gen/decorators.ts +134 -0
  151. package/src/gen/generateManagers.test.js +540 -0
  152. package/src/gen/generateManagers.ts +398 -0
  153. package/src/gen/index.ts +66 -0
  154. package/src/gen/schema.ts +248 -0
  155. package/src/gen/vite-plugin.ts +114 -0
  156. package/src/generated/managers/testManager.js +45 -0
  157. package/src/generated/managers/testManager.ts +46 -0
  158. package/src/hooks/HookRegistry.ts +16 -0
  159. package/src/hooks/index.ts +15 -0
  160. package/src/i18n/I18n.ts +344 -0
  161. package/src/i18n/IncrementalDomainProvider.ts +153 -0
  162. package/src/i18n/InlineTranslationProvider.ts +4 -0
  163. package/src/i18n/LazyTranslationProvider.ts +102 -0
  164. package/src/i18n/MessagesRegistry.ts +4 -0
  165. package/src/i18n/Resolver.ts +4 -0
  166. package/src/i18n/__tests__/I18n.test.ts +169 -0
  167. package/src/i18n/__tests__/IncrementalDomainProvider.test.ts +146 -0
  168. package/src/i18n/__tests__/LazyTranslationProvider.test.ts +100 -0
  169. package/src/i18n/__tests__/Resolver.test.ts +271 -0
  170. package/src/i18n/defaults/DefaultCoreProvider.ts +28 -0
  171. package/src/i18n/defaults/core.en.yml +55 -0
  172. package/src/i18n/defaults/core.fr.yml +55 -0
  173. package/src/i18n/index.ts +55 -0
  174. package/src/i18n/loaders/raw-modules.d.ts +15 -0
  175. package/src/i18n/loaders/yaml.ts +35 -0
  176. package/src/i18n/strategies.ts +4 -0
  177. package/src/i18n/types.ts +34 -0
  178. package/src/i18n/useI18n.ts +34 -0
  179. package/src/index.ts +453 -0
  180. package/src/kernel/EventRouter.ts +23 -0
  181. package/src/kernel/Kernel.api.ts +79 -0
  182. package/src/kernel/Kernel.auth.ts +120 -0
  183. package/src/kernel/Kernel.i18n.ts +29 -0
  184. package/src/kernel/Kernel.modules.ts +170 -0
  185. package/src/kernel/Kernel.registries.ts +237 -0
  186. package/src/kernel/Kernel.routing.ts +334 -0
  187. package/src/kernel/Kernel.ts +460 -0
  188. package/src/kernel/Kernel.types.ts +263 -0
  189. package/src/kernel/Kernel.vue.ts +304 -0
  190. package/src/kernel/KernelContext.entities.ts +80 -0
  191. package/src/kernel/KernelContext.events.ts +57 -0
  192. package/src/kernel/KernelContext.i18n.ts +37 -0
  193. package/src/kernel/KernelContext.permissions.ts +38 -0
  194. package/src/kernel/KernelContext.routing.ts +280 -0
  195. package/src/kernel/KernelContext.ts +252 -0
  196. package/src/kernel/KernelContext.types.ts +173 -0
  197. package/src/kernel/KernelContext.zones.ts +54 -0
  198. package/src/kernel/Module.ts +169 -0
  199. package/src/kernel/ModuleLoader.ts +645 -0
  200. package/src/kernel/SSEBridge.ts +11 -0
  201. package/src/kernel/SignalBus.ts +48 -0
  202. package/src/kernel/index.ts +56 -0
  203. package/src/module/index.ts +33 -0
  204. package/src/module/moduleRegistry.ts +492 -0
  205. package/src/modules/debug/AuthCollector.ts +501 -0
  206. package/src/modules/debug/Collector.ts +20 -0
  207. package/src/modules/debug/DebugBridge.ts +14 -0
  208. package/src/modules/debug/DebugModule.ts +220 -0
  209. package/src/modules/debug/EntitiesCollector.ts +839 -0
  210. package/src/modules/debug/ErrorCollector.ts +4 -0
  211. package/src/modules/debug/I18nCollector.ts +9 -0
  212. package/src/modules/debug/LocalStorageAdapter.ts +7 -0
  213. package/src/modules/debug/RouterCollector.ts +449 -0
  214. package/src/modules/debug/SignalCollector.ts +4 -0
  215. package/src/modules/debug/ToastCollector.ts +4 -0
  216. package/src/modules/debug/ZonesCollector.ts +447 -0
  217. package/src/modules/debug/components/DebugBar.vue +31 -0
  218. package/src/modules/debug/components/adminPanelsConfig.ts +42 -0
  219. package/src/modules/debug/components/index.ts +9 -0
  220. package/src/modules/debug/components/panels/AuthPanel.vue +267 -0
  221. package/src/modules/debug/components/panels/EntitiesPanel.vue +572 -0
  222. package/src/modules/debug/components/panels/I18nPanel.vue +738 -0
  223. package/src/modules/debug/components/panels/RouterPanel.vue +440 -0
  224. package/src/modules/debug/components/panels/ZonesPanel.vue +133 -0
  225. package/src/modules/debug/components/panels/index.ts +16 -0
  226. package/src/modules/debug/index.ts +58 -0
  227. package/src/modules/debug/styles.scss +2671 -0
  228. package/src/notifications/NotificationBadge.vue +35 -0
  229. package/src/notifications/NotificationListener.vue +71 -0
  230. package/src/notifications/NotificationModule.ts +76 -0
  231. package/src/notifications/NotificationPanel.vue +478 -0
  232. package/src/notifications/NotificationStore.ts +288 -0
  233. package/src/notifications/index.ts +42 -0
  234. package/src/notifications/styles.scss +32 -0
  235. package/src/orchestrator/Orchestrator.ts +427 -0
  236. package/src/orchestrator/index.ts +8 -0
  237. package/src/orchestrator/useOrchestrator.ts +80 -0
  238. package/src/plugin.ts +251 -0
  239. package/src/query/FilterQuery.ts +306 -0
  240. package/src/query/QueryExecutor.ts +341 -0
  241. package/src/query/index.ts +16 -0
  242. package/src/security/EntityRolesProvider.ts +385 -0
  243. package/src/security/PermissionMatcher.ts +152 -0
  244. package/src/security/PermissionRegistry.ts +273 -0
  245. package/src/security/PersistableRolesProvider.ts +584 -0
  246. package/src/security/RolesManager.ts +136 -0
  247. package/src/security/RolesProvider.ts +167 -0
  248. package/src/security/RolesProviderStorage.ts +211 -0
  249. package/src/security/SecurityModule.ts +94 -0
  250. package/src/security/StaticRolesProvider.ts +117 -0
  251. package/src/security/UsersManager.ts +163 -0
  252. package/src/security/index.ts +77 -0
  253. package/src/security/pages/RoleForm.vue +276 -0
  254. package/src/security/pages/RoleList.vue +123 -0
  255. package/src/styles/_alerts.scss +95 -0
  256. package/src/styles/_buttons.scss +391 -0
  257. package/src/styles/_cards.scss +241 -0
  258. package/src/styles/_code.scss +78 -0
  259. package/src/styles/_dialogs.scss +55 -0
  260. package/src/styles/_filter-bar.scss +70 -0
  261. package/src/styles/_forms.scss +434 -0
  262. package/src/styles/_helpers.scss +153 -0
  263. package/src/styles/_lists.scss +225 -0
  264. package/src/styles/_main.scss +356 -0
  265. package/src/styles/_markdown.scss +88 -0
  266. package/src/styles/_responsive.scss +255 -0
  267. package/src/styles/_show-pages.scss +186 -0
  268. package/src/styles/_sidebar.scss +380 -0
  269. package/src/styles/_states.scss +115 -0
  270. package/src/styles/_stats.scss +47 -0
  271. package/src/styles/_variables.scss +224 -0
  272. package/src/styles/index.scss +38 -0
  273. package/src/styles/theme/_components.scss +331 -0
  274. package/src/styles/theme/_index.scss +10 -0
  275. package/src/styles/theme/_tokens.scss +147 -0
  276. package/src/styles/theme/_utilities.scss +175 -0
  277. package/src/toast/ToastBridgeModule.ts +68 -0
  278. package/src/toast/ToastListener.vue +55 -0
  279. package/src/toast/index.ts +26 -0
  280. package/src/toast/useSignalToast.ts +154 -0
  281. package/src/types/index.ts +285 -0
  282. package/src/types/pluralize.d.ts +19 -0
  283. package/src/types/quarkernel.d.ts +50 -0
  284. package/src/utils/formatters.ts +174 -0
  285. package/src/utils/index.ts +35 -0
  286. package/src/utils/transformers.ts +131 -0
  287. package/src/vite/qdadmDebugPlugin.ts +401 -0
  288. package/src/vite-env.d.ts +50 -0
  289. package/src/zones/ZoneRegistry.ts +934 -0
  290. package/src/zones/index.ts +29 -0
  291. 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
+ }