@vc-shell/framework 1.1.83-alpha.0 → 1.1.84-alpha.0

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 (33) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/core/api/virtocommerce.platform.ts +10457 -0
  3. package/core/plugins/extension-points/ExtensionSlot.vue +23 -23
  4. package/core/plugins/modularity/index.ts +0 -1
  5. package/core/plugins/modularity/loader.ts +3 -15
  6. package/dist/core/api/virtocommerce.platform.d.ts +2442 -0
  7. package/dist/core/api/virtocommerce.platform.d.ts.map +1 -0
  8. package/dist/core/plugins/extension-points/ExtensionSlot.vue.d.ts.map +1 -1
  9. package/dist/core/plugins/modularity/index.d.ts +0 -1
  10. package/dist/core/plugins/modularity/index.d.ts.map +1 -1
  11. package/dist/core/plugins/modularity/loader.d.ts +0 -1
  12. package/dist/core/plugins/modularity/loader.d.ts.map +1 -1
  13. package/dist/framework.js +6206 -6260
  14. package/dist/locales/de.json +1 -0
  15. package/dist/locales/en.json +1 -0
  16. package/dist/shared/components/notification-template/notification-template.vue.d.ts +8 -1
  17. package/dist/shared/components/notification-template/notification-template.vue.d.ts.map +1 -1
  18. package/dist/shared/composables/useMenuExpanded.d.ts.map +1 -1
  19. package/dist/shared/pages/LoginPage/components/login/Login.vue.d.ts.map +1 -1
  20. package/dist/tsconfig.tsbuildinfo +1 -1
  21. package/dist/ui/components/molecules/vc-form/vc-form.vue.d.ts +5 -1
  22. package/dist/ui/components/molecules/vc-form/vc-form.vue.d.ts.map +1 -1
  23. package/dist/ui/components/molecules/vc-select/vc-select.vue.d.ts +10 -5
  24. package/dist/ui/components/molecules/vc-select/vc-select.vue.d.ts.map +1 -1
  25. package/package.json +5 -5
  26. package/shared/components/notification-template/notification-template.vue +5 -1
  27. package/shared/composables/useMenuExpanded.ts +13 -2
  28. package/shared/pages/LoginPage/components/login/Login.vue +29 -23
  29. package/ui/components/molecules/vc-form/vc-form.vue +11 -3
  30. package/ui/components/molecules/vc-select/vc-select.vue +21 -2
  31. package/core/plugins/modularity/extensions-helper.ts +0 -209
  32. package/dist/core/plugins/modularity/extensions-helper.d.ts +0 -43
  33. package/dist/core/plugins/modularity/extensions-helper.d.ts.map +0 -1
@@ -2,7 +2,11 @@ declare var __VLS_1: {};
2
2
  type __VLS_Slots = {} & {
3
3
  default?: (props: typeof __VLS_1) => any;
4
4
  };
5
- declare const __VLS_component: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
5
+ declare const __VLS_component: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
6
+ submit: () => any;
7
+ }, string, import("vue").PublicProps, Readonly<{}> & Readonly<{
8
+ onSubmit?: (() => any) | undefined;
9
+ }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
6
10
  declare const _default: __VLS_WithSlots<typeof __VLS_component, __VLS_Slots>;
7
11
  export default _default;
