fix: 补回被合成入口丢掉的 default 导出

button/container/data-converter/data-list/grid-layout/grid-layout-form/
res-ws/virtual-fs 这几个入口的 index.js 都用 export { default as X } from './xxx'
转发了 default 导出,但同级有手写 types/ 目录时会触发合成入口逻辑,用
export * from './index' 拼入口文件,而 export * 在 ES 模块语义里不会带出 default,
导致这些包的 default 导出(部分甚至连实现本身,如 DataConverter、ResWs 整个类)
被 tree-shake 掉,没有出现在最终产物里。
This commit is contained in:
2026-09-23 11:13:04 +08:00
parent ac0e27109b
commit acbff01332
8 changed files with 176 additions and 7 deletions
Vendored
+4 -2
View File
@@ -1,4 +1,4 @@
import { ReactNode } from 'react'; import React, { ReactNode } from 'react';
import { PopupContainerProps } from './container'; import { PopupContainerProps } from './container';
export { PopupContainerProps } from './container'; export { PopupContainerProps } from './container';
@@ -170,5 +170,7 @@ interface ButtonOption extends ButtonProps {
*/ */
declare function useButton({ widget, widgetType, widgetData, widgetProps, widgetSetting, widgetContainerProps, }: UseButtonProps, { onAfterClick, onBeforeClick }?: UseButtonHandlers): UseButtonReturn; declare function useButton({ widget, widgetType, widgetData, widgetProps, widgetSetting, widgetContainerProps, }: UseButtonProps, { onAfterClick, onBeforeClick }?: UseButtonHandlers): UseButtonReturn;
export { _default as auth, useButton }; declare const Button: (props: ButtonProps) => React.ReactNode;
export { _default as auth, Button as default, useButton };
export type { ButtonCate, ButtonConfirm, ButtonOption, ButtonProps, ButtonSize, ButtonTooltip, ButtonType, PlacementType, UseButtonHandlers, UseButtonProps, UseButtonReturn, UseButtonStatus, WidgetContainerProps, WidgetType }; export type { ButtonCate, ButtonConfirm, ButtonOption, ButtonProps, ButtonSize, ButtonTooltip, ButtonType, PlacementType, UseButtonHandlers, UseButtonProps, UseButtonReturn, UseButtonStatus, WidgetContainerProps, WidgetType };
+42 -1
View File
@@ -96,6 +96,47 @@ type PopupHandle<T = unknown> = Promise<T> & {
*/ */
declare const SlotContext: React.Context<SlotContextValue>; declare const SlotContext: React.Context<SlotContextValue>;
/**
* 页面级容器,通过 SlotContext 把 title/subTitle/actions/extras 挂载到外层布局的对应插槽位置
* @param {Object} props
* @param {string} [props.rootClassName] 挂载到外层布局根节点的 className
* @param {string} [props.className] 容器自身的 className
* @param {ReactNode} [props.children] 容器内容
* @param {ReactNode} [props.actions] 挂载到 actions 插槽的内容
* @param {ReactNode} [props.title] 挂载到 title 插槽的内容
* @param {ReactNode} [props.subTitle] 挂载到 sub-title 插槽的内容
* @param {ReactNode} [props.extras] 挂载到 extras 插槽的内容
* @param {CSSProperties} [props.style] 容器行内样式
*/
declare function FFContainer({ rootClassName, className, children, actions, title, subTitle, extras, style }: {
rootClassName?: string;
className?: string;
children?: React.ReactNode;
actions?: React.ReactNode;
title?: React.ReactNode;
subTitle?: React.ReactNode;
extras?: React.ReactNode;
style?: React.CSSProperties;
}): React.JSX.Element;
declare namespace FFContainer {
function Action({ children, className }: {
children: any;
className: any;
}): any;
function Title({ children, className }: {
children: any;
className: any;
}): any;
function SubTitle({ children, className }: {
children: any;
className: any;
}): any;
function Extra({ children, className }: {
children: any;
className: any;
}): any;
}
declare namespace FFPopup { declare namespace FFPopup {
export { modal }; export { modal };
export { confirm }; export { confirm };
@@ -161,5 +202,5 @@ declare namespace FFPopupRender {
function $onClick(...args: any[]): Promise<any>; function $onClick(...args: any[]): Promise<any>;
} }
export { SlotContext as Context, Empty, Loading, NotFound, FFPageRender as PageRender, FFPopup as Popup, FFPopupRender as PopupRender }; export { SlotContext as Context, Empty, Loading, NotFound, FFPageRender as PageRender, FFPopup as Popup, FFPopupRender as PopupRender, FFContainer as default };
export type { PopupContainerProps, PopupHandle, SlotContextValue, SlotElements, SlotKey }; export type { PopupContainerProps, PopupHandle, SlotContextValue, SlotElements, SlotKey };
+32
View File
@@ -1,5 +1,36 @@
import React from 'react';
import { WidgetType, WidgetContainerProps } from './button'; import { WidgetType, WidgetContainerProps } from './button';
/**
* 按一串中间件(middleware)链式转换数据;每个中间件可以是函数,也可以是要动态加载的
* 组件名字符串(通过 core.getWidgetComponent 解析),支持嵌套数组表示的中间件组
*/
declare class DataConverter {
static "__#private@#resolver": any;
static "__#private@#newMiddleware": any;
/**
* @param {...(Array|[string|Function, *])} middlewares 中间件列表,每项是
* [中间件名或函数, 传给中间件的配置],或者是这种元组的嵌套数组(会被展开)
*/
constructor(...middlewares: (any[] | [string | Function, any])[]);
/**
* 依次跑完所有中间件,把 value 转换成最终结果;单个中间件报错会被跳过,不中断整条链
* @param {*} value 原始值
* @param {*} [record] 关联的记录数据,中间件里可通过 this.getRecord() 取到
* @returns {Promise<*>} 转换后的结果
*/
toValue: (value: any, record?: any) => Promise<any>;
/**
* 把 toValue 的异步转换结果渲染成 React 元素;转换完成前显示 loading,转换出错则显示错误信息
* @param {*} value 原始值
* @param {*} record 关联的记录数据
* @param {*} [loading] 转换完成前显示的占位内容
* @returns {React.ReactElement}
*/
toRender: (value: any, record: any, loading?: any) => React.ReactElement;
#private;
}
// ===== 用户数据结构(复用类型,JSDoc 无法跨文件引用,放 .d.ts) ===== // ===== 用户数据结构(复用类型,JSDoc 无法跨文件引用,放 .d.ts) =====
interface UserRoleBinding { interface UserRoleBinding {
@@ -109,4 +140,5 @@ interface WorkerPipeInstance {
clear: (session: string) => void clear: (session: string) => void
} }
export { DataConverter as default };
export type { HttpHeaders, MenuItem, RouteItem, UserInfo, UserRoleBinding, WorkerPipeInstance }; export type { HttpHeaders, MenuItem, RouteItem, UserInfo, UserRoleBinding, WorkerPipeInstance };
+61 -1
View File
@@ -271,6 +271,66 @@ declare function useOperationCallback(props: any, listCode: string, primaryKey?:
*/ */
declare function useDataListHelper(listCode: string, base62params: DataListQueryParams): DataListHelperState; declare function useDataListHelper(listCode: string, base62params: DataListQueryParams): DataListHelperState;
/**
* 数据列表根组件:根据 isItemGridLayout 选择宫格(DataListFramework)或表格(DataTableFramework)布局,
* 也可通过 theme 动态加载自定义主题组件替代默认布局;并通过 DataListContext 向下透传分页/筛选/选中等状态与操作方法
* @param {Object} props
* @param {boolean} [props.isItemGridLayout] 是否使用宫格布局(否则使用表格布局,theme 设置时忽略)
* @param {string} [props.theme] 自定义主题组件标识,设置后通过 core.getWidgetComponent 动态加载并替代默认布局
* @param {Object} [props.themeProps] 传给自定义主题组件的 $setting
* @param {DataListContextValue['onClickCallback']} [props.onClickCallback] 行内/批量操作点击后的回调
* @param {DataListContextValue['onReload']} [props.onReload] 刷新回调
* @param {string} [props.listCode] 列表标识
* @param {DataListQueryParams['total']} [props.total=0] 数据总条数
* @param {DataListQueryParams['page']} [props.page=0] 当前页码
* @param {DataListContextValue['onPageChange']} [props.onPageChange] 页码变更回调
* @param {DataListQueryParams['pageSize']} [props.pageSize=30] 每页条数
* @param {DataListContextValue['onPageSizeChange']} [props.onPageSizeChange] 每页条数变更回调
* @param {DataListQueryParams['tab']} [props.tab] 当前选中的 tab
* @param {DataListContextValue['onTabChange']} [props.onTabChange] tab 变更回调
* @param {DataListQueryParams['keyword']} [props.keyword] 关键字搜索值
* @param {DataListContextValue['onKeywordChange']} [props.onKeywordChange] 关键字变更回调
* @param {DataListQueryParams['condition']} [props.condition] 筛选条件
* @param {DataListContextValue['onConditionChange']} [props.onConditionChange] 筛选条件变更回调
* @param {DataListQueryParams['sider']} [props.sider] 侧边栏选中值
* @param {DataListContextValue['onSiderChange']} [props.onSiderChange] 侧边栏选中值变更回调
* @param {DataListLayouts|false} [props.layouts] 自定义子布局组件集合(sider/filter/footer/toolbar/empty),false 表示全部隐藏
* @param {DataListClassNames} [props.classNames={}] 各区块自定义 className
* @param {DataListQueryParams['payload']} [props.payload={}] 附加请求参数
* @param {Record<string, unknown>[]} [props.dataSource=[]] 列表数据
* @param {DataListRowSelection} [props.rowSelection] 行选择配置
* @param {() => Record<string, unknown>[]} [props.getSelectedRows] 获取已选中行的方法,未提供时默认返回 dataSource
* @param {string} [props.primaryKey] 主键字段名
*/
declare function DataList({ isItemGridLayout, theme, themeProps, onClickCallback, onReload, listCode, total, page, onPageChange, pageSize, onPageSizeChange, tab, onTabChange, keyword, onKeywordChange, condition, onConditionChange, sider, onSiderChange, layouts, classNames, payload, dataSource, rowSelection, getSelectedRows: getSelectedRowsProp, primaryKey, ...props }: {
isItemGridLayout?: boolean;
theme?: string;
themeProps?: any;
onClickCallback?: DataListContextValue["onClickCallback"];
onReload?: DataListContextValue["onReload"];
listCode?: string;
total?: DataListQueryParams["total"];
page?: DataListQueryParams["page"];
onPageChange?: DataListContextValue["onPageChange"];
pageSize?: DataListQueryParams["pageSize"];
onPageSizeChange?: DataListContextValue["onPageSizeChange"];
tab?: DataListQueryParams["tab"];
onTabChange?: DataListContextValue["onTabChange"];
keyword?: DataListQueryParams["keyword"];
onKeywordChange?: DataListContextValue["onKeywordChange"];
condition?: DataListQueryParams["condition"];
onConditionChange?: DataListContextValue["onConditionChange"];
sider?: DataListQueryParams["sider"];
onSiderChange?: DataListContextValue["onSiderChange"];
layouts?: DataListLayouts | false;
classNames?: DataListClassNames;
payload?: DataListQueryParams["payload"];
dataSource?: Record<string, unknown>[];
rowSelection?: DataListRowSelection;
getSelectedRows?: () => Record<string, unknown>[];
primaryKey?: string;
}): React.JSX.Element;
/** /**
* 列表筛选区:isConditionFormLayout 为 true 时拉取后台配置的条件表单结构并渲染 GridLayoutForm,否则渲染默认的关键字搜索框 * 列表筛选区:isConditionFormLayout 为 true 时拉取后台配置的条件表单结构并渲染 GridLayoutForm,否则渲染默认的关键字搜索框
* @param {Object} props * @param {Object} props
@@ -542,5 +602,5 @@ declare function DataTableFramework({ listCode, className, layouts, dataSource,
isConditionFormLayout?: boolean; isConditionFormLayout?: boolean;
}): React.JSX.Element; }): React.JSX.Element;
export { DataListContent, _default as DataListContext, DataListFilter, DataListFooter, DataListFramework, DataListHelper, DataListSider, DataListTable, DataListToolbar, DataTableFramework, useCellEditableComponents, useColumnsRender, useDataListHelper, useHasOperationColumn, useItemOperationsAccess, useOperationCallback }; export { DataListContent, _default as DataListContext, DataListFilter, DataListFooter, DataListFramework, DataListHelper, DataListSider, DataListTable, DataListToolbar, DataTableFramework, DataList as default, useCellEditableComponents, useColumnsRender, useDataListHelper, useHasOperationColumn, useItemOperationsAccess, useOperationCallback };
export type { DataListAPI, DataListClassNames, DataListColumn, DataListContextValue, DataListHelperRef, DataListHelperState, DataListItemForGridLayout, DataListItemOperationsAccess, DataListLayouts, DataListOperation, DataListQueryParams, DataListRowSelection, DataListStructure, DataListTab }; export type { DataListAPI, DataListClassNames, DataListColumn, DataListContextValue, DataListHelperRef, DataListHelperState, DataListItemForGridLayout, DataListItemOperationsAccess, DataListLayouts, DataListOperation, DataListQueryParams, DataListRowSelection, DataListStructure, DataListTab };
+6 -1
View File
@@ -372,6 +372,11 @@ declare function GridLayoutForm({ name, form: initForm, basicForm, style, classN
groups?: GridLayoutFormGroup[]; groups?: GridLayoutFormGroup[];
children?: React.ReactNode; children?: React.ReactNode;
}): React.JSX.Element; }): React.JSX.Element;
declare const _default: ({ code, isPreview, ...props }: {
[x: string]: any;
code: any;
isPreview?: boolean;
}) => React.JSX.Element;
export { GridLayoutForm, GridLayoutFormHelper, GridLayoutFormWidget, useFieldArray, useFormAction, useFormData, useFormSubmit, useMergedFormValuesChange, useRules, useStructure, useWidgetDecorator }; export { GridLayoutForm, GridLayoutFormHelper, GridLayoutFormWidget, _default as default, useFieldArray, useFormAction, useFormData, useFormSubmit, useMergedFormValuesChange, useRules, useStructure, useWidgetDecorator };
export type { EnhancedFormInstance, GridLayoutFormAPI, GridLayoutFormField, GridLayoutFormFieldValidators, GridLayoutFormGroup, GridLayoutFormItem, GridLayoutFormItemWidgetComponentProps, GridLayoutFormItemWidgetProps, GridLayoutFormSetting, GridLayoutFormStructure, GridLayoutFormSubWidget, GridLayoutFormWidgetDecorator, SubmitOptions, UseFieldArrayReturn }; export type { EnhancedFormInstance, GridLayoutFormAPI, GridLayoutFormField, GridLayoutFormFieldValidators, GridLayoutFormGroup, GridLayoutFormItem, GridLayoutFormItemWidgetComponentProps, GridLayoutFormItemWidgetProps, GridLayoutFormSetting, GridLayoutFormStructure, GridLayoutFormSubWidget, GridLayoutFormWidgetDecorator, SubmitOptions, UseFieldArrayReturn };
+2 -1
View File
@@ -270,6 +270,7 @@ declare function GridLayout({ name, form: initForm, basicForm, style, className,
groups?: GridLayoutGroup[]; groups?: GridLayoutGroup[];
children?: any; children?: any;
}): React.JSX.Element; }): React.JSX.Element;
declare const _default: Function;
export { GridLayout, GridLayoutFramework, GridLayoutWidget, HOOK_MARK, useField, useFnRun, useGridLayoutFields, useStructure }; export { GridLayout, GridLayoutFramework, GridLayoutWidget, HOOK_MARK, _default as default, useField, useFnRun, useGridLayoutFields, useStructure };
export type { BoxStyle, GridLayoutField, GridLayoutFieldAPI, GridLayoutGroup, GridLayoutItem, GridLayoutProps, GridLayoutStructure, LayoutField, UseFieldReturn, UseFnRunReturn }; export type { BoxStyle, GridLayoutField, GridLayoutFieldAPI, GridLayoutGroup, GridLayoutItem, GridLayoutProps, GridLayoutStructure, LayoutField, UseFieldReturn, UseFnRunReturn };
Vendored
+28
View File
@@ -1,5 +1,32 @@
import { WidgetType, WidgetContainerProps } from './button'; import { WidgetType, WidgetContainerProps } from './button';
declare const _default: ResWs;
/**
* 基于 SharedWorker 的资源状态 WebSocket 单例;多个页面/标签页共用同一条连接,
* 按资源 uuid 把服务端推送的状态变化分发给各自的订阅回调
*/
declare class ResWs {
/** @type {ResWs} */
static "__#private@#instance": ResWs;
/** @returns {ResWs} 单例实例 */
static getInstance: () => ResWs;
/**
* 订阅资源状态变化
* @param {(data: *) => void} cb 状态变化时的回调,收到服务端推送的原始数据
* @param {string|string[]} [res] 要订阅的资源 uuid,不传/空数组表示订阅全部('*')
* @returns {() => void} 取消订阅的函数
*/
subscribe: (cb: (data: any) => void, res?: string | string[]) => () => void;
/**
* 取消订阅
* @param {Function} cb 订阅时传入的回调
* @returns {boolean} 是否成功移除
*/
unsubscribe: (cb: Function) => boolean;
#private;
}
// ===== 用户数据结构(复用类型,JSDoc 无法跨文件引用,放 .d.ts) ===== // ===== 用户数据结构(复用类型,JSDoc 无法跨文件引用,放 .d.ts) =====
interface UserRoleBinding { interface UserRoleBinding {
@@ -109,4 +136,5 @@ interface WorkerPipeInstance {
clear: (session: string) => void clear: (session: string) => void
} }
export { _default as default };
export type { HttpHeaders, MenuItem, RouteItem, UserInfo, UserRoleBinding, WorkerPipeInstance }; export type { HttpHeaders, MenuItem, RouteItem, UserInfo, UserRoleBinding, WorkerPipeInstance };
+1 -1
View File
@@ -403,5 +403,5 @@ interface WorkerPipeInstance {
clear: (session: string) => void clear: (session: string) => void
} }
export { toTreePaths }; export { VirtualFS as default, toTreePaths };
export type { HttpHeaders, MenuItem, RouteItem, UserInfo, UserRoleBinding, WorkerPipeInstance }; export type { HttpHeaders, MenuItem, RouteItem, UserInfo, UserRoleBinding, WorkerPipeInstance };