@vc-shell/framework 1.1.21 → 1.1.23

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 (222) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/core/composables/useAppInsights/index.ts +11 -1
  3. package/core/composables/useBladeRegistry/index.ts +176 -0
  4. package/core/composables/useDynamicProperties/index.ts +380 -255
  5. package/core/composables/useErrorHandler/index.ts +2 -3
  6. package/core/composables/useKeyboardNavigation/index.ts +52 -10
  7. package/core/composables/useLanguages/index.ts +78 -78
  8. package/core/plugins/modularity/index.ts +17 -6
  9. package/core/services/global-search-service/index.ts +36 -0
  10. package/dist/core/composables/useAppInsights/index.d.ts +5 -2
  11. package/dist/core/composables/useAppInsights/index.d.ts.map +1 -1
  12. package/dist/core/composables/useBladeRegistry/index.d.ts +48 -0
  13. package/dist/core/composables/useBladeRegistry/index.d.ts.map +1 -0
  14. package/dist/core/composables/useDynamicProperties/index.d.ts +12 -9
  15. package/dist/core/composables/useDynamicProperties/index.d.ts.map +1 -1
  16. package/dist/core/composables/useErrorHandler/index.d.ts.map +1 -1
  17. package/dist/core/composables/useKeyboardNavigation/index.d.ts.map +1 -1
  18. package/dist/core/plugins/modularity/index.d.ts.map +1 -1
  19. package/dist/core/services/global-search-service/index.d.ts +10 -0
  20. package/dist/core/services/global-search-service/index.d.ts.map +1 -0
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/shared/components/blade-navigation/composables/useBladeNavigation/index.d.ts +7 -12
  23. package/dist/shared/components/blade-navigation/composables/useBladeNavigation/index.d.ts.map +1 -1
  24. package/dist/shared/components/blade-navigation/composables/useBladeNavigation/internal/bladeActions.d.ts +15 -0
  25. package/dist/shared/components/blade-navigation/composables/useBladeNavigation/internal/bladeActions.d.ts.map +1 -0
  26. package/dist/shared/components/blade-navigation/composables/useBladeNavigation/internal/bladeRouteResolver.d.ts +11 -0
  27. package/dist/shared/components/blade-navigation/composables/useBladeNavigation/internal/bladeRouteResolver.d.ts.map +1 -0
  28. package/dist/shared/components/blade-navigation/composables/useBladeNavigation/internal/bladeState.d.ts +15 -0
  29. package/dist/shared/components/blade-navigation/composables/useBladeNavigation/internal/bladeState.d.ts.map +1 -0
  30. package/dist/shared/components/blade-navigation/composables/useBladeNavigation/internal/bladeWatchers.d.ts +6 -0
  31. package/dist/shared/components/blade-navigation/composables/useBladeNavigation/internal/bladeWatchers.d.ts.map +1 -0
  32. package/dist/shared/components/blade-navigation/composables/useBladeNavigation/internal/routerUtils.d.ts +28 -0
  33. package/dist/shared/components/blade-navigation/composables/useBladeNavigation/internal/routerUtils.d.ts.map +1 -0
  34. package/dist/shared/components/blade-navigation/plugin.d.ts.map +1 -1
  35. package/dist/shared/components/blade-navigation/types/index.d.ts +5 -5
  36. package/dist/shared/components/blade-navigation/types/index.d.ts.map +1 -1
  37. package/dist/shared/components/notification-template/notification-template.vue.d.ts +2 -2
  38. package/dist/shared/components/notification-template/notification-template.vue.d.ts.map +1 -1
  39. package/dist/shared/components/notifications/components/notification-container/index.d.ts +6 -6
  40. package/dist/shared/components/notifications/components/notification-container/index.d.ts.map +1 -1
  41. package/dist/shared/modules/assets-manager/components/assets-manager/assets-manager.vue.d.ts +2 -2
  42. package/dist/shared/modules/dynamic/index.d.ts.map +1 -1
  43. package/dist/shared/modules/dynamic/pages/dynamic-blade-list.vue.d.ts +2 -2
  44. package/dist/shared/pages/InvitePage/components/invite/Invite.vue.d.ts +1 -1
  45. package/dist/shared/pages/InvitePage/components/invite/Invite.vue.d.ts.map +1 -1
  46. package/dist/shared/pages/ResetPasswordPage/components/reset-password/ResetPassword.vue.d.ts +1 -1
  47. package/dist/shared/pages/ResetPasswordPage/components/reset-password/ResetPassword.vue.d.ts.map +1 -1
  48. package/dist/tsconfig.tsbuildinfo +1 -1
  49. package/dist/ui/components/atoms/vc-badge/vc-badge.vue.d.ts +1 -1
  50. package/dist/ui/components/atoms/vc-badge/vc-badge.vue.d.ts.map +1 -1
  51. package/dist/ui/components/atoms/vc-container/vc-container.vue.d.ts +2 -2
  52. package/dist/ui/components/atoms/vc-icon/vc-icon.vue.d.ts +1 -1
  53. package/dist/ui/components/atoms/vc-icon/vc-icon.vue.d.ts.map +1 -1
  54. package/dist/ui/components/atoms/vc-icon/vc-material-icon.vue.d.ts +1 -1
  55. package/dist/ui/components/atoms/vc-icon/vc-material-icon.vue.d.ts.map +1 -1
  56. package/dist/ui/components/atoms/vc-progress/vc-progress.vue.d.ts +1 -1
  57. package/dist/ui/components/atoms/vc-progress/vc-progress.vue.d.ts.map +1 -1
  58. package/dist/ui/components/molecules/vc-editor/vc-editor.vue.d.ts +2 -2
  59. package/dist/ui/components/molecules/vc-file-upload/vc-file-upload.vue.d.ts +2 -2
  60. package/dist/ui/components/molecules/vc-file-upload/vc-file-upload.vue.d.ts.map +1 -1
  61. package/dist/ui/components/molecules/vc-input/vc-input.vue.d.ts +2 -2
  62. package/dist/ui/components/molecules/vc-input/vc-input.vue.d.ts.map +1 -1
  63. package/dist/ui/components/molecules/vc-input-dropdown/vc-input-dropdown.vue.d.ts +2 -0
  64. package/dist/ui/components/molecules/vc-input-dropdown/vc-input-dropdown.vue.d.ts.map +1 -1
  65. package/dist/ui/components/molecules/vc-pagination/vc-pagination.vue.d.ts +1 -1
  66. package/dist/ui/components/molecules/vc-pagination/vc-pagination.vue.d.ts.map +1 -1
  67. package/dist/ui/components/molecules/vc-rating/vc-rating.vue.d.ts +1 -1
  68. package/dist/ui/components/molecules/vc-rating/vc-rating.vue.d.ts.map +1 -1
  69. package/dist/ui/components/organisms/vc-app/_internal/vc-app-menu/_internal/vc-app-menu-item/vc-app-menu-item.vue.d.ts +1 -1
  70. package/dist/ui/components/organisms/vc-app/_internal/vc-app-menu/_internal/vc-app-menu-item/vc-app-menu-item.vue.d.ts.map +1 -1
  71. package/dist/ui/components/organisms/vc-app/vc-app.vue.d.ts.map +1 -1
  72. package/dist/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/_internal/vc-blade-toolbar-buttons/_internal/vc-blade-toolbar-button/vc-blade-toolbar-base-button.vue.d.ts +1 -1
  73. package/dist/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/_internal/vc-blade-toolbar-buttons/_internal/vc-blade-toolbar-button/vc-blade-toolbar-button.vue.d.ts +1 -1
  74. package/dist/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/_internal/vc-blade-toolbar-buttons/_internal/vc-blade-toolbar-button/vc-blade-toolbar-button.vue.d.ts.map +1 -1
  75. package/dist/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/_internal/vc-blade-toolbar-buttons/_internal/vc-blade-toolbar-button/vc-blade-toolbar-circle-button.vue.d.ts +1 -1
  76. package/dist/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/_internal/vc-blade-toolbar-buttons/_internal/vc-blade-toolbar-button/vc-blade-toolbar-circle-button.vue.d.ts.map +1 -1
  77. package/dist/ui/components/organisms/vc-blade/vc-blade.backupsb.d.ts +3 -3
  78. package/dist/ui/components/organisms/vc-blade/vc-blade.vue.d.ts +1 -1
  79. package/dist/ui/components/organisms/vc-blade/vc-blade.vue.d.ts.map +1 -1
  80. package/dist/ui/components/organisms/vc-dynamic-property/vc-dynamic-property.vue.d.ts.map +1 -1
  81. package/dist/ui/components/organisms/vc-gallery/_internal/vc-gallery-item/vc-gallery-item.vue.d.ts +2 -2
  82. package/dist/ui/components/organisms/vc-gallery/_internal/vc-gallery-preview/vc-gallery-preview.vue.d.ts +1 -1
  83. package/dist/ui/components/organisms/vc-gallery/_internal/vc-gallery-preview/vc-gallery-preview.vue.d.ts.map +1 -1
  84. package/dist/ui/components/organisms/vc-gallery/vc-gallery.vue.d.ts +3 -3
  85. package/dist/ui/components/organisms/vc-gallery/vc-gallery.vue.d.ts.map +1 -1
  86. package/dist/ui/components/organisms/vc-popup/vc-popup.vue.d.ts +1 -1
  87. package/dist/ui/components/organisms/vc-popup/vc-popup.vue.d.ts.map +1 -1
  88. package/dist/ui/components/organisms/vc-table/_internal/vc-table-counter/vc-table-counter.vue.d.ts +1 -1
  89. package/dist/ui/components/organisms/vc-table/_internal/vc-table-counter/vc-table-counter.vue.d.ts.map +1 -1
  90. package/package.json +4 -4
  91. package/shared/components/blade-navigation/composables/useBladeNavigation/index.ts +199 -597
  92. package/shared/components/blade-navigation/composables/useBladeNavigation/internal/bladeActions.ts +151 -0
  93. package/shared/components/blade-navigation/composables/useBladeNavigation/internal/bladeRouteResolver.ts +243 -0
  94. package/shared/components/blade-navigation/composables/useBladeNavigation/internal/bladeState.ts +93 -0
  95. package/shared/components/blade-navigation/composables/useBladeNavigation/internal/bladeWatchers.ts +90 -0
  96. package/shared/components/blade-navigation/composables/useBladeNavigation/internal/routerUtils.ts +150 -0
  97. package/shared/components/blade-navigation/plugin.ts +17 -12
  98. package/shared/components/blade-navigation/types/index.ts +2 -4
  99. package/shared/components/notification-template/notification-template.vue +2 -2
  100. package/shared/modules/dynamic/index.ts +2 -8
  101. package/ui/components/molecules/vc-input-dropdown/vc-input-dropdown.vue +4 -0
  102. package/ui/components/organisms/vc-app/vc-app.vue +11 -6
  103. package/ui/components/organisms/vc-dynamic-property/vc-dynamic-property.vue +10 -1
  104. package/dist/apl-B2DGVGxc.js +0 -76
  105. package/dist/asciiarmor-2LVJmxlE.js +0 -34
  106. package/dist/asn1-jKiBa2Ya.js +0 -95
  107. package/dist/asterisk-DS281yxp.js +0 -271
  108. package/dist/brainfuck-C_p9pTT8.js +0 -34
  109. package/dist/clike-DGTaUp48.js +0 -620
  110. package/dist/clojure-CCKyeQKf.js +0 -800
  111. package/dist/cmake-CuaCgAKt.js +0 -28
  112. package/dist/cobol-BlTKFDRj.js +0 -72
  113. package/dist/coffeescript-BVCvwO8I.js +0 -179
  114. package/dist/commonlisp-D_kxz07b.js +0 -75
  115. package/dist/crystal-D309uH6_.js +0 -217
  116. package/dist/css-BkF-NPzE.js +0 -1553
  117. package/dist/cypher-BMq4Fwjl.js +0 -68
  118. package/dist/d-BZcgY6La.js +0 -127
  119. package/dist/diff-Cg9d_RX2.js +0 -18
  120. package/dist/dockerfile-DIy8NleC.js +0 -194
  121. package/dist/dtd-CtLokQ-U.js +0 -84
  122. package/dist/dylan-QYeExnWK.js +0 -234
  123. package/dist/ebnf-DUPDuY4r.js +0 -78
  124. package/dist/ecl-CiXN-g_D.js +0 -121
  125. package/dist/eiffel-yQhjl4T1.js +0 -110
  126. package/dist/elm-CNT9vbN0.js +0 -108
  127. package/dist/erlang-CFOYdy9e.js +0 -487
  128. package/dist/factor-DDOC7X6P.js +0 -65
  129. package/dist/fcl-CPC2WYrI.js +0 -103
  130. package/dist/forth-BmxRyE9S.js +0 -60
  131. package/dist/fortran-9bvPyrOW.js +0 -442
  132. package/dist/framework.js +0 -290
  133. package/dist/gas-cpmYfFX2.js +0 -183
  134. package/dist/gherkin-CJuwpceU.js +0 -34
  135. package/dist/groovy-DZeT_VM-.js +0 -146
  136. package/dist/haskell-Bvt3Qq1t.js +0 -375
  137. package/dist/haxe-70NVW1pR.js +0 -359
  138. package/dist/http-D9LttvKF.js +0 -44
  139. package/dist/idl-B6TRFYjl.js +0 -947
  140. package/dist/index-0xMdBsaq.js +0 -611
  141. package/dist/index-B6RKUVy8.js +0 -134
  142. package/dist/index-BXAxQnpt.js +0 -71
  143. package/dist/index-Ba3wq-Du.js +0 -147479
  144. package/dist/index-BgMVbUF5.js +0 -249
  145. package/dist/index-CE1KKIYQ.js +0 -268
  146. package/dist/index-CSMBCpee.js +0 -75
  147. package/dist/index-DCiQjA10.js +0 -58
  148. package/dist/index-DLIwas3l.js +0 -93
  149. package/dist/index-DwOkUUXE.js +0 -288
  150. package/dist/index-DwsB54rD.js +0 -308
  151. package/dist/index-Dyg1bSFn.js +0 -341
  152. package/dist/index-GpoS3tMh.js +0 -137
  153. package/dist/index-J_8wNmd3.js +0 -98
  154. package/dist/index-VLNTEhMQ.js +0 -156
  155. package/dist/index-WZKioztF.js +0 -299
  156. package/dist/index-_7O686wp.js +0 -538
  157. package/dist/index.css +0 -9
  158. package/dist/javascript-C2yteZeJ.js +0 -691
  159. package/dist/jinja2-DnB6dQmV.js +0 -154
  160. package/dist/julia-DpvXAuO6.js +0 -241
  161. package/dist/livescript-CanGTf8u.js +0 -272
  162. package/dist/lua-XplVlWi_.js +0 -217
  163. package/dist/mathematica-jaRHnSxC.js +0 -35
  164. package/dist/mbox-BctzC1hL.js +0 -76
  165. package/dist/mirc-CFBPAOaF.js +0 -72
  166. package/dist/mllike-BSnXJBGA.js +0 -272
  167. package/dist/modelica-vUgVs--1.js +0 -93
  168. package/dist/mscgen-Cpl0NYLN.js +0 -104
  169. package/dist/mumps-CQoS1kWX.js +0 -25
  170. package/dist/nginx-zDPm3Z74.js +0 -89
  171. package/dist/nsis-fePjrhq7.js +0 -62
  172. package/dist/ntriples-CsNjv2QF.js +0 -79
  173. package/dist/octave-C8PmmSRH.js +0 -143
  174. package/dist/oz-Ce8aN8oE.js +0 -151
  175. package/dist/pascal-De0D6mP7.js +0 -77
  176. package/dist/perl-B4bSCe1C.js +0 -915
  177. package/dist/pig-D24Z8EXi.js +0 -54
  178. package/dist/powershell-DkYVfTzP.js +0 -249
  179. package/dist/properties-Dn9wna3M.js +0 -26
  180. package/dist/protobuf-BPIjwpzm.js +0 -49
  181. package/dist/pug-CwAQJzGR.js +0 -248
  182. package/dist/puppet-nyd4dhjf.js +0 -45
  183. package/dist/python-BkR3uSy8.js +0 -313
  184. package/dist/q-DXjKs-tC.js +0 -83
  185. package/dist/r-LKEuhEGI.js +0 -104
  186. package/dist/rpm-IznJm2Xc.js +0 -57
  187. package/dist/ruby-CcYfvIk6.js +0 -228
  188. package/dist/sas-7E8yHoCW.js +0 -105
  189. package/dist/scheme-DjibxsNh.js +0 -124
  190. package/dist/shared/modules/dynamic/components/fields/storybook/pages/DynamicRender.d.ts +0 -110
  191. package/dist/shared/modules/dynamic/components/fields/storybook/pages/DynamicRender.d.ts.map +0 -1
  192. package/dist/shared/modules/dynamic/pages/dynamic-blade-form.vue.d.ts +0 -147
  193. package/dist/shared/modules/dynamic/pages/dynamic-blade-form.vue.d.ts.map +0 -1
  194. package/dist/shell-C0C2sNA_.js +0 -182
  195. package/dist/sieve-Bwz7vjP5.js +0 -72
  196. package/dist/simple-mode-B0dvCdAA.js +0 -89
  197. package/dist/smalltalk-Bhddl2pB.js +0 -48
  198. package/dist/solr-BNlsLglM.js +0 -41
  199. package/dist/sparql-FarWu_Gb.js +0 -197
  200. package/dist/spreadsheet-C-cy4P5N.js +0 -49
  201. package/dist/sql-CfG5lQ3l.js +0 -282
  202. package/dist/stex-Du4h4KAU.js +0 -129
  203. package/dist/stylus-CAdqWld3.js +0 -250
  204. package/dist/swift-DSxqR9R6.js +0 -230
  205. package/dist/tcl-xfoLljhY.js +0 -81
  206. package/dist/textile-D1AWE-pc.js +0 -295
  207. package/dist/tiddlywiki-5wqsXtSk.js +0 -155
  208. package/dist/tiki-__Kn3CeS.js +0 -181
  209. package/dist/toml-BHiuTcfn.js +0 -49
  210. package/dist/troff-D2UO-fKf.js +0 -35
  211. package/dist/ttcn-Bsa4sfRm.js +0 -123
  212. package/dist/ttcn-cfg-Bac_acMi.js +0 -88
  213. package/dist/turtle-xwJUxoPV.js +0 -80
  214. package/dist/vb-c2kQGd6-.js +0 -74
  215. package/dist/vbscript-1f_Dhg5H.js +0 -324
  216. package/dist/velocity-DJd0pTTC.js +0 -96
  217. package/dist/verilog-CiS1jyi5.js +0 -262
  218. package/dist/vhdl-T9HkrbI2.js +0 -106
  219. package/dist/webidl-CjfDENEo.js +0 -155
  220. package/dist/xquery-BUQdORAS.js +0 -422
  221. package/dist/yacas-C0absKBh.js +0 -73
  222. package/dist/z80-Pki2zAjW.js +0 -61