8
12
  type __VLS_WithSlots<T, S> = T & {
@@ -1 +1 @@
1
- {"version":3,"file":"vc-form.vue.d.ts","sourceRoot":"","sources":["../../../../../ui/components/molecules/vc-form/vc-form.vue"],"names":[],"mappings":"AAsBA,QAAA,IAAI,OAAO,IAAW,CAAE;AACxB,KAAK,WAAW,GAAG,EAAE,GACnB;IAAE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,OAAO,KAAK,GAAG,CAAA;CAAE,CAAC;AAkB/C,QAAA,MAAM,eAAe,+QAKnB,CAAC;wBACkB,eAAe,CAAC,OAAO,eAAe,EAAE,WAAW,CAAC;AAAzE,wBAA0E;AAE1E,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAChC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KAEV,CAAA;CACD,CAAC"}
1
+ {"version":3,"file":"vc-form.vue.d.ts","sourceRoot":"","sources":["../../../../../ui/components/molecules/vc-form/vc-form.vue"],"names":[],"mappings":"AAwCA,QAAA,IAAI,OAAO,IAAW,CAAE;AACxB,KAAK,WAAW,GAAG,EAAE,GACnB;IAAE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,OAAO,KAAK,GAAG,CAAA;CAAE,CAAC;AAoB/C,QAAA,MAAM,eAAe;;;;iFAMnB,CAAC;wBACkB,eAAe,CAAC,OAAO,eAAe,EAAE,WAAW,CAAC;AAAzE,wBAA0E;AAE1E,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAChC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KAEV,CAAA;CACD,CAAC"}
@@ -1,6 +1,5 @@
1
1
  import { Placement } from "@floating-ui/vue";
2
2
  export type OptionProp<T> = ((option: T) => string) | string | undefined;
3
- export type MaybeArray<T> = T | T[];
4
3
  declare const _default: <T, P extends {
5
4
  results?: T[];
6
5
  totalCount?: number;
@@ -8,10 +7,13 @@ declare const _default: <T, P extends {
8
7
  props: __VLS_PrettifyLocal<Pick<Partial<{}> & Omit<{
9
8
  readonly onSearch?: ((inputValue: string) => any) | undefined;
10
9
  readonly onClose?: (() => any) | undefined;
11
- readonly "onUpdate:modelValue"?: ((inputValue: MaybeArray<P extends {
10
+ readonly "onUpdate:modelValue"?: ((inputValue: string | string[] | (P extends {
12
11
  results?: T[];
13
12
  totalCount?: number;
14
- } ? T & (Required<P>["results"] extends infer T_1 ? T_1 extends Required<P>["results"] ? T_1 extends (infer V)[] ? V : never : never : never) : T> | MaybeArray<string> | null) => any) | undefined;
13
+ } ? T & (Required<P>["results"] extends infer T_1 ? T_1 extends Required<P>["results"] ? T_1 extends (infer V)[] ? V : never : never : never) : T) | (P extends {
14
+ results?: T[];
15
+ totalCount?: number;
16
+ } ? T & (Required<P>["results"] extends infer T_2 ? T_2 extends Required<P>["results"] ? T_2 extends (infer V)[] ? V : never : never : never) : T)[] | null) => any) | undefined;
15
17
  } & import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, never>, "onClose" | "onUpdate:modelValue" | "onSearch"> & {
16
18
  /**
17
19
  * Name of select
@@ -215,10 +217,13 @@ declare const _default: <T, P extends {
215
217
  }) => any;
216
218
  "no-options": (props: any) => any;
217
219
  };
218
- emit: ((evt: "search", inputValue: string) => void) & ((evt: "close") => void) & ((evt: "update:modelValue", inputValue: MaybeArray<P extends {
220
+ emit: ((evt: "search", inputValue: string) => void) & ((evt: "close") => void) & ((evt: "update:modelValue", inputValue: string | string[] | (P extends {
221
+ results?: T[];
222
+ totalCount?: number;
223
+ } ? T & (Required<P>["results"] extends infer T_3 ? T_3 extends Required<P>["results"] ? T_3 extends (infer V)[] ? V : never : never : never) : T) | (P extends {
219
224
  results?: T[];
220
225
  totalCount?: number;
221
- } ? T & (Required<P>["results"] extends infer T_3 ? T_3 extends Required<P>["results"] ? T_3 extends (infer V)[] ? V : never : never : never) : T> | MaybeArray<string> | null) => void);
226
+ } ? T & (Required<P>["results"] extends infer T_4 ? T_4 extends Required<P>["results"] ? T_4 extends (infer V)[] ? V : never : never : never) : T)[] | null) => void);
222
227
  }>) => import("vue").VNode & {
223
228
  __ctx?: Awaited<typeof __VLS_setup>;
224
229
  };
@@ -1 +1 @@
1
- {"version":3,"file":"vc-select.vue.d.ts","sourceRoot":"","sources":["../../../../../ui/components/molecules/vc-select/vc-select.vue"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"vc-select.vue.d.ts","sourceRoot":"","sources":["../../../../../ui/components/molecules/vc-select/vc-select.vue"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vc-shell/framework",
3
- "version": "1.1.83-alpha.0",
3
+ "version": "1.1.84-alpha.0",
4
4
  "type": "module",
5
5
  "main": "./dist/framework.js",
6
6
  "types": "./dist/index.d.ts",
@@ -90,9 +90,9 @@
90
90
  "@fullhuman/postcss-purgecss": "^7.0.2",
91
91
  "@laynezh/vite-plugin-lib-assets": "v1.1.0",
92
92
  "@types/dompurify": "^3.0.5",
93
- "@vc-shell/api-client-generator": "^1.1.83-alpha.0",
94
- "@vc-shell/config-generator": "^1.1.83-alpha.0",
95
- "@vc-shell/ts-config": "^1.1.83-alpha.0",
93
+ "@vc-shell/api-client-generator": "^1.1.84-alpha.0",
94
+ "@vc-shell/config-generator": "^1.1.84-alpha.0",
95
+ "@vc-shell/ts-config": "^1.1.84-alpha.0",
96
96
  "@vitejs/plugin-vue": "^5.2.3",
97
97
  "@vue/test-utils": "^2.4.5",
98
98
  "cypress-signalr-mock": "^1.5.0",
@@ -112,6 +112,6 @@
112
112
  "access": "public",
113
113
  "registry": "https://registry.npmjs.org/"
114
114
  },
115
- "stableVersion": "1.1.82",
115
+ "stableVersion": "1.1.83",
116
116
  "npmTag": "alpha"
117
117
  }
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <div class="vc-notification-template">
2
+ <div class="vc-notification-template" @click="$emit('click')">
3
3
  <div
4
4
  class="vc-notification-template__container"
5
5
  :class="{
@@ -38,8 +38,12 @@ export interface Props {
38
38
  title: string;
39
39
  notification: IPushNotification;
40
40
  }
41
+ export interface Emits {
42
+ (e: "click"): void;
43
+ }
41
44
 
42
45
  const props = defineProps<Props>();
46
+ const emit = defineEmits<Emits>();
43
47
 
44
48
  const locale = window.navigator.language;
45
49
 
@@ -1,13 +1,24 @@
1
1
  import { useLocalStorage } from "@vueuse/core";
2
2
  import { ref } from "vue";
3
3
 
4
- const STORAGE_KEY = "VC_APP_MENU_EXPANDED";
4
+ const STORAGE_KEY_PREFIX = "VC_APP_MENU_EXPANDED";
5
5
  const HOVER_DELAY = 200;
6
6
 
7
7
  const isHoverExpanded = ref(false);
8
8
 
9
+ /**
10
+ * Get unique storage key for current application based on URL path
11
+ * This ensures each application has its own menu state
12
+ */
13
+ function getStorageKey(): string {
14
+ // Extract app name from pathname (e.g., "/vendor-portal/" -> "vendor-portal")
15
+ const pathSegments = window.location.pathname.split("/").filter(Boolean);
16
+ const appName = pathSegments[0] || "default";
17
+ return `${STORAGE_KEY_PREFIX}_${appName}`;
18
+ }
19
+
9
20
  export const useMenuExpanded = () => {
10
- const isExpanded = useLocalStorage(STORAGE_KEY, true);
21
+ const isExpanded = useLocalStorage(getStorageKey(), true);
11
22
 
12
23
  let expandTimeout: ReturnType<typeof setTimeout> | null = null;
13
24
 
@@ -9,7 +9,7 @@
9
9
  <VcForm @submit.prevent="login">
10
10
  <Field
11
11
  v-slot="{ errorMessage, handleChange, errors }"
12
- :label="t('LOGIN.FIELDS.LOGIN.LABEL')"
12
+ :label="$t('LOGIN.FIELDS.LOGIN.LABEL')"
13
13
  name="username"
14
14
  :model-value="form.username"
15
15
  rules="required"
@@ -18,8 +18,8 @@
18
18
  ref="loginField"
19
19
  v-model="form.username"
20
20
  class="vc-login-page__input"
21
- :label="t('LOGIN.FIELDS.LOGIN.LABEL')"
22
- :placeholder="t('LOGIN.FIELDS.LOGIN.PLACEHOLDER')"
21
+ :label="$t('LOGIN.FIELDS.LOGIN.LABEL')"
22
+ :placeholder="$t('LOGIN.FIELDS.LOGIN.PLACEHOLDER')"
23
23
  required
24
24
  :error="!!errors.length"
25
25
  :error-message="errorMessage"
@@ -28,7 +28,7 @@
28
28
  </Field>
29
29
  <Field
30
30
  v-slot="{ errorMessage, handleChange, errors }"
31
- :label="t('LOGIN.FIELDS.PASSWORD.LABEL')"
31
+ :label="$t('LOGIN.FIELDS.PASSWORD.LABEL')"
32
32
  name="password"
33
33
  :model-value="form.password"
34
34
  rules="required"
@@ -37,8 +37,8 @@
37
37
  ref="passwordField"
38
38
  v-model="form.password"
39
39
  class="vc-login-page__input--small"
40
- :label="t('LOGIN.FIELDS.PASSWORD.LABEL')"
41
- :placeholder="t('LOGIN.FIELDS.PASSWORD.PLACEHOLDER')"
40
+ :label="$t('LOGIN.FIELDS.PASSWORD.LABEL')"
41
+ :placeholder="$t('LOGIN.FIELDS.PASSWORD.PLACEHOLDER')"
42
42
  type="password"
43
43
  required
44
44
  :error="!!errors.length"
@@ -49,7 +49,6 @@
49
49
  </Field>
50
50
 
51
51
  <div
52
- v-if="!!forgotPassword"
53
52
  class="vc-login-page__forgot-password-container"
54
53
  >
55
54
  <VcButton
@@ -57,7 +56,7 @@
57
56
  type="button"
58
57
  @click="togglePassRequest"
59
58
  >
60
- {{ t("LOGIN.FORGOT_PASSWORD_BUTTON") }}
59
+ {{ $t("LOGIN.FORGOT_PASSWORD_BUTTON") }}
61
60
  </VcButton>
62
61
  </div>
63
62
  <div class="vc-login-page__button-container">
@@ -66,7 +65,7 @@
66
65
  class="vc-login-page__submit-button"
67
66
  @click="login"
68
67
  >
69
- {{ t("LOGIN.BUTTON") }}
68
+ {{ $t("LOGIN.BUTTON") }}
70
69
  </vc-button>
71
70
  </div>
72
71
  </VcForm>
@@ -76,24 +75,31 @@
76
75
  >
77
76
  <div class="vc-login-page__separator-line">
78
77
  <!-- TODO add to localization -->
79
- OR
78
+ {{ $t("LOGIN.OR") }}
80
79
  </div>
81
80
 
82
81
  <ExternalProviders :providers="loginProviders" />
83
82
  </div>
84
83
 
85
- <!-- Extensions after form -->
86
84
  <!-- Simple extension slot -->
87
- <div class="vc-login-page__extensions">
85
+ <div
86
+ v-if="hasComponents"
87
+ class="vc-login-page__separator"
88
+ >
89
+ <div class="vc-login-page__separator-line">
90
+ <!-- TODO add to localization -->
91
+ {{ $t("LOGIN.OR") }}
92
+ </div>
93
+
88
94
  <ExtensionSlot name="login-after-form" />
89
95
  </div>
90
96
  </template>
91
97
  <template v-else>
92
98
  <template v-if="!forgotPasswordRequestSent">
93
- <VcForm @submit.prevent="forgot">
99
+ <VcForm>
94
100
  <Field
95
101
  v-slot="{ field, errorMessage, handleChange, errors }"
96
- :label="t('LOGIN.FIELDS.FORGOT_PASSWORD.LABEL')"
102
+ :label="$t('LOGIN.FIELDS.FORGOT_PASSWORD.LABEL')"
97
103
  name="loginOrEmail"
98
104
  :model-value="forgotPasswordForm.loginOrEmail"
99
105
  rules="required|email"
@@ -103,9 +109,9 @@
103
109
  ref="forgotPasswordField"
104
110
  v-model="forgotPasswordForm.loginOrEmail"
105
111
  class="vc-login-page__input"
106
- :label="t('LOGIN.FIELDS.FORGOT_PASSWORD.LABEL')"
107
- :placeholder="t('LOGIN.FIELDS.FORGOT_PASSWORD.PLACEHOLDER')"
108
- :hint="t('LOGIN.RESET_EMAIL_TEXT')"
112
+ :label="$t('LOGIN.FIELDS.FORGOT_PASSWORD.LABEL')"
113
+ :placeholder="$t('LOGIN.FIELDS.FORGOT_PASSWORD.PLACEHOLDER')"
114
+ :hint="$t('LOGIN.RESET_EMAIL_TEXT')"
109
115
  required
110
116
  :error="!!errors.length"
111
117
  :error-message="errorMessage"
@@ -118,20 +124,20 @@
118
124
  type="button"
119
125
  @click="togglePassRequest"
120
126
  >
121
- {{ t("LOGIN.BACK_BUTTON") }}
127
+ {{ $t("LOGIN.BACK_BUTTON") }}
122
128
  </vc-button>
123
129
  <vc-button
124
130
  :disabled="loading || isDisabled || loadingForgotPassword"
125
131
  @click="forgot"
126
132
  >
127
- {{ t("LOGIN.FORGOT_BUTTON") }}
133
+ {{ $t("LOGIN.FORGOT_BUTTON") }}
128
134
  </vc-button>
129
135
  </div>
130
136
  </VcForm>
131
137
  </template>
132
138
 
133
139
  <template v-if="requestPassResult.succeeded && forgotPasswordRequestSent">
134
- <div>{{ t("LOGIN.RESET_EMAIL_SENT") }}</div>
140
+ <div>{{ $t("LOGIN.RESET_EMAIL_SENT") }}</div>
135
141
  <div class="vc-login-page__button-container">
136
142
  <span
137
143
  v-if="$isDesktop.value"
@@ -141,7 +147,7 @@
141
147
  :disabled="loading"
142
148
  @click="togglePassRequest"
143
149
  >
144
- {{ t("LOGIN.BUTTON_OK") }}
150
+ {{ $t("LOGIN.BUTTON_OK") }}
145
151
  </vc-button>
146
152
  </div>
147
153
  </template>
@@ -176,7 +182,7 @@ import { ExternalSignInProviderInfo, SignInResult } from "./../../../../../core/
176
182
  import { useI18n } from "vue-i18n";
177
183
  import { default as ExternalProviders } from "./../../../../../shared/components/sign-in/external-providers.vue";
178
184
  import { useExternalProvider } from "./../../../../../shared/components/sign-in/useExternalProvider";
179
- import { ExtensionSlot } from '../../../../../core/plugins/extension-points';
185
+ import { ExtensionSlot, useExtensionSlot } from '../../../../../core/plugins/extension-points';
180
186
 
181
187
  type ForgotPasswordFunc = (args: { loginOrEmail: string }) => Promise<void>;
182
188
 
@@ -193,13 +199,13 @@ const router = useRouter();
193
199
 
194
200
  const { validateField } = useForm({ validateOnMount: false });
195
201
  const { uiSettings, loading: customizationLoading } = useSettings();
196
- const { t } = useI18n({ useScope: "global" });
197
202
  let useLogin;
198
203
  const signInResult = ref({ succeeded: true }) as Ref<SignInResult & { status?: number; error?: any }>;
199
204
  const requestPassResult = ref<RequestPasswordResult>({ succeeded: true });
200
205
  const forgotPasswordRequestSent = ref(false);
201
206
  const { signIn, loading, user } = useUserManagement();
202
207
  const { getProviders } = useExternalProvider();
208
+ const { hasComponents } = useExtensionSlot('login-after-form');
203
209
 
204
210
  const isLogin = ref(true);
205
211
  const isValid = useIsFormValid();
@@ -1,7 +1,15 @@
1
- <script lang="ts" setup></script>
2
-
3
1
  <template>
4
- <form>
2
+ <form @submit.prevent="submit">
5
3
  <slot>vc-form</slot>
6
4
  </form>
7
5
  </template>
6
+
7
+ <script lang="ts" setup>
8
+ const emit = defineEmits<{
9
+ (e: 'submit'): void;
10
+ }>()
11
+
12
+ const submit = () => {
13
+ emit('submit');
14
+ }
15
+ </script>
@@ -349,7 +349,6 @@ import { useI18n } from "vue-i18n";
349
349
  import { useKeyboardNavigation } from "../../../../core/composables/useKeyboardNavigation";
350
350
 
351
351
  export type OptionProp<T> = ((option: T) => string) | string | undefined;
352
- export type MaybeArray<T> = T | T[];
353
352
  type FloatingInstanceType = UseFloatingReturn & {
354
353
  middlewareData: {
355
354
  sameWidthChangeBorders: {
@@ -572,7 +571,7 @@ const emit = defineEmits<{
572
571
  * Emitted when the component needs to change the model; Is also used by v-model
573
572
  */
574
573
 
575
- "update:modelValue": [inputValue: MaybeArray<Option> | MaybeArray<string> | null];
574
+ "update:modelValue": [inputValue: Option | Option[] | string | string[] | null];
576
575
  /**
577
576
  * Emitted when user wants to filter a value
578
577
  */
@@ -634,6 +633,17 @@ onMounted(() => {
634
633
  { threshold: 0.1 },
635
634
  );
636
635
  rootVisibilityObserver.observe(selectRootRef.value);
636
+
637
+ // Fallback for iframe: check visibility after a delay
638
+ setTimeout(() => {
639
+ if (selectRootRef.value && !isSelectVisible.value) {
640
+ const rect = selectRootRef.value.getBoundingClientRect();
641
+ const isVisible = rect.top < window.innerHeight && rect.bottom > 0 && rect.left < window.innerWidth && rect.right > 0;
642
+ if (isVisible) {
643
+ isSelectVisible.value = true;
644
+ }
645
+ }
646
+ }, 100);
637
647
  }
638
648
  });
639
649
 
@@ -1021,6 +1031,15 @@ const onDropdownClose = async () => {
1021
1031
  function toggleDropdown() {
1022
1032
  if (props.disabled) return;
1023
1033
 
1034
+ // Ensure isSelectVisible is true when opening dropdown (fallback for iframe)
1035
+ if (!isOpened.value && !isSelectVisible.value && selectRootRef.value) {
1036
+ const rect = selectRootRef.value.getBoundingClientRect();
1037
+ const isVisible = rect.top < window.innerHeight && rect.bottom > 0 && rect.left < window.innerWidth && rect.right > 0;
1038
+ if (isVisible) {
1039
+ isSelectVisible.value = true;
1040
+ }
1041
+ }
1042
+
1024
1043
  isOpened.value = !isOpened.value;
1025
1044
 
1026
1045
  if (isOpened.value) {
@@ -1,209 +0,0 @@
1
- import { App, computed, ComputedRef, InjectionKey } from "vue";
2
-
3
- declare module "@vue/runtime-core" {
4
- interface ComponentCustomProperties {
5
- $extensions: ExtensionRegistry;
6
- }
7
- }
8
-
9
- export interface ExtensionPoint {
10
- id: string;
11
- component: unknown;
12
- }
13
-
14
- export interface ComposableFunction {
15
- id: string;
16
- fn: (...args: unknown[]) => unknown;
17
- }
18
-
19
- export type Extension = Record<string, unknown>;
20
-
21
- export interface ExtensionRegistry {
22
- inbound: {
23
- [namespace: string]: {
24
- [extensionPoint: string]: Extension;
25
- };
26
- };
27
- outbound: {
28
- [namespace: string]: {
29
- [extensionPoint: string]: ExtensionPoint[] | ComposableFunction[] | Extension;
30
- };
31
- };
32
- }
33
-
34
- export interface ExtensionNamespace {
35
- [point: string]: ExtensionPoint[] | ComposableFunction[] | Extension;
36
- }
37
-
38
- export interface ExtensionsHelper {
39
- getInboundExtensions(namespace: string, point?: string): Extension;
40
- getOutboundExtensions(point: string): (ExtensionPoint | ComposableFunction | Extension)[];
41
- getModuleExtensions(namespace: string): {
42
- inbound: Record<string, Extension>;
43
- outbound: Record<string, ExtensionPoint[] | ComposableFunction[] | Extension>;
44
- };
45
- extensions: ComputedRef<ExtensionRegistry>;
46
- }
47
-
48
- export const extensionsHelperSymbol = Symbol("extensionsHelper") as InjectionKey<ExtensionsHelper>;
49
-
50
- export function createExtensionsHelper(app: App): ExtensionsHelper {
51
- if (!app.config.globalProperties.$extensions) {
52
- app.config.globalProperties.$extensions = {
53
- inbound: {},
54
- outbound: {},
55
- } as ExtensionRegistry;
56
- }
57
-
58
- const helper: ExtensionsHelper = {
59
- getInboundExtensions(namespace: string, point?: string) {
60
- return point
61
- ? app.config.globalProperties.$extensions.inbound[namespace][point]
62
- : app.config.globalProperties.$extensions.inbound[namespace];
63
- },
64
-
65
- getOutboundExtensions(point: string) {
66
- const result: (ExtensionPoint | ComposableFunction | Extension)[] = [];
67
- Object.values(app.config.globalProperties.$extensions.outbound).forEach((namespace: unknown) => {
68
- const typedNamespace = namespace as ExtensionNamespace;
69
- if (typedNamespace[point]) {
70
- const extension = typedNamespace[point];
71
- if (Array.isArray(extension)) {
72
- result.push(...extension);
73
- } else if (
74
- typeof extension === "object" &&
75
- "id" in extension &&
76
- "fn" in extension &&
77
- typeof extension.fn === "function"
78
- ) {
79
- result.push(extension);
80
- } else if (typeof extension === "object") {
81
- result.push(extension as Extension);
82
- }
83
- }
84
- });
85
-
86
- return result;
87
- },
88
-
89
- getModuleExtensions(namespace: string) {
90
- return {
91
- inbound: app.config.globalProperties.$extensions.inbound[namespace] || {},
92
- outbound: app.config.globalProperties.$extensions.outbound[namespace] || {},
93
- };
94
- },
95
-
96
- extensions: computed(() => app.config.globalProperties.$extensions),
97
- };
98
-
99
- // Provide access to extensions through provide/inject
100
- app.provide(extensionsHelperSymbol, helper);
101
-
102
- // Provide direct access to extensions
103
- app.provide("$extensions", app.config.globalProperties.$extensions);
104
-
105
- return helper;
106
- }
107
-
108
- export function registerModuleExtensions(app: App, moduleId: string, extensions: ExtensionRegistry) {
109
- if (!app.config.globalProperties.$extensions) {
110
- app.config.globalProperties.$extensions = {
111
- inbound: {},
112
- outbound: {},
113
- } as ExtensionRegistry;
114
- }
115
-
116
- const { inbound, outbound } = app.config.globalProperties.$extensions;
117
-
118
- // Register inbound extensions
119
- registerInboundExtensions(inbound, moduleId, extensions);
120
-
121
- // Register outbound extensions
122
- registerOutboundExtensions(outbound, moduleId, extensions);
123
- }
124
-
125
- function registerInboundExtensions(
126
- inbound: ExtensionRegistry["inbound"],
127
- moduleId: string,
128
- extensions: ExtensionRegistry,
129
- ) {
130
- if (!inbound[moduleId]) {
131
- inbound[moduleId] = {};
132
- }
133
-
134
- Object.entries(extensions.inbound || {}).forEach(([point, extension]) => {
135
- if (typeof extension !== "object" || Array.isArray(extension)) {
136
- console.warn(
137
- `Invalid inbound extension type for point "${point}" in module "${moduleId}". Inbound extensions must be objects.`,
138
- );
139
- return;
140
- }
141
-
142
- inbound[moduleId][point] = {
143
- ...(inbound[moduleId][point] || {}),
144
- ...extension,
145
- };
146
- });
147
- }
148
-
149
- function registerOutboundExtensions(
150
- outbound: ExtensionRegistry["outbound"],
151
- moduleId: string,
152
- extensions: ExtensionRegistry,
153
- ) {
154
- if (!outbound[moduleId]) {
155
- outbound[moduleId] = {};
156
- }
157
-
158
- Object.entries(extensions.outbound || {}).forEach(([point, extension]) => {
159
- initializeExtensionPoint(outbound[moduleId], point, extension);
160
- mergeExtension(outbound[moduleId], point, extension);
161
- });
162
- }
163
-
164
- function initializeExtensionPoint(
165
- moduleOutbound: ExtensionRegistry["outbound"][string],
166
- point: string,
167
- extension: ExtensionPoint[] | ComposableFunction | Extension,
168
- ) {
169
- if (!moduleOutbound[point]) {
170
- if (Array.isArray(extension)) {
171
- moduleOutbound[point] = [];
172
- } else if (typeof extension === "object" && "fn" in extension) {
173
- moduleOutbound[point] = [];
174
- } else if (typeof extension === "object") {
175
- moduleOutbound[point] = {};
176
- }
177
- }
178
- }
179
-
180
- function isComposableFunction(value: unknown): value is ComposableFunction {
181
- return (
182
- typeof value === "object" &&
183
- value !== null &&
184
- "id" in value &&
185
- "fn" in value &&
186
- typeof (value as ComposableFunction).fn === "function"
187
- );
188
- }
189
-
190
- function mergeExtension(
191
- moduleOutbound: ExtensionRegistry["outbound"][string],
192
- point: string,
193
- extension: ExtensionPoint[] | ComposableFunction | Extension,
194
- ) {
195
- if (Array.isArray(extension) && Array.isArray(moduleOutbound[point])) {
196
- (moduleOutbound[point] as ExtensionPoint[]).push(...(extension as ExtensionPoint[]));
197
- } else if (isComposableFunction(extension) && Array.isArray(moduleOutbound[point])) {
198
- (moduleOutbound[point] as ComposableFunction[]).push(extension);
199
- } else if (isObjectExtension(extension) && isObjectExtension(moduleOutbound[point])) {
200
- moduleOutbound[point] = {
201
- ...(moduleOutbound[point] as Extension),
202
- ...extension,
203
- };
204
- }
205
- }
206
-
207
- function isObjectExtension(value: unknown): value is Extension {
208
- return typeof value === "object" && !Array.isArray(value);
209
- }
@@ -1,43 +0,0 @@
1
- import { App, ComputedRef, InjectionKey } from "vue";
2
- declare module "@vue/runtime-core" {
3
- interface ComponentCustomProperties {
4
- $extensions: ExtensionRegistry;
5
- }
6
- }
7
- export interface ExtensionPoint {
8
- id: string;
9
- component: unknown;
10
- }
11
- export interface ComposableFunction {
12
- id: string;
13
- fn: (...args: unknown[]) => unknown;
14
- }
15
- export type Extension = Record<string, unknown>;
16
- export interface ExtensionRegistry {
17
- inbound: {
18
- [namespace: string]: {
19
- [extensionPoint: string]: Extension;
20
- };
21
- };
22
- outbound: {
23
- [namespace: string]: {
24
- [extensionPoint: string]: ExtensionPoint[] | ComposableFunction[] | Extension;
25
- };
26
- };
27
- }
28
- export interface ExtensionNamespace {
29
- [point: string]: ExtensionPoint[] | ComposableFunction[] | Extension;
30
- }
31
- export interface ExtensionsHelper {
32
- getInboundExtensions(namespace: string, point?: string): Extension;
33
- getOutboundExtensions(point: string): (ExtensionPoint | ComposableFunction | Extension)[];
34
- getModuleExtensions(namespace: string): {
35
- inbound: Record<string, Extension>;
36
- outbound: Record<string, ExtensionPoint[] | ComposableFunction[] | Extension>;
37
- };
38
- extensions: ComputedRef<ExtensionRegistry>;
39
- }
40
- export declare const extensionsHelperSymbol: InjectionKey<ExtensionsHelper>;
41
- export declare function createExtensionsHelper(app: App): ExtensionsHelper;
42
- export declare function registerModuleExtensions(app: App, moduleId: string, extensions: ExtensionRegistry): void;
43
- //# sourceMappingURL=extensions-helper.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"extensions-helper.d.ts","sourceRoot":"","sources":["../../../../core/plugins/modularity/extensions-helper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAY,WAAW,EAAE,YAAY,EAAE,MAAM,KAAK,CAAC;AAE/D,OAAO,QAAQ,mBAAmB,CAAC;IACjC,UAAU,yBAAyB;QACjC,WAAW,EAAE,iBAAiB,CAAC;KAChC;CACF;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC;CACrC;AAED,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEhD,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE;QACP,CAAC,SAAS,EAAE,MAAM,GAAG;YACnB,CAAC,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;SACrC,CAAC;KACH,CAAC;IACF,QAAQ,EAAE;QACR,CAAC,SAAS,EAAE,MAAM,GAAG;YACnB,CAAC,cAAc,EAAE,MAAM,GAAG,cAAc,EAAE,GAAG,kBAAkB,EAAE,GAAG,SAAS,CAAC;SAC/E,CAAC;KACH,CAAC;CACH;AAED,MAAM,WAAW,kBAAkB;IACjC,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,EAAE,GAAG,kBAAkB,EAAE,GAAG,SAAS,CAAC;CACtE;AAED,MAAM,WAAW,gBAAgB;IAC/B,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnE,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,cAAc,GAAG,kBAAkB,GAAG,SAAS,CAAC,EAAE,CAAC;IAC1F,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG;QACtC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QACnC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,kBAAkB,EAAE,GAAG,SAAS,CAAC,CAAC;KAC/E,CAAC;IACF,UAAU,EAAE,WAAW,CAAC,iBAAiB,CAAC,CAAC;CAC5C;AAED,eAAO,MAAM,sBAAsB,EAAiC,YAAY,CAAC,gBAAgB,CAAC,CAAC;AAEnG,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,GAAG,GAAG,gBAAgB,CAwDjE;AAED,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,iBAAiB,QAejG"}