@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
@@ -0,0 +1,220 @@
1
+ /**
2
+ * DebugModule - Module System v2 class for debug tools integration
3
+ *
4
+ * Integrates the debug infrastructure (DebugBridge, collectors, DebugBar)
5
+ * into a qdadm application via the Module System.
6
+ *
7
+ * Features:
8
+ * - Creates and configures DebugBridge with default collectors
9
+ * - Registers ErrorCollector and SignalCollector automatically
10
+ * - Adds DebugBar component to 'app:debug' zone
11
+ * - Provides debug bridge via Vue's provide/inject
12
+ */
13
+
14
+ import { h, inject, defineComponent, type DefineComponent } from 'vue'
15
+ import { Module, type ModuleOptions } from '../../kernel/Module'
16
+ import { createDebugBridge, type DebugBridge } from './DebugBridge'
17
+ import { ErrorCollector } from './ErrorCollector'
18
+ import { SignalCollector } from './SignalCollector'
19
+ import { ToastCollector } from './ToastCollector'
20
+ import { ZonesCollector } from './ZonesCollector'
21
+ import { AuthCollector } from './AuthCollector'
22
+ import { EntitiesCollector } from './EntitiesCollector'
23
+ import { RouterCollector } from './RouterCollector'
24
+ import { I18nCollector } from './I18nCollector'
25
+ import DebugBar from './components/DebugBar.vue'
26
+ import type { KernelContext } from '../../kernel/KernelContext'
27
+
28
+ /**
29
+ * Symbol for debug bridge injection key
30
+ */
31
+ // Symbol.for() instead of Symbol() — the latter mints a fresh
32
+ // instance each time the module evaluates, and Vite HMR can fragment
33
+ // a single source module into multiple live instances per importer.
34
+ // Provider and consumer would then hold DIFFERENT symbols and the
35
+ // inject would fall back to its default (null), defeating the bridge.
36
+ export const DEBUG_BRIDGE_KEY = Symbol.for('qdadm.debugBridge')
37
+
38
+ /**
39
+ * Debug zone name for the DebugBar component
40
+ * Prefixed with _ to hide from ZonesCollector (internal zone)
41
+ */
42
+ export const DEBUG_ZONE = '_app:debug'
43
+
44
+ /**
45
+ * Global DebugBar wrapper component
46
+ * Auto-injects the debug bridge - use in App.vue for app-wide debug bar
47
+ */
48
+ export const QdadmDebugBar = defineComponent({
49
+ name: 'QdadmDebugBar',
50
+ setup() {
51
+ const bridge = inject<DebugBridge | null>(DEBUG_BRIDGE_KEY, null)
52
+ return () => bridge ? h(DebugBar as unknown as DefineComponent, { bridge }) : null
53
+ }
54
+ })
55
+
56
+ /**
57
+ * Debug module options
58
+ */
59
+ export interface DebugModuleOptions extends ModuleOptions {
60
+ enabled?: boolean
61
+ maxEntries?: number
62
+ errorCollector?: boolean
63
+ signalCollector?: boolean
64
+ toastCollector?: boolean
65
+ zonesCollector?: boolean
66
+ authCollector?: boolean
67
+ entitiesCollector?: boolean
68
+ routerCollector?: boolean
69
+ i18nCollector?: boolean
70
+ _kernelManaged?: boolean
71
+ /**
72
+ * Existing DebugBridge to register collectors onto. When provided,
73
+ * the module skips its own `createDebugBridge()` AND skips
74
+ * `bridge.install(ctx)` — the host shell owns install timing so
75
+ * collectors from multiple sources (e.g. qdcms + qdadm) end up on
76
+ * the same bridge with a single merged install. When omitted, the
77
+ * module owns its bridge fully (legacy behaviour).
78
+ */
79
+ bridge?: DebugBridge
80
+ }
81
+
82
+ /**
83
+ * DebugModule - Integrates debug tools into the application
84
+ */
85
+ export class DebugModule extends Module {
86
+ static override moduleName = 'debug'
87
+ static override requires: string[] = []
88
+ static override priority = 1000
89
+ static styles = () => import('./styles.scss')
90
+
91
+ declare options: DebugModuleOptions
92
+ private _bridge: DebugBridge | null = null
93
+ private _blockId = 'debug-bar'
94
+
95
+ constructor(options: DebugModuleOptions = {}) {
96
+ super(options)
97
+ }
98
+
99
+ /**
100
+ * Check if module should be enabled
101
+ */
102
+ override enabled(ctx: KernelContext): boolean {
103
+ const extCtx = ctx as KernelContext & { isDev?: boolean; debug?: boolean }
104
+ return extCtx.isDev || extCtx.debug || false
105
+ }
106
+
107
+ /**
108
+ * Connect module to kernel
109
+ */
110
+ override async connect(ctx: KernelContext): Promise<void> {
111
+ this.ctx = ctx as unknown as Record<string, unknown>
112
+
113
+ // External bridge (host-owned) when provided — the host installs
114
+ // it later with a merged context. Otherwise create our own.
115
+ const externalBridge = this.options.bridge ?? null
116
+ this._bridge = externalBridge ?? createDebugBridge({
117
+ enabled: this.options.enabled ?? false
118
+ })
119
+
120
+ // Register default collectors
121
+ const collectorOptions = { maxEntries: this.options.maxEntries ?? 100 }
122
+
123
+ if (this.options.errorCollector !== false) {
124
+ this._bridge.addCollector(new ErrorCollector(collectorOptions))
125
+ }
126
+
127
+ if (this.options.signalCollector !== false) {
128
+ this._bridge.addCollector(new SignalCollector(collectorOptions))
129
+ }
130
+
131
+ if (this.options.toastCollector !== false) {
132
+ this._bridge.addCollector(new ToastCollector(collectorOptions))
133
+ }
134
+
135
+ if (this.options.zonesCollector !== false) {
136
+ this._bridge.addCollector(new ZonesCollector(collectorOptions))
137
+ }
138
+
139
+ if (this.options.authCollector !== false) {
140
+ this._bridge.addCollector(new AuthCollector(collectorOptions))
141
+ }
142
+
143
+ if (this.options.entitiesCollector !== false) {
144
+ this._bridge.addCollector(new EntitiesCollector(collectorOptions))
145
+ }
146
+
147
+ if (this.options.routerCollector !== false) {
148
+ this._bridge.addCollector(new RouterCollector(collectorOptions))
149
+ }
150
+
151
+ if (this.options.i18nCollector !== false) {
152
+ this._bridge.addCollector(new I18nCollector(collectorOptions))
153
+ }
154
+
155
+ // Install collectors with context — only when WE own the bridge.
156
+ // External bridges are installed by the host later with a merged
157
+ // context that may include data from other frameworks (e.g. cms).
158
+ if (!externalBridge) {
159
+ this._bridge.install(ctx as unknown as Record<string, unknown>)
160
+ }
161
+
162
+ // Define the debug zone
163
+ const extCtx = ctx as KernelContext & {
164
+ zone: (name: string) => void
165
+ block: (zone: string, config: {
166
+ id: string
167
+ component: unknown
168
+ props: Record<string, unknown>
169
+ weight: number
170
+ }) => void
171
+ provide: (key: symbol, value: unknown) => void
172
+ component: (name: string, component: unknown) => void
173
+ }
174
+
175
+ extCtx.zone(DEBUG_ZONE)
176
+
177
+ // Only register zone block if NOT using Kernel's root wrapper approach
178
+ if (!this.options._kernelManaged) {
179
+ extCtx.block(DEBUG_ZONE, {
180
+ id: this._blockId,
181
+ component: DebugBar,
182
+ props: {
183
+ bridge: this._bridge
184
+ },
185
+ weight: 100
186
+ })
187
+ }
188
+
189
+ // Provide debug bridge for injection
190
+ extCtx.provide(DEBUG_BRIDGE_KEY, this._bridge)
191
+
192
+ // Register global component for use in App.vue
193
+ extCtx.component('QdadmDebugBar', QdadmDebugBar)
194
+
195
+ // The HTTP debug bridge (qdadmDebugPlugin) is wired entirely from the
196
+ // injected client script (see transformIndexHtml in the plugin). The
197
+ // DebugModule itself stays browser-pure and HMR-agnostic.
198
+ }
199
+
200
+ /**
201
+ * Disconnect module from kernel
202
+ */
203
+ override async disconnect(): Promise<void> {
204
+ if (this._bridge) {
205
+ this._bridge.uninstall()
206
+ this._bridge = null
207
+ }
208
+
209
+ await super.disconnect()
210
+ }
211
+
212
+ /**
213
+ * Get the debug bridge instance
214
+ */
215
+ getBridge(): DebugBridge | null {
216
+ return this._bridge
217
+ }
218
+ }
219
+
220
+ export default DebugModule