@vc-shell/framework 1.1.22 → 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 (220) hide show
  1. package/CHANGELOG.md +12 -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/useLanguages/index.ts +78 -78
  7. package/core/plugins/modularity/index.ts +17 -6
  8. package/core/services/global-search-service/index.ts +36 -0
  9. package/dist/core/composables/useAppInsights/index.d.ts +5 -2
  10. package/dist/core/composables/useAppInsights/index.d.ts.map +1 -1
  11. package/dist/core/composables/useBladeRegistry/index.d.ts +48 -0
  12. package/dist/core/composables/useBladeRegistry/index.d.ts.map +1 -0
  13. package/dist/core/composables/useDynamicProperties/index.d.ts +12 -9
  14. package/dist/core/composables/useDynamicProperties/index.d.ts.map +1 -1
  15. package/dist/core/composables/useErrorHandler/index.d.ts.map +1 -1
  16. package/dist/core/plugins/modularity/index.d.ts.map +1 -1
  17. package/dist/core/services/global-search-service/index.d.ts +10 -0
  18. package/dist/core/services/global-search-service/index.d.ts.map +1 -0
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/shared/components/blade-navigation/composables/useBladeNavigation/index.d.ts +7 -12
  21. package/dist/shared/components/blade-navigation/composables/useBladeNavigation/index.d.ts.map +1 -1
  22. package/dist/shared/components/blade-navigation/composables/useBladeNavigation/internal/bladeActions.d.ts +15 -0
  23. package/dist/shared/components/blade-navigation/composables/useBladeNavigation/internal/bladeActions.d.ts.map +1 -0
  24. package/dist/shared/components/blade-navigation/composables/useBladeNavigation/internal/bladeRouteResolver.d.ts +11 -0
  25. package/dist/shared/components/blade-navigation/composables/useBladeNavigation/internal/bladeRouteResolver.d.ts.map +1 -0
  26. package/dist/shared/components/blade-navigation/composables/useBladeNavigation/internal/bladeState.d.ts +15 -0
  27. package/dist/shared/components/blade-navigation/composables/useBladeNavigation/internal/bladeState.d.ts.map +1 -0
  28. package/dist/shared/components/blade-navigation/composables/useBladeNavigation/internal/bladeWatchers.d.ts +6 -0
  29. package/dist/shared/components/blade-navigation/composables/useBladeNavigation/internal/bladeWatchers.d.ts.map +1 -0
  30. package/dist/shared/components/blade-navigation/composables/useBladeNavigation/internal/routerUtils.d.ts +28 -0
  31. package/dist/shared/components/blade-navigation/composables/useBladeNavigation/internal/routerUtils.d.ts.map +1 -0
  32. package/dist/shared/components/blade-navigation/plugin.d.ts.map +1 -1
  33. package/dist/shared/components/blade-navigation/types/index.d.ts +5 -5
  34. package/dist/shared/components/blade-navigation/types/index.d.ts.map +1 -1
  35. package/dist/shared/components/notification-template/notification-template.vue.d.ts +2 -2
  36. package/dist/shared/components/notification-template/notification-template.vue.d.ts.map +1 -1
  37. package/dist/shared/components/notifications/components/notification-container/index.d.ts +6 -6
  38. package/dist/shared/components/notifications/components/notification-container/index.d.ts.map +1 -1
  39. package/dist/shared/modules/assets-manager/components/assets-manager/assets-manager.vue.d.ts +2 -2
  40. package/dist/shared/modules/dynamic/index.d.ts.map +1 -1
  41. package/dist/shared/modules/dynamic/pages/dynamic-blade-list.vue.d.ts +2 -2
  42. package/dist/shared/pages/InvitePage/components/invite/Invite.vue.d.ts +1 -1
  43. package/dist/shared/pages/InvitePage/components/invite/Invite.vue.d.ts.map +1 -1
  44. package/dist/shared/pages/ResetPasswordPage/components/reset-password/ResetPassword.vue.d.ts +1 -1
  45. package/dist/shared/pages/ResetPasswordPage/components/reset-password/ResetPassword.vue.d.ts.map +1 -1
  46. package/dist/tsconfig.tsbuildinfo +1 -1
  47. package/dist/ui/components/atoms/vc-badge/vc-badge.vue.d.ts +1 -1
  48. package/dist/ui/components/atoms/vc-badge/vc-badge.vue.d.ts.map +1 -1
  49. package/dist/ui/components/atoms/vc-container/vc-container.vue.d.ts +2 -2
  50. package/dist/ui/components/atoms/vc-icon/vc-icon.vue.d.ts +1 -1
  51. package/dist/ui/components/atoms/vc-icon/vc-icon.vue.d.ts.map +1 -1
  52. package/dist/ui/components/atoms/vc-icon/vc-material-icon.vue.d.ts +1 -1
  53. package/dist/ui/components/atoms/vc-icon/vc-material-icon.vue.d.ts.map +1 -1
  54. package/dist/ui/components/atoms/vc-progress/vc-progress.vue.d.ts +1 -1
  55. package/dist/ui/components/atoms/vc-progress/vc-progress.vue.d.ts.map +1 -1
  56. package/dist/ui/components/molecules/vc-editor/vc-editor.vue.d.ts +2 -2
  57. package/dist/ui/components/molecules/vc-file-upload/vc-file-upload.vue.d.ts +2 -2
  58. package/dist/ui/components/molecules/vc-file-upload/vc-file-upload.vue.d.ts.map +1 -1
  59. package/dist/ui/components/molecules/vc-input/vc-input.vue.d.ts +2 -2
  60. package/dist/ui/components/molecules/vc-input/vc-input.vue.d.ts.map +1 -1
  61. package/dist/ui/components/molecules/vc-input-dropdown/vc-input-dropdown.vue.d.ts +2 -0
  62. package/dist/ui/components/molecules/vc-input-dropdown/vc-input-dropdown.vue.d.ts.map +1 -1
  63. package/dist/ui/components/molecules/vc-pagination/vc-pagination.vue.d.ts +1 -1
  64. package/dist/ui/components/molecules/vc-pagination/vc-pagination.vue.d.ts.map +1 -1
  65. package/dist/ui/components/molecules/vc-rating/vc-rating.vue.d.ts +1 -1
  66. package/dist/ui/components/molecules/vc-rating/vc-rating.vue.d.ts.map +1 -1
  67. 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
  68. 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
  69. package/dist/ui/components/organisms/vc-app/vc-app.vue.d.ts.map +1 -1
  70. 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
  71. 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
  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-button.vue.d.ts.map +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-circle-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-circle-button.vue.d.ts.map +1 -1
  75. package/dist/ui/components/organisms/vc-blade/vc-blade.backupsb.d.ts +3 -3
  76. package/dist/ui/components/organisms/vc-blade/vc-blade.vue.d.ts +1 -1
  77. package/dist/ui/components/organisms/vc-blade/vc-blade.vue.d.ts.map +1 -1
  78. package/dist/ui/components/organisms/vc-dynamic-property/vc-dynamic-property.vue.d.ts.map +1 -1
  79. package/dist/ui/components/organisms/vc-gallery/_internal/vc-gallery-item/vc-gallery-item.vue.d.ts +2 -2
  80. package/dist/ui/components/organisms/vc-gallery/_internal/vc-gallery-preview/vc-gallery-preview.vue.d.ts +1 -1
  81. package/dist/ui/components/organisms/vc-gallery/_internal/vc-gallery-preview/vc-gallery-preview.vue.d.ts.map +1 -1
  82. package/dist/ui/components/organisms/vc-gallery/vc-gallery.vue.d.ts +3 -3
  83. package/dist/ui/components/organisms/vc-gallery/vc-gallery.vue.d.ts.map +1 -1
  84. package/dist/ui/components/organisms/vc-popup/vc-popup.vue.d.ts +1 -1
  85. package/dist/ui/components/organisms/vc-popup/vc-popup.vue.d.ts.map +1 -1
  86. package/dist/ui/components/organisms/vc-table/_internal/vc-table-counter/vc-table-counter.vue.d.ts +1 -1
  87. package/dist/ui/components/organisms/vc-table/_internal/vc-table-counter/vc-table-counter.vue.d.ts.map +1 -1
  88. package/package.json +4 -4
  89. package/shared/components/blade-navigation/composables/useBladeNavigation/index.ts +199 -597
  90. package/shared/components/blade-navigation/composables/useBladeNavigation/internal/bladeActions.ts +151 -0
  91. package/shared/components/blade-navigation/composables/useBladeNavigation/internal/bladeRouteResolver.ts +243 -0
  92. package/shared/components/blade-navigation/composables/useBladeNavigation/internal/bladeState.ts +93 -0
  93. package/shared/components/blade-navigation/composables/useBladeNavigation/internal/bladeWatchers.ts +90 -0
  94. package/shared/components/blade-navigation/composables/useBladeNavigation/internal/routerUtils.ts +150 -0
  95. package/shared/components/blade-navigation/plugin.ts +17 -12
  96. package/shared/components/blade-navigation/types/index.ts +2 -4
  97. package/shared/components/notification-template/notification-template.vue +2 -2
  98. package/shared/modules/dynamic/index.ts +2 -8
  99. package/ui/components/molecules/vc-input-dropdown/vc-input-dropdown.vue +4 -0
  100. package/ui/components/organisms/vc-app/vc-app.vue +11 -6
  101. package/ui/components/organisms/vc-dynamic-property/vc-dynamic-property.vue +10 -1
  102. package/dist/apl-B2DGVGxc.js +0 -76
  103. package/dist/asciiarmor-2LVJmxlE.js +0 -34
  104. package/dist/asn1-jKiBa2Ya.js +0 -95
  105. package/dist/asterisk-DS281yxp.js +0 -271
  106. package/dist/brainfuck-C_p9pTT8.js +0 -34
  107. package/dist/clike-DGTaUp48.js +0 -620
  108. package/dist/clojure-CCKyeQKf.js +0 -800
  109. package/dist/cmake-CuaCgAKt.js +0 -28
  110. package/dist/cobol-BlTKFDRj.js +0 -72
  111. package/dist/coffeescript-BVCvwO8I.js +0 -179
  112. package/dist/commonlisp-D_kxz07b.js +0 -75
  113. package/dist/crystal-D309uH6_.js +0 -217
  114. package/dist/css-BkF-NPzE.js +0 -1553
  115. package/dist/cypher-BMq4Fwjl.js +0 -68
  116. package/dist/d-BZcgY6La.js +0 -127
  117. package/dist/diff-Cg9d_RX2.js +0 -18
  118. package/dist/dockerfile-DIy8NleC.js +0 -194
  119. package/dist/dtd-CtLokQ-U.js +0 -84
  120. package/dist/dylan-QYeExnWK.js +0 -234
  121. package/dist/ebnf-DUPDuY4r.js +0 -78
  122. package/dist/ecl-CiXN-g_D.js +0 -121
  123. package/dist/eiffel-yQhjl4T1.js +0 -110
  124. package/dist/elm-CNT9vbN0.js +0 -108
  125. package/dist/erlang-CFOYdy9e.js +0 -487
  126. package/dist/factor-DDOC7X6P.js +0 -65
  127. package/dist/fcl-CPC2WYrI.js +0 -103
  128. package/dist/forth-BmxRyE9S.js +0 -60
  129. package/dist/fortran-9bvPyrOW.js +0 -442
  130. package/dist/framework.js +0 -290
  131. package/dist/gas-cpmYfFX2.js +0 -183
  132. package/dist/gherkin-CJuwpceU.js +0 -34
  133. package/dist/groovy-DZeT_VM-.js +0 -146
  134. package/dist/haskell-Bvt3Qq1t.js +0 -375
  135. package/dist/haxe-70NVW1pR.js +0 -359
  136. package/dist/http-D9LttvKF.js +0 -44
  137. package/dist/idl-B6TRFYjl.js +0 -947
  138. package/dist/index--F0eI_oT.js +0 -75
  139. package/dist/index--KQZx7Nr.js +0 -341
  140. package/dist/index-BAngL0ix.js +0 -299
  141. package/dist/index-BQtOyLub.js +0 -58
  142. package/dist/index-Bf4s6An9.js +0 -308
  143. package/dist/index-BxrA7EzT.js +0 -288
  144. package/dist/index-C-y5H4_R.js +0 -147509
  145. package/dist/index-C_zSZ2pX.js +0 -611
  146. package/dist/index-DFdFt54f.js +0 -71
  147. package/dist/index-DI3UVoln.js +0 -93
  148. package/dist/index-DL0-yUXC.js +0 -538
  149. package/dist/index-DoHQrH4a.js +0 -98
  150. package/dist/index-DqDgL4W3.js +0 -156
  151. package/dist/index-DwjKpYAo.js +0 -137
  152. package/dist/index-d16x5dY_.js +0 -268
  153. package/dist/index-wjw1DwqR.js +0 -134
  154. package/dist/index-xCbUzsUb.js +0 -249
  155. package/dist/index.css +0 -9
  156. package/dist/javascript-C2yteZeJ.js +0 -691
  157. package/dist/jinja2-DnB6dQmV.js +0 -154
  158. package/dist/julia-DpvXAuO6.js +0 -241
  159. package/dist/livescript-CanGTf8u.js +0 -272
  160. package/dist/lua-XplVlWi_.js +0 -217
  161. package/dist/mathematica-jaRHnSxC.js +0 -35
  162. package/dist/mbox-BctzC1hL.js +0 -76
  163. package/dist/mirc-CFBPAOaF.js +0 -72
  164. package/dist/mllike-BSnXJBGA.js +0 -272
  165. package/dist/modelica-vUgVs--1.js +0 -93
  166. package/dist/mscgen-Cpl0NYLN.js +0 -104
  167. package/dist/mumps-CQoS1kWX.js +0 -25
  168. package/dist/nginx-zDPm3Z74.js +0 -89
  169. package/dist/nsis-fePjrhq7.js +0 -62
  170. package/dist/ntriples-CsNjv2QF.js +0 -79
  171. package/dist/octave-C8PmmSRH.js +0 -143
  172. package/dist/oz-Ce8aN8oE.js +0 -151
  173. package/dist/pascal-De0D6mP7.js +0 -77
  174. package/dist/perl-B4bSCe1C.js +0 -915
  175. package/dist/pig-D24Z8EXi.js +0 -54
  176. package/dist/powershell-DkYVfTzP.js +0 -249
  177. package/dist/properties-Dn9wna3M.js +0 -26
  178. package/dist/protobuf-BPIjwpzm.js +0 -49
  179. package/dist/pug-CwAQJzGR.js +0 -248
  180. package/dist/puppet-nyd4dhjf.js +0 -45
  181. package/dist/python-BkR3uSy8.js +0 -313
  182. package/dist/q-DXjKs-tC.js +0 -83
  183. package/dist/r-LKEuhEGI.js +0 -104
  184. package/dist/rpm-IznJm2Xc.js +0 -57
  185. package/dist/ruby-CcYfvIk6.js +0 -228
  186. package/dist/sas-7E8yHoCW.js +0 -105
  187. package/dist/scheme-DjibxsNh.js +0 -124
  188. package/dist/shared/modules/dynamic/components/fields/storybook/pages/DynamicRender.d.ts +0 -110
  189. package/dist/shared/modules/dynamic/components/fields/storybook/pages/DynamicRender.d.ts.map +0 -1
  190. package/dist/shared/modules/dynamic/pages/dynamic-blade-form.vue.d.ts +0 -147
  191. package/dist/shared/modules/dynamic/pages/dynamic-blade-form.vue.d.ts.map +0 -1
  192. package/dist/shell-C0C2sNA_.js +0 -182
  193. package/dist/sieve-Bwz7vjP5.js +0 -72
  194. package/dist/simple-mode-B0dvCdAA.js +0 -89
  195. package/dist/smalltalk-Bhddl2pB.js +0 -48
  196. package/dist/solr-BNlsLglM.js +0 -41
  197. package/dist/sparql-FarWu_Gb.js +0 -197
  198. package/dist/spreadsheet-C-cy4P5N.js +0 -49
  199. package/dist/sql-CfG5lQ3l.js +0 -282
  200. package/dist/stex-Du4h4KAU.js +0 -129
  201. package/dist/stylus-CAdqWld3.js +0 -250
  202. package/dist/swift-DSxqR9R6.js +0 -230
  203. package/dist/tcl-xfoLljhY.js +0 -81
  204. package/dist/textile-D1AWE-pc.js +0 -295
  205. package/dist/tiddlywiki-5wqsXtSk.js +0 -155
  206. package/dist/tiki-__Kn3CeS.js +0 -181
  207. package/dist/toml-BHiuTcfn.js +0 -49
  208. package/dist/troff-D2UO-fKf.js +0 -35
  209. package/dist/ttcn-Bsa4sfRm.js +0 -123
  210. package/dist/ttcn-cfg-Bac_acMi.js +0 -88
  211. package/dist/turtle-xwJUxoPV.js +0 -80
  212. package/dist/vb-c2kQGd6-.js +0 -74
  213. package/dist/vbscript-1f_Dhg5H.js +0 -324
  214. package/dist/velocity-DJd0pTTC.js +0 -96
  215. package/dist/verilog-CiS1jyi5.js +0 -262
  216. package/dist/vhdl-T9HkrbI2.js +0 -106
  217. package/dist/webidl-CjfDENEo.js +0 -155
  218. package/dist/xquery-BUQdORAS.js +0 -422
  219. package/dist/yacas-C0absKBh.js +0 -73
  220. package/dist/z80-Pki2zAjW.js +0 -61
package/CHANGELOG.md CHANGED
@@ -1,3 +1,15 @@
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
+
1
13
  ## [1.1.22](https://github.com/VirtoCommerce/vc-shell/compare/v1.1.21...v1.1.22) (2025-05-28)
2
14
 
3
15
 
@@ -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
+ }