package/CHANGELOG.md CHANGED
@@ -1,3 +1,24 @@
1
+ ## [1.1.23](https://github.com/VirtoCommerce/vc-shell/compare/v1.1.22...v1.1.23) (2025-05-29)
2
+
3
+
4
+ ### Features
5
+
6
+ * **blade-navigation:** implement blade registry and enhance navigation functionality with state management and routing utilities ([ab76268](https://github.com/VirtoCommerce/vc-shell/commit/ab762680f03e1c2a130ff802b8fbbbbf96e7b86a))
7
+ * **blade-registry:** integrate Blade Registry into the application, enhance error handling for main route validation, and update notification component types for improved type safety ([2535a78](https://github.com/VirtoCommerce/vc-shell/commit/2535a78be870edaf4f563aa69dd0f76b2a6729a5))
8
+ * **useAppInsights:** enhance app insights integration with page tracking and expose appInsights instance ([603c2b8](https://github.com/VirtoCommerce/vc-shell/commit/603c2b81b82a320209ba5da7685fd36f2797074d))
9
+ * **useDynamicProperties:** refactor dynamic properties composable with improved type definitions and utility functions; enhance vc-input-dropdown and vc-dynamic-property components for multilingual support ([4e13175](https://github.com/VirtoCommerce/vc-shell/commit/4e1317545c59cf3aeeaf9141a3f395825c04d285))
10
+
11
+
12
+
13
+ ## [1.1.22](https://github.com/VirtoCommerce/vc-shell/compare/v1.1.21...v1.1.22) (2025-05-28)
14
+
15
+
16
+ ### Features
17
+
18
+ * **useKeyboardNavigation:** add validation for focused index and improve focus handling ([9f403f1](https://github.com/VirtoCommerce/vc-shell/commit/9f403f181d27497e9090ac52f6c256e2de387c3f))
19
+
20
+
21
+
1
22
  ## [1.1.21](https://github.com/VirtoCommerce/vc-shell/compare/v1.1.20...v1.1.21) (2025-05-28)
2
23
 
3
24
 
@@ -2,8 +2,17 @@ import { inject } from "vue";
2
2
  import { AppInsightsPluginOptions, useAppInsights as useInsights } from "vue3-application-insights";
3
3
  import { generateW3CId } from "@microsoft/applicationinsights-core-js";
4
4
  import { useUser } from "./../useUser";
5
+ import { ApplicationInsights, Snippet } from "@microsoft/applicationinsights-web";
5
6
 
6
- export function useAppInsights() {
7
+ export interface IUseAppInsights {
8
+ setupPageTracking: {
9
+ beforeEach: (route: { name: string }) => void;
10
+ afterEach: (route: { name: string; fullPath: string }) => void;
11
+ };
12
+ appInsights: ApplicationInsights;
13
+ }
14
+
15
+ export function useAppInsights(): IUseAppInsights {
7
16
  const appInsights = useInsights();
8
17
  const { user } = useUser();
9
18
  const appInsightsOptions = inject<AppInsightsPluginOptions>("appInsightsOptions");
@@ -40,5 +49,6 @@ export function useAppInsights() {
40
49
 
41
50
  return {
42
51
  setupPageTracking: setupPageTracking(),
52
+ appInsights,
43
53
  };
44
54
  }
@@ -0,0 +1,176 @@
1
+ import { App, inject, shallowRef, computed, ComputedRef, readonly as vueReadonly } from "vue";
2
+ import { BladeInstanceConstructor } from "../../../shared/components/blade-navigation/types";
3
+
4
+ /**
5
+ * Interface for blade registration data
6
+ */
7
+ export interface IBladeRegistrationData {
8
+ component: BladeInstanceConstructor;
9
+ route?: string;
10
+ isWorkspace?: boolean;
11
+ // ... other metadata
12
+ }
13
+
14
+ /**
15
+ * Injection key for provide/inject pattern
16
+ */
17
+ export const BladeRegistryKey = Symbol("BladeRegistry");
18
+
19
+ /**
20
+ * Public interface for blade registry
21
+ */
22
+ export interface IBladeRegistry {
23
+ /** Readonly map of all registered blades */
24
+ readonly registeredBladesMap: ComputedRef<ReadonlyMap<string, IBladeRegistrationData>>;
25
+ /** Get blade registration data by name */
26
+ getBlade: (name: string) => IBladeRegistrationData | undefined;
27
+ /** Get blade component by name */
28
+ getBladeComponent: (name: string) => BladeInstanceConstructor | undefined;
29
+ }
30
+
31
+ /**
32
+ * Extended interface for blade registry instance with internal registration function
33
+ */
34
+ export interface IBladeRegistryInstance extends IBladeRegistry {
35
+ _registerBladeFn: (name: string, registrationData: IBladeRegistrationData) => void;
36
+ }
37
+
38
+ /**
39
+ * Validates if a component is a valid blade component
40
+ */
41
+ function isValidBladeComponent(component: unknown): component is BladeInstanceConstructor {
42
+ if (!component || (typeof component !== "function" && typeof component !== "object")) {
43
+ return false;
44
+ }
45
+
46
+ // Additional validation for blade-specific properties could be added here
47
+ // For now, we accept any function or object that could be a Vue component
48
+ return true;
49
+ }
50
+
51
+ /**
52
+ * Creates a blade registry instance
53
+ * This function should be called once during application initialization
54
+ *
55
+ * @param app - Vue application instance
56
+ * @returns Blade registry instance with registration capabilities
57
+ */
58
+ export function createBladeRegistry(app: App): IBladeRegistryInstance {
59
+ const registeredBladesInternal = shallowRef<Map<string, IBladeRegistrationData>>(new Map());
60
+
61
+ /**
62
+ * Registers a blade component in the registry
63
+ *
64
+ * @param name - Unique name for the blade
65
+ * @param registrationData - Blade registration data including component and metadata
66
+ */
67
+ function registerBlade(name: string, registrationData: IBladeRegistrationData): void {
68
+ if (!name || typeof name !== "string") {
69
+ throw new Error("BladeRegistry: Blade name must be a non-empty string");
70
+ }
71
+
72
+ if (!registrationData?.component) {
73
+ throw new Error(`BladeRegistry: Registration data must include a component for blade '${name}'`);
74
+ }
75
+
76
+ if (!isValidBladeComponent(registrationData.component)) {
77
+ throw new Error(`BladeRegistry: Invalid component provided for blade '${name}'`);
78
+ }
79
+
80
+ // Create new map to trigger reactivity
81
+ const newMap = new Map(registeredBladesInternal.value);
82
+
83
+ if (newMap.has(name)) {
84
+ console.warn(`BladeRegistry: Blade '${name}' is already registered. It will be overwritten.`);
85
+ }
86
+
87
+ // Register component globally if not already registered or different
88
+ const existingGlobalComponent = app.component(name);
89
+ if (!existingGlobalComponent || existingGlobalComponent !== registrationData.component) {
90
+ if (existingGlobalComponent && existingGlobalComponent !== registrationData.component) {
91
+ console.warn(
92
+ `BladeRegistry: Global component '${name}' already exists and is different. Overwriting with new blade component.`,
93
+ );
94
+ }
95
+ app.component(name, registrationData.component);
96
+ }
97
+
98
+ newMap.set(name, registrationData);
99
+ registeredBladesInternal.value = newMap;
100
+ }
101
+
102
+ /**
103
+ * Gets blade registration data by name
104
+ *
105
+ * @param name - Blade name
106
+ * @returns Registration data or undefined if not found
107
+ */
108
+ function getBlade(name: string): IBladeRegistrationData | undefined {
109
+ if (!name || typeof name !== "string") {
110
+ return undefined;
111
+ }
112
+ return registeredBladesInternal.value.get(name);
113
+ }
114
+
115
+ /**
116
+ * Gets blade component by name
117
+ * Checks registry first, then falls back to global components
118
+ *
119
+ * @param name - Blade name
120
+ * @returns Blade component or undefined if not found
121
+ */
122
+ function getBladeComponent(name: string): BladeInstanceConstructor | undefined {
123
+ if (!name || typeof name !== "string") {
124
+ return undefined;
125
+ }
126
+
127
+ // First check registry
128
+ const registration = registeredBladesInternal.value.get(name);
129
+ if (registration) {
130
+ return registration.component;
131
+ }
132
+
133
+ // Fallback to global components
134
+ try {
135
+ const globalComponent = app._context.components[name] as BladeInstanceConstructor | undefined;
136
+ if (globalComponent && isValidBladeComponent(globalComponent)) {
137
+ return globalComponent;
138
+ }
139
+ } catch (error) {
140
+ console.warn(`BladeRegistry: Error accessing global component '${name}':`, error);
141
+ }
142
+
143
+ return undefined;
144
+ }
145
+
146
+ // Cache the readonly map to avoid recreating it on every access
147
+ const readonlyBladesMap = computed(() => vueReadonly(registeredBladesInternal.value));
148
+
149
+ const registryApi: IBladeRegistry = {
150
+ registeredBladesMap: readonlyBladesMap,
151
+ getBlade,
152
+ getBladeComponent,
153
+ };
154
+
155
+ return {
156
+ ...registryApi,
157
+ _registerBladeFn: registerBlade,
158
+ };
159
+ }
160
+
161
+ /**
162
+ * Composable function for accessing blade registry
163
+ * Must be used after createBladeRegistry is called and provided with BladeRegistryKey
164
+ *
165
+ * @returns Blade registry interface
166
+ * @throws Error if registry is not available
167
+ */
168
+ export function useBladeRegistry(): IBladeRegistry {
169
+ const registry = inject<IBladeRegistry>(BladeRegistryKey);
170
+ if (!registry) {
171
+ throw new Error(
172
+ "useBladeRegistry must be used after createBladeRegistry is called and provided with BladeRegistryKey.",
173
+ );
174
+ }
175
+ return registry;
176
+ }