UNPKG

@scenemesh/entity-engine

Version:

一个“元数据驱动 + 组件适配 + 动态关系 + 视图管线”式的实体引擎。以 **Model + View + FieldType + SuiteAdapter + DataSource** 为五大支点,统一 CRUD / 查询 / 引用管理 / 视图渲染 / 扩展注册,支持在运行期无侵入拼装出 **表单、网格、主从、看板、仪表盘、流程/树形视图** 等多形态界面。

1 lines 43.5 kB
{"version":3,"sources":["../src/core/types/session.types.ts","../src/components/renderers/view-inspector/index.tsx","../src/lib/hooks/utils/use-async/use-async.ts","../src/lib/hooks/utils/use-async-effect/use-async-effect.ts","../src/services/api/trpc/react.tsx","../src/services/api/trpc/query-client.ts","../src/core/engine/engine.initializer.ts","../src/uikit/provider/entity-engine-provider-factory.tsx","../src/uikit/surface/empty-symbol-comp.tsx","../src/uikit/consumer/entity-object-consumer.tsx","../src/types/data.types.ts"],"sourcesContent":["export type EntitySessionData = {\n readonly email: string;\n readonly name: string;\n readonly avatar?: string;\n readonly roles?: string[];\n readonly id: string;\n};\n\nexport interface IEntitySession {\n isAuthenticated: () => boolean;\n update(): void;\n readonly sessionId?: string;\n readonly userInfo?: EntitySessionData;\n readonly updateTime?: number;\n}\n\nexport class EntitySession implements IEntitySession {\n constructor(\n public readonly sessionId?: string,\n public readonly userInfo?: EntitySessionData,\n public readonly update: () => void = () => {}\n ) {}\n isAuthenticated(): boolean {\n return !!this.userInfo;\n }\n}\n\nexport interface IEntitySessionProvider {\n get providerType(): string;\n session(): Promise<IEntitySession>;\n}\n\nexport interface IEntitySessionManager {\n setProvider(provider: IEntitySessionProvider): void;\n getProvider(): IEntitySessionProvider | undefined;\n\n getSession(): Promise<IEntitySession>;\n}\n","'use client';\n\nimport type { IEntityNamedRenderer } from '../../types';\nimport type { IEntityViewDelegate, IEntityModelDelegate } from '../../../core';\n\nimport React from 'react';\nimport { modals } from '@mantine/modals';\nimport JsonView from '@uiw/react-json-view';\nimport { Tabs, ActionIcon } from '@mantine/core';\nimport { ViewIcon, DatabaseIcon, Settings2Icon } from 'lucide-react';\n\nimport { useEntityEngine } from '../../../uikit';\n\nexport const EntityViewInspector: IEntityNamedRenderer = {\n name: 'buildin-view-inspector',\n slotName: 'view-inspector',\n disabled: false,\n renderer: (props) => <EntityViewInspectorComp {...props} />,\n};\n\nfunction EntityViewInspectorComp(props: any) {\n const { model, viewData } = props;\n\n const handleAction = () => {\n modals.open({\n title: '视图配置数据',\n children: (\n <div>\n <InnerEntityViewInspectorComp {...props} model={model} viewData={viewData} />\n </div>\n ),\n size: '80%',\n centered: true,\n closeOnClickOutside: true,\n closeOnEscape: true,\n onClose: () => {\n console.log('Settings modal closed');\n },\n });\n };\n\n return (\n <ActionIcon variant=\"subtle\" aria-label=\"Settings\" onClick={handleAction}>\n <Settings2Icon size={14} strokeWidth={2} />\n </ActionIcon>\n );\n}\n\ntype InnerEntityViewInspectorProps = {\n model: IEntityModelDelegate;\n viewData: IEntityViewDelegate;\n [key: string]: any; // Allow other props to be passed\n};\n\nfunction InnerEntityViewInspectorComp(props: InnerEntityViewInspectorProps) {\n const { model, viewData, ...otherProps } = props;\n const [tab, setTab] = React.useState('model');\n const engine = useEntityEngine();\n\n const handleTabChange = (value: string | null) => {\n setTab(value || 'model');\n };\n\n return (\n <Tabs value={tab} variant=\"outline\" color=\"blue\" radius=\"md\" onChange={handleTabChange}>\n <Tabs.List>\n <Tabs.Tab value=\"model\" leftSection={<ViewIcon size={14} strokeWidth={2} />}>\n 模型配置\n </Tabs.Tab>\n <Tabs.Tab value=\"view\" leftSection={<DatabaseIcon size={14} strokeWidth={2} />}>\n 视图配置\n </Tabs.Tab>\n <Tabs.Tab value=\"other\" leftSection={<Settings2Icon size={14} strokeWidth={2} />}>\n 其他数据\n </Tabs.Tab>\n </Tabs.List>\n <Tabs.Panel value=\"model\" pt=\"xs\">\n <JsonView\n value={JSON.parse(\n JSON.stringify(model, (key, value) => {\n if (typeof key === 'string' && key.startsWith('_metaRegistry')) {\n return undefined;\n }\n return value;\n })\n )}\n />\n </Tabs.Panel>\n <Tabs.Panel value=\"view\" pt=\"xs\">\n <JsonView\n value={JSON.parse(\n JSON.stringify(viewData, (key, value) => {\n if (typeof key === 'string' && key.startsWith('_metaRegistry')) {\n return undefined;\n }\n return value;\n })\n )}\n />\n </Tabs.Panel>\n <Tabs.Panel value=\"other\" pt=\"xs\">\n <JsonView\n value={JSON.parse(\n JSON.stringify(otherProps, (key, value) => {\n if (typeof key === 'string' && key.startsWith('_metaRegistry')) {\n return undefined;\n }\n return value;\n })\n )}\n />\n </Tabs.Panel>\n </Tabs>\n );\n}\n","'use client';\n\nimport type { DependencyList } from 'react';\n\nimport { useState, useDeferredValue } from 'react';\n\nimport { useAsyncEffect } from '../use-async-effect';\n\nexport function useAsync<T>(\n func: () => Promise<T>,\n deps?: DependencyList\n): {\n state: 'loading' | 'hasData' | 'hasError';\n data?: T;\n error?: any;\n} {\n const [{ state, data, error }, setState] = useState<{\n state?: 'loading' | 'hasData' | 'hasError';\n data?: T;\n error?: any;\n }>({});\n\n useAsyncEffect(async () => {\n setState((draft) => ({ ...draft, state: 'loading' }));\n try {\n const result = await func();\n setState({ state: 'hasData', data: result });\n } catch (e) {\n setState((draft) => ({ ...draft, state: 'hasError', error: e }));\n }\n }, deps);\n\n return {\n state: state ?? 'loading',\n data,\n error,\n };\n}\n\nexport function useAsyncWithCache<T>(\n func: () => Promise<T>,\n deps?: DependencyList\n): {\n state: 'loading' | 'hasData' | 'hasError';\n data?: T;\n error?: any;\n} {\n // internalState 用于存储异步操作的最新结果,它会立即更新\n const [internalState, setInternalState] = useState<{\n state: 'loading' | 'hasData' | 'hasError';\n data?: T;\n error?: any;\n }>({ state: 'loading' }); // 初始状态为 loading\n\n // deferredResult 是 internalState 的延迟版本\n // 它会保持旧的数据和状态,直到 internalState 稳定并完成非紧急更新\n const deferredResult = useDeferredValue(internalState);\n\n // loadingState 用于立即反馈异步操作的开始,即使旧数据仍然显示\n const [loadingState, setLoadingState] = useState(false);\n\n useAsyncEffect(async () => {\n setLoadingState(true); // 立即设置为 loading 状态\n try {\n const result = await func();\n setInternalState({ state: 'hasData', data: result, error: undefined });\n } catch (e) {\n setInternalState({ state: 'hasError', data: undefined, error: e });\n } finally {\n setLoadingState(false); // 异步操作完成后取消 loading 状态\n }\n }, deps);\n\n // 返回给调用者的数据和状态\n // data 和 error 使用 deferredResult,以保持旧数据直到新数据加载完成\n // state 则优先显示 loadingState,如果不在加载中,则显示 deferredResult 的状态\n return {\n state: loadingState ? 'loading' : (deferredResult.state ?? 'loading'),\n data: deferredResult.data,\n error: deferredResult.error,\n };\n}\n","'use client';\n\nimport type { DependencyList, EffectCallback } from 'react';\n\nimport { useRef, useEffect } from 'react';\n\ntype AsyncEffectCallbackResult = ReturnType<EffectCallback>;\ntype AsyncEffectCallback = (signal: AbortSignal) => Promise<AsyncEffectCallbackResult>;\n\nexport function useAsyncEffect(effect: AsyncEffectCallback, deps?: DependencyList) {\n const abortRef = useRef<AbortController>(null);\n\n useEffect(() => {\n abortRef.current = new AbortController();\n return () => {\n abortRef.current?.abort();\n };\n }, []);\n\n useEffect(() => {\n let canceled = false;\n let result: AsyncEffectCallbackResult;\n\n const load = async () => {\n const signal = abortRef.current!.signal;\n if (canceled || signal.aborted) {\n return;\n }\n result = await effect(signal);\n };\n\n queueMicrotask(load);\n\n return () => {\n canceled = true;\n if (result) {\n result();\n }\n };\n }, deps); // eslint-disable-line react-hooks/exhaustive-deps\n}\n","'use client';\n\nimport * as React from 'react';\nimport SuperJSON from 'superjson';\nimport { createTRPCReact } from '@trpc/react-query';\nimport { loggerLink, httpBatchStreamLink } from '@trpc/client';\nimport { type QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport { type inferRouterInputs, type inferRouterOutputs } from '@trpc/server';\n\nimport { type AppRouter } from '../root';\nimport { useEntityEngine } from '../../../uikit';\nimport { createQueryClient } from './query-client';\n\nlet clientQueryClientSingleton: QueryClient | undefined = undefined;\nconst getQueryClient = () => {\n if (typeof window === 'undefined') {\n // Server: always make a new query client\n return createQueryClient();\n }\n // Browser: use singleton pattern to keep the same query client\n clientQueryClientSingleton ??= createQueryClient();\n\n return clientQueryClientSingleton;\n};\n\nexport const api = createTRPCReact<AppRouter>();\n\n/**\n * Inference helper for inputs.\n *\n * @example type HelloInput = RouterInputs['example']['hello']\n */\nexport type RouterInputs = inferRouterInputs<AppRouter>;\n\n/**\n * Inference helper for outputs.\n *\n * @example type HelloOutput = RouterOutputs['example']['hello']\n */\nexport type RouterOutputs = inferRouterOutputs<AppRouter>;\n\nexport function TRPCReactProvider(props: { children: React.ReactNode }) {\n const engine = useEntityEngine();\n const queryClient = getQueryClient();\n\n const [trpcClient] = React.useState(() =>\n api.createClient({\n links: [\n loggerLink({\n enabled: (op: any) => false,\n // process.env.NODE_ENV === 'development' ||\n // (op.direction === 'down' && op.result instanceof Error),\n }),\n httpBatchStreamLink({\n transformer: SuperJSON,\n url: engine.settings.getUrl('/trpc'), ///api/ee/trpc\n headers: () => {\n const headers = new Headers();\n headers.set('x-trpc-source', 'nextjs-react');\n return headers;\n },\n }),\n ],\n })\n );\n\n return (\n <QueryClientProvider client={queryClient}>\n <api.Provider client={trpcClient} queryClient={queryClient}>\n {props.children}\n </api.Provider>\n </QueryClientProvider>\n );\n}\n\nfunction getBaseUrl() {\n if (typeof window !== 'undefined') return window.location.origin;\n if (process.env.VERCEL_URL) return `https://${process.env.VERCEL_URL}`;\n return `http://localhost:${process.env.PORT ?? 3000}`;\n}\n","import SuperJSON from 'superjson';\nimport { QueryClient, defaultShouldDehydrateQuery } from '@tanstack/react-query';\n\nexport const createQueryClient = () =>\n new QueryClient({\n defaultOptions: {\n queries: {\n // With SSR, we usually want to set some default staleTime\n // above 0 to avoid refetching immediately on the client\n staleTime: 30 * 1000,\n },\n dehydrate: {\n serializeData: SuperJSON.serialize,\n shouldDehydrateQuery: (query) =>\n defaultShouldDehydrateQuery(query) || query.state.status === 'pending',\n },\n hydrate: {\n deserializeData: SuperJSON.deserialize,\n },\n },\n });\n","import type { IEntityView, IEntityModel, IModelFieldTyper } from '../../types';\nimport type { IEntityNamedRenderer, IEntityComponentSuiteAdapter } from '../../components';\nimport type {\n IEntityEngine,\n IEntityModule,\n IEntitySessionProvider,\n IEntityEngineInitializer,\n IEntityEnginePrimitiveInitializer,\n} from '../types';\n\nexport class EngineInitializer implements IEntityEngineInitializer {\n // private _models: IEntityModel[];\n // private _views: IEntityView[];\n private _config?: { models: IEntityModel[]; views: IEntityView[] };\n private _suiteAdapters: IEntityComponentSuiteAdapter[] | undefined;\n private _renderers: IEntityNamedRenderer[] | undefined;\n private _fieldTypers: IModelFieldTyper[] | undefined;\n private _modules: (IEntityModule | string)[] | undefined;\n private _sessionProvider: IEntitySessionProvider | undefined;\n private _settings:\n | { baseUrl?: string; endpoint?: string; authenticationEnabled?: boolean }\n | undefined;\n\n constructor(args: {\n // models?: IEntityModel[];\n // views?: IEntityView[];\n config?: { models: IEntityModel[]; views: IEntityView[] };\n suiteAdapters?: IEntityComponentSuiteAdapter[];\n renderers?: IEntityNamedRenderer[];\n fieldTypers?: IModelFieldTyper[];\n settings?: { baseUrl?: string; endpoint?: string; authenticationEnabled?: boolean };\n modules?: (IEntityModule | string)[];\n sessionProvider?: IEntitySessionProvider;\n }) {\n // this._models = args.models;\n // this._views = args.views;\n this._config = args.config;\n this._suiteAdapters = args.suiteAdapters;\n this._renderers = args.renderers;\n this._fieldTypers = args.fieldTypers;\n this._settings = args.settings;\n this._modules = args.modules;\n this._sessionProvider = args.sessionProvider;\n }\n\n async init(engine: IEntityEngine): Promise<void> {\n if (this._config) {\n const { models, views } = this._config;\n if (models.length > 0) {\n for (const model of models) {\n engine.metaRegistry.registerModel(model);\n }\n }\n if (views.length > 0) {\n for (const view of views) {\n engine.metaRegistry.registerView(view);\n }\n }\n }\n\n if (this._suiteAdapters && this._suiteAdapters.length > 0) {\n for (const adapter of this._suiteAdapters) {\n engine.componentRegistry.registerAdapter(adapter);\n }\n }\n\n if (this._renderers && this._renderers.length > 0) {\n for (const renderer of this._renderers) {\n engine.componentRegistry.registerRenderer(renderer);\n }\n }\n\n if (this._fieldTypers && this._fieldTypers.length > 0) {\n for (const typer of this._fieldTypers) {\n engine.fieldTyperRegistry.registerFieldTyper(typer);\n }\n }\n\n if (this._modules && this._modules.length > 0) {\n for (const mod of this._modules) {\n await engine.moduleRegistry.registerModule(mod, true);\n }\n }\n\n if (this._sessionProvider) {\n engine.sessionManager.setProvider(this._sessionProvider);\n }\n\n // 应用模块:\n // const modules = engine.moduleRegistry.getAllModules();\n // if (modules) {\n // for (const module of modules) {\n // try {\n // const ms: IEntityModel[] = [];\n // const vs: IEntityView[] = [];\n // const ehs: {\n // focusEventNames: string[];\n // handler: IEntityEventListener<EntityEvent>;\n // }[] = [];\n // await module.setupConfig({ models: ms, views: vs, eventHandlers: ehs });\n // for (const m of ms) {\n // engine.metaRegistry.registerModel(m);\n // }\n // for (const v of vs) {\n // engine.metaRegistry.registerView(v);\n // }\n // for (const eh of ehs) {\n // for (const eventName of eh.focusEventNames) {\n // console.log(\n // '################## register event listener',\n // eventName,\n // eh.handler,\n // module.info.name\n // );\n // engine.eventRegistry.registerListener(eventName, eh.handler);\n // }\n // }\n // } catch (e) {\n // console.error(e);\n // }\n // try {\n // const views: EntityView[] = [];\n // const widgets: EntityWidget[] = [];\n // const renderers: IEntityNamedRenderer[] = [];\n // await module.setupComponents({ views, widgets, renderers });\n // for (const v of views) {\n // engine.componentRegistry.registerView(v);\n // }\n // // for(const w of widgets){\n // // engine.componentRegistry.registerWidget(w);\n // // }\n // for (const r of renderers) {\n // engine.componentRegistry.registerRenderer(r);\n // }\n // } catch (e) {\n // console.error(e);\n // }\n // }\n // }\n\n if (this._settings) {\n engine.settings.setBaseUrl(this._settings.baseUrl || '');\n engine.settings.setEndpoint(\n this._settings.endpoint || process.env.EE_SERVICE_ROOT_PATH || '/api/ee'\n );\n engine.settings.authenticationEnabled = this._settings.authenticationEnabled || false;\n }\n\n console.log(\n `Entity Engine initialized with models(${this._config?.models.length || 0}) and views(${this._config?.views.length || 0})`\n );\n }\n}\n\nexport class EnginePrimitiveInitializer implements IEntityEnginePrimitiveInitializer {\n private _models: IEntityModel[];\n private _views: IEntityView[];\n private _fieldTypers: IModelFieldTyper[] | undefined;\n private _modules: (IEntityModule | string)[] | undefined;\n private _settings:\n | { baseUrl?: string; endpoint?: string; authenticationEnabled?: boolean }\n | undefined;\n\n constructor(args: {\n models: IEntityModel[];\n views: IEntityView[];\n fieldTypers?: IModelFieldTyper[];\n modules?: (IEntityModule | string)[] | undefined;\n settings?: { baseUrl?: string; endpoint?: string; authenticationEnabled?: boolean };\n }) {\n this._models = args.models;\n this._views = args.views;\n this._fieldTypers = args.fieldTypers;\n this._settings = args.settings;\n this._modules = args.modules;\n }\n\n async init(engine: IEntityEngine): Promise<void> {\n if (this._models.length > 0) {\n for (const model of this._models) {\n engine.metaRegistry.registerModel(model);\n }\n }\n if (this._views.length > 0) {\n for (const view of this._views) {\n engine.metaRegistry.registerView(view);\n }\n }\n\n if (this._modules && this._modules.length > 0) {\n for (const mod of this._modules) {\n await engine.moduleRegistry.registerModule(mod);\n }\n }\n\n if (this._fieldTypers && this._fieldTypers.length > 0) {\n for (const typer of this._fieldTypers) {\n engine.fieldTyperRegistry.registerFieldTyper(typer);\n }\n }\n\n if (this._settings) {\n engine.settings.setBaseUrl(this._settings.baseUrl || '');\n engine.settings.setEndpoint(\n this._settings.endpoint || process.env.EE_SERVICE_ROOT_PATH || '/api/ee'\n );\n engine.settings.authenticationEnabled = this._settings.authenticationEnabled || false;\n }\n\n console.log(\n `Entity Engine initialized with models(${this._models.length}) and views(${this._views.length})`\n );\n }\n}\n","import type { ReactNode } from 'react';\nimport type { IEntityView, IEntityModel, IModelFieldTyper } from '../../types';\nimport type { IEntityNamedRenderer, IEntityComponentSuiteAdapter } from '../../components';\nimport type {\n IEntityModule,\n IEntityEngineTheme,\n IEntityEngineRouter,\n IEntityPermissionGuard,\n} from '../../core';\n\nimport { TRPCReactProvider } from '../../services/api/trpc/react';\nimport { EngineInitializer } from '../../core/engine/engine.initializer';\nimport { EntityEngineThemeProvider } from './entity-engine-theme-provider';\nimport { EntityEngineProvider as InternalProvider } from './client-engine-provider';\nimport { type AdapterType, EntitySuiteAdapterProvider } from './suite-adapter-provider';\n\n// 定义开发者需要传入的配置对象类型\ntype EntityEngineInitConfig = {\n config?: { models: IEntityModel[]; views: IEntityView[] };\n suiteAdapters?: IEntityComponentSuiteAdapter[];\n theme?: Partial<IEntityEngineTheme>;\n suiteAdapter?: AdapterType;\n loading?: ReactNode;\n router?: IEntityEngineRouter;\n permissionGuard?: IEntityPermissionGuard;\n renderers?: IEntityNamedRenderer[];\n fieldTypers?: IModelFieldTyper[];\n modules?: (IEntityModule | string)[];\n settings?: {\n baseUrl?: string;\n endpoint?: string;\n authenticationEnabled?: boolean;\n };\n};\n\n/**\n * 工厂函数:\n * 接收开发者的配置,然后返回一个已经完全配置好的 Provider 组件。\n */\nexport function createEntityEngineProvider(config: EntityEngineInitConfig) {\n process.env.EE_SERVICE_ROOT_PATH = config.settings?.endpoint || '/api/ee';\n\n // 1. 在客户端安全地创建实例,因为配置对象在这里是可用的\n const initializer = new EngineInitializer({\n config: config.config,\n suiteAdapters: config.suiteAdapters,\n renderers: config.renderers,\n fieldTypers: config.fieldTypers,\n modules: config.modules,\n settings: config.settings,\n });\n\n // 2. 返回一个新的 React 组件,它已经封装了所有初始化逻辑\n const ConfiguredProvider = ({ children }: { children: ReactNode }) => (\n <EntitySuiteAdapterProvider\n adapter={config.suiteAdapter || { suiteName: 'build-in', suiteVersion: '1.0.0' }}\n >\n <InternalProvider\n initializer={initializer}\n loading={config.loading}\n router={config.router}\n permissionGuard={config.permissionGuard}\n >\n <EntityEngineThemeProvider theme={config.theme}>\n <TRPCReactProvider>{children}</TRPCReactProvider>\n </EntityEngineThemeProvider>\n </InternalProvider>\n </EntitySuiteAdapterProvider>\n );\n\n ConfiguredProvider.displayName = 'EntityEngineProvider(Configured)';\n return ConfiguredProvider;\n}\n","export function EmptySymbol() {\n return null;\n}\n","'use client';\n\nimport type { IEntityQuery, IEntityObject } from '../../types';\n\nimport React from 'react';\n\nimport { useEntityEngine } from '../provider';\nimport { useAsync, toDataSourceHook } from '../../lib/hooks';\n\ntype EntityObjectsConsumerProps = {\n modelName: string;\n query?: IEntityQuery;\n withReference?: boolean;\n objectsRenderer: (count: number, objs: IEntityObject[]) => React.ReactNode;\n onError?: (error: Error) => React.ReactNode;\n loading?: React.ReactNode;\n};\n\nexport function EntityObjectsConsumer(props: EntityObjectsConsumerProps) {\n const { modelName, query, withReference, objectsRenderer, onError, loading } = props;\n const engine = useEntityEngine();\n const model = engine.metaRegistry.getModel(modelName);\n if (!model) {\n return null;\n }\n\n const datasource = engine.datasourceFactory.getDataSource();\n const dsHook = toDataSourceHook(datasource);\n\n const {\n data,\n loading: isLoading,\n error,\n } = dsHook.useFindMany({\n modelName,\n query,\n withAllReferences: withReference || false,\n });\n\n if (isLoading || !data) {\n return loading || <div>Loading...</div>;\n }\n\n if (error) {\n if (onError) {\n return onError(error);\n }\n return <div style={{ color: 'red' }}>Error: {error.message}</div>;\n }\n\n return <>{objectsRenderer(data.count, data.data)}</>;\n}\n\ntype EntityObjectConsumerProps = {\n modelName: string;\n objectId: string;\n withReference?: boolean;\n objectRenderer: (obj: IEntityObject) => React.ReactNode;\n onError?: (error: Error) => React.ReactNode;\n loading?: React.ReactNode;\n};\n\nexport function EntityObjectConsumer(props: EntityObjectConsumerProps) {\n const { modelName, objectId, withReference, objectRenderer, onError, loading } = props;\n const engine = useEntityEngine();\n\n const datasource = engine.datasourceFactory.getDataSource();\n const dsHook = toDataSourceHook(datasource);\n\n const { data, error, state } = useAsync(async () => {\n if (withReference) {\n return await datasource.findOneWithReferences({\n modelName,\n id: objectId,\n includeFieldNames: undefined,\n });\n } else {\n return await datasource.findOne({\n modelName,\n id: objectId,\n });\n }\n }, [objectId, withReference]);\n\n if (state === 'loading' || !data) {\n return loading || <div>Loading...</div>;\n }\n\n if (error) {\n if (onError) {\n return onError(error);\n }\n return <div style={{ color: 'red' }}>Error: {error.message}</div>;\n }\n\n return <>{objectRenderer(data)}</>;\n}\n","import type { IEntityField } from './meta.types';\n\nexport interface IEntityResult<T> {\n data: T | undefined;\n error?: string;\n isLoading: boolean;\n isSuccess: boolean;\n isError: boolean;\n}\n\nexport enum QueryOperator {\n // 比较操作符\n NONE = 'none',\n EQ = 'eq',\n NE = 'ne',\n GT = 'gt',\n GTE = 'gte',\n LT = 'lt',\n LTE = 'lte',\n // 字符串操作符\n CONTAINS = 'contains',\n STARTS_WITH = 'startsWith',\n ENDS_WITH = 'endsWith',\n // 数组操作符\n IN = 'in',\n NOT_IN = 'notIn',\n // 空值操作符\n IS_NULL = 'isNull',\n IS_NOT_NULL = 'isNotNull',\n // 范围操作符\n BETWEEN = 'between',\n}\n\n// 叶子节点条件(基础查询条件)\nexport interface ILeafCondition {\n field: string;\n operator: QueryOperator;\n value: any;\n value2?: any; // 用于 BETWEEN 操作符\n and?: never; // 确保互斥\n or?: never; // 确保互斥\n not?: never; // 确保互斥\n}\n\n// 复合条件(AND/OR/NOT)\nexport interface ICompositeCondition {\n field?: never; // 确保互斥\n operator?: never; // 确保互斥\n value?: never; // 确保互斥\n value2?: never; // 确保互斥\n and?: IEntityQueryItem[];\n or?: IEntityQueryItem[];\n not?: IEntityQueryItem[];\n}\n\n// 改进查询项接口\nexport type IEntityQueryItem = ILeafCondition | ICompositeCondition;\n\nexport interface IEntityQuery {\n pageSize?: number;\n pageIndex?: number;\n sortBy?: {\n [key: string]: 'asc' | 'desc';\n };\n references?: {\n fromModelName: string;\n fromFieldName: string;\n fromObjectId: string;\n toModelName: string;\n };\n filter?: IEntityQueryItem;\n}\n\nexport interface IEntityQueryItemMeta {\n field: IEntityField;\n operators: QueryOperator[];\n options?: { [key: string]: any }[];\n}\n\nexport interface IEntityQueryMeta {\n queryItemMetas: IEntityQueryItemMeta[];\n}\n\nexport interface IEntityObject {\n id: string;\n modelName: string;\n isDeleted?: boolean;\n createdAt?: Date;\n updatedAt?: Date;\n values: { [key: string]: any };\n}\n\nexport interface IEntityObjectReference {\n id: number;\n fromModelName: string;\n fromFieldName: string;\n fromObjectId: string;\n toModelName: string;\n toObjectId: string;\n createdAt?: Date;\n updatedAt?: Date;\n}\n\nexport interface IEntityObjectReferenceProps {\n fromModelName: string;\n fromFieldName: string;\n fromObjectId: string;\n}\n\nexport interface EntityTreeNode {\n children: EntityTreeNode[];\n data: IEntityObject | undefined | null;\n parentId: string | null | undefined;\n}\n\nexport interface IEntityDataSource {\n findPlainConfig(input: {\n modelName?: string;\n viewName?: string;\n configVersion?: string;\n }): Promise<{ models: any[]; views: any[] }>;\n\n findOne(input: { id: string; modelName?: string }): Promise<IEntityObject | undefined | null>;\n\n findMany(input: {\n modelName: string;\n query?: IEntityQuery;\n withAllReferences?: boolean;\n }): Promise<{ data: IEntityObject[]; count: number }>;\n\n findTreeObjects(input: {\n modelName: string;\n fieldName: string;\n rootObjectId?: string;\n }): Promise<EntityTreeNode | EntityTreeNode[] | null>;\n\n findOneWithReferences(input: {\n modelName: string;\n id: string;\n includeFieldNames?: string[];\n }): Promise<IEntityObject | undefined | null>;\n\n findManyWithReferences(input: {\n modelName: string;\n childrenFieldName: string;\n query?: IEntityQuery;\n }): Promise<{ data: IEntityObject[]; count: number }>;\n\n findCount(input: { modelName: string; query?: IEntityQuery }): Promise<number>;\n\n create(input: {\n modelName: string;\n data: Partial<IEntityObject>;\n reference?: IEntityObjectReferenceProps;\n }): Promise<IEntityObject | null | undefined>;\n\n update(input: { id: string; data: Partial<IEntityObject> }): Promise<boolean>;\n\n updateValues(input: { id: string; values: { [key: string]: any } }): Promise<boolean>;\n\n delete(input: { id: string }): Promise<boolean>;\n\n deleteMany(input: { ids: string[] }): Promise<boolean>;\n\n validate(input: { modelName: string; data: Partial<any> }): Promise<boolean>;\n\n findReferences(input: {\n fromModelName: string;\n fromFieldName: string;\n fromObjectId: string;\n toModelName: string;\n }): Promise<IEntityObjectReference[]>;\n\n findReferencesCount(input: {\n fromModelName: string;\n fromFieldName: string;\n fromObjectId: string;\n toModelName: string;\n }): Promise<number>;\n\n createReference(input: {\n fromModelName: string;\n fromFieldName: string;\n fromObjectId: string;\n toModelName: string;\n toObjectId: string;\n }): Promise<IEntityObjectReference>;\n\n createReferences(input: {\n fromModelName: string;\n fromFieldName: string;\n fromObjectId: string;\n toModelName: string;\n toObjectIds: string[];\n }): Promise<number>;\n\n deleteReference(input: {\n fromModelName: string;\n fromFieldName: string;\n fromObjectId: string;\n toModelName: string;\n toObjectId: string;\n }): Promise<boolean>;\n\n deleteReferences(input: {\n fromModelName: string;\n fromFieldName: string;\n fromObjectId: string;\n toModelName: string;\n toObjectIds: string[];\n }): Promise<number>;\n\n findGroupedObjects(input: {\n modelName: string;\n groupBy:\n | string\n | {\n field: string;\n format?: {\n type: 'time' | 'range';\n pattern: string;\n };\n withoutDetails?: boolean; // 是否返回详细数据\n }; // 分组字段名\n query?: IEntityQuery; // 可选的查询条件\n aggregations?: {\n // 可选的聚合计算\n [fieldName: string]: 'count' | 'sum' | 'avg' | 'min' | 'max';\n };\n reference?: {\n fromModelName: string;\n fromFieldName: string;\n fromObjectId: string;\n };\n groupSortBy?: {\n // 组排序\n [fieldName: string]: 'asc' | 'desc';\n };\n objectSortBy?: {\n // 组内对象排序\n [fieldName: string]: 'asc' | 'desc';\n };\n }): Promise<{\n groups: Array<{\n key: Record<string, any>; // 分组键值\n count: number; // 该分组下的对象数量\n objects: IEntityObject[]; // 该分组下的对象列表\n aggregations?: Record<string, any>; // 聚合结果\n }>;\n totalCount: number;\n }>;\n}\n"],"mappings":"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","names":["React","SuperJSON","SuperJSON","jsx","jsx","jsx","jsxs","React","QueryOperator"]}