@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.
- package/CHANGELOG.md +21 -0
- package/core/composables/useAppInsights/index.ts +11 -1
- package/core/composables/useBladeRegistry/index.ts +176 -0
- package/core/composables/useDynamicProperties/index.ts +380 -255
- package/core/composables/useErrorHandler/index.ts +2 -3
- package/core/composables/useKeyboardNavigation/index.ts +52 -10
- package/core/composables/useLanguages/index.ts +78 -78
- package/core/plugins/modularity/index.ts +17 -6
- package/core/services/global-search-service/index.ts +36 -0
- package/dist/core/composables/useAppInsights/index.d.ts +5 -2
- package/dist/core/composables/useAppInsights/index.d.ts.map +1 -1
- package/dist/core/composables/useBladeRegistry/index.d.ts +48 -0
- package/dist/core/composables/useBladeRegistry/index.d.ts.map +1 -0
- package/dist/core/composables/useDynamicProperties/index.d.ts +12 -9
- package/dist/core/composables/useDynamicProperties/index.d.ts.map +1 -1
- package/dist/core/composables/useErrorHandler/index.d.ts.map +1 -1
- package/dist/core/composables/useKeyboardNavigation/index.d.ts.map +1 -1
- package/dist/core/plugins/modularity/index.d.ts.map +1 -1
- package/dist/core/services/global-search-service/index.d.ts +10 -0
- package/dist/core/services/global-search-service/index.d.ts.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/shared/components/blade-navigation/composables/useBladeNavigation/index.d.ts +7 -12
- package/dist/shared/components/blade-navigation/composables/useBladeNavigation/index.d.ts.map +1 -1
- package/dist/shared/components/blade-navigation/composables/useBladeNavigation/internal/bladeActions.d.ts +15 -0
- package/dist/shared/components/blade-navigation/composables/useBladeNavigation/internal/bladeActions.d.ts.map +1 -0
- package/dist/shared/components/blade-navigation/composables/useBladeNavigation/internal/bladeRouteResolver.d.ts +11 -0
- package/dist/shared/components/blade-navigation/composables/useBladeNavigation/internal/bladeRouteResolver.d.ts.map +1 -0
- package/dist/shared/components/blade-navigation/composables/useBladeNavigation/internal/bladeState.d.ts +15 -0
- package/dist/shared/components/blade-navigation/composables/useBladeNavigation/internal/bladeState.d.ts.map +1 -0
- package/dist/shared/components/blade-navigation/composables/useBladeNavigation/internal/bladeWatchers.d.ts +6 -0
- package/dist/shared/components/blade-navigation/composables/useBladeNavigation/internal/bladeWatchers.d.ts.map +1 -0
- package/dist/shared/components/blade-navigation/composables/useBladeNavigation/internal/routerUtils.d.ts +28 -0
- package/dist/shared/components/blade-navigation/composables/useBladeNavigation/internal/routerUtils.d.ts.map +1 -0
- package/dist/shared/components/blade-navigation/plugin.d.ts.map +1 -1
- package/dist/shared/components/blade-navigation/types/index.d.ts +5 -5
- package/dist/shared/components/blade-navigation/types/index.d.ts.map +1 -1
- package/dist/shared/components/notification-template/notification-template.vue.d.ts +2 -2
- package/dist/shared/components/notification-template/notification-template.vue.d.ts.map +1 -1
- package/dist/shared/components/notifications/components/notification-container/index.d.ts +6 -6
- package/dist/shared/components/notifications/components/notification-container/index.d.ts.map +1 -1
- package/dist/shared/modules/assets-manager/components/assets-manager/assets-manager.vue.d.ts +2 -2
- package/dist/shared/modules/dynamic/index.d.ts.map +1 -1
- package/dist/shared/modules/dynamic/pages/dynamic-blade-list.vue.d.ts +2 -2
- package/dist/shared/pages/InvitePage/components/invite/Invite.vue.d.ts +1 -1
- package/dist/shared/pages/InvitePage/components/invite/Invite.vue.d.ts.map +1 -1
- package/dist/shared/pages/ResetPasswordPage/components/reset-password/ResetPassword.vue.d.ts +1 -1
- package/dist/shared/pages/ResetPasswordPage/components/reset-password/ResetPassword.vue.d.ts.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/ui/components/atoms/vc-badge/vc-badge.vue.d.ts +1 -1
- package/dist/ui/components/atoms/vc-badge/vc-badge.vue.d.ts.map +1 -1
- package/dist/ui/components/atoms/vc-container/vc-container.vue.d.ts +2 -2
- package/dist/ui/components/atoms/vc-icon/vc-icon.vue.d.ts +1 -1
- package/dist/ui/components/atoms/vc-icon/vc-icon.vue.d.ts.map +1 -1
- package/dist/ui/components/atoms/vc-icon/vc-material-icon.vue.d.ts +1 -1
- package/dist/ui/components/atoms/vc-icon/vc-material-icon.vue.d.ts.map +1 -1
- package/dist/ui/components/atoms/vc-progress/vc-progress.vue.d.ts +1 -1
- package/dist/ui/components/atoms/vc-progress/vc-progress.vue.d.ts.map +1 -1
- package/dist/ui/components/molecules/vc-editor/vc-editor.vue.d.ts +2 -2
- package/dist/ui/components/molecules/vc-file-upload/vc-file-upload.vue.d.ts +2 -2
- package/dist/ui/components/molecules/vc-file-upload/vc-file-upload.vue.d.ts.map +1 -1
- package/dist/ui/components/molecules/vc-input/vc-input.vue.d.ts +2 -2
- package/dist/ui/components/molecules/vc-input/vc-input.vue.d.ts.map +1 -1
- package/dist/ui/components/molecules/vc-input-dropdown/vc-input-dropdown.vue.d.ts +2 -0
- package/dist/ui/components/molecules/vc-input-dropdown/vc-input-dropdown.vue.d.ts.map +1 -1
- package/dist/ui/components/molecules/vc-pagination/vc-pagination.vue.d.ts +1 -1
- package/dist/ui/components/molecules/vc-pagination/vc-pagination.vue.d.ts.map +1 -1
- package/dist/ui/components/molecules/vc-rating/vc-rating.vue.d.ts +1 -1
- package/dist/ui/components/molecules/vc-rating/vc-rating.vue.d.ts.map +1 -1
- 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
- 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
- package/dist/ui/components/organisms/vc-app/vc-app.vue.d.ts.map +1 -1
- 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
- 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
- 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
- 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
- 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
- package/dist/ui/components/organisms/vc-blade/vc-blade.backupsb.d.ts +3 -3
- package/dist/ui/components/organisms/vc-blade/vc-blade.vue.d.ts +1 -1
- package/dist/ui/components/organisms/vc-blade/vc-blade.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-dynamic-property/vc-dynamic-property.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-gallery/_internal/vc-gallery-item/vc-gallery-item.vue.d.ts +2 -2
- package/dist/ui/components/organisms/vc-gallery/_internal/vc-gallery-preview/vc-gallery-preview.vue.d.ts +1 -1
- package/dist/ui/components/organisms/vc-gallery/_internal/vc-gallery-preview/vc-gallery-preview.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-gallery/vc-gallery.vue.d.ts +3 -3
- package/dist/ui/components/organisms/vc-gallery/vc-gallery.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-popup/vc-popup.vue.d.ts +1 -1
- package/dist/ui/components/organisms/vc-popup/vc-popup.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-table/_internal/vc-table-counter/vc-table-counter.vue.d.ts +1 -1
- package/dist/ui/components/organisms/vc-table/_internal/vc-table-counter/vc-table-counter.vue.d.ts.map +1 -1
- package/package.json +4 -4
- package/shared/components/blade-navigation/composables/useBladeNavigation/index.ts +199 -597
- package/shared/components/blade-navigation/composables/useBladeNavigation/internal/bladeActions.ts +151 -0
- package/shared/components/blade-navigation/composables/useBladeNavigation/internal/bladeRouteResolver.ts +243 -0
- package/shared/components/blade-navigation/composables/useBladeNavigation/internal/bladeState.ts +93 -0
- package/shared/components/blade-navigation/composables/useBladeNavigation/internal/bladeWatchers.ts +90 -0
- package/shared/components/blade-navigation/composables/useBladeNavigation/internal/routerUtils.ts +150 -0
- package/shared/components/blade-navigation/plugin.ts +17 -12
- package/shared/components/blade-navigation/types/index.ts +2 -4
- package/shared/components/notification-template/notification-template.vue +2 -2
- package/shared/modules/dynamic/index.ts +2 -8
- package/ui/components/molecules/vc-input-dropdown/vc-input-dropdown.vue +4 -0
- package/ui/components/organisms/vc-app/vc-app.vue +11 -6
- package/ui/components/organisms/vc-dynamic-property/vc-dynamic-property.vue +10 -1
- package/dist/apl-B2DGVGxc.js +0 -76
- package/dist/asciiarmor-2LVJmxlE.js +0 -34
- package/dist/asn1-jKiBa2Ya.js +0 -95
- package/dist/asterisk-DS281yxp.js +0 -271
- package/dist/brainfuck-C_p9pTT8.js +0 -34
- package/dist/clike-DGTaUp48.js +0 -620
- package/dist/clojure-CCKyeQKf.js +0 -800
- package/dist/cmake-CuaCgAKt.js +0 -28
- package/dist/cobol-BlTKFDRj.js +0 -72
- package/dist/coffeescript-BVCvwO8I.js +0 -179
- package/dist/commonlisp-D_kxz07b.js +0 -75
- package/dist/crystal-D309uH6_.js +0 -217
- package/dist/css-BkF-NPzE.js +0 -1553
- package/dist/cypher-BMq4Fwjl.js +0 -68
- package/dist/d-BZcgY6La.js +0 -127
- package/dist/diff-Cg9d_RX2.js +0 -18
- package/dist/dockerfile-DIy8NleC.js +0 -194
- package/dist/dtd-CtLokQ-U.js +0 -84
- package/dist/dylan-QYeExnWK.js +0 -234
- package/dist/ebnf-DUPDuY4r.js +0 -78
- package/dist/ecl-CiXN-g_D.js +0 -121
- package/dist/eiffel-yQhjl4T1.js +0 -110
- package/dist/elm-CNT9vbN0.js +0 -108
- package/dist/erlang-CFOYdy9e.js +0 -487
- package/dist/factor-DDOC7X6P.js +0 -65
- package/dist/fcl-CPC2WYrI.js +0 -103
- package/dist/forth-BmxRyE9S.js +0 -60
- package/dist/fortran-9bvPyrOW.js +0 -442
- package/dist/framework.js +0 -290
- package/dist/gas-cpmYfFX2.js +0 -183
- package/dist/gherkin-CJuwpceU.js +0 -34
- package/dist/groovy-DZeT_VM-.js +0 -146
- package/dist/haskell-Bvt3Qq1t.js +0 -375
- package/dist/haxe-70NVW1pR.js +0 -359
- package/dist/http-D9LttvKF.js +0 -44
- package/dist/idl-B6TRFYjl.js +0 -947
- package/dist/index-0xMdBsaq.js +0 -611
- package/dist/index-B6RKUVy8.js +0 -134
- package/dist/index-BXAxQnpt.js +0 -71
- package/dist/index-Ba3wq-Du.js +0 -147479
- package/dist/index-BgMVbUF5.js +0 -249
- package/dist/index-CE1KKIYQ.js +0 -268
- package/dist/index-CSMBCpee.js +0 -75
- package/dist/index-DCiQjA10.js +0 -58
- package/dist/index-DLIwas3l.js +0 -93
- package/dist/index-DwOkUUXE.js +0 -288
- package/dist/index-DwsB54rD.js +0 -308
- package/dist/index-Dyg1bSFn.js +0 -341
- package/dist/index-GpoS3tMh.js +0 -137
- package/dist/index-J_8wNmd3.js +0 -98
- package/dist/index-VLNTEhMQ.js +0 -156
- package/dist/index-WZKioztF.js +0 -299
- package/dist/index-_7O686wp.js +0 -538
- package/dist/index.css +0 -9
- package/dist/javascript-C2yteZeJ.js +0 -691
- package/dist/jinja2-DnB6dQmV.js +0 -154
- package/dist/julia-DpvXAuO6.js +0 -241
- package/dist/livescript-CanGTf8u.js +0 -272
- package/dist/lua-XplVlWi_.js +0 -217
- package/dist/mathematica-jaRHnSxC.js +0 -35
- package/dist/mbox-BctzC1hL.js +0 -76
- package/dist/mirc-CFBPAOaF.js +0 -72
- package/dist/mllike-BSnXJBGA.js +0 -272
- package/dist/modelica-vUgVs--1.js +0 -93
- package/dist/mscgen-Cpl0NYLN.js +0 -104
- package/dist/mumps-CQoS1kWX.js +0 -25
- package/dist/nginx-zDPm3Z74.js +0 -89
- package/dist/nsis-fePjrhq7.js +0 -62
- package/dist/ntriples-CsNjv2QF.js +0 -79
- package/dist/octave-C8PmmSRH.js +0 -143
- package/dist/oz-Ce8aN8oE.js +0 -151
- package/dist/pascal-De0D6mP7.js +0 -77
- package/dist/perl-B4bSCe1C.js +0 -915
- package/dist/pig-D24Z8EXi.js +0 -54
- package/dist/powershell-DkYVfTzP.js +0 -249
- package/dist/properties-Dn9wna3M.js +0 -26
- package/dist/protobuf-BPIjwpzm.js +0 -49
- package/dist/pug-CwAQJzGR.js +0 -248
- package/dist/puppet-nyd4dhjf.js +0 -45
- package/dist/python-BkR3uSy8.js +0 -313
- package/dist/q-DXjKs-tC.js +0 -83
- package/dist/r-LKEuhEGI.js +0 -104
- package/dist/rpm-IznJm2Xc.js +0 -57
- package/dist/ruby-CcYfvIk6.js +0 -228
- package/dist/sas-7E8yHoCW.js +0 -105
- package/dist/scheme-DjibxsNh.js +0 -124
- package/dist/shared/modules/dynamic/components/fields/storybook/pages/DynamicRender.d.ts +0 -110
- package/dist/shared/modules/dynamic/components/fields/storybook/pages/DynamicRender.d.ts.map +0 -1
- package/dist/shared/modules/dynamic/pages/dynamic-blade-form.vue.d.ts +0 -147
- package/dist/shared/modules/dynamic/pages/dynamic-blade-form.vue.d.ts.map +0 -1
- package/dist/shell-C0C2sNA_.js +0 -182
- package/dist/sieve-Bwz7vjP5.js +0 -72
- package/dist/simple-mode-B0dvCdAA.js +0 -89
- package/dist/smalltalk-Bhddl2pB.js +0 -48
- package/dist/solr-BNlsLglM.js +0 -41
- package/dist/sparql-FarWu_Gb.js +0 -197
- package/dist/spreadsheet-C-cy4P5N.js +0 -49
- package/dist/sql-CfG5lQ3l.js +0 -282
- package/dist/stex-Du4h4KAU.js +0 -129
- package/dist/stylus-CAdqWld3.js +0 -250
- package/dist/swift-DSxqR9R6.js +0 -230
- package/dist/tcl-xfoLljhY.js +0 -81
- package/dist/textile-D1AWE-pc.js +0 -295
- package/dist/tiddlywiki-5wqsXtSk.js +0 -155
- package/dist/tiki-__Kn3CeS.js +0 -181
- package/dist/toml-BHiuTcfn.js +0 -49
- package/dist/troff-D2UO-fKf.js +0 -35
- package/dist/ttcn-Bsa4sfRm.js +0 -123
- package/dist/ttcn-cfg-Bac_acMi.js +0 -88
- package/dist/turtle-xwJUxoPV.js +0 -80
- package/dist/vb-c2kQGd6-.js +0 -74
- package/dist/vbscript-1f_Dhg5H.js +0 -324
- package/dist/velocity-DJd0pTTC.js +0 -96
- package/dist/verilog-CiS1jyi5.js +0 -262
- package/dist/vhdl-T9HkrbI2.js +0 -106
- package/dist/webidl-CjfDENEo.js +0 -155
- package/dist/xquery-BUQdORAS.js +0 -422
- package/dist/yacas-C0absKBh.js +0 -73
- 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
|
|
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
|
+
}
|