import { CustomFieldContainerZone, CustomFieldFormTab, CustomFieldFormZone, CustomFieldModel, InjectionZone, NestedRoutePosition, } from "@medusajs/admin-shared" import { ComponentType } from "react" import { LoaderFunction } from "react-router-dom" import { z } from "zod" import { INavItem } from "../components/layout/nav-item" export type RouteExtension = { Component: ComponentType loader?: LoaderFunction handle?: object children?: RouteExtension[] path: string } export type MenuItemExtension = { label: string path: string icon?: ComponentType nested?: NestedRoutePosition rank?: number translationNs?: string } export type WidgetExtension = { Component: ComponentType zone: InjectionZone[] } export type DisplayExtension = { Component: ComponentType<{ data: any }> zone: CustomFieldContainerZone } export type FormFieldExtension = { validation: z.ZodTypeAny Component?: ComponentType label?: string description?: string placeholder?: string } export type FormExtension = { zone: CustomFieldFormZone tab?: CustomFieldFormTab fields: Record } export type ConfigFieldExtension = { defaultValue: ((data: any) => any) | any validation: z.ZodTypeAny } export type ConfigExtension = { zone: CustomFieldFormZone fields: Record } export type I18nExtension = Record> export type LinkModule = { links: Record } export type DisplayModule = { displays: Record } export type FormModule = { customFields: Record< CustomFieldModel, { forms: FormExtension[] configs: ConfigExtension[] } > } export type WidgetModule = { widgets: WidgetExtension[] } export type RouteModule = { routes: RouteExtension[] } export type MenuItemModule = { menuItems: MenuItemExtension[] } export type I18nModule = { resources: I18nExtension } export type MenuItemKey = "coreExtensions" | "settingsExtensions" export type FormField = FormFieldExtension & { name: string } export type TabFieldMap = Map export type ZoneStructure = { components: FormField[] tabs: TabFieldMap } export type FormZoneMap = Map export type FormFieldMap = Map export type ConfigField = ConfigFieldExtension & { name: string } export type ConfigFieldMap = Map< CustomFieldModel, Map > export type DisplayMap = Map< CustomFieldModel, Map[]> > export type MenuMap = Map export type WidgetMap = Map export type DashboardPlugin = { formModule: FormModule displayModule: DisplayModule menuItemModule: MenuItemModule widgetModule: WidgetModule routeModule: RouteModule i18nModule?: I18nModule }