(
item: T,
config: Config,
metadata: Metadata = {},
onResolveStart?: (item: T) => void,
onResolveEnd?: (item: T) => void,
trigger: ResolveDataTrigger = "replace",
parent: ComponentData | null = null,
root: RootData = { props: {} }
)
| 17 | } = { lastChange: {} }; |
| 18 | |
| 19 | export const resolveComponentData = async < |
| 20 | T extends ComponentData | RootDataWithProps |
| 21 | >( |
| 22 | item: T, |
| 23 | config: Config, |
| 24 | metadata: Metadata = {}, |
| 25 | onResolveStart?: (item: T) => void, |
| 26 | onResolveEnd?: (item: T) => void, |
| 27 | trigger: ResolveDataTrigger = "replace", |
| 28 | parent: ComponentData | null = null, |
| 29 | root: RootData = { props: {} } |
| 30 | ) => { |
| 31 | const configForItem = |
| 32 | "type" in item && item.type !== "root" |
| 33 | ? config.components[item.type] |
| 34 | : config.root; |
| 35 | |
| 36 | const resolvedItem: T = { |
| 37 | ...item, |
| 38 | }; |
| 39 | |
| 40 | const shouldRunResolver = configForItem?.resolveData && item.props; |
| 41 | |
| 42 | const id = "id" in item.props ? item.props.id : "root"; |
| 43 | |
| 44 | if (shouldRunResolver) { |
| 45 | const { |
| 46 | item: oldItem = null, |
| 47 | resolved = {}, |
| 48 | parentId: oldParentId = null, |
| 49 | } = cache.lastChange[id] || {}; |
| 50 | // Skip inserted nodes for "move" trigger |
| 51 | // This is done this way to mitigate race conditions on insertion |
| 52 | const isRootOrInserted = oldParentId === null; |
| 53 | const parentChanged = !isRootOrInserted && parent?.props.id !== oldParentId; |
| 54 | const dataChanged = item && !deepEqual(item, oldItem); |
| 55 | |
| 56 | const shouldSkip = |
| 57 | (trigger === "move" && !parentChanged) || |
| 58 | (trigger !== "move" && trigger !== "force" && !dataChanged); |
| 59 | |
| 60 | if (shouldSkip) { |
| 61 | return { node: resolved, didChange: false }; |
| 62 | } |
| 63 | |
| 64 | const changed = getChanged(item, oldItem) as any; |
| 65 | |
| 66 | if (onResolveStart) { |
| 67 | onResolveStart(item); |
| 68 | } |
| 69 | |
| 70 | const { props: resolvedProps, readOnly = {} } = |
| 71 | await configForItem.resolveData!(item, { |
| 72 | changed, |
| 73 | lastData: oldItem, |
| 74 | metadata: { ...metadata, ...configForItem.metadata }, |
| 75 | trigger, |
| 76 | parent, |
no test coverage detected