| | import { deepClone } from 'common/util/deepClone'; |
| | import { satisfies } from 'compare-versions'; |
| | import { NodeUpdateError } from 'features/nodes/types/error'; |
| | import type { InvocationNode, InvocationNodeData, InvocationTemplate } from 'features/nodes/types/invocation'; |
| | import { zParsedSemver } from 'features/nodes/types/semver'; |
| | import { defaultsDeep, keys, pick } from 'lodash-es'; |
| |
|
| | import { buildInvocationNode } from './buildInvocationNode'; |
| |
|
| | export const getNeedsUpdate = (data: InvocationNodeData, template: InvocationTemplate): boolean => { |
| | if (data.type !== template.type) { |
| | return true; |
| | } |
| | return data.version !== template.version; |
| | }; |
| |
|
| | |
| | |
| | |
| | |
| | |
| | const getMayUpdateNode = (node: InvocationNode, template: InvocationTemplate): boolean => { |
| | const needsUpdate = getNeedsUpdate(node.data, template); |
| | if (!needsUpdate || node.data.type !== template.type) { |
| | return false; |
| | } |
| | const templateMajor = zParsedSemver.parse(template.version).major; |
| |
|
| | return satisfies(node.data.version, `^${templateMajor}`); |
| | }; |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | export const updateNode = (node: InvocationNode, template: InvocationTemplate): InvocationNode => { |
| | const mayUpdate = getMayUpdateNode(node, template); |
| |
|
| | if (!mayUpdate || node.data.type !== template.type) { |
| | throw new NodeUpdateError(`Unable to update node ${node.id}`); |
| | } |
| |
|
| | |
| | const defaults = buildInvocationNode(node.position, template); |
| |
|
| | |
| | |
| | |
| | const clone = deepClone(node); |
| | clone.data.version = template.version; |
| | defaultsDeep(clone, defaults); |
| |
|
| | |
| | clone.data.inputs = pick(clone.data.inputs, keys(defaults.data.inputs)); |
| | return clone; |
| | }; |
| |
|