jjb-lc-designable
Version:
基于alibaba-designable源码二次封装的表单设计器。
88 lines (77 loc) • 2.58 kB
text/typescript
import { isArr } from 'jjb-lc-designable/shared'
import { untracked } from 'jjb-lc-formily/reactive'
import { DEFAULT_DRIVERS, DEFAULT_EFFECTS, DEFAULT_SHORTCUTS } from './presets'
import { Engine, TreeNode } from './models'
import {
IEngineProps,
IResourceCreator,
IBehaviorCreator,
IDesignerLocales,
IResource,
IBehavior,
IBehaviorHost,
IResourceHost,
} from './types'
import { mergeLocales } from './internals'
export const isBehaviorHost = (val: any): val is IBehaviorHost =>
val?.Behavior && isBehaviorList(val.Behavior)
export const isBehaviorList = (val: any): val is IBehavior[] =>
Array.isArray(val) && val.every(isBehavior)
export const isBehavior = (val: any): val is IBehavior =>
val?.name ||
val?.selector ||
val?.extends ||
val?.designerProps ||
val?.designerLocales
export const isResourceHost = (val: any): val is IResourceHost =>
val?.Resource && isResourceList(val.Resource)
export const isResourceList = (val: any): val is IResource[] =>
Array.isArray(val) && val.every(isResource)
export const isResource = (val: any): val is IResource =>
val?.node && !!val.node.isSourceNode && val.node instanceof TreeNode
export const createLocales = (...packages: IDesignerLocales[]) => {
const results = {}
packages.forEach((locales) => {
mergeLocales(results, locales)
})
return results
}
export const createBehavior = (
...behaviors: Array<IBehaviorCreator | IBehaviorCreator[]>
): IBehavior[] => {
return behaviors.reduce((buf: any[], behavior) => {
if (isArr(behavior)) return buf.concat(createBehavior(...behavior))
const { selector } = behavior || {}
if (!selector) return buf
if (typeof selector === 'string') {
behavior.selector = (node) => node.componentName === selector
}
return buf.concat(behavior)
}, [])
}
export const createResource = (...sources: IResourceCreator[]): IResource[] => {
return sources.reduce((buf, source) => {
return buf.concat({
...source,
node: new TreeNode({
componentName: '$$ResourceNode$$',
isSourceNode: true,
children: source.elements || [],
}),
})
}, [])
}
export const createDesigner = (props: IEngineProps<Engine> = {}) => {
const drivers = props.drivers || []
const effects = props.effects || []
const shortcuts = props.shortcuts || []
return untracked(
() =>
new Engine({
...props,
effects: [...effects, ...DEFAULT_EFFECTS],
drivers: [...drivers, ...DEFAULT_DRIVERS],
shortcuts: [...shortcuts, ...DEFAULT_SHORTCUTS],
})
)
